Помощь - Поиск - Пользователи - Календарь
Полная версия: Циклы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Merlin
Условие задачи :

Спортсмен, начав тренировки, в первый день пробежал 10 км. Каждый следующий день он увеличивал дистанцию на 12 %. Написать программу, определяющую общую длину пробега за месяц и первый день с начала тренировок, после которого дистанция превысит 25 км.

Написать задачу нужно через циклы с постусловием и предусловием.


1. Цикл с предусловием

program lab062;
var dist,max,dist1:real;
mes,i:integer;
begin
writeln('Введите максимальную дистанцию');
readln(max);
dist:=10;
dist1:=10;
while dist<=max do
begin
Dist:=dist+dist*0.12;
mes:=mes+1;
end;
for i:=1 to 30 do
begin
dist1:=dist1+dist*0.12;
end;
writeln('Кол-во дней дистанции ',mes);
writeln('Дистанция',dist:8:4);
writeln('Дистанция за месяц ',dist1:10:4);
readln
end.



2. Цикл с постусловием

program lab062;
var dist,max,dist1:real;
mes,i:integer;
begin
writeln('Введите максимальную дистанцию');
readln(max);
dist:=10;
dist1:=10;
repeat
begin
Dist:=dist+dist*0.12;
mes:=mes+1;
end;
for i:=1 to 30 do
begin
dist1:=dist1+dist*0.12;
end;
until dist>max;
writeln('Кол-во дней дистанции ',mes);
writeln('Дистанция',dist:8:4);
writeln(' Дистанция за месяц',dist1:10:4);
readln
end.


Проблема в следующем : Когда я ввожу макс. дистанцию , например 25 , то в 1 проге общая дистанция за месяц чуть больше 100, а во 2 проге, с repeat, дистанция за месяц , если вводить опяьб же 25 получается 600, где я ошибся ?
yar11
uses crt;
var
dist:real;
days,i:integer;
begin clrscr;
dist:=10;
days:=1;
repeat
begin
dist:=dist*1.12;
days:=days+1;
end;
until dist>25;
dist:=10;
for i:=2 to 30 do
dist:=dist*1.12;
writeln(days:4,' days');
writeln(dist:4:4,'dist');
readkey;
end.


uses crt;
var
dist:real;
days,i:integer;
begin
dist:=10;
days:=1;
while dist<=25 do
begin
dist:=1.12*dist;
days:=days+1;
end;
dist:=10;
for i:=2 to 30 do
dist:=1.12*dist;
writeln(days:4,' days');
writeln(dist:4:4,'dist');
readkey;
end.

В обеих прогах ответы одинаковые и даже правильные.
Иногда проще написать заново
Merlin
Спасибо за ответ, нашёл и свою ошибку : не туда until поставил.

Вот так будет правильно

program lab062;
var dist,max,dist1:real;
mes,i:integer;
begin
writeln('Введите максимальную дистанцию');
readln(max);
dist:=10;
dist1:=10;
repeat
begin
Dist:=dist+dist*0.12;
mes:=mes+1;
end;
until dist>max;
for i:=1 to 30 do
begin
dist1:=dist1+dist*0.12;
end;
writeln('Кол-во дней дистанции ',mes);
writeln('Дистанция',dist:8:4);
writeln(' Дистанция за месяц',dist1:10:4);
readln
end.
yar11
Да неправильно НЕПРАВИЛЬНО!!!
1)Не используй переменную dist во втором цикле
После рипита она уже не равна 10
Соответственно неверный результат.
2)Потерял один день
Правильный ответ 10. Перед циклом приравняй mes:=1;
В цикле ты начинаешь считать со второго дня.
3)Кстати в моей проге я считаю из расчета 30 дней в месяце
а в твоей-31 день. Не знаю специально ты это сделал или и во
втором цикле опять не учел что подсчет ведется со второго дня.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.