Sotieralgorithmen (FH Praktikum)



  • Hallo,

    ich muss morgen mein Programm vorzeigen, ob ich jetzt euch frage oder morgen den Professor ist ja egal.

    Wir sollen ein Programm schreiben, bei dem der Benutzer zwischen 4 Sotieralgorythmen sich was aussuchen kann. Jo ok ich hab ein menü gemacht und habe mehrere Funktionen geschrieben und nun hab ich ein Problem zwischen Zeigen bzw. mit Datentypen "string" oder "char"

    Ich dachte ich kann dem Array ("zeichensatz") den datentyp string zuweisen und dann per cin ein ganzen zeichensatz einlesen.

    Ich würde mich freuen, wenn mir jemand sagen könnte wie ich das am besten mache bzw. was falsch ist. Ich müsste das Programm morgen (5.1.) lauffähig abgeben.

    Hier mein Code der nicht läuft.:

    #include <iostream>
    #include <string>
    using namespace std;
    
    void arrayeingabe();
    void bubbleSort (string);
    void selectionSort(string);
    void insertionSort(string);
    void qs(string, int, int);
    
    const int arraysize = 10;
    string zeichensatz[arraysize];
    //char *daten = &zeichensatz[0];
    
    void main()
    {
    	int menunumber = 0;
    	int links, rechts;
    
    	cout << "Sort-Menu" << endl;
    	cout << "---------" << endl;
    	cout << "1. BubbleSort" << endl;
    	cout << "2. SelectionSort" << endl;
    	cout << "3. InsertionSort" << endl;
    	cout << "4. QuickSort" << endl << endl;
    
    	cout << "Bitte geben Sie die Menünummer ein (1-4): ";
    	cin >> menunumber;
    
    	switch(menunumber)
    	{
    		case (1): 
    			{
    				arrayeingabe();
    				bubbleSort(*zeichensatz);
    				break;
    			}
    		case (2): 
    			{
    				arrayeingabe();
    				selectionSort(*zeichensatz);
    				break;
    			}
    		case (3): 
    			{
    				arrayeingabe();
    				insertionSort(*zeichensatz);
    				break;
    			}
    		case (4): 
    			{
    				arrayeingabe();
    				cout << "Bitte geben Sie die untere Schranke ein : ";
    				cin >> links;
    				cout << "\nBitte geben Sie die obere Schranke ein : ";
    				cin >> rechts;
    				qs(*zeichensatz, links, rechts);
    				break;
    			}
    		default: break;
    	};
    
    }
    
    void arrayeingabe()
    {
    //	for (arraypos = 0; arraypos <= arraysize; arraypos++)
    //	{
    	cout << "Bitte geben sie einen beliebigen Zeichensatz ein : ";
    	cin >> zeichensatz[10];
    	cout << endl;
    
    }
    
    void bubbleSort(string &daten) 
    {
    	int zaehler;
    	zaehler = daten.length();
    
    	for (int lauf=1; lauf <zaehler; lauf++)	
    	{ // Läufe
    
    		for (int element=zaehler-1; element>=lauf; element--) 
    		{ // ein Lauf
    
    			if (daten[element-1] > daten[element]) 
    			{ // vertauschen
    				char tmp = daten[element-1];
    				daten[element-1] = daten[element];
    				daten[element] = tmp;
    			}
    		}
    	}
    }
    
    void selectionSort(string &daten) 
    {
    	int zaehler;
    	zaehler = daten.length();
    
    	for (int a=0; a <zaehler-1; a++) 
    	{
    		int c=a; // index kleistes Element
    		char min = daten[a]; // kleinstes Element
    
    		for (int b=a+1; b<zaehler; b++) 
    		{ // suche kleinstes Element
    
    			if (daten[b] < min) 
    			{
    				c = b;
    				min = daten[b];
    			}
    		}
    
    		daten[c] = daten[a]; // vertausche aktuelles Element mit kleinstem Element
    		daten[a] = min;
    	}
    }
    
    void insertionSort(string &daten) 
    {
    	int zaehler;
    	zaehler = daten.length();
    
    	for (int a=1; a <zaehler; a++)	
    	{ // Läufe
    		char tmp=daten[a];
    		int b = a-1;
    
    		while (b>=0 && tmp<daten[b]) 
    		{ // einfügen an richtiger Stelle
    			daten[b+1] = daten[b];
    			b--;
    		}
    		daten[b+1] = tmp;
    	}
    }
    
    void qs(string &daten, int links, int rechts) 
    {
    	int i,j;
    	char x,y;
    
    	i=links; j=rechts;
    	x = daten[(links+rechts)/2]; // mittleres Element
    
    	do 
    	{
    		while (daten[i]<x && i<rechts) i++; // such Element für "große Klasse"
    		while (x<daten[j] && j>links) j--; // such Element für "kleine Klasse"
    
    		if (i<=j) 
    		{ // vertausche Elemente
    			y = daten[i];
    			daten[i] = daten[j];
    			daten[j] = y;
    			i++; j--;
    		}
    	} while (i<=j);
    
    //	if (links<j) qs(daten, links, j); // Aufruf für "kleine Klasse"
    //	if (i<rechts) qs(daten, i, rechts); // Aufruf für "große Klasse"
    }
    


  • du musst die wörter einzeln in einer schleife einlesen.



  • meinst du

    void arrayeingabe()
    {
    //    for (arraypos = 0; arraypos <= arraysize; arraypos++)
    //    {
        cout << "Bitte geben sie einen beliebigen Zeichensatz ein : ";
        cin >> zeichensatz[10];
        cout << endl;
    
    }
    

    Also die Zeichen einzeln einlesen. Also muss ich doch mit einer For-Schleife arbeiten?

    Also die Sortiertfunktionen waren vorgegeben. Bei denen muss ich dann mit dem string datentyp arbeiten.



  • Kann es sein, dass du bubbleSort mit selectionSort verwechselt hast?



  • Ja schau doch mal, was du hier tust...

    cin >> zeichensatz[10];
    

    Du liest also in das 10. Feld die Eingabe ein.
    Immer das 10. Feld.
    Wozu hast du denn ein Array, wenn du immer nur das 10. Feld beschreibst 😕

    Außerdem wird die Funktion nur einmal durchlaufen.



  • Glaube ich jetzt grade nicht. Wir können jedenfalls die Sorieralgorythmen aus unserem Skript herauskopieren. Wenn es falsch wäre dann von unserem Prof. ;o)



  • ähm ja das mit der 10 war nur zum probieren

    als erstes hatte ich

    cin >> zeichensatz;
    

    stehen

    das mit dem einen Druchgang stimmt schon, da ich dachte ich kann die Zeichen mit dem cin in das array speichern und dann die zeichen einzeln auslesen.



  • DragonShaolin schrieb:

    das mit dem einen Druchgang stimmt schon, da ich dachte ich kann die Zeichen mit dem cin in das array speichern und dann die zeichen einzeln auslesen.

    Aber warum nimmst du dann ein Array von 10 Strings?
    Sieh dir doch mal an, was die Sortierfunktionen als Parameter erwarten.



  • DragonShaolin schrieb:

    Glaube ich jetzt grade nicht. Wir können jedenfalls die Sorieralgorythmen aus unserem Skript herauskopieren. Wenn es falsch wäre dann von unserem Prof. ;o)

    dein deutsch macht mich krank



  • Hey sorry, bin müde. Dann überlese es bitte.



  • steff3 schrieb:

    dein deutsch macht mich krank

    Dann gehe lieber nicht in's Spieleforum 😉
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-131031.html

    @Topic:
    Also wenn du 10 Strings einlesen willst, und dann mit den jeweils ersten Buchstaben einen String erstellen möchtest, brauchst du auf jeden Fall eine Schleife.

    Um die 10 Strings einzulesen und um einen String aus den Buchstaben zu bauen. (Mit dem += Operator)



  • Wie übergebe ich das Array in die Funktion

    Geht das nicht so?

    char array[10] = {1,2,3,4,5};
    
    bubblesort (array)
    
    bubblesort (char &p_array)
    {
    //code
    
    }
    


  • Nein, da übergäbst du ja eine Referenz auf char und keinen Pointer.
    Nur letzterer kann als erstes Feld eines Arrays angesehen werden.

    Also was möchtest du eigentlich?
    Einen String übergeben (bzw. per Referenz) und dessen Buchstaben dann per [] ansprechen oder ein Array aus char übergeben.
    Klär das erstmal ab.



  • ich möchte lieber einen string übergeben und dann per [] ansprechen.

    Also mit dem test programm ist es möglich als char einzulesen und einzelne zeichen mit dem datentyp string auszugeben.

    #include <string>
    
    #include <iostream>
    using namespace std;
    
    void main()
    {
    string b;
    
    	char a = 'a';
    	char c = 'e';
    	char e[10];
    	cin >> e;
    b+=e;
    	cout << b << endl;
    cout << b[1];
    
    }
    

    Jetzt muss ich nur noch verstehen wie ich z.b. bei dieser Funktion "void bubbleSort(string &daten)" den Array übergebe und ich in der Funktion dann mit dem String datentyp weiterarbeiten kann. So wurde unsere Funktion vorgegeben.

    Ich habe jetzt mein programm etwas verändert.

    Die eingabe:

    void arrayeingabe()
    {
    	cout << "Bitte geben sie einen beliebigen Zeichensatz ein : ";
    	cin >> zeichensatz;
    	cout << endl;
    	weitergabe += zeichensatz;
    }
    

    weitergabe hat den datentyp string.

    nun bei dem Aufruf von bubblesort(weitergabe) funktioniert so nicht.

    Error:
    Übung 5 (Aufgabe 1) error LNK2019: Nicht aufgeloestes externes Symbol "void __cdecl bubbleSort(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?bubbleSort@@YAXV?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?$allocator@D@2@@std@@@Z), verwiesen in Funktion _main
    Übung 5 (Aufgabe 1) fatal error LNK1120: 1 unaufgeloeste externe Verweise

    So ich gehe jetzt ins bett und schau morgen nochmal rein.



  • hi,

    wenn du einen string direkt eingeben willst, nimm doch getline:

    string s;
       getline(cin,s);
    


  • fuer den bubblesort hats so funktioniert:

    string zeichensatz;
    
    void arrayeingabe() {
        cout << "Bitte geben sie einen beliebigen Zeichensatz ein : ";
        cin.ignore();\\letztes enter ignorieren
        getline(cin,zeichensatz);
    }
    
    void bubbleSort(string daten) {
        int zaehler;
        zaehler = daten.length();
    
        for (int lauf=1; lauf <zaehler; lauf++)  { // Läufe
            for (int element=zaehler-1; element>=lauf; element--)  { // ein Lauf
                if (daten[element-1] > daten[element])  { // vertauschen
                    char tmp = daten[element-1];
                    daten[element-1] = daten[element];
                    daten[element] = tmp;
                }
            }
        }
        cout<<"\nsortiert:\n"<<daten<<endl;
    }
    ...
    switch(menunumber)
        {
            case (1):
                {
                    arrayeingabe();
                    bubbleSort(zeichensatz);
                    break;
                }
    ...
    

Anmelden zum Antworten