Heiligenkalender Basisimplementation – Stufe 4

06.02.2017 01:28 Uhr
#include <iostream>
using namespace std;
#include <string.h>
#include <stdlib.h>
#include <fstream>


struct festtag
{
    struct festtag *naechster;
    char name[64];
    int tag;
    int monat;
} ;
enum zustand {imNamen,imTag,imMonat};

struct festtag *ladekalender(ifstream &datei);
struct festtag *ladeheiligen(ifstream &datei);
struct festtag *sucheheiligen(struct festtag *wurzel, char *bezeichnung);

int main()
{
    char dateiname[64], kommando[64];
    struct festtag *wurzel=NULL, *jetzt;

    ifstream datei;

    cout << "In welcher Datei steht der Heiligenkalender?" << endl;
    cin.getline(dateiname,64,'\n');
    datei.open(dateiname);

    if (!datei)
    {
        cout << "Die Datei" << dateiname << " ist nicht lesbar." << endl;
        return 0;
    }

    wurzel=ladekalender(datei);

    for (;;)
    {
        cout << "Wählen Sie eine Aktivität:" << endl <<
                " n - namentliches Aufsuchen eines Heiligen" << endl <<
                " z - zeitliches Aufuschen eines Heiligen" << endl <<
                " * - Programm beenden" << endl;
        cin.getline(kommando,64,'\n');
        switch(kommando[0])
        {
        case 'n':
            cout << "Bitte geben Sie einen Heiligennamen ein!" << endl;
            cin.getline(kommando,64,'\n');
            jetzt=sucheheiligen(wurzel,kommando);
            if (jetzt!=NULL) cout << "Dieser Heilige wird am " <<  jetzt->tag <<
                                     "." << jetzt->monat << " gefeiert." << endl;
            else cout << "Dieser Heilige ist unbekannt!" << endl;
            break;
        case 'z':
            break;
        case '*':
            return 0;
        default:
            cout << "Das Kommando " << kommando << " verstehe ich nicht" << endl;
            break;
        }
    }
    {
        /* bitte ignorieren; nur bis zu Ihrer Anmeldung notwendig */
        int x;
        cin >> x;
    }

}

struct festtag *ladekalender(
        ifstream                   &datei)
{
    struct festtag *wurzel=NULL, *jetzt, *neu;

    while(!datei.eof())
    {
        neu=ladeheiligen(datei);
        if (neu!=NULL)
        {
            if (wurzel==NULL) wurzel=neu;
            else jetzt->naechster=neu;
            jetzt=neu;
        }
    }

    return wurzel;
}

struct festtag *ladeheiligen(
        ifstream                    &datei)
{
    struct festtag *fest;
    char puffer[100],zeichen;
    int zaehler;
    enum zustand zustand;

    fest=new struct festtag;
    fest->naechster=NULL;

    zustand=imNamen;
    zaehler=0;
    for (;;)
    {
        datei.get(zeichen);
        if (datei.eof()) return NULL;
        switch(zeichen)
        {
        case '/':
            puffer[zaehler]='\0';
            zaehler=0;
            strcpy(fest->name,puffer);
            zustand=imTag;
            break;
        case '.':
            if (zustand!=imNamen)
            {
                puffer[zaehler]='\0';
                zaehler=0;
                fest->tag=atoi(puffer);
                zustand=imMonat;
            }
            else
            {
                puffer[zaehler]=zeichen;
                zaehler++;
            }
            break;
        case '\n':
            if (zustand!=imMonat)
            {
                cout << "Verstümmelte Festangabe: " << puffer << endl;
                delete fest;
                return NULL;
            }
            puffer[zaehler]='\0';
            zaehler=0;
            fest->monat=atoi(puffer);
            zustand= imNamen;
            return fest;
            break;
        default:
            puffer[zaehler]=zeichen;
            zaehler++;
            break;
        }
    }
}

struct festtag *sucheheiligen(
        struct festtag               *wurzel,
        char                                *bezeichnung)
{
    while (wurzel!=NULL)
    {
        if (!strcmp(wurzel->name,bezeichnung)) return wurzel;
        wurzel=wurzel->naechster;
    }

    return NULL;
}

Dateien: Stufe 4

Schlagwörter: