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!!