Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 18.12.2013, 21:27   #1 (permalink)
Aksinia
Member
 
Регистрация: 15.12.2013
Сообщений: 31
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 114
Question Найти ошибку в программе

Здравствуйте!
Помогите найти ошибку в программе, пожалуйста!
Задание - в прикрепленном файле.
Код:
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
Вложения
Тип файла: txt 20131212.txt (1.1 Кб, 568 просмотров)
Aksinia вне форума   Ответить с цитированием

Старый 18.12.2013, 21:27
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Можете найти полезную информацию в похожих обсуждениях

Найти ошибку
Помогите найти ошибку в программе на Си
Строки. Не могу найти ошибку в программе

Старый 18.12.2013, 23:53   #2 (permalink)
Aksinia
Member
 
Регистрация: 15.12.2013
Сообщений: 31
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 114
По умолчанию

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
Aksinia вне форума   Ответить с цитированием
Старый 19.12.2013, 12:12   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Aksinia Посмотреть сообщение
Помогите найти ошибку в программе, пожалуйста!
Пожалуйста. Вот, отладил. Вроде работает. Пояснение: булевский флажок "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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.