Помощь - Поиск - Пользователи - Календарь
Полная версия: типизированный файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
what is
Здравствуйте.
У меня тут некоторая проблемка с типизированным файлом. Прошу помощи.
Итак, суть задачи: создать основную программу и модуль. В основной выводится меню и считывается номер пункта. В модуле расположены процедуры на пункты меню.
Создается типизированный файл(справочник 2), куда вводятся данные о номенклатурном номере изделия, наименовании изделия и цене изделия. После создания файл можно распечатать и откорректировать(удалить запись, добавить запись или редактировать запись).
Собственно все работает, кроме корректирови и удаления записи. wacko.gif
выкладываю кусок модуля с процедурами на создание файла, корректировку и удаление записей.

unit modmenu4;
interface
uses crt;
type
        tsprav2=record{собственно запись данных}
        nom_num:integer;
        name_izdel:string;
        price:integer
          end;
        ztsprav2=array[1..30] of tsprav2;{тип записи}
var
        name2:string;
        n,m,i:integer;
        flag,fl:boolean;
        answer:char;
        zap_sprav2:ztsprav2;
        sprav2:file of tsprav2;

   procedure vvod_sprav2;
   procedure udal_zap_sprav2;
   procedure corr_zap_sprav2;

implementation

       procedure vvod_sprav2;{ввод типизированного файла}
     var
          i:integer;
          name2,answer:string;
     begin
          i:=0;
          repeat
          writeln('vvedite imya faila-spravo4nika 2:');
          readln(name2);
          assign(sprav2,name2);
           {$I-} reset (sprav2); {$I+}
              if ioresult=0 then
              begin
                   writeln('imya faila *',name2,'* yje est');
                   close(sprav2);
                   fl:=false;
              end
              else
              begin
                   rewrite(sprav2);
                   fl:=true;
              end;
          until fl;
          flag:=true;

          while(flag=true) do
             begin
                  inc(i);
                  writeln('Zapis N',i);
                  write('>Vvedite nom.nomer izdeliya:');
                  readln(zap_sprav2[i].nom_num);
                  write('>vvedite naimenovanie izdeliya:');
                  readln(zap_sprav2[i].name_izdel);
                  write('>vvedite cenu izdeliya:');
                  readln(zap_sprav2[i].price);
                  write(sprav2,zap_sprav2[i]);
                  writeln('prodoljat zapis? <y/n>');
                  readln(answer);
                  if (answer='n') or (answer='N')  then
                      flag:=false;

             end;
             close(sprav2);
     end;



процедура на удаление отдельных строк записи

procedure udal_zap_sprav2;
      var
     flag,flag1:boolean;
     j,i:integer;
     temp:file of tsprav2;
     namet:string;
begin
       repeat
          writeln('vvedite imya faila-spravo4nika 2:');
          readln(name2);
          assign(sprav2,name2);
           {$I-} reset (sprav2); {$I+}
              if ioresult<>0 then
              begin
                   writeln('imya faila *',name2,'* net');

                   fl:=false;
              end
              else
              begin
                   reset(sprav2);
                   fl:=true;
              end;
         until fl;
          namet:='temp2';
          assign(temp,namet);
          rewrite(temp);
          m:=filesize(sprav2);

          writeln('N':3,'nom.nomer':10,'name izdeliya':16,'cena':8);
          writeln;
          for j:=1 to m do
          begin
              read(sprav2,zap_sprav2[j]);
              writeln('',j,'':3,zap_sprav2[j].nom_num:10,zap_sprav2[j].name_izdel:16,zap_sprav2[j].price:8);
          end;
          while flag=true do
          begin
               Write('Vvedite nomer redactiruemoy zapisi: ');{дальше этого момента прога не работает}
               readln(i);
               if (i<1) or (i>m) then
               begin
                     WriteLn('Neverniy nomer!');
                     writeln;
                     writeln('Prodoljat vvod nomera? <y,n>');
                     readln(answer);
                     if (answer='n') or (answer='N') then
                        flag:=false;
                        close(sprav2);
                        close(temp);
                        erase(temp);
                 end
                 else
                    flag:=false;
              end;
            for j:=1 to i do
            begin
                 read(sprav2,zap_sprav2[j]);
                 write(temp,zap_sprav2[j]);
            end;
            for j :=i to m-1 do
            begin
                 zap_sprav2[j]:=zap_sprav2[j+1];
                 dec(m);
            end;
            seek(temp,filesize(temp));
            for j:=i to m do
                write(temp,zap_sprav2[j]);
            close(sprav2);
            close(temp);
            erase(sprav2);
            rename(temp,name2)
          end;


процедура для корректировки отдельных строк записи

procedure  corr_zap_sprav2;
      var i,j,m:integer;
          zap:ztsprav2;
          s:integer;
          s1,namet:string;
          fl:boolean;
          temp:file of tsprav2;
