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
Zuerst etwas grundsätzliches:
Wenn es nicht ausdrücklich erforderlich ist, sollte:
for (int d=0; d!=i; d++)
oder auch
for(int c=d+1;c!=i;c++)
dringend vermieden und stattdessen lieber:
for (int d=0; d<i; d++)
bzw.
for(int c=d+1;c<i;c++)
geschrieben werden.
Das problem mit "1111" und "1" ist laut frage eigentlich keines, denn "1111" und "1" sind unterschiedliche zahlen. Lediglich die ziffern sind gleich.
Die verwendung von StrToInt() verweist auf das interesse nach zahlen und nicht nach ziffern!
Wenn aber doch ziffern gemeint sein sollten (also höchstens die gigantische menge von zehn unterschiedlichen), dann müsste direkt edtEingabe->Text verarbeitet werden.
z.b.:
//annahme: edtEingabe->Text ist ein char*
//wenn nicht: umwandeln bzw. sicherstellen, dass der [] operator das erwartete macht
//und ersatz von strlen() durch die passende funktion
int stlen=strlen(edtEingabe->Text), actpos;
for(actpos=0;actpos<stlen;actpos++){
//!!! ACHTUNG hier werden einfache und nicht doppelte hochkommata verwendet !!!
if(edtEingabe->Text[actpos]>='0' && edtEingabe->Text[actpos]<='9'){
Zahlen[i]=edtEingabe->Text[actpos]-'0';
memoEingabe->Lines->Add(IntToStr(Zahlen[i]));
i++;
}
}
Die ausgabe im anschluss kann eine benutzung von qsort() gewaltig beschleunigen (besonders bei "ganz viele eingegebene Zahlen")
mr.escape