Heiligenkalender Basisimplementation – Stufe 3

06.02.2017 02: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);

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

    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);

    while (wurzel!=NULL)
    {
        if (!strcmp(wurzel->name,"Martini"))
        {
            cout << "Martini wird am " << wurzel->tag << "." << wurzel->monat <<
                    " gefeiert." << endl;
            break;
        }
        wurzel=wurzel->naechster;
    }

    {
        /* 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;
        }
    }
}

Dateien: Stufe 3

Schlagwörter: