Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Сравнение элементов массива 
V
    Опции темы
ARAV
Дата 4.11.2006, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



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

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 - не правильно, не надо запоминать ничего

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

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

Это сообщение отредактировал(а) alexeis1 - 4.11.2006, 20:24
PM MAIL   Вверх
apook
Дата 4.11.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



надо ввести проверку на срвпадение индексов



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
MBo
Дата 4.11.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 7
Всего: 18



надо поразмыслить, и внутренний цикл начинать не с нуля...
PM MAIL   Вверх
apook
Дата 4.11.2006, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



Код

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]);
        }
    }
}
 



Это сообщение отредактировал(а) alexeis1 - 4.11.2006, 20:19


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
MBo
Дата 4.11.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 10.6.2002

Репутация: 7
Всего: 18



apook, 
а где у автора речь  идет о двух массивах?
PM MAIL   Вверх
apook
Дата 4.11.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 10
Всего: 23



И точно тогда как то не понятно зачем его сравнивать с собой


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

вот код на 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

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


Это сообщение отредактировал(а) alexeis1 - 4.11.2006, 20:30


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
ARAV
Дата 5.11.2006, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.10.2006

Репутация: нет
Всего: нет



Огромное всем спасибо за быстрые и полезные советы!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0868 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.