Palindrome



  • Hallo,
    ich habe heute eine Aufgabe in der Schule bekommen. Ich soll ein Programm schreiben, dass ein Wort einliest, es Rückwärts wieder ausgibt und angibt wie viele Elemente sich in dem String befinden. Außerdem soll das Programm dann noch überprüfen ob es sich um ein Palindrom handelt.
    Als Tipp wegen der Groß- und Kleinschreibung hat uns unser Lehrer auf tolower() hingewiesen. Das hatten wir noch nie benutzt und irgendwie weiss ich nicht wie ich es anwenden soll.

    Mein Code lautet:

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    int main()
    {
    
        char a[30];
        char b[30];
        int i;
    
        printf("Geben Sie ein Wort ein: ");
        scanf("%s", tolower(a));
        printf("Sie haben %d Elemente eingegeben\n",strlen(a));
    
        for(i=strlen(a)-1; i>=0; i--)
        {
        printf("%c", a[i]);
        }
    
        printf("\n\n");
    
        strcpy(b,a);
        strrev(b);
    
        if(strcmp(a,b)==0)
        {
            printf("Das eingegebene Wort ist ein Palindrom!\n");
        }
        else
        {
            printf("Das ist kein Palindrom\n");
        }
    
        return 0;
    
    }
    

    Es funktioniert soweit alles, nur das mit dem tolower() macht mir sorgen.
    Kann mir wer sagen wie ich diese Funktion richtig anwende? Weil wenn ich jetzt z.B. Anna mit einem großen Anfangsbuchstaben eingebe, bekomme ich zurück, dass es kein Palindrom ist, dies soll aber vernachlässigt werden - eben durch die tolower() Funktion.

    Vielen Dank



  • GustavGünter schrieb:

    scanf("%s", tolower(a));
    

    lol
    Schaue dir die Spezifikation der Funktion an, bevor du sie einsetzt.
    tolower arbeitet mit Zeichen, nicht mit Zeichenketten.
    strrev ist kein Standard.
    Baue dir eine Hilfsfunktion, mit der du alle (ASCII)Buchstaben Strings in Kleinbuchstaben wandelst, dafür kannst du tolower verwenden.
    Es gibt auch eine Funktion strlwr, die das macht, ist aber auch kein Standard, also NICHT benutzen.
    Wieso machst du dir die Mühe, den String rückwärts auszugeben, wenn du später sowieso den ganzen String umdrehst?

    1. schreibe dir eine Hilfsfunktion mystrlwr (die alle ASCII-Buchstaben in Kleinbuchstaben wandelt)
    2. schreibe dir eine Hilfsfunktion mystrrev, die einen String umdreht
    3. wende diese beiden neuen Funktionen an


  • Mod

    Wutz schrieb:

    GustavGünter schrieb:

    scanf("%s", tolower(a));
    

    lol
    Schaue dir die Spezifikation der Funktion an, bevor du sie einsetzt.
    tolower arbeitet mit Zeichen, nicht mit Zeichenketten.

    Das ist deine Kritik an diesem Konstrukt? 😮 Da haette ich von dir mehr erwartet. Vielleicht etwas zur Sprachphilosophie, dass C eben einfach nicht so funktioniert, dass Audreucke von aussen nach innen abgearbeitet werden und nicht, wie hier anscheinend angenommen, irgendwie wild gemischt.

    @Threadersteller: Wie schon angedeutet, hast du eine falsche Vorstellung, wie eine imperativ/prozedurale Sprache wie C funktioniert. Prozeduren/Funktionen nehmen beim Aufruf Werte entgegen, arbeiten mit diesen und geben einen Wert zurueck. Unter gewissen Umstaenden kann es auch so aussehen, als wuerden sie die uebergebenen Werte aendern*.
    Was du hier also geschrieben hast ist der Aufruf der Funktion tolower mit dem Argument a. Dann wird scanf mit dem Rueckgabewert der Funktion tolower aufgerufen. Das ist folglich ganz was anderes als das Aufrufen der Funktion scanf mit Argument a und dann anwenden von tolower auf a. Die ganze Idee, dass so zu machen, wie du es hier gezeigt hast, kann in C nie funktionieren. Und auch in keiner anderen Sprache. Das passt einfach nicht von der Reihenfolge her, dass der Aufruf von tolower innerhalb des Aufrufs von scanf steht. Das tolower soll ja erst geschehen, wenn scanf sein Ding gemacht hat.

    *: Ich muss hier alles im Konjunktiv schreiben, denn in C gibt es kein echtes "call-by-reference", wie es manche andere Sprachen kennen. Eine Funktion in C kann nie die uebergebenen Werte aendern, denn sie bekommt nur eine Kopie der Werte (call-by-value). Wenn man aber nicht den eigentlichen Wert an die Funktion uebergibt, sondern einen Zeiger auf diesen Wert, dann kann die Funktion ueber ihre Kopie dieses Zeigers auf den Originalwert zugreifen und diesen aendern. So arbeiten scanf & Co und das ist der Grund, warum scanf Zeiger erwartet, printf hingegen nicht.



  • Naja nach 1 1/2 Monaten Programmiererfahrung hab ich halt noch keine Anhung/Gefühl was ich machen darf und was nicht.(Besonders da unser Lehrer am Ende der Stunde nur den Begriff "tolower()" an die Tafel schrieb und sagte: "Eine kleine Hilfestellung" 😡 )

    Ich habe es noch immer icht hinbekommen. Das scanf hab ich durch gets(a) ersetzt und Zeile 21 sieht jetzt so aus:

    printf("%c", tolower(a[i]));

    jetzt wird wenigstens schon mal das Wort, dass Rückwärts ausgegebe wird komplett in Kleinbuchstaben ausgegeben. Aber wie es mit der Eingabe Funktionieren soll habe ich immer noch nicht verstanden.



  • So jetzt macht das Programm genau das, was es machen soll.

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    int tolower( int ch);
    
    int main()
    {
    
        char a[30];
        char b[30];
        int i;
    
        printf("Geben Sie ein Wort ein: ");
        strlwr(gets(a));
        printf("Sie haben %d Elemente eingegeben\n",strlen(a));
    
        for(i=strlen(a)-1; i>=0; i--)
        {
        printf("%c", tolower (a[i]));
        }
    
        printf("\n\n");
    
        strcpy(b,a);
        strrev(b);
    
        if(strcmp(a,b)==0)
        {
            printf("Das eingegebene Wort ist ein Palindrom!\n");
        }
        else
        {
            printf("Das ist kein Palindrom\n");
        }
    
        return 0;
    
    }
    

    Was meint ihr mit das Sprachkonstrukt passt nicht, strrev ist kein Standart 😕 Unser Lehrer sagt, wie der Code aussieht ist komplett egal,solange das Programm das tut was es soll.

    Danke für den hinweis auf strlwr()



  • EDIT

    Ich habe vergessen die Zeile 6 zu löschen, die hat da nichts zu suchen.


  • Mod

    GustavGünter schrieb:

    Unser Lehrer sagt, wie der Code aussieht ist komplett egal,solange das Programm das tut was es soll.

    Aber:
    1. Mit strrev wird das Programm nicht immer tun, was es soll. Es wird nur unter Windows funktionieren.
    2. Du hättest nicht das Unterrichtsziel erreicht, wenn du strrev benutzt. Hier geht es ganz sicher darum, dass du besser lernst, mit Zeichenketten umzugehen und die richtige Denkweise zum Programmieren an einfachen, kleinen Problemem zu üben. Beides Themen, bei denen es dir ehrlich gesagt sehr gut täte, mehr darüber zu lernen. Wenn du strrev benutzt, dann hast du nur gelernt, wie man im Internet nach Lösungen googelt. Auch eine wichtige Fertigkeit, aber relativ nutzlos, wenn man bei die Grundlagen der Sprache nicht beherrscht, die hier gelernt werden sollen.



  • GustavGünter schrieb:

    Unser Lehrer sagt, wie der Code aussieht ist komplett egal,solange das Programm das tut was es soll.

    Deppengeschwätz. Wie üblich bei allen Anfängern, d.h. Lehrern, Fachbuchautoren, Tutorialschreiberlingen.
    Kleiner Tipp:
    Falls du außerhalb des Laiengeschwätzes deines Lehrers mal was mit C-Programmierung zu tun haben solltest: Halte deine Klappe, wenn sich erwachsene C-Programmierer unterhalten; höre ihnen zu, versuche dabei etwas zu lernen und vergiß alles, was du bei deinem Lehrer gehört hast.


Anmelden zum Antworten