Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 26.01.2010, 22:09   #1 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
Unhappy Паскаль пропускает оператор ввода строки

Написал программу, задание:
В файле хранится информация о каждом студенте группы: фамилия и оценки по трем предметам. Переписать эти данные в другой файл записей, исключая сведения о неуспевающих студентах.
Код:
uses crt;
type student=record
      surname:string;
      mark:array [1..3] of 2..5;
     end;
     gr=array[1..20] of student;
var f,nf:file of gr;
    group,goodgroup:gr;
    i,j,n:integer;
begin clrscr;
      write ('Input number of students (1..20): ');
      readln (n);
      clrscr;
      assign (f, 'group.dat');
      for i:=1 to n do begin {1}
          writeln;
          writeln ('Input information about ', i, ' student');
          with group[i] do begin
               write ('Surname: ');
               readln (surname); {2}
               write ('Student's marks by session (Math Physics InfTechnologies): ');
               read (mark[1], mark[2], mark[3]);
          end;
      end;
      rewrite(f);
      write (f, group);
      close (f);
      assign (nf, 'goodgroup.dat');
      rewrite (nf);
      clrscr;
      writeln ('Good students:');
      for i:=1 to n do begin
          with group[i] do begin
               if (mark[1]>=3)and(mark[2]>=3)and(mark[3]>=3) then begin
                  inc(j,1);
                  goodgroup[j]:=group[i];
                  write (goodgroup[j].surname, ' ');
               end;
          end;
      end;
      write (nf, goodgroup);
      close(nf);
      readkey;
end.
так все в порядке, но... первый шаг счетчика {1}. Все операторы ввода-вывода работают нормально. второй шаг - пропускается оператор {2}. То есть на экране видно следующее:
Цитата:
Input information about 2 student
Surname: Student's marks by session (Math Physics InfTechnologies):
Делалось в Turbo Pascal 7.0, пробовал в Borland Pascal, на другом ПК - все так же. Создал в делфи консольное приложение, скорировал туда этот код, подправил.. То же самое. В чем дело?
MrSTEP вне форума   Ответить с цитированием

Старый 26.01.2010, 22:09
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пока в вашей теме нет ответов можете заняться прочтением схожих тем

Паскаль, символы и строки
Паскаль, строки

Старый 26.01.2010, 22:30   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Очень просто - во второй после {2} строке замените read на readln, и всё пойдет.
Но вот чего я никак не могу понять - это как у Вас проходит вывод сообщения Student's marks by session... Дело в том, что у меня, как только трансляция доходит до апострофа в слове Student's, как транслятор полагает, что строка завершена, и, не обнаружив дальше ни запятой, ни закрывающей скобки, тут же рапортует об ошибке (что, по-моему, естественно). А Вам-то как удалось такой фокус-покус провернуть (мне пришлось заменить Student's на Student"s)?
Vladimir_S вне форума   Ответить с цитированием
Старый 26.01.2010, 22:42   #3 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

а, это простое раздолбайство.. немного изменил данную строку перед отправкой на форум, и не заметил, что использовал такой апостроф. В оригинале строка выглядела примерно так: "Marks of this student...", следовательно, проблем при компиляции не было
MrSTEP вне форума   Ответить с цитированием
Старый 26.01.2010, 22:44   #4 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Спасибо тебе, Владимир, все заработало.. но как это связано?
MrSTEP вне форума   Ответить с цитированием
Старый 26.01.2010, 22:52   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от MrSTEP Посмотреть сообщение
Спасибо тебе, Владимир, все заработало.. но как это связано?
Знаешь... поскольку я - самоучка, отвечу несколько непрофессионально. По моему опыту, оператор read - это вообще "плохой" оператор, в том смысле, что нельзя оставлять эту операцию "подвешенной": идут всякие глюки. То есть его можно (и нужно) использовать, например, в цикле чтения элементов строки матрицы, но завершать любое чтение нужно ТОЛЬКО оператором readln. Тогда глюков не будет. Как-то так.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 26.01.2010, 23:02   #6 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

хм, ну я тоже стараюсь его не юзать. но здесь... {минутный завис по поводу кода} ступил, когда написал его. все равно, считались бы все значения с одной строки, а потом перекинуло курсор на следующую. В общем, все нормально, спасибо
MrSTEP вне форума   Ответить с цитированием
Старый 27.01.2010, 02:34   #7 (permalink)
Long Cat
Banned
 
Регистрация: 01.09.2009
Сообщений: 4,396
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 2544
По умолчанию

С помощью операторов read и readln можно читать данные из текстового файла, но делать это нужно с осторожностью.
Оператор read считывает данные до разделителя, разделителем считается пробел, табуляция или конец строки (для чисел), при этом указатель файла остается перед концом строки.
readln считывает строку целиком и ставит указатель файла после символа конца строки.
Отсюда следует, что если при чтении текстового файла дважды вызвать read подряд, произойдет следующее: первый read дойдет до конца строки и остановится там, второй read начнет читать данные, но в качестве данных считает тот же конец строки и остановится на том же месте, ничего не считав.
Таким образом, read при чтении из текста подходит, если нужно читать числа, записанные в несколько колонок через разделитель (пробел или табуляцию).
При этом, после каждой операции чтения следует проверять, не повстречался ли в файле конец строки (функция eoln()) и если повстречался, перейти на следующую, с помощью вызова readln.
При этом, читать строки с помощью read нельзя, для этого существует readln.
Это описание соответствует тому, что описано в руководстве к очень старой версии Паскаля. Современные компиляторы могут вести себя неправильно.
Long Cat вне форума   Ответить с цитированием
Старый 27.01.2010, 10:01   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну да, именно так. Вот и получается то, что я описал по-простому.
Vladimir_S вне форума   Ответить с цитированием
Старый 27.01.2010, 13:11   #9 (permalink)
MrSTEP
一步一步地会到目的
 
Аватар для MrSTEP
 
Регистрация: 09.05.2009
Адрес: Черноземье
Сообщений: 10,939
Записей в дневнике: 10
Сказал(а) спасибо: 140
Поблагодарили 80 раз(а) в 33 сообщениях
Репутация: 28362
По умолчанию

Нам примерно такое объясняли, но несколько проще и короче. Теперь лучше понял их суть
MrSTEP вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 20:37.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.