• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

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

  • Автор темы Автор темы Aksinia
  • Дата начала Дата начала

Aksinia

Новые
Регистрация
15 Дек 2013
Сообщения
31
Реакции
1
Баллы
0
Найти ошибку в программе

Здравствуйте!
Помогите найти ошибку в программе, пожалуйста!
Задание - в прикрепленном файле.
Код:
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.
 

Вложения

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.
 
Помогите найти ошибку в программе, пожалуйста!
Пожалуйста. Вот, отладил. Вроде работает. Пояснение: булевский флажок "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.
 
Назад
Сверху