Palindrom-Programm-Problem
-
Kann sein, dass ich zu blöd bin, aber rufst du überhaupt die funktion palindrom in main() auf?
Ansonsten muss es natürlich wie Wutz geschrieben hat
if (i==1)
oder gleich
if (palindrom())
heißen...
-
Es wäre auch gut, wenn in deinem Code so etwas wie
i = palindrom (wort);
stehen würde
.
Wenn du i==1 geschrieben hättest, hätte dir der Compiler auch eine Warnung ausgespuckt, da du dann eine uninitialisierte Variable verwenden würdest.
Außerdem erscheint mit das Array zu klein, alleine "Reliefpfeiler" würde schon die Grenzen sprengen und zu undef. Verhalten führen.
-
Hm... Ich glaub, ich rufe die Funktion wirklich nicht auf.
... Narf, wie geht das noch mal... *suchen geh*Das mit der Länge ist eh noch so eine Sache
In unserer Aufgabenbeschreibung steht folgendes:
"Fixieren Sie die Dimension des Feldes [N_MAX] (mittels enum) auf
einen Wert, der Ihnen angemessen erscheint."Warum möchten die, dass ich etwas per enum festlege, wenn ich direkt hinter dem char wort direkt die Länge angeben kann?
Ugh, krank lässt sich schlecht denken -.- *grippezeug einschmeiß*
-
Nayamis schrieb:
Warum möchten die, dass ich etwas per enum festlege, wenn ich direkt hinter dem char wort direkt die Länge angeben kann?
Das mit dem enum ist eine Möglichkeit Compilezeitkonstanten festzulegen, denn ein
static const int laenge = 123;
kann man in C nicht als Arraygröße benutzen. Das enum hat dabei aber nicht die Nachteile eines Makros und sollte daher bevorzugt werden.
-
schau dir auch nochmal das scanf genauer an
-
orioon schrieb:
schau dir auch nochmal das scanf genauer an
Was ist denn damit?
-
DirkB schrieb:
orioon schrieb:
schau dir auch nochmal das scanf genauer an
Was ist denn damit?
Würde mich auch interessieren^^
Kann mir jemand die Verwendung eines enums zur Größenfestlegung erklären und warum es besser ist als mit #define..
mfg domi
-
dkra89 schrieb:
Kann mir jemand die Verwendung eines enums zur Größenfestlegung erklären und warum es besser ist als mit #define..
Mit einem enum gibst du einem Wert einem Namen. Wenn du diesen Wert im Quelltest nutzt, dann verwendest du zur besseren Lesbarkeit diesen Namen. Ein weiterer Vorteil ist, sollte sich der Wert einmal ändern. Zum Beispiel du reist in einem Bundesstaat der USA, wo PI 4 und nicht wie normal 3.14.... ist. Dann musst du diesen Wert nur an einer Stelle ändern. In diesen Punkten unterscheiden sich enum und #define (Makros) nicht. Die Vorteile eines enums gegenüber eines Makros sind. Der Präprozessor und der Compiler sind unabhängig, sollten sich Namen überschneiden, dann bekommst du das nicht mit. Ein zweites Resultat daraus ist, dass im Debugger die Namen für die Werte angezeigt werden können, aber die defines alle durch ihren Wert ersetzt wurden. D.h. du brauchst beim Debuggen nicht erst erforschen, wo den der Wert nun wieder her kommt.
-
ah ok vielen Dank!
Wirklich sehr anschaulich erklärt
Dann werd ich das in Zukunft auch mit enums, statt mit Makros, machen!
-
Dankeschön für die Erklärungen
Ich denke, ich habe es jetzt. So sieht es fertig aus:# include <stdio.h> # include <limits.h> # include <ctype.h> # include <string.h> int laenge (char wort []) { int i = 0; while (wort[i] != '\0') i++; return i; } int palindrom (char wort []) { int i, l; l = (laenge (wort)); for (i = 0; i < (0.5*l); i++) { if (tolower (wort [i]) != tolower (wort [l-i-1])) return (0); return (1); } } int main () { enum {N_MAX = 30}; char wort [N_MAX]; printf("Gibt bitte ein Wort ein. \n"); scanf("%s", &wort); if (palindrom (wort)==1) printf ("Das ist ein Palindrom.\n"); else printf ("Das ist kein Palindrom.\n"); return; }
Kann mir jemand sagen, ob ich das enum hierbei richtig verwendet habe? Dabei bin ich mir noch etwas unsicher.
Nun versuche ich es auch noch rekursiv zu machen (Ja, ich darf mich da in die lange Liste der anderen hier postenden einreihen), was bisher so aussieht:
int palindrom (char wort []) { int l; return l ? ((wort[0] == wort[l-1]) && (l > 2 ? palindrom(wort+1, l-2) : 1)) : 0; }
Mein Compiler sagt mir hierbei: "Too many arguments in function palindrom". Wo ist hierbei mein Denkfehler? (Oder Schreibfehler,...)
Gedacht ist: "setze l=1, wenn das hinter dem ? stimmt, sonst setze l=0". In der großen Klammer soll nachgesehen werden, ob der erste und letzte Buchstabe UND der zweite und vorletzte Buchstabe übereinstimmen.
-
Dein Funktion palindrom erwartet nur einen Parameter: das Wort. int palindrom (char wort [])
Du rufst die Funktion aber mit 2 Parametern auf: palindrom(wort+1, l-2)
Du musst die Parameterliste deiner Funktion ändern.
-
Hier ist auch noch was falsch:
scanf("%s", &wort);
enum ist ein Aufzählungstyp und deswegen bei der Verwendung nur eines Elements "overdesigned".