49 lines
2.3 KiB
C
49 lines
2.3 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
|
|
#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; // Programm erfolgreich beenden
|
|
}
|
|
|
|
//gcc -c queue.c -o queue.o
|
|
//ar rcs libqueue.a queue.o
|
|
//gcc josephus.c -L. -lqueue -o josephus
|