Дата следующего дня
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.9] |
|
|
Дата следующего дня
|
Сообщ.
#1
,
|
|
|
|
Пишу программу, опрeдeляющую дaту слeдующeго дня. Ceгoдняшняя дата вводится с клавиатуры.
d, m, y - сeгoдня. d1, m1, y1 - завтра. ![]() ![]() var d, m, y, d1, m1, y1, r: integer; last: boolean; BEGIN {Ввод данных добавлю позже} last:=false; case m of 4, 6, 9, 11: if d=30 then last:=true; 2: if d=28 then begin r:=y mod 4; if r <> 0 then last:=true; end; else if d=31 then last=true; end; if last then begin d:=1; if m=12 then begin m:=1; y1:=y+1; end else m1:=m+1; end else d1:=d+1; END. Free Pascal v2.4.0 при компиляции выдает ошибку: "Error Illegal expression". Помогите исправить. В алгоритме нет ошибок? |
|
Сообщ.
#2
,
|
|
|
|
![]() ![]() Var d, m, y, d1, m1, y1, r: integer; last: boolean; BEGIN {Ввод данных добавлю позже} last:=false; case m of 4, 6, 9, 11: if d=30 then last:=true; 2: if d=28 then begin r:=y mod 4; if r <> 0 then last:=true; end; else if d=31 then last=true; // тут ошибка end; if last then begin d:=1; if m=12 then begin m:=1; y1:=y+1; end else m1:=m+1; end else d1:=d+1; END. |
|
Сообщ.
#3
,
|
|
|
|
Polinom2686
Спасибо! Невнимательность Можно решить задачу используя перечислимые и интервальные типы? |
|
Сообщ.
#4
,
|
|
|
|
Цитата Yagami @ Разумеется. Для дней достаточно интервала 1..31, для месяцев - 1..12 (или вообще сделать перечислимый тип Jan, Feb, ..., Dec), совсем не обязательно использовать Integer.Можно решить задачу используя перечислимые и интервальные типы? P.S. Цитата Polinom2686 @ ![]() ![]() r:=y mod 4; if r <> 0 then last:=true; Этого недостаточно, чтобы определить високосность года: Является-ли год високосный ? (сообщение #580679) |
|
Сообщ.
#5
,
|
|
|
|
Yagami, ты смотри на сообщения компилятора, он показывает место ошибки.
|
|
Сообщ.
#6
,
|
|
|
|
volvo877
![]() ![]() var y, y1, r: integer; d, d1: 1..31; m, m1: 1..12; last: boolean; BEGIN Writeln('Ввод даты: '); read(d); last:=false; case m of 4, 6, 9, 11: if d=30 then last:=true; 2: if d=28 then begin r := (y mod 4) = 0) and not (((n mod 100) = 0) and ((n mod 400) <> 0) then last:=true; end; else if d=31 then last:=true; end; if last then begin d:=1; if m=12 then begin m:=1; y1:=y+1; end else m1:=m+1; end else d1:=d+1; END. Компилятор сообщает об ошибке: "(26,35) Error: Incompatible types: got "Boolean" expected "SmallInt"." Как исправить? |
|
Сообщ.
#7
,
|
|
|
|
![]() ![]() if ((y mod 4) = 0) and not (((y mod 100) = 0) and ((y mod 400) <> 0)) then last := true; Красным выделены места ошибок. По ссылке же было правильное написание, ЗАЧЕМ понадобилось убирать скобки? |
|
Сообщ.
#8
,
|
|
|
|
volvo877
Незачем. Отвлекся на телефонный звонок. |
|
Сообщ.
#9
,
|
|
|
|
Дописал проверку введенных данных, опять появились ошибки.
![]() ![]() BEGIN Write('Введите день, месяц, год, разделяя пробелами: '); {$I-} read(d, m, y); {$I+} if IOResult <> 0 then begin writeln('Вы не ввели три числа. Повторите ввод.'); reset(input); readln; exit; end; if (d<1) or (d>31) then begin writeln('Ошибка ввода. Введите день (1-31)'); reset(input); readln; exit; end; if (m<1) or (m>12) then begin writeln('Ошибка ввода. Введите месяц (1-12)'); readln; exit; end; if y<1 then begin writeln('Ошибка ввода. Год не долшен быть меньше 1.'); reset(input); readln; exit; end; (74,20) Fatal: Syntax error, ")" expected but "const char" found |
|
Сообщ.
#10
,
|
|
|
|
Телепаты в отпуске. Либо приводи код полностью, либо ищи ошибки сам. В приведенном фрагменте всего 32 строки, какая из них 74-я?
|
|
Сообщ.
#11
,
|
|
|
|
![]() ![]() program NextDay; uses crt; var y, y1, r: integer; d, d1: 1..31; m, m1: 1..12; last: boolean; BEGIN Write('Введите день, месяц, год, разделяя пробелами: '); {$I-} read(d, m, y); {$I+} if IOResult <> 0 then begin writeln('Вы не ввели три числа. Повторите ввод.'); reset(input); readln; exit; end; if (d<1) or (d>31) then begin writeln('Ошибка ввода. Введите день (1-31)'); reset(input); readln; exit; end; if (m<1) or (m>12) then begin writeln('Ошибка ввода. Введите месяц (1-12)'); readln; exit; end; if y<1 then begin writeln('Ошибка ввода. Год не долшен быть меньше 1.'); reset(input); readln; exit; end; last:=false; case m of 4, 6, 9, 11: if d=30 then last:=true; 2: if d=28 then begin if ((y mod 4) = 0) and not (((y mod 100) = 0) and ((y mod 400) <> 0)) then last:=true; end; else if d=31 then last:=true; end; if last then begin d:=1; if m=12 then begin m:=1; y1:=y+1; end else m1:=m+1; end else d1:=d+1; writeln('Следующий день: '); writeln(d1',', m1',', y1','); END. |
|
Сообщ.
#12
,
|
|
|
|
Цитата Yagami @ У тебя этих запятых (разделяющих строки и числа) не было, были только строковые литералы для вывода запятой на экран. writeln(d1, ',', m1, ',', y1); |
|
Сообщ.
#13
,
|
|
|
|
Исправил, спасибо. Почему-то выводит только день, а месяц и год - 0, 0.
Например: Ввод: 10 2 1999 Вывод: 11,0,0 |
|
Сообщ.
#14
,
|
|
|
|
Потому что:
Цитата ![]() ![]() if last then begin d:=1; if m=12 then begin m:=1; y1:=y+1; end else m1:=m+1; end else d1:=d+1; И что? Ну, допустим, при Last = true в Y1 что-то хотя бы теоретически может записаться (правда произойдет это только если месяц = декабрь, и должен меняться год, но хоть когда-то). Но если Last = False - то даже теоретически этого не произойдет. У тебя по Else просто нет кода, изменяющего Y1 и M1. Выходов 2: 1) либо в самом начале присвоить Y1 := Y; M1 := M; D1 := D, и дальше все оставить без изменений, как сейчас есть, если данные должны измениться, они изменятся, нет - останутся те, что ты ввел (это может быть нужно в случае, если ты не хочешь портить начальную дату) 2) либо работать вообще без Y1, M1, D1. То есть, изменять прямо Y, M, D и печатать их же. Выбирать тебе. |
|
Сообщ.
#15
,
|
|
|
|
volvo877
Поправил, вроде. |
|
Сообщ.
#16
,
|
|
|
|
Обнаружил ошибку. Раньше времени не было написать.
Ввод: 28 2 2010 Вывод: 29 2 2010 Но 2010 - не высококлассный год. ![]() ![]() program NextDay; uses crt; var y, y1, r: integer; d, d1: 1..31; m, m1: 1..12; last: boolean; BEGIN Write('Введите день, месяц, год, разделяя пробелами: '); {$I-} {Проверка коррекности введенных данных} read(d, m, y); {$I+} if IOResult <> 0 then begin writeln('Вы не ввели три числа. Повторите ввод.'); reset(input); readln; exit; end; if (d<1) or (d>31) then begin writeln('Ошибка ввода. Введите день (1-31)'); reset(input); readln; exit; end; if (m<1) or (m>12) then begin writeln('Ошибка ввода. Введите месяц (1-12)'); readln; exit; end; if y<1 then begin writeln('Ошибка ввода. Год не долшен быть меньше 1.'); reset(input); readln; exit; end; last:=false; d1:=d; m1:=m; y1:=y; case m of 4, 6, 9, 11: if d=30 then last:=true; 2: if d=28 then begin if ((y mod 4) = 0) and not (((y mod 100) = 0) and ((y mod 400) <> 0)) then last:=true; end; else if d=31 then last:=true; end; if last then begin d:=1; if m=12 then begin m:=1; y1:=y+1; end else m1:=m+1; end else d1:=d+1; writeln('Следующий день: ', d1, '-', m1, '-', y1); END. При попытке внесения таких изменений в код: ![]() ![]() last:=true; d1:=d; m1:=m; y1:=y; case m of 4, 6, 9, 11: if d=30 then last:=true; 2: if d=28 then begin if ((y mod 4) = 0) and not (((y mod 100) = 0) and ((y mod 400) <> 0)) then last:=false; end; else if d=31 then last:=true; end; Ввод: 28 2 2010 Вывод: 1 3 2010 Ввод: 27 2 2010 Вывод: 1 3 2010 Не знаю как исправить. |
|
Сообщ.
#17
,
|
|
|
|
Цитата Yagami @ Все просто: ты проверяешь, високосный ли год, и если да - то 28-му февраля присваиваешь статус НЕпоследнего дня, да? Но ведь у тебя и в самом начале Last := false. Сделай так:Не знаю как исправить. ![]() ![]() 2: if d=28 then begin last := true; if ((y mod 4) = 0) and not (((y mod 100) = 0) and ((y mod 400) <> 0)) then last:=false; // Если год - високосный, то 28 февраля - не последний день месяца !!! end; Ну, и ниже по тексту. Ты ж выводишь d1, m1, y1? вот и работай ТОЛЬКО с ними. D, M, Y оставь в покое! Они уже не нужны тебе... Все изменения - только с d1, m1, y1... ![]() ![]() if last then begin d1:=1; if m1=12 then begin m1:=1; y1:=y+1; end else m1:=m1+1; end else d1:=d1+1; writeln('Следующий день: ', d1, '-', m1, '-', y1); |
|
Сообщ.
#18
,
|
|
|
|
volvo877
Спасибо! |