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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2008, 23:23   #1
innaa639
Пользователь
 
Аватар для innaa639
 
Регистрация: 13.11.2008
Сообщений: 80
Восклицание помогите исправить задачку

Вот задача: Ввести строка символов, которая содержит слова и эталонное слово. Найти в строке все слова, из которых можно получить эталонное слово в результате одной ошибки.
Вот код, но здесь что-то не правильно, как ее проверить?Скажите чего исправить

const
rzd = [',', '-', '.'];
var
slovo, etalon, st: string;
i, j, k: byte;
begin
write('st = ');
readln(st);
write('etanol = ');
readln(etalon);
st := ' ' + st + ' ';
for i := 1 to length(st) do
if st[i] in rzd then st[i] := ' ';
while pos(' ', st) > 0 do delete(st, pos(' ', st), 1);
delete(st, 1, 1);
repeat
i := pos(' ', st);
slovo := copy(st, 1, i - 1);
j := 0;
if abs(length(slovo) - length(etalon)) <= 1 then
for i := 1 to length (slovo) do
if slovo[i] <> etalon[i] then inc(j);
if j = 1 then writeln(slovo);//одна ошибка обязательна
delete(st, 1, i)
until st = '';
readln
end.
innaa639 вне форума Ответить с цитированием
Старый 30.11.2008, 12:12   #2
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Код:
uses crt;
var s,sub:string;
    i,j,n,m:integer;
    a:array[1..10] of string;

begin
clrscr;
readln(s);
i:=0;n:=0;
repeat
inc(i);
if (s[i]=' ')or(s[i]=',') then begin
                   inc(n);
                   a[n]:=sub;
                   sub:='';
                   end
else sub:=sub+s[i];
until i=length(s);
inc(n);
a[n]:=sub;
writeln;
writeln('Input Etalon');
readln(sub);
writeln('=============================');
for i:=1 to n do
 begin
  m:=0;
  for j:=1 to length(sub) do
   if a[i][j]<>sub[j] then inc(m);
 if m=0 then if length(a[i])-1=length(sub) then writeln(a[i]);
 if m=1 then if length(a[i])=length(sub) then writeln(a[i]);
 end;
end.
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 30.11.2008, 12:26   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Код:
uses crt;
const
rzd = [',', '-', '.','?','!',';',':'];//добавил
var slovo, etalon, st,s: string; //добавил s для временного хранения слов
    i, j, k: byte;
begin
clrscr;
write('st = ');
readln(st);
write('etalon = ');//исправил этанол на эталон
readln(etalon);
{formatirovanie stroki}
st :=st + ' '; //пробел в начало не нужен
for i := 1 to length(st) do
if st[i] in rzd then st[i] := ' ';
while pos('  ', st) > 0 do //здесь в кавычках обязательно два пробела
delete(st, pos('  ', st), 1);// и здесь, иначе удалите все пробелы
{poisk slov}
while pos(' ',st)>0 do//пока в строке есть пробелы
  begin
    slovo := copy(st, 1, pos(' ',st) - 1);//копируем очередное слово
    {esli dlina sl=dlina et}
 //объединять все три случая ошибки не надо, проще по отдельности
    if length(slovo)=length(etalon) then
       begin
         k:=0;
         for i := 1 to length (slovo) do
         if slovo[i]<>etalon[i] then inc(k);
         if k=1 then writeln(slovo);//если одна буква не совпадает
       end;
   {esli v slove 1 lishnya bukva}
   if length(slovo)-length(etalon)=1 then
      begin
        s:=slovo;
        for i:=1 to length(s) do
          begin
            delete(s,i,1);//удаляем по одной букве из слова и сравниваем
            k:=0;
            for j := 1 to length (s) do
            if s[j]=etalon[j] then inc(k);
            if k=length (etalon) then writeln(slovo);//если без 1 буквы совпадает
          end;
       end;
   {esli v slove propusshena bukva}
   if length(etalon)-length(slovo)=1 then//в этом случае также только слово и эталон меняем местами
      begin
        s:=etalon;
        for i:=1 to length(s) do
          begin
            delete(s,i,1);
            k:=0;
            for j := 1 to length (s) do
            if s[j]=slovo[j] then inc(k);
            if k=length (slovo) then writeln(slovo);
          end;
       end;
   delete(st,1,pos(' ',st));//удаляем просмотренное слово
 end;
readln
end.
Извините, не посмотрел. Кстати Ваш код выводит далеко не все слова.

Последний раз редактировалось puporev; 30.11.2008 в 12:43.
puporev вне форума Ответить с цитированием
Старый 30.11.2008, 12:45   #4
innaa639
Пользователь
 
Аватар для innaa639
 
Регистрация: 13.11.2008
Сообщений: 80
По умолчанию

Огромное вам спасибо
innaa639 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите решить задачку. [Pr1_Zr4k] Помощь студентам 4 10.10.2009 17:52
Помогите решить задачку:-(( torrik Помощь студентам 32 10.10.2008 09:56
Помогите решить задачку:-( torrik Microsoft Office Excel 11 07.10.2008 13:38
Помогите Помогите Пожалуйста Решить Одну Задачку в Паскале!!! VisTBacK Помощь студентам 6 19.09.2008 13:44