Hi, wir sollen ein Programm schreibem, das alle (a) e i o u in a\'s umwandelt. Etwa "Drei Chinesen" in "Dra Chanasan".
Mein Quelltext macht dies zwar, aber er bei mir kommt (was klar ist):
"Draa Chanasan" raus, also 2x a wegen "e" und "i". Nun habe ich mir überlegt wie ich diese Doppel-Buchstaben umgehe. Meine Idee seht ihr anhand der 2. IF Anweisung:
AnsiString Quelle="aeiou",
Ziel ="aaaaa";
int k;
AnsiString konv;
for (int i=1;i k=1;
int help;
help = i-1;
while(k k=k+1;
}
if(k KonvText.Delete(i,1);
KonvText.Insert(Ziel.SubString(k,1),i);
}
// BIS HIERHIN GEHT ES, ABER HALT MIT DEN DOPPELBUCHSTABEN
if(Ziel.SubString(k,1),help == Ziel.SubString(k,1),i) {
KonvText.Delete(i,1);
}
}
So aber ich merke gerade das das Müll ist, aber ich hab gerade echt keinen Schimmer. Meine Idee war halt, das ich vergleiche ob 2 gleiche Zeichen (dewegen i und help = i-1)) nebeneinader liegen und wenn JA dann das erste löschen. Aber so funktioniert das nicht. Bitte helft mir mir,
ICh bitte euch ausnahmsweise KEINE neuen Sachen einzubauen, denn ich versteh das eh nicht.
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
//Dreichinesen.cpp -Sicromoft- [www.EQuark.tk]
#include
spitzeklammerauf klasse spitzeklammerzu
jaja naürlich must du "iostream" und "string" einbinden lol
Beim posten von quelltext müssen die spitzen klammern (zumindest die öffnende "<") codiert angegeben werden.
Also statt z.b.
for(i=0;i<10;i++){}
muss das stehen
for(i=0;i<10;i++){}
oder bei
#include <string.h>
eben
#include <string.h>
Es gibt wohl auch tools und editoren, die aus sourcecode html machen können und auch online gibt es sowas (z.b. CodeColorizer -- The online source code syntax highlighter for ASP C C++ Clipper Delphi HTML Java JavaScript Pascal Visual Basic)
mr.escape
War das jetzt ein Fehler das ich euch vorenthalten habe, das ich das ganze mit dem C++ Builder gemacht habe... ? Ist eine Windows Anwendung. Weil ich habe keinen Plan was ihr da geschrieben habt. Ich will doch nur den Text an Stelle A mit dem Text an Stelle A+1 vergleichen und wenn der gleich ist A löschen. Mehr nicht. Die Strings funktionieren doch.
GreeTz Selecta
ACHTUNG
Damit wär das ein für alle mal geklärt...
http://mitglied.lycos.de/sicromoft/dc.txt
CU
DaWoo
Statt umlaut(bzw. uml) wäre "vokal" angebrachter ;)
und statt
if (uml(StrE[i+1])){
//wenn position i+1 auch ein umlaut ist
} //skippen
else //sonst "a" erfassen
sollte
if (i==0 || !uml(StrE[i-1]))
stehen, da ansonsten am ende der zeichenkette ein zeichen hinter dem ende getestet würde (i+1).
mr.escape
Tatsache ^^ Bin wohl ein Pisa Opfer
Oder-Nicht Verknüpfung cool, soweit war ich noch nicht gegangen in C
-hab die txt nochmal updated-
trotzdem wird im Durchgang 0 bei dir StrE[-1] geprüft ABER
ich habs getestet (leerer string position -100 bis +100 lesen) und festgestellt das in diesen fällen immer leerzeichen zurückgegeben werden. kein Datenmüll oder so. (nur mit Schreiben klappts halt nicht hehehe).
Trotzdem ist deine Version Smarter ;)
Aber nur wenn der compiler komplett defekt ist. Bei i==0 wird die bedingung nämlich schon erfüllt und damit findet die zweite prüfung nicht statt. Darum ist auch die reihenfolge wichtig.
mr.escape
Danke, aber hab's nun so gemacht:
for (int i=1;i if (KonvText[i] == 'a' && KonvText[i+1] == 'a') {
KonvText.Delete(i,1);}
Das habe ich außerhalb der if-Schleife geschieben, d.h. am Ende überprüft er dies.
Das musst ich lediglich mit eiou noch machen. Klappt einwandfei.
Das ist eine Lösung die ich logisch finde.
Trotzdem danke an alle.
Ich kenne die details zu AnsiString nicht, nehme aber an, dass das erste zeichen den index 0 hat und das letzte Length()-1 (mir fällt auf anhieb kein fall mit einem startindex!=0 ein).
Wenn das stimmt, ist die schleife zwei zeichen zu lang (einmal wegen "<=" statt "<" und überprüft dazu auch noch das letzte zeichen, ob dahinter noch etwas bestimmtes ist -> kann ja nicht, ist ja schließlich das letzte!), lässt dafür aber das erste zeichen aus.
Statt:
for (int i=1;i<=KonvText.Length();i++) {
müsste es damit:
for (int i=0;i<KonvText.Length()-1;i++) {
heißen.
mr.escape
Noch was zum löschen.
Nachdem ein zeichen gelöscht wurde, rutscht ja der ganze rest nach vorne. Beim nächsten durchgang der "for(i ..."-schleife wird das aber nicht beachtet, also ein zeichen nicht geprüft. Darum muss die anweisung bei doppelten zeichen statt:
{
KonvText.Delete(i,1);
}
so lauten:
{
KonvText.Delete(i,1);
i--;
}
durch das i--; wird das i++ im for befehl kompensiert und an der selben stelle nach dem löschen erneut getestet (ist nichts mehr zum testen da, endet die schleife).
mr.escape