Hi, ich wollte ein Programm schreiben, das ganz viele eingegebene Zahlen eines Memo Feldes überprüft und ggf. doppelte ausgibt.
Das Problem: Es gibt bei mehreren doppelten Zahlen auch mehrmals die doppelten aus. Aber es soll zum Beispiel bei der Eingabe "1111" nur "1" ausgeben, weil 1 ist nunmal doppelt, wie oft ist vollkommen egal.
Quelltext:
void __fastcall TfrmMain::edtEingabeKeyDown
(TObject *Sender, WORD &Key,TShiftState Shift)
{
if(Key==VK_RETURN){
Zahlen[i]=StrToInt(edtEingabe->Text);
memoEingabe->Lines->Add(IntToStr(Zahlen[i]));
i++;
edtEingabe->SelectAll();
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnEingabeClick(TObject *Sender)
{
for (int d=0; d!=i; d++)
{
for(int c=d+1;c!=i;c++){
if (Zahlen[d] == Zahlen[c])
{
memoAusgabe->Lines->Add(Zahlen[c]);
}
}
}
}
Mir ist schon klar warum das so ist. ABer wie kann ich denn Zahlen[c] selber an Positionen überprüfen ? Zahlen[c(2,0)] oder Ähnliches funktioniert nicht.
Möchte einfach wissen wie ich von Arrays Stellen ausgeben kann.
GreeTz Selecta
P.S: Komplette Lösungen akzeptiere ich auch ;)
Programmieren - alles kontrollieren 4.937 Themen, 20.662 Beiträge
Gut, das ist was anderes.
Das problem liegt in den zwei schleifen. Diese bewirken, dass nur die zahlen ausgegeben werden, die später im array nochmal auftauchen, d.h. alle zahlen werden n*(n-1)/2 mal ausgegeben, wenn n ihre anzahl im array ist. Zahlen die es nur einmal gibt, tauchen nie auf (wegen if (Zahlen[d] == Zahlen[c]) und d!=c).
Zudem läuft die erste schleife zu weit, was die zweite schleife zwar einfach korrigiert, aber die unglückliche formulierung der schleifenendbedingung macht so etwas sehr fehleranfällig (z.b. aus versehen bei d+2 beginnen und dann kommt die seeeeeehr lange schleife weil c!=i übersprungen wird).
Die richtige lösung müsste so aussehen (ohne sortieren, einfach brute force):
memoAusgabe->Lines->Add(Zahlen[0]);//gibt es auf jeden fall, ausgeben
for (int d=1; d<i; d++){//prüfe Zahlen[d] beginnend bei d=1
for(int c=0;c<d;c++){
if (Zahlen[d] == Zahlen[c])//oops, gibt es schon und wurde darum auch schon ausgegeben
break;//beende "for c" und mache bei "for d" weiter
memoAusgabe->Lines->Add(Zahlen[d]);//ok, Zahlen[d] taucht zum ersten mal auf
}
}
mr.escape