Дата следующего дня
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.9] |
|
|
| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Дата следующего дня
|
Сообщ.
#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
Поправил, вроде. |