Логистическая компания.
Разработать программу для определения тарифной сетки стоимости доставки груза.
Пользователь вводит наибольшее расстояние в км., и шаг изменения расстояния. Стоимость
одного километра считать равной 18 руб.
При увеличении расстояния на каждые 5 км., стоимость одного километра
уменьшается на 1,3%.
Не могу понять как второе условие сделать… при увеличении на каждые 5 км…
program lab5;
Var p:real;
l,j,i,s,k:integer;
begin
write ('введите наибольшее расстояние в км:');
readln(s);
writeln('Введите шаг изменения растояния');
readln(l);
for i:=1 to s do
begin
p:=i*18;
p:=p+l;
writeln('Стоимость доставки груза=', p);
end;
for i:= 1 to s do
for j:= 1 to 5 do
begin
p:=i*18-0.013;
p:=p+l;
writeln('Стоимость доставки груза за км с учетом скидки', p);
end;
end.
У Вас цикл for, а надо while, т.к. шаг не 1, а вводится пользователем.
Внутри надо подсчитывать (циклически через while) тек. стоимость 1 км, и запоминать соответствующий кратный 5 тек. тарифный порог, если введенный шаг сетки и шаг скидки могут не совпадать:
readln(limit, d);
if d>limit then d:= limit;
p_s:= 0;
s:= d;
p:= 18;
while s<=limit do begin
while (p_s+5<=s) do begin
p:= p*0.987;
p_s:= p_s+5;
end;
writeln(s, " km: ", s*p:10:2, " rub");
if s = limit then s:= s+d;
else begin
s:= s + d;
if s > limit then s:= limit;
end;
end;
readln;
Var
price1km, allcost: real;
allkm, step, i, j, dm: integer;
begin
allkm := 200;
step := 2;
price1km := 18;
allcost := 0;
i := 1;
while (i <= allkm) do
begin
for j := 0 to step - 1 do
begin
dm := (i + j) mod 5;
if dm = 0 then
begin
price1km := price1km - (price1km / 100 * 1.3);
end;
allcost := allcost + price1km;
end;
i := i + step;
end;
writeln('Стоимость доставки груза=', allcost);
У меня получилась вообще отличная от WorldMaster’a трактовка условия:
у него уменьшается цена на каждый добавленный км, у меня - на каждый, что может неправильно
Тогда вроде вот так: без вложенного цикла через сумму первых членов геом. прогрессии, домножаемую на 5:
readln(limit, d);
if d>limit then d:= limit;
s:= d;
q:= 0.987;
while s<=limit do begin
n:= s div 5;
writeln(s, " km: ", 18*(5*(exp(n*ln(q)) - 1)/(q - 1) + (s mod 5)*exp(n*ln(q))) :10:2, " rub");
if s = limit then s:= s+d;
else begin
s:= s + d;
if s > limit then s:= limit;
end;
end;
readln;