Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Сравнение элементов массива


Автор: ARAV 4.11.2006, 13:01
Здравствуйте!
Не могли бы вы помочь мне сделать перебор без повторений в следующем массиве строк:

A = (‘b’ ‘a’ ‘a’ ‘b’ ‘a’)  (массив может быть любым)

Правило перебора:
Например, сравниваем:
(1) A[0] и A[0] ‘b’ и ‘b’ – равны, но не запоминаем, так как символ совпал сам с собой
     A[0] и A[1] ‘b’ и ‘a’ – не равны => не запоминаем
     A[0] и A[2] ‘b’ и ‘a’ – не равны => не запоминаем
     A[0] и A[3] ‘b’ и ‘b’ – равны => запоминаем оба символа 'b' (так как совпадение произошло в первый раз)
     A[0] и A[4] ‘b’ и ‘a’ – не равны => не запоминаем
(2) A[1] и A[0] ‘a’ и ‘b’ – не равны => не запоминаем
      A[1] и A[1] ‘a’ и ‘a’ – равны, но не запоминаем, так как символ совпал сам с собой
      A[1] и A[2] ‘a’ и ‘a’ – равны => запоминаем оба символа ‘a’ (так как совпадение произошло в первый раз)
      A[1] и A[3] ‘a’ и ‘b’ – не равны => не запоминаем
      A[1] и A[4] ‘a’ и ‘a’ – равны, но запоминаем ТОЛЬКО символ ‘a’ (элемент A[4]), так как до этого A[1] уже запоминался.
(3)  A[2] и A[0] ‘a’ и ‘b’ – не равны => не запоминаем
      A[2] и A[1] ‘a’ и ‘a’ – равны, но НЕ ЗАПОМИНАЕМ, так как символы A[2] и A[1] уже запоминались.
      A[2] и A[2] ‘a’ и ‘a’ – равны, но не запоминаем, так как символ совпал сам с собой
      A[2] и A[3] ‘a’ и ‘b’ –  не равны => не запоминаем
      A[2] и A[4] ‘a’ и ‘a’ – НЕ запоминаем, так как символы A[2] и A[4] уже запоминались.
И т.д.


Если использовать цикл как в этой процедуре:

Код

procedure TForm1.Button1Click(Sender: TObject);
Var A1 : array[0..4] of string;
    a,b: string;
    i,j : integer;
begin
  A1[0] := 'b'; A1[1] := 'a'; A1[2] := 'a'; A1[3] := 'b'; A1[4] := 'a';
  for i := 0 to Length(A1) - 1 do
    for j := 0 to Length(A1) - 1 do
    begin
      if (A1[i] = A1[j])and(i<>j) then
        Memo1.Lines.Add('[ ' + IntToStr(i) + IntToStr(j) + ' ]' + '  ' + A1[i] + A1[j])
    end;
end;


то получается:
[ 0 ][ 3 ]  bb - правильно
[ 1 ][ 2 ]  aa - правильно
[ 1 ][ 4 ]  aa – не правильно, надо запомнить только второй символ ‘a’ (A[4])
[ 2 ][ 1 ]  aa – не правильно, не надо запоминать ничего
[ 2 ][ 4 ]  aa - не правильно, не надо запоминать ничего
[ 3 ][ 0 ]  bb - не правильно, не надо запоминать ничего
[ 4 ][ 1 ]  aa - не правильно, не надо запоминать ничего
[ 4 ][ 2 ]  aa - не правильно, не надо запоминать ничего

Как избавиться от этих «неправильных» запоминаний?

Заранее спасибо всем, кто ответит.

Автор: apook 4.11.2006, 14:05
надо ввести проверку на срвпадение индексов

Автор: MBo 4.11.2006, 14:21
надо поразмыслить, и внутренний цикл начинать не с нуля...

Автор: apook 4.11.2006, 14:45
Код

i:= 0;
While (i<4) Do
   Begin
   j:=0;
   While (j<4) Do
      Begin
      If ((A1[i]=A2[j]) And (i<>j)) Then
         Begin
         Memo1.Lines.Add('[ ' + IntToStr(i) + IntToStr(j) + ' ]' + '  ' + A1[i] + A1[j]);
         End { If };
      j:=j+1;
   End;
   i:=i+1;
  End;


C нуля с нуля
Суть в том что каждый символ первого массива пропускается через все
символы второго столько раз сколько символов в первом массиве

на Cи как то лучше выглядит:
Код

void main()
{
int i, j;
char A1[9] ="123456789", A2[9] ="153897485", *a, *b;

for(i=0; i <9; i++)
{
for(j=0; j <9; j++)
{
    if(A1[i]==A2[j] && i !=j)
    {
        printf("[%d][%d] %c%c\n", i+1, j+1, A1[i], A2[j]);
        }
    }
}
 


Автор: MBo 4.11.2006, 16:42
apook, 
а где у автора речь  идет о двух массивах?

Автор: apook 4.11.2006, 18:45
И точно тогда как то не понятно зачем его сравнивать с собой


Теперь понял фишку

вот код на Cи понравитя можно переделать в Pas

Код

#include "stdio.h"
#include "conio.h"


void main()
{
int i, j, c, a, tmp[9], FLG;
char A1[9] ="12946719";

for(i=0; i<9; i++)    tmp[i] =NULL;

for(i=0,c=0; i <9; i++)
{

for(j=0; j <9; j++)
{
     if(A1[i]==A1[j] && i !=j)
    {

        for(a=0, FLG=0; a<9; a++)
        {
            //if(c ==9)    break;
            if(i ==tmp[a])
            {
                j++;    
                FLG=1;
                break;
                }

            }
        if(FLG==1)    break;
        tmp[c]=j;
        c++;

         printf("[%d][%d] %c%c\n", i+1, j+1, A1[i], A1[j]);

         }
         }
    }
}


 ! 
alexeis1

Модератор: что я должен каждый раз за вас выбирать тип подсветки?

Автор: ARAV 5.11.2006, 06:13
Огромное всем спасибо за быстрые и полезные советы!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)