Определить сколько дней осталось до нового года - Pascal ABC
Формулировка задачи:
Прошу помочь с задачей. Недавно начал изучать новую дисциплину - Основы программирования. Сегодня препод дал задание, нужно ввести номер дня и месяца и определить, сколько дней осталось до нового года.
Я уже нашел на форуме такие же вопросы и ответы на них.
Проблема в том, что последний раз паскаль изучал классе в 8 или 9 и это была не школьная программа. Но прошло года два и уже многое забыл. Это задание дали под конец пары (минут за 10 до конца) и сказали, кто хочет может дома подумать. Одногруппник делал как-то не правильно, он вводил 12 переменных и присваивал каждой свое значение (количество дней). Я же вспомнил, что когда изучал паскаль использовал в таких случаях массив или константу (так же буду рад, если кто-то напомнит в чем между ними разница). А вот как правильно писать массивы, константы и прочее уже забыл и нашел на форуме код к этой задаче:Я конечно мог просто скопировать этот код и завтра его показать, но смысл? Хотелось бы понять, что здесь написано.
1) Во второй строке кода мне непонятна запись
array
, что это и почему номерация в квадратных скобках от 1 до 11, где 12 месяц? 2) Непонятно, что такоеrepeat
? 3) Полностью непонятна строка 8. 4) также непонятны строки с 12 по 21, что это за условия? Почему, если переменной d присвоили число меньше 1 или больше 31, то переменная k=1 (для чего она вообще нужна), также хотелось бы больше конкретики по 20 и 21 строке. Надеюсь поможете разобраться. Заранее благодарен!Решение задачи: «Определить сколько дней осталось до нового года»
textual
Листинг программы
const kd:array[1..11] of byte=(31,28,31,30,31,30,31,31,30,31,30); //количество дней
//в месяцах 1..11, не високосного года, 12 месяц не нужен, так как не используется
//в накоплении дней, он последний
var d,m:integer;
i,k,k2:integer;
begin
repeat//повторяем ввод номера месяца
write('Месяц: ');readln(m);
until m in [1..12];//пока не ведем правильно
repeat// повторяем ввод номера дня
k:=0;//пусть ввели правильно
write('День: ');readln(d);
if(d<1)or(d>31) then k:=1;//если меньше 1 или больше 31, неправильно, к=1
if(m in [4,6,9,11]) and(d>30)then k:=1;//если в месяце 30 дней, а ввели 31, неправильно к=1
if(m=2)and(d>28) then k:=1;//если февраль, а ввели больше 28
until k=0; //если все ввели правильно, конец цикла
if m=1 then k:=d //если первый месяц, до прошло d дней
else//иначе
begin
k:=d;//прошло d дней
for i:=1 to m-1 do
k:=k+kd[i];//+ количество дней в месяцах до этого
end;
write('До конца года осталось дней=',365-k); //вычтем из 365 то что уже прошло
end.
Объяснение кода листинга программы
- Создается константный массив kd, который содержит количество дней в каждом месяце, кроме 12-го месяца (который не используется).
- Создаются переменные d и m для хранения номера дня и месяца соответственно.
- Создается переменная i для использования в цикле.
- Создается переменная k, которая будет использоваться для подсчета количества дней, прошедших с начала года.
- В цикле повторяется запрос номера месяца, пока m не будет равно 12.
- В цикле повторяется запрос номера дня, пока d не будет равно 31.
- Проверяется, если введенный номер дня меньше 1 или больше 31, то устанавливается k=1, что означает, что ввод был неправильным.
- Если введенный номер месяца равен 4, 6, 9 или 11 и введенный номер дня больше 30, то также устанавливается k=1, что означает, что ввод был неправильным.
- Если введенный номер месяца равен 2 и введенный номер дня больше 28, то также устанавливается k=1, что означает, что ввод был неправильным.
- Если все введенные значения были правильными, то устанавливается k=0 и начинается следующий цикл.
- В цикле проверяется, если m равно 1, то устанавливается k=d, что означает, что прошло d дней.
- В противном случае, устанавливается k=d+kd[i], где i равно 1 до m-1, что означает, что прошло d дней плюс количество дней в месяцах до текущего месяца.
- Выводится сообщение с количеством дней, оставшихся до конца года, вычитая из 365 то, что уже прошло.