Паскаль абс ошибка времени выполнения

Неописанная переменная

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Ошибка времени выполнения: Входная строка имела неверный формат.
Не понимаю что не нравится программе, при вводе чисел с точками (нужно задать функции a значение 27.5) выдает ошибку.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program z;
var
 k,m,k1:real;
 b,c,a:integer;
begin
  writeln('Введите a');
  readln(a);
  writeln('Введите b');
  readln(b);
  k:=(sqr(a)+sqr(b));
  m:=(Abs(a - b));
  k1:=sqrt(Abs(a - b));
  C:= a div b;
  writeln('Сумма квадратов равна', ' ', k:3:5);
  writeln('Модуль разности равен',' ',M:3:5);
  writeln('Целая часть равна: ',' ', C);
  writeln('Квадратный корень из модуля разности квадратов равен ', k1);
end.



0



2182 / 1310 / 498

Регистрация: 07.04.2017

Сообщений: 4,577

10.11.2022, 21:00

2

Фунция это то что делает вычисление, как Sqrt или Abs.
Тем временем a в вашей программе — переменная.

Что касается ошибки:
Тип этой переменной в секции varinteger, что в переводе с англ. значит целое.
Но 27.5 это не целое, поэтому и прочитать его как таковое не может.



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’ будет несоответствие типов.

Да и в других местах понапутано… Пишете «квадратный корень из модуля разности квадратов», а вычисляете квадратный корень из модуля разности. Лишние скобки…

Вот так должно быть, я так думаю:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program z;
var
  a, b, k, m, k1: real;
  c: integer;
begin
  write('Введите a: ');
  readln(a);
  write('Введите b: ');
  readln(b);
  k := sqr(a) + sqr(b);
  m := abs(a - b);
  k1 := sqrt(abs(sqr(a) - sqr(b)));
  c := trunc(a / b);
  writeln('Сумма квадратов равна ', k:0:5);
  writeln('Модуль разности равен ', m:0:5);
  writeln('Целая часть a/b равна ', c);
  writeln('Квадратный корень из модуля разности квадратов равен ', k1:0:5)
end.



0



JuriiMW

5061 / 2634 / 2347

Регистрация: 10.12.2014

Сообщений: 10,000

11.11.2022, 08:25

5

Cyborg Drone, по сути, действительные числа делятся так, без выделения целой части!
Kensh1t, вам переменные лишние не нужны:

Pascal
1
2
3
4
5
## var(a,b):=(ReadReal('Введите a'),ReadReal('Введите b'));
writeln('Сумма квадратов равна ', a**2+b**2 :0:5);
writeln('Модуль разности равен ', abs(a-b) :0:5);
writeln('Частное равно  ', a/b :0:5);
writeln('Квадратный корень из модуля разности квадратов равен ', sqrt(abs(a**2-b**2)));



0



Cyborg Drone

Модератор

9628 / 4941 / 3261

Регистрация: 17.08.2012

Сообщений: 15,433

11.11.2022, 19:33

6

JuriiMW, так вроде бы нужна целая часть от частного. Поэтому хотя бы так, что ли:

Pascal
4
  writeln('Целая часть a/b равна ', int(a/b) :0:0);



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. Ошибка времени выполнения: «Данный формат пути не поддерживается».

Это самая известная ошибка, которую рано или поздно встречает любой начинающий программист. Взгляните на картинку:

Листинг 3. Ошибка в процедуре Assign №1

Впервые встретившись с этой ошибкой, можно прийти в недоумение. Файл, из которого мы собираемся читать, на месте. Он доступен и нормально открывается текстовым редактором. Тем не менее, что-то не так. На самом деле, все просто: во время набора текста программы вместо латинской  «ЦЭ» была напечатана русская «ЭС». К счастью, такая ошибка единственная в своем роде. Раскладки «qwerty» и «йцукен» имеют совпадение только в одном месте.

2. Ошибка времени выполнения: «Файл не найден». 

Листинг 4. Ошибка в процедуре assign №2

Еще одна «механическая» ошибка, связанная с использованием процедуры Assign. В принципе, история похожа на рассказанную выше. Автор программы видит, что файл не найден, идет в папку «123» и не понимает: «Как не найден? Вот же он!»

Рис.1. Файл, да не совсем тот

Все просто: вместо нужного вам текстового файла «55.txt» вы создали файл с именем «55.txt.txt» . Этой ошибки не будет возникать, если вы для себя четко раз и навсегда уясните, что такое расширение в имени файла. И вообще, не пользуйтесь проводником в Windows, а работайте в менеджере файлов, например, в Total Commander.

  • Пас баскетбол ошибки при выполнении
  • Партнер не подключен к маршрутизатору код ошибки waitforconnectfailed
  • Партия белых оппонент нашей ошибки
  • Партизаны делали значительные потери фашистам лексическая ошибка
  • Парсер вернул ошибку 0хс00се556