1

Тема: Знайти однакові слова в двох рядках

Привіт всім, як зробити так, щоб можна було ввести з клавіатури два рядки, а в третій рядок вписати однакові слова з перших двох рядків. Ось мій варіант але PascalABC.NET видає

Program1.pas(9) : Ошибка времени выполнения: Индекс находился вне границ массива.

Домоможіть знайти помилку будь ласка або підкиньте свої варіанти та ідеї
Буду дуже вдячний !

Ось код

program six;
function Slovo(s:string;n:integer):string;
    const lim =[' ',',','!'];
    var ss:string;
    k,c,i:integer;
begin
    ss:=''; c:=1; k:=1;
    while k<=length(s) do begin
         while not(s[k] in lim) and (k<=length(s)) do begin
            if c=n then ss:=ss+s[k];
               inc (k); end;
               inc ( c );
       while (s[k] in lim) and (k<=length(s)) do inc (k);
      end;
   Slovo:=ss;
end;
var
  s1, s2, srez : string;
  n1, n2 : integer;
  i, j : integer;
begin
  writeln (' vvedit 1-u stroky' );  readln (s1);
  writeln (' vvedit 2-u stroky' );  readln (s2);
    n1 := 1;
    n2 := 1;
  srez := ' ';
    while slovo (s1, n1) <> '' do inc (n1);
    while slovo (s2, n2) <> '' do inc (n2);
  for i := 1 to n1 do
  for j := 1 to n2 do
     if slovo (s1, i) = slovo (s2, j) then  srez := srez + slovo (s1, i) +' ';
  writeln (' stroka - rezyltat : ' );
  writeln (srez);
end.
Post's attachments

2.JPG 88.76 kb, 332 downloads since 2014-05-04 

2 Востаннє редагувалося koala (04.05.2014 14:44:28)

Re: Знайти однакові слова в двох рядках

Переставте умови:

while (k<=length(s)) and not(s[k] in lim)  do begin

Так, як ви написали, при k=length(s)+1, відбувається перевірка s[k] in lim до того, як перевірено, чи k<=length(s), і, відповідно, перевіряється s[length(s)+1] in lim.

А взагалі - дуже багато надмірної праці. Якби рядки були довгі, то оптимальний алгоритм полягав би в тому, щоб нарізати рядки на два масиви, впорядкувати їх, а потім шукати повтори за один прохід; але навіть той алгоритм, що ви використовуєте (перебір повністю двох рядків по словах) можна значно прискорити, якщо замість пошуку довільного слова зробити пошук першого слова після певного знаку, умовно так:

i := 1;
word1 := nextWord( s1, i );
while word1 <> '' do begin
  j := 1;
  word2 := nextWord( s2, j );
  while word2 <> '' do begin
    if word1 = word2 then
      if srez = '' then srez := word1
      else srez := srez + ' 'word1;
    j := j + length( word2 ) + 1;
    word2 := nextWord( s2, j );
  end;
  i := i + length( word1 ) + 1;
  word1 := nextWord( s1, i );
end;
Подякували: Odin881

3 Востаннє редагувалося Odin88 (04.05.2014 14:47:16)

Re: Знайти однакові слова в двох рядках

В середовищах Object Pascal та Delphi ваша програми працює чудово.

Range Error

Думаю через те,що Ваше середовище автоматично запобігає виходу за межі діапазону.

Я не впевнений,але попробуйте так :

 while ((length(s) > 0) and (k<=length(s)) and (not(s[k] in lim) do
Подякували: koala1

4

Re: Знайти однакові слова в двох рядках

Odin88
Там перевірка діапазону вимкнена за замовчуванням.

Подякували: Odin881

5

Re: Знайти однакові слова в двох рядках

Replace Group, переставив умови, тепер все працює як слід!
Дякую всім, врятували студента

6

Re: Знайти однакові слова в двох рядках

Luchnik написав:

Replace Group, переставив умови, тепер все працює як слід!
Дякую всім, врятували студента

Ви трохи не там читаєте нік. Він над аватаркою.