Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Работа с внешними файлами

Автор: DCRM 28.11.2006 6:42

какие тут админы добрые... nea.gif ладно, вот по теме теже самое...
Задача!
Тема:
Работа с внешними файлами

Условие:
Создать файл, содержащий сведения о студентах вашей группы (ФИО, дата рождения):
а) Выбрать самого младшего студента.
б) Выбрать самого старшего.
в) упорядочить по возрасту.


Вот мой ответ:
НЕ МОГУ ДОЕХАТЬ КАК ПУНКТ 3 СДЕЛАТЬ



program Z1;
type
info=record
fam,im,ot:string[15];
dr,mr,gr:integer;
end;
Spisok=file of info;
var
inf:info;
spi:spisok;
i,msd,msm,msg,ssd,ssm,ssg,k:integer;
begin
writeln('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® бв㤥⮢:');
readln(k);
assign(spi,'g:\stud.dat');
rewrite(spi);
for i:=1 to k do
begin
with inf do
begin
writeln('Ќ®¬Ґа бв㤥в : ',i,' ”®а¬ в § ЇЁбЁ: ” ¬Ё«Ёп, ?¬п, ЋвзҐбвў®, „Ґм! ЊҐбпж! ѓ®¤! ஦¤ҐЁп');
readln(fam);
readln(im);
readln(ot);
readln(dr);
readln(mr);
readln(gr);
end;
write(spi,inf);
end;
close(spi);
reset(spi);
{‘ ¬л© ¬« ¤иЁ©}
ssd:=0;
ssm:=0;
ssg:=0;
for i:=1 to k do
begin
read(spi,inf);
if (inf.gr>ssg) then
begin
ssg:=inf.gr;
ssm:=inf.mr;
ssd:=inf.dr;
end;
if (inf.gr=ssg) then
begin
if (inf.mr>ssm) then
begin
ssg:=inf.gr;
ssm:=inf.mr;
ssd:=inf.dr;
end;
if (inf.mr=ssm) then
begin
if (inf.dr>ssd) then
begin
ssg:=inf.gr;
ssm:=inf.mr;
ssd:=inf.dr;
end;
end;
end;
end;
close(spi);
reset(spi);

{‘ ¬л© бв аиЁ©}
msd:=ssd;
msm:=ssm;
msg:=ssg;
for i:=1 to k do
begin
read(spi,inf);
if (inf.gr<msg) then
begin
msg:=inf.gr;
msm:=inf.mr;
msd:=inf.dr;
end;
if (inf.gr=msg) then
begin
if (inf.mr<msm) then
begin
msg:=inf.gr;
msm:=inf.mr;
msd:=inf.dr;
end;
if (inf.mr=msm) then
begin
if (inf.dr<msd) then
begin
msg:=inf.gr;
msm:=inf.mr;
msd:=inf.dr;
writeln('=! ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
end;
end;
end;
end;
close(spi);
reset(spi);
{Џ®бв஥ЁҐ бЇЁбЄ }
for i:=1 to k do
begin
read(spi,inf);
if (inf.gr<ssg) then
begin
writeln('= ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
end;
if (inf.gr=ssg) then
begin
if (inf.mr<ssm) then
begin
writeln('= ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
end;
if (inf.mr=ssm) then
begin
if (inf.dr<ssd) then
begin
writeln('= ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
end;
end;
end;
end;
close(spi);
reset(spi);
{+1}
for i:=1 to k do
begin
read(spi,inf);
if (ssd=inf.dr) and (ssm=inf.mr) and (ssg=inf.gr) then writeln('= ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
end;
close(spi);
reset(spi);
{‘ЇЁб®Є Ё +1 ўлў®¤Ёв в®«мЄ® ўҐбм ўўҐ¤сл© бЇЁб®Є... ЉЂЉ ”ЏЋђџ„Ћ—?’њ ЏЋ ‚Ћ‡ђЂ‘’”???}
{‚лў®¤ १г«мв в }
for i:=1 to k do
begin
read(spi,inf);
if (ssd=inf.dr) and (ssm=inf.mr) and (ssg=inf.gr) then writeln('Њ« ¤иЁ© бв㤥в= ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
if (msd=inf.dr) and (msm=inf.mr) and (msg=inf.gr) then writeln('‘в аиЁ© бв㤥в= ',inf.fam,inf.im,inf.ot,inf.dr,inf.mr,inf.gr);
end;
close(spi);
readln;
end.


Задача 1.1!
Тема:
Использование переменных динамического типа

Условие:

1. Создать однонаправленный список, состоящий из элементов, в качестве дынных которых используются записи из задачи 1
2. Вывести на экран данные динамического списка на экран
3. Дополнить список в начале и в конце...
4. Удалить элемент:
а) первый в списке
б) последний в списке
в) с заданным номером
г) с заданным ключём
5. Поменять местами элементы:
а) с заданными номерами;
б) с заданными ключами.

