[c++] Projekt Fuhrparkverwaltung - Vektoren

cHucKy51

Mitglied
Hallo!

Ich muss bis Dienstag ein Projekt realisieren und habe leider keine Ahnung von C++. Es geht dabei um eine Fuhrparkverwaltung bestehend aus Fahraufträgen, Fahrzeugen und Fahrern. Fahrauftrag soll die Basisklasse sein und die anderen beiden Klassen sollen von dieser abgeleitet sein.

Attribute:
Fahrzeug: ID, Marke, Modell, erforderliche Führerscheinklasse, Datum der nächsten Hauptuntersuchung, Zuladung, Fahrzeugzustand, Reparaturauftrag(bool)
Fahrer: ID, Verfügbarkeit(bool), Führerscheinklasse, Vorname, Name

Und nun das wichtige:
Ein Fahrzeug kann einem Fahrer nur zugeordnet werden, wenn die erforderliche Füherscheinklasse beim Fahrer vorhanden ist.
Ein Fahrer kann einem Fahrauftrag nur zugeordnet werden, wenn der Fahrer verfügbar ist und die maximale Zuladung des Fahrzeugs nicht überschritten wurde.

Bisher hab ich folgendes gemacht:
4 Klassen angelegt: CFahrauftrag, CFahrzeug, CFahrer, CMain

in der CMain habe ich ein Menü generiert, das beim Auswählen der einzelnen Menüpunkte nur die Methoden aus den anderen Klassen aufrufen soll.

C++:
#include <iostream>
#include <stdio.h>
#include <string>
#include "CFahrzeug.h"
#include "CFahrauftrag.h"
#include "CFahrer.h"

using namespace std;

int main()
{
    //Objekte der drei Hauptklassen erstellen
    CFahrzeug fahrzeug = CFahrzeug();
    CFahrauftrag auftrag = CFahrauftrag();
    CFahrer fahrer = CFahrer();

    //Eingabestring
    string eingabe;

    // while(true)
    {
        system("cls");
        cout << "Menue:" << endl;
        cout << "----------------------------------------" << endl;

        cout << "Fahrauftraege:" << endl;
        cout << "1. Anzeigen" << endl;
        cout << "2. Hinzufuegen" << endl;
        cout << "3. Zugehoerigen Fahrer festlegen" << endl;
        cout << "4. Bearbeiten" << endl << endl;

        cout << "Fahrzeuge:" << endl;
        cout << "5. Anzeigen" << endl;
        cout << "6. Verfuegbare anzeigen" << endl;
        cout << "7. Tuev-Status anzeigen" << endl;
        cout << "8. Tuev-Pruefung veranlassen" << endl;
        cout << "9. Reparaturauftrag veranlassen" << endl;
        cout << "10. Hinzufuegen" << endl;
        cout << "11. Bearbeiten" << endl << endl;

        cout << "Fahrer:" << endl;
        cout << "12. Anzeigen" << endl;
        cout << "13. Verfuegbare anzeigen" << endl;
        cout << "14. Hinzufuegen" << endl;
        cout << "15. Zugehoeriges Fahrzeug festlegen" << endl;
        cout << "16. Bearbeiten" << endl << endl;

        cout << "Allgemein:" << endl;
        cout << "17. Daten aus Textdatei lesen (oeffnen)" << endl;
        cout << "18. Daten in Textdatei schreiben (speichern)" << endl << endl;

        cout << "b. Beenden" << endl;
        cout << "----------------------------------------" << endl << endl;

        cout << "Bitte Menuepunkt auswaehlen: ";
        cin >> eingabe;


        //Auswertung der Eingabe
        switch(eingabe[0])
        {   
            //1. Alle Fahrauftraege anzeigen
            case '1':
                // auftrag.zeigeListe();
                break;

            //2. Fahrauftrag hinzufügen
            case '2':
                // auftrag.speicherNeuenDatensatz();
                break;

            //3. Zugehoerigen Fahrer festlegen
            case '3':
                // auftrag.setzeFahrer(fahrer.getFahrerListe());
                break;

            //4. Fahrauftrag bearbeiten
            case '4':
                // auftrag.aenderFahrauftragZustand();
                break;



            //5. Alle Fahrzeuge anzeigen
            case '5':
                fahrzeug.zeigeListe();
                break;

            //6. Verfuegbare Fahrzeuge anzeigen
            case '6':
                // fahrzeug.zeigeVerfuegbareFahrzeuge();
                break;

            //7. Tuev-Status anzeigen
            case '7':
                // fahrzeug.zeigeTuevStatus();
                break;

            //8. Tuev-Pruefung veranlassen
            case '8':
                // fahrzeug.veranlasseTuevPruefung();
                break;

            //9. Reparaturauftrag veranlassen
            case '9':
                // fahrzeug.veranlasseReparatur();
                break;

            //10. Fahrzeug hinzufügen
            case '10':
                // fahrzeug.speicherNeuenDatensatz();
                break;

            //11. Fahrzeug bearbeiten
            case '11':
                // fahrzeug.bearbeiteFahrzeug();
                break;



            //12. Alle Fahrer anzeigen
            case '12':
                // fahrer.zeigeListe();
                break;

            //13. Verfuegbare Fahrer anzeigen
            case '13':
                // fahrer.zeigeVerfuegbareFahrer();
                break;
           
            //14. Fahrer hinzufuegen
            case '14':
                // fahrer.speicherNeuenDatensatz();
                break;

            //15. Zugehoeriges Fahrzeug festlegen
            case '15':
                // fahrer.zuweisungAuftrag(fahrer.getFahrauftragListe());
                break;

            //16. Fahrer bearbeiten
            case '16':
                // fahrer.bearbeiteFahrer();
                break;

           
               
            //17. Daten aus Textdatei lesen (oeffnen)
            case '17':
                // lesen();
                break;

            //18. Daten in Textdatei schreiben (speichern)
            case '18':
                // schreiben();
                break;



            //b. Beenden
            case 'b':
                system("cls");
                cout << "Vielen Dank fuer die Benutzung dieses Programms" << endl << endl;
                break;   
        }
    }
}

