C :: Aufgabe #3 :: Lösung #3

4 Lösungen Lösungen öffentlich
#3

Lotto - Simulation - 6 aus 49

Anfänger - C von Gustl - 25.11.2012 um 16:16 Uhr
Schreiben Sie ein Programm, welches 6 Zahlen zwischen 1 und 49 abfrägt. Danach soll das Programm solange 6 Zufallszahlen berechnen bis alle 6 eingegebenen Zahlen übereinstimmen. Natürlich darf eine Zahl nicht zweimal vorkommen.
Dann soll ausgegeben werden nach wie vielen "Spielen" ein 6er erzielt wurde und wie hoch die Chance auf einen 3er, einen 4er und einen 5er war.
#3
vote_ok
von mraimbot (590 Punkte) - 07.01.2019 um 16:06 Uhr
Quellcode ausblenden C-Code
///////////////////////////////////////////////////////////
//! @file Aufgabe-0003.c
//! @date 07.01.2019
//! @author Sebastian Schröder
//! @details
//! Compiler    : gcc 5.1.0
//! C-FLAGS     : -pipe -std=c99 -Wall -Wextra -pedantic -Werror -D_DEFAULT_SOURCE -O0 -g
//! Testumgebung: Windows 10 - Windows PowerShell
//!
//! Aufgabe: Lotto - Simulation - 6 aus 49
//! Schreiben Sie ein Programm, welches 6 Zahlen zwischen 1 und 49 abfrägt. Danach soll das Programm
//! solange 6 Zufallszahlen berechnen bis alle 6 eingegebenen Zahlen übereinstimmen. Natürlich darf
//! eine Zahl nicht zweimal vorkommen. Dann soll ausgegeben werden nach wie vielen "Spielen" ein 6er
//! erzielt wurde und wie hoch die Chance auf einen 3er, einen 4er und einen 5er war.
///////////////////////////////////////////////////////////


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


enum ELotto {
	TRIES,
	THREES,
	FOURS,
	FIVES,
};


bool checkLottoNumbers(int *numbers, int size);
void drawLottoNumbers(int *numbers, int size);


int main (/*int argc, char **argv*/) {
	clock_t start_time;
	clock_t current_time;
	unsigned long statistics[4] = { 0 };
	int numbers[6];
	int lotto[6];
	int check = 0;
	char ch;

	srand (time (NULL));

	printf ("--- LOTTO - 6 aus 49 ---\n");
	printf ("Waehle 6 positive Ganzzahlen zwischen inklusive 1 und inklusive 49.\n");
	printf ("Gebe alle 6 Zahlen zusammen ein, getrennt mit einem Leerzeichen oder einem Newline (Enter) (Beispiel: 4 13 7 25 22 49).\n");

	/* Input */

	do {
		printf ("Deine Zahlen: ");
		check = scanf ("%i %i %i %i %i %i", numbers, numbers+1, numbers+2, numbers+3, numbers+4, numbers+5);

		while ((ch = getchar()) != '\n' && ch != EOF);

		if (check != 6) {
			printf ("Eingabefehler: Mindestens einer ihrer 6 Zahlen ist ungueltig oder nicht vorhanden.\n");
			continue;
		}

		for (int i = 0; i < 6; ++i) {
			if (numbers[i] < 1 || numbers[i] > 49) {
				check = 0;
				printf ("Eingabefehler: Mindestens einer ihrer 6 Zahlen liegt nicht innerhalb von [1;49].\n");
				continue;
			}
		}

		if (false == checkLottoNumbers (numbers, 6)) {
			check = 0;
			printf ("Eingabefehler: Mindestens einer ihrer 6 Zahlen kommt doppelt vor.\n");
			continue;
		}

	} while (check != 6);

	start_time = clock ();

	/* Lotto-Play */

	do {
		statistics[TRIES]++;
		check = 0;

		drawLottoNumbers (lotto, 6);

		for (int i = 0; i < 6; ++i) {
			for (int j = 0; j < 6; ++j) {
				if (numbers[i] == lotto[j]) {
					check++;
					break;
				}
			}
		}
		
		if (3 == check) {
			statistics[THREES]++;
		}

		else if (4 == check) {
			statistics[FOURS]++;
		}

		else if (5 == check) {
			statistics[FIVES]++;
		}

		current_time = clock ();

		if ((current_time - start_time) / CLOCKS_PER_SEC >= 1.0f) {
			printf (".");
			start_time = clock ();
		}
	} while (check < 6);

	printf ("\nDu hast den 6er gewonnen!\n");
	printf ("Anzahl Versuche: %11lu\n", statistics[TRIES]);
	printf ("Gewonnene 3er  : %11lu (%10.7f%)\n", statistics[THREES], ((float) statistics[THREES] / (float) statistics[TRIES]) * 100.f);
	printf ("Gewonnene 4er  : %11lu (%10.7f%)\n", statistics[FOURS], ((float) statistics[FOURS] / (float) statistics[TRIES]) * 100.f);
	printf ("Gewonnene 5er  : %11lu (%10.7f%)\n", statistics[FIVES], ((float) statistics[FIVES] / (float) statistics[TRIES]) * 100.f);
	printf ("Gewonnene 6er  : %11lu (%10.7f%)\n", 1L, (1.0f / (float) statistics[TRIES]) * 100.f);

	return EXIT_SUCCESS;
}


bool checkLottoNumbers(int *numbers, int size) {
	int counter = 0;

	for (int i = 0; i < size; ++i) {
		counter = 0;

		for (int j = 0; j < size; ++j) {
			if (numbers[i] == numbers[j]) {
				counter++;
			}
		}

		if (counter > 1) {
			return false;
		}
	}

	return true;
}


void drawLottoNumbers(int *numbers, int size) {
	int check = 0;

	for (int i = 0; i < size; ++i) {
		do {
			numbers[i] = (rand() % 49) + 1;

			check = 0;
			for (int j = 0; j < i; ++j) {
				if (numbers[i] == numbers[j]) {
					check++;
				}
			}
		} while (0 < check);			
	}
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2092556

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.