![]() |
Problem mit simplem C-Quellcode
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:
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:
Sorry für die hässliche Formatierung und die wenigen Kommentare - wir hatten grade mal eine halbe Stunde dafür Zeit.
#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; } Dust Signs PS. Crossposting DF |
Re: Problem mit simplem C-Quellcode
Ich würde das nicht mit einem Array machen, sondern mit einer ringförmig verketteten Liste. Dabei hat jedes Listenelement einen Zeiger auf seinen Nachfolger und das letzte Element zeigt wieder aufs erste. Dann läuft man einfach die Liste durch und löscht aller sieben Elemente eins raus. Das Element, welches am Ende übrig bleibt, repräsentiert den letzten Matrosen. Ist IMHO besser geeignet als ein Array.
MfG Binärbaum |
Re: Problem mit simplem C-Quellcode
Zitat:
Dust Signs |
Re: Problem mit simplem C-Quellcode
Edit: Totaler Unsinn. Sry.
MfG freak |
Re: Problem mit simplem C-Quellcode
Wenn ich mich recht erinnere, war die Deklaration für eine Liste etwa folgende:
Code:
Beim Erzeugen der Listenelemente muss man den Speicher dafür mit malloc bereitstellen und beim Löschen wieder mit free freigeben. Um die Pointer muss man sich natürlich auch kümmern.
typedef struct liste *PtrListe;
typedef struct liste {int nummer; //Nummer des Matrosen PtrListe next;//Zeiger auf nächsten "Matrosen" }; [Edit] Ich hoffe doch, dass ihr inzwischen Zeiger kennengelernt habt, die werden in C nämlich ziemlich oft verwendet. Falls nicht, dann würde ich mich beim Prof beschweren :mrgreen: und erstmal mit Arrays weiterarbeiten. [/Edit] MfG Binärbaum |
Re: Problem mit simplem C-Quellcode
Zitat:
Dust Signs |
Re: Problem mit simplem C-Quellcode
Zitat:
|
Re: Problem mit simplem C-Quellcode
Die einfachste Loesung ist natuerlich eine TStringList (am besten eine TListBox).
Sie wird mit 30 Strings "Matrose 1" bis "Matrose 30" gefuellt und dann machen wir uns ans zaehlen.
Delphi-Quellcode:
// Los gehts bei Matrose 1 = Index 0
I := 0; // der Zaehler bis 7 N := 0; // bis nur noch ein Matrose uebrig ist while ListBox1.Count > 1 do begin // erst N inkrementieren, daher Initialisierung auf 0 Inc(N); if N = 7 then begin // den Matrosen killen ListBox1.Delete(I); // damit die Listbox auch den Fortgang anzeigt ListBox1.Update; // Zaehler zuruecksetzen N := 0; end else // Naechster Matrose. Wurde einer gekillt, dann sind die Nachfolger aufgerueckt. Inc(I); // Ende der Liste if I >= ListBox1.Count then // zurueck zum Anfang I := 0; end; |
Re: Problem mit simplem C-Quellcode
Soweit ich das verstanden habe, war die Aufgabe mit C zu lösen, nicht mit Delphi.
|
Re: Problem mit simplem C-Quellcode
Zitat:
Dust Signs |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz