Wo liegt der Fehler?



  • hallo

    ich soll ein programm schreiben mit dem ich verschiedene mannschaften sowie deren statistik eingeben kann. das wären z.b. siege niederlagen spieltage etc.

    ich hab hier schonmal was geschrieben. das einlesen funktioniert problemlos, nur sobald ich es sortieren will ( nach punktzahl, höchste punktzahl ganz oben )

    ich VERMUTE der fehler liegt in der funktion "ausgeben" oder "sortieren". Ich bin sicher man kann das sicher eleganter machen aber ich bin leider nur anfänger.

    hoffe mir kann einer helfen.

    mfg

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <conio.h>
    
    using namespace std;
    
    char auswahl;
    int u=0;
    int anz=0;
    int i=0;
    
    struct mannschaft
    {
    	char vname[20];
    	int sieg;
    	int nied;
    	int unent;
    	char datum[20];
    	int spiele;
    	int punkte;
    };
    
    void lesen(struct mannschaft* m)
    {
    	system("cls");
    	cout<<"Geben sie folgende Daten ein:"<<endl;
    	cout<<"Name des Vereins"<<endl;
    	cin>>m[u].vname;
    	cout<<"Anzahl gewonnener Spiele: "<<endl;
    	cin>>m[u].sieg;
    	cout<<"Anzahl unentschiedener Spiele: "<<endl;
    	cin>>m[u].unent;
    	cout<<"Anzahl verlorener Spiele: "<<endl;
    	cin>>m[u].nied;
    	cout<<"Datum des letzten Spiels: "<<endl;
    	cin>>m[u].datum;
    	system("cls");
    	u++;
    }
    
    void ausgeben(struct mannschaft* m)
    {
    	printf("Verein\t\tSpiele\tgew\tunent\tnied\tPunkte\tDatum\n");
    	printf("-------------------------------------------------------------\n");
    
    	for (u=0; u<anz; u++)
    		{
    			m[u].spiele = m[u].sieg + m[u].unent + m[u].nied;
    			m[u].punkte = 3 * m[u].sieg + m[u].unent;
    			printf("%s\t\t%d\t%d\t%d\t%d\t%d\t%s\n",m[u].vname,m[u].spiele,m[u].sieg,m[u].unent,m[u].nied,m[u].punkte,m[u].datum);
    		}
    }
    
    void sortieren(struct mannschaft* m)
    {
    	mannschaft zwischenspeicher;
    
    	 while(anz--)
    		for (i=0; i<anz; i++)
    			if (m[u+1].punkte > m[u].punkte)
    				{
    					zwischenspeicher = m[u];
    					m[u] = m[u+1];
    					m[u+1] = zwischenspeicher;
    				}
    }
    
    int main()
    {
    	struct mannschaft m[10];
    
    	do
    	{
    	printf("Mannschaften Version 1.0\n");
    	printf("Auswahl\n");
    	printf("(N) Neue Mannschaft anlegen\n");
    	printf("(L) Mannschaften auflisten\n");
    	printf("(B) Beenden\n");
    	printf("Was moechten Sie tun? (N/L/B)\n");
    	scanf("%c", &auswahl);
    
    	switch (auswahl)
    	{
    	case 'N': case 'n':
    		anz++;
    		lesen(m);
    		system("pause");
    		system("cls");
    		break;
    
    	case 'L': case 'l':
    		if (anz>1)
    			{
    				sortieren(m);
    			}
    		ausgeben(m);
    		system("pause");
    		break;
    
    	case 'B': case 'b':
    		exit(1);
    		break;
    
    	default:
    		printf("Keine gueltige Eingabe\n");
    		system("pause");
    		system("cls");
    		break;
    	}
    	}
    	while(1);
    
    	return 0;
    }
    


  • dein debugger kann dir helfen 😉



  • leider nicht 😞



  • Wo liegt der Fehler?

    Hier, genau hier => *



  • ???



  • Hallo

    So wie das sehe, übergibst du einen Zeiger, arbeitest aber als wäre es kein Zeiger

    int* p;
    *p = 4;
    

    statt . vielleicht ->

    chrische



  • mhhh auch wenn ich den kompletten array übergebe gehts nicht.



  • wie gesagt, wenn ich das ganze ohne das sortieren mach gehts einwandfrei.

    ich kann 5 mannschaften einlesen etc. punkte werden berechnet klappt alles.

    nur sobald ich mit L wieder die sortier funktion aufruf gibt er mir die mannschaften garnicht aus, sortiert damit schon garnicht.



  • miller_m schrieb:

    dein debugger kann dir helfen 😉

    kneipp schrieb:

    leider nicht 😞

    Warum sollte er das nicht können?



  • er zeigt mir keinen fehler an....



  • wie gesagt, wenn ich das ganze ohne das sortieren mach gehts einwandfrei.

    Dann schau dir doch deine Sortierfunktion nochmal genau an.

    Meinst du das:

    while(anz--)
    

    ist sinnvoll ?

    Oder das

    for (i=0; i<anz; i++) <-- Variable i für Schleife
                if (m[u+1].punkte > m[u].punkte) <-- Variable u ?
    ...
    

    Ps.:
    Ein Debugger kann meistens mehr als nur Syntaxfehler erkennen. Man kann damit sich z.B. Variableninhalte zur "Laufzeit" ansehen.



  • rofl 🙂

    der debugger ist auch nicht dazu da um dir fehler anzuzeigen, sondern um dir zu helfen dein programm zu de-bug-gen (kurz: die krabbelviecher loswerden). und er kann dir insofern helfen, als dass er dir die werte der variablen anzeigt, während du das programm durchforstest. so findet man schnell heraus, wos hackt.



  • Erst mal einen allgemeinen Tipp:

    Das parallele Benutzen der C++-Standartbibliothek (cin, cout) und den alten
    C-Bibliotheksfunktionen (printf ()) ist im Allgemeinen eher ungesund.

    Da wäre noch was:
    1. Die Benutzung von aussagekrätfigen Variablennamen kann dir und anderen beim
    schreiben/verstehen deines Codes recht hilfreich sein. u, i, und m sind da eher
    nicht so übersichtlich (bei diesem kleinen Code ist das noch kein großes
    Problem, aber ein guter Stil von Anfang an kann nie schaden, es zahlt sich
    aus!)
    2. Du darfts deinen Code ruhig komentieren. Das hilft ebenfalls (dir und anderen 😉 )

    Wenn du in deinem Code nach Fehlern suchst, versuche ihn Abschnittsweise zu testen.
    Erstelle z. B. ein Kommando, mit dem du dir deine Manschaften ohne vorheriges Sortieren ausgeben kannst. Wenn das klappt, muss der Fehler in der Sortierfunktion liegen.

    Der Tag ist schon etwas fortgeschriten, aber ich bin der Meinung, so ewtas noch nie gesehen zu haben:

    void lesen(struct mannschaft* m) 
    {
    ...
    }
    

    ich glaube, da ist was faul.
    Man sagt ja auch nicht:

    class A
    {
    ...
    };
    
    void lesen (class A* A)
    {
    ...
    }
    

    sondern eben

    void lesen (A* A)
    {
    ...
    }
    

    versuch einfach mal, die structs wegzulassen

    void lesen (manschaft* m)

    es wundert mich, dass dein Compiler dir das compiliert.
    Vielleicht geht es ja doch, und ich irre mich (mal wieder 🙄)

    Zur weiteren Hilfe wäre es ganz sinnvoll, wenn du dein Probelm mal
    genauer beschreiben würdest.

    ich hab hier schonmal was geschrieben. das einlesen funktioniert problemlos, nur sobald ich es sortieren will ( nach punktzahl, höchste punktzahl ganz oben )

    ist keine besonders genaue Feherbeschreibung
    gibt er dir Mist aus, oder bricht er dein Programm mit einer dieser
    wunderhübschen "Diesen Fehler bitte auch Microsoft berichten"-Box ab?

    gute nacht...



  • fehler selber gefunden 🙂

    es läuft

    er hat die punktberechnung nicht in die sortierfunktion geladen ( wer es wissen will xD )

    mfg



  • Hallo erstmal... schrieb:

    Der Tag ist schon etwas fortgeschriten, aber ich bin der Meinung, so ewtas noch nie gesehen zu haben:

    void lesen(struct mannschaft* m) 
    {
    ...
    }
    

    ich glaube, da ist was faul.
    Man sagt ja auch nicht:

    class A
    {
    ...
    };
    
    void lesen (class A* A)
    {
    ...
    }
    

    sondern eben

    void lesen (A* A)
    {
    ...
    }
    

    versuch einfach mal, die structs wegzulassen

    void lesen (manschaft* m)

    es wundert mich, dass dein Compiler dir das compiliert.
    Vielleicht geht es ja doch, und ich irre mich (mal wieder 🙄)

    Ja, das geht und ist ein Relikt aus der C-Zeit (damals gabe es noch einen Unterschied zwischen "struct mannschaft" und "mannschaft").



  • kneipp schrieb:

    er hat die punktberechnung nicht in die sortierfunktion geladen ( wer es wissen will xD )

    Das ist so weit weg von der tatsächlichen Fehlerursache, wie dein Code von gutem.

    Vermutlich hast du den echten Fehler irgendwo zwischendurch zufällig behoben, ohne es zu merken.

    Es lag übrigens u.A. daran, dass du beim Sortieren i als Zählvariable benutzt hast, dann aber u als Index für die Vertauschungen verwendet hast.


Log in to reply