Frage zu switch-case Konstruktion und header_Einbindung



  • Hallo zusammen, stehe mal wieder vor einem Problem 😞

    Wir sollen ein Programm schreiben welches eingegebene Werte sortiert. Dabei gibt es zwei Abfragen

    1. nach welchen Kriterien der Werte sortiert werden sollen (Wert, Betrag, Quersumme, etc.)

    2. nach welchem Algorithmus sortiert werden soll (Bubblesort, qsort, usw.)

    Nun möchte mein Dozent das wir das ganze mit switch-case lösen, indem wir zunächst den ersten Menü-Auswahl in eine int-Variable schreiben und dann die zweite Menüauswahl in eine zweite int_Variabel schreiben.

    Über die Formel 10*iZahl1+iZahl2 soll das Ergebnis in eine Variable geschrieben werden und diese in switch-case genutzt werden um die passende Funktion aufzurufen.
    Beispiel:
    Menu I Auswahl: 2
    Menu II Auswahl: 1 --> Wert für switch-case: 21

    Nur wenn ich folgendes schreibe:

    switch (cWahl)
    {
      case '21':
        Funktion1 (dFeld, nAnzahl);
      break;
    }
    

    so meldet der Compiler das der Wert "21" für case nicht genutzt werden darf (darf anscheinend nur ein char sein)

    Wie also bitte soll ich anhand des Wertes 21 die Verzweigung mit switch-case gestalten ?

    Wäre dankbar wenn da jemand einen Tipp hätte.
    Ich persönlich hätte ja einfach die Summe aus den beiden Menüauswahlen gebildet (kann nicht mehr als 9 sein) und hätte darüber verzweigt, aber der Dozent will unbedingt anhand dieser Formel das ganze haben.

    Das Problem mit meinem header:

    Hier mal ein Auszug aus meiner main-Funktion:

    #include "header.h"
    

    und später dann:

    BubbleSort (dFeld, nAnzahl);
    

    in header.h steht;

    void BubbleSort (double* dFeld, int nAnzahl);
    

    Dennoch bekomme ich beim Kompilieren die Fehlermeldung "undefined reference to 'BubbleSort'

    Ich weiss einfach nicht was ich falsch mache in diesem Fall, zumal meine früheren Programme alle laufen und diesen Fehler nicht aufweisen. Habe manchmal den Eindruck das es irgendwie mit meinem Linux zusammenhängt, programmiere unter OpenSuSE 10.3 in einer VirtualBox-Umgebung.

    Also nochmal Danke für eure Hilfe

    Gruss,
    Lalas



  • lalas schrieb:

    ...
      case '21':
    ...
    

    mach diese ' ' weg, dann klappt das.
    🙂



  • statt

    case '21':

    case 21:
    

    undefined reference to 'BubbleSort'

    vermutlich existiert keine definition der funktion, oder die datei ist dem compiler nicht bekannt.



  • SUPER, vielen Dank!

    Also ich habe die Probleme beheben können, der Tipp mit dem Entfernen der Hochkommas war schonmal sehr gut.

    Das Problem mit den Funktionsaufrufe hat sich auch erledigt, ich weiss zwar nicht woran es lag, aber auf einmal geht es 😉

    Aber nun ist eine neue Fragestellung aufgetaucht, vielleicht ist jemand so nett und gibt mir da einen Tipp:

    Also der Aufruf der passenden Funktion in Abhängigkeit der beiden Menu-Abfragen funktioniert prächtig.
    Nun soll am Ende die Frage kommen, ob man das array erneut sortieren lassen will nach anderen Kriterien (mit J/N beantworten)

    Gibt es in C sowas wie GOTO (gabs mal in BASIC), so dass ich quasi schreiben kann:

    if frage=J then goto zeile 20

    Natürlich ist das nur "symbolisch" geschrieben. Kann man also irgendwie in den code-Zeilen springen ?



  • lalas schrieb:

    if frage=J then goto zeile 20

    if (frage == 'J') goto zeile20;
    ... // code der übersprungen wird
    ...
    zeile20: // sogananntes 'label', ein wort mit doppelpunkt dahinter
    ... // code zu dem gesprungen wird
    ...
    

    🙂



  • So ich habe dann mal das ganze mit do_while gemacht anstatt mit dem goto und label, denke mal das ist die elegantere Variante.

    Aber eine Frage hätte ich noch, vielleicht kann mir da jemand nochmal einen Tipp geben.

    Ich muss aus einer int_Zahl die höchste Ziffer rausbekommen. Also bei 5964 wäre das die 9.

    Dachte mit ich lese die Zahl in ein array ein und mache dann einfach nen BubbleSort mit dem array, aber das muss doch irgendwie einfacher zu machen sein, oder ?



  • lalas schrieb:

    BubbleSort

    nee, einfach in einer schleife durch die zeichen gehen und das grösste merken.
    🙂



  • Danke das klappt auch schonmal soweit 🙂

    Aber ein neues Problem is aufgetaucht:

    Meine eigens geschriebene Quicksort-Funktion sortiert nicht richtig wenn ich Quersumme oder Betrag als Kriterium auswähle.

    Hier mal mein Quelltext für Quicksort nach Betrag:

    // Eigenes Quick Sort für Betrag
    void IntQuiSortBtr (int* nFeld, int von, int bis) 
    {
    	int links = von;
    	int rechts = bis;
    	int nVergleich = (nFeld[(von+bis)/2]);
    
    	do
    	{
    		while (fabs(nFeld[links]) < fabs(nVergleich)) links++;
    		while (fabs(nFeld[rechts]) > fabs(nVergleich)) rechts--;
    		if (links<=rechts)
    		{
    			int nSicher = nFeld[links];
    			nFeld[links] = nFeld[rechts];
    			nFeld[rechts] = nSicher;
    			links++; rechts--;
    		}
    	}
    	while (links <= rechts);
    
    	if (von < rechts) IntQuiSortWrt (nFeld, von, rechts);
    	if (rechts < bis) IntQuiSortWrt (nFeld, links, bis);
    }
    
    void IntQuickSortMainBtr (int* nFeld, int nAnzahl)
    {
    	IntQuiSortBtr (nFeld, 0, nAnzahl-1);
    }
    

    Wichtig dabei ist, dass die array-Werte nicht in Beträge umgewandelt werden sollen, sondern nur beim Vergleichen als Betrag betrachtet werden sollen.

    Ich sehe den Fehler einfach nicht, vielleicht hat da jemand ein Auge für.


Anmelden zum Antworten