/**********************************************************************\
* Kurzbeschreibung:
* Realisiert das Josephus Spiel zum Test einer Queue
*
* Datum:     Autor:
* 30.9.2015  Prof. Dr. Helmut Herold
*
\**********************************************************************/
/*--- #includes ------------------------------------------------------*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "queue.h"
/*--- #defines -------------------------------------------------------*/
/*--- Datentypen (typedef) -------------------------------------------*/
/*--- Prototypen lokaler Funktionen ----------------------------------*/
/*--- main -----------------------------------------------------------*/
int main(void)
{
    int n, z, i=1, nr; // Variablen für Personenanzahl, Schrittweite, Zähler, Rückgabewert scanf
    do {
        printf("Wie viele Personen: "); // Benutzer nach Anzahl der Personen fragen
        nr = scanf("%d", &n); getchar(); // Eingabe lesen, Rückgabewert speichern, Zeilenumbruch entfernen
    } while (nr != 1 || n < 0); // Wiederholen, falls ungültige Eingabe

    do {
        printf("Wie vielte ist auszusondern: "); // Benutzer nach Schrittweite fragen
        nr = scanf("%d", &z); getchar(); // Eingabe lesen, Rückgabewert speichern, Zeilenumbruch entfernen
    } while (nr != 1 || z < 0); // Wiederholen, falls ungültige Eingabe

    for (i = 1; i <= n; i++) // Queue füllen
        put(i); // Personen mit Nummer 1 bis n in die Queue einfügen

    while (!isEmpty()) { // Solange noch Personen in der Queue sind
        for (i = 1; i < z; i++) { // z-1 Personen überspringen
            if (put(get()) == FALSE) { // Erste Person aus der Queue nehmen und wieder hinten einfügen
                fprintf(stderr, "Fehler beim EinfÃ¼gen\n"); // Fehlerausgabe, falls put fehlschlägt
                return 1; // Programm mit Fehlercode beenden
            }
        }
        printf("%d, ", get()); // Die z-te Person aus der Queue nehmen und ausgeben (ausscheiden)
        // Diese Person wird nicht mehr eingefügt
    }
    printf("\n"); // Zeilenumbruch nach Ausgabe aller ausgeschiedenen Personen
    return 0;
}

//gcc -c queue.c -o queue.o
//ar rcs libqueue.a queue.o
//gcc josephus.c -L. -lqueue -o josephus