Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » übergreifende Themen » Funktionsaufrufe, Dieb und Wächter » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 5 Beiträge
Cball123

Alles klar, vielen Dank!
eulerscheZahl

Weil die Funktion Zeiger als Argumente erwartet. Und das ist auch nötig, wenn du den Inhalt der Variablen ändern willst.
Cball123

Danke für die schnelle Antwort! Habe den dritten Wächter abgeändert, der war tatsächlich nicht so gedacht. großes Grinsen Warum MUSS die Funktion Kontrolle mit Pointern aufgerufen werden? Das verstehe ich nicht!

LG
eulerscheZahl RE: Funktionsaufrufe, Dieb und Wächter

Habe dir erst mal nur das Gröbste behoben:
* die Funktion Kontrolle muss mit Zeigern aufgerufen werden
* die Tausche muss erst gefüllt werden, sonst versucht der Dieb mit einer leeren Tasche zu entkommen (und wird dabei von Wächter 3 gestoppt)
Dein Wächter 3 wirkt etwas seltsam (if ohne Anweisungsteil).
Und die Zufallsfunktion hat keine Laplace-Verteilung: 1/3 Silber, 2/9 Bronze und 4/9 Gold.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

int gold   = 10;
int silber = 10;
int bronze = 10;

void inDerTasche(int *g, int *s, int *b)
{
  *g = 0; *s = 0; *b = 0;
  while ( *g + *s + *b != 10) {
	  if (rand()%3 == 1){
		  *s = *s + 1;
		  silber = silber - 1;
	  } else if (rand()%3 == 2) {
		  *b = *b + 1;
		  bronze = bronze - 1;
	  } else {
		  *g = *g + 1;
		  gold = gold - 1;
	  }	  
  }
}

bool waechter1(int *g, int *s, int *b)
{
  if ( *g > *s){
	  *g = *g - 1;
	  gold = gold + *g;	  
  }
}

bool waechter2(int *g, int *s, int *b)
{
	if ( *s > *b){
		*s = *s - 1;
		silber = silber + *s;
	}
}

bool waechter3(int *g, int *s, int *b)
{
	if ( *g == *s) ;
		*g = *g - 1;
		gold = gold + *g;
		silber = silber + *s;
		bronze = bronze + *b;
}

bool kontrolle(int *g, int *s, int *b)
{
  return waechter1(g,s,b) || waechter2(g,s,b) || waechter3(g,s,b);
}

int main(void)
{
  int g,s,b;
  int versuch = 1;
  bool entkommen = false;

  srand(time(0));

  while (gold+silber+bronze > 0 && !entkommen) {
    while (gold+silber+bronze > 0) {
      inDerTasche(&g, &s, &b);
      kontrolle(&g, &s, &b); //call by reference
    }

    printf("%d. Versuch\n", versuch++);
    printf( "Versuch mit %d Gold, %d Silber, %d Bronze\n", g, s, b );
    entkommen = !kontrolle(&g,&s,&b);
  }

  printf( "Entkommen mit %d Gold, %d Silber, %d Bronze\n", g, s, b );

  return 0;
}
Cball123 Funktionsaufrufe, Dieb und Wächter

Meine Frage:
Hallo liebe Community!

Ich habe im Mathestudium als Nebenfach Info und eine Aufgabe, die mir etwas zu schaffen macht.
In einem Museum werden 10 Goldmünzen, 10 Silbermünzen und 10 Münzen aus Bronze ausgestellt. Herr T. Hief findet die Münzen so schön, dass er sie mit nach Hause nehmen will. Allerdings kann er
nur 10 Münzen auf einmal tragen. Deshalb füllt er seine Taschen zufällig mit 10 Münzen und versucht zu entkommen.
Doch am Ausgang des Museums gibt es 3 Wächter, die die Taschen aller Besucher kontrollieren. Die Wächter kontrollieren immer in der gleichen Reihenfolge. Wenn ein Wächter einen Dieb erwischt, wird er ins
Museum zurückgeschickt, weil die Polizei heute leider wegen eines Fußballspiels keine Zeit hat, sich um Diebe zu kümmern. Da Herr Hief aber so begeistert von den Münzen ist, versucht er solange Münzen mitzunehmen, bis die Wächter ihn durchlassen.

-Der erste Wächter hat eine Schwäche für Gold. Wenn er jemanden erwischt, der mehr Gold- als Silber-
münzen bei sich hat, nimmt der Wächter eine Goldmünze für sich selbst. Alle anderen Goldmünzen, die der Dieb bei sich hat, werden ins Museum zurückgelegt.

-Der zweite Wächter mag Silber sehr gern. Wenn er jemanden erwischt, der mehr Silber- als Bronzemünzen bei sich trägt, behält er eine Silbermünze für sich. Genau wie beim ersten Wächter werden die übrigen
Silbermünzen ins Museum zurückgebracht.

-Der dritte Wächter will nicht, dass jemand genau so viele Gold- wie Silbermünzen hat. Wenn er jemanden erwischt, nimmt auch er sich eine Goldmünze für die eigene Tasche. Danach werden aber alle Münzen des
Diebs ins Museum zurückgebracht.
In allen drei Fällen muss der Dieb ins Museum zurückgehen und er unternimmt einen neuen Versuch. Dabei kann er unter Umständen noch Münzen in seinen Taschen haben - je nachdem, welcher Wächter ihn zuvor
gestoppt hat.

Verwenden Sie für die Wächter Funktionsdeklarationen wie die folgende:
bool waechter1(int *g, int *s, int *b)
Dabei teilt der Rückgabewert mit, ob der Wächter den Dieb zurückschickt.
Wenn ein Wächter bei einer Kontrolle etwas findet, wird ausgegeben, wie die Tasche des Diebs gefüllt ist.Implementieren Sie dafür die Funktion
void inDerTasche(int g, int s, int b).

Ein Aufruf Ihres Programmes könnte so aussehen:
1. Versuch
In der Tasche: 3 Gold, 5 Silber, 2 Bronze
Erwischt von Wächter 2!
2. Versuch
In der Tasche: 7 Gold, 1 Silber, 2 Bronze
Erwischt von Wächter 1!
3. Versuch
In der Tasche: 3 Gold, 3 Silber, 4 Bronze
Erwischt von Wächter 3!
4. Versuch
Entkommen mit 2 Gold, 4 Silber, 4 Bronze

Meine Ideen:
Ich hab schon ein wenig rumprogrammiert, aber sitze jetzt in der Sackgasse. Der Compiler spuckt keinen Error mehr aus, sondern nur noch notes und warnungen. Hier mein Programm. Für einen Tipp wäre ich dankbar!

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

int gold = 10;
int silber = 10;
int bronze = 10;

void inDerTasche(int g, int s, int b)
{
while ( g+s+b != 10) {
if (rand()%3 == 1){
s = s + 1;
silber = silber - 1;
} else if (rand()%3 == 2) {
b = b + 1;
bronze = bronze - 1;
} else {
g = g + 1;
gold = gold - 1;
}
}
}

bool waechter1(int *g, int *s, int *b)
{
if ( *g > *s){
*g = *g - 1;
gold = gold + *g;
}
}

bool waechter2(int *g, int *s, int *b)
{
if ( *s > *b){
*s = *s - 1;
silber = silber + *s;
}
}

bool waechter3(int *g, int *s, int *b)
{
if ( *g == *s);
*g = *g - 1;
gold = gold + *g;
silber = silber + *s;
bronze = bronze + *b;
}

bool kontrolle(int *g, int *s, int *b)
{
return waechter1(g,s,b) || waechter2(g,s,b) || waechter3(g,s,b);
}

int main(void)
{
int g,s,b;
int versuch = 1;
bool entkommen = false;

srand(time(0));

g = s = b = 0;

while (gold+silber+bronze > 0 && !entkommen) {
while (gold+silber+bronze > 0 && g+s+b < 10) {
kontrolle(g,s,b);
}

printf("%d. Versuch\n", versuch++);
entkommen = !kontrolle(&g,&s,&b);
}

printf( "Entkommen mit %d Gold, %d Silber, %d Bronze\n", g, s, b );

return 0;
}