Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 19:50   #1
mo>u<se
 
Регистрация: 15.04.2012
Сообщений: 3
Печаль Работа с файлами Text, редактирование записи. (Pascal)

Помогите, пожалуйста, разобраться с процедурой редактирования записи в текстовом файле, содержащем какбэ базу данных с переменными различного типа. Мои попытки накорябать какое-то подобие этой процедуры вызывают только коллапс у компилятора( Преподователь надеется видеть это как редактирование каждого слова в строке в отдельности, а не построчно, я вроде понимаю что массив перебрать нужно и сравнить введенное с каждым элементом, но получается чушь в результате.

Код:
program xxxxx;
uses crt;
 type mag=record
     num: byte;        {№ записи}
     name:string[15]; {Наименование}
     firm:string[15];   {Фирма производитель}
     st:word;            {Стоимость}
     ob:word;           {Объём}
     kol:word;          {Количество}
end;
var f:text;
    pp:array[1..20] of mag;
    n,i:integer;
    CH:char;

{-------------------------Процедура Вывода---------------------------}
Procedure Output;
 {Рисуем шапку таблицы}
           var
   i:integer;
           begin
writeln('____________________________________________________________________');
writeln('|   | Наименование  | Фирма -        | Стоимость | Объём  | Кол-во   |');
writeln('| № | продукта       | изготовитель  | (руб.)    |(Мбайт)| ¬  на складе|');
writeln('|___|_______________|_______________|___________|________|__________|');

 {Вывод}

       for i:=1 to n do
          begin
            write('|',pp[i].num);
            gotoxy(5,Wherey);   {посыл курсора на заданные координаты}
            write('|',pp[i].name);
            gotoxy(21,Wherey);  {для вывода ровной таблицы}
            write('|',pp[i].firm);
            gotoxy(37,Wherey);  
            write('|',pp[i].st);
            gotoxy(49,Wherey);
            write('|',pp[i].ob);
            gotoxy(58,Wherey);
            write('|',pp[i].kol);
            gotoxy(69,Wherey);
            write('|');
            writeln;
           end;

  {Нижняя черта таблицы}
            begin
            writeln('|___|_______________|_______________|___________|________|__________|');
            end;
           end;
{-----------------------Процедура записи в файл---------------------}

Procedure AddRec;  
   var
  count,countf:integer;
  k,kf:string;
    begin
      append(f);
        n:=n+1;
         writeln('Номер записи:');
          readln (pp[n].num);

           writeln('Наименование :');
            readln (pp[n].name);

             k:='';{считаем сколько пробелов нужно для счастья}
             count:=16-length(pp[n].name);
             for i:=1 to count do k:=k+' ';

             writeln('Фирма-изготовитель :');
              readln (pp[n].firm);

             kf:='';
             countf:=16-length(pp[n].firm);
             for i:=1 to countf do kf:=kf+' ';

             writeln('Стоимость :');
            readln (pp[n].st);
           writeln('Объём :');
            readln (pp[n].ob);
             writeln('Количество:');
              readln (pp[n].kol);
      writeln(f);
          write(f,pp[n].num,'   ');
           write(f,pp[n].name,k); {дописываем недостающие пробелы}
            write(f,pp[n].firm,kf);
            write(f,pp[n].st,' ');
           write(f,pp[n].ob,' ');
          write(f,pp[n].kol,' ');
         close(f);
       end;
{-------------------------------Редактирование----------------------}
Procedure Update; {Вот отсюда особенно стыдно}
 var s,c,c1:string;
   x:word;
     begin
  append(f);
   reset(f);
   OutPut;
    Writeln('Введите запись для редактирования');
     readln(c);
      Writeln('Введите новое значение записи');
       readln(c1);
{очередная провальная попытка}
         readln(f,s);
           x:=Pos(c);
            if x<>0 then
             begin
              Delete(s,x,Length(c);
              Insert(c1,s,x)
             end;
            close(f);
      end;
{-------------------------------Меню--------------------------------}
Procedure Menu;
var vibor:integer;
begin
 clrscr;
     writeln('Выберите действие');
        writeln('1-Добавление записи');
         writeln('2-Вывод данных');
        writeln('3-Редактирование');
      readln(vibor);

    case vibor of
     1:AddRec; 
    2:Output;
   3:Update;  
 end;
end;
{---------------------------начало---------------------------------}
{1} begin
  clrscr;
    assign(f,'in.txt');
    reset(f);
    i:=1;
    while not eof(f) do
  begin
     read(f,pp[i].num);
      read(f,pp[i].name);
       read(f,pp[i].firm);
       read(f,pp[i].st);
      read(f,pp[i].ob);
    readln(f,pp[i].kol);
  i:=i+1;
  end;
    n:=i-1;
     writeln (n);
{---------------------Запуск процедур----------------------------}
  clrscr;
      While true do
     begin
    Writeln('Enter – Вызов меню программы.');
  Writeln('ESC – Сбежать в ужасе.');     
CH:=readkey;
  if ord(CH)=27 then break else begin Menu;
     end;
  end;
end.

Последний раз редактировалось Stilet; 15.04.2012 в 19:54.
mo>u<se вне форума Ответить с цитированием
Старый 15.04.2012, 19:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
var f:text;
А вот это здря. Если хочешь создать свою БД - используй типизированные файлы.
В твоем случае var f:file of mag;
Читай о них, ищи примеры (в том числе с blockread/blockwrite)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2012, 19:57   #3
mo>u<se
 
Регистрация: 15.04.2012
Сообщений: 3
По умолчанию

Да знаю я Препод хочет текстовый файл.

Код:
Procedure Update;
 var    z,vibor1:integer;
         begin
     append(f);
    reset(f);
    i:=0;
   OutPut;
    Writeln('Введите № редактируемой записи');
     readln(z);
          Writeln('Какое значение будем редактировать?');
        Writeln ('1-№ Продукта');
         Writeln ('2-Наименование');
        Writeln ('3-Фирму');
       Writeln ('4-Стоимость');
       Writeln ('5-Объем');
        Writeln ('6-Количество');
         readln(vibor1);
      case vibor1 of
       1:begin
      writeln('Задайте новый порядковый номер:');
       readln(pp[z].num);
        writeln(f);
         writeln(f,pp[z].num,'   ');
       end;

     2:;
     3:;
     4:;
     5:;
     6:;
     end;
            close(f);
      end;
Вот так уже больше на правду похоже вроде.
!дошло что сделать, но не как( Придется его перезаписывать каждый раз при редактировании одной переменной, поправте если ошибаюсь.

Последний раз редактировалось Stilet; 15.04.2012 в 22:50.
mo>u<se вне форума Ответить с цитированием
Старый 15.04.2012, 22:51   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Придется его перезаписывать каждый раз при редактировании одной переменной
В случае с текстовым - да.
Цитата:
Препод хочет текстовый файл.
Печалька...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.04.2012, 11:41   #5
mo>u<se
 
Регистрация: 15.04.2012
Сообщений: 3
По умолчанию

Код:
Procedure Update;
 var
   vibor1,z,x:integer;
     y:string;
     begin
     append(f);
    reset(f);
   OutPut;
    Writeln('Введите № редактируемой записи');
     readln(z);
          Writeln('Какое значение будем редактировать?');
        Writeln ('1-№ Продукта');
         Writeln ('2-Наименование');
        Writeln ('3-Фирму');
       Writeln ('4-Стоимость');
       Writeln ('5-Объем');
        Writeln ('6-Количество');
         readln(vibor1);
      case vibor1 of
       1:begin
      writeln('Новый номер:');
       readln (x);
        pp[z].num:=x;
         rewrite(f);
          for i:=1 to n do
           BEGIN
           write(f,pp[i].num,'   ');
            write(f,pp[i].name);
            write(f,pp[i].firm);
            write(f,pp[i].st,' ');
           write(f,pp[i].ob,' ');
          write(f,pp[i].kol,' ');
       end;

     2:begin
      writeln('Новое наименование:');
       readln(y);
        pp[z].name:=y;
         rewrite(f);
          for i:=1 to n do
           BEGIN
           write(f,pp[i].num,'   ');
            write(f,pp[i].name);
            write(f,pp[i].firm);
            write(f,pp[i].st,' ');
           write(f,pp[i].ob,' ');
          write(f,pp[i].kol,' ');
        end;
     3:begin
      writeln('Новое название фирмы:');
       readln(y);
        pp[z].firm:=y;
         rewrite(f);
          for i:=1 to n do
           BEGIN
           write(f,pp[i].num,'   ');
            write(f,pp[i].name);
            write(f,pp[i].firm);
            write(f,pp[i].st,' ');
           write(f,pp[i].ob,' ');
          write(f,pp[i].kol,' ');
        end; ;
     4:;
     5:;
     6:;
     end;
            close(f);
      end;
Поправочка: На данном этапе перезаписывает только первый столбец и последнюю строку , остальное затирает=\ Если кто разберет мои каракули, скажите,пожалуйста, чего им не хватает(
>>Найден потерянный бегин. Все работает.

Последний раз редактировалось mo>u<se; 16.04.2012 в 20:18.
mo>u<se вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрицы. Записи. Работа с текстовыми файлами. Pascal. nicebot14 Помощь студентам 0 22.05.2011 12:52
записи и работа с файлами по Паскалю мяфффф Помощь студентам 2 22.06.2009 20:59
Работа с файлами. Записи Pasha9 Помощь студентам 1 22.03.2009 16:47
работа с файлами записи..... КиношкА Помощь студентам 6 14.01.2008 16:13