Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2015, 19:44   #1
mira95
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 18
Печаль Поиск в типизированном файле. Телефонный справочник

Составить программу, которая будет формировать данные об абоненте: ФИО, адрес, номер телефона, организовать поиск телефона по фамилии абонента или по его адресу, вывод информации производится через мемо. Не получается организовать поиск (

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Label1: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TStudent=record
  fio: string[40];
  otcm:string[50];//phone
  otcs:string[50];//adres

  end;


var
  Form1: TForm1;
  stud: array[1..50] of TStudent;
  stud1: TStudent;
  fz: file of TStudent;
  nzap,x,i,y: integer;
  g:string;

implementation

{$R *.dfm}



procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:=' ';
 edit2.Text:=' ';
 edit3.Text:=' ';
 edit4.Text:=' ';
 memo1.Clear;
 nzap:=0;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
stud[nzap].fio:=edit1.Text;
stud[nzap].otcm:=edit2.Text;
stud[nzap].otcs:=edit3.Text;
memo1.Lines.Add(stud[nzap].fio+' '+stud[nzap].otcm+' '+stud[nzap].otcs) ;
 edit1.Text:=' ';
  edit2.Text:=' ';
  edit3.Text:=' ';
  edit4.Text:=' ';
  nzap:=nzap+1;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
assignfile(fz,'a.txt');
rewrite(fz);
for i:=0 to nzap-1 do begin
seek(fz,i);
end;
closefile(fz);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
form1.close;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
stud1.fio:=edit1.Text;
stud1.otcm:=edit2.Text;
stud1.otcs:=edit3.Text;
memo1.Lines.add(stud1.fio+' '+stud1.otcm+' '+stud1.otcs);
edit1.Text:=' ';
edit2.Text:=' ';
edit3.Text:=' ';
edit4.Text:=' ';
assignfile(fz,'a.txt');
memo1.Clear;
reset(fz);
x:=filesize(fz);
seek(fz,x);
write(fz,stud1);
closefile(fz);

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
assignfile(fz,'a.txt');
memo1.Clear;
reset(fz);
while not eof(fz) do begin
read(fz,stud1);
memo1.Lines.add(stud1.fio+' '+stud1.otcm+' '+' '+stud1.otcs);
end;
end;

procedure TForm1.Button5Click(Sender: TObject); //ТА САМАЯ КНОПКА ПОИСКА
begin
g:=edit4.Text;
y:=0;
while not eof(fz) do
begin
read(fz,stud1);
if stud1.fio=g then begin
memo1.Lines.Add(stud1.fio);
y:=1;

end;
closefile(fz);
if y=0 then memo1.Lines.Add('Такой записи не найдено')

end;

end;
end.

Последний раз редактировалось Аватар; 13.10.2015 в 20:18.
mira95 вне форума Ответить с цитированием
Старый 13.10.2015, 20:15   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код надо оформлять правильно. Для этого есть спец кнопка, правила форума и инструкция расскажут как надо делать, а как не надо. Или как можно, но не желательно. И даже как желательно, но не обязательно.

В procedure FormCreate инициализация нулём nzap:=0;,
но
Код:
var
stud: array[1..50] of TStudent;
с единицы. Нужно изменить границы на array[0..50]

Button2Click очень странная вещь? Что она делает? Создаёт пустой файл нужного размера? Тогда почему многократно. Достаточно seek(fz, nzap-1); Но, ИМХО, эта процедура вообще не нужна. Срочно её убрать

Button5Click
В начале
Код:
assignfile(fz,'a.txt');
reset(fz);
Дальше вроде относительно нормально. Поиск не работал из-за того, что курсор в файле стоял в конце (вероятно, из-за не закрытия его в прошлый раз)


И последнее, массив вообще не нужен, можно записывать в файл после каждого ввода.
Писал прям тут, не проверял.

Последний раз редактировалось eoln; 14.10.2015 в 16:27.
eoln вне форума Ответить с цитированием
Старый 13.10.2015, 23:21   #3
mira95
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 18
По умолчанию

Большое спасибо за пояснения, я подкорректировала 5 ю кнопку, теперь вроде результат выдает но и параллельно выдает ошибку, выделяет в этой кнопке

Код:
procedure TForm1.Button5Click(Sender: TObject);  //ТА САМАЯ КНОПКА ПОИСКА
begin
assignfile(fz,'a.txt');
reset(fz);
g:=edit4.Text;
y:=0;
while not eof(fz) do
begin
read(fz,stud1);
if stud1.fio=g then begin
y:=y+1;
memo1.Lines.Add(stud1.fio);
end;
closefile(fz);
if y=0 then memo1.Lines.Add('Такой записи не найдено')

end;

end;
while not eof(fz) do -ВОТ ЭТУ строчку и выдает ошибку O/I 103, с чем это может быть связано?
mira95 вне форума Ответить с цитированием
Старый 14.10.2015, 00:33   #4
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Может быть файл не находит. Оттого что папка по умолчанию не та. Лучше OpenDialog , SaveDialog используйте, раз уж вы в Delphi. А не просто 'a.txt', который непонятно в какой папке.
Хотя, если вы его создавали, то папка по умолчанию должна быть та что надо.
Может создан какой-то не такой.

Кстати, странное расширение для типизированного файла.

Последний раз редактировалось type_Oleg; 14.10.2015 в 00:39.
type_Oleg вне форума Ответить с цитированием
Старый 14.10.2015, 00:46   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Кстати, странное расширение для типизированного файла.
угу.
что-то мне подсказывает, что товарищ mira95 подсовывает обычный текстовый файл, набранный в блокноте, вместо ТИПИЗИРОВАННОГО файла.
нужно создать программно типизированный и использовать именно его!


а ещё.
mira95, если Вы взяли чужой код, в котором была запись с типом студент и его оценки,
то почему не переименовать типы данных и имена переменных?!
Цитата:
Код:
TStudent=record
...
  stud: array[1..50] of TStudent;
неужели TAbonent хуже, чем TSudent?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.10.2015, 00:48   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Лучше OpenDialog , SaveDialog используйте, раз уж вы в Delphi.
и TFileStream - тоже!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 14.10.2015, 10:22   #7
mira95
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 18
По умолчанию

Я не стала переименовывать переменные, чтобы окончательно ничего не сломать, просто подогнала код похожей задачи под свой. Не знаю, у нас называют именно "работой с типизированным файлом", дали такое задание, я попыталась выполнить и файл обязательно должен быть текстовым :/ Но все равно спасибо за все ваши объяснения, если кто-то еще найдет варианты этой ошибки-жду ответа, и сама попробую исправить заодно
mira95 вне форума Ответить с цитированием
Старый 14.10.2015, 10:44   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от mira95 Посмотреть сообщение
Я не стала переименовывать переменные, чтобы окончательно ничего не сломать
ну, понятно. но поиск и замена с галочкой "Только целые слова"
вполне можно пользоваться.
Просто это же у Вас учебная задача.
Вы её будете сдавать/защищать.
А любой человек сразу увидит, что Вы взяли ЧУЖОЙ код и даже толком в нём не разобрались (раз не смогли поменять имена типов и переменных).
Можно получить проблемы со сдачей..
Но это дело ваше.
С точки зрения программы(и компилятора) в этом ошибки нет.

Цитата:
Сообщение от mira95 Посмотреть сообщение
Не знаю, у нас называют именно "работой с типизированным файлом", дали такое задание, я попыталась выполнить и файл обязательно должен быть текстовым
так файл должен быть ТИПИЗИРОВАННЫМ или ТЕКСТОВЫМ?
Это принципиально РАЗНЫЕ вещи.
И как раз в этом и заключается ошибка, которую Вы получаете!

Как вариант, иногда бывает такое задание, когда нужно прочитать исходные данные из входного ТЕКСТОВОГО файла, распарсить их, занести в нужный тип записи, а потом сохранить в ТИПИЗИРОВАННЫЙ.
Но работать с текстовым файлом как типизированным файлом из записей нужной структуры Вам программа не позволит.

успехов в учёбе!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.10.2015, 16:50   #9
mira95
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 18
По умолчанию

Файл должен был быть текстовым. Но именно само задание и тему называют именно типизированным :/. Ну а так, спасибо за помощь, помог совет с 5 й кнопкой и массивом, что насчет других кнопок, они нужны, если удалить-придраться могут. И я нашла оставшиеся ошибки. Ошибки выскакивали из-за самой что ни есть банальной причины-не в тех местах были прописаны ЭНДЫ. немного покопавшись, я решила до конца проблему. Всем большое спасибо.
mira95 вне форума Ответить с цитированием
Старый 16.10.2015, 01:08   #10
mira95
Пользователь
 
Регистрация: 13.10.2015
Сообщений: 18
По умолчанию

Я уже думала, что все сделала, и даже скринить собиралась, лабораторную оформляла и тут я заметила, что выдает сразу два результата: т.е. ввожу фамилию, пишет фмаилию, и вслед "Результат не найден" (( я уже замучилась бегины и энды переставлять, ошибку так и не могу найти:
Код:
procedure TForm1.Button5Click(Sender: TObject);  Та самая проблемная кнопка
begin
assignfile(fz,'a.txt');
reset(fz);
g:=edit4.Text;
  y:=0;
while not eof(fz) do
begin
read(fz,stud1);
if (stud1.fio=g) xor (stud1.otcs=g) then  begin
memo1.Lines.Add(stud1.otcm);
y:=y+1 ; end else   memo1.Lines.Add('Результат не найден;');

end;

closefile(fz) ;




end;
mira95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
телефонный справочник mixon-21 Общие вопросы C/C++ 23 09.09.2013 06:57
Поиск элемента в типизированном файле Solidera Помощь студентам 1 13.04.2013 00:36
Телефонный справочник поиск grom333 Помощь студентам 6 14.05.2010 22:28
С++ справочник телефонный BLacK_TeaR Помощь студентам 3 04.03.2010 13:42
Телефонный справочник Krechet Софт 5 10.08.2009 15:51