GAECHKA
Твоя помощница в решении задач

Проверьте код, пожалуйста

Пожалуйста, помогите найти ошибку в этом коде, очень прошу.
Учусь только
Очень уж знать хочется, где накосячил.
Program SUBD;
 
Type lot=record
  con:string[20];
  tim:integer;
  agn:string[20];
  pri:integer;
  dop:string[50];
  end;
  tfile=file of lot;
  Var 
  f:tfile;
  k:byte;
  
  procedure tures(Var f:tfile);
  var a:lot;
  begin
 
  rewrite(f);
  Writeln('Данные тура:');
  With a do
  begin
  con:='Турция';
  Writeln('Страна: ',con);
  tim:=25;
  Writeln('Длительность: ',tim);
  agn:='Вокруг Света';
  Writeln('Турфирмa: ',agn);
  pri:=45000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end; 
  with a do
  begin
  con:='Кипр';
  Writeln('Страна: ',con);
  tim:=20;
  Writeln('Длительность: ',tim);
  agn:='Вояж Тур';
  Writeln('Турфирмa: ',agn);
  pri:=60000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end;
  with a do
  begin
  con:='Таиланд';
  Writeln('Страна: ',con);
  tim:=20;
  Writeln('Длительность: ',tim);
  agn:='Время путешествий';
  Writeln('Турфирмa: ',agn);
  pri:=50000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end;
  with a do
  begin
  con:='Тунис';
  Writeln('Страна: ',con);
  tim:=20;
  Writeln('Длительность: ',tim);
  agn:='Время путешествий';
  Writeln('Турфирмa: ',agn);
  pri:=55000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end;
  with a do
  begin
  con:='Кипр';
  Writeln('Страна: ',con);
  tim:=20;
  Writeln('Длительность: ',tim);
  agn:='Вояж Тур';
  Writeln('Турфирмa: ',agn);
  pri:=60000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end;
  with a do
  begin
  con:='Россия';
  Writeln('Страна: ',con);
  tim:=25;
  Writeln('Длительность: ',tim);
  agn:='Гелла';
  Writeln('Турфирмa: ',agn);
  pri:=23000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный и экономный тур.';
  Writeln(dop);
  end;
  With a do
  begin
  con:='Турция';
  Writeln('Страна: ',con);
  tim:=30;
  Writeln('Длительность: ',tim);
  agn:='Гелла';
  Writeln('Турфирмa: ',agn);
  pri:=50000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end; 
  With a do
  begin
  con:='Кипр';
  Writeln('Страна: ',con);
  tim:=20;
  Writeln('Длительность: ',tim);
  agn:='Гольфстрим';
  Writeln('Турфирмa: ',agn);
  pri:=50000;
  Writeln('Цена: ',pri);
  dop:='Увлекательный тур.';
  Writeln(dop);
  end;  close(f);
  end;
  procedure findprice(Var f:file);
