C/C++ Programmierung

Aufgabe 17

Man nehme eine natürliche Zahl, bilde die Spiegelzahl (Die Spiegelzahl einer Zahl ist diejenige Zahl, die sich ergibt, wenn man die Ziffern einer Zahl in umgekehrter Reihenfolge aufschreibt), addiere beide und wiederhole den Vorgang mit der Summe (:= Spiegel-Additionsprozeß). Nach einer Zeit ergibt sich eventuell ein Palindrom (d.h. eine Zahl, die mit ihrer Spiegelzahl übereinstimmt, die also vorwärts und rückwärts gelesen gleich lautet).

Das Palindromproblem lautet: Ergibt sich bei jeder Startzahl des Spiegel-Additions-Prozesses nach endlich vielen Schritten ein Palindrom?

1. Beispiel

1.1   18 + 81 = 99   ® (ein Schritt)
1.2   19 + 91 = 110   ® 110 + 011 = 121   ® (zwei Schritte)
1.3   68 + 86 = 154   ® 154 + 451 = 605   ® 605 + 506 = 1111   ® (drei Schritte)

2. Aufgabe

2.1(a)   Bitte geben Sie alle Zahlen zwischen 1 und 1000 an, die erst nach mehr als 24 Schritten zu einem Palindrom führen!
2.1(b)   Bitte geben Sie die Zahl zwischen 1 und 10000 an, die das größte Palindrom ergibt!
2.2   Bitte prüfen Sie eine Menge von gegebenen Zahlen auf das Palindromproblem. D.h. bitte geben Sie die Anzahl der gelesenen Zahlen aus und die Anzahl der "Palindromzahlen" aus dieser Menge. Bitte lesen Sie Zahlen von einer Datei ein. Der Dateiname wird vom Benutzer eingegeben. Die Zahlen sind zeilenweise - d.h. eine Zahl pro Zeile - gespeichert.

3. Durchführung

3.1   Entwickeln Sie einen Lösungsalgorithmus für die unter (2.) gestellte Aufgabe. Die Ausprägung des Algorithmus soll in einem Struktogramm nachgewiesen werden.
3.2   Erzeugen Sie ein C-Programm nach dem unter (3.1) entwickelten Struktogramm.

Lösung für die Aufgabe

/***************************************************************************************
Name des Projekts:                 Umsetzung des Palindromproblemes
Name der Autoren:                  Olaf Gramkow, Björn Schweinsberg
Version/Generation:                1.0
Änderungs-Historie:                02.03.2000
Bekannte Probleme/Einschränkungen: - Palindromproblem wird nur bis zu 1000 Schritten geprüft
****************************************************************************************/
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Funktion zum Testen ob Zahl eine Palindromzahl ist
bool IsPalindrom(unsigned long Number)
{
  int  i, lang;
  char str[100], strOriginal[100], ch;
  bool palindrom = true;

  // Zahl in einen String umwandeln
  sprintf(str, "%lu", Number);
  // String str nach strOriginal kopieren
  strcpy(strOriginal, str);
  // Länge des Strings ermitteln
  lang = strlen(str);
  // Umdrehen der Zahl
  for (i=0; i < lang / 2; i++)
  {
    ch = str[i];
    str[i] = str[lang - i - 1];
    str[lang - i - 1] = ch;
  }

  // Prüfen ob Palindrom
  for (i = 0; i < lang; i++)
  {
    if (str[i] != strOriginal[i])
      palindrom = false;
  }

  return palindrom;
}

// Funktion zum lösen des Palindromproblems
long CheckPalindrom(unsigned long Number, long &schritte)
{
  unsigned long newNumber;
  int           i, lang;
  char          str[100], str2[100], ch;
  bool          palindrom;

  // Variable schritte auf 0 setzen
  schritte = 0;

  do
  {
    // Variable palindrom auf "wahr" setzen
    palindrom = true;

    // Zahl in einen String umwandeln
    sprintf(str, "%ul", Number);
    // Länge des Strings ermitteln
    lang = strlen(str);
    // Umdrehen der Zahl
    for (i=0; i < lang / 2; i++)
    {
      ch = str[i];
      str[i] = str[lang - i - 1];
      str[lang - i - 1] = ch;
    }

    // Originalzahl und gedrehte Zahl addieren
    newNumber = Number + (unsigned long)atol(str);

    // neue Zahl in einen String umwandeln
    sprintf(str, "%ul", newNumber);
    // String str nach str2 kopieren
    strcpy(str2, str);
    // Länge des Strings ermitteln
    lang = strlen(str2);
    // Umdrehen der Zahl
    for (i=0; i < lang / 2; i++)
    {
      ch = str2[i];
      str2[i] = str2[lang - i - 1];
      str2[lang - i - 1] = ch;
    }

    // Prüfen ob Palindrom
    for (i = 0; i < lang; i++)
    {
      if (str[i] != str2[i])
        palindrom = false;
    }

    // Variable schritte um 1 erhöhen
    schritte++;

    // Palindrom nach 1000 Schritten noch nicht berechnet!
    if (schritte == 1000 && !palindrom)
      return -1;

    // neue Zahl für nächsten Durchlauf in die Variable Number kopieren
    Number = newNumber;
  }
  while (!palindrom); // solange Ausführen bis Variable palindrom "wahr" ist

  return atol(str2);
}

// Funktion um auf einen Tastendruck zu warten
void WaitForChar()
{
  cout << "Bitte Return-Taste druecken" << endl;
  getchar();
}

// Hauptfunktion
int main()
{
  unsigned long i, Palindrom, bigPalindrom = 0, bigZahl = 0;
  long schritte;

  cout << "********************************************************" << endl;
  cout << "*            Palindromproblem - Version 1.0            *" << endl;
  cout << "*                                                      *" << endl;
  cout << "* copyright (c) 2000 Olaf Gramkow, Bjoern Schweinsberg *" << endl;
  cout << "********************************************************" << endl << endl;

  for (i = 1; i <= 1000; i++)
  {
    Palindrom = CheckPalindrom(i, schritte);
    // Aufgabe 2.1a
    if (schritte > 24)
    {
      cout << "Zahl     : " << i << endl;

      if ((long)Palindrom == -1)
        cout << "Palindrom nach 1000 Schritten noch nicht ermittelt." << endl << endl;
      else
        cout << "Palindrom: " << Palindrom << endl << endl;

      // auf Tastendruck warten
      WaitForChar();
    }

    // Aufgabe 2.1b
    if (Palindrom > bigPalindrom)
    {
      bigZahl = i;
      bigPalindrom = Palindrom;
    }
  }

  // Aufgabe 2.1b
  cout << endl << endl << "Groesstes Palindrom: " << bigZahl << " (" << bigPalindrom << ")" << endl;

  // auf Tastendruck warten
  WaitForChar();

  // Aufgabe 2.2
  char str[255];
  cout << endl << "Bitte Dateinamen eingeben: ";
  cin.getline(str, 255);

  if (strlen(str) != 0)
  {
    // Datei öffnen
    ifstream file(str);

    // Variablen Palindrom und i auf 0 setzen
    Palindrom = i = 0;

    // erste Zeile aus der Datei lesen
    file.getline(str, 255);
    while (!file.eof())
    {
      i++;

      // Testen ob Zahl eine Palindromzahl ist
      if (IsPalindrom(atol(str)))
        Palindrom++;

      // nächste Zeile aus der Datei lesen
      file.getline(str, 255);
    }

    // Datei schließen
    file.close();

    cout << "Gelesene Zahlen: " << i << endl;
    cout << "Palindromzahlen: " << Palindrom << endl;
  }
  else
    cout << "Es wurde kein Dateiname eingegeben!" << endl;

  // auf Tastendruck warten
  WaitForChar();

  return 0;
}
Struktogramme für das C++ Programm
Dokumentation für die Funktionen des Programmes


Zurück zur Übersicht