Prosiłbym o przeanalizowanie proponowanych prze zemnie rozwiązań, podpowiedzenie co jest nie tak, czy zasugerowanie całkiem innego pomysłu.
- Kod: Zaznacz cały
// Jakie pola przeszukiwać
int szukaj[7] = {0, 0, 0, 0, 0, 0, 0};
// Indexy dla poszczególnych przeszukiwanych pół
int index[8] = {0, 0, 0, 0, 0, 0, 0, 0};
// Tablica dla znalezionych produktów w poszczególnych polach
int tab[7][5000];
for(int i = 0; i < 7; i++)
for(int j = 0; j < 5000; j++)
tab[i][j] = 0;
// Końcowa tablica
int finish[5000];
for(int i = 0; i < 5000; i++)
finish[i] = 0;
// Sprawdzenie kryteriów wyszukiwania
if(ComboBox1->Text != "")
szukaj[0] = 1;
if(ComboBox2->Text != "")
szukaj[1] = 1;
if(ComboBox3->Text != "")
szukaj[2] = 1;
if(Edit1->Text != "")
szukaj[3] = 1;
if(Edit2->Text != "")
szukaj[4] = 1;
if(Edit3->Text != "")
szukaj[5] = 1;
// Po tej operacji wiemy po jakich polach nasz użytkownik chce wyszukiwać.
// Zmienna flagowa do sprawdzenia czy sa jakie kolwiek kryteria wyszukiwania.
bool ok = 0;
// Zmienna zliczająca ilośc kryteriów wyszukiwania
int ile = 0;
// Sprawdzenie kryteriów wyszukiwania
for(int i = 0; i < 7; i++)
{
if(szukaj[i] )
{
ok = 1;
ile++;
}
}
if(ok)
{
int i = 0;
while(Produkt[i].getId())
{
// Wyszukanie produktów odpowiadającym - Dystrybutowi
if(szukaj[0])
if(ComboBox1->Text == Produkt[i].getDystrybutor())
{
tab[0][index[0]] = Produkt[i].getId();
index[0]++;
}
// Wyszukanie produktów odpowiadającym - Producentowi
if(szukaj[1])
if(ComboBox2->Text == Produkt[i].getProducent())
{
tab[1][index[1]] = Produkt[i].getId();
index[1]++;
}
// Wyszukanie produktów odpowiadającym - Typ
if(szukaj[2])
if(ComboBox3->Text == Produkt[i].getTyp())
{
tab[2][index[2]] = Produkt[i].getId();
index[2]++;
}
//... i tak dla pozostałych 3
//...
//...
i++;
}
}
else
{
ShowWindowError("Nie wprowadzono kryteriów wyszukiwania!");
}
// Uzupełnienie tabeli finish dla 1 kryterium
if(ile == 1)
{
// Pętla - w celu znaleziania dla którego kryterium przeprowadzono wyszukiwanie
for(int i = 0; i < 7; i++)
{
if(szukaj[i])
{
for(int j = 0; j < index[i]; j++)
{
finish[j] = tab[i][j];
index[7]++;
}
// Zakończenie uzupełniania tabeli finish
break;
}
}
}
if(ile > 1)
{
// Zmienna sprawdzająca czy jest to pierwsze przejście pętli
bool first = 0;
for(int m = 0; m < 7; m++)
{
if(!first)
{
for(int n = 0; n < index[m]; n++)
{
finish[n] = tab[m][n];
index[7]++;
}
first = 1;
}
else
{
// Tablica przetrzymująca wynik z następnego wiersza i finish
int found[5000];
for(int i = 0; i < 5000; i++)
found[i] = 0;
// Index dla tablicy found
int index_found = 0;
for(int n = 0; n < index[7]; n++)
{
for(int i = 0; i < index[m]; i++)
{
int x = finish[n];
int y = tab[index[m]][i];
if(finish[n] == tab[index[m]][i])
{
found[index_found] = finish[n];
index_found++;
}
}
for(int i = 0; i < index[7]; i++)
finish[i] = 0;
index[7] = 0;
for(int i = 0; i < index_found; i++)
finish[i] = found[i];
}
}
}
if(ok)
{
ListView1->Clear();
for(int i = 0; i < index[7]; i++)
{
int id = 0;
while( Produkt[id].getId() )
{
if(Produkt[id].getId() == finish[i])
{
TListItem * item;
item = ListView1->Items->Add();
item->Caption = AnsiString( Produkt[ id ].getDystrybutor() );
item->SubItems->Add( Produkt[ id ].getProducent() );
item->SubItems->Add( Produkt[ id ].getTyp() );
item->SubItems->Add( Produkt[ id ].getFaktura() );
item->SubItems->Add( Produkt[ id ].getKod() );
item->SubItems->Add( Produkt[ id ].getSterial() );
item->SubItems->Add( Produkt[ id ].getGwarancja() );
item->SubItems->Add( Produkt[ id ].getData() );
item->SubItems->Add( Produkt[ id ].getIlosc() );
item->SubItems->Add( Produkt[ id ].getInfo() );
item->SubItems->Add( Produkt[ id ].getId() );
bool icon = 0;
if(Produkt[ id ].getTyp() == "Karta sieciowa")
{
item->ImageIndex = 1;
icon = 1;
}
if(!icon)
{
item->ImageIndex = 0;
}
}
id++;
}
}
}
Algorytm działa poprawnie tylko dla 1 kryterium.







