C++ :: Aufgabe #282

1 Lösung Lösung öffentlich

Postleitzahl (PLZ) zu erstellen

Anfänger - C++ von Gelöschte Person - 22.04.2020 um 16:35 Uhr
Die Idee dieses Programmes soll sein, ein Nachschlagewerk für österreichische Postleitzahlen zu erstellen.
Repräsentativ sollen 9 beliebige Postleitzahlen, eins pro Bundesland, hardcoded eingetragen werden.
Jede PLZ besteht aus einer Zahl, die auf keinen Fall doppelt vorkommen darf und einem eindeutigen Stadtnamen, welcher anders als die Zahl doppelt vorkommen darf (z.B. 1010 Wien, 1020 Wien)
Überlegen Sie sich zuerst gut welchen geeigneten Datentyp Sie verwenden, in den Sie alle Daten strukturiert speichern können. Ich nenne diesen Datentyp im folgenden immer Datensatz.

Erstellen Sie sich für jeden der nachfolgenden Überschriften einen Menüpunkt in ihrem Programm.

z.B. Ausgabe Konsole:
0 - Exit
1 - PLZ erzeugen …

PLZ erzeugen
Es soll möglich sein eine beliebige Anzahl an PLZ zum Datensatz hinzufügen zu können. Ist die PLZ bereits vorhanden, so soll erst mit dem geheimen PIN 1234 das Ändern des Eintrages erlaubt werden. Fragen Sie unbedingt, ob eine Änderung (nur Name) vorgenommen werden soll.
Bedenken Sie, dass eine PLZ in Österreich immer aus genau 4 Zahlen besteht.

PLZ anzeigen
Es soll möglich sein alle PLZ aus dem Datensatz auf einmal auszugeben, um sich die passende zu finden. Sortieren Sie unbedingt den Datensatz nach jedem neuen Eintrag nach der PLZ.

PLZ suchen
Beim Suchen soll es möglich sein einzelne oder mehrere PLZ aufzulisten. Wird bspw. 1010
eingegeben so soll 1010 Wien (PLZ inkl. Name) ausgegeben werden. Wird nur 1 eingegeben und
gesucht, so sollen alle PLZ inkl Name mit 1 beginnend ausgegeben werden. Wird 10 eingegeben, so
sollen alle PLZ inkl. Name mit 10 beginnend ausgegeben werden usw.
Optional: Wird Wien eingegeben, so sollen alle Wiener PLZ aufgelistet werden.
Das Programm darf bei der Suche keinesfalls abstürzen!

Erweiterung
Erweitern Sie nun das Programm um folgende Funktion:
Es soll nach einer Adresse gefragt werden. Erst Adresszeile, dann PLZ, dann Stadt. Eine Adresse,
besteht immer aus einer Adresszeile einer PLZ und einer Stadt.
Ist die PLZ aus dem Datensatz bekannt, soll gar nicht mehr nach dem Stadtnamen gefragt und
automatisch vervollständigt werden. Außerdem soll die eingegebene Adresse ausgegeben und vom
User kontrolliert werden. Zudem soll diese direkt in eine Liste gespeichert werden, wenn diese
korrekt ist. Selbstverständlich soll in der Liste der Städtename ebenfalls hinterlegt sein.
War die PLZ nicht bekannt, soll diese in den Datensatz für die Zukunft gespeichert werden, nachdem
die Korrektheit der Adresse bestätigt wurde.
Geben Sie abschließend alle Adressen aus der Liste, sowie alle PLZ aus dem Datensatz aus.

Lösungen:

vote_ok
von dewe (460 Punkte) - 21.05.2020 um 12:48 Uhr
plz.h
Quellcode ausblenden C-Code
#ifndef PLZ_H
#define PLZ_H

#include <string>
#include <ostream>

using namespace std;

class plz
{
    private:
        plz(){};
        char No[4]={0, 0, 0, 0};
        string Pl;

    public:
        plz(int a) {No[0] = 0;
                    No[1] = 0;
                    No[2] = 0;
                    No[3] = 0;
                    Pl = "";};

        plz(char no[4], string pl) {No[0] = no[0];
                                    No[1] = no[1];
                                    No[2] = no[2];
                                    No[3] = no[3];
                                    Pl = pl;};

        friend bool operator ==(plz const&, plz const&);
        friend ostream& operator <<(ostream &os, plz const&);

        void changeName(string newPl);
        int getNumber();
        int number(int a);
        string place();
};

#endif // PLZ_H


plz.cpp
Quellcode ausblenden C-Code
#include "plz.h"

ostream& operator<<(ostream& os, plz const& p)
{
    return os << p.No[0]<< p.No[1]<< p.No[2]<< p.No[3]<< " "<< p.Pl;
}

bool operator ==(plz const& p1, plz const& p2)
{
    if(p1.No[0]==p2.No[0] && p1.No[1]==p2.No[1] && p1.No[2]==p2.No[2] && p1.No[3]==p2.No[3])
        return true;
    else
        return false;
};

void plz::changeName(string newPl)
{
    Pl = newPl;
}

int plz::getNumber()
{
    return No[0]*1000+No[1]*100+No[2]*10+No[3];
}

int plz::number(int a)
{
    return No[a];
}

string plz::place()
{
    return Pl;
}


main.cpp
Quellcode ausblenden C-Code
#include <iostream>
#include <stdlib.h>
#include "plz.h"
#include <vector>

using namespace std;

bool existPlz(plz a, vector<plz> liste);
void sortList(vector<plz> &liste);
void search_number(vector<plz> liste, string n);
void search_place(vector<plz> liste, string place);

int main()
{
    vector<plz> liste;

    int n;

    do{

        cout<< "Bitte geben Sie eine der Nummern ein, um die entsprechenden Aktion zu taetigen " << endl;
        cout<< "0 - Um eine neue Postleizahl anzulegen, falls vorhanden den Ortsnamen ändern"<< endl
            << "1 - Um die ganze Liste der Postleizahlen auszugeben"<< endl
            << "2 - Um nach einer Postleizahl oder nach einer Teilpostleizahl zu suchen"<< endl
            << "3 - Um nach einem Ort zu suchen"<< endl
            << "9 - Um wenn man mit Allem fertig ist"<< endl;

        cin>> n;

        switch(n)
        {
            case 0:
                {
                    system("cls");

                    string pw;
                    cout<<"Bitte geben Sie das Passwort ein, um Aenderungen an der Liste vorzunehmen"<<endl;
                    cin>>pw;
                    if(pw =="1234")
                    {
                        char no[4];
                        string name;


                        for(int i = 0; i<4; i++)
                        {
                            char n;
                            cout<< "Bitte geben Sie die "<< i+1 <<" Ziffer der Postleizahl ein" <<endl;
                            cin>>n;
                            no[i]=n;
                        }

                        cout<< "Bitte geben Sie den Ort der Postleizahl an" <<endl;
                        cin>>name;

                        plz a(no, name);

                        if(existPlz(a, liste)==false)
                        {
                            liste.push_back(a);
                            cout<< "Die neue Postleizahl wurde der Liste hinzugefügt" <<endl;
                        }

                        else
                        {
                                char b;

                                cout<< "Diese Postleizahl existiert schon in unserer Liste, wollen Sie den Ort ändern?" <<endl
                                << "Ja/Nein[j/n]" <<endl;
                                cin>> b;

                                if(b == 'j')
                                {
                                    for(int p = 0; p < int(liste.size()); p++)
                                        {
                                            if(a == liste[p])
                                            {
                                                liste[p].changeName(name);
                                                p = int(liste.size());
                                            }
                                        }
                                }
                        }
                        sortList(liste);
                    }
                }
                break;

            case 1:
                {
                    system("cls");

                    for(int i= 0; i<int(liste.size()); i++)
                        cout<< liste[i] <<endl;
                }
                break;

            case 2:
                {
                    system("cls");

                    string n;

                    cout<<"Bitte geben Sie die gesuchte Postleizahl bzw die ersten Ziffern einer Postleizahl ein." <<endl;

                    cin>>n;

                    search_number(liste, n);
                }

                case 3:
                {
                    system("cls");

                    string n;

                    cout<<"Bitte geben Sie den gesuchten Ort ein" <<endl;

                    cin>>n;

                    search_number(liste, n);
                }
                break;
        }
    }while(n!=9);
    return 0;
}

bool existPlz(plz a, vector<plz> liste)
{
    bool exist = false;
    for(int i = 0; i<int(liste.size()); i++)
            {

                if(a == liste[i])
                exist = true;
            }
    return exist;
}

void sortList(vector<plz> &liste)
{
    plz *Liste;

    char a[4];
    string b;
    plz temp(a, b);

    int m;

    for(int i = 0; i<int(liste.size())-1; i++)
    {
        for(int j = i+1; j<int(liste.size()); j++)
        {
            int pos = i;
            if(liste[pos].getNumber() > liste[j].getNumber())
                {
                    temp = liste[pos];
                    Liste = &liste[pos];
                    *Liste = liste[j];
                    Liste = &liste[j];
                    *Liste = temp;
                    pos = j;
                }
        }
    }
}

void search_number(vector<plz> liste, string number)
{
    for(int j = 0; j<int(liste.size()); j++)
    {
        bool m;

        for(int i = 0; i<number.size(); i++)
        {
                    if(number[i]==liste[j].number(i))
                        m = true;
                    else
                        m = false;
        }

        if(m == true)
            cout<< liste[j] <<endl;
    }
}

void search_place(vector<plz> liste, string place)
{
    for(int j = 0; j<int(liste.size()); j++)
    {
        if(liste[j].place()== place)
            cout<< liste[j] <<endl;
    }
}