Показать сообщение отдельно
Старый 01.04.2019, 11:26   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да... хороша себе "небольшая подсказка"!
Исправил кучу ошибок, причесал, отладил, протестировал. Работает.
Код:
Uses crt;
Type
 matr = array[1..5] of integer;
 tFile = file of integer;

//Вывожу на экран, что есть в файле
procedure show(var f:text);
var s:string;
begin
 Assign(f, 'input.txt');
 reset(f);
 while not eof(f) do
  begin
   readln(f,s);
   writeln(s);
  end;
 Close(f);
end;

//Перевожу символы в ascii-коды
//(здесь пользователь вводит слово, которое надо удалить)
procedure input(var a:matr; var delword:string; var L:integer);
var i:integer;
begin
 writeln('Enter delword:');
 readln(delword);
 L:=Length(delword);
 for i:=1 to length(delword) do a[i]:=ord(delword[i]);
end;

//Перевожу все символы в ascii-коды
//(здесь слова, которые были в файле)
procedure transfer(var f:text; var f3:tFile);
var s:string; i,k:integer;
begin
 reset(f);
 assign(f3, 'ascii');
 rewrite(f3);
 while not eof(f) do
  begin
   readln(f,s);
   for i:=1 to length(s) do
    begin
     k:=ord(s[i]);
     write(f3,k);
    end;
   k:=10;
   write(f3,k);
  end;
 close(f);
 close(f3);
end;

//Удачная попытка удалить
procedure process (var f3:tFile; var f2:text; a:matr; L:integer);
var
 k,i,p,time,count:integer;
 flag,flag1,flag2:boolean;
 b:array[1..30] of integer;
begin
 writeln('Enter time:');
 readln(time);
 count :=0;
 reset(f3);
 Assign(f2, 'output.txt');
 rewrite(f2);
 while not eof(f3) do
  begin
   p:=0;
   repeat
    inc(p);
    read(f3, k);
    b[p]:=k;
   until (k=10) or eof(f3);
   if k=10 then dec(p);
   if p=L then
    begin
     i:=0;
     flag2:=true;
     repeat
      inc(i);
      flag1:=b[i]=a[i];
     until (flag1=false) or (i=L);
     if flag1 then
      begin
       inc(count);
       if count mod time = 0 then flag2:=false;
      end;
     flag:=flag2;
    end else flag:=true;
   if flag then
    begin
     for i:=1 to p do write(f2,chr(b[i]));
     writeln(f2);
     for i:=1 to p do write(chr(b[i]));
     writeln;
    end;
  end;
 Readln;
 close(f2);
 close(f3);
end;


var
  f,f2: text;
  f3:tFile;
  delword: string;
  a:matr;
  time,L:integer;
begin
 clrscr;
 show(f);
 input(a, delword,L);
 transfer(f, f3);
 process(f3, f2, a, L);
end.
Замечу, например, что если велено работать с кодами, то в процедуре Process строковой переменной Delword делать нечего: пользовательское слово мы в процедуре Input перевели в кодовый массив, вот с ним и надлежит работать. Ну и ещё много чего по мелочи.
И ещё парочка пожеланий (необязательных).
1. При использовании форматирования листинга очень желательно, чтобы горизонтальные отступы сопряженных begin и end были строго одинаковыми (как у меня). Это позволяет сразу увидеть вложенность операторов.
2. Использование одинаковых идентификаторов в качестве параметров подпрограмм и глобальных переменных хоть и не запрещено, но крайне нежелательно, поскольку снижает читабельность. Я уж исправлять не стал, но если будете ещё программировать, учтите этот момент.

P.S. И ещё. В своей программе Вы (и я вслед за Вами) исходите из того, что в исходном файле каждое слово расположено в своей отдельной строке. Это так в задании оговорено или Вы "упростили"? Потому что если это не так, то требуется довольно муторная процедура выделения отдельных слов.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070