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

Informatiker Board » Themengebiete » übergreifende Themen » Funktionsaufrufe, Dieb und Wächter » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Funktionsaufrufe, Dieb und Wächter
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Cball123
Grünschnabel


Dabei seit: 02.01.2016
Beiträge: 3

Funktionsaufrufe, Dieb und Wächter Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
02.01.2016 13:44 Cball123 ist offline E-Mail an Cball123 senden Beiträge von Cball123 suchen Nehmen Sie Cball123 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

RE: Funktionsaufrufe, Dieb und Wächter Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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


__________________
Syntax Highlighting fürs Board (Link)
02.01.2016 14:04 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Cball123
Grünschnabel


Dabei seit: 02.01.2016
Beiträge: 3

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
02.01.2016 14:58 Cball123 ist offline E-Mail an Cball123 senden Beiträge von Cball123 suchen Nehmen Sie Cball123 in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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

__________________
Syntax Highlighting fürs Board (Link)
02.01.2016 15:16 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Cball123
Grünschnabel


Dabei seit: 02.01.2016
Beiträge: 3

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

Alles klar, vielen Dank!
02.01.2016 15:30 Cball123 ist offline E-Mail an Cball123 senden Beiträge von Cball123 suchen Nehmen Sie Cball123 in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » übergreifende Themen » Funktionsaufrufe, Dieb und Wächter