Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с записями
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
LLIRIKS
Люди, кто сможет, помогите, пожалуйста! Завтра экзамен - нужно срочно решить 2 задачи... blink.gif
обе задачи похожи - отличие лишь в том, что в 1-й задаче записи помещаются в массив, а во 2-й в файл...
в обеих задачах нужно организовать ввод информации об авторах (ФИО, гонорар за книгу) и их книгах (название книги, количество страниц, тираж).
причем ввод организовать таким образом, чтобы программа запрашивала сначала ФИО автора, потом информацию о каждой его книге и гонорар за нее.
Эту информацию вывести на печать - получится что-то типа этого:

ФИО 1-го автора - ...
название 1-й книги - ...
количество страниц - ...
тираж - ...
гонорар автора за книгу - ...
название 2-й книги - ...
количество страниц - ...
тираж - ...
гонорар автора за книгу - ...
ФИО 2-го автора - ...
название 1-й книги - ...
количество страниц - ...
тираж - ...
гонорар автора за книгу - ...
название 2-й книги - ...
количество страниц - ...
тираж - ...
гонорар автора за книгу - ...

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

если можете, помогите :p2: - очень нужно...
сам я уже, наверно, не успею... unsure.gif

вот что я пока что осилил по 1-й задаче:
Код

uses  crt;
type  BOOK=record
      ID_B:integer;
      NAZ:string;
      KOL:integer;
      TIR:integer;
      ZAP_B:integer;
     end;
     AVTOR=record
      ID_A:integer;
      FIO:string;
      GON:integer;
      ZAP_A:integer;
     end;
     ZAD=record
      ID_Z:integer;
      FIO:string;
      NAZ:string;
      KOL:integer;
      TIR:integer;
      GON:integer;
     end;
var   B:BOOK;
     A:AVTOR;
     MAS_B:array[1..64] of BOOK;
     MAS_A:array[1..64] of AVTOR;
     key1,key1_1,key2,key2_2:boolean;
     ch,anykey:char;
     I,K,J,L:integer;
     F,F1:string;
begin
clrscr;
I:=1;
 with A,B do
  begin
   repeat
    key2:=false;key2_2:=false;
    clrscr;
    A.ID_A:=I;
    writeln('Vvedite FIO avtora:');
    readln(A.FIO);
    A.ZAP_A:=I;
    repeat
     key1:=false;key1_1:=false;
     B.ID_B:=I;
     writeln('Vvedite nazvanie knigi:');
     readln(B.NAZ);
     writeln('Vvedite kolichestvo straniz:');
     readln(B.KOL);
     writeln('Vvedite tiraj knigi:');
     readln(B.TIR);
     writeln('Vvedite gonorar avtora za etu knigu:');
     readln(A.GON);
     B.ZAP_B:=I;
     repeat
      writeln('Budete vvodit eshe knigu?[Y,N]');
      readln(ch);
      If (ch in ['Y','y','N','n']) then key1_1:=true;
     until key1_1;
     If (ch in ['N','n']) then key1:=true;
     clrscr;
     MAS_A[I]:=A;
     MAS_B[I]:=B;
     Inc(I);
    until key1;
    repeat
     writeln('Budete vvodit eshe avtora?[Y,N]');
     readln(ch);
     If (ch in ['Y','y','N','n']) then key2_2:=true;
    until key2_2;
    If (ch in ['N','n']) then key2:=true;
    clrscr;
   until key2;
  end;
writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
anykey:=readkey;
clrscr;
J:=1;L:=1;F:='';
for K:=1 to I do
 with A,B do
  begin
   A:=MAS_A[I];
   B:=MAS_B[I];
   F1:=F;
   F:=A.FIO;
   if (K>1) and (F<>F1) then
    begin
     Inc(J);
     L:=1;
    end;
   if ((L=1) or ((L>1) and (F<>F1))) then
    begin
     writeln('-------------------------------------------------------');
     writeln('----------------- Zapis ',J,'-go avtora -------------------');
     writeln('-------------------------------------------------------');
     writeln('Number ',J);
     writeln('FIO    ',A.FIO);
     writeln;
    end;
   if ((L=1) or ((L>1) and (F=F1))) then
    begin
     writeln('------------------ Zapis ',L,'-i knigi --------------------');
     writeln('Number              ',L);
     writeln('Nazvanie            ',B.NAZ);
     writeln('Kolichestvo straniz ',B.KOL);
     writeln('Tiraj               ',B.TIR);
     writeln('Gonorar avtora      ',A.GON);
     writeln;
     Inc(L);
    end;
  end;
writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
anykey:=readkey;
end.

но где-то, как всегда, ошибки - никак не могу найти где именно... unsure.gif
LLIRIKS
в общем, организовал я ввод информации...
но дальше - опять запарка...
на данный момент алгоритм таков:
Код

uses  crt;
type  BOOK=record
      ID_B:integer;
      NAZ:string;
      KOL:integer;
      TIR:integer;
      ZAP_B:integer;
     end;
     AVTOR=record
      ID_A:integer;
      FIO:string;
      GON:integer;
      ZAP_A:integer;
     end;
var   B:BOOK;
     A:AVTOR;
     MAS_B:array[1..64] of BOOK;
     MAS_A:array[1..64] of AVTOR;
     key1,key1_1,key2,key2_2:boolean;
     ch,anykey:char;
     I,K,M:integer;
begin
clrscr;
I:=1;M:=1;
 with A,B do
  begin
   repeat
    key2:=false;key2_2:=false;
    clrscr;
    A.ID_A:=M;
    writeln('Vvedite FIO avtora:');
    readln(A.FIO);
    repeat
     key1:=false;key1_1:=false;
     B.ID_B:=I;
     writeln('Vvedite nazvanie knigi:');
     readln(B.NAZ);
     writeln('Vvedite kolichestvo straniz:');
     readln(B.KOL);
     writeln('Vvedite tiraj knigi:');
     readln(B.TIR);
     writeln('Vvedite gonorar avtora za etu knigu:');
     readln(A.GON);
     B.ZAP_B:=M;
     A.ZAP_A:=I;
     MAS_A[I]:=A;
     MAS_B[I]:=B;
     repeat
      writeln('Budete vvodit eshe knigu?[Y,N]');
      readln(ch);
      If (ch in ['Y','y','N','n']) then key1_1:=true;
     until key1_1;
     If (ch in ['N','n']) then key1:=true;
     clrscr;
     Inc(I);
    until key1;
    repeat
     writeln('Budete vvodit eshe avtora?[Y,N]');
     readln(ch);
     If (ch in ['Y','y','N','n']) then key2_2:=true;
    until key2_2;
    If (ch in ['N','n']) then key2:=true;
    clrscr;
    Inc(M);
   until key2;
  end;
writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
anykey:=readkey;
end.
Altair
Цитата
отсортировать по общему гонорару автора

В faq'e есть инфа как сортировать данные...

в чем проблемма конкретно?
Jahnerus
Первая часть программы!
... работает с массивами ... выдаёт сведения по убыванию гонораров авторов ... тоесть начиная с самого главного буржуя и т. д.
Код
uses
 crt;

const
 max_avt=10;
 max_book=20;

type
 book=record
   naz:string[40];
   kol:integer;
   tir:integer;
   book_gon:longint;
 end;
 avtor=record
   fio:string[40];
   gon:longint;
   kol_book:byte;
   mas_book:array [1..max_book] of book;
 end;
var
 tmp:avtor;
 mas_avt:array[1..max_avt] of avtor;
 kol_avt:integer;
 i,j:integer;
 ch:char;

begin
 clrscr;
 kol_avt:=0;
 repeat
   inc(kol_avt);
   with mas_avt[kol_avt] do begin
     kol_book:=0;
     write('Vvedite FIO avtora: ');
     readln(FIO);
     repeat
       inc(kol_book);
       with mas_book[kol_book] do begin
         writeln('-------- Kniga No ',kol_book,' --------');
         write('Vvedite nazvanie knigi: ');
         readln(naz);
         write('Vvedite kolichestvo straniz: ');
         readln(kol);
         write('Vvedite tiraj knigi: ');
         readln(tir);
         write('Vvedite gonorar avtora za etu knigu: ');
         readln(book_gon);
       end;
       gon:=gon + mas_book[kol_book].book_gon;
       writeln('Budete vvodit eshe knigu? [Y,N]');
       repeat
       until keypressed;
       ch:=readkey;
     until not((ch='y') or (ch='Y'));
   end;
   writeln('Budete vvodit eshe avtora? [Y,N]');
   repeat
   until keypressed;
   ch:=readkey;
 until not((ch='y') or (ch='Y'));
 for i:=1 to kol_avt do begin
   for j:=1 to kol_avt-1 do begin
     if mas_avt[j].gon < mas_avt[j+1].gon then begin
       tmp:=mas_avt[j];
       mas_avt[j]:=mas_avt[j+1];
       mas_avt[j+1]:=tmp;
     end;
   end;
 end;
 writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
 readkey;
 clrscr;
 for i:=1 to kol_avt do begin
   with mas_avt[i] do begin
     writeln('-------------------------------------------------------');
     writeln('----------------- Zapis ',i,'-go avtora -------------------');
     writeln('-------------------------------------------------------');
     writeln('FIO:                   ',fio);
     writeln('Gonorar za vse knigi:  ',gon);
     for j:=1 to kol_book do begin
       with mas_book[j] do begin
         writeln('------------------ Zapis ',j,'-i knigi --------------------');
         writeln('Nazvanie            ',naz);
         writeln('Kolichestvo straniz ',kol);
         writeln('Tiraj               ',tir);
         writeln('Gonorar za knigu    ',book_gon);
       end;
     end;
   end;
 end;
 writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
 readkey;
end.
LLIRIKS
все рано не все понятно... unsure.gif
вот немного дальше продвинулся - организовал ввод и вывод информации в обеих задачах:

1-я задача
Код

uses  crt;
type  BOOK=record
      ID_B:integer;
      NAZ:string;
      KOL:integer;
      TIR:integer;
      ZAP_B:integer;
     end;
     AVTOR=record
      ID_A:integer;
      FIO:string;
      GON:integer;
      ZAP_A:integer;
     end;
var   B:BOOK;
     A:AVTOR;
     MAS_B:array[1..64] of BOOK;
     MAS_A:array[1..64] of AVTOR;
     key1,key1_1,key2,key2_2:boolean;
     ch,anykey:char;
     I,K,J,L,M:integer;
     F,F1:string;
begin
{-------------------------------VVOD_INFORMAZII----------------------------}
 clrscr;
 I:=1;M:=1;
 with A,B do
   begin
     repeat
       key2:=false;key2_2:=false;
       clrscr;
       A.ID_A:=M;
       writeln('Vvedite FIO avtora:');
       readln(A.FIO);
       repeat
         key1:=false;key1_1:=false;
         B.ID_B:=I;
         writeln('Vvedite nazvanie knigi:');
         readln(B.NAZ);
         writeln('Vvedite kolichestvo straniz:');
         readln(B.KOL);
         writeln('Vvedite tiraj knigi:');
         readln(B.TIR);
         writeln('Vvedite gonorar avtora za etu knigu:');
         readln(A.GON);
         B.ZAP_B:=M;
         A.ZAP_A:=I;
         MAS_A[I]:=A;
         MAS_B[I]:=B;
         repeat
           writeln('Budete vvodit eshe knigu?[Y,N]');
           readln(ch);
           If (ch in ['Y','y','N','n']) then key1_1:=true;
         until key1_1;
         If (ch in ['N','n']) then key1:=true;
         clrscr;
         Inc(I);
       until key1;
       repeat
         writeln('Budete vvodit eshe avtora?[Y,N]');
         readln(ch);
         If (ch in ['Y','y','N','n']) then key2_2:=true;
       until key2_2;
       If (ch in ['N','n']) then key2:=true;
       clrscr;
       Inc(M);
     until key2;
   end;
{-----------------------------VIVOD_INFORMAZII-----------------------------}
 A:=MAS_A[1];
 with A do
   F:=A.FIO;
 M:=1;
 for K:=1 to I-1 do
   begin
     A:=MAS_A[K];
     F1:=A.FIO;
     if ((K=1) or ((K>1) and (F<>F1))) then
       begin
         clrscr;
         writeln('Zapis ',M,'-go avtora');
         writeln('FIO ',A.FIO);
         Inc(M);
       end;
     B:=MAS_B[K];
     with A,B do
       begin
         writeln;
         writeln('Nazvanie knigi ',B.NAZ);
         writeln('Kolichestvo straniz ',B.KOL);
         writeln('Tiraj ',B.TIR);
         writeln('Gonorar za knigu ',A.GON);
       end;
     F:=F1;
   end;
 writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
 anykey:=readkey;
end.


2-я задача
Код

uses  crt;
type  BOOK=record
      ID_B:integer;
      NAZ:string;
      KOL:integer;
      TIR:integer;
      ZAP_B:integer;
     end;
     AVTOR=record
      ID_A:integer;
      FIO:string;
      GON:integer;
      ZAP_A:integer;
     end;
var   FILE_A : file of AVTOR;
     FILE_B: file of BOOK;
     A:AVTOR;
     B:BOOK;
     key1,key1_1,key2,key2_2:boolean;
     ch,anykey:char;
     I,M,K:integer;
     F,F1:string;
begin
 assign(FILE_A ,'FILE_A.dat');
 rewrite(FILE_A);
 assign(FILE_B ,'FILE_B.dat');
 rewrite(FILE_B);
 clrscr;
 I:=1;M:=1;
 with A,B do
   begin
     repeat
       key2:=false;key2_2:=false;
       clrscr;
       A.ID_A:=M;
       writeln('Vvedite FIO avtora:');
       readln(A.FIO);
       repeat
         key1:=false;key1_1:=false;
         B.ID_B:=I;
         writeln('Vvedite nazvanie knigi:');
         readln(B.NAZ);
         writeln('Vvedite kolichestvo straniz:');
         readln(B.KOL);
         writeln('Vvedite tiraj knigi:');
         readln(B.TIR);
         writeln('Vvedite gonorar avtora za etu knigu:');
         readln(A.GON);
         B.ZAP_B:=M;
         A.ZAP_A:=I;
         write(FILE_A,A);
         write(FILE_B,B);
         repeat
           writeln('Budete vvodit eshe knigu?[Y,N]');
           readln(ch);
           If (ch in ['Y','y','N','n']) then key1_1:=true;
         until key1_1;
         If (ch in ['N','n']) then key1:=true;
         clrscr;
         Inc(I);
       until key1;
       repeat
         writeln('Budete vvodit eshe avtora?[Y,N]');
         readln(ch);
         If (ch in ['Y','y','N','n']) then key2_2:=true;
       until key2_2;
       If (ch in ['N','n']) then key2:=true;
       clrscr;
       Inc(M);
     until key2;
   end;
 close(FILE_A);
 close(FILE_B);
 clrscr;
 reset(FILE_A);
 reset(FILE_B);
 M:=1;K:=1;
 read(FILE_A,A);
 with A do
   F:=A.FIO;
 seek(FILE_A,0);
 while (not(eof(FILE_A)) and not(eof(FILE_B))) do
   begin
     read(FILE_A,A);
     with A do
       begin
         F1:=A.FIO;
         if ((K=1) or ((K>1) and (F<>F1))) then
           begin
             clrscr;
             writeln('Zapis ',M,'-go avtora');
             writeln('FIO ',A.FIO);
             Inc(M);
           end;
       end;
     read(FILE_B,B);
     with A,B do
       begin
         writeln;
         writeln('Nazvanie knigi ',B.NAZ);
         writeln('Kolichestvo straniz ',B.KOL);
         writeln('Tiraj ',B.TIR);
         writeln('Gonorar za knigu ',A.GON);
       end;
     F:=F1;
     Inc(K);
     writeln('Dlya prodolgeniya nagmite lyubuyu klavishu...');
     anykey:=readkey;
   end;
end.


в обеих задачах осталось отсортировать запись AVTOR по общему гонорару автора и вывести полученный результат на печать (аналогично первоначальному выводу на печать - по такому же принципу).

если кто может, помогите, плиз, дописать мои исходники... unsure.gif желательно с комментариями и пояснениями... unsure.gif
буду очень признателен rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.