Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- übergreifende Themen (http://www.informatikerboard.de/board/board.php?boardid=20)
--- Funktionsaufrufe, Dieb und Wächter (http://www.informatikerboard.de/board/thread.php?threadid=2717)


Geschrieben von Cball123 am 02.01.2016 um 13:44:

  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;
}



Geschrieben von eulerscheZahl am 02.01.2016 um 14:04:

  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;
}



Geschrieben von Cball123 am 02.01.2016 um 14:58:

 

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



Geschrieben von eulerscheZahl am 02.01.2016 um 15:16:

 

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



Geschrieben von Cball123 am 02.01.2016 um 15:30:

 

Alles klar, vielen Dank!


Forensoftware: Burning Board, entwickelt von WoltLab GmbH