Var a:lot;
  fl:boolean;
  x,con,agn,dop:string;
  tim,pri,x1:integer;
  begin
  reset(f);
  Writeln('Введите название страны для поиска:');
  readln(x);
  if x'#' then 
  begin
  writeln('Введите нужный ценовой порог:');
  readln(x1);
  fl:=true;
  Writeln('Страна: ',con:20,'Длительность: ',tim:10,'Агенство: ',agn:20,'Цена: ',pri:10,'Дополнительно: ',dop:30);
  While NOT EOF(f) do
  Begin
  read(f,a);
  With a do 
  if x=con then
  if x1>=pri then
  begin
  fl:=true;
  Writeln(con:20,tim:10,agn:20,pri:10,dop:30);
  end; end; end;
  if fl=false then
  Writeln('Таких записей нет.')
  else
  Writeln('Поиск в БД успешно завершён.');
  close(f);
  end; 
  procedure findagn(Var f:tfile);
  Var a:lot;
  fl:boolean;
  x,con,agn,dop:string;
  tim,pri:integer;
  begin
  reset(f);
  Writeln('Введите название агентсва/турфирмы:');
  readln(x);
  fl:=true;
  Writeln('Страна: ',con:20,
  'Длительность: ',tim:10,
  'Агенство: ',agn:20,
  
  'Цена: ',pri:10,'Дополнительно: ',dop:30);
  While NOT EOF(f) do
  begin
  read(f,a);
  With a do
  if x=agn then
  fl:=true;
  Writeln(con:20,tim:10,agn:20,pri:10,dop:30);
  end;
  if fl=false then
  Writeln('Таких записей нет.')
  else
  Writeln('Поиск в БД успешно завершён.');
  close(f);
  end;
  procedure findcon(Var f:tfile);
  Var a:lot;
  fl:boolean;
  x,con,agn,dop:string;
  tim,pri:integer;
  begin
  reset(f);
  Writeln('Введите название страны:');
  readln(x);
  fl:=true;
  Writeln('Страна: ',con:20,'Длительность: ',tim:10,'Агенство: ',agn:20,'Цена: ',pri:10,'Дополнительно: ',dop:30);
  While NOT EOF(f) do
  begin
  read(f,a);
  With a do
  if x=con then
  fl:=true;
  Writeln(con:20,tim:10,agn:20,pri:10,dop:30);
  end;
  if fl=false then
  Writeln('Таких записей нет.')
  else
  Writeln('Поиск в БД успешно завершён.');
  close(f);
  end;
  procedure findtim(Var f:tfile);
  Var a:lot;
  fl:boolean;
  con,agn,dop:string;
  x,tim,pri:integer;
  begin
  reset(f);
  Writeln('Введите длительность тура:');
  readln(x);
  fl:=true;
  Writeln('Страна: ':20,'Длительность: ':10,'Агенство: ':20,'Цена: ':10,'Дополнительно: ':30);
  While NOT EOF(f) do
  begin
  read(f,a);
  With a do
  if x=tim then
  fl:=true;
  Writeln(con:20,tim:10,agn:20,pri:10,dop:30);
  end;
  if fl=false then
  Writeln('Таких записей нет.')
  else
  Writeln('Поиск в БД успешно завершён.');
  close(f);
  end;
  Procedure Menu;
  begin
  
  Writeln('МЕНЮ:');
  Writeln('1.Туры по списку предложенных.');
  Writeln('2.Поиск тура по цене(в страну).');
  Writeln('3.Поиск тура по наименованию агенства.');
  Writeln('4.Поиск тура по предложенным странам поездки.');
  Writeln('5.Поиск тура по его длительности.');
  Writeln('6.Конец работы.');
  end;
  begin
  assign(f,'bd.dat');
  
   
   
  repeat
  Menu;
  Readln(k);
  case k of
  1:tures(f);
  2:findprice(f);
  3:findagn(f);
  4:findcon(f);
  5:findtim(f);
  6:begin
 
  Writeln('Работа завершена.');
  end;
  else
  begin
  
  writeln('Введите правильный пункт меню.');
  readln; end; end;
  until k=7;
  end.
0
вопрос задан

Источник


2 ответа
Решение
Program SUBDproject1;
uses
  sysutils;
Type
  Tlot = record
     con:string[20];  // Страна.
     tim:integer;     // Длительность тура.
     agn:string[20];  // Турфирма.
     pri:integer;     // Цена.
     dop:string[50];  // Дополнительно.
            end;
  tfile = file of Tlot;
 
procedure Zagolovok;
begin
   Writeln('Страна: ':15,'Длительность: ':5,'Агенство: ':15,'Цена: ':10,'Дополнительно: ':30);
end;
 
procedure Screentures(aa:Tlot);
begin
  Writeln(aa.con:15, aa.tim:5, aa.agn:15, aa.pri:10, aa.dop:30);
end;
 
procedure EndMessage(ff: boolean);
begin
  if ff then
    Writeln('Поиск в БД успешно завершён.')
  else
    Writeln('Таких записей нет.');
 
end;
 
procedure writetures(Var f:tfile);
var
  a:Tlot;
  s: string;
begin
  Reset(f);
  Seek(f,FileSize(f));
  Writeln('Введите данные тура:');
  repeat
  Writeln('Страна:');
  Readln(a.con);
  Writeln('Длительность:');
  Readln(a.tim);
  Writeln('Турфирма:');
  Readln(a.agn);
  Writeln('Цена:');
  Readln(a.pri);
  Writeln('Дополнительно:');
  Readln(a.dop);
  write(f,a);
  Writeln('Продолжить ввод информации? y/n:');
  Readln(s);
  if s = 'n' then
    break;
  until false;
  close(f);
  end;
 
procedure tures(Var f:tfile);
Var
  a:Tlot;
begin
  Zagolovok;
  reset(f);
  While NOT EOF(f) do
    begin
      read(f,a);
      Screentures(a)
    end;
  close(f);
end;
 
 
procedure findprice(Var f:Tfile);
Var
  a:Tlot;
  fl:boolean;
  x: string;
  x1: integer;
begin
  fl:= false;
  Writeln('Введите название страны для поиска:');
  readln(x);
  if x'#' then
    begin
      writeln('Введите нужный ценовой порог:');
      readln(x1);
      Zagolovok;
      reset(f);
      While NOT EOF(f) do
        Begin
          read(f,a);
          if (x = a.con) and (x1 >= a.pri) then
              begin
                fl:=true;
                Screentures(a);
              end;
        end;
    end;
  EndMessage(fl);
  close(f);
end;
 
procedure findagn(Var f:tfile);
Var
  a:Tlot;
  fl:boolean;
  x: string;
begin
  fl:= false;
  Writeln('Введите название агентства/турфирмы:');
  readln(x);
  Zagolovok;
  reset(f);
  While NOT EOF(f) do
    begin
      read(f,a);
        if x = a.agn then
          begin
            fl:= true;
            Screentures(a);
          end;
    end;
  EndMessage(fl);
  close(f);
end;
 
 
procedure findcon(Var f:tfile);
Var
  a:Tlot;
  fl:boolean;
  x: string;
begin
  fl:= false;
  Writeln('Введите название страны:');
  readln(x);
  Zagolovok;
  reset(f);
  While NOT EOF(f) do
    begin
      read(f,a);
        if x = a.con then
          begin
           fl:=true;
           Screentures(a);
          end;
    end;
  EndMessage(fl);
 
  close(f);
end;
 
procedure findtim(Var f:tfile);
Var
  a:Tlot;
  fl:boolean;
  x: integer;
begin
  fl:= false;
  Writeln('Введите длительность тура:');
  readln(x);
  Zagolovok;
  reset(f);
  While NOT EOF(f) do
    begin
      read(f,a);
        if x = a.tim then
          begin
           fl:=true;
           Screentures(a);
          end;
    end;
  EndMessage(fl);
  close(f);
end;
 
Procedure Menu;
  begin
    Writeln('МЕНЮ:');
    Writeln('1.Туры по списку предложенных.');
    Writeln('2.Поиск тура по цене(в страну).');
    Writeln('3.Поиск тура по наименованию агенства.');
    Writeln('4.Поиск тура по предложенным странам поездки.');
    Writeln('5.Поиск тура по его длительности.');
    Writeln('6.Добавление новых туров.');
    Writeln('7.Конец работы.');
  end;
 
 
Var
  f:tfile;
  k:byte;
  namefil: string;
begin
 namefil:= 'bd.dat';
  assign(f,namefil);
  if  not FileExists(namefil) then
    rewrite(f);
  repeat
    Menu;
    Readln(k);
    case k of
    1:tures(f);
    2:findprice(f);
    3:findagn(f);
    4:findcon(f);
    5:findtim(f);
    6:writetures(f);
    7: begin
         Writeln('Работа завершена.');
       end;
    else
      begin
        writeln('Введите правильный пункт меню.');
        readln;
      end;
    end;
  until k=7;
  Readln;
end.
Ошибки:
1. Не сделан пункт меню, который позволяет создавать файл базы данных.
2. Не сделана процедура, которая заполняет базу данных информацией.
Запомните эти кодовые строчки. Они позволяют дописывать информацию в конец типизированного файла.
 
Reset(f);
Seek(f,FileSize(f));
Этот код проверяет существование файла, и если он не существует, то создается заново программой. namefil - строковая переменная. Если стоит просто имя файла, то проверяется наличие файла в той же директории, что и исполняемый файл, если стоит полный путь к файлу, то программа проверяет наличие файла, там куда указывает путь.
if  not FileExists(namefil) then
    rewrite(f);
3. Вывод найденных записей был организован с ошибками.
4. Куча мелочей, которые сильно на исполнение кода не влияют, но делают код неудобным для чтения.
Спасибо вам огромное! Разбираю ваш код, визуально всё понимаю.
Сейчас рискну попробовать и самому написать функции корректировки и удаления данных, усложнить было бы интересно.
А вот вопрос, я приписывал к переменной "a" просто "lot" , а вы написали "Tlot". Что это означает? Какова разница между этими двумя функциями?
Заранее большущее спасибо!