Вот мой ответ:
ХЗ

Автор: volvo 28.11.2006 13:30

Цитата
НЕ МОГУ ДОЕХАТЬ КАК ПУНКТ 3 СДЕЛАТЬ
Ты хочешь упорядочивать прямо в файле? Можно, конечно, по тому же принципу, как делается любая из сортировок массива, только вместо обращения к элементу массива обращаешься к записи файла... Для примера: если брать "Пузырек": http://forum.pascal.net.ru/index.php?s=&showtopic=3065&view=findpost&p=27328 , то нечто подобное в файле будет выглядеть так:

For i := 1 To FileSize(f) Do
For j := FileSize(f) DownTo i+1 Do Begin
Seek(f, j - 1); Read(f, Xj);
Seek(f, j - 2); Read(f, Xpred_j);
If Xpred_j > Xj Then Begin
Seek(f, j - 2); Write(Xj); { <--- на позицию pred_j пишем то, что было в j }
Seek(f, j - 1); Write(Xpred_j); { <--- и наоборот... Результат - поменяли местами записи }
End
End;


Цитата
Использование переменных динамического типа

http://forum.pascal.net.ru/index.php?s=&showtopic=2706&view=findpost&p=23570 (Списки)
или
http://forum.pascal.net.ru/index.php?s=&showtopic=6730&view=findpost&p=26901
(но использование списков будет проще, потому что для преобразования программы по второй ссылке в то, что требуется тебе, нужно еще довольно много добавить, по крайней мере - не одну строчку кода)

Автор: DCRM 29.11.2006 19:27

Хм.. после 2.5х бессонных ночей вот что навоял!
9я! Работает!!!
Вот код:


Program Lab_9_v1;
uses
Crt;
const
fSpi='c:\Stud.dat';
fSort='c:\StudSort.dat';
kMax=100;
lVozrDate=True; {‘®авЁа®ўЄ  True-Ї® ў®§а бв ­Ёо ¤ вл,False-Ї® гЎлў ­Ёо}
type
ukinfo=^info;
info=record
fam,im,ot:string[15];
ddmmgggg:string[10];
uk:ukinfo;
end;
Spisok=file of info;
var
inf:info;
spi,sort:spisok;
i,k,iMlad,iStar,j:integer;
ggggmmddMin,ggggmmddMax,ggggmmddSt:longint;
obrabotano:array[1..kMax] of byte;

{Ќ  ўе®¤Ґ бЁ¬ў®«м­ п ¤¤.¬¬.ЈЈЈЈ, ­  ўл室Ґ зЁб«®ў п ЈЈЈЈ¬¬¬¤¤}
function Date(dd_mm_gggg:string):longint;
var
code:integer;
den,mes,god:longint;
begin
Val(Copy(dd_mm_gggg,1,2),den,code);
Val(Copy(dd_mm_gggg,4,2),mes,code);
Val(Copy(dd_mm_gggg,7,4),god,code);
Date:=god*10000+mes*100+den;
end;

BEGIN
ClrScr;

write('‚ўҐ¤ЁвҐ Є®«ЁзҐбвў® бв㤥­в®ў (Є®«-ў® § ЇЁбҐ©):'); readln(k);
Assign(spi,fSpi);
Rewrite(spi);
for i:=1 to k do
begin
with inf do
begin
writeln('‘в㤥­в (§ ЇЁбм) ­®¬Ґа: ',i);
write(' ” ¬Ё«Ёп:'); readln(fam);
write(' €¬п:'); readln(im);
write(' ЋвзҐбвў®:'); readln(ot);
write(' „ в  ஦¤Ґ­Ёп ў д®а¬ вҐ ¤¤.¬¬.ЈЈЈЈ (¤¤-¤Ґ­м, ¬¬-¬Ґбпж, ЈЈЈЈ-Ј®¤):'); readln(ddmmgggg);
uk:=NIL;
end;
obrabotano[i]:=0;
Write(spi,inf);
end;
Close(spi);

{‘ ¬л© ¬« ¤иЁ©}
iMlad:=1;
ggggmmddMax:=-1;

{‘ ¬л© бв аиЁ©}
iStar:=1;
ggggmmddMin:=30001231; {31.12.3000}

Reset(spi);
for i:=1 to k do
begin
Read(spi,inf);
ggggmmddSt:=Date(inf.ddmmgggg);
if ggggmmddSt>ggggmmddMax then
begin
ggggmmddMax:=ggggmmddSt;
iMlad:=i;
end;
if ggggmmddSt<ggggmmddMin then
begin
ggggmmddMin:=ggggmmddSt;
iStar:=i;
end;
end;
Close(spi);

{‚лў®¤ ¬« ¤иҐЈ® Ё бв а襣®}
writeln;
writeln('‚ д ©«Ґ ',fSpi,':');
Reset(spi);
for i:=1 to k do
begin
Read(spi,inf);
if i=iMlad then
writeln('Њ« ¤иЁ© N ',i,': ',inf.fam,' ',inf.im,' ',inf.ot,' ',inf.ddmmgggg);
if i=iStar then
writeln('‘в аиЁ© N ',i,': ',inf.fam,' ',inf.im,' ',inf.ot,' ',inf.ddmmgggg);
end;
Close(spi);

{lVozrDate=True - ‘®авЁа㥬 Ї® ў®§а бв ­Ёо ¤ вл ஦¤Ґ­Ёп, в.Ґ. Ї® гЎлў ­Ёо ў®§а бв }
{lVozrDate=False - ‘®авЁа㥬 Ї® гЎлў ­Ёо ¤ вл ஦¤Ґ­Ёп, в.Ґ. Ї® ў®§а бв ­Ёо ў®§а бв }
{€бЇ®«м§гҐ¬ ¬ ббЁў obrabotano: н«-в=1-§ ЇЁбм 㦥 ®Ўа Ў®в ­ , ў Їа®вЁў­®¬ б«гз Ґ =0}
Assign(sort,fSort);
Rewrite(sort);
for i:=1 to k do
begin
if lVozrDate=True then
ggggmmddMin:=30001231 {31.12.3000 ¤ в  ஦¤Ґ­Ёп б ¬®Ј® бв а襣®}
else
ggggmmddMax:=-1;
Reset(spi);
for j:=1 to k do
begin
Read(spi,inf);
ggggmmddSt:=Date(inf.ddmmgggg);
if (obrabotano[j]=0) and
( ((lVozrDate=True) and (ggggmmddSt<=ggggmmddMin)) or
((lVozrDate=False) and (ggggmmddSt>=ggggmmddMax)) ) then
begin
ggggmmddMin:=ggggmmddSt;
ggggmmddMax:=ggggmmddSt;
iStar:=j;
end;
end;
Close(spi);
Reset(spi);
for j:=1 to k do
begin
Read(spi,inf);
if j=iStar then
begin
obrabotano[j]:=1;
Write(sort,inf);
end;
end;
Close(spi);
end;
Close(sort);

writeln;
if lVozrDate=True then
writeln('‘®авЁа®ўЄ  Ї® гЎлў ­Ёо ў®§а бв  (д ©« ',fSort,'):')
else
writeln('‘®авЁа®ўЄ  Ї® ў®§а бв ­Ёо ў®§а бв  (д ©« ',fSort,'):');
Reset(sort);
for i:=1 to k do
begin
Read(sort,inf);
writeln(inf.fam,' ',inf.im,' ',inf.ot,' ',inf.ddmmgggg);
end;
Close(sort);

readln;
END.


Список создаёт и всё окей! Переходим к 10... но тут всё сложнее... Почему то нафиг вылетает(в прямом смысле этого слова! Винда ошибку какую то говорит... типа недопустимая операция по адресу... закрыть/пропустить, делал на 6ой версии паскаля... у нас в интсте 7я...) с ошибкой при перестановке по указателю и номеру...
а так УСЁ работает!!! :wacko:

Program Lab_10_v1;
uses
Crt;
const
fSpi='c:\Stud.dat';
type
ukinfo=^info;
info=record
fam,im,ot:string[15];
ddmmgggg:string[10];
uk:ukinfo;
end;
Spisok=file of info;
var
inf:info;
spi:spisok;
un,p,q,qq1,qq3,e:ukinfo;
i,k,j:integer;
famj,famk:string[15];
worked:boolean;


{ўлў®¤ ¤Ё­.ЇҐаҐ¬Ґ­­ле}
procedure Vyvod (msg:string);
begin
ClrScr;
writeln(msg);
p:=un;
while p<>NIL do
begin
writeln(p^.fam,' ',p^.im,' ',p^.ot,' ',p^.ddmmgggg);
p:=p^.uk;
end;
readln;
end;


{г¤ «Ґ­ЁҐ ЇҐаў®Ј® н«-в }
procedure DelFirst;
begin
p:=un;
un:=un^.uk;
Dispose(p);
end;


{Ї®ЁбЄ Ї®б«Ґ¤­ҐЈ® н«-в  ў бЇЁбЄҐ Ё ҐЈ® г¤ «Ґ­ЁҐ}
procedure DelLast;
begin
p:=un;
while p^.uk<>NIL do
begin
q:=p;
p:=p^.uk;
end;
q^.uk:=NIL;
Dispose(p);
end;


{г¤ «Ґ­ЁҐ н«-в  ў бЇЁбЄҐ Ї® ҐЈ® ­®¬Ґаг}
procedure DelOther(nomer:integer);
var
pred:integer;
begin
p:=un;
pred:=1;
while (pred<=nomer-2) and (p<>NIL) do
begin
Inc(pred);
p:=p^.uk;
end;
q:=p^.uk;
p^.uk:=q^.uk;
Dispose(q);
end;


BEGIN
ClrScr;

New(un);
p:=un;

Assign(spi,fSpi);
Reset(spi);
k:=0;
writeln('‘®¤Ґа¦Ё¬®Ґ д ©«  '+fSpi+':');
while not Eof(spi) do
begin
Inc(k);
Read(spi,inf);
writeln(inf.fam,' ',inf.im,' ',inf.ot,' ',inf.ddmmgggg);
if k=1 then
begin
p^.fam:=inf.fam;
p^.im:=inf.im;
p^.ot:=inf.ot;
p^.ddmmgggg:=inf.ddmmgggg;
p^.uk:=NIL;
end
else
begin
New(q);
q^.fam:=inf.fam;
q^.im:=inf.im;
q^.ot:=inf.ot;
q^.ddmmgggg:=inf.ddmmgggg;
q^.uk:=NIL;
p^.uk:=q;
p:=q;
end;
end;
Close(spi);
readln;
Vyvod('„ ­­лҐ ¤Ё­ ¬ЁзҐбЄ®Ј® бЇЁбЄ :');

{¤®Ї®«­Ґ­ЁҐ бЇЁбЄ  ў ­ з «Ґ}
New(q);
q^.fam:='000';
q^.im:='00';
q^.ot:='0';
q^.ddmmgggg:='01.01.2000';
q^.uk:=un;
un:=q;
Vyvod('„ ­­лҐ ¤Ё­ ¬ЁзҐбЄ®Ј® бЇЁбЄ  (Ї®б«Ґ ¤®Ў ў«Ґ­Ёп ў ­ з «® бЇЁбЄ ):');

{Ї®ЁбЄ Ї®б«Ґ¤­ҐЈ® н«-в  ў бЇЁбЄҐ}
p:=un;
while p^.uk<>NIL do
p:=p^.uk;
{¤®Ї®«­Ґ­ЁҐ бЇЁбЄ  ў Є®­жҐ}
New(q);
q^.fam:='666';
q^.im:='66';
q^.ot:='6';
q^.ddmmgggg:='01.01.1940';
q^.uk:=p^.uk;
p^.uk:=q;
Vyvod('„ ­­лҐ ¤Ё­ ¬ЁзҐбЄ®Ј® бЇЁбЄ  (Ї®б«Ґ ¤®Ў ў«Ґ­Ёп ў Є®­Ґж бЇЁбЄ ):');

{г¤ «Ґ­ЁҐ ЇҐаў®Ј® н«-в }
DelFirst;
Vyvod('„ ­­лҐ ¤Ё­ ¬ЁзҐбЄ®Ј® бЇЁбЄ  (Ї®б«Ґ г¤ «Ґ­Ёп ЇҐаў®Ј® н«-в  бЇЁбЄ ):');

{Ї®ЁбЄ Ї®б«Ґ¤­ҐЈ® н«-в  ў бЇЁбЄҐ Ё ҐЈ® г¤ «Ґ­ЁҐ}
DelLast;
Vyvod('„ ­­лҐ ¤Ё­ ¬ЁзҐбЄ®Ј® бЇЁбЄ  (Ї®б«Ґ г¤ «Ґ­Ёп Ї®б«Ґ¤­ҐЈ® н«-в  бЇЁбЄ ):');

ClrScr;
writeln('„«п ®Ў¬Ґ­  н«Ґ¬Ґ­в®ў ўўҐ¤ЁвҐ Ёе ­®¬Ґа :');
write('ЏҐаўл© н«Ґ¬Ґ­в:'); readln(j);
write('‚в®а®© н«Ґ¬Ґ­в:'); readln(k);
i:=1;
p:=un;
while (i<=j) and (p<>NIL) do
begin
qq1:=p;
p:=p^.uk;
Inc(i);
end;
i:=1;
p:=un;
while (i<=k) and (p<>NIL) do
begin
qq3:=p;
p:=p^.uk;
Inc(i);
end;
{®Ў¬Ґ­}
e^.fam:=qq1^.fam;
e^.im:=qq1^.im;
e^.ot:=qq1^.ot;
e^.ddmmgggg:=qq1^.ddmmgggg;
qq1^.fam:=qq3^.fam;
qq1^.im:=qq3^.im;
qq1^.ot:=qq3^.ot;
qq1^.ddmmgggg:=qq3^.ddmmgggg;
qq3^.fam:=e^.fam;
qq3^.im:=e^.im;
qq3^.ot:=e^.ot;
qq3^.ddmmgggg:=e^.ddmmgggg;
Vyvod('‘ЇЁб®Є (Ї®б«Ґ ®Ў¬Ґ­  н«-в®ў Ї® Ёе ­®¬Ґа ¬):');

ClrScr;
writeln('„«п ®Ў¬Ґ­  н«Ґ¬Ґ­в®ў ўўҐ¤ЁвҐ Є«озЁ (д ¬Ё«Ёо):');
write('ЏҐаў п д ¬Ё«Ёп:'); readln(famj);
write('‚в®а п д ¬Ё«Ёп:'); readln(famk);
worked:=true;
p:=un;
while (worked) and (p<>NIL) do
begin
qq1:=p;
if Pos(famj,p^.fam)>0 then
worked:=false;
p:=p^.uk;
end;
worked:=true;
p:=un;
while (worked) and (p<>NIL) do
begin
qq3:=p;
if Pos(famk,p^.fam)>0 then
worked:=false;
p:=p^.uk;
end;
{®Ў¬Ґ­}
e^.fam:=qq1^.fam;
e^.im:=qq1^.im;
e^.ot:=qq1^.ot;
e^.ddmmgggg:=qq1^.ddmmgggg;
qq1^.fam:=qq3^.fam;
qq1^.im:=qq3^.im;
qq1^.ot:=qq3^.ot;
qq1^.ddmmgggg:=qq3^.ddmmgggg;
qq3^.fam:=e^.fam;
qq3^.im:=e^.im;
qq3^.ot:=e^.ot;
qq3^.ddmmgggg:=e^.ddmmgggg;
Vyvod('‘ЇЁб®Є (Ї®б«Ґ ®Ў¬Ґ­  н«-в®ў Ї® Ёе Є«оз ¬):');

ClrScr;
write('„«п г¤ «Ґ­Ёп н«Ґ¬Ґ­в  ўўҐ¤ЁвҐ ҐЈ® ­®¬Ґа:'); readln(j);
k:=0;
p:=un;
while p<>NIL do
begin
p:=p^.uk;
Inc(k);
end;
if j=1 then
DelFirst
else
if j=k then
DelLast
else
DelOther(j);
Vyvod('‘ЇЁб®Є Ї®б«Ґ г¤ «Ґ­Ёп н«-в  Ї® ҐЈ® ­®¬Ґаг:');

ClrScr;
write('„«п г¤ «Ґ­Ёп н«Ґ¬Ґ­в  ўўҐ¤ЁвҐ ҐЈ® Є«оз (д ¬Ё«Ёо):'); readln(famj);
worked:=true;
{Ї® д ¬Ё«ЁЁ ®ЇаҐ¤Ґ«пҐ¬ ­®¬Ґа н«-в }
j:=0;
p:=un;
while (worked) and (p<>NIL) do
begin
Inc(j);
if Pos(famj,p^.fam)>0 then
worked:=false;
p:=p^.uk;
end;
if j=1 then
DelFirst
else
if j=k then
DelLast
else
DelOther(j);
Vyvod('‘ЇЁб®Є Ї®б«Ґ г¤ «Ґ­Ёп н«-в  Ї® ҐЈ® Є«озг:');

{г­Ёз⮦Ґ­ЁҐ ¤Ё­.ЇҐаҐ¬Ґ­­ле}
p:=un;
while p<>NIL do
begin
p:=p^.uk;
Dispose(un);
un:=p;
end;
END.

:wacko: :wacko: :wacko:

Цитата(volvo @ 28.11.2006 9:30) *

нужно еще довольно много добавить, по крайней мере - не одну строчку кода)

да уж... всего 3 сотни строчек...)))