Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Найти ошибку в программе (http://www.tehnari.ru/f41/t93192/)

Aksinia 18.12.2013 21:27

Найти ошибку в программе
 
Вложений: 1
Здравствуйте!
Помогите найти ошибку в программе, пожалуйста!
Задание - в прикрепленном файле.
Код:

12.12.2013
      Проверка д/з (от 05.12.2013): 7 задач/программ
  д/з Многострочный редактор TxtEdt (ликвидация ошибок пунктуации)
      | На входе строка, содержащая буквы и символы пунктуации (из первой половины ASCII).
      | Задача: удалить "лишние" символы пунктуации и добавить недостающие пробелы:
      | * слово = фрагмент строки, состоящиЙ из букв,
      | * после символа пунктуации должен быть 1 пробел или конец строки,
      | * после 'слова' может быть только 1 символ пунктуации или пробел или конец строки,
      | * первому слову строки не должны предшествовать не-буквы.
      | Редактирование строки выполняется за счет вызова подпрограмм, ликвидирующих однотипные "ошибки".
      | Ввод из входного текстового файла <имя1>.txt (несколько строк-тестов).
      | Вывод конечного результата построчно в текстовый файл <имя2>.txt.
      | Пример:
      | ,  ;ВАСЯ,, .ПЕТЯ , , ... => ВАСЯ, ПЕТЯ, ...
  д/з Упрощенный вариант: редактор строки StrEdt {-1 балл}
      | Из текстового файла <имя1>.txt вводится строка.
      | Вывод результирующей строки в текстовый файл <имя2>.txt.

PHP код:

program project2;

var 
S:string;
  
f1,f2:text;

function 
BeginOfLine(S:string):string;
var 
O:string;i:integer;
    
begin
      O
:=S;
      
i:=1;
      while 
not (((ord(O[i])>64) and (ord(O[i])<91)) or ((ord(O[i])>96) and (ord(O[i])<123))) do begin
      delete
(O,(i),1);
      
i:=i+1;
      
end;
    
BeginOfLine:=O;
    
end;

function 
DelProbBefCh(S:string):string;
var 
P:string;i:integer;
  
begin
  P
:=S;
  for 
i:=1 to length(P) do
  if ((((
ord(P[i])>32) and (ord(P[i])<48)) or ((ord(P[i])>57) and (ord(P[i])<64))) and
   (
P[i-1]=' ')) then delete(P,i-1,1);
  
end;

function 
DelNextSimb(S:string):string;
  var 
N:string;i:integer;
    
begin
    N
:=S;
    for 
i:=1 to length(N) do
    if ((((
ord(N[i])>32) and (ord(N[i])<48)) or ((ord(N[i])>57) and (ord(N[i])<64))) and
   (((
ord(N[i+1])>32) and (ord(N[i+1])<48)) or ((ord(N[i+1])>57) and (ord(N[i+1])<64)))) then delete(N,i+1,1);
 
DelNextSimb:=N;
end;

function 
InsProb(S:string):string;
var 
M:string;i:integer;
  
begin
  M
:=S;
  for 
i:=1 to length(M) do
  if ((((
ord(M[i])>32) and (ord(M[i])<48)) or ((ord(M[i])>57) and (ord(M[i])<64))) and (((ord(M[i+1])>64) and (ord(M[i+1])<91)) or ((ord(M[i+1])>96) and (ord(M[i+1])<123)))) then  begin
  insert
(' ',M,(i+1));
  
end;

  
InsProb:=M;
  
end;

begin
  assign
(f1'Input.txt');
  
reset(f1);
  
assign(f2'Output.txt');
  
rewrite(f2);
  while 
not eof(f1) do begin
  readln
(f1,S);
  
S:=BeginOfLine(S);
  
S:=DelProbBefCh(S);
  
S:=DelNextSimb(S);
  
S:=InsProb(S);
  
writeln(f2,S);
  
end;
  
close(f1);
  
close(f2);
end


Aksinia 18.12.2013 23:53

PHP код:

program project2;
var 
S:string;
f1,f2:text;

function 
BeginOfLine(S:string):string;
var 
O:string;
i:integer;
begin
  O
:=S;
  
i:=2;
  while 
not (((ord(O[i])>64) and (ord(O[i])<91)) or ((ord(O[i])>96) and (ord(O[i])<123))) do
  
begin
    delete
(O,i,1);
  
end;
  
BeginOfLine:=O;
  
end;



function 
DelProbBefCh(S:string):string;
var 
P:string;
i:integer;
begin
  P
:=S;
  
i:=2;
  while 
i<= length(P) do
  if ((((
ord(P[i])>32) and (ord(P[i])<48)) or ((ord(P[i])>57) and (ord(P[i])<64))) and (P[i-1]=' ')) then delete(P,i-1,1)
  else 
i:=i+1;
  
DelProbBefCh:=P;
end;

function 
DelNextSimb(S:string):string;
var 
N:string;
i:integer;
begin
  i
:=1;
  
N:=S;
  while 
i<=(length(N)-1) do
  
begin
    
if ((((ord(N[i])>32) and (ord(N[i])<48)) or ((ord(N[i])>57) and (ord(N[i])<64))) and (((ord(N[i+1])>32) and (ord(N[i+1])<48)) or ((ord(N[i+1])>57) and (ord(N[i+1])<64)))) then delete(N,i+1,1)
    else 
i:=i+1;
  
end;
  
DelNextSimb:=N;
end;

function 
InsProb(S:string):string;
var 
M:string;i:integer;
begin
  M
:=S;
  for 
i:=1 to (length(M)-1) do
  
begin
    
if ((((ord(M[i])>32) and (ord(M[i])<48)) or ((ord(M[i])>57) and (ord(M[i])<64))) and (((ord(M[i+1])>64) and (ord(M[i+1])<91)) or ((ord(M[i+1])>96) and (ord(M[i+1])<123)))) then
    begin
    insert
(' ',M,(i+1));
    
end;
  
end;
  
InsProb:=M;
end;

begin
  assign
(f1'Input.txt');
  
reset(f1);
  
assign(f2'Output.txt');
  
rewrite(f2);
  while 
not eof(f1) do
  
begin
    readln
(f1,S);
    
S:=BeginOfLine(S);
    
S:=DelProbBefCh(S);
    
S:=DelNextSimb(S);
    
S:=InsProb(S);
    
writeln(f2,S);
  
end;
  
close(f1);
  
close(f2);
end


Vladimir_S 19.12.2013 12:12

Цитата:

Сообщение от Aksinia (Сообщение 982522)
Помогите найти ошибку в программе, пожалуйста!

Пожалуйста. Вот, отладил. Вроде работает. Пояснение: булевский флажок "b" поставлен для подстраховки: цикл перебора функций продолжается до тех пор, пока строка не перестанет изменяться. Но не уверен в его необходимости: вроде бы и без него получается, но, может быть, просто я не нашел комбинации символов, где бы он "сработал".
Код:

var
 S:string;
 f1,f2:text;
 b:boolean;

function Lit(C:Char):boolean;
begin
 Lit:=((ord(C)>64) and (ord(C)<91)) or
      ((ord(C)>96) and (ord(C)<123));
end;

function BeginOfLine(S:string):string;
var
 O:string;
begin
 O:=S;
 while not(Lit(O[1])) do
  begin
  delete(O,1,1);
  b:=false;
  end;
 BeginOfLine:=O;
end;


function DelProbBefCh(S:string):string;
var
 P:string;
 i:integer;
begin
 P:=S;
 i:=1;
 repeat
  if (P[i]=' ') and (P[i+1]=' ') then
  begin
    delete(P,i+1,1);
    b:=false;
  end
  else i:=i+1;
 until i=length(P)-1;
  DelProbBefCh:=P;
end;

function DelNextSimb(S:string):string;
var N:string;
i:integer;
begin
 i:=1;
 N:=S;
 while i<=(length(N)-1) do
  begin
  if Not(Lit(N[i])) and Not(Lit(N[i+1])) and (N[i+1]<>' ') then
    begin
    delete(N,i+1,1);
    b:=false;
    end else i:=i+1;
  end;
  DelNextSimb:=N;
end;

function InsProb(S:string):string;
var
 M:string;
 i:integer;
begin
 M:=S;
 i:=1;
 repeat
  if Not(Lit(M[i])) and (M[i]<>' ') and Lit(M[i+1]) then
  begin
    insert(' ',M,i+1);
    b:=false;
    i:=i+1;
  end;
  i:=i+1;
 until i=length(M)-1;
 InsProb:=M;
end;

begin
  assign(f1, 'Input.txt');
  reset(f1);
  assign(f2, 'Output.txt');
  rewrite(f2);
  while not eof(f1) do
  begin
    readln(f1,S);
    repeat
    b:=true;
    S:=BeginOfLine(S);
    S:=DelProbBefCh(S);
    S:=DelNextSimb(S);
    S:=InsProb(S);
    until b;
    writeln(f2,S);
  end;
  close(f1);
  close(f2);
end.



Часовой пояс GMT +4, время: 03:39.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.