Lotto pomoc w maszynie losującej

0

Napisz program realizujący grę LOTTO (duży lotek) na tzw. chybi-trafił. Kupon składa się z 1 zakładu (tablica dwuwymiarowa 7x7), w którym maszyna losująca wybiera (skreśla) 6 różnych liczb z przedziału [1,49]. Otrzymujemy w ten sposób skreślony zakład.
Następnie maszyna losująca wyznacza 6 niepowtarzających się liczb (tablica jednowymiarowa).
Program sprawdza rezultat losowania i generuje raport na ekran który zawiera:
• automatycznie wypełniony zakład z widocznymi skreśleniami (znak ‘X’ przy skreślonej liczbie),
• aktualny wynik losowania (z maszyny losującej),
• rezultat trafień – pokrycie się aktualnego losowanie z wcześniej zakreślonymi liczbami.

Stworzyłem kod lecz utknąłem w miejscu. mianowicie maszyna losująca wybiera mi ciągle te same liczby.
Tutaj wklejam kod:

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>

int _tmain(int argc, _TCHAR* argv[])
{
int Z[7][7];
for (int i = 0; i<7; i++)
for (int j = 0; j<7; j++)
Z[i][j] = (i * 7) + (j + 1);

for (int i = 0; i<7; i++)
{
	for (int j = 0; j<7; j++)
		printf("%2d ", Z[i][j]);
	printf("\n");
}
printf("\n");
int ile_zaznaczonych = 0;
int liczba, w, k;
srand(time(0));
while (ile_zaznaczonych < 6)
{
	liczba = (rand() % 49) + 1;
	w = liczba / 7;
	k = (liczba % 7) - 1;

	if (Z[w][k] != -1)
	{
		printf("Zakreslam liczbe: %d\n", liczba);
		Z[w][k] = -1;
		ile_zaznaczonych++;

	}
	else
		printf("Ponowne losowanie liczby: %d\n", liczba);
}
printf("\n");
for (int i = 0; i<7; i++)
{
	for (int j = 0; j<7; j++)
		printf("%2d ", Z[i][j]);
	printf("\n");

}
int L[6]; //wypełnić liczbami <1,49> bez powtórzeń

//losowanie liczb przez maszyne
int losojliczby=0 ;
printf("\n\nwylosowane liczby to");
for (int i = 0; i < 6; i++)
printf("%d" , liczba);
bład zapewne jest w podkreślonym elemencie

//liczy trafione liczby
int Trafienia = 0;
for (int i = 0; i < 6; i++) {
	for (int j = 0; j < 6; j++)
		if (i == j) Trafienia++;
}

if (Trafienia == 0)
	printf("\n\nNie trafiono żadnej liczby!");
else
	printf("\n\nTrafiono %d !", Trafienia);
return 0;

}

Proszę o pomoc z góry dziękuję.

0

Ciekawy sposób zapisu liczb od jeden do czterdzieści dziewięć, tylko tak się zastanawiam czy po prostu nie lepiej było użyć zwyczajnie tablicy jednowymiarowej, bez tych kombinacji i obliczania modów itp? No dobra w takim krótkim kodzie można jeszcze w takie rzeczy się pobawić, ale jak dorobisz kolejne linijki kodu to sam po sobie się nie rozczytasz.
Wszystko wygląda w porządku poza okropnym przedstawieniem kodu i informacjami powypisywanymi przez program (sześć razy ta sama zmienna):

for (int i = 0; i < 6; i++)
    printf("%d" , liczba);
0
czaffik napisał(a):

Ciekawy sposób zapisu liczb od jeden do czterdzieści dziewięć, tylko tak się zastanawiam czy po prostu nie lepiej było użyć zwyczajnie tablicy jednowymiarowej, bez tych kombinacji i obliczania modów itp? No dobra w takim krótkim kodzie można jeszcze w takie rzeczy się pobawić, ale jak dorobisz kolejne linijki kodu to sam po sobie się nie rozczytasz.
Wszystko wygląda w porządku poza okropnym przedstawieniem kodu i informacjami powypisywanymi przez program (sześć razy ta sama zmienna):

for (int i = 0; i < 6; i++)
    printf("%d" , liczba);

niestety nie potrafię nic innego wymyślić

0

W linii

Z[i][j] = (i 7) + (j + 1);

Masz "i 7", rozumiem po kodzie że powinno być i*7.

Po drugie, polecam to podzielić na kilka funkcji, by móc się w tym kodzie odnaleźć bez powodu, main powinno być wywołaniem, debugiem i ewentualnie jeszcze przechwytywaniem błędów ;p

Ah i odpowiedź, bo o tym zapomniałem:

while (ile_zaznaczonych < 6)
{
liczba = (rand() % 49) + 1;
(...)
int L[6]; //wypełnić liczbami <1,49> bez powtórzeń
//losowanie liczb przez maszyne
int losojliczby=0 ;
printf("\n\nwylosowane liczby to");
for (int i = 0; i < 6; i++)
printf("%d" , liczba);

Ostatnia deklaracja zmiennej liczba występuje na początku wycinku kodu. Później wyrzucasz ją na ekran 6 razy. Zamiast wyrzucać elementy które mają zostać wylosowane a nie te które mają zostać skreślone. Defakto, na twoim miejscu zrobiłbym funkcje generejującą bo używasz tego tutaj dużo razy.

0

Udało się wybrnąłem z maszyną losującą

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>

int _tmain(int argc, _TCHAR* argv[])
{
	int Z[7][7];
	for (int i = 0; i<7; i++)
		for (int j = 0; j<7; j++)
			Z[i][j] = (i * 7) + (j + 1);

	for (int i = 0; i<7; i++)
	{
		for (int j = 0; j<7; j++)
			printf("%2d ", Z[i][j]);
		printf("\n");
	}
	printf("\n");
	int ile_zaznaczonych = 0;
	int liczba, w, k;
	srand(time(0));
	while (ile_zaznaczonych < 6)
	{
		liczba = (rand() % 49) + 1;
		w = liczba / 7;
		k = (liczba % 7) - 1;

		if (Z[w][k] != -1)
		{
			printf("Zakreslam liczbe: %d\n", liczba);
			Z[w][k] = -1;
			ile_zaznaczonych++;
		}
		else
			printf("Ponowne losowanie liczby: %d\n", liczba);
	}
	printf("\n");
	for (int i = 0; i<7; i++)
	{
		for (int j = 0; j<7; j++)
			printf("%2d ", Z[i][j]);
		printf("\n");

	}
	int L[6]; //wypełnić liczbami <1,49> bez powtórzeń
    
	//losowanie liczb przez maszyne
	printf("\n");
	srand(time(0));
	int skresleniaMaszyny = 0;
		while (skresleniaMaszyny < 6) 
		{   liczba = (rand() % 49) + 1;
			w = liczba / 7;
			k = (liczba % 7) - 1;
			if (Z[w][k] != -1) {
				printf("wylosowane liczby to:%d\n", liczba);
				Z[w][k] = -1;
				skresleniaMaszyny++;
			}

		}
		
	//liczy trafione liczby
	int Trafienia = 0;
	for (int i = 0; i < 6; i++) {
		for (int j = 0; j < 6; j++)
			if (ile_zaznaczonych== skresleniaMaszyny) Trafienia++;
	}

	if (Trafienia == 0)
		printf("\n\nPudło");
	else
		printf("\n\nTrafiono %d !", Trafienia);
	return 0;
}

Niestety pojawił się następny problem . Jestem początkującym programistą (mój pierwszy program ) dlatego kod może być mało czytelny. Może ktoś ma pomysł dlaczego nie liczy mi ilości trafień. mianowicie za każdym razem wypisuję mi tę samą liczbę 36 ? Pomoc potrzebna mi jest jak najszybciej ponieważ dziś do 12 mamy wysłać kod prowadzącemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1