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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2011, 20:51   #1
T@tali
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 72
По умолчанию Ошибка в программе

программа выдает не тот результат. кто подскажет что здесь не так? она должна удалять 2раза слово если оно встретилось три раза
Код:
Program w;
var
a:string;
procedure ClearWord(e:string;var f:string);
begin
while length(e)>2 do
begin
f[pos(e,f)+1]:=' ';{стираем проверенное слово}
delete(e,2,1);{удаляем символ}
end;
end;
function CountWord(e,f:string):integer;
begin
if pos(e,f)>0 then
begin
delete(f,pos(e,f)+1,length(e)-2);{удаляем посчитаное слово}
 CountWord:=CountWord(e,f)+1;{ищем следующее}
end
else CountWord:=0;{сбрасываем счетчик}
end;
function FirstWord(e:string):string;
begin
while (e[1]=' ')and(length(e)>0) do
delete(e,1,1);{удаляем начальные пробелы}
FirstWord:=copy(e,1,pos(' ',e)-1){копируем слово}
end;
function WordKill(b:string):string;
var
c,d:string;
begin
c:=b;{котрольная строка}
d:='.,`!@#$%^&*()_[]{}0;:';{все символы, являющиеся знаками препинания}
while length(d)>0 do
begin
while pos(d[1],c)>0 do
c[pos(d[1],c)]:=' ';{заменяем знак препинания}
delete(d,1,1);{удаляем проверенный символ}
end;
while length(FirstWord(c))>0 do{пока ещё есть слова}
begin
d:=' '+FirstWord(c)+' ';{выделяем очередное слово}
if CountWord(d,c)>3 then{выподняем условие}
begin
delete(b,pos(d,c)+1,length(d)-2);
delete(c,pos(d,c)+1,length(d)-2);
delete(b,pos(d,c)+1,length(d)-2);
delete(c,pos(d,c)+1,length(d)-2);
 end;
while pos(d,c)>0 do
ClearWord(d,c);{заменяем проверенное слово пробелами}
end;
WordKill:=b;
end;
begin
  write('Enter string:');
  readln(a);
  a:='asd asd 1 asd asdf asd';{контрольная строка}
  a:=' '+a+' ';{добавляем разделители}
  writeln('Result:',WordKill(a));{выводим результат}
  readln;
end.
T@tali вне форума Ответить с цитированием
Старый 27.02.2011, 20:53   #2
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

вы сначало код сделайте читабельным(
Pein95 вне форума Ответить с цитированием
Старый 27.02.2011, 21:15   #3
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

ваша программа работает правильно, вот только работает всегда на 1 случай; строка a:='asd asd 1 asd asdf asd', не зависимо от вводимого значения строковой переменной a
Код:
 readln(a);
  a:='asd asd 1 asd asdf asd';
удалите эту строку оставте только оператор ввода ReaLn(a);
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 27.02.2011, 21:34   #4
T@tali
Пользователь
 
Регистрация: 06.05.2010
Сообщений: 72
По умолчанию

все равно не удаляет выводит тоже что и ввела
Изображения
Тип файла: jpg прога.JPG (15.9 Кб, 82 просмотров)
T@tali вне форума Ответить с цитированием
Старый 28.02.2011, 10:32   #5
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

ваш код работает на 100%
Код:
Program w;
var
a:string;
procedure ClearWord(e:string;var f:string);
begin
while length(e)>2 do
begin
f[pos(e,f)+1]:=' ';{стираем проверенное слово}
delete(e,2,1);{удаляем символ}
end;
end;
function CountWord(e,f:string):integer;
begin
if pos(e,f)>0 then
begin
delete(f,pos(e,f)+1,length(e)-2);{удаляем посчитаное слово}
 CountWord:=CountWord(e,f)+1;{ищем следующее}
end
else CountWord:=0;{сбрасываем счетчик}
end;
function FirstWord(e:string):string;
begin
while (e[1]=' ')and(length(e)>0) do
delete(e,1,1);{удаляем начальные пробелы}
FirstWord:=copy(e,1,pos(' ',e)-1){копируем слово}
end;
function WordKill(b:string):string;
var
c,d:string;
begin
c:=b;{котрольная строка}
d:='.,`!@#$%^&*()_[]{}0;:';{все символы, являющиеся знаками препинания}
while length(d)>0 do
begin
while pos(d[1],c)>0 do
c[pos(d[1],c)]:=' ';{заменяем знак препинания}
delete(d,1,1);{удаляем проверенный символ}
end;
while length(FirstWord(c))>0 do{пока ещё есть слова}
begin
d:=' '+FirstWord(c)+' ';{выделяем очередное слово}
if CountWord(d,c)>3 then{выподняем условие}
begin
delete(b,pos(d,c)+1,length(d)-2);
delete(c,pos(d,c)+1,length(d)-2);
delete(b,pos(d,c)+1,length(d)-2);
delete(c,pos(d,c)+1,length(d)-2);
 end;
while pos(d,c)>0 do
ClearWord(d,c);{заменяем проверенное слово пробелами}
end;
WordKill:=b;
end;
begin
  write('Enter string:');
  readln(a);
  a:=' '+a+' ';{добавляем разделители}
  writeln('Result:',WordKill(a));{выводим результат}
  readln;
end.

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 28.02.2011 в 11:52.
Летучий_СкилетиК вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе CraZZZy-GameRRR Общие вопросы Delphi 2 14.02.2011 02:22
Ошибка в программе LuBuMaster Visual C++ 5 07.10.2010 17:19
Ошибка в программе misher Общие вопросы Delphi 12 01.09.2010 19:11
С++ Ошибка в программе EwwwA Общие вопросы C/C++ 5 05.01.2009 23:12
Ошибка в программе RoadTrain Общие вопросы Delphi 5 24.10.2007 22:16