Как исправить? 23242.pas(18) : Ошибка времени выполнения: Входная строка имела неверный формат.
вот код:
var
f1: text;
b, c, i: integer; d: real;
begin
randomize;
assign(f1, '6161.txt');
rewrite(f1);
for i := 1 to 100 do
begin
c := random(1001);
write(f1, c, ' ')
end;
close(f1);reset(f1);
while not EOln(f1) do
begin
read(f1, d); c:= round(d);
if (c div 3 = 0) and (c div 10 div 10 div 10 = 0) and (c = 0) then b := c;
end;
close(f1);append(f1);writeln(f1);writeln(f1);
if b <> 0 then writeln(f1, 'Число ', b, ' является трехзначным и нацело делится на 3')
else writeln(f1, 'В файле нет трехзначных чисел, которые нацело делятся на 3');
close(f1);
end.
Ответы на вопрос
Ошибка:
23242.pas(18) : Ошибка времени выполнения: Входная строка имела неверный формат.
возникает из-за этой строки:
pascalread(f1, d);
Вы записываете в файл целые числа:
pascalc := random(1001); write(f1, c, ' ')
То есть в 6161.txt находятся числа, например:
125 7 900 34 1000 ...
А потом пытаетесь читать их как real:
pascalread(f1, d);
В некоторых версиях Pascal это может вызвать ошибку преобразования строки в число. Проще читать в ту же переменную, в которую записывали:
pascalread(f1, c);
Также в программе есть несколько логических ошибок.
-
Проверка трехзначности неправильная:
pascal(c div 10 div 10 div 10 = 0)
Она проверяет, что число меньше 1000, но не проверяет, что оно больше или равно 100.
Правильно:
pascal(c >= 100) and (c <= 999)
-
Проверка деления на 3 написана неверно:
pascal(c div 3 = 0)
Оператор div дает целую часть от деления. Например:
100 div 3 = 33
Это не проверка делимости.
Нужно использовать остаток от деления:
pascal(c mod 3 = 0)
-
Условие:
pascaland (c = 0)
делает поиск нулевого числа. Но случайное число от random(1001) может быть 0, и одновременно оно не может быть трехзначным. Это условие надо удалить.
-
Цикл чтения:
pascalwhile not EOln(f1) do
читает только до конца строки. Вы записали все числа в одну строку, поэтому это сработает, но лучше использовать:
pascalwhile not eof(f1) do
чтобы читать весь файл.
Исправленный фрагмент:
pascalreset(f1); b := 0;while not eof(f1) do begin read(f1, c); if (c >= 100) and (c <= 999) and (c mod 3 = 0) then b := c; end;
Полная причина ошибки именно в несовпадении типа чтения с тем, что записано в файл: записываются целые числа (integer), а читаются как вещественные (real). В данном случае real вообще не нужен.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

