Помощь - Поиск - Пользователи - Календарь
Полная версия: циклы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
В учебном заведении известно начало рабочего дня, продолжительность пары или урока в минутах, продолжительность обычного и большого перерывов и их место в расписании, а также количество пар (уроков) в день. Напишите программу, которая составляет расписание звонков на весь учебный день.
даже не знаю с какой стороны подойти... можно ли сделать это с помощью массива? буду благодарен совету
Ozzя
Цитата
можно ли сделать это с помощью массива?

Можно
marwell
Цитата(Ozzя @ 4.05.2010 10:11) *

Можно

for i:=1 to 24 do
for j:=1 to 60 do

а дальше не знаю как быть
была мысль заполнить этот массив нулями и потом изменять элементы в соответствии с номерами строк и столбцов...
Ozzя
А почему так много то?
6 учебных дней, по 6-8 уроков (ну пусть 10)

NumberOfDay:= 6;
NumberOfLessons:=10;
For i:=1 to NumberOfDay do
For i:=1 to NumberOfLessons do
...
marwell
Цитата(Ozzя @ 4.05.2010 11:58) *

А почему так много то?
6 учебных дней, по 6-8 уроков (ну пусть 10)

NumberOfDay:= 6;
NumberOfLessons:=10;
For i:=1 to NumberOfDay do
For i:=1 to NumberOfLessons do
...


т.е. расписание на всю неделю?
Ozzя
Ну, да чего мелочиться-то. Сразу и расписание уроков вбить.
marwell
Цитата(Ozzя @ 4.05.2010 12:09) *

Ну, да чего мелочиться-то. Сразу и расписание уроков вбить.

вот сам алгоритм вычисления времени звонков я и не могу понять
Ozzя
Дзынь Начало раб. дня
Пока не конец раб. дня
Начало раб. дня+длина урока*номер урока
Дзынь
Начало раб. дня+длина урока*номер урока+длина перемены // здесь дополнительно проверку большая или маленькая перемена
Дзынь
конец

Примерно так
marwell
Цитата(Ozzя @ 4.05.2010 12:21) *

Дзынь Начало раб. дня
Пока не конец раб. дня
Начало раб. дня+длина урока*номер урока
Дзынь
Начало раб. дня+длина урока*номер урока+длина перемены // здесь дополнительно проверку большая или маленькая перемена
Дзынь
конец

Примерно так

а как учесть то что что в часе 60 минут? (например, начало в 8:00, 5 пар, по 90 минут, перерыв 10 минут, большой 40минут после 2 пары - 8:00, 9:20, и т.д. ) может я просто не слышал такого, но я не могу понять как сделать чтобы при превышении количества минут 60, увеличивалось количество часов blink.gif
volvo
Отдельно - часы, отдельно - минуты...

hh := 8; mm := 0; // 8:00

mm := mm + 90; // добавляем 90 минут - конец первой пары, так?
// А теперь - корректируем время, чтоб было в правильном формате, а не 8:90
hh := hh + (mm div 60);
mm := mm mod 60;
// и (чудо, правда?) у нас получается hh = 9, а mm = 30
marwell
var nach,i:integer;
hh,mm,hh2,mm2:integer;
bol_per,per:integer;
prodol:integer;
kol,mesto:Integer;
begin
write('vvedite vremja nachala dnja v formate "hh mm" - ');
readln(hh, mm);
write('vvedite prodolgitelnost pari v minutah - ');
readln(prodol);
write('vvedite prodolg. bolschogo pereriva - ');
readln(bol_per);
write('vvedite prodolg. obichnogo pereriva - ');
readln(per);
write('vvedite nomer pari pered bolschim pererivom - ');
readln(mesto);
write('vvedite kolichestvo par v den - ');
readln(kol);
writeln(hh,':',mm);
for i:=1 to kol do
begin
mm:=mm+prodol;
hh:=hh+(mm div 60);
mm:=mm mod 60;
if i=mesto then begin
mm2:=mm+bol_per;
hh2:=hh+(mm2 div 60);
mm2:=mm2 mod 60;
end
else begin
mm2:=mm+per;
hh2:=hh+(mm2 div 60);
mm2:=mm2 mod 60;
end;
writeln(hh,':',mm);
Writeln(hh2,':',mm2);
end;
readln;
end.

