Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Нахождение бага в "СУБД"


Автор: VingradFan 22.5.2007, 00:56
Код

uses crt;
   type student=record
   fio:string[10];
   crs:byte
end;
type students=array[1..100] of student;
{----------------------------------------------------------------------------}
procedure fill_in(var school:students);
var student:integer;
begin
   write('Fill in the number of the student: ');
   read(student);
   with school[student] do
      begin
         write('Fill in the FIO of ',student,' student: ');
         readln(fio);
         write('Fill in the Cource of ',student,' student: ');
         readln(crs);
         writeln;
         write('Information has been adden sucessfully!');
         repeat until keypressed;
         clrscr
      end;
   writeln;
end;
{----------------------------------------------------------------------------}
procedure print(var school:students);
var student:integer;
begin
   write('Fill in the number of the student: ');
   read(student);
   with school[student] do
      begin
         writeln('The FIO of the ',student,' student is ',fio);
         writeln('The Cource of the ',student,' student is ',crs);
         repeat until keypressed;
         clrscr
      end
end;
{----------------------------------------------------------------------------}
procedure menu;
var value,student:integer;
school:students;
begin
   value:=3;
   repeat
   begin
      writeln('To fill in the information about student type "1" ');
      writeln('To print the information about student type "2" ');
      writeln('To clear the screen type "3" ');
      write('>>>  ');
      readln(value);
      case value of
         1: begin
               writeln;
               fill_in(school);
            end;
         2: begin
               writeln;
               print(school)
            end;
         3: clrscr;
   end;
end
until value=0
end;
{----------------------------------------------------------------------------}
var school:students;
begin
   menu;
end.


проблема такова:
в процедуре FILL_IN в один из элементов массива (состоящего из записей каждого студента) STUDENTS заносится ФИО и курс студента...
так вот оператор ввода ФИО пропускается...
наверно я не знаю какогото теоретического факта на тему...
проясните ситуацию пожалуйста

Автор: Misha_White 22.5.2007, 09:02
VingradFan, 
Цитата(VingradFan @  22.5.2007,  07:56 Найти цитируемый пост)
repeat until keypressed;

В место этого пиши просто Readln;
А там я не знаю... Ваще прикол, он даже просто строку не хочет... 
 smile  Ты приколист!!! я понял... У тебя же Student=record и Student:integer... smile 

Автор: ama_kid 22.5.2007, 09:05
В этой процедуре исправь:
Цитата
readln(student);

Цитата
наверно я не знаю какогото теоретического факта на тему...
Читаем хелп по Read;
Цитата
With a type string variable:

Read reads all characters up to, but not including, the next end-of-line marker or until Eof(F) becomes true; it does not skip to the next line after reading. If the resulting string is longer than the maximum length of the string variable, it is truncated.
    After the first Read, each subsequent Read sees the end-of-line marker and returns a zero-length string.
    Use multiple Readln calls to read successive string values.

Автор: Misha_White 22.5.2007, 09:19
ama_kid, 
 smile 

Автор: VingradFan 22.5.2007, 15:51
Цитата(ama_kid @  22.5.2007,  09:05 Найти цитируемый пост)
В этой процедуре исправь:

Цитата
readln(student);

спасибо большое...все работает, только так и не понял суть...
почему второй read не возвратил zero-length string ?

Автор: VingradFan 22.5.2007, 21:54
Кстати довел по чекпойнта программу smile 
кому интересно зацените, прокоментируйте
многих нужных функций нет, но все еще впереди

Автор: KuZyagroup 23.5.2007, 03:02
 smile 
Я бы советовал для СУБД использовать связные списки - красивее и ближе по смыслу БД.
П.С. Не удержался

Автор: ama_kid 23.5.2007, 09:00
Цитата(VingradFan @  22.5.2007,  15:51 Найти цитируемый пост)
почему второй read не возвратил zero-length string ?
Твоя команда read(student); заносит в переменную строку, оставляя в буфере символ конца ввода, следующая за ней команда readln(fio); считывает этот символ из буфера ввода и возвращает пустую строку в переменную fio (ибо ввод в этой команде идет именно до символа конца ввода)... Как проще объяснить - не знаю...

Автор: VingradFan 23.5.2007, 14:07
Цитата(KuZyagroup @  23.5.2007,  03:02 Найти цитируемый пост)
Я бы советовал для СУБД использовать связные списки

почитаю про это

Цитата(ama_kid @  23.5.2007,  09:00 Найти цитируемый пост)
 Как проще объяснить - не знаю...

спасибо, теперь понял smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)