57 lines
2.6 KiB
C
57 lines
2.6 KiB
C
/**********************************************************************\
|
|
* Kurzbeschreibung:
|
|
* Realisiert das Josephus Spiel zum Test einer Queue
|
|
*
|
|
* Datum: Autor:
|
|
* 30.9.2015 Prof. Dr. Helmut Herold
|
|
*
|
|
\**********************************************************************/
|
|
|
|
/*--- #includes ------------------------------------------------------*/
|
|
#define _CRT_SECURE_NO_WARNINGS //VC++: keine scanf() Warnungen
|
|
#include <stdio.h> // Einbinden der Standard-Ein-/Ausgabefunktionen
|
|
#include "queue.h" // Einbinden der selbstgeschriebenen Queue-Funktionen
|
|
|
|
/*--- #defines -------------------------------------------------------*/
|
|
|
|
/*--- Datentypen (typedef) -------------------------------------------*/
|
|
|
|
/*--- Prototypen lokaler Funktionen ----------------------------------*/
|
|
|
|
/*--- main -----------------------------------------------------------*/
|
|
int main(void)
|
|
{
|
|
int n, z, i=1, nr; // n = Personenanzahl, z = wievielte wird entfernt, i = Laufvariable, nr = zum Prüfen von scanf
|
|
|
|
// Abfrage wie viele Personen mitspielen, solange wiederholen bis richtige Zahl eingegeben wurde
|
|
do {
|
|
printf("Wie viele Personen: "); // Frage ausgeben
|
|
nr = scanf("%d", &n); getchar(); // Zahl einlesen und Eingabe bestätigen lassen
|
|
} while (nr != 1 || n < 0); // solange wiederholen bis gültige Zahl
|
|
|
|
// Abfrage wievielte Person entfernt wird, auch hier wird auf korrekte Eingabe geprüft
|
|
do {
|
|
printf("Wie vielte ist auszusondern: "); // Frage ausgeben
|
|
nr = scanf("%d", &z); getchar(); // Zahl einlesen und Eingabe bestätigen lassen
|
|
} while (nr != 1 || z < 0); // solange wiederholen bis gültige Zahl
|
|
|
|
// Die Queue wird mit Zahlen von 1 bis n gefüllt
|
|
for (i = 1; i <= n; i++) // von 1 bis n
|
|
put(i); // füge die Zahl in die Queue ein
|
|
|
|
// Solange die Queue nicht leer ist (also noch Personen da sind)
|
|
while (!isEmpty()) {
|
|
// Wiederhole z-1 mal: hole die vorderste Zahl aus der Queue und füge sie hinten wieder ein
|
|
for (i = 1; i < z; i++) {
|
|
if (put(get()) == FALSE) { // Zahl nach hinten verschieben, wenn das schief geht:
|
|
fprintf(stderr, "Fehler beim Einfügen\n"); // Fehlermeldung
|
|
return 1; // Programm abbrechen mit Fehler
|
|
}
|
|
}
|
|
// Jetzt hole die vorderste Zahl (die z-te) und gib sie aus (sie wird entfernt)
|
|
printf("%d, ", get()); // Zahl ausgeben und aus Queue entfernen (nicht mehr einfügen)
|
|
}
|
|
printf("\n"); // Zeilenumbruch am Ende
|
|
|
|
return 0; // Programm endet erfolgreich
|
|
} |