
Здравствуйте, дорогие читатели! Сегодня к нам в редакцию поступил вопрос по форме обратной связи. Хотя мы с вами еще не изучали эту тему, мы не можем проигнорировать спросившего. К тому же мы еще и социально-активный сайт. Так что условие и решение под катом.
Поступившее сообщение:
Здравствуйте, помогите пожалуйста с решением задачи. Решить нужно с помощью циклов for, while.
Задача «Про Эрмитаж»:
1 февраля в Эрмитаже открылась выставка. Цена билета x руб. Сколько дней потребуется Эрмитажу, чтобы собрать выручку с билетов y руб. Известно, что в первый день на выставку пришло A людей, а в каждый последующий день выставку посещало на B людей меньше.
И тут перед нами возник вопрос: каким способом решать? С помощью for или с помощью while? Недолго думая, мы записали решение сразу двумя способами.
Для начала давайте определимся, какие знания нам потребуются для решения данной задачи. В идеале: это знание циклов, ветвлений, меток и оператора break.
Итак, начнем.
Способ первый. Решение задачи «Про Эрмитаж» с помощью цикла while.
label 1; {метка}
var
x, y, a, b, k, count: integer;
begin
//ВВОД ДАННЫХ
write('Введите цену билета: ');
readln(x);
write('Введите размер выручки: ');
readln(y);
write('Введите количество людей A: ');
readln(a);
write('Введите количество людей B: ');
readln(b);
// ОСНОВНАЯ ПРОГРАММА
if a > 0 then begin {Проверяем, равняется ли а нулю. Понятно, что если а = 0, то решать задачу дальше нет смысла.}
k := a * x;
count := 1; {Задаем начальное значение count, не забывайте, что в PascalABC.NET значения переменных обнуляются по умолчанию.}
while k < y do begin {пока заработок меньше выручки, выполняем}
if a - b > 0 then {проверяем, не закончились ли посетители}
begin
a := a - b; {Уменьшаем количество людей}
k := k + a * x; {Собираем прибыль}
count := count + 1; {Увеличиваем счетчик}
end
else
begin
write('не успеют!');
goto 1; {оператор безусловного перехода}
end;
end;
end;
//ВЫВОД
writeln('Ответ: ', count);
1: {мы переместились в конец}
end.Если вы внимательно читали программу, то вы знаете, что ее можно сократить, если принять за данность, что входные значения адекватны. Это будет выглядеть так:
var
x, y, a, b, k, count: integer;
begin
//ВВОД ДАННЫХ
write('Введите цену билета: ');
readln(x);
write('Введите размер выручки: ');
readln(y);
write('Введите количество людей A: ');
readln(a);
write('Введите количество людей B: ');
readln(b);
//ОСНОВНАЯ ПРОГРАММА
k := a * x;
count := 1;
while k < y do
begin
a := a - b;
k := k + a * x;
count := count + 1;
end;
//ВЫВОД
writeln('Ответ: ', count);
end.Способ второй. Решение задачи «Про Эрмитаж» с помощью цикла for.
label 1; {опять эта метка!}
var
x, y, a, b, k, count: integer;
begin
// ВВОД ДАННЫХ
write('Введите цену билета: ');
readln(x);
write('Введите размер выручки: ');
readln(y);
write('Введите количество людей A: ');
readln(a);
write('Введите количество людей B: ');
readln(b);
//ОСНОВНАЯ ПРОГРАММА
if a > 0 then {проверка}
begin
k := a * x;
for count := 1 to MaxInt do {Так как мы не знаем сколько дней будет длится собирание денег, используем встроенную переменную MaxInt.ЕЕ значение 200000000 и больше. }
if k >= y then break else {если мы собрали требуемые деньги, прерываем цикл с помощью break. }
begin
if a - b > 0 then {опять проверка.}
begin
a := a - b; {считаем}
k := k + a * x; {count явеличивается автоматом}
end
else
begin
write('Не успеют.');
goto 1; {оператор безусловного перехода.}
end;
end;
end;
writeln('Ответ: ', count);
1: {Переместились}
end.Многие знают, что использовать goto — плохой стиль, поэтому давайте создадим альтернативу. Используем переменную-флаг.
var
x, y, a, b, k, count: integer;
flag: boolean; {наша переменная-флаг}
begin
//ВВОД ДАННЫХ
write('Введите цену билета: ');
readln(x);
write('Введите размер выручки: ');
readln(y);
write('Введите количество людей A: ');
readln(a);
write('Введите количество людей B: ');
readln(b);
//ОСНОВНАЯ ПРОГРАММА
flag := true; {присваиваем первое значение}
if a > 0 then {проверка}
begin
k := a * x;
for count := 1 to MaxInt do
begin
if flag = false then break; {Если люди уже ушли в минус -прекращаем бессмысленную трату ресурсов компьютера}
if k >= y then break else
begin
if a - b > 0 then
begin
a := a - b;
k := k + a * x;
end
else flag := false; {присваиваем второе значение}
end;
end;
end;
if flag then writeln('Ответ: ', count) else writeln('Не хватает'); {Выбор}
end.На сегодня все! Не забывайте кликать по кнопочкам и подписываться на наш сайт.
Почему у вас данная задача с циклами идет перед уроком с этими самыми циклами? Т.е. выходит, что циклы мы еще не изучили, а задачу уже решаем?
ну, так получилось.