не могу найти ошибку(( не хватает 10 мин перерыва
Ozzя
mm:=mm+prodol;

Здесь ты забываешь перемену прибавить

Наврал sad.gif

Тут добавь
  ...
mm:=mm2; // вся соль (С) тут ;)
writeln(hh,':',mm);
Writeln(hh2,':',mm2);
end;
marwell
Цитата(Ozzя @ 4.05.2010 15:16) *

mm:=mm+prodol;

Здесь ты забываешь перемену прибавить

Наврал sad.gif

Тут добавь
  ...
mm:=mm2; // вся соль (С) тут ;)
writeln(hh,':',mm);
Writeln(hh2,':',mm2);
end;


но ведь тогда выведет по два одинаковых времени... может еще что-то надо изменить?
Ozzя
С чего это вдруг?
См. сам
marwell
Цитата(Ozzя @ 4.05.2010 15:40) *

С чего это вдруг?
См. сам

var nach,i:integer;
hh,mm,hh2,mm2:integer;
bol_per,per:integer;
prodol:integer;
kol,mesto:Integer;
begin
write('vvedite vremja nachala dnja v formate "hh mm" - ');
readln(hh, mm);
write('vvedite prodolgitelnost pari v minutah - ');
readln(prodol);
write('vvedite prodolg. bolschogo pereriva - ');
readln(bol_per);
write('vvedite prodolg. obichnogo pereriva - ');
readln(per);
write('vvedite nomer pari pered bolschim pererivom - ');
readln(mesto);
write('vvedite kolichestvo par v den - ');
readln(kol);
writeln (hh,':',mm);
for i:=1 to kol do
begin
mm:=mm+prodol;
hh:=hh+(mm div 60);
mm:=mm mod 60;
if i=mesto then begin
mm2:=mm+bol_per;
hh2:=hh+(mm2 div 60);
mm2:=mm2 mod 60;
end
else begin
mm2:=mm+per;
hh2:=hh+(mm2 div 60);
mm2:=mm2 mod 60;
end;
mm:=mm2;
writeln(hh,':',mm);
Writeln(hh2,':',mm2);
end;
readln;
end.

я тебя правильно понял?Нажмите для просмотра прикрепленного файла
Ozzя
Кажется, я еще что-то правил.
Мой вариант:
var nach,i:integer;
hh,mm,hh2,mm2:integer;
bol_per,per:integer;
prodol:integer;
kol,mesto:Integer;
begin
write('vvedite vremja nachala dnja v formate "hh mm" - ');
readln(hh, mm);
write('vvedite prodolgitelnost pari v minutah - ');
readln(prodol);
write('vvedite prodolg. bolschogo pereriva - ');
readln(bol_per);
write('vvedite prodolg. obichnogo pereriva - ');
readln(per);
write('vvedite nomer pari pered bolschim pererivom - ');
readln(mesto);
write('vvedite kolichestvo par v den - ');
readln(kol);
writeln(hh,':',mm);
for i:=1 to kol do
begin
mm:=mm+prodol;
hh:=hh+(mm div 60);
mm:=mm mod 60;
if i=mesto then
begin
mm2:=mm+bol_per;
hh2:=hh+(mm2 div 60);
mm2:=mm2 mod 60;
end
else
begin
mm2:=mm+per;
hh2:=hh+(mm2 div 60);
mm2:=mm2 mod 60;
end;
writeln(hh,':',mm);
Writeln(hh2,':',mm2);
mm:=mm2;
end;
readln;
end.


Добавлено через 5 мин.
Понял, где наврал
Не так
mm:=mm2; // вся соль (С) тут ;)
writeln(hh,':',mm);
Writeln(hh2,':',mm2);
end;

а так

  writeln(hh,':',mm);
Writeln(hh2,':',mm2);
mm:=mm2; // вся соль (С) тут ;)

end;

marwell
понятно, спасибо большое! good.gif
Ozzя
Цитата
понятно, спасибо большое!

Не, ты молодец. В отличие от многих других. По моему, довольно-таки невнятному алгоритму написал программу. А Volvo и я только помогли
Лови +
marwell
еще один вопрос: в результате программа выводит время звонков, включая также время начала следующей пары(напрмер: пар 5, выводит время звонков для 5 пар и в конце время начала шестой пары), как можно убрать это последнее время?
volvo
Я что-то не так делаю, либо программа из 16-го поста работает некорректно (комментарии - мои)?

vvedite vremja nachala dnja v formate "hh mm" - 8 0
vvedite prodolgitelnost pari v minutah - 90
vvedite prodolg. bolschogo pereriva - 40
vvedite prodolg. obichnogo pereriva - 10
vvedite nomer pari pered bolschim pererivom - 3
vvedite kolichestvo par v den - 5
8:0 // Начало первой пары
9:30 // Конец первой пары
9:40 // Начало второй пары
11:10 // Конец второй пары
11:20 // Начало третьей пары
12:50 // Конец третьей пары
13:30 // Закончился большой перерыв, началась 4-я пара
14:0 // <--- Вот это что ???
14:10
15:40
15:50

volvo
А вот так должно показывать правильно, к тому же - без лишних действий, и без лишней информации на экране:

var
nach,i:integer;
hh,mm:integer;
bol_per,per:integer;
prodol:integer;
kol,mesto:Integer;

begin
write('vvedite vremja nachala dnja v formate "hh mm" - ');
readln(hh, mm);
write('vvedite prodolgitelnost pari v minutah - ');
readln(prodol);
write('vvedite prodolg. bolschogo pereriva - ');
readln(bol_per);
write('vvedite prodolg. obichnogo pereriva - ');
readln(per);
write('vvedite nomer pari pered bolschim pererivom - ');
readln(mesto);
write('vvedite kolichestvo par v den - ');
readln(kol);

for i:=1 to kol do
begin
writeln(hh, ':', mm); { begin }

mm := mm + prodol;
hh := hh + (mm div 60);
mm := mm mod 60;

writeln(hh, ':', mm); { end }

if i = mesto then mm := mm + bol_per
else mm := mm + per;

hh := hh + (mm div 60);
mm := mm mod 60;
end;
readln;
end.

Ozzя
  ...
mm:=mm2;
hh:=hh2;
...

wub.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.