Spielernamen sortieren



  • Hi
    ich bin Anfänger in C, d.h ich code seit 3 Tagen in C. Und bin auf ein Problem gestoßen:

    Ich habe ein kleines Spiel zum erraten einer Zufallszahl geschrieben. Das ganze läuft auch sehr gut.
    Etwas zum Ablauf: Es wird gefragt, wieviele Spieler mitspielen wollen.
    Dementsprechend werden zwei Arrays definiert:

    int tipps[benutzer]; // Die Zahlen die geraten werden
    int name[benutzer][20]; // Die Namen der Spieler
    

    Das ganze Spiel läuft nun auch mehrere Runden, d.h. es wird am Anfang gefragt wieviele Runden gespielt werden soll.

    Ob der Spieler gewonnen hat oder nicht wird wiederrum in einem Array gespeichert.

    Am Ende des Spiels will ich nun die Namen der Spieler nach der Anzahl der richtigen Treffer ausgeben, d.h. ich sortiere die Namen. Hier stoße ich jedoch auf das Problem, dass ich nicht weiß wie ich das machen soll.

    Ich hoffe ihr könnt mir helfen.

    Danke schon im Voraus

    Thomas



  • Der einfachste Sortieralgorhytmus ist der BubbleSort! Ich würde dir den empfehlen!
    mfg



  • hi

    danke für die Antwort. Das mit dem sortieren is ned des problem, das hab ich schon gelöst.

    Aber wenn ich folgendes schreiben:

    int tausch_string[30]; // 30 Zeichen darf ein Name maximal lang sein
    tausch_string = name[max];
    name[max] = name[i];
    name[i] = tausch_string;
    

    Sagt mein Compiler (gcc) dass er das ned machen will
    ich habs auch schon mit strcpy() probiert.

    Also die Ergebnisse sind bereits Sortiert.
    Das Problem is nur das Sortieren der Strings (spielernamen).

    Thomas



  • Ich bekomm den Fehler:

    Inkompatible Typen in Zuweisung.
    Und zwar für jede Zeile ...

    Thomas



  • Wenn bei dir ein Spielername nur 30 Zeichen lang sein soll, dann verwende bitte auch Datentypen, die dafür geeignet sind. Ein int könnte 4 ascii-zeichen aufnehmen. Davon reservierst du gleich 30. Probiers mal mit char als Datentyp, aber vorsicht. Bei 30 Zeichen für den Namen musst du 31 Bytes reservieren, eines zusätzlich für das \0.

    Dein Problem bei der Sortierung check ich allerdings nicht ganz.



  • Also

    ich hab die Beiden "strings" jetzt als CHAR dimensoniert.

    Mein Code sieht folgendermaßen aus:

    // rundenspiel
    	int zufallszahl,i,c;
    	char zeichen;
    	int benutzer, gewinner = 0, runden,j;
    	printf("Bitte geben sie die Anzahl der Runden ein, die sie Spielen wollen : ");
    	scanf("%i", &runden);
    	printf("\n");
    	clrscr();
    	// Abfrage wieviele Benutzer mitspielen wollen
    	benutzer = anzahl();
    	// Von der Eingabe abhängige Variablen deklarieren
    	int tipps[benutzer];
    	char name[benutzer][21]; // Name max 20 Zeichen lang
    	int gewonnen[benutzer];
    	int max, k, tausch_i;
    	int name_i[benutzer][21]; // Endergebnisse
    	char gewinner_z[21];
    	clrscr();
    	for(j = 1; j <= runden; j++){
    		// Jeden Benutzer Name und Zahl eingeben lassen
    		for(i = 1; i<=benutzer; i++){
    			if(j==1){
    				gewonnen[i] = 0;
    				printf("Spieler %i. Bitte geben sie ihren Namen ein: ",i);
    				scanf("%s", &name[i]);
    				printf("\n");
    				clrscr();
    			}
    			printf("%s, bitte geben sie ihre Zahl ein: ", name[i]);
    			scanf("%i", &tipps[i]);
    			printf("\n");
    			clrscr();
    		}
    		// Zufallszahl generieren
    		if(benutzer != 0){
    			zufallszahl = irand();
    			// Getippte Ergebnisse mit der Zufallszahl vergleichen
    			// int site = sizeof(tipps)/sizeof(int);
    			printf("Die gewürfelte Zahl ist: %i\n", zufallszahl);
    
    			for(i = 1; i <= benutzer; i++){
    				if(tipps[i] == zufallszahl){
    					printf("%s hat richtig geraten.\n", name[i]);
    					gewonnen[i]++;
    					gewinner++;
    				}		
    			}
    			if(gewinner == 0){
    				printf("Es hat keiner gewonnen!\n");
    			}
    		}
    		if(j==runden){
    			printf("Auswertung: \n");
    			printf("-----------\n");
    
    			// Benutzer nach der Reihe sortieren - der beste zuerst
    			for(i=1;i<=benutzer;i++){
    				max = i;
    				for(k=max+1; k<=benutzer;k++){
    					if(gewonnen[i] < gewonnen[k]){
    						max = k;
    					}
    				}
    
    				// Die Zahlen sortieren
    				tausch_i = gewonnen[max];
    				gewonnen[max] = gewonnen[i];
    				gewonnen[i] = tausch_i;
    
    				// Namen tauschen
    				gewinner_z = name[max];  // Hier kommen die Fehler
    				name[max] = name[i];
    				name[i] = gewinner_z;
    
    			}
    			for(i=1; i<=benutzer; i++){
    				printf("%s hat %i mal gewonnen.\n", name[gewinner_z[i]], gewonnen[i]);
    			}
    			printf("q-Taste drücken um das Programm zu beenden!");
    			do{
    			}while((zeichen=getch() ) != 'q');
    		}else{
    			printf("w-Taste drücken um die neue Runde zu starten!\n");
    			do{
    			}while(( zeichen=getch() ) != 'w');
      		}
    		clrscr();
    	}
    	return 0;
    }
    

    Es sollen die Gewinner nach der Anzahl der erratenen Zahlen sortiert werden.
    Dazu sortiere ich die Zahlen und darauf dann die Namen, was jedoch ned funktioniert.

    Thomas



  • Haste schon mal überlegt die ganzen Daten in einem Zeiger anzulegen und dann nach und nach auszulesen, wo du dann auch den Speicher schön verwalten kannst.

    An sich wäre dies eine schöne Angelegenheit 😉



  • Wie gesagt ich programmier noch ned lange in C, also mit Zeigern kenn ich mich ned aus.

    Aber wäre super wenn du mir sagen könntest wie ich das mache.

    Thomas



  • AFAIK darst du so keine Arrays zuweisen. Nimm strcpy(char* to, const char* from) Dafür.

    Also:

    ...
     // Namen tauschen
    strcpy(gewinner_z, name[max]);
    strcpy(name[max], name[i]);
    strcpy(name[i], gewinner_z);
    

    Caipi



  • Danke für den Code

    so funktioniert es.

    Thomas


Anmelden zum Antworten