Ошибка времени выполнения входная строка имела неверный формат readln

Рискну предположить, что readln гордо считал «mynamw 334» в s, и дальше не смог найти ничего похожего на i. Откуда ему знать, где заканчивается ваша строка и есть ли в ней пробелы? Попробуйте заменить это на просто readln(f, s); i := 100; и посмотреть, что будет.


Итак, проблему нашли. А можно переставить местами данные:

334 mynamw
334 myeemw
334 mynrrramw

?

Если да, то всё получится с readln(f, i, s);.


Поскольку мы решили не менять формат, задача становится сложнее :) Я бы считал всю строку в строковую переменную (readln(f, line);), а дальше нашёл бы в ней последний пробел (поиском с конца) и разделил по нему на s (подстрока от начала до позиции найденного пробела) и i (остаток строки, перевести в число с помощью StrToInt). Понятно, как?

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

Программу вроде написал, но выдает ошибку ‘Входная строка имела неверный формат’. Если вводить только числа, то это ошибку не выдает, а если какой-нибудь элемент будет содержать букву, то это ошибку выдает на операцию ‘strtoint’. Я понимаю в чем суть ошибки, но не знаю как ее исправить.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
program pr1;
var a:array[1..10000000] of string;
i,k,n,r:integer;
begin
readln(n);
k:=0;
for i:=1 to n do begin
readln(a[i]);
if (a[i]='ABSINTH') or (a[i]='BEER') or (a[i]='BRANDY') or (a[i]='CHAMPAGNE') or (a[i]='GIN') or (a[i]='RUM') or (a[i]='SAKE') or (a[i]='TEQUILA') or (a[i]='VODKA') or (a[i]='WHISKEY') or (a[i]='WINE')  then k:=k+1;
if ((strtoint(a[r]))<18) then k:=k+1; 
end;
writeln(k);
end.

Puporev, понимаю, что ошибка глупая, но не знаю, как исправить. Не бейте.

По Берляндским законам в барах разрешается продавать алкогольные напитки только людям не младше 18 лет. Работа Васи — следить за соблюдением этого закона. Сегодня вечером он зашел в один бар, и увидел, что там сидят n человек. Так получилось, что для каждого из них Вася сразу точно определил либо возраст, либо напиток, который пьет этот человек. Любого человека Вася может проверить дополнительно — т. е. узнать одновременно и точный возраст, и напиток. Какое наименьшее количество человек Вася должен проверить дополнительно, чтобы убедиться, что нет посетителей младше 18 лет, пьющих алкогольные напитки?

Список всех алкогольных напитков Берляндии: ABSINTH, BEER, BRANDY, CHAMPAGNE, GIN, RUM, SAKE, TEQUILA, VODKA, WHISKEY, WINE

Входные данные
В первой строке записано целое число n (1 ≤ n ≤ 100)— количество посетителей бара. Далее следует n строк, в каждой описывается один посетитель. Записан либо его возраст (целое число от 0 до 1000), либо напиток (строка больших латинских букв длиной от 1 до 100). Гарантируется, что входные данные не содержат пробелов и других лишних разделителей.

Алкогольными следует считать только напитки из списка, приведенного выше.

Выходные данные
Выведите одно число — сколько человек должен проверить Вася чтобы гарантировать соблюдение закона.

Примеры
входные данные
5
18
VODKA
COKE
19
17
выходные данные
2

Ответ:

Объяснение:

Во-первых, если Вы пишете в PascalABC.NET, можно писать это проще и короче, не заморачиваясь с типами данных.

begin

 var c := ReadlnChar(‘Введите символ s’);

 var s := OrdAnsi(c);

 Writeln(‘Код введённого символа — ‘, s)

end.

Во-аторых, если Вы все же хотите в современном PascalABC.NET писать, как в Delphi образца 2005 года, пишите хотя бы правильно:

var

 s:integer;

 c:char;

begin

 writeln(‘Введите символ s’);

 readln(c);

 s:= ordAnsi(c);

 writeln(‘Код введённого символа — ‘, s);

end.

В программе работает все, кроме удаления записи из файла

Собственно сама ошибка:

строка (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.

Формулировка задачи:

в выделеной строке выдает Ошибка времени выполнения: Входная строка имела неверный формат.

Код к задаче: «Ошибка времени выполнения: Входная строка имела неверный формат»

textual

for i:=1 to m do
for j:=1 to n do
read(f1,a[i,j]); // здесь ошибка readln читает строку, а у нас числа

Полезно ли:

14   голосов , оценка 3.714 из 5

  • Ошибка времени выполнения unable to read beyond the end of the stream
  • Ошибка времени выполнения system indexoutofrangeexception индекс находился вне границ массива стек
  • Ошибка времени выполнения system formatexception входная строка имела неверный формат
  • Ошибка времени выполнения object reference not set to an instance of an object
  • Ошибка времени выполнения input string was not in a correct format