Palindrom mit C-Programmieren überprüfen?

3 Antworten

Hallo stevke94,

willkommen bei gutefrage! Zunächst einmal bitte ich dich, bei zukünftigen Fragen für Code die Code-Tags zu benutzen, damit man deinen Code besser lesen kann. Dieses Mal habe ich es für dich korrigiert.

Dein Code enthält folgende Fehler:

  • Fehlende/falsche Klammern bei for-Schleifen
  • Die Semantik des Codes ist falsch (="er tut nicht das, was er soll"); wo überprüfst du, ob es ein Palindrom ist?
  • Weitere Kleinigkeiten

Folgende Verbesserungsvorschläge habe ich zusätzlich:

  • Fasse Deklaration und Initialisierung zusammen, sofern möglich
  • Rücke deinen Code korrekt ein und vermeide redundante Leerzeilen
  • Fasse Deklarationen für Variablen gleichen Datentyps der Übersichtlichkeit halber zusammen
  • Die Deklaration von Variablen innerhalb einer for-Schleife ist in C mittlerweile möglich und sollte auch zur besseren Lesbarkeit angewandt werden
  • Die Umwandlung in Kleinbuchstaben muss nicht so kompliziert erfolgen, sondern dafür kann auch die Funktion tolower verwendet werden
  • Verwende Funktionen, anstatt alles in die main-Funktion zu schreiben

Es ergibt sich somit bei weitestgehender Beibehaltung deines Codes:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main() {

  char text[255];
  bool isPalindrome = true;

  printf("Bitte text eingeben:");
  scanf("%s", text);
  int len = strlen(text);
  
  for (int i = 0; i < len; ++i) {
    if (text[i] >= 'A' && text[i] <= 'Z') {
      text[i] += 32;
    }
  }

  for (int i = 0; i < len/2; ++i) {
    if (text[i] != text[len - i - 1]) {
      isPalindrome = false;
      break;
    }
  }

  if (isPalindrome) {
    printf("Das Wort ist ein Palindrom!");
  } else {
    printf("Das Wort ist kein Palindrom!");
  }

}

Oder etwas übersichtlicher:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

bool checkPalindrome(char text[]) {
  int len = strlen(text);
  
  for (int i = 0; i < len/2; ++i) {
    if (tolower(text[i]) != tolower(text[len - i - 1])) {
      return false;
    }
  }
  
  return true;
}

int main() {

  char text[255];
  printf("Bitte text eingeben:");
  scanf("%s", text);

  if (checkPalindrome(text)) {
    printf("Das Wort ist ein Palindrom!");
  } else {
    printf("Das Wort ist kein Palindrom!");
  }

}

Viele Grüße

tavkomann

Zuerst einmal zu deinem Code:

  • Bitte stelle Code hier formatiert hinein. Der GF-Editor hat eine Code-Funktion, mit der geht das ganz einfach und potenzielle Antwortgeber können dir auch einfacher helfen. Im Notfall gibt es noch Dienste wie pastebin.com oder hastebin.com.
  • Gib Variablennamen immer einen aussagekräftigen, eindeutigen Namen.
  • In C mag das zwar eine Eigenheit für sich sein, aber es ist besser, Variablen erst dann zu deklarieren, wenn sie wirklich gebraucht werden. Es spart an Code-Zeilen und macht den Code übersichtlicher. Bei einer langen Funktion müsstest du sonst ständig hoch und runterscrollen, nur um zu schauen, wo und wie die Variable deklariert wurde.
  • Vor allem als Anfänger solltest du stets die geschweiften Klammern um Code-Blöcke setzen, ob sie nun nur eine Anweisung beinhalten oder nicht.

Zu deinem Problem:

Zum Umwandeln von Zeichen in Kleinbuchstaben gibt es die Funktion toLower:

http://www.cplusplus.com/reference/cctype/tolower/

Du schaust nicht wirklich, ob sich alle Buchstaben spiegeln. Dabei müsstest du doch lediglich mit einer Schleife prüfen, ob es stets gleiche Zeichenpaare gibt.

Pseudocode:

char letters[] = /* ... */;

for i = 0, j = wordlength - 1; i < wordlength / 2; ++i, --j
  if toLower(letters[i]) != toLower(letters[j])
    return 0
return 1

Wenn das Wort nur einen einzigen Buchstaben beinhaltet, kannst du dir die Schleife sparen und gleich ein positives Ergebnis zurückgeben.

Kritik zu Deinem Programmierstil gab's ja schon genug. Deshalb zeige ich nur mal, wie ich die Aufgabe lösen würde. Das kannst Du dann mit Deiner Lösung vergleichen.

#include <locale.h> // setlocale()
#include <stdlib.h> // mbstowcs()
#include <string.h> // strlen()
#include <wchar.h>  // wprintf()
#include <wctype.h> // iswalnum() ...

int palindrom ( wchar_t const *s, wchar_t const *t )
{
  while (s<t && !iswalnum(*s)) ++s; // Sonderzeichen
  while (s<t && !iswalnum(*t)) --t; // überspringen.

  return s >= t  // 0 oder 1 Zeichen sind immer ok.
      || ( towlower(*s)==towlower(*t)
        && palindrom(s+1, t-1) );
}

int main ( int argc, char const * const argv[] )
{
  if (argc != 2) {
    wprintf( L"Usage: %s <text>", argv[0] );
    return 2;
  }
  setlocale( LC_ALL, "" );
  wchar_t text[strlen(argv[1])];
  mbstowcs( text, argv[1], sizeof text );
  int test = palindrom( text, text+wcslen(text) );
  wprintf( L"«%ls» ist %s Palindrom."
         , text, test ? "ein" : "KEIN" );

  return !test;
}

Die Ausgabe sieht dann so aus:

$ gcc -Wall -o palindrom palindrom.c
$ ./palindrom "Eine güldne, gute Tugend: Lüge nie!"
«Eine güldne, gute Tugend: Lüge nie!» ist ein Palindrom.