Verständnis Frage bezüglich kleinem Code



  • Verständnis Frage bezüglich kleinem Code

    Hallo, vielleicht kann mir ja jemand von euch helfen.

    Ich hab folgende Aufgaben Stellung:

    30 Matrosen sind im Kreis aufgestellt und müssen zu 7 auszählen. Wer eine 7 bekommt, geht über
    Bord. Wer mit dem Abzählen beginnt wird vom Kapitän bestimmt. Die Reihenfolge der über Bord
    gegangenen Matrosen soll ausgegeben werden und der übriggebliebene Matrose.

    Ich hab ein array für die Matrosen bestimmt und jedem Matrosen eine 1 zugeordnet. Dann lese ich den starter ein.

    und jetzt habe ich aber ein Problem:

    ich hab einfach keinen Gedanken dazu wie ich die Schleifen realisieren soll, dass er vom starter immer 7 raufzählen soll und den 7 matrosen auf 0 setzen soll. Wenn er aber bei 30 ist muss er von vorne anfangen zu zählen, die Matrosen welche schon draußem sind, eine null haben dürfen nicht mitgezählt werden und dabei soll ich immer die Matrosen ausgeben welche schon draußen sind und den letzten als sieger krönen.

    Vielleicht könnt ihr mir einen Denk Anstoss geben oder vielleicht eine Aglorithmus nennen.

    lG



  • Das Auszählen kannst du erledigen, indem du 7 Schritte von deiner aktuellen Position weiterzählst. Dabei besteht ein "Schritt" aus einer Schleife, die den nächsten mit 1 besetzten Platz findet (und mit Modulo-Arithmetik landest du vom Ende der Liste zurück auf dem Anfang):

    int count=0;//Anzahl herausgefallener Matrosen
    int pos[30];//alle Positionen - mußt du komplett mit 1 füllen
    int i=0;//aktuelle Position
    while(count<30)//solange noch Leute stehen
    {
      for(int j=0;j<7;++j)
      {
        while(pos[i]==0) i=(i+1)%30; //Schritt
      }
      ++count;
      pos[i]=0;
      printf("Matrose %d muß gehen. % übrig\n",i,30-count);
    }
    


  • Ich glaube in C muss man alle Variablen am Anfang der Funktion deklarieren.

    Ich habs auchmal probiert:

    #include <stdio.h>
    
    #define LEBT 1
    #define TOT 0
    
    int main(void)
    {
    	int auswahl;	// Für die Auswahl im Array
    	int matrose[30];	// Die Mannschaft
    	int count;
    	int tote = 0;	// Anzahl der toten Matrosen
    	int schritte = 0;	// Zählt die Matrosen aus
    
    	for(count=0;count<30;count++) 		// ALLE MATROSEN ALS LEBENED DEFINIEREN
    		matrose[count] = LEBT;
    
    	puts("Captain, mit welchem Matrosen wollen Sie anfangen?");		// AUSWAHL
    	while ( auswahl < 0 || auswahl > 29 ) {
    		printf("==> ");
    		scanf("%d", &auswahl);
    	}
    
    	while ( 1 )	{
    		schritte = 0; // Auszählung nach jedem neuen Toten von vorne starten...
    		matrose[auswahl] = TOT;	// Matrose töten
    		printf("\nMatrose %2d ist ertrunken!", auswahl); 
    		tote++;	// Totenzahl erhöhen
    		if ( tote == 29 ) // Schleifenabbruch wenn nur noch einer übrig ist
    			break;
    		while ( schritte < 7 ) { // Wählt solange Matrosen aus, bis man 7 lebende hat
    			auswahl = (auswahl+1)%30;	
    			if ( matrose[auswahl] == LEBT )
    				schritte++;
    		}
    	}
    
    	for(count=0;count<30;count++)	{
    		if ( matrose[count] == LEBT )
    			break;
    	}
    	printf("\n\nMatrose %d lebt", count);			 
    	return 0;
    }
    

    Die Endlosschleife ist nicht so elegant - aber funktioniert.



  • Hallo Simonek, vielen Dank für deine Antwort, allerdings hast du einen Fehler in deinem Script ... der Starter fällt nicht gleich aus sondern, er fängt an zum zählen d.h. wenn der Captain 2 eingibt, fällt der 8 als erster raus 😉

    ich hab vor der while schleife noch das eingefügt: auswahl+=6; damit stimmt der Code jetzt einwandfrei

    kannst du mir eventuell sagen, was da mit dem MODULO machst, wie funktioniert das genau?



  • seoman schrieb:

    kannst du mir eventuell sagen, was da mit dem MODULO machst, wie funktioniert das genau?

    der spuckt den rest einer ganzzahlendivision aus. der sorgt dafür, dass das ergebnis immer kleiner als 30 ist (0...29).
    beispiel: 64 mod 30 = 4 (weil '2*30 + 4' 64 ergibt)
    🙂



  • Hab die Vorgaben nur überflogen daher hatte ich angenommen, dass der Captain bestimmt wer zuerst über Bord geht.
    Aber wie Du schon erkannt hast, lässt sich das sehr einfach korrigieren.

    Der MODULO-Operator bewirkt, dass die auswahl immer kleiner als 30 bleibt.
    Wenn die Auswahl z.B. 30 ist existiert ja kein Array matrose[30], sondern die Auswahl soll ja von vorne anfangen, weil die Matrosen im Kreis stehen.

    Daher ist der Modulo-Operator genau das richtige, weil die Auswahl von wieder von vorne anfängt, wenn 29 überschritten wurden (es wird sozusagen ein Kreis simuliert). z.B. 30 / 30 = 1 Rest 0 -> Auswahl = 0



  • Vielen Dank für eure Antworten, haben mir weitergeholfen!!! Super Forum!!


Anmelden zum Antworten