Palindromzahlen

Eviie

Grünschnabel
Heyihr super Programmierer da draußen,


ich hab ein kleines Problemchen...
Ich habe keine Ahnung vom Programmieren und muss morgen eine Aufgabe vorstellen.

(Entdecken Sie Palindrome, in dieser Aufgabe beschränkt auf Zahlen, die vorwärts und rückwärts gelesen jeweils die gleiche Zahl ergeben.
SChreiben Sie die Funktion bool isPalindrome (int) die TRUE bzw. FALSE als Rückgabewert liefert, je nachdem, ob die eingegebene Zahl ein Palindrom ist oder nicht.

Betten Sie die Implementierung in folgende DAtei ein.

- my_Palindrome.h ; Hier wird der Prototyp bool isPAlindrome(int) stehen
- my_palindrome.cpp ; Hier geben Sie dir Implementierung an.

Integer ZAhlen sollen vom BEnutzer eingelesen werden und auf Palindrome überprüft werde.Das Ergebins soll auf den Bildschirm ausgegeben werden.
Der Benutzer soll nach einer Palindromberechnung gefragt werden, ob er einen weiteren Programmdurchlauf wünscht oder nicht.
DUrch EIngabe von c wird das PRg beendet, in allen anderen Fällen startet das PRogramm erneut..




Es wäre echt cool von euch da draußen, wenn ihr helfen könntet...


Merciii im vorraus
 
Sorry, aber wir werden dir hier nicht deine Hausaufgaben machen. Das ist nicht Sinn der Sache. Probier es selbst (irgendwas musst du doch schon können, sonst würdest du doch nicht so eine Aufgabe in so kurzer Zeit bekommen?) und wenn du Probleme hast, poste deinen Code hier und wir können dich unterstützen.
 
Hi,

ich denke dein Post wäre hier besser aufgehoben, wenn du es wirklich komplett von anderen machen lassen willst. Ob es dir aber jemand macht, ist die andere Frage.

Ansonsten schließe ich mich Tim Bureck an, versuche es doch zumindest selbst. Ganz blank im Programmieren kannst du ja nicht sein, was hätte dann diese Aufgabe für einen Sinn? ;)

// Edit: Willst du das Ganze eigentlich in C(99) oder C++ machen?

// Edit 2: Wollte eh mal wieder was in C machen, hier mal meine Lösung. Ist in C99, musst also eventuell auf C++ umschreiben. Kannst quasi als Ansatz sehen, wie man es machen kann. Findet man übrigens auch größtenteils so via google. Habs getestet, aber eventuell gehts auch besser:

my_palindrome.c:
C:
/*
 * Implementierung der my_palindrome
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#include "my_palindrome.h"

bool isPalindrome(int zahl) {
  char* str1 = (char*) malloc(sizeof(const char*) * 24);
  *str1 = '\0';
  char* str2 = (char*) malloc(sizeof(const char*) * 24);
  *str2 = '\0';

  snprintf(str1, 24, "%u", zahl);
  
  size_t len = strlen(str1);
  int akt;

  for(akt = len-1; akt >= 0; akt--)
    str2[(len-1) - akt] = str1[akt];

  str1[len] = '\0';
  str2[len] = '\0';

  bool result = (strcmp(str1, str2) == 0); 
  free(str1);
  free(str2);
  return result;
}

int main(void) {
  int zahl;
  char abbrechen;
  char line[100];

  do {
    abbrechen = 0;
    zahl = 0;

    printf("Bitte eine Zahl eingeben: ");
    fflush(stdin);
    fgets(line, sizeof(line), stdin);
    int tmp = sscanf(line, "%i", &zahl);

    if(tmp == 0 || tmp == EOF || zahl < 0) {
      printf("Keine gültige Zahl eingegeben.\n");
    } else {
      if(isPalindrome(zahl)) {
        printf("Die angegebene Zahl ist ein Palindrom.\n");
      } else {
        printf("Die angegebene Zahl ist *kein* Palindrom.\n");
      }
    }

    printf("Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'): ");
    fflush(stdin);
    fgets(line, sizeof(line), stdin);
    sscanf(line, "%c", &abbrechen);
  } while (abbrechen != 'c');

  return 0;
}

my_palindrome.h:
C:
/*
 * Header für my_palindrome
*/

#include <stdbool.h> 
  
bool isPalindrome(int);

Kompilierung und Aufruf / Testausgabe:
Code:
$> gcc -Wall -Wextra -ansi -std=c99 -o palindrome -g my_palindrome.c
$> ./palindrome
Bitte eine Zahl eingeben: 1234
Die angegebene Zahl ist *kein* Palindrom.
Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'):  
Bitte eine Zahl eingeben: 12321
Die angegebene Zahl ist ein Palindrom.
Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'): asd
Bitte eine Zahl eingeben: 123434321
Die angegebene Zahl ist ein Palindrom.
Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'): c

valgrind Ausgabe (gekürzt, Speicher passt alles):
Code:
==12216== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
--12216-- 
==12216== malloc/free: in use at exit: 0 bytes in 0 blocks.
==12216== malloc/free: 6 allocs, 6 frees, 576 bytes allocated.
==12216== 
==12216== All heap blocks were freed -- no leaks are possible.

Gruß
BK
 
Zuletzt bearbeitet:
Hi.

Die Version von Bratkartoffel ist eine recht naive, verschwenderische Variante.

1. man muss eine Zahl nicht in einen String umwandeln um zu prüfen ob die Zahl ein Palindrom ist.

2. selbst wenn man die Zahl in einen String umwandelt muss man den String nicht umdrehen und vergleichen, man kann einfach prüfen ob str[i] == str[n - i] für 0<= i <= n div 2 (n ~= strlen).

\edit: zu 1.) Vorgehensweise:

- ermittle die größte Zehnerpotenz z für die gilt: zahl / z > 0
- prüfe ob für jede Stelle
Code:
zahl[i] == zahl[log10(z) - i]
gilt für 0<= i <= log10(z) div 2

Gruß
 
Zuletzt bearbeitet:
\edit: zu 1.) Vorgehensweise:

- ermittle die größte Zehnerpotenz z für die gilt: zahl / z > 0
- prüfe ob für jede Stelle
Code:
zahl[i] == zahl[log10(z) - i]
gilt für 0<= i <= log10(z) div 2
Noch eine Alternative, bei der man keine Logarithmen braucht:
C++:
bool isPalindrome(int x) {
  if (x < 0) return false; // Je nach Definition...

  int tmp = x;
  int xi = 0;
  while (tmp != 0) {
    xi = xi*10 + tmp%10;
    tmp /= 10;
  }

  return xi == x;
}

Grüße,
Matthias
 
Zurück