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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.01.2011, 13:20   #1
Gortxayer
 
Регистрация: 05.01.2011
Сообщений: 6
По умолчанию Паскаль,База данных.

Вот у меня тут задача,я ее решила,,только вот не много закосячила с поиском,в начале он ищет,когда вводишь первый раз,а дальше после дополнения,когда добавляешь книги ,снова вбиваю поиск по тем книгам которые ввела...он пишет нет такой книги,хотя я их вводила...посмотрите пожалуйста,может я что-то пропустила...
А так задача состоит:вывести сведение о книге,автора,издательство,дата поступления,год издательства,+дополнение,то есть можно добавить еще не сколько книг...

Код:
Program m1; uses crt; 
Var 
F: text; n,i,q: integer; 
name: string[15]; 
avtor: string[50]; 
izdat:string[9]; 
god: integer; 
datapost: integer; 
PROCEDURE VVOD;
Begin 
Assign (f, 'c:\mir.txt') ; 
Rewrite(f); 
Write ('Vvedite nazvanie knigi: '); Readln(name); 
Write ('Vvedite F.I.O: '); Readln(avtor); 
Write ('Nazvanie izdatelstva: '); Readln (izdat); 
Write ('God izdatelstva: '); readln (god); 
Write ('Data postuplenya: '); readln (datapost); 

Writeln(f,name); 
Writeln(f,avtor ); 
Writeln(f,izdat); 
Writeln(f,god); 
Writeln(f,datapost); 
Close (f); 
Readln; 
End;

PROCEDURE POISK; 
Var 

obr: string[15]; 
Begin 
Assign (f,'c:\mir.txt') ; 
Reset (f); 
Repeat 
write ('Vvedite knigu: '); 
Readln (obr); 
If length(obr)<>0 then 
Begin 
Reset (f); 
N:=0; 
While not eof(f) do 
Begin 
Readln(f,name); 
Readln(f,avtor); Readln(f,izdat); Readln(f,god ); 
Readln(f,datapost); 
If name=obr then 
Begin 
Writeln(name,' ', avtor,' ', izdat,' ',god,' ',datapost); 
N:=n+1; End; 
If n=0 then writeln ('Net takoi knigi');End; 
end; Until length(obr)=0; 
Readln; close (f); 
End; 

PROCEDURE DOPOLNENIE; var g: integer; dob: string; 
Begin 
Write ('Skolko knig hotite dobavit: '); 
Assign (f,'c:\mir.txt') ; rewrite (f); 
Append (f); 
readln (n); 
For I:=1 to n do 
Begin 
Write ('Vvedite nazvanie knigi: '); Readln(name); 
Write ('Vvedite F.I.O: '); Readln(avtor); 
Write ('Nazvanie izdatelstva: '); Readln (izdat); 
Write ('God izdatelstva: '); readln (god); 
Write ('Data postuplenya: '); readln (datapost); 
Readln (dob); 
Writeln (f,dob); 
End; 
Close (f); 
Writeln ('Knigi dobavlenny'); 
Readln; 
End; 
begin 
clrscr; 
VVOD; POISK; DOPOLNENIE; end.
________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 05.01.2011 в 13:52.
Gortxayer вне форума Ответить с цитированием
Старый 05.01.2011, 13:22   #2
Gortxayer
 
Регистрация: 05.01.2011
Сообщений: 6
По умолчанию

И я смотрела,другие темы,именно про библиотеку,но там совсем иначе написано,можно сказать правильнее чем у меня,но я делала сама,как смогла.
Gortxayer вне форума Ответить с цитированием
Старый 05.01.2011, 13:58   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) грубейшая ошибка в процедуре Дополнения
Цитата:
Код:
procedure DOPOLNENIE; 
var  
  g: integer; 
  dob: string;
begin
  Write('Skolko knig hotite dobavit: ');
  Assign(f, 'c:\mir.txt'); rewrite(f);
  Append(f);
Выкиньте то, что выделено красным!
Этой командой Вы стираете файл. Разумеется, что всё, что там было раньше - теряется напрочь.

2) Вы зря решаете задачу, используя текстовый файл.
Думаю, что тут предполагается использование типа Запись (type ... record) ну и типизированного файла var f : file of BookRec;

3) пишите код с отступами - это гораздо удобнее и нагляднее. и не пишите несколько операторов в одной строчке. Это некрасиво и ненаглядно!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2011, 14:01   #4
Gortxayer
 
Регистрация: 05.01.2011
Сообщений: 6
По умолчанию

Блин,так и знала,но не была уверенна на rewrite.Спасибо,сейчас начну перерабатывать задачу,попробую сделать так,как написали.
Gortxayer вне форума Ответить с цитированием
Старый 05.01.2011, 15:47   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) есть ещё такое нарушение - излишнее цитирование.
для того, чтобы сказать одну фразу, не надо цитировать сообщение из 50 строк...
ферштейн?...

2)
Цитата:
Спасибо,сейчас начну перерабатывать задачу,попробую сделать так,как написали.
Удачи.
А появятся конкретные вопросы - пишите прямо здесь, в эту тему...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2011, 16:10   #6
Novi4ok_11
Форумчанин
 
Регистрация: 11.12.2010
Сообщений: 110
По умолчанию

И файл 100% сдесь нужно типизированый использовать при решении такой задачи
Novi4ok_11 вне форума Ответить с цитированием
Старый 05.01.2011, 16:29   #7
Gortxayer
 
Регистрация: 05.01.2011
Сообщений: 6
По умолчанию

ферштейн?...
да,мне понятно.
Gortxayer вне форума Ответить с цитированием
Старый 05.01.2011, 16:46   #8
Gortxayer
 
Регистрация: 05.01.2011
Сообщений: 6
По умолчанию

Вот,нашла похожую задачу,все поменяла,сделала,работает,но опять же с поиском проблема))что-то не везет на него.С типизированными файлами.Отошла я от своей задачи и переключилась на эту,так как мне показалась с этой удобней работать,и мороки меньше.Подскажите,я выделила то место,где блин не работает,наверно что-то не дописала?!

Код:
Program Biblioteka;
 Uses crt;
 label 10;
 type spisok=record
     name:string;
     avtor:string;
     izdat:string;
     god:integer;
     datapost:integer;
     end;
FT= file of spisok;
Var a:ft;
    i,z:integer;
    s:real;
Procedure Sozdanie (var a:ft);
Var i,j:integer;
    zk:spisok;
begin
rewrite (a);
j:=1;
 repeat
          begin
          write ('vvedite nazvanie knigi ');
          readln (zk.name);
          write ('Vvedite F.I.O');
          readln (zk.avtor);
          write ('vvedite nazvanie izdatelstva ');
          Readln (zk.izdat);
          write ('vvedite god izdatelstva');
          readln (zk.god);
write('vvedite datu postupleniya');
readln(zk.datapost);
          write (a,zk);
          writeln ('Продолжить запись? ДА-1 НЕТ-0');
          readln (j);
          end;
until j=0;
close (a);
end;
Procedure vyvod (var a:ft);
Var i:integer;
    zk:spisok;
begin
reset (a);
 writeln ('=================================');
 writeln ('| Kniga| avtor| izdat| god| post');
 writeln ('=================================');
  while not eof(a) do
   begin    
read (a,zk);
    write ('|',zk.name:6,'|');
    write ('|',zk.avtor:9,'|');
    write ('|',zk.izdat:6,'|');
    write ('|',zk.god:9,'|');
    write ('|',zk.datapost:6,'|');
    writeln;
    writeln ('-------------------------------');
   end;
close (a);
end;
Procedure poisk (var a:ft);
var i:integer;
    zk:spisok;
    Kniga:string;
begin
reset (a);
 writeln ('Vvedite knigu dlja poiska ');
 readln (name);
 writeln ('spisok s zadannym imenem ');
 writeln ('=================================');
 writeln ('| Kniga| avtor| izdat| god| post');вот теперь тут загвоздочка,выводит так,как написано здесь при поиске
 writeln ('=================================');
 while not eof(a) do
 begin
  read (a,zk);
  if zk.name=Kniga then
  begin
    write ('|',zk.name:6,'|');
    write ('|',zk.avtor:9,'|');
    write ('|',zk.izdat:6,'|');
    write ('|',zk.god:9,'|');
    write ('|',zk.datapost:6,'|');
    writeln;
    writeln ('-------------------------------');
  end;
 end;
close(a);
end;
begin
clrscr;
10:
assign (a,'fff');
writeln ('       MEHU      ');
writeln ('1:cozdanie ');
writeln ('2:vyvod ');
writeln ('3:poisk ');
writeln ('4:vyxod ');
readln (z);
 case z of
  1:sozd(a);
  2:vyvod (a);
  3:poisk (a);
  4:exit;
  end; goto 10;
readln
end.
Gortxayer вне форума Ответить с цитированием
Старый 06.01.2011, 11:55   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да.. посмотрел я на ваше творчество..

приведённый Вами код содержит пару ошибок, из-за которых он даже не компилируется.
Это раз.

второе, от использования меток и goto лучше отказываться.

третье, для задания строковых полей в типе record лучше явно указывать длину строки. turboPascal к этому относится толерантно, но в дальнейшем при таком подходе будут ошибки ( в Delphi, например).

четвёртое. Форматированный вывод для строк означает, что отвести не меньше позиций, чем указано.
например, write('|', zk.name: 6, '|'); означает, что если name меньше 6 символов - то дополнить пробелами. Однако, если в name будет, скажем, 15 символов - то выведутся все 15. Для решения этой проблемы (если захотите, конечно) можно использовать оператор Copy. Ну или задавать длину, больше которой не может быть в поле (в данном случае можно задать name:20)

пятое.
А что такое - "дата поступления" ? И почему оно типа Integer ?
Что за число вы туда хотите ввести?!

шестое. и последнее.
а где код подпрограммы добавления книг в вашу базу данных?

вот, чуток переработанный Ваш код:
Код:
program Biblioteka;
uses crt;

type spisok = record
    name: string[20];
    avtor: string[20];
    izdat: string[20];
    god: integer;
    datapost: integer;
  end;
  FT = file of spisok;
var a: ft;
  i, z: integer;
  s: real;

procedure Sozdanie(var a: ft);
var j: integer;
  zk: spisok;
begin
  rewrite(a);
  repeat
    begin
      write('vvedite nazvanie knigi ');
      readln(zk.name);
      write('Vvedite F.I.O avtora ');
      readln(zk.avtor);
      write('vvedite nazvanie izdatelstva ');
      Readln(zk.izdat);
      write('vvedite god izdatelstva ');
      readln(zk.god);
      write('vvedite datu postupleniya ');
      readln(zk.datapost);
      write(a, zk);
      writeln('Продолжить запись? ДА-1 НЕТ-0');
      readln(j);
    end;
  until j = 0;
  close(a);
end;

procedure vyvod(var a: ft);
var i: integer;
  zk: spisok;
begin
  clrscr;
  reset(a);
  writeln('=================================');
  writeln('| Kniga| avtor| izdat| god| post');
  writeln('=================================');
  while not eof(a) do
  begin
    read(a, zk);
    write('|', zk.name: 6, '|');
    write('|', zk.avtor: 9, '|');
    write('|', zk.izdat: 6, '|');
    write('|', zk.god: 9, '|');
    write('|', zk.datapost: 6, '|');
    writeln;
    writeln('-------------------------------');
  end;
  close(a);
  writeln;
  readln;
end;

procedure poisk(var a: ft);
var i: integer;
  zk: spisok;
  Kniga: string;
begin
  clrscr;
  reset(a);
  writeln('Vvedite knigu dlja poiska ');
  readln(Kniga);
  writeln('spisok s zadannym imenem ');
  writeln('=================================');
  writeln('| Kniga| avtor| izdat| god| post');
 {вот теперь тут загвоздочка,выводит так,как написано здесь при поиске}
  writeln('=================================');
  while not eof(a) do
  begin
    read(a, zk);
    if zk.name = Kniga then
    begin
      write('|', zk.name: 6, '|');
      write('|', zk.avtor: 9, '|');
      write('|', zk.izdat: 6, '|');
      write('|', zk.god: 9, '|');
      write('|', zk.datapost: 6, '|');
      writeln;
      writeln('-------------------------------');
    end;
  end;
  close(a);
  writeln;
  readln;
end;

begin
  repeat
    clrscr;
    assign(a, 'fff');
    writeln('       MEHU      ');
    writeln('1:cozdanie ');
    writeln('2:vyvod ');
    writeln('3:poisk ');
    writeln('4:vyxod ');
    readln(z);
    case z of
      1: Sozdanie(a);
      2: vyvod(a);
      3: poisk(a);
      {4: exit;}
    end;
  until z=4;
  WriteLn;
  WriteLn('Programma zakonchila raboty.');
  readln
end.

да. забыл добавить.
Процедура поиска у Вас была рабочая!
я там почти ничего не менял
(только исправил ошибку и в конце паузу сделал, чтобы было видно, что вывелось)

Последний раз редактировалось Serge_Bliznykov; 06.01.2011 в 11:58.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.01.2011, 20:09   #10
Gortxayer
 
Регистрация: 05.01.2011
Сообщений: 6
По умолчанию

А что такое - "дата поступления" ? И почему оно типа Integer ?
Что за число вы туда хотите ввести?!

ну то есть я хочу туда ввести дату поступления книги,поэтому и integer,потому что ввожу цифрами.
А ошибок море,прочитала не много в ауте была,напортачила конечно я не хило.А так задача вроде рабочая,вводит выводит нужные данные,а с поиском и в правду было все нормально,просто я проглядела нечайно,глазами не туда смотрела.

Спасибо большое за помощь,все прочитала,ошибки свои я поняла,посидя не много подумая))Надеюсь я сдам курсовую на 5)Главное правильно все обьяснить ей.Спасибо еще раз!

Последний раз редактировалось Gortxayer; 06.01.2011 в 20:16.
Gortxayer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Небольшая база в Open Office База данных. sashaman Фриланс 3 11.04.2010 20:13
База данных ROMA2PVT Помощь студентам 8 20.03.2010 16:12
База данных с возможностью приема данных из файлов Excel Al_Sha БД в Delphi 6 16.10.2009 15:34
База данных и паскаль Dimati87 Паскаль, Turbo Pascal, PascalABC.NET 1 30.04.2009 07:01