AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit simplem C-Quellcode

Ein Thema von Dust Signs · begonnen am 23. Feb 2005 · letzter Beitrag vom 24. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Dust Signs

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

Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20: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
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:13
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
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Dust Signs

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

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:23
Zitat von Binärbaum:
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
Im ersten Semester ham in C nichts außer Schleifen und Arrays gemacht, Pointer nichtmal angefangen ergo auch keine verketteten Listen

Dust Signs
(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
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:27
Edit: Totaler Unsinn. Sry.

MfG
freak
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:37
Wenn ich mich recht erinnere, war die Deklaration für eine Liste etwa folgende:
Code:
typedef struct liste *PtrListe;
typedef struct liste {int nummer; //Nummer des Matrosen
                      PtrListe next;//Zeiger auf nächsten "Matrosen"
                     };
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.

[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 und erstmal mit Arrays weiterarbeiten.
[/Edit]

MfG
Binärbaum
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Dust Signs

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

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:39
Zitat von Binärbaum:
Wenn ich mich recht erinnere, war die Deklaration für eine Liste etwa folgende:
Code:
typedef struct liste *PtrListe;
typedef struct liste {int nummer; //Nummer des Matrosen
                      PtrListe next;
                     };
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.

MfG
Binärbaum
Unser Prof wills aber mit den reinen Erstsemesterkenntnissen... und da sind eben keine Zeiger dabei

Dust Signs
(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
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:42
Zitat von Dust Signs:
Unser Prof wills aber mit den reinen Erstsemesterkenntnissen... und da sind eben keine Zeiger dabei

Dust Signs
Dann musst du es halt über Arrays realisieren.
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 20:55
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;
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 21:01
Soweit ich das verstanden habe, war die Aufgabe mit C zu lösen, nicht mit Delphi.
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Dust Signs

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

Re: Problem mit simplem C-Quellcode

  Alt 23. Feb 2005, 21:10
Zitat von Binärbaum:
Soweit ich das verstanden habe, war die Aufgabe mit C zu lösen, nicht mit Delphi.
Eigntlich schon

Dust Signs
(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
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz