Aufgabe in C++



  • Das sieht doch schon recht umfangreich aus (allerdings will sich hier niemand einen ellenlangen unformatierten Quelltext ansehen auf der Suche nach möglichen Fehlern und Unstimmigkeiten). Wäre es für dich zu viel verlangt, (a) die CPP-Tags korrekt anzuwenden, (b) nur den Teil zu posten, der Probleme bereitet und (c) dazuzuschreiben, woran du gescheitert bist?



  • CStoll schrieb:

    Das sieht doch schon recht umfangreich aus (allerdings will sich hier niemand einen ellenlangen unformatierten Quelltext ansehen auf der Suche nach möglichen Fehlern und Unstimmigkeiten). Wäre es für dich zu viel verlangt, (a) die CPP-Tags korrekt anzuwenden, (b) nur den Teil zu posten, der Probleme bereitet und (c) dazuzuschreiben, woran du gescheitert bist?

    wie sie vielleicht schon bemerkt haben, ich bin neu hier und weiss auch nicht so genau wie es läuft. Mein problem liegt genau beim laden von gespeicherte liste.Ich weiss nicht wie ich die methode laden schreiben soll.



  • So wie das Speichern, nur umgekehrt 😉

    Du liest die Datei zeilenweise ein (getline()), zerlegst jede eingelesene Zeile in Name, Vorname und Nummer und hängst anschließend einen passenden Eintrag ans Ende der Liste an.



  • Fox River schrieb:

    wie sie vielleicht schon bemerkt haben, ich bin neu hier und weiss auch nicht so genau wie es läuft.
    [...]

    [OT]
    Wenn man Tags öffnet sollten diese normalerweise auch geschlossen werden.

    Wenn du nicht weist was ich meine, dann klick mal beim erstellen des Beitrags auf den C/C++ Button schreib irgendeinen Code und Klick dann nochmal drauf.
    Oder schreib erst den Code, markiere ihn und klick dann auf den Button.
    [/OT]



  • [quote="Beliah"]

    Fox River schrieb:

    wie sie vielleicht schon bemerkt haben, ich bin neu hier und weiss auch nicht so genau wie es läuft.
    [...]

    [OT]
    Wenn man Tags öffnet sollten diese normalerweise auch geschlossen werden.

    Wenn du nicht weist was ich meine, dann klick mal beim erstellen des Beitrags auf den C/C++ Button schreib irgendeinen Code und Klick dann nochmal drauf.
    Oder schreib erst den Code, markiere ihn und klick dann auf den Button.
    [/OT]
    Jetz hab ich das richtig gemacht danke.ich hoffe ihr könnt jetz gut lesen und mir helefen die methode Laden zu implementieren.

    #include <stdio.h>
     #include <iostream>
     #include <conio.h>
     #include <iomanip>
     #include <string>
     #include <fstream>
    
     using namespace std;
    
     class Telefon
    {
     private:
    	char Name[40];	
    	char Vorname[40];	
    	char  Nummer[40];
    
    	Telefon* next;    // Zeiger auf Datenobjekt des Typ Telefon.
    	Telefon* anfang;
    
     public:
    	int einfuegen();
    	void anzeigen();
    	void loeschen_pos();
    	void speichern();
    	void laden();
    
    	Telefon(void)     // Konstruktor
    	{
    		next=0;      // Next = 0 , sind wird am Anfang der Liste
    		anfang= 0;
    	}
     };
    
    streampos an_fang;
    
     //*--------------------------Datensätze einfuegen------------------------*/
    
     int Telefon::einfuegen()
     {
    
    	Telefon *neueintrag = new Telefon;
    
    	int wahl;
    
    	if(next!=0) //Jetzt muss überprüft werden, ob überhaupt ein Element in der Liste vorhanden ist:
    	{   
    		       //Es befindet sich bereits mindestens ein Element in der Liste.
    
    		system("cls"); // damit, wird aussehen als ob ein neues Fenster geöffnet wurde
    
    		cout<<"\nWo soll den neuen  Eintrag eingefuegt werden? Ihr Wahl bitte: \n\n";
    		cout<<".......UnterMENU.....\n";
    		cout<<"---------------------\n";
    		cout<<"\n1..Am Anfang\n";
    		cout<<"\n2..Am andere Stelle\n";
    		cout<<"\n3..Am Ende\n";
    		cout<<"\n4..Back to HauptMenu\n";
    		cout<<"---------------------\n";
    		cout<<"Ihr Wahl...:";
    		cin>>wahl;
    
    		//wahl = getch();  //wahl=wahl-48;
    	}
    
    	else // Falls noch kein Element in der Liste vorhanden ist, werden die Daten einfach eingehängt.
    	{
    		wahl=1;
    	}
    
    	switch(wahl)
    	{
    
    	case 1:
    		{
    			neueintrag->next = next;	//next des neuen elements zeigt auf das nächste Element
    			next =neueintrag;			//next des neuen elements bekommt die andresse des neuen elements zugewiesen
    
    			cout<<"\n\nName:\t\t";	 cin>>neueintrag->Name;
    			cout<<"\nVorname:\t";	 cin>>neueintrag->Vorname;
    			cout<<"\nNummer:\t\t";	 cin>>neueintrag->Nummer;
    
    			break;
    		}
    
    	case 2:  // Das Element muss irgendwo in der Mitte eingefügt werden.
    
    		{
    			string suchstring;	
    			Telefon *stelle;
    
    			cout<<"\nHinter welchem Name wollen sie einfügen ?\t"; 
    			cin>>suchstring;
    
    			stelle = next;	//neueintrag für die suche an das erste element setzten
    
    			while(stelle)
    			{
    				if(stelle->Name == suchstring)
    				{
    					neueintrag->next = stelle->next;
    					stelle->next = neueintrag;
    
    					cout<<"\n\nName:\t\t";  cin>>neueintrag->Name;
    					cout<<"\nVorname:\t"; cin>>neueintrag->Vorname;
    					cout<<"\nNummer:\t\t";  cin>>neueintrag->Nummer;
    					return 0;
    				}				
    				else
    				{ 
    					stelle = stelle->next; 
    				}
    			}
    
    			cout<<"\n\nEintrag nicht gefunden! Weiter mit beliebiger Taste..."; 
    			getch();
    			return 0;
    		}
    
    	case 3:	    //am ende einfügen
    		{
    			Telefon *stelle;
    			stelle = next;
    			while(true)
    			{
    				if(stelle->next == 0) // Mit Next auf NULL sind wir am Ende der Liste
    				{
    					stelle->next = neueintrag;
    					neueintrag->next = 0;
    
    					cout<<"\n\nName:\t\t";  cin>>neueintrag->Name;
    					cout<<"\nVorname:\t"; cin>>neueintrag->Vorname;
    					cout<<"\nNummer:\t\t";  cin>>neueintrag->Nummer;
    
    					return 0;
    				}
    				stelle = stelle->next;
    			}
    			break;
    		}
    
    	case 4:
    		{
    			return 0;
    		}
    
    	default:
    		{
    			cout<<endl<<"Option nicht vorhanden!!  Weiter mit beliebiger taste..."; 
    			getch();
    		}
    	}//ende switch
    
        return 0;
    } // ende einfuegen()
    
    /*-----------------------anzeige der vorhandenen Datensätze------------------------*/
     void Telefon::anzeigen()
    {
    
    	int ID=0;
    
          Telefon*ptr_show_element;
    
    	  ptr_show_element = next;
    
    	  if(ptr_show_element!=0) // Mindestens ein Element auf der Liste vorhanden.
    	  {
    
              while(ptr_show_element)
    
    		  {
    
                  ID++;
    
    	         cout << endl << setw(5) << left << ID << setw(20) <<  ptr_show_element->Name << setw(20) << ptr_show_element->Vorname << setw(15) << ptr_show_element->Nummer << endl;
    
    	         ptr_show_element = ptr_show_element->next;
    
    		  }
    	  }
    	  else
    	  {
    		  cout<<"!Liste noch leer!\n";
    	  }
    
     }
    
    /*----------------------------beliebiges Datensätzes loeschen------------------------------*/
     void Telefon::loeschen_pos()
    {
    
         char search_param[50];
    
    	 bool resume_search = true;
    
    	 cout << endl << "Welcher Eintrag soll geloescht werden?";
    	 cin >> search_param;
    
    	 Telefon *delete_pos ;
    
    	 Telefon *prev_pos ;
    
    	 prev_pos = this;
    
    	 delete_pos = next;
    
       while (delete_pos && resume_search)
    	{
    
       if (strcmp(delete_pos->Name,search_param)==0 )
    		{
    
          cout << delete_pos->Name << "\n wuerde geloescht\n";
    
    	  prev_pos->next = delete_pos->next;
    
    	  delete delete_pos;
    
    	  resume_search = false;
    
    		}
    	  else
    		{
    
    	  prev_pos = delete_pos;
    
    	  delete_pos = delete_pos->next;
    
    		}
    
    	}
    
       if (delete_pos == 0x00000000) 
       {
    
          cout << endl << "Kein Eintrag gefunden!"<<endl;
    
    	}
    }
    
    /*----------------------------Liste Speichern----------------------------------------------------*/
    
     void Telefon::speichern()
     { 
    	 Telefon *spei_element;
    	 spei_element = next;
    
    	 ofstream datei;
    	 datei.open ("Telefon.dat",ios::ate);
    
    	 if(spei_element==0)
    	 {
    		 cout<<"!Es sind keine Daten vorhanden!\n";
    	 }
    	 else
    	 {
    
         while(spei_element)
    	 {
    
    	 datei << spei_element->Name
    		   <<" "<< spei_element->Vorname
    		   <<" "<< spei_element->Nummer
    		   <<endl;
         spei_element = spei_element->next;
    
    	 }	 datei.close();
    	 cout<<"!Daten wuerden erfolgreich gespeichert!\n";
    	 }
    
     }
    
    /*-----------------------------Liste Laden--------------------------------------------------------*/
    
     void Telefon::laden()
     { 
    	 int id=0;
    	 Telefon *stelle;
    	 stelle = next;
    	 ifstream datei;
    
         datei.open("Telefon.dat");
    	/* if(!datei)
    	{
    		cout<<"\nEs ist ein Fehler beim oeffnen der Datei aufgetreten!"<<endl;
    		cout<<"Datei nicht vorhanden"<<endl;
    		getch();
    	}
    
    	else
    	{*/
    		//system("cls");
    
    		while(!datei.eof())//eof:für den test auf Dateiende 
    		{ datei.seekg(an_fang,ios::beg);
    		datei>>id>>stelle->Name>>stelle->Vorname>>stelle->Nummer;
    		stelle=stelle->next;
    		id++;	
    		}
    
    /*------------------------------Hauptprogramm------------------------------*/
    
    int main(void)
    
    {     
    	  int eingabe;
    
    	  ifstream d_laden;
    
          Telefon handy ;
    
    	  while (1 != 0)
      {
          cout << "\n.........HauptMENU.............";
          cout <<"\n-------------------------------\n";	
    	  cout << "1. Element einfuegen " << endl << endl;
    	  cout << "2. Liste anzeigen " << endl << endl;
    	  cout << "3. Beliebiges element loeschen " << endl << endl;
    	  cout << "4. Liste Speichern " << endl << endl;	
    	  cout << "5. Liste laden " << endl << endl;	
    	  cout << "0. Ende"; 
    	  cout <<"\n------------------------------- \n";
    	  cout <<"Nummer eingeben: ";
          cin>>eingabe;
    	  cout<< endl;
    	  switch (eingabe)
    
    		{
    
    	  case (1):				// Eintrag erstellen 
    		{
    
    	   handy.einfuegen ();
    
    		}
    	   break;
    
    	  case (2):    // 	zeigt alle Elemente der Liste in Tabellenform an.		
    		  {
    	   cout << setw(5) << left << "ID" << setw(20) <<  "Name" << setw(20) << "Vorname" << setw(15) << "Tel Nummer" << endl;
    
    	   cout <<"---------------------------------------------------------";
    
    	   handy.anzeigen();
    
    	   cout << endl << endl;
    
    		  }
    	   break;
    
    	  case (3):	     // beliebiges Element aus der liste löschen.			
    				{
    	             handy.loeschen_pos ();
    
    				}
    	   break;
    
    	  case (4):    // Liste Speichern
    	   {
    
    		   handy.speichern();
    
               cout<<endl;
    	   }
    		break;
    
    	  case (5):   // Liste Laden
    		  {
    			  handy.laden();
    
    			  cout<<endl;
    		  }
    		  break;
    
    	  case (0):	 // Programm verlassen.			
    
    	   exit (1);
           break;
    
    		}
    	}
    return 0;	
    }
    


  • Ich kann dir eine Prinziplösung anbieten, den Rest darfst du gerne selber erledigen:

    string zeile;
    ifstream datei("...");
    while(getline(datei,zeile))
    {
      /* zerlege die Zeile in ihre Bestandteile (da kannst du die Leerzeichen als
         Trennung verwenden)
      */
    
      /* Hänge Datensatz am Ende der Liste an (im Prinzip der 'case 3:' Fall von
         einfügen(), aber ich würde mir die Position des letzten Elements merken,
         anstatt es für jeden Schleifendurchlauf neu zu suchen)
      */
    }
    


  • CStoll schrieb:

    Ich kann dir eine Prinziplösung anbieten, den Rest darfst du gerne selber erledigen:

    string zeile;
    ifstream datei("...");
    while(getline(datei,zeile))
    {
      /* zerlege die Zeile in ihre Bestandteile (da kannst du die Leerzeichen als
         Trennung verwenden)
      */
    
      /* Hänge Datensatz am Ende der Liste an (im Prinzip der 'case 3:' Fall von
         einfügen(), aber ich würde mir die Position des letzten Elements merken,
         anstatt es für jeden Schleifendurchlauf neu zu suchen)
      */
    }
    

    ich hab grad versuch aber ich komme nicht durch. Ich würde mich freuen wenn jemanden für mich dies Programm abschnitte schreiben würde.Das ganz programm läut schon fehlerfrei und es fällt mir einfach diese "Lade Methode"



  • Fox River schrieb:

    Erstellen Sie dazu eine Klasse Telefon mit den String-Datenelementen Vorname, Name und
    Nummer.
    Die Elemente sollen dynamisch zur Laufzeit mit Hilfe des new-Operators erzeugt werden.
    Die Klasse soll die folgenden Methoden besitzen:
    Einfuegen ...

    Welche Klasse?

    Aus Deinem Code sehe ich, dass das Telefon identisch mit der Liste ist. gleichzeitig soll das Telefon aber auch Vorname, Name und Nummer enthalten.
    Das gibt wenig Sinn.

    Wenn Dein geposteter Code in etwa der korrekten Lösung entspricht, so würde ich erwarten, dass es eine Klasse Telefon gibt, die Objekte der Klasse Eintrag enthält. Und eine Klasse Eintrag, die wiederum die Attribute Name, Vorname und Nummer enthält.

    Fox River schrieb:

    #include <stdio.h>
     #include <iostream>
     #include <conio.h>
     #include <iomanip>
     #include <string>
     #include <fstream>
    
     using namespace std;
    
     class Telefon
    {
     private:
    	char Name[40];	
    	char Vorname[40];	
    	char  Nummer[40];
    

    Als Attribute solltest Du auf jeden Fall std::string statt char[] benutzen. Es soll doch ein C++-Programm werden - oder?

    Fox River schrieb:

    Das ganz programm läut schon fehlerfrei und es fällt mir einfach diese "Lade Methode"

    Angenommen. Du hast einen Eintrag mit den drei Strings

    #include <string>
    #include <iosream>
    
    class Eintrag
    {
    public:
        friend std::istream& operator>>( std::istream& in, Eintrag& telefon );
        friend std::ostream& operator<<( std::ostream& out, const Eintrag& telefon );
    
    private:
        // --   Members
        std::string Name;
        std::string Vorname;
        std::string Nummer;
    };
    

    Dann implementierst Du die dazu gehörigen Stream-Operatoren

    std::istream& operator>>( std::istream& in, Eintrag& e)
    {
        // Format: "Name Vorname Nummer"
        // z.B. "Starkmann Rudi 0891234567"
        return in >> e.Name >> e.Vorname >> e.Nummer;
    }
    
    std::ostream& operator<<( std::ostream& out, const Eintrag& e)
    {
        return out << e.Name << " " << e.Vorname << " " << e.Nummer;
    }
    

    so und jetzt noch die Methode Laden im Telefon

    void Telefon::laden()
    {
        ifstream datei("Telefon.dat");
        for( Eintrag e; datei >> e; )
        {
            // Eintrag 'e' an das Ende anhängen
            //   .. das überlasse ich Dir
        }
    }
    

    Gruß
    Werner



  • Hallo Wener und vielen dank für deine Hilfe.
    ich bin eigentlich nur ein anfänger mit C++ und die programierung im allgemein.mein bisherige ergebnis kommt von mehrere Hilfe und das ganze läuft ohne problem und nur fällt mir die Methode laden, um die Aufgabe abzugeben. Ich möchte nicht das ganz nochmal machen.



  • Fox River schrieb:

    Hallo Wener und vielen dank für deine Hilfe.
    ich bin eigentlich nur ein anfänger mit C++ und die programierung im allgemein.mein bisherige ergebnis kommt von mehrere Hilfe und das ganze läuft ohne problem und nur fällt mir die Methode laden, um die Aufgabe abzugeben. Ich möchte nicht das ganz nochmal machen.

    Na ja - dann nenne Eintrag in meinem Code eben Telefon. Das sollte genauso funktionieren. Die Methoden die Telefon schon hat bleiben erhalten und die Stream-operatoren kommen noch dazu.

    gruß
    Werner
    PS.: fehlt nicht fällt


Anmelden zum Antworten