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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2011, 12:03   #1
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию Поиск одинаковых слов в строках.

Найти все слова из 1 строки, которые не встречаются во 2. Написать все эти слова в 3 строку.

Строки могут быть любого размера.

можно задать цикл проверяя каждое слово из 1 строки на принадлежность 2 строке, но если одинаковых слов будет несколько, цикл не будет работать.
На форуме ничего подобного не видел.

Код:

str1: array [1..n] of string;
str2: array [1..m] of string;
i:=1;
for k:=1 to n do 
 if str1[k] NOT in str2[1..m]
begin
   str3[i]:=str1[k];
   i:=i+1;
end;
Как дополнить?

Последний раз редактировалось zink; 30.10.2011 в 16:02.
zink вне форума Ответить с цитированием
Старый 30.10.2011, 16:01   #2
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

В коде ошибка
Код:
if str1[k] NOT in str2[1..m]
имеется ввиду:

1) сегодня был был хороший день
2) завтра был плохой день

Должно вывести:

3) сегодня был хороший

В моей программе выведет

3) сегодня хороший
zink вне форума Ответить с цитированием
Старый 30.10.2011, 22:55   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
if str1[k] NOT in str2[1..m]
насколько я знаю Pascal - операция IN допустима ИСКЛЮЧИТЕЛЬНО для проверки вхождения элемента в множество. Здесь же никаким множеством и близко не пахнет.
я бы предложил Вам сделать так:
Код:
str1: array [1..n] of string;
str2: array [1..m] of string;
i, j, k : integer;
....
i:=0;
for k:=1 to n do begin
     {проверка на вхождения строчки в массив}
      j := 1;
     while (j<=m) and (str2[j]<>str1[k]) do Inc(j);
     if j>m {значит искомой строки нет в массиве str2} then 
         begin
            i:=i+1;
            str3[i]:=str1[k];
         end;

p.s. слова в разных регистрах данный код будет считать разными. Если нужно, чтобы слова Был, был или БЫЛ считались одинаковыми - приводите их перед сравнением к одному регистру. Правда, для русских букв в турбопаскале это не такая уж элементарная задача, но на форуме она решалась неоднократно, при желании легко найдёте пример кода для перевода русских букв в UpperCase или LowerCase ....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.11.2011, 08:04   #4
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

Как мне кажется у вас нет проверки на повторение слов

Получилось так:

Код:
{Сравнение двух массивов}
data:='';
for i:=1 to q1 do
  begin
    d:=0;
    t:=0;
    j:=0;
    rep1:=0;
    rep2:=0;
  
{Первая строка}
for k:=1 to i do
  if txt1[i] = txt1[k] then
    inc(rep1); {Счетчик повторяющихся слов до i-ого включительно в 1 строке}

    if rep1 < 2 then
      begin
        for k:=1 to q1 do
          if txt1[i] = txt1[k] then
            inc(d); {Счетчик совпадения i-того слова с другими в 1 строке}
      end;

{Вторая строка}
for k:=1 to i do
  if txt1[i] = txt2[k] then
    inc(rep2); {Счетчик повторяющихся слов до i-ого включительно во 2 строке}

    if rep2 < 2 then
      begin
        for k:=1 to q2 do
          if txt1[i] = txt2[k] then
            inc(t); {Счетчик совпадения i-того слова с другими во 2 строке}
        j:=d-t; {Разница повторения слов в 1 и 2 строках}
      end;

    if j > 0 then
       for k:=1 to j do
         data:=data+' '+txt1[i]; {Записываем слово которое не встречается во 2 строке j раз}
 end;
zink вне форума Ответить с цитированием
Старый 01.11.2011, 09:13   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как мне кажется у вас нет проверки на повторение слов
????? Это что означает?!

вот полный код программы (ядро выбора нужных слов я скопировал из своего поста выше). Что не так?!
Код:
const n= 4; m=3;

var
 str1: array [1..n] of string;
 str2: array [1..m] of string;
 str3: array [1..n] of string;
 i, j, k : integer;
begin
  {зададим слова в первый массив}
  str1[1] := 'test'; str1[2] := 'zoom';  
  str1[3] := 'good'; str1[4] := 'best'; 

  {зададим слова во  второй массив}
  str2[1] := 'black'; str2[2] := 'bad';  
  str2[3] := 'test';



  i:=0;
  for k:=1 to n do begin
     {проверка на вхождения строчки в массив}
      j := 1;
     while (j<=m) and (str2[j]<>str1[k]) do Inc(j);
     if j>m {значит искомой строки нет в массиве str2} then 
         begin
            i:=i+1;
            str3[i]:=str1[k];
         end;
  end;

  {вывод результатов}
  WriteLn('Полученные слова (есть в первом массиве и нет во втором):');
  for j:=1 to i do
      Write(str3[j], ' ');
  Writeln;
  readln
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.11.2011, 09:34   #6
zink
Пользователь
 
Регистрация: 30.03.2011
Сообщений: 36
По умолчанию

Видимо моя ошибка, в условии должна быть еще надпись. Одно слово из 2 строки эквивалентно 1 слову из 1 строки, а не всем одинаковым словам. т.е.
допустим
1 строка: test zoom test good (test 2 раза)
2 строка: black bad test (test 1 раз)

3 строка: zoom test good

Ну или так
Код:
{зададим слова в первый массив}
  str1[1] := 'test'; str1[2] := 'test';  
  str1[3] := 'good'; str1[4] := 'test'; 

  {зададим слова во  второй массив}
  str2[1] := 'black'; str2[2] := 'bad';  
  str2[3] := 'test';
должно вывести: test test good
zink вне форума Ответить с цитированием
Старый 01.11.2011, 10:00   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
условии должна быть еще надпись. Одно слово из 2 строки эквивалентно 1 слову из 1 строки, а не всем одинаковым словам.
ну конечно же, это уже немного меняет дело!

ну, тогда, если условия задачи допускают - я бы банально стирал эти слова в массиве 2, если они нашлись...

вот так:
Код:
  i:=0;
  for k:=1 to n do begin
     {проверка на вхождения строчки в массив}
      j := 1;
     while (j<=m) and (str2[j]<>str1[k]) do Inc(j);
     if j>m {значит искомой строки нет в массиве str2} then 
         begin
            i:=i+1;
            str3[i]:=str1[k];
         end
     else {значит слово нашли - затрём его} str2[j] := '';
  end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск одинаковых значений в стобце, возврат суммы чисел из другого столбца в найденных строках! Kup Microsoft Office Excel 2 25.03.2010 10:15
Паскаль-Подсчитать число одинаковых элементов на соответствующих позициях в двух строках tanyhaftv Помощь студентам 3 24.03.2010 11:59
Поиск одинаковых слов (Delphi 7) hooch Помощь студентам 4 27.11.2008 20:14
ПОИСК ОДИНАКОВЫХ СЛОВ (не проходите мимо!) MAD Помощь студентам 12 24.12.2007 22:41