Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с внешними файлами
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DCRM
какие тут админы добрые... 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('‚ўҐ¤ЁвҐ Є(r)«ЁзҐбвў(r) бв㤥в(r)ў:');
readln(k);
assign(spi,'g:\stud.dat');
rewrite(spi);
for i:=1 to k do
begin
with inf do
begin
writeln('Ќ(r)¬Ґа бв㤥в : ',i,' ”(r)а¬ в § ЇЁбЁ: ” ¬Ё«Ёп, ?¬п, ЋвзҐбвў(r), „Ґм! ЊҐбпж! ѓ(r)¤! а(r)¦¤ҐЁп');
readln(fam);
readln(im);
readln(ot);
readln(dr);
readln(mr);
readln(gr);
end;
write(spi,inf);
end;
close(spi);
reset(spi);
{‘ ¬л(c) ¬« ¤иЁ(c)}
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);

{‘ ¬л(c) бв аиЁ(c)}
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);
{Џ(r)бва(r)ҐЁҐ бЇЁбЄ }
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);
{‘ЇЁб(r)Є Ё +1 ўлў(r)¤Ёв в(r)«мЄ(r) ўҐбм ўўҐ¤сл(c) бЇЁб(r)Є...  ЉЂЉ ”ЏЋђџ„Ћ—?’њ ЏЋ ‚Ћ‡ђЂ‘’”???}
{‚лў(r)¤ १г«мв в }
for i:=1 to k do
begin
read(spi,inf);
if (ssd=inf.dr) and (ssm=inf.mr) and (ssg=inf.gr) then writeln('Њ« ¤иЁ(c) бв㤥в= ',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('‘в аиЁ(c) бв㤥в= ',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
Цитата
НЕ МОГУ ДОЕХАТЬ КАК ПУНКТ 3 СДЕЛАТЬ
Ты хочешь упорядочивать прямо в файле? Можно, конечно, по тому же принципу, как делается любая из сортировок массива, только вместо обращения к элементу массива обращаешься к записи файла... Для примера: если брать "Пузырек": Методы сортировок , то нечто подобное в файле будет выглядеть так:

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;


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

Все о динамических структурах данных. (Списки)
или
Динамические массивы и матрицы
(но использование списков будет проще, потому что для преобразования программы по второй ссылке в то, что требуется тебе, нужно еще довольно много добавить, по крайней мере - не одну строчку кода)
DCRM
Хм.. после 2.5х бессонных ночей вот что навоял!
9я! Работает!!!
Вот код:

Program Lab_9_v1;
uses
  Crt;
const
  fSpi='c:\Stud.dat';
  fSort='c:\StudSort.dat';
  kMax=100;
  lVozrDate=True;  {‘(r)авЁа(r)ўЄ  True-Ї(r) ў(r)§а бв ­Ёо ¤ вл,False-Ї(r) гЎлў ­Ёо}
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;

{Ќ  ўе(r)¤Ґ бЁ¬ў(r)«м­ п ¤¤.¬¬.ЈЈЈЈ, ­  ўле(r)¤Ґ зЁб«(r)ў п ЈЈЈЈ¬¬¬¤¤}
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('‚ўҐ¤ЁвҐ Є(r)«ЁзҐбвў(r) бв㤥­в(r)ў (Є(r)«-ў(r) § ЇЁбҐ(c)):'); readln(k);
  Assign(spi,fSpi);
  Rewrite(spi);
  for i:=1 to k do
    begin
      with inf do
        begin
          writeln('‘в㤥­в (§ ЇЁбм) ­(r)¬Ґа: ',i);
          write('   ” ¬Ё«Ёп:'); readln(fam);
          write('       €¬п:'); readln(im);
          write('  ЋвзҐбвў(r):'); readln(ot);
          write('  „ в  а(r)¦¤Ґ­Ёп ў д(r)ଠ⥠¤¤.¬¬.ЈЈЈЈ (¤¤-¤Ґ­м, ¬¬-¬Ґбпж, ЈЈЈЈ-Ј(r)¤):'); readln(ddmmgggg);
          uk:=NIL;
        end;
      obrabotano[i]:=0;
      Write(spi,inf);
    end;
  Close(spi);

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

  {‘ ¬л(c) бв аиЁ(c)}
  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);

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

  {lVozrDate=True - ‘(r)авЁа㥬 Ї(r) ў(r)§а бв ­Ёо ¤ вл а(r)¦¤Ґ­Ёп, в.Ґ. Ї(r) гЎлў ­Ёо ў(r)§а бв }
  {lVozrDate=False - ‘(r)авЁа㥬 Ї(r) гЎлў ­Ёо ¤ вл а(r)¦¤Ґ­Ёп, в.Ґ. Ї(r) ў(r)§а бв ­Ёо ў(r)§а бв }
  {€бЇ(r)«м§гҐ¬ ¬ ббЁў obrabotano: н«-в=1-§ ЇЁбм 㦥 (r)Ўа Ў(r)в ­ , ў Їа(r)вЁў­(r)¬ б«гз Ґ =0}
  Assign(sort,fSort);
  Rewrite(sort);
  for i:=1 to k do
    begin
      if lVozrDate=True then
        ggggmmddMin:=30001231  {31.12.3000 ¤ в  а(r)¦¤Ґ­Ёп б ¬(r)Ј(r) бв а襣(r)}
      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('‘(r)авЁа(r)ўЄ  Ї(r) гЎлў ­Ёо ў(r)§а бв  (д (c)« ',fSort,'):')
  else
    writeln('‘(r)авЁа(r)ўЄ  Ї(r) ў(r)§а бв ­Ёо ў(r)§а бв  (д (c)« ',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;


{ўлў(r)¤ ¤Ё­.ЇҐаҐ¬Ґ­­ле}
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;


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


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


{г¤ «Ґ­ЁҐ н«-в  ў бЇЁбЄҐ Ї(r) ҐЈ(r) ­(r)¬Ґаг}
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('‘(r)¤Ґа¦Ё¬(r)Ґ д (c)«  '+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('„ ­­лҐ ¤Ё­ ¬ЁзҐбЄ(r)Ј(r) бЇЁбЄ :');

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

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

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

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

  ClrScr;
  writeln('„«п (r)Ў¬Ґ­  н«Ґ¬Ґ­в(r)ў ўўҐ¤ЁвҐ Ёе ­(r)¬Ґа :');
  write('ЏҐаўл(c) н«Ґ¬Ґ­в:'); readln(j);
  write('‚в(r)а(r)(c) н«Ґ¬Ґ­в:'); 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;
  {(r)Ў¬Ґ­}
  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('‘ЇЁб(r)Є (Ї(r)б«Ґ (r)Ў¬Ґ­  н«-в(r)ў Ї(r) Ёе ­(r)¬Ґа ¬):');

  ClrScr;
  writeln('„«п (r)Ў¬Ґ­  н«Ґ¬Ґ­в(r)ў ўўҐ¤ЁвҐ Є«озЁ (д ¬Ё«Ёо):');
  write('ЏҐаў п д ¬Ё«Ёп:'); readln(famj);
  write('‚в(r)а п д ¬Ё«Ёп:'); 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;
  {(r)Ў¬Ґ­}
  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('‘ЇЁб(r)Є (Ї(r)б«Ґ (r)Ў¬Ґ­  н«-в(r)ў Ї(r) Ёе Є«оз ¬):');

  ClrScr;
  write('„«п г¤ «Ґ­Ёп н«Ґ¬Ґ­в  ўўҐ¤ЁвҐ ҐЈ(r) ­(r)¬Ґа:'); 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('‘ЇЁб(r)Є Ї(r)б«Ґ г¤ «Ґ­Ёп н«-в  Ї(r) ҐЈ(r) ­(r)¬Ґаг:');

  ClrScr;
  write('„«п г¤ «Ґ­Ёп н«Ґ¬Ґ­в  ўўҐ¤ЁвҐ ҐЈ(r) Є«оз (д ¬Ё«Ёо):'); readln(famj);
  worked:=true;
  {Ї(r) д ¬Ё«ЁЁ (r)ЇаҐ¤Ґ«пҐ¬ ­(r)¬Ґа н«-в }
  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('‘ЇЁб(r)Є Ї(r)б«Ґ г¤ «Ґ­Ёп н«-в  Ї(r) ҐЈ(r) Є«озг:');

  {г­Ёзв(r)¦Ґ­ЁҐ ¤Ё­.ЇҐаҐ¬Ґ­­ле}
  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 сотни строчек...)))
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.