Помогите с задачей!
Создать файл записей(типизированный), включающий информацию об опубликованных статьях. Каждая запись из полей: Автор, Название статьи, Ключевые слова, Год публикации.
Из файла считать все записи, удовлетворяющие условию поиска по полю "Ключевые слова". Условие поиска вводится с клавиатуры.
Записи, полученные при выполнении поиска по "Ключевым словам", отсортировать по полю " год Публикации" и записать в текстовый файл!
Язык Pascal. Использую программу Delphi.
Объясните задачу (задача на записи).
[syntax="delphi"]
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
Const nn=100;
Type articles=record
avtor,nazvanie:string[50];
klych:array[1..10] of string[50];
god:integer;
end;
z=file of articles;
Procedure Finding(var rv:articles; var k:integer; var f:z; var n:integer; massiv:array of articles);
Var find:string;
da:boolean;
i,h:integer;
///////////////// Поиск по ключевым словам ////////////////////////////////
begin
Writeln;
('Введите слово, которое может встречаться в статьях: ');
Readln(find);
k:=0;
da:=false;
Reset(f);
for i:=1 to n do
Begin
h:=1;
Read(f,rv);
while Length(rv.klych[h])>0 do
Begin
if (find=rv.klych[h]) and (not da) then
begin
Writeln('Это слово встречается в статьях:');da:=true;
k:=k+1;
Writeln(' ',k,') ',rv.nazvanie);
massiv[k]:=rv;
end;
h:=h+1;
end;
end;
if not da then Writeln('К сожалению, слово, которое вы ввели, нигде не втречается ((((');
end;
Procedure Sortirovka(var k:integer; var massiv:array of articles);
Var h,i,j:integer;
temp:articles;
//////////////// Сортировка по году /////////////////////////////////////
begin
Writeln;
Writeln('Сортировка по году:');
for j:=1 to 5 do
for i:=1 to 10 do
if (massiv.god>massiv[i+1].god) and (massiv[i+1].god<>0) then
Begin
temp:=massiv;
massiv:=massiv[i+1];
massiv[i+1]:=temp;
end;
for i:=1 to 10 do
Begin
h:=1;
Write(' ',i,') ',massiv.avtor,' | ',massiv.nazvanie,' | ');
while massiv.klych[h]<>'' do
Begin
Write(massiv.klych[h],' ');
h:=h+1;
end;
h:=0;
Writeln('| ',massiv.god);
end;
end;
/////////////////////////////////////
Var f:z;
rv:articles;
massiv:array[1..nn] of articles;
s,stmp:string[255];
find:string[20];
minyear:integer=2012;
maxyear:integer=1000;
i,j,n,k,h,error,position,nminyear,nmaxyear:integer;
BEGIN
minyear:=10000;
maxyear:=-9000;
Assign(f,'spisok.art');
Rewrite(f);
Write('Сколько статей вы будете вводить? ');
Readln(n);
Writeln;
Writeln('Вводите данные в формате:');
Writeln(' Автор; Название статьи; Ключевые слова (до 10); Год публикации.');
Writeln(' Завершаем ввод клавишей [Enter]: ');
for i:=1 to n do
Begin
Write(' ',i,') ');
Readln(s);
Position:=pos(';',s);
if position=0 then
Begin
Writeln('Вводите правильно!');
Readln;
HALT;
End;
//Автор
Position:=pos(';',s);
stmp:=copy(s,1,position-1);
Delete(s,1,position);
stmp:=Trim(stmp);
rv.avtor:=stmp;
//Название статьи
Position:=pos(';',s);
stmp:=copy(s,1,position-1);
Delete(s,1,position);
stmp:=Trim(stmp);
rv.nazvanie:=stmp;
//Ключевые слова
Position:=pos(';',s);
stmp:=copy(s,1,position-1);
Delete(s,1,position);
stmp:=Trim(stmp);
stmp:=stmp+' ';
Position:=pos(' ',stmp);
if Position=0 then rv.klych[1]:=stmp
else While pos(' ',stmp)>0 do
Begin
k:=k+1;
rv.klych[k]:=copy(stmp,1,position-1);
Delete(stmp,1,position);
Position:=pos(' ',stmp);
End;
k:=0;
//Год
Position:=pos('.',s);
stmp:=copy(s,1,(position-1));
stmp:=Trim(stmp);
Val(stmp,rv.god,error);
if rv.god<minyear then minyear:=rv.god;
if rv.god>maxyear then maxyear:=rv.god;
if rv.god<-4000 then
Begin
Writeln('Вводите правильно! Опубликована в ',abs(rv.god),'-ом году до н.э. А не рановато??!');
Readln;
HALT;
End;
if rv.god>2010 then
Begin
Writeln('Вводите правильно! Опубликована в ',rv.god,'-ом году... Это же смешно,не так ли!?!');
Readln;
HALT;
End;
Write(f,rv);
End;
/////////////// Самая ранняя и поздняя публикации /////////////////////////
Reset(f);
Writeln;
For i:=1 to n do
Begin
Read(f,rv);
if rv.god=maxyear then Writeln('Самая ранняя публикация: "',rv.nazvanie,'" (в ',rv.god,'-ом году)');
if rv.god=minyear then Writeln('Самая поздняя публикация: "',rv.nazvanie,'" (в ',rv.god,'-ом году)');
end;
Finding(rv,k,f,n,massiv);
Sortirovka(k,massiv);
Readln;
end.
[/syntax]
вот мои наработки!
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;
Const nn=100;
Type articles=record
avtor,nazvanie:string[50];
klych:array[1..10] of string[50];
god:integer;
end;
z=file of articles;
Procedure Finding(var rv:articles; var k:integer; var f:z; var n:integer; massiv:array of articles);
Var find:string;
da:boolean;
i,h:integer;
///////////////// Поиск по ключевым словам ////////////////////////////////
begin
Writeln;
('Введите слово, которое может встречаться в статьях: ');
Readln(find);
k:=0;
da:=false;
Reset(f);
for i:=1 to n do
Begin
h:=1;
Read(f,rv);
while Length(rv.klych[h])>0 do
Begin
if (find=rv.klych[h]) and (not da) then
begin
Writeln('Это слово встречается в статьях:');da:=true;
k:=k+1;
Writeln(' ',k,') ',rv.nazvanie);
massiv[k]:=rv;
end;
h:=h+1;
end;
end;
if not da then Writeln('К сожалению, слово, которое вы ввели, нигде не втречается ((((');
end;
Procedure Sortirovka(var k:integer; var massiv:array of articles);
Var h,i,j:integer;
temp:articles;
//////////////// Сортировка по году /////////////////////////////////////
begin
Writeln;
Writeln('Сортировка по году:');
for j:=1 to 5 do
for i:=1 to 10 do
if (massiv.god>massiv[i+1].god) and (massiv[i+1].god<>0) then
Begin
temp:=massiv;
massiv:=massiv[i+1];
massiv[i+1]:=temp;
end;
for i:=1 to 10 do
Begin
h:=1;
Write(' ',i,') ',massiv.avtor,' | ',massiv.nazvanie,' | ');
while massiv.klych[h]<>'' do
Begin
Write(massiv.klych[h],' ');
h:=h+1;
end;
h:=0;
Writeln('| ',massiv.god);
end;
end;
/////////////////////////////////////
Var f:z;
rv:articles;
massiv:array[1..nn] of articles;
s,stmp:string[255];
find:string[20];
minyear:integer=2012;
maxyear:integer=1000;
i,j,n,k,h,error,position,nminyear,nmaxyear:integer;
BEGIN
minyear:=10000;
maxyear:=-9000;
Assign(f,'spisok.art');
Rewrite(f);
Write('Сколько статей вы будете вводить? ');
Readln(n);
Writeln;
Writeln('Вводите данные в формате:');
Writeln(' Автор; Название статьи; Ключевые слова (до 10); Год публикации.');
Writeln(' Завершаем ввод клавишей [Enter]: ');
for i:=1 to n do
Begin
Write(' ',i,') ');
Readln(s);
Position:=pos(';',s);
if position=0 then
Begin
Writeln('Вводите правильно!');
Readln;
HALT;
End;
//Автор
Position:=pos(';',s);
stmp:=copy(s,1,position-1);
Delete(s,1,position);
stmp:=Trim(stmp);
rv.avtor:=stmp;
//Название статьи
Position:=pos(';',s);
stmp:=copy(s,1,position-1);
Delete(s,1,position);
stmp:=Trim(stmp);
rv.nazvanie:=stmp;
//Ключевые слова
Position:=pos(';',s);
stmp:=copy(s,1,position-1);
Delete(s,1,position);
stmp:=Trim(stmp);
stmp:=stmp+' ';
Position:=pos(' ',stmp);
if Position=0 then rv.klych[1]:=stmp
else While pos(' ',stmp)>0 do
Begin
k:=k+1;
rv.klych[k]:=copy(stmp,1,position-1);
Delete(stmp,1,position);
Position:=pos(' ',stmp);
End;
k:=0;
//Год
Position:=pos('.',s);
stmp:=copy(s,1,(position-1));
stmp:=Trim(stmp);
Val(stmp,rv.god,error);
if rv.god<minyear then minyear:=rv.god;
if rv.god>maxyear then maxyear:=rv.god;
if rv.god<-4000 then
Begin
Writeln('Вводите правильно! Опубликована в ',abs(rv.god),'-ом году до н.э. А не рановато??!');
Readln;
HALT;
End;
if rv.god>2010 then
Begin
Writeln('Вводите правильно! Опубликована в ',rv.god,'-ом году... Это же смешно,не так ли!?!');
Readln;
HALT;
End;
Write(f,rv);
End;
/////////////// Самая ранняя и поздняя публикации /////////////////////////
Reset(f);
Writeln;
For i:=1 to n do
Begin
Read(f,rv);
if rv.god=maxyear then Writeln('Самая ранняя публикация: "',rv.nazvanie,'" (в ',rv.god,'-ом году)');
if rv.god=minyear then Writeln('Самая поздняя публикация: "',rv.nazvanie,'" (в ',rv.god,'-ом году)');
end;
Finding(rv,k,f,n,massiv);
Sortirovka(k,massiv);
Readln;
end.
[/syntax]
вот мои наработки!
В программе есть ошибка, так мне было сказано! но на нее не указали!