Вот задача:
Задан порядковый номер дня в году и год. Напишите программу, определяющую соответствующую календарную дату года ( число, месяц) .
Выдает 201 ошибку Вот код:
const mas:array[1..12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31);
var d:1..365;
g:1800..2012;
i:integer;
begin
write('Введите порядковый номер дня в году: ');
readln(d);
write('Введите год: ');
readln(g);
i:=0;
while (d>0)and(i<12) do
begin
inc(i);
d:=d-mas;
end;
if d<=0 then
d:=d+mas;
writeln('Месяц: ',i,' День: ',d);
readln;
end.
Другие языки программирования и технологии
FreePascal. Выдает 201 ошибку. Помогите.
Во-первых, у вас d имеет тип диапазон положительных чисел, а при вычислении запросто получаются ноль и отрицательные числа. Отсюда ошибка 201 - выход за пределы диапазона.
Во-вторых, год вам не просто так даётся, а для вычисления количества дней в феврале. Вы же год вообще никак не используете.
В-третьих, если пользователь что-то у вас вводит, то контролируйте, что именно он ввёл. Иначе крах программы будет происходить вполне закономерно.
const mas:array[1 .. 12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31);
var
d: smallint;
dfeb: byte;
g: 1600 .. 3999;
i: integer;
e: boolean;
begin
repeat
write('Введите год (1600..3999): ');
e := false;
try
readln(g)
except
e := true
end
until not e;
dfeb := ord((g mod 4 = 0) and (g mod 100 <> 0) or (g mod 400 = 0));
inc(mas[2], dfeb);
repeat
write('Введите порядковый номер дня в году: ');
e := false;
try
readln(d)
except
e := true
end
until not e and (d > 0) and (d <= 365 + dfeb);
{Дальше без изменений}
i := 0;
while (d > 0) and (i < 12) do
begin
inc(i);
d := d - mas[і];
end;
if d <= 0 then
d := d + mas[і];
writeln('Месяц: ',i,' День: ',d);
readln;
end.
Во-вторых, год вам не просто так даётся, а для вычисления количества дней в феврале. Вы же год вообще никак не используете.
В-третьих, если пользователь что-то у вас вводит, то контролируйте, что именно он ввёл. Иначе крах программы будет происходить вполне закономерно.
const mas:array[1 .. 12] of byte=(31,28,31,30,31,30,31,31,30,31,30,31);
var
d: smallint;
dfeb: byte;
g: 1600 .. 3999;
i: integer;
e: boolean;
begin
repeat
write('Введите год (1600..3999): ');
e := false;
try
readln(g)
except
e := true
end
until not e;
dfeb := ord((g mod 4 = 0) and (g mod 100 <> 0) or (g mod 400 = 0));
inc(mas[2], dfeb);
repeat
write('Введите порядковый номер дня в году: ');
e := false;
try
readln(d)
except
e := true
end
until not e and (d > 0) and (d <= 365 + dfeb);
{Дальше без изменений}
i := 0;
while (d > 0) and (i < 12) do
begin
inc(i);
d := d - mas[і];
end;
if d <= 0 then
d := d + mas[і];
writeln('Месяц: ',i,' День: ',d);
readln;
end.
проверь типы данных которые используешь
Ты затрагиваешь константу, которою изменить нельзя.
Что это за бред? - d:=d+mas; К какому элемента массива ты прибавляешь. Я уже не говорю о том, что так нельзя
Что это за бред? - d:=d+mas; К какому элемента массива ты прибавляешь. Я уже не говорю о том, что так нельзя
Похожие вопросы
- Pascal. Почему выдает ошибку? Помогите отладить
- с++, Программа выдает ошибку! ! Помогите знающие люди!!
- Что мне надо сделать чтоб открылась ссылка вконтакте, выдает мне ошибку и требует смс?
- В чём ошибка? Помогите! C++
- MS DOS. Ввожу команду чтоб копировать все найденные файлы на локальном диске - находит синтаксическую ошибку. Помогите..
- Критическая ошибка, помогите!
- В чем ошибка? Помогите разобраться! (программа на С++: добавление столбца в матрицу)
- C++ Где ошибка? Помогите
- 3d max выдаёт ошибку...
- Синий экран смерти выдает ошибку 0х0000008е