Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь в поиске бага, Поиск по тип. файлу с записями 
V
    Опции темы
CorvinCory
  Дата 18.4.2008, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.4.2008
Где: Украина, Киев

Репутация: нет
Всего: нет



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

Текст первой программы (для создания файла с записями).

Код

program lab3_1;
uses crt;
const
     n=5;
type
    matrix = array [1..n] of real;
    rec = record
        FIO: String[20];
        TEL: String[7];
        end;
var
   f1: file of matrix;
   f2: file of rec;
   mt: array [1..n] of matrix;
   mr: array [1..n] of rec;
   outmt: array [1..n] of matrix;
   j: 1..n;
   i: 1..n;


   begin
   clrscr;
   randomize;

   {---Enter matrix---}

   writeln('Matrix');
   assign(f1,'matrix.dat');
   rewrite(f1);

   for i:=1 to n do
   for j:=1 to n do
   begin
   mt[i,j]:=(random*10)-5;
   write(mt[i,j]:4:1,' |');
   if j=n then writeln;
   end;
   for i:=1 to n do
   write(f1,mt[i]);
   close(f1);
   writeln;

   {---Enter record---}

   writeln('Create name-tel record');
   writeln;
   assign(f2,'record.dat');
   rewrite(f2);
   for i:=1 to n do with mr[i] do
   begin
   write('FIO: ');
   readln(FIO);
   write('TEL: ');
   readln(TEL);
   write (f2, mr[i]);
   end;
   close (f2);

   {---View matrix file---}

   reset (f1);
   For i:=1 to n do
   read(f1,outmt[i]);
   close (f1);

   writeln;
   for i:=1 to n do
   for j:=1 to n do
   begin
   write(outmt[i,j]:4:1,' |');
   if j=n then writeln;
   end;

   readkey;
   end.



Тут все работает. А вот вопросы вызывает третья прога.

Код

program lab3_3;
uses crt;
const
    n=5;
type
    rec = record
        FIO: String[20];
        Tel: String[7];
        end;

var
    f2: file of rec;
    com:array [1..n] of rec;
    i: integer;
    name: string[20];
    num: string[7];
    det:byte;

    begin
    clrscr;
    assign(f2, 'record.dat');
    reset (f2);
    for i:=1 to filesize(f2) do with com[i] do
    begin
    read(f2,com[i]);
    write(FIO:20,' - ',TEL:7);
    writeln;
    end;

    {---search---}

    det:=0;

    writeln('Enter name');
    read(name);
    writeln;
    writeln('Rezults of search');
    for i:=1 to n do
    if name=com[i].FIO then
    writeln(com[i].FIO:20,' - ',com[i].TEL:7)
    else det:=det+1;
    if det>0 then
    writeln('no records');

    writeln('Enter phone number');
    read(num);
    for i:=1 to n do
    if num=com[i].TEL then
    writeln(com[i].FIO:20,' - ',com[i].TEL:7)
    else det:=det+1;
    if det>0 then
    writeln ('no records');

    readkey;
    end.


После ввода строки с именем и вывода результатов следующее действие "read(num);" игнорируется. Почему? Пытался менять местами и добавлять дополнительные переменные - не помогает. Все попытки ввести любые строки после этой - отказывались безуспешными. Прекрасно понимаю, что проги можно переписать поменяв, например, просто тип данных второй записи и все будет работать. Но вот почему все попытки ввести с клавы еще одну строку игнорируются программой? Уж очень интересно. Буду благодарен за объяснение.
PM MAIL   Вверх
volvo877
Дата 18.4.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(CorvinCory @  18.4.2008,  21:46 Найти цитируемый пост)
После ввода строки с именем и вывода результатов следующее действие "read(num);" игнорируется. Почему?
Потому, что вводишь строку с именем через Read, а не через ReadLn. Чувствуешь разницу? Read(name) НЕ читает завершающий символ "возврат каретки" из буфера клавиатуры (в отличие от ReadLn), поэтому твой Read(num) просто напросто читает ТОЛЬКО один этот символ, и все. 

Если делать чтение данных через ReadLn, все вернется на свои места.
PM MAIL   Вверх
CorvinCory
Дата 19.4.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.4.2008
Где: Украина, Киев

Репутация: нет
Всего: нет



О_О... мдьо... и как я мог ТАКОЕ провтыкать... Спасибо большое за помощь. Я из-за этой мелочи почти вылетел из универа...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.