Info2P5/josephus.c
2025-06-12 08:17:07 +02:00

49 lines
2.2 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;
}
//gcc -c queue.c -o queue.o
//ar rcs libqueue.a queue.o
//gcc josephus.c -L. -lqueue -o josephus