Определить сколько дней прошло между датами - Pascal
Формулировка задачи:
не используя функции, и используя пользовательский тип
мои попытки
Type tmes=1..12; tday=1..31; const mes:array[1..12] of integer =(31,28,31,30,31,30,31,31,30,31,30,31); var god1,god2,day,i: integer; mes1,mes2:tmes; day1,day2:tday; begin writeln('vvedit 2 dati v formate dd mm gggg cherez probel:'); write(' 1 data - '); readln(day1,mes1,god1); write(' 2 data - '); readln(day2,mes2,god2); if (god1 mod 4)=0 then if ((god1 mod 100)=0) and ((god1 mod 400)<>0) then case mes1 of 1,3,5,7,8,10,12 : day:=31-day1; 2 : day:=28-day1; 4,6,9,11 : day:=30-day; end else case mes1 of 1,3,5,7,8,10,12 : day:=31-day1; 2 : day:=29-day1; 4,6,9,11 : day:=30-day; end else case mes1 of 1,3,5,7,8,10,12 : day:=31-day1; 2 : day:=28-day1; 4,6,9,11 : day:=30-day; end; for i:=mes1+1 to 12 do begin if (god1 mod 4)=0 then if ((god1 mod 100)=0) and ((god1 mod 400)<>0) then case i of 1,3,5,7,8,10,12 : day:=day+31; 2 : day:=day+28; 4,6,9,11 : day:=day+30; end else case i of 1,3,5,7,8,10,12 : day:=day+31; 2 : day:=day+29; 4,6,9,11 : day:=day+30; end else case mes1 of 1,3,5,7,8,10,12 : day:=day+31; 2 : day:=day+28; 4,6,9,11 : day:=day+30; end; end; for i:=god1+1 to god2-1 do begin if (i mod 4)=0 then if ((i mod 100)=0) and ((i mod 400)<>0) then day:=day+365 else day:=day+366 else day:=day+365; end; for i:=1 to mes2-1 do day:=day+mes[i]; day:=day+day2; writeln('proshlo dnei',day); end.
Решение задачи: «Определить сколько дней прошло между датами»
textual
Листинг программы
var sdd,smm,syy:integer; edd,emm,eyy:integer; day:integer; i:integer; begin writeln('Начальная дата: '); write('День: ');readln(sdd); write('Месяц: ');readln(smm); write('Год: ');readln(syy); writeln('----------------'); writeln('Конечная дата: '); write('День: ');readln(edd); write('Месяц: ');readln(emm); write('Год: ');readln(eyy); writeln('----------------'); sdd:=sdd+(syy*365); smm:=smm-1; edd:=edd+(eyy*365); emm:=emm-1; for i:=1 to smm do begin case (i)of 1,3,5,7,8,10,12:sdd:=sdd+31; 2:sdd:=sdd+28; 4,6,9,11:sdd:=sdd+30; end; end; for i:=1 to emm do begin case (i)of 1,3,5,7,8,10,12:edd:=edd+31; 2:edd:=edd+28; 4,6,9,11:edd:=edd+30; end; end; writeln('Прошло дней: ',(edd-sdd)); end.
Объяснение кода листинга программы
- В начале программы объявляются переменные sdd, smm, syy, edd, emm, eyy и day. Переменная day используется для хранения количества дней между датами.
- Пользователю предлагается ввести начальную и конечную даты в формате
День Месяц Год
иДень Месяц Год
. Введенные данные сохраняются в переменных sdd, smm, syy, edd, emm, eyy соответственно. - Затем происходит вычисление разницы между конечной и начальной датами и сохранение результата в переменной day.
- Далее происходит изменение значений переменных sdd и smm для учета високосных годов. Для этого используется цикл for, который выполняется smm раз. Внутри цикла происходит проверка месяца (используется оператор case) и, в зависимости от месяца, значение переменной sdd увеличивается на соответствующее количество дней. Аналогично происходит изменение значения переменной edd для конечной даты.
- После завершения цикла для smm происходит вывод результата на экран.
- Затем происходит повторный цикл for, но уже для переменной emm. Этот цикл также выполняется smm раз и аналогичен предыдущему, за исключением того, что он изменяет значения переменных edd и eyy.
- В конце программы выводится на экран сообщение о количестве дней между датами, которое получается путем вычитания значения переменной sdd из значения переменной edd.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д