Einzelnen Beitrag anzeigen

Dust Signs

Registriert seit: 28. Dez 2004
Ort: Salzburg
379 Beiträge
 
#1

Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 21:01
Hi !

Da wir in Informatik grad den Stoff vom ersten Semester etwas wiederholen (gab eine ganze Menge "Nicht genügend" bei der Vorlesungsklausur ) sollten wir ein Programm schreiben, das folgendes macht:

Zitat von Angabe:
30 Matrosen sind im Kreis aufgestellt und müssen zu 7 auszählen. Wer eine 7 hat, geht über Bord. Wer mit dem Abzählen beginnt wird vom Kapitän bestimmt. Die Reihenfolge der über Bord gegangenen Matrosen soll ausgegeben werden und der übriggebliebene Matrose.
Das Deutsch meines Profs ist naja.... sagen wir mal etwas dürftig, daher hier nochmal in Kurzform: 30 Matrosen zählen von 1-7, wer die sieben hat, fliegt, dann wird wieder bei eins zu zählen begonnen. Welcher Matrose bleibt übrig?

Ich komme einfach weiter (wer zum Abzählen anfängt bau ich ein, wenn das Prog. funktioniert ^^): laut Prof. ist die Lösung des Beispiels (sofern der erste Matrose zu zählen beginnt) Matrose Nr. 23 - der sollte übrigbleiben. Bei mir bleibt Matrose Nr. 20 über - da stimmt also was nicht. Wer findet den Fehler?

Code:
#include <stdio.h>

int matrosen[30];

int zaehler = 0; //Wenn eine Runde fertig: bei welchem Wert wurde aufgehört zu zählen

int anzahl_matrosen_uebrig = 30;

int MatrosenFuellen() {

  int i; //Schleifendummy

  for (i = 0; i < anzahl_matrosen_uebrig; i++) {

    matrosen[i] = i + 1;

    }

  }

int JederSiebteRaus() {

  int i; //Schleifendummy

  printf("Neue Runde...\n");

  for (i = 0; i < anzahl_matrosen_uebrig; i++) {

    zaehler++;

    if (zaehler == 7) {

      zaehler = 0;

      printf("Matrose #%d (Array-Index %d) fliegt...\n", matrosen[i], i);

      matrosen[i] = 0; //Matrose "löschen"

      }

    }

  printf("Wir haben bei %d aufgehört zu zählen.\n", zaehler);

  }


int Nullfelderloeschen() {

  int i, j, k; //Schleifendummies

  int anzahl; //Anzahl speichern!!! Sonst Bug, weil anzahl_matrosen_uebrig in der Schleife hinuntergezählt wird *argx*

  anzahl = anzahl_matrosen_uebrig;

  for (i = 0; i < anzahl; i++) {

    if (matrosen[i] == 0) { //Wenn Matrose Wert null hat, "löschen" (Matrosen nach vor "schieben")

      printf("Matrose ging über Bord... (Array-Index %d)\n", i);

      for (j = i + 1; j < anzahl/*_matrosen_uebrig*/; j++) {

        matrosen[j - 1] = matrosen[j]; //Nach oben "schieben"

        }

      anzahl_matrosen_uebrig--;

      }

    }

  }

int main() {

  MatrosenFuellen(); //Initialisieren

  printf("Lustiges Matrosenfliegen\n");
  printf("========================\n\n");

  while (anzahl_matrosen_uebrig > 1) {

    JederSiebteRaus();
    Nullfelderloeschen();

    printf("Noch %d Matrosen übrig\n", anzahl_matrosen_uebrig);

  }

  printf("Ãœbrig ist Matrose #%d\n", matrosen[0]);

  return 0;

  }
Sorry für die hässliche Formatierung und die wenigen Kommentare - wir hatten grade mal eine halbe Stunde dafür Zeit.

Dust Signs

PS. Crossposting DF
(aka AXMD in der EE)
Die Nummer, die Sie gewählt haben, ist imaginär. Bitte drehen Sie Ihr Telefon um 90° und versuchen Sie es erneut.
  Mit Zitat antworten Zitat