Вложенные циклы

Логистическая компания.
Разработать программу для определения тарифной сетки стоимости доставки груза.
Пользователь вводит наибольшее расстояние в км., и шаг изменения расстояния. Стоимость
одного километра считать равной 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);

Так тут все равно с единичным шагом, поэтому проще 2 if-a в один цикл:
(i mod 5) = 0
(i mod step) = 0

Вот этот цикл, кстати:

тоже сворачивается в возведение 0.987 в степень (s div 5), которая в Паскале считается через экспоненту и логарифм.

У меня получилась вообще отличная от WorldMaster’a трактовка условия:
у него уменьшается цена на каждый добавленный км, у меня - на каждый, что может неправильно :face_with_hand_over_mouth:

ну ведь условие что стоимость каждого километра уменьшается каждые 5 км.

Вот стоимость и снижается с шагом 5 км.

Тогда вроде вот так: без вложенного цикла через сумму первых членов геом. прогрессии, домножаемую на 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;

А если общая длина будет допустим 199 км а шаг 3 ??

А что не так будет? Так-то я привел для случая:

Задание-то мутно сформулировано. А то стал бы его рассматривать :smiley:
И, разумеется, ничего не проверял.

Ну так то да … препод выворачивается… ))