Hier ist auch schon mein erstes Problem. Wie kann ich beim Beenden das Konsolenfenster schließen?

Mein zweites Problem ist etwas größer. Wir sollen den Code ja möglichst komplett in C++ schreiben. Die Daten der Fahraufträge, Fahrzeuge und Fahrer sollen in 3 Textdateien gespeichert werden.
Ich habe mir also überlegt einen Vector zu benutzen, da das auch viele meiner Kollegen gemacht haben.

Meine erste Aufgabe ist jetzt, die Daten aus der Textdatei zu laden (ich habe selbst welche reingeschrieben / Die Attibute sind durch ; getrennt).
Diese sollen in einen Vektor geladen werden und später wieder formatiert ausgegeben werden. Auch will ich sie einzeln manipulieren können.

Daszu habe ich mir folgendes überlegt: (steht in der CFahrzeug)

C++:
	//DatenstromObjekt erstellen (Datei öffnen)
    ifstream myfile;
    myfile.open ("fahrzeuge.txt");
           
    //Datei Zeilenweise auslesen und Datensätze in Liste schreiben
    while(!myfile.eof())
    {
        //Zeile einlesen
        getline(myfile, zeile);
       
        CFahrzeug *auto1 = new CFahrzeug();
        // Erstes Trennzeichen suchen
        size_t i = zeile.find(";");
       
        auto1->fahrzeugId = zeile.substr(0, i);
//Schleife verlassen, wenn Ende erreicht
        if (zeile.size() == 0)
            break;

        //Objekt in Liste speichern
        FahrzeugVektor.push_back(auto1);	

	//DatenstromObjekt erstellen (Datei öffnen)
ifstream myfile;
myfile.open ("fahrzeuge.txt");

//Datei Zeilenweise auslesen und Datensätze in Liste schreiben
while(!myfile.eof())
{
//Zeile einlesen
getline(myfile, zeile);

CFahrzeug *auto1 = new CFahrzeug();
// Erstes Trennzeichen suchen
size_t i = zeile.find(";");

auto1->fahrzeugId = zeile.substr(0, i);
//Schleife verlassen, wenn Ende erreicht
if (zeile.size() == 0)
break;

//Objekt in Liste speichern
FahrzeugVektor.push_back(auto1);	

	//DatenstromObjekt erstellen (Datei öffnen)
    ifstream myfile;
    myfile.open ("fahrzeuge.txt");
           
    //Datei Zeilenweise auslesen und Datensätze in Liste schreiben
    while(!myfile.eof())
    {
        //Zeile einlesen
        getline(myfile, zeile);
       
        CFahrzeug *auto1 = new CFahrzeug();
        // Erstes Trennzeichen suchen
        size_t i = zeile.find(";");
       
        auto1->fahrzeugId = zeile.substr(0, i);
//Schleife verlassen, wenn Ende erreicht
        if (zeile.size() == 0)
            break;

        //Objekt in Liste speichern
        FahrzeugVektor.push_back(auto1);

Wie kann ich das realisieren. Wahrscheinlich nicht mit Adressen, da das Zeug ja später an einer anderen Stelle im Hauptspicher stehen kann. Wie kann ich in einer Schleife die Attribute in den Vektor einlesen und nachher wieder darauf zugreifen.

Ich wär über ein wenig Hilfe sehr dankbar!

Grüße
 
Zuletzt bearbeitet:
Hmm..also mich beschleicht der vedacht, dass ich dein Problem nicht ganz verstanden habe, aber ich würde das so machen:

Anstatt der 4 Klassen CFahrauftrag, CFahrzeug, CFahrer, CMain, würde ich nur eine Hauptklasse nehmen. Dann würde ich mir Strukturen (struct{}) definieren, die in etwa so aussehen:
Code:
struct Fahrzeug_struct{
     vector<int> Marke;
     vector<int> Modell;
     usw.
};
Und in deiner Klasse dann:
Code:
Fahrzeug_struct Fahrzeuge;
Dann kannst du auf diese Vektoren von überall aus zugreifen und sie dort beliebig verändern. Die schreibweiße Fahrzeuge.Marke.push_back(auto1) ist dann sicherlich nicht die schönste, aber so würde ich dass zumindest machen. Für die ID des Fahrzeuges würde ich dann die Position im Vector nehmen.

MfG
MSAB
 
Hallo,

1. Die Konsole sollte eg nach der Main-Prozedur von alleine verschwinden.. ist das nicht der Fall kannst du auch einfach ein system("exit") dranhängen.. das solle die Konsole schließen.

2. Deine Frage bezüglich der Vectoren is etwas konfus... du willst deine Textfile einlesen und dann nacher die ausgelesenen Daten in einen Vector packen, richtig?

Falls das so richtig is bist du ja schonmal auf dem richtigen Weg, allerdings frage ich mich gerade warum du in deinem Code-Schnippsel 3mal die selbe 'Schleife' drin hast!

Ich greif jetzt einfach mal deine Idee mit dem parsen der Variablen aus einem String auf:
C++:
vector<CFahrzeug> Fahrzeuge;
string zeile;
string tmp = "";
int Section = 0;


ifstream myfile;
myfile.open("fahrzeuge.txt");

      while( !myfile.eof() )
      {
         getline(myfile,zeile);
         CFahrzeug *TempAuto = new CFahrzeug();
           
           //Vars parsen:
           for(int i=0;i<=zeile.length();i++)
           {
              if( zeile[i] != ';' )
              {
                 tmp = ( tmp + zeile[i] );
              }
              else
              {
                  Section++;
                  switch( Section )
                  {
                     case 1: //ID
                                TempAuto->ID = tmp;
                                break;
                     
                     case 2: //Marke
                                TempAuto->Marke = tmp;
                                break;
                  
                     case 3: //Modell
                                TempAuto->Modell = tmp;
                                break;
                
                     //usw....
                     
                  }
                tmp = "";   
              }
            Section = 0;
           }
       Fahrzeuge.push_back(TempAuto);
       delete TempAuto;
      }
       
     myfile.Close();

Auf diese Weise dürftest du denk ich zumindest an deine Variablen kommen! Bei Delphi gibts die Möglichkeit Records, sowas wie die structs, als Block in eine Datei zu schreiben, das wäre hier sehr gut... geht das auch bei C++?

Eventuell musst du in der switch-Verzweigung noch die Variablen konvertieren, je nachdem was du halt benötigst...

*Für die vermtl falsche Verwendung der Pointer übernehme ich keine Verantwortung :D *

gruss,
Kangaxx
 
Danke für eure Hilfe!
Die Schleife ist durch einen copy-paste Fehler leider 3 mal drin. Das konnte ich im Nachhinein nicht mehr abändern, nachdem es eine Antwort auf meinen Thread gab.
Ich werde deine Lösung morgen mal testen.

Grüße,
chucky51
 

Neue Beiträge

Zurück