begin
          repeat
          writeln('vvedite imya faila-spravo4nika 2:');
          readln(name2);
          assign(sprav2,name2);
           {$I-} reset (sprav2); {$I+}
              if ioresult<>0 then
              begin
                   writeln('imya faila *',name2,'* net');
                   fl:=false;
              end
              else
              begin
                   reset(sprav2);
                   fl:=true;
              end;
          until fl;
          namet:='temp3';
          assign(temp,namet);
          rewrite(temp);
          writeln('Spravo4nik 2');
          writeln('N':4,'nom.nomer':10,'name izdeliya':16,'cena':8);
          writeln;
          m:=filesize(sprav2);
          for j:=1 to m  do
          begin
               read(sprav2,zap_sprav2[j]);
               write('',j,'':4,zap_sprav2[j].nom_num:10,zap_sprav2[j].name_izdel:16,zap_sprav2[j].price:8);
               writeln;
          end;
          fl:=true;
          repeat
          begin
               Writeln('--> Vvedite nomer redactiruemoy zapisi: ');{здесь тоже аналогично}
               readln(i);
               if (i<1) or (i>m) then
               begin
                  WriteLn('Neverniy nomer!');
                  writeLn;
               end
               else
                fl:=false;

          end;
          until fl=false;
          m:=filesize(sprav2);
          for j:=1 to i do
             read(sprav2,zap_sprav2[j]);
             write(temp,zap_sprav2[j]);
          Write('Vvedite novoe zna4enie i najmite *ENTER*');
          with zap_sprav2[i] do
           begin
                 Write('Nom.nomer izdeliya: ',nom_num,'--->');
                 ReadLn(s);
                 nom_num:=s;
                 Write('Naimenovanie izdeliya: ',name_izdel,'--->');
                 ReadLn(s1);
                 name_izdel:=s1;
                 Write('cena izdeliya: ',price,'--->');
                 ReadLn(s);
                 price:=s;
                 seek(temp,filesize(temp));
                 write(temp,zap_sprav2[i]);
                 seek(temp,filesize(temp));
                 for j:=i+1 to m do
                   read(sprav2, zap_sprav2[j]);
                   write(temp, zap_sprav2[j]);
           end;
      close(sprav2);
      close(temp);
      erase(sprav2);
      rename(temp,name2);
    end;
end.

.
Помогите пожалуйста....уже замучалась.... mega_chok.gif
what is
Помогите пожалуйста....плиззз...
а то мне завтра сдавать эту прогу....
blink.gif
Renbo
ИМХО, твой код ваще надо с 0-ля писать ))
Где ты видела программу при запуске корректировки запсиси не выпустит пользователя из запроса ВВЕДИТЕ НОМЕР КОРРЕКТИРУЕМОЙ ЗАПИСИ, пока ты не введёшь номер и не откорректируешь.

Читаю твой код и просто глаза плывут )

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


Procedure Ydalenie2;
Var
  h:string;
  n2,code,i,n1:integer;
  help2:file of TZ2;
  otvet:char;
Begin
  clrscr;
  vivodilka2; {тут выводит на экран все записи}
  writeln('Хотите ли удалить запись(Y/N) ?');
  otvet:=danet; {функция по определению 'y' или 'n'}
  IF otvet in ['Y','y'] then
    begin
      writeln('Удаление записи:');
      repeat
        reset(spravochnik2);
        n1:=0;
        while not eof(spravochnik2) do
          begin
            read(spravochnik2,Zap2);
            inc(n1);
          end;
        close(spravochnik2);
        reset(spravochnik2);
        assign(help2,'help');
        rewrite(help2);
        writeln('Какую запись вы хотите удалить?');
        readln(h);
        Val(h,n2,code);
        If (n1 < n2) or (n2=0)  then
          begin
            writeln('Такой записи не существует!!');
            readkey;
            close(spravochnik2);
            close(help2);
          end
        Else
          begin
            i:=0;
            repeat
              inc(i);
              If not (i=n2) then
                begin
                  read(spravochnik2,Zap2);
                  write(help2,Zap2);
                end
              else read(spravochnik2,Zap2);
            until eof(spravochnik2);
            close(help2);
            close(spravochnik2);
            erase(spravochnik2);
            rename(help2,'spravka2');
          end;
        clrscr;
        vivodilka2;
        writeln('Хотите ли вы удалить ещё одну запись(Y/N)?');
        otvet:=DaNet;
      until otvet in ['N','n'];
    end;
End;



Вот тебе удаление, вроде всё просто и понятно всем...
volvo
Цитата
удаление - переписываешь нужные записи во второй фаил, а первый потом удаляешь, а второй переименовываешь
С типизированным-то файлом? Ну-ну...

Вместо того, чтобы последнюю запись перенести на место удаляемой, и сделать Truncate по предпоследней записи (пример - в поиске по слову Truncate) ты будешь все записи переносить в другой файл?
what is
Эм..да....
сама пугалась своей проги( norespect.gif (

спасибо большое.....
будем переделывать)
Renbo
Цитата(volvo @ 3.05.2007 19:17) *

С типизированным-то файлом? Ну-ну...

Вместо того, чтобы последнюю запись перенести на место удаляемой, и сделать Truncate по предпоследней записи (пример - в поиске по слову Truncate) ты будешь все записи переносить в другой файл?


мне мой способ просто понятен сразу стал )
Кстати, что-то я и не подумал про Truncate, а с ним жить-то легче, ты прав ) и процедура в разы сократится, вот токо уже лабу сделал как сделал, но спасиб, на будущее буду помнить smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.