Problem mit Array (War: Hi all)



  • Habe for ein Programm zu schreiben (Structs).
    Ich möchte datensätze eingeben, und dann ausgeben, suchen und sortieren.

    #include <iostream>
    #include <conio.h>
    #include <string>
    #include <iomanip>
    #include <time.h>
    #include "conioex.h"
    using namespace std;
    
    int main()
    {
    int wahl;
    struct mensch{char nachname[20];
    			  char vorname [20];
    			  char email   [30];
    			  char geburtsjahr[5];};
    
    mensch mensch_liste[5];
    
    int zaehler=0,y_achse=2;
    char entscheidung2,entscheidung;
    
    	do
    	{
    
    	system("cls");
    	textcolor(LIGHTGREEN);
    	gotoxy(32,6);
    	cout<<"Werbung";
    	textcolor(LIGHTGRAY);
    	gotoxy(32,8);
    	cout<<"Eingabe   (1)";
    	gotoxy(32,9);
    	cout<<"Ausgabe   (2)";
    	gotoxy(32,10);
    	cout<<"Suchen    (3)";
    	gotoxy(32,11);
    	cout<<"Sortieren (4)";
    	gotoxy(32,13);
    	cout<<"Waehlen Sie => ";
    	cin>>wahl;
    
    	switch(wahl)
    	{
    		case 1:
    		{
    
    			for(zaehler=0;zaehler<5;zaehler++)
    			{
    				do
    				{
    				system("cls");
    				cout<<"Geben Sie ihren Vornamen ein      =>";
    				cin>>mensch_liste[zaehler].vorname;
    				cout<<"Geben Sie ihren Nachnamen ein     =>";
    				cin>>mensch_liste[zaehler].nachname;
    				cout<<"Geben Sie ihre E-Mail- Adresse an =>";
    				cin>>mensch_liste[zaehler].email;
    				cout<<"Geben Sie ihr Geburtsjahr an      =>";
    				cin>>mensch_liste[zaehler].geburtsjahr;
    
    				cout<<"Wollen Sie weiter Daten eingeben?";
    				cin>>entscheidung2;
    
    				}
    				while(entscheidung2 != n);
    			}
    
    		}
    
    		case 2:
    		{
    			system("cls");
    
    			for(zaehler=0;zaehler<5;zaehler++)
    			{
    				gotoxy(1,2+y_achse*2);
    				cout<<mensch_liste[0+zaehler].nachname;
    				gotoxy(1,3+y_achse*2);
    				cout<<mensch_liste[0+zaehler].vorname;
    				gotoxy(1,4+y_achse*2);
    				cout<<mensch_liste[0+zaehler].email;
    				gotoxy(1,5+y_achse*2);
    				cout<<mensch_liste[0+zaehler].geburtsjahr;
    
    			}
    
    		}
    
    		case 3:
    		{		
    			system("cls");
    
    			for(zaehler=0;zaehler<5;zaehler++)
    			{
    				system("cls");
    				cout<<"Geben Sie den Nachnamen ein =>";
    				cin>>mensch_liste[zaehler].nachname;
    				cout<<"Geben Sie ihr Geburtsjahr an      =>";
    				cin>>mensch_liste[zaehler].geburtsjahr;
    			}
    
    		}
    
    		case 4:
    		{
    
    		}
    	}
    
    	cout<<"Wolllen sie das Proggramm beenden?(j/n)";
    	cin>>entscheidung;
    
    	}
     	while(entscheidung == 'j');
    
    	getch();
    	return 0;
    }
    

    das hab ich bisher hinbekommen, so aber ne bestimmt sehr dumme frage von mir aber wie kann mir aussuchen wieviel datensätze ich eingeben möchte?
    ich habs mit ner schleife versucht aber der machts es nicht

    Edit by SideWinder: Titel angepasst.



  • Du packst die Datensätze in ein Array, das genau 5 Elemente fasst - das ist die Obergrenze für deine Datensätze. Vermutlich bist du besser aufgehoben, wenn du stattdessen einen vector<> verwendest (und wo wir gerade dabei sind - verwende std::string anstelle der char-Arrays (bzw. short für das Geburtsjahr):

    struct mensch
    {
      string nachname;
      string vorname;
      string email;
      unsigned short gebjahr;
    };
    
    vector<mensch> mensch_liste;
    do
    {
      mensch input;
      cout<<"Bitte Nachname eingeben (EXIT für Ende):"
      cin>>input.nachname;
      if(input.nachname=="EXIT") break;
      ...//Vorname, E-Mail und Geburtsjahr analog abfragen
      mensch_liste.push_back(input)
    }while(cin);
    

    Edit: Und bitte gib deinen Beiträgen einen aussagekräfitgeren Titel.



  • ok sorry war nicht mit absicht.

    warum vector?



  • weil... -denk ich mir mal-, du versucht hast eine liste aus deiner struct zu basteln... da es aber mit voctor einfacher ist und du dir so mit quelltext sparen kannst, solltest du lieber einen vector verwenden, weil du hier schon vordefinierte funktionen hast zum einfuegen und löschen und ich glaube auch soriteren einer liste. genau so gut kannst du auch eine list<> verwenden, die ist sogar noch etwas flexibler als ein vector<>.

    gruß Tobi.



  • C_Style schrieb:

    warum vector?

    Kurz: Der vector kann (im Gegensatz zu deinem Array) mit den Anforderungen wachsen. (aber du hast recht, theoretisch könnte auch list<>, deque<> oder sogar set<>/multiset<> für deine Zwecke besser geeignet sein - dazu weiß ich zu wenig über die Anforderungen, die du stellst)



  • Dieser Thread wurde von Moderator/in SideWinder aus dem Forum DOS und Win32-Konsole in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • könnt ihr mir mal so seiten zeigen, wo ich beispiele sehen kann oder sonstige nützliche informationen?



  • www.cppreference.com für eine gute (aber nicht unbedingt komplette) Übersicht, würde ich sagen.

    Ansonsten vielleicht eines der hier im Forum vorgeschlagenen Onlinetutorials.

    Ach, und zu guter Letzt sollte das Buch "Thinking in C++" Ban 1 und 2 von Bruce Eckels komplett online verfügbar sein (www.bruceeckels.com oder so ähnlich, etwas googln einfach) Da gibt es auch genügend Beispiele und ne nette Übersicht über die gebräuchlichsten Sachen.



  • vielen dank



  • Trotz dieser ganzen vorschläge möchte ich erstmal die grundlegenden Sachen machen.

    case 3:
    				{		
    					system("cls");
    
    					for(zaehler2=0;zaehler2<5;zaehler2++)
    					{
    						system("cls");
    						cout<<"Geben Sie den Nachnamen ein =>";
    						cin>>mensch_liste[zaehler2].suchname;
    
    						if(mensch_liste[zaehler2].suchname == mensch_liste[zaehler].nachname)
    						{
    							cout<<"Es wurden folgende Namen gefunden!";
    							gotoxy(5,20);
    							cout<<mensch_liste[zaehler2].suchname;
    						}
    
    						cout<<"\n\nWollen Sie weitere Daten suchen(j/n) => ";
    						cin>>entscheidung1;
    
    						if(entscheidung1== 'j')
    						{
    							zaehler=4;
    						}
    						else
    						{
    
    						}
    					}
    					break;
    				}
    

    Ich möchte den nachnamen suchen den ich davor eingegeben habe?? wie funzt das?



  • Seh dir mal auf dem obigen Link std::find() an.

    Zusätzlich brauchst du vielleicht noch eine COmparator Klasse:

    struct VergleicheNachname{
        bool operator()(const mensch& m1,const mensch& m2){
            return m1.nachname==m2.nachname;
        }
    };
    

    Die musst du mit an find übergeben.

    Ich garantiere absolut nicht für Korrektheit, falls es falsch ist bitte sagen.

    (PS: das struct mensch wäre vielleicht besser global, imho)

    EDIT: struct war class... danke DanielPB



  • Und das ganze noch public machen!



  • Grml, irgendwie in letzter Zeit zu oft class geschrieben... Danke, habs editiert.



  • Hi Leute

    Also die eingabe, Ausgabe und die Suche meiner Datenfelder hab ich bereits.
    Doch ich habe keine Ahnung wie ich diese sortieren soll.
    ich möchte die eingegeben daten erstmal ausgeben (unsortiert und dann im selben menue sortiert ausgeben

    Wie geht das??

    struct mensch{	char nachname[20];
    					char vorname [20];
    					char email   [30];
    					int geburtsjahr;};
    	mensch mensch_liste[5];
    
    	int wahl;
    	int anzahl=0;
    	const int durchlauf=5;
    
    	char nachname1[20];
    	char entscheidung2;
    	bool entscheidung;
    
    	do
    	{
    		system("cls");
    		textcolor(LIGHTGREEN);
    		gotoxy(32,6);
    		cout<<"Werbung";
    		textcolor(LIGHTGRAY);
    		gotoxy(32,8);
    		cout<<"Eingabe   (1)";
    		gotoxy(32,9);
    		cout<<"Ausgabe   (2)";
    		gotoxy(32,10);
    		cout<<"Suchen    (3)";
    		gotoxy(32,11);
    		cout<<"Sortieren (4)";
    		gotoxy(32,13);
    		cout<<"Waehlen Sie => ";
    		cin>>wahl;
    
    		switch(wahl)
    		{	//Eingabe
    			case 1:
    			{
    								//0				//5
    				for(int zaehler=anzahl;zaehler<durchlauf;zaehler++)
    				{
    					system("cls");
    					cout<<"Geben Sie ihren Vornamen ein      =>";
    					cin>>mensch_liste[zaehler].vorname;
    					cout<<"Geben Sie ihren Nachnamen ein     =>";
    					cin>>mensch_liste[zaehler].nachname;
    					cout<<"Geben Sie ihre E-Mail- Adresse an =>";
    					cin>>mensch_liste[zaehler].email;
    					cout<<"Geben Sie ihr Geburtsjahr an      =>";
    					cin>>mensch_liste[zaehler].geburtsjahr;
    
    					anzahl=zaehler+1;
    						//0+1=1<5
    					if(zaehler+1<durchlauf)
    					{
    						cout<<"\n\nWeitere Namen eingeben (j/n) ?         : ";
    						cin>>entscheidung2;
    
    						if(entscheidung2=='n')
    						{
    							// Wenn entscheidung=nein,wird zaehler auf 5 gesetzt.
    							zaehler=durchlauf;
    						}
    					}
    				}	
    				break;
    			}
    			//Ausgabe
    			case 2:
    			{
    				system("cls");
    				anzahl=0;
    
    				for(int zaehler=anzahl;zaehler<durchlauf;zaehler++)
    				{
    					gotoxy(1,1*zaehler+7);
    					cout<<mensch_liste[zaehler].nachname;
    					gotoxy(15,1*zaehler+7);
    					cout<<mensch_liste[zaehler].vorname;
    					gotoxy(30,1*zaehler+7);
    					cout<<mensch_liste[zaehler].email;
    					gotoxy(65,1*zaehler+7);
    					cout<<mensch_liste[zaehler].geburtsjahr;
    
    					if(zaehler+1<durchlauf)
    					{
    						gotoxy(1,13);
    						cout<<"Weiter zum nächsten Namen (j/n) ? : ";
    						cin>>entscheidung2;
    
    						if(entscheidung2=='n')
    						{	
    							zaehler=durchlauf;
    						}
    					}
    				}
    				break;
    			}
    			//Suchen
    			case 3:
    			{		
    				system("cls");
    				anzahl=0;
    
    				cout<<"Geben Sie den Nachnahmen an => ";
    				cin>>nachname1;
    								//0				//5
    				for(int zaehler=anzahl;zaehler<durchlauf;zaehler++)
    				{
    					if(strcmp(mensch_liste[zaehler].nachname,nachname1)==0)
    					{
    						cout<<"\nNachnamen       : "<<mensch_liste[zaehler].nachname;
    						cout<<"\nVornamen        : "<<mensch_liste[zaehler].vorname;
    						cout<<"\nGeburtsjahr     : "<<mensch_liste[zaehler].geburtsjahr;
    						cout<<"\nE-mail addresse : "<<mensch_liste[zaehler].email;	
    					}
    				}
    				break;
    
    //sortieren			}
    case 4:
    {
    break;
    }
    


  • Für sortieren wird dir std::sort ganz nützlich sein. Wenn du immer nach dem gleichen Kriterium sortierst kannst du dazu den operator< überladen

    bool operator<(const mensch& m1,const mensch& m2){
        //Wann ist ein mensch "kleiner" (also soll in der Liste weiter vorne stehen) als ein anderer?
    }
    

    Ansonsten wieder einen Comperator wie oben, der diesmal ausgibt, welches der beiden kleiner ist.

    Hilft das?

    (PS: den Code habe ich mir jetzt nicht nochmal ganz durchgelesen)



  • kannst du ditt mal so schreiben das das zu mein programm passt vielleicht versteh ich es ja dann eher, weil die ganzen begriffe da sind mir neu



  • bool operator<(const mensch& m){
       return strcmp(nachname,m.nachname)<0;
    }
    

    Das da fügst du IN dein struct mensch ein.

    sort(mensch_liste,mensch_liste+5);
    

    Das da wo sortiert werden soll.

    Ichg bin mir nicht ganz sicher, versuch mal ob es funktionniert. Wenn nichgt bitte melden mit Fehlerbeschreibung und dem geänderten Teil deines Codes.



  • struct mensch{	char nachname[20];
    					char vorname [20];
    					char email   [30];
    					int geburtsjahr;
    					bool operator<(const mensch& m1,const mensch& m2){
        return m1.nachname<m2.nachname;};
    
    	mensch mensch_liste[5];
    
    case 4:
    			{
    				system("cls");
    				anzahl=0;
    
    				textcolor(LIGHTRED);
    				cout<<"Unsortierte Liste";
    				textcolor(LIGHTGRAY);
    
    				for(int zaehler=anzahl;zaehler<durchlauf;zaehler++)
    				{
    					sort(mensch_liste,mensch_liste+5);
    
    					gotoxy(1,1*zaehler+7);
    					cout<<mensch_liste[zaehler].nachname;
    					gotoxy(15,1*zaehler+7);
    					cout<<mensch_liste[zaehler].vorname;
    					gotoxy(30,1*zaehler+7);
    					cout<<mensch_liste[zaehler].email;
    					gotoxy(65,1*zaehler+7);
    					cout<<mensch_liste[zaehler].geburtsjahr;
    				}
    
    				break;
    			}
    

    meinst du dit so???



  • Kaum habt ihr mal conio.h gefunden glaubt ihr echt man müsste alles damit machen -.- Man nervt das...
    Ich beziehe mich auf:

    system("cls");
            textcolor(LIGHTGREEN);
            gotoxy(32,6);
            cout<<"Werbung";
            textcolor(LIGHTGRAY);
            gotoxy(32,8);
            cout<<"Eingabe   (1)";
            gotoxy(32,9);
            cout<<"Ausgabe   (2)";
            gotoxy(32,10);
            cout<<"Suchen    (3)";
            gotoxy(32,11);
            cout<<"Sortieren (4)";
    

    ... das geht auch mit nem std::endl und nem \t ...



  • das ist hier doch sowas von hose man?
    ich bin anfänger und möchte grund auf lern wie das alles funktioniert, brauche keine klugscheißer.

    ich brauche welche die mir mit einfachen mitteln erklären können wie das geht auf das Wissen welches ich bisher besitzte.


Anmelden zum Antworten