Zeichenkettenvergleichen?
-
Ich denke du hast das so gemeint, oder?
#include<stdio.h> #include<ctype.h> #include<string.h> void string_einlesen(char *string, char *string_umgedreht, int len) { int i = 0; char zeichen; zeichen = getchar(); //Zeichenkette aufnehmen while(zeichen != '\n') { *string = tolower(zeichen); zeichen = getchar(); string = string + 1; len = len + 1; } *string = '\0'; string = string - len; while(i != len) //strin nach string_umgedreht kopieren { *string_umgedreht = *string; string = string + 1; string_umgedreht = string_umgedreht + 1; i = i + 1; } *string_umgedreht = '\0'; } void string_umdrehen(char *string, char *string_umgedreht) { int i = 0; if(strcmp(string, string_umgedreht) == 0) //beide strings vergleichen { printf("%s ist ein Palindrom!", string); } else { printf("%s ist kein Palindrom!", string); } } int main() { char string[100], string_umgedreht[100]; int len = 0; string_einlesen(string, string_umgedreht, len); string_umdrehen(string, string_umgedreht); return 0; }
-
Du brauchst doch nur das erste mit dem letzten, das zweite mit dem vorletzten, das dritte mit ... Zeichen vergleichen. (ohne strcmp gleich in dem eingelesenen string)
Das kannst du statt string_umdrehen machen, da du da ja schon eine Schleife hast.
Die Länge sollte die Funktion auch selber feststellen.
-
Schau dir mal Palindrom-Programm-Problem von gestern hier im Forum an.
http://www.c-plusplus.net/forum/280271
-
ich habe es jetzt nicht selber probiert,
aber elegant wäre sicherlich eine for schleife mit 2 variablen. die eine vom anfang des strings vorwärts, die andere vom ende rückwärts.
abbruchbedingung bei anfangsvariable >= endvariable
-
bandchef schrieb:
Aber: Ich verstehe nicht wie ich das umdrehen ganz bleiben lassen kann. Ich mein, ich brauch ja sowieso zwei Zeichenketten die ich miteinander mit strcmp vergleichen kann, oder?
Nö, warum? Habe ich dir doch eben geschrieben. Aber hast du, wie immer, nicht einmal versucht drüber nachzudenken. Dabei stand da alles schon haarklein erklärt, bloß ohne Code.
Aber hier haste deine Hausaufgaben:
#include<stdio.h> #include<ctype.h> #include<string.h> int string_einlesen(char *string, int max) { char zeichen; int len = 0; while (len<(max-1) && (zeichen=getchar())!='\n') { *string = tolower(zeichen); ++string; ++len; } *string = '\0'; return len; } int ist_palindrom(const char* string, int len) { int i; for (i=0; i<len/2; ++i) if (string[i]!=string[len-1-i]) return 0; return 1; } int main() { char string[100]; int len = string_einlesen(string, 100); if (ist_palindrom(string, len)) puts("Palindrom\n"); else puts("Kein Palindrom\n"); return 0; }
Beachte auch die Änderungen an anderen Programmteilen.
Im übrigen würde ich es begrüßen, wenn du nicht nur zu jedem kleinen Problemchen Fragen stellen würdest, sondern auch mal versuchen würdest über die Antworten nachzudenken und etwas daraus zu lernen. Es ist sehr frustrierend dir zu helfen, wenn man weiß, dass du Antworten gar nicht erst durchliest sondern nur darauf wartest bis jemand Code postet, den du dann ohne Nachdenken übernimmst und bei der nächsten Aufgabe wieder hier fragst.
Welche Abschlussnote bekommst du/das Forum eigentlich voraussichtlich an deiner Schule?
-
Du brauchst doch nur das erste mit dem letzten, das zweite mit dem vorletzten, das dritte mit ... Zeichen vergleichen. (ohne strcmp gleich in dem eingelesenen string)
Das kannst du statt string_umdrehen machen, da du da ja schon eine Schleife hast.
Die Länge sollte die Funktion auch selber feststellen.
Sorry, aber ich kapier einfach nicht wie ich das Zeichenweise vergleichen soll... Damit ich überhaupt was vergleichen kann, muss ich doch zwei Zeichenketten bzw. wenigstens zwei unterschiedliche char Variablen haben!
-
Aus dem Beispiel:
string[] = "ABCDCBA"; // 0123456 len = strlen(string); // == 7 for (i=0; i<len/2; ++i) // von 0 bis 3 if (string[i]!=string[len-1-i]) return 0; /* i | len-1-i | string[i] | string[len-1-i] 0 | 7-1-0 = 6 | A | A 1 | 7-1-1 = 5 | B | B 2 | 7-1-2 = 4 | C | C 3 | 7-1-2 = 3 | D | D vergleich nicht nötig */
Alles klar?
-
Nein ich verstehe es nicht.
Was soll das return da? Das gibt mir im beim ersten auftretenden gleichen Buchstaben eine 1 zurück und haut mich dann doch danach gleich aus der for-Schleife raus. Und jetzt? Ich muss doch bis zur hälfte des Wortes prüfen ob der erste mit dem letzten Buchstaben identisch, ob der zweite mit dem vorletzten Buchstaben identisch ist usw...
Und genau deshalb weiß ich doch noch lange nicht ob das Wort ein Palindrom ist, oder?
Edit: Halt jetzt glaub ich hab ichs verstanden. Code gibts gleich...
#include<stdio.h> #include<ctype.h> #include<string.h> void string_einlesen(char *string) { char zeichen; zeichen = getchar(); while(zeichen != '\n') { *string = tolower(zeichen); zeichen = getchar(); string = string + 1; } *string = '\0'; } int string_vergleichen(char *string) { int i, len = 0; len = strlen(string); for(i=0; i<(len/2); i=i+1) { if(string[i] != string[len-1-i]) { return 0; } } return 1; } int main() { char string[100]; string_einlesen(string); if(string_vergleichen(string) == 1) { printf("%s ist ein Palindrom!", string); } else { printf("%s ist kein Palindrom!", string); } return 0; }
So sollte es gehen
-
wow... bis auf ein paar namensänderungen haargenau der gleiche code wie von SeppJ... ich teile die meinung von Sepp vollkommen. Ich meine, ich hab auch
mal letztes jahr wegen einer hausübung hier fragen gestellt, aber das wars dann
auch wieder. aber jeder 2. thread von dir beinhaltet beinahe das gleiche wie
der letzte... entweder geht es darum dass du hü´s machen musst oder dass du
etwas fragst, welches im letzten thread bereits geklärt wurde. ich hab ne
mitschülerin, welche ich ein und die selbe "funktion" 20 mal erklären musste,
bis sie mal bereit war diese auch anzuwenden (ich spreche vom printf...
, dass war ganz am anfang von der ausbildung)
mittlerweile bei den jetzigen themen, kann ich ihr einen algorithmus 20-30 mal
erklären und sie checkt es nicht... schlussendlich ist es dann so dass ich ihr
einfach die lösung hinschreibe, bevor ich ausraste und ein masaker passiert.du bist ähnlich, mit einziger ausnahme, du tust wenigstens irgendwas. ich
empfehle dir dringenst: lerne bzw. repetiere die grundlagen immer wieder mal,
dadurch geht dir vieleicht mal ein licht auf. und bevor du bei einer aufgabe
dich einfach hinsetzt und drauflos programmierst, überleg dir das ganze in einem
struktogramm durch. ich weiß, ist eklig und mühsam... aber manchmal hilfts
einfach. ich machs zu 80% ohne struktogramm, aber bei dingen wie mein versuch
ein spiel zu programmieren, hab ich auch vorher mit zeichnungen, notizen, struk-
togrammen angefangen.probiers mal so rum, wär sicherlich einfacher =b
-
Ich sehe ein Problem auf bandchef zukommen, welches sich Klausur nennt. Denn er postet hier wöchentlich etliche Threads mit Hü`s die er alle nicht selbst lösen kann. Auch wenn er jedesmal die Lösung bekommt zweifel ich stark, daran , dass er die Lösung bei einem ähnlichen Problem auch einsetzen kann.
-
so sehe ich das auch, also wegen den klausuren... ich habe die letzten
5 klausuren jedes mal mit voller punktzahl abgeschlossen (ok, dennoch
fehlt es mir bei manchen dingen an verständnis [liegt wohl an den professoren?])
und habe dafür so gut wie nichts gelernt. im vergleich zu bandchef wird es bei
ihm so sein: viel lernen und hoffen das es positiv ist. wobei bei ihm noch lange
nicht hopfen und malz verloren ist, irgendwas kann er ja. das einzige was daran
stört ist das "irgendwas" =b