Неописанная переменная
begin S := 1; // Неизвестное имя S end.
Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).
Отсутствующая ;
begin var S: integer S := 1; // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка! end.
begin var S := 1 S := S + 1 // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end. end.
Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.
Несовместимость типов при присваивании
begin var S: integer := 1.3; // Нельзя преобразовать тип real к integer end.
Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.
Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:
begin var S := 1.3; // Тип real будет выведен компилятором автоматически end.
Отсутствие закрывающего апострофа литеральной строки
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа end.
Закрыть апостроф надо на той же строке, где расположен открывающий апостроф
Ошибки расстановки запятых и апострофов при выводе строк и выражений
begin var x := 2; // x получает тип integer var y := 3; // y получает тип integer writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов end.
Слишком много запятых и апострофов рядом, потому начинающие часто путаются
Надо уяснить правила:
- запятые разделяют разные элементы вывода
- все, что находится в апострофах, будет выведено на экран без изменений
Ошибка ввода
begin var x: integer; read(x); // введите блаблабла и посмотрите, что получится end.
Это — ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.
Аналогичный фрагмент в более современном и предпочтительном синтаксисе:
begin var x := ReadInteger; end.
Ошибка неинициализированной переменной
begin var x: integer; // Забыли инициализировать или ввести x var r := x * x; // r получает тип integer writeln('Квадрат числа ', x, ' = ', r); end.
Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.
Деление на 0
begin var x := 0; var c := 666 div x; // Здесь происходит деление на 0 end.
Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.
Корень из отрицательного числа
begin writeln(sqrt(-1)); // Корень из отрицательного числа end.
В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number
Ссылки
- Программы для начинающих
- Сайт PascalABC.NET: Программы и алгоритмы для начинающих
Во-первых, ваш код работает. Ошибка возможна потому, что не находит файл или он занять другим процессом.
Во — вторых, раз это PascalABC.Net, то почему бы не писать в его стиле
const
filename = 'dat.txt';
var
f: Text; // Файловая переменная.
i: integer; // Переменная для хранения значения количества подсчитываемых элементов.
a: real; // Промежуточная переменная для хранения значения читаемых элементов.
sum: real;// переменная для хранения значения произведения.
begin
// Rewrite(f, filename);
// f.Writeln(2);
// f.Writeln(7);
// f.Close();
f := OpenRead(filename);
i := 0; // Установка счетной переменной в нулевое состояние.
sum := 0;
while not f.Eof do // Цикл для поэлементного чтения из файла.
begin
a := f.ReadlnReal(); // Чтение информации из файла.
write(a:8:2);
sum := sum + a;
inc(i);
end;
f.Close();
writeln;
writeln('The number of extracted numbers from the file is: ', i);
writeln('Summa numbers from a file is equal to: ', sum:0:2);
readln;
end.
Kensh1t 0 / 0 / 0 Регистрация: 10.11.2022 Сообщений: 10 |
||||
1 |
||||
Ошибка времени выполнения: Входная строка имела неверный формат10.11.2022, 20:54. Показов 307. Ответов 6 Метки нет (Все метки)
Ошибка времени выполнения: Входная строка имела неверный формат.
0 |
2182 / 1310 / 498 Регистрация: 07.04.2017 Сообщений: 4,577 |
|
10.11.2022, 21:00 |
2 |
Фунция это то что делает вычисление, как Что касается ошибки:
1 |
0 / 0 / 0 Регистрация: 10.11.2022 Сообщений: 10 |
|
10.11.2022, 21:21 [ТС] |
3 |
как мне поменять программу? при смене integer на real перестает работать процедура div, т.к она не применима к real.
0 |
Cyborg Drone Модератор 9628 / 4941 / 3261 Регистрация: 17.08.2012 Сообщений: 15,433 |
||||
10.11.2022, 21:23 |
4 |
|||
Сообщение было отмечено Kensh1t как решение Решениеa — целое, 27.5 — вещественное, естественно, при вводе 27.5 в ответ на приглашение ‘Введите a’ будет несоответствие типов. Да и в других местах понапутано… Пишете «квадратный корень из модуля разности квадратов», а вычисляете квадратный корень из модуля разности. Лишние скобки… Вот так должно быть, я так думаю:
0 |
JuriiMW 5061 / 2634 / 2347 Регистрация: 10.12.2014 Сообщений: 10,000 |
||||
11.11.2022, 08:25 |
5 |
|||
Cyborg Drone, по сути, действительные числа делятся так, без выделения целой части!
0 |
Cyborg Drone Модератор 9628 / 4941 / 3261 Регистрация: 17.08.2012 Сообщений: 15,433 |
||||
11.11.2022, 19:33 |
6 |
|||
JuriiMW, так вроде бы нужна целая часть от частного. Поэтому хотя бы так, что ли:
0 |
5061 / 2634 / 2347 Регистрация: 10.12.2014 Сообщений: 10,000 |
|
12.11.2022, 15:46 |
7 |
Cyborg Drone, это у ТС нужно просить, чтобы исходное задание озвучил!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
12.11.2022, 15:46 |
7 |
В программе работает все, кроме удаления записи из файла
Собственно сама ошибка:
строка (254) : Ошибка времени выполнения: Входная строка имела неверный формат.
В строке 254 находится (readln(menu);)
program Telophonia;
type
abonent = record
number: string[10]; //Номер телефона
FIO: string[40]; //ФИО абонента
adres: record //Адрес абонента в виде другой записи состоящий из:
street: string[20]; //Улица
house: string[20]; //Дом
flat: string[20]; //Квартира
end;
date: string[10]; //Дата подключения абонента
end;
var
abonents: file of abonent; //Файл содержащий записи об абонентах
x, t: abonent; //Вспомогательная переменная типа записи об абонентах
menu, ind, cnt: integer; //Вспомогательные переменные для меню, индексации и счетчика записей в некоторых процедурах
yn: char; //Переменная y/n ответов
filename: string[25]; //Имя файла, задаваемое пользователем
nmbr: string[10]; //Вспомогательная переменная для номера абонента
//Процедура вывода содержимого файла на экран
procedure show(a: file of abonent);
begin
reset(a);
ind := 1; //номер строки в выводимой таблице
while not eof(a) do
begin
read(a, x); //чтение записи из файла
write(ind, ': '); //номер строки в выводимой таблице
ind := ind + 1;
with x do
//вывод считаной записи на экран
writeln(number, ' ', FIO, ' ', adres.street, ' ', adres.house, ' ', adres.flat, ' ', date);
end;
if FileSize(a) = 0 then write('Файл пуст. Пожалуйста добавьте записи!');
writeln;
close(a);
end;
//Процедура добавления новой записи в конец файла
procedure add(a: file of abonent);
label nachalo;//метка начала процедуры
begin
nachalo: //метка начала процедуры
with x do
begin
repeat //просматривать файл на совпадение номера абонента
write('Номер = ');
readln(number);
reset(a);
while not eof(a) do
begin
read(a, t); //чтение записи из файла
if t.number = number then
begin
writeln('Абонент с таким номером уже существует!');
break; //выходим из цикла while и повторяем сначала
end;
end;
until t.number <> number;
write('ФИО = ');
readln(FIO);
write('Улица = ');
readln(adres.street);
write('Дом = ');
readln(adres.house);
write('Квартира = ');
readln(adres.flat);
write('Дата подключения = ');
readln(date);
writeln;
end;
reset(a);
seek(a, FileSize(a)); //перевод указателя в конец файла
write(a, x); //запись переменной в файл
writeln('Абонент успешно добавлен.');
writeln;
writeln('Добавить еще одного? (y/n):');
readln(yn);
if yn = 'y' then goto nachalo;
close(a);
end;
//Процедура удаления записи из файла
procedure del(a: file of abonent);
label nachalo,ex;//метка начала и конца процедуры
begin
nachalo: //метка начала процедуры
reset(a);
write('Введите номер:');
read(nmbr);
cnt := 0; //ведем счет записей из файла, чтобы в дальнейшем обратиться к нужной считанной записи и удалить ее
repeat //просматривать файл на совпадение номера абонента
if eof(a) then //если дошли до конца и не нашли нужного абонента
begin
writeln('Абонента с таким номером не существует!');
write('Найти по другому номеру? (y/n):');
readln(yn);
if yn = 'y' then goto nachalo else goto ex;
end;
read(a, t); //чтение записи из файла
cnt := cnt + 1; //увеличиваем счетчик записей на один
until t.number = nmbr;
writeln('Найденный абонент:');
writeln(t.number, ' ', t.FIO, ' ', t.adres.street, ' ', t.adres.house, ' ', t.adres.flat, ' ', t.date);
writeln;
writeln('Удалить данные об абоненте? (y/n):');
readln(yn);
if yn <> 'y' then goto ex;
cnt := cnt - 1;
while not eof(a) do
begin
if filesize(a)=cnt+1 then break;
seek(a, cnt+1); //перевод указателя на следующий элемент
read(a, t);
seek(a, cnt); //перевод указателя на удаляемого абонента
write(a, t); //перезапись следующего абонента из файла на место удаляемого
cnt := cnt + 1;
seek(a, cnt); //перевод указателя на следующую за переписанным абонентом
end;
seek(a, filesize(a) - 1); //перевод указателя на последнюю запись в файле
truncate(a); //удаление последней записи в файле
writeln('Данные удалены');
write('Найти по другому номеру? (y/n):');
readln(yn);
if yn = 'y' then goto nachalo;
ex: //метка выхода из процедуры
close(a);
end;
//Процедура корректировки записи в файле
procedure edit(a: file of abonent);
label nachalo,ex;//метки начала процедуры и выхода из нее
begin
reset(a);
nachalo: //метка начала процедуры
write('Введите номер абонента:');
read(nmbr);
cnt := 0; //ведем счет записей из файла, чтобы в дальнейшем обратиться к нужной считанной записи и перезаписать ее
yn:='n';
while not eof(a) do
begin
read(a, t); //чтение записи из файла
cnt := cnt + 1; //увеличиваем счетчик записей на один
if t.number = nmbr then break;
end;
if eof(a) then //если дошли до конца и не нашли нужного абонента
begin
writeln('Абонента с таким номером не существует!');
write('Найти по другому номеру? (y/n):');
readln(yn);
if yn = 'y' then goto nachalo else goto ex;
end;
cnt := cnt - 1; //возвращаемся к предыдущей записи, чтобы ее изменить
writeln('Изменить данные об абоненте? (y/n):');
readln(yn);
if yn <> 'y' then goto ex;
with x do
begin
repeat //просматривать файл на совпадение номера абонента
write('Номер абонента = ');
readln(number);
reset(a);
while not eof(a) do
begin
read(a, t); //чтение записи из файла
if t.number = number then
begin
writeln('Абонент с таким номером уже существует!');
break; //выходим из цикла while и повторяем сначала
end;
end;
until t.number <> number;
write('ФИО = ');
readln(FIO);
write('Улица = ');
readln(adres.street);
write('Дом = ');
readln(adres.house);
write('Квартира = ');
readln(adres.flat);
write('Дата подключения = ');
readln(date);
writeln;
end;
writeln('Изменить данные об абоненте? (y/n):');
readln(yn);
if yn <> 'y' then goto ex;
seek(a, cnt);
write(a, x); //запись переменной в файл
writeln('Изменения приняты.');
WriteLn;
writeln('Найти по другому номеру? (y/n):');
readln(yn);
if yn = 'y' then goto nachalo;
ex: //метка выхода из процедуры
close(a);
end;
//Процедура вывода содержимого файла на экран
procedure find(a: file of abonent);
label nachalo;
begin
nachalo:
with x do
begin
write('Номер абонента = ');
readln(number);
reset(a);
cnt := 0; //ведем счет удовлетворяющих запросу записей
while not eof(a) do
begin
read(a, t); //чтение записи из файла
if t.number = number then
begin
writeln('Найдено:');
writeln(number, ' ', FIO, ' ', adres.street, ' ', adres.house, ' ', adres.flat, ' ', date);
cnt := cnt + 1;
break;
end;
end;
end;
if cnt=0 then writeln('Не найдено абонента с таким номером.');
writeln;
writeln('Найти по другому номеру? (y/n):');
readln(yn);
if yn = 'y' then goto nachalo;
close(a);
end;
begin
write('Введите имя файла: ');
readln(filename);
assign(abonents, filename);
repeat
writeln('1: Вывести содержимое');
writeln('2: Добавить абонента');
writeln('3: Удалить абонента');
writeln('4: Изменить данные абонента');
writeln('5: Найти по номеру');
writeln('0: Выход');
write('Выберите действие: ');
readln(menu);
writeln;
case menu of
1: show(abonents);
2: add(abonents);
3: del(abonents);
4: edit(abonents);
5: find(abonents);
end;
until menu = 0;
end.
1. Ошибка времени выполнения: «Данный формат пути не поддерживается».
Это самая известная ошибка, которую рано или поздно встречает любой начинающий программист. Взгляните на картинку:
Впервые встретившись с этой ошибкой, можно прийти в недоумение. Файл, из которого мы собираемся читать, на месте. Он доступен и нормально открывается текстовым редактором. Тем не менее, что-то не так. На самом деле, все просто: во время набора текста программы вместо латинской «ЦЭ» была напечатана русская «ЭС». К счастью, такая ошибка единственная в своем роде. Раскладки «qwerty» и «йцукен» имеют совпадение только в одном месте.
2. Ошибка времени выполнения: «Файл не найден».
Еще одна «механическая» ошибка, связанная с использованием процедуры Assign. В принципе, история похожа на рассказанную выше. Автор программы видит, что файл не найден, идет в папку «123» и не понимает: «Как не найден? Вот же он!»
Все просто: вместо нужного вам текстового файла «55.txt» вы создали файл с именем «55.txt.txt» . Этой ошибки не будет возникать, если вы для себя четко раз и навсегда уясните, что такое расширение в имени файла. И вообще, не пользуйтесь проводником в Windows, а работайте в менеджере файлов, например, в Total Commander.