Könnt ihr mir bei folgender Aufgabe helfen?? C++ 

  • Ersteller Ersteller fireyoutz
  • Erstellt am Erstellt am
Status
Für weitere Antworten geschlossen.
F

fireyoutz

Hi Leute...
Also wir haben heut folgende Aufgabe gestellt bekommen:

Ein Palindrom ist ein Wort oder Satz, das bzw. der von vorn und von hinten gelesen den gleichen Wortlaut besitzt, z.B.:

OTTO
REITTIER
LAGERREGAL
RELIEFPFEILER
EIN NEGER MIT GAZELLE ZAGT IM REGEN NIE
NEUER DIENST MAG AMTSEID REUEN
DIE LIEBE TOTE! BEILEID!

Das Programm soll testen, ob eine eingegebene Zeichenkette ein Palindrom ist oder nicht!
Beachten Sie, dass bei Sätzen keine Satzzeichen eingegeben werden dürfen und die Leerzeichen zwischen den Wörtern zu ignorieren sind!


Hier ist der Code:

#include
#include
#include
#include
#include
#include

void main()
{
char text[201];
unsigned int i, j;
bool palindrom = true;

cout
cout cin.getline(text, 200);
for (i=0, j=strlen(text)-1;i {
while (text == ' ')
i++;

while (text[j] == ' ')
j--;

if (text != text[j])
{
palindrom = false;
break;
}
}

if (palindrom == true)
cout else
cout
getchar();
}

Meine Frage:
Kann mir jemand genau erklären wie die FOR schleife arbeitet, also warum
j=strlen(text)-1;iund wie ist das zu verstehen??:
while (text == ' ')
Außerdem bin ich der Meinung dass in diesem Lösungsbeispiel unötige Headerdatein eingebunden sind...
Wäre über eure Hilfe sehr froh!
Greetz fireyoutz
 
Hi fireyoutz,
Ich habe dein Prog ein wenig überarbeitet und unnötige Sachen auskomentiert

Code:
//#include 
//#include 
#include 
//#include 
//#include 
//#include 

using namespace std;

int main()
{
char text[201];
unsigned int i, j;
bool palindrom = true;

cout 
cout 
cin.getline(text, 200);

for (i=0, j=strlen(text)-1;i2);i++, j--)
{
while (text[i] == ' ')
i++;

while (text[j] == ' ')
j--;

if (text[i] != text[j])
{
palindrom = false;
break;
}

}

if (palindrom == true)
cout else
cout 
//getchar();
}

Die MAIN Methode muss INT zurück liefern.
Die WHILE Schleifen sind dazu da, um die eventuelen Leerstellen aus dem String rauszufiltern
Außerdem habe ich die FOR schleife ein bischen veränert (i2)),
da es schon reichen würde wen die Zeichen kette nur bis zur Hälfte durchlaufen wird (verkürzt die Laufzeit ;) )
P.S. uüber die Arbeitsweise einer FOR Schleife kannst du z.b hier nachlesen:
ht*p://tutorial.schornboeck.net/schleifen.htm
 
Ok schonmal Vielen Dank! Sieht man mal des der ObercodingLehrer es schlechter drauf hat wie ihr... :D
Die arbeitsweise einer FOR Schleife ist mir NATÜRLICH schon bekannt :)
Aber mir ist hier net klar was des mit den Stringlängen auf sich hat.
Kannst mir vielleicht die genaue abarbeitung noch beschreiben?? Also z.b. wenn ich OTTO eingebe...
Nochmal BIG THX!!!
 
Nun, i und j als Zaehler fuer deine Schleifenfuehrung benoetigen einen Start- und natuerlich auch eine Abbruchbedingung. In deinem Beispiel wird i dem ersten Element (Zeichen) deines Strings zugeordnet (Element text[0]), und j auf das Ende des Strings gesetzt. Die Laenge, also das Ende des Strings, wird ermittelt durch die Funktion strlen(), welche die Laenge eines Strings als Integerwert liefert. Wir muessen noch 1 abziehen, damit j nicht hinter dem String ansetzt (denk dran, das erste Zeichen der Zeichenkette ist das Element text[0], wir fangen also bei 0 an zu zaehlen). Wuerden wir die 1 nicht abziehen, wuerde j den String-Terminator ansprechen und nicht das letzte Zeichen des Strings.
Abbruchbedingung fuer die Schleifenfuehrung ist: i2) --> (hier koennte noch kuerzer stehen: ii und j werden nach jedem Schleifendurchlauf hoch-, bzw. runtergezaehlt (und treffen sich irgendwann in der Mitte des Strings!)

Beispiel OTTO:
text[0] = O
text[1] = T
text[2] = T
text[3] = O
text[4] = String Terminator (ASCII 0)

i=0, also text = 'O'
strlen(text) liefert 4 (text ist ja auch 4 Zeichen lang)
es muss also 1 abgezogen werden, damit j auf Element [3] landet.
text[j] = 'O'
-------------------------------------
while (text == ' ')
i++;

while (text[j] == ' ')
j--;

damit werden Leerzeichen einfach uebersprungen, das heisst i oder j hoch- u. runtergezaehlt
----------------------------------------
die iomanip.h und die time.h kannst du in deinem Code rausschmeissen, dafuer fehlt die allerdings die string.h (fuer die strlen()-Funktion)

hoffe, ich konnte helfen
 
Zuers eine kleine korrektur, bei der FOR Schleife fehlt was
so wäre es korrekt: for (i=0, j=strlen(text)-1;i2);i++, j--)
war mein fehler ;)

Also.....
Zuerst wird i auf 0 gesetzt und j auf die Länge von "text" - 1(in unserem Fall liefert uns strlen() also 4 zurück und -1 = 3)
Warum das so sein muß? Weil unsere Zeichenkete in einem feld von typ char gespeichert wird
und die indexierung bei einem Feld beginnt Typischerweise bei 0, also haben wir ein Feld dessen
einzelne Elemente wir mit text[0] bis text[3] ansprechen können, insgesamt 4 Elemente,
darum strlen(text)-1. Weiter folgt ein Abbruch Kriterium für die Schleife, die wird durchlaufen
solange bis wir die Hälfte des Arrays erreicht haben. In jedem Schrit wird die Variable i um 1 vergrössert und j um 1 verkleinert. Jetzt gehen wir rein in die Schleife. Zuerst wird in der ersten
WHILE schleifen geprüft ob text auf eine Leerstelle zeigt, das ist aber nicht der Fall da
text == text[0] und an der stelle steht die Buchstabe 'o' also wird direkt zu der nächsten Schleife
übergegangen. Da prüfen wir ob text[j] auf eine Leerstelle zeigt. Das ist auch nicht der Fall weil
text[j]==text[3] und an der stelle steht die Buchstabe 'o'. Dan kommt die IF anweisung wo geprüfft
wird ob text und text[j] ungleich sind, was auch nicht der Fall ist da die beiden auf die
Buchstabe 'o' zeigen. Danach geht die Schleife von vorne los blos mit anderen werten für j und i.
text[j] zeigt jetzt also auf die 3. Stelle in unserem Feld (text[2]) und text zegt auf die Stelle 2 (text[1]). Und so geht es weiter bis unsere Abbruchkriterium erreicht ist. :)
Ich hofe dass das was ich da geschrieben habe einigermasen verständlich war :)
Sorry für mein Deutsch, ist nicht meine Muttersprache.
 
oooooops, ich war ein bischen zuspät, da hat sich chon jemand mühe gemacht und das gnze
ausführlich erklärt :)
 
Ach ja, die lösung für das Abbruchkriterium von juergen ist natürlich noch besser
 
Super Jungs Vielen Dank!!! :D Habt mir echt voll geholfen!!
Greetz
fireyoutz
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten