/**********************************************************************\ * 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 // 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 }