| Author |
Message
|
Greebqmaster Poziom 5

Joined: 16 May 2010 Posts: 13 Location: Warszawa
|
#1
26 Jan 2011 21:14 Prosty programik losujący - totolotek |
|
|
|
Witam.
Żeby nie wyjść na kompletnego lesera pomyślałem, ze napiszę mały wstęp.. Otóż trafiłem na studia, na których mam programowanie w C, którego uczymy się.. Dość szybko, a moja informatyka w liceum/gimnazjum polegała na excelu, wordzie, power poincie i zalążkach html, więc o programowaniu wiem tyle co nic.
Znaczy się.. No czegoś tam się nauczyłem, ale pod nawałem innych przedmiotów na pierwszym roku po prostu nie wyrabiam i mam pewien problem, ponieważ muszę napisać projekt na infę- Program losujący 6 liczb z przedziału <0,49> i sprawdza (po uprzednim wpisaniu przeze mnie jakiś 6ciu liczb z rpzedziału 0,49) ile z nich zgadza się z tymi które ja wpisałem (totolotek ;) )
Jak na razie mam tyle #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int a,b,c,d,e,f,i,j; void main() { srand( (unsigned) time( NULL ) ); printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); scanf("%d%d%d%d%d%d", &a,&b,&c,&d,&e,&f); if(a>49||b>49||c>49||d>49||e>49||f>49||a<1||b<1||c<1||d<1||e<1||f<1) { printf("Podane liczby sa ze zlego przedzialu\n"); printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); scanf("%d%d%d%d%d%d", &a,&b,&c,&d,&e,&f); } for(i=0;i<6;i++) { j=rand()%200; printf("%d\n",j); if(j==a||j==b||j==c||j==d||j==e||j==f) { printf("trafiłeś"); } } }
Ale średnio mi to idzie i czy ktoś mógłby mi pomóc? Nie oczekuję gotowca, raczej wskazówki, co miałbym wykorzsytać itp...
nie wiem też jak zrobić niepseudolosowe liczby i jak określić ten przedział 0,49...
Dzięki za jakąkolwiek pomoc i pozdrawiam
PS Program musi być jak najprostrzy - tak powiedział prowadzący. Jeśli będize coś nowego to pewno będize się czepiał, zwłaszcza że wie, że mi nie idzie :x
|
|
| Back to top |
|
 |
marcin497 Poziom 2

Joined: 14 Oct 2008 Posts: 3
|
#2
26 Jan 2011 21:25 Re: Prosty programik losujący - totolotek |
|
|
|
W swoim kodzie określiłeś już przedział z jakiego mają być losowane liczby:
"j=rand()%200" zamiast 200 wstaw 49
musisz dla każdej zmiennej a,b,c... wylosować liczbę oddzielnie
i potem najlepiej w pętli sprawdzasz ile wylosowanych liczb zgadza się z tymi podanymi przez ciebie
jeśli naprawdę nie będzie ci wychodzić poszukaj w google jest dużo takich gotowym programów z kodem na inny forach
w razie problemów pisz :)
|
|
| Back to top |
|
 |
Google

|
#
26 Jan 2011 21:25 |
|
|
|
|
|
| Back to top |
|
 |
Greebqmaster Poziom 5

Joined: 16 May 2010 Posts: 13 Location: Warszawa
|
#3
26 Jan 2011 21:31 Re: Prosty programik losujący - totolotek |
|
|
|
No właśnie nie da siętak, że podaje 6 i losuje 6, a nie losuje po każdej liczbie?
Udało mi się wykrzesać coś takiego:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int a,b,c,d,e,f,i,j; void main() { srand( (unsigned) time( NULL ) ); printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); scanf("%d%d%d%d%d%d", &a,&b,&c,&d,&e,&f); printf("Teraz nastapi losowanie liczb\n"); if(a>49||b>49||c>49||d>49||e>49||f>49||a<1||b<1||c<1||d<1||e<1||f<1) { printf("Podane liczby sa ze zlego przedzialu\n"); printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); scanf("%d%d%d%d%d%d", &a,&b,&c,&d,&e,&f); } for(i=0;i<7;i++) { j=1+rand()%49; printf("%d\n",j); if(j==a||j==b||j==c||j==d||j==e||j==f) { printf("trafiles!"); } } }
Aczkolwiek nie mam pojęcia jak poradzić sobie z faktem, że randomy mogą się np powtórzyć i tym, że nie wiem co zrobić, żeby program coś zrobił jak podam dwa razy tą samą liczbę
Pozdrawiam
|
|
| Back to top |
|
 |
marcin497 Poziom 2

Joined: 14 Oct 2008 Posts: 3
|
#4
26 Jan 2011 21:43 Re: Prosty programik losujący - totolotek |
|
|
|
to że randomy mogą się powtórzyć to musisz sprawdzać czy już taka liczba nie została wylosowana
j=1+rand()%49; losujesz tylko jedna liczbę i porównujesz ją ze wszystkimi,
zrób 6 takich zmiennych i losuj im liczby
czy nie podałeś 2 liczb takich samych też musisz sprawdzić, rób to w pętli najlepiej
|
|
| Back to top |
|
 |
Greebqmaster Poziom 5

Joined: 16 May 2010 Posts: 13 Location: Warszawa
|
#5
26 Jan 2011 21:49 Re: Prosty programik losujący - totolotek |
|
|
|
Em.. Właśnie chodzi o to, że nie mam pojęcia jak to sprawdzić.. Nie wiem jak ma wyglądać kod : |
|
|
| Back to top |
|
 |
walek33 Poziom 20

Joined: 07 May 2005 Posts: 1000 Location: Łazy
|
#6
26 Jan 2011 22:47 Re: Prosty programik losujący - totolotek |
|
|
|
A może dla ułatwienia (?) użyć dwuwymiarowej tablicy? W pierwszej wrzucasz liczby wpisane a w drugiej wylosowane.
|
|
| Back to top |
|
 |
Google

|
#
26 Jan 2011 22:47 |
|
|
|
|
|
| Back to top |
|
 |
Greebqmaster Poziom 5

Joined: 16 May 2010 Posts: 13 Location: Warszawa
|
#7
26 Jan 2011 23:09 Re: Prosty programik losujący - totolotek |
|
|
|
Znalazłem fajny kod i go przeredagowałem trochę i nawet działa i nawet rozumiem. Nie jestem pewny czy umiałbym ogarnąć dwuwymiarową tablicę :x
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> void main() { int MaszynaLosujaca[6],i,j,los,a,b,c,d,e,f; srand( (unsigned) time( NULL ) ); printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); scanf("%d%d%d%d%d%d", &a,&b,&c,&d,&e,&f); printf("Teraz nastapi losowanie liczb\n"); if(a>49||b>49||c>49||d>49||e>49||f>49||a<1||b<1||c<1||d<1||e<1||f<1) { printf("Podane liczby sa ze zlego przedzialu\n"); printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); scanf("%d%d%d%d%d%d", &a,&b,&c,&d,&e,&f); } for(i=0;i<6;i++) { los=1+rand()%49;//losujemy liczbę od 1 do 49 for(j=0;j<6;j++)//sprawdzamy czy liczba nie powtarza się if(MaszynaLosujaca[j]==los) los=0; if(los>0) MaszynaLosujaca[i]=los;//nie powtarza się - przypisanie do tablicy else i--;//powtarza się - cofnij pętlę o 1 } //wyświetlenie całej tali for(i=0;i<6;i++) printf("\nMaszynaLosujaca[%d] = %d",i+1,MaszynaLosujaca[i]); }
Teraz nie wiem jak przyrównać wylosowane elementy do tych podanych :|
|
|
| Back to top |
|
 |
walek33 Poziom 20

Joined: 07 May 2005 Posts: 1000 Location: Łazy
|
#8
26 Jan 2011 23:45 Re: Prosty programik losujący - totolotek |
|
|
|
| Quote: |
| Nie jestem pewny czy umiałbym ogarnąć dwuwymiarową tablicę |
Jednowymiarową już ogarniasz. :D
Na Twoim miejscu zmienne a ÷ f zastąpiłbym drugą tablicą. Sprawdzenie można zrealizować za pomocą dwóch pętli for zagnieżdżając je.
|
|
| Back to top |
|
 |
mariush'ek Poziom 16

Joined: 22 Sep 2004 Posts: 279 Location: Grojec
|
#9
26 Jan 2011 23:58 Re: Prosty programik losujący - totolotek |
|
|
|
To tylko wersja najprostsza. Poczytaj o funkcjach. Kilka razy następuje sprawdzanie czy dana liczba jest już w tablicy, więc niepotrzebne powielanie kodu. Za tego minigotowca spróbuj napisać funkcje sprawdzającą czy dana liczba jest w tablicy :) i dołącz ją do swojego programu.
Jeśli nie bardzo rozumiesz for w "forze" napisz program który wypisuje tabliczkę mnożenia :)
int czyLiczbaJestWtablicy(tablica[], sprawdzanaLiczba){
/*
return 0 - jest juz
return 1 - nie ma
*/
}
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> void main() { int i,k; //zmienne pomocnicze int trafione=0; //licznik trafionych liczb int podane[6]; //tablica do przechowywania podanych liczb int podane_ok=0; //flaga mowiaca czy wylosowane liczby sa prwidlowe 0-nie, 1-tak srand( (unsigned) time( NULL ) ); while(podane_ok==0){ podane_ok=1; //zakladamy ze sa poprawne printf("Podaj 6 roznych od siebie liczb z przedzialu <1,49>\n"); //wpisujemy do tablicy scanf("%d%d%d%d%d%d", &podane[0],&podane[1],&podane[2],&podane[3],&podane[4],&podane[5]); for(i=0;i<6;i++){ if(podane_ok==0) break; //jesli sa niepoprawne to break czyli przerywamy sprawdzanie for(k=0;k<6;k++){ if (i == k) continue; //nie sprawdzamy warunku podane[i]==podane[k] gdy i==k poniewaz to zawsze prawda if(podane[i] == podane[k]){ //jesli dwie liczby sa takie same to przerywamy sprawdzanie printf("Podales co najmniej dwie takie same liczby. Sproboj jeszcze raz\n"); podane_ok=0; //ustawiamy flage na 0 czyli danen niepoprawne break; //przerywamy petle } //if if((podane[i]<1) || (podane[i]>49)){ //jesli dane sa spoza przedziału przerywamy sprawdzanie printf("Podales co najmniej jedna liczbe z poza przedzialu <1,49>. Sproboj jeszcze raz\n"); podane_ok=0; //ustawiamy flage na 0 czyli danen niepoprawne break; //przerywamy petle } //if } //for k } //for i } //while printf("Teraz nastapi losowanie liczb \n"); /*losujemy 6 liczb*/ int wylosowane[6]; for(i=0;i<6;i++) { wylosowane[i]=1+rand()%49; for(k=0;k<i;k++){ if(wylosowane[i]==wylosowane[k]) { //jesli jakas nowa wylosowana liczba jest rowna jakiejs poprzedniej i--; //cofamy licznik break;//przerywampy petle } } } for(i=0;i<6;i++) //wypisywanie wyloswanych liczb \t to tabulacja printf("%d. wylosowana liczba to: \t%d\n",i+1,wylosowane[i]); for(i=0;i<7;i++){ //sprawdzamy czy podana liczba jest rowna jakijkolwiek wylosowanej for(k=0;k<7;k++){ if(podane[i] == wylosowane[k]){ //jesli tak printf("Trafiles liczbe %d\n", podane[i]); //wypisujemy komunikat trafione++; //dopisujemy do trafionch } } } if(trafione == 0) printf("\nNiestety - nic nie trafiles\n"); else printf("\nTrafiles %d liczby(e)\n", trafione); system("PAUSE"); } /* * *break-przerwanie petli *continue-przeskocznie do nastepnego kroku petli, jesli takowy mozliwy * */
|
|
| Back to top |
|
 |
Clubber Poziom 14

Joined: 16 Sep 2009 Posts: 178 Location: Baza Białystok
|
#10
02 Feb 2011 23:09 Re: Prosty programik losujący - totolotek |
|
|
|
Zaciekawił mnie ten programik. Oto moja wersja lotto ;)
#include <iostream> #include <stdlib.h> using namespace std ; int main () { int gra=0; cout <<"Siema wszystkim w programie symlujacym losowanie\n\n\t\tLOttO \1\n"<<endl; cout <<"Jaka wersje gry wybierasz ? Wcisnij:\n1 - Duzy Lotek (6 z 49)\n2 - Joker (1 z 36)"<<endl; cin >> gra; while(gra!=1 && gra!=2){ // petla wyuszajaca podanie wartosci 1 albo 2 cout <<"\nSorry wielkie, ale nie mamy takiej gry!! Wybierz cos z opcji 1 albo 2"<<endl; cin >> gra; while (gra!=1 && gra!=2){ cout<<"\n\tPodaj 1 albo 2 !!\nCzy to takie trudne ?!"<<endl; cin >> gra; } } //////////////////// Duzy lotek if(gra==1){ cout <<"Wiec zdecydowales sie na gre w ""Duzy Lotek"""<<endl; cout <<"Podaj 6 liczb z zakresu <1, 49>: "<<endl; int podane[5], liczba, loo=0; for(int i=0; i<6; i++){ cin >> liczba; while(liczba>49 || liczba<1){ cout <<"Podaj na nowo wartosc z przedzialu <1, 49>: "; cin >> liczba; } if(i>0){ loo=0; while(loo==0){ for(int j=0; j<i; j++){ if (podane[j]==liczba) loo+=1; } if(loo==0){ loo=-1; } if(loo>0){ cout <<"\n\tJuz podales ta liczbe. Zmien wybor !!\n"; cin >> liczba; while(liczba > 49 || liczba < 1){ cout <<"Podaj na nowo wartosc z przedzialu <1, 49>: "; cin >> liczba; } loo=0; } } }// if podane[i] = liczba; //cout << "podane["<<i<<"]="<<liczba<<endl; }// for //wyswietlanie podanych liczb cout <<"\nPodane przez Ciebie liczby to:"<<endl; for(int i=0;i<6;i++){ cout << podane[i]<<" "; } ////// losowanie liczb przez PC int losowaPC, tabPC[5]; loo=0; srand ( time(NULL) );//zainicjowanie random ///////////////////////////////////// for(int i=0; i<6; i++){ losowaPC = rand() % 49 + 1; if(i>0){ loo=0; while(loo==0){ for(int j=0; j<i; j++){ if (tabPC[j]==losowaPC) loo+=1; } if(loo==0){ loo=-1; } if(loo>0){ losowaPC = rand() % 49 + 1; loo=0; } } }// if tabPC[i] = losowaPC; //cout << "podane["<<i<<"]="<<liczba<<endl; }// for cout <<"\nWylosowane przez PC liczby to:"<<endl; for(int i=0;i<6;i++){ cout << tabPC[i]<<" "; } ////////////////////////////////////////////// porownanie wynikow int spr=0; for(int i=0;i<6;i++){ for(int j=0; j<6; j++){ if(tabPC[i]==podane[j]) spr++; } } if(spr>0 && spr<6) cout << "\nBrawo !! odgadles liczbe ;)\nNa Twoje nieszczescie jest to tylko "<<spr<<" liczb z 6 potrzebnych do szczescia ;P"<<endl; if(spr==6) cout << "\nJestes genialny !!\nWlasnie wygrales kupe kasy $$$$\n\tBierz znajomych i dawaj na impreze ;P"; if(spr==0) cout << "\nNiestety, nie udalo cie sie odgadnac ani jednej liczby !!"; } //////////////////////////////////////// Joker if(gra==2){ cout <<"\n\t\tWitam w grze JOKER \1\n\n\tZapraszam do podania jednej liczby <1, 36>:"<<endl; srand ( time(NULL) );//zainicjowanie random int podana, losowaPC; losowaPC = rand() % 36 + 1; cin >> podana; while(podana>36 || podana<1){ cout << "Podaj liczne z zakresu <1, 36> !!"<<endl; cin >> podana; } if(podana == losowaPC) cout << "\n\tGratulacje !!!\nWlasnie wygrales losowanie JOKER \1" <<endl; else cout << "\nNiestety sie nie udalo tym razem ;/\nDla pocieszenia podam, ze wylosowana liczba to: " << losowaPC <<endl; cout << "No i ten fakt, ze znowu przegrales 1mnl PLNow\n\t\2heeh hihi hohoh \1" <<endl; } cin.ignore (); getchar(); return 0; }
Trochę kuleje brak wcięć i do zmiany parę komunikatów, no ale działa i buczy ;)
Mam nadzieję, że się komuś przyda.
|
|
| Back to top |
|
 |
azra Poziom 12

Joined: 30 Jul 2010 Posts: 99
|
#11
03 Feb 2011 18:02 Re: Prosty programik losujący - totolotek |
|
|
|
Co do kodu dwa posty wyżej, nie ma czegoś takiego jak "void main()" - main zawsze zwraca int. ;)
Jeśli o C++ mówimy, to tam bardzo łatwo zrobić takie losowanie używając kontenerów. Widać to w metodzie Maszyna::losuj, oto kod:
#include <iostream> #include <string> #include <vector> #include <list> #include <exception> #include <iterator> #include <algorithm> #include <cmath> #include <ctime> namespace my { class Error : public std::exception { std::string msg; public: Error(const std::string& error_msg) : msg(error_msg) {} virtual ~Error() throw() {} virtual const char* what() const throw() { return msg.c_str(); } }; template <typename T> class MakeSequence { private: T current, step; public: MakeSequence(T start = 1, T step = 1) : current(start), step(step) {}; void operator()(T& v) { v += current; current += step; } operator T() { current += step; return current - step; } }; typedef MakeSequence<int> IntSequence; typedef MakeSequence<unsigned int> UIntSequence; class Maszyna { private: std::list<unsigned> zbiornik; const unsigned rozmiar; public: Maszyna(const unsigned ilosc_kulek = 49) : rozmiar(ilosc_kulek) { reset(); } std::vector<unsigned> losuj(const unsigned ilosc_kulek = 6) { if (!mozna_losowac(ilosc_kulek)) throw Error("Wyczerpano zbiornik!"); std::vector<unsigned> wylosowane; wylosowane.reserve(ilosc_kulek); for (unsigned i = 0; i < ilosc_kulek; ++i) { unsigned kulka = std::rand() % zbiornik.size(); std::list<unsigned>::iterator it = zbiornik.begin(); while (kulka--) { ++it; } wylosowane.push_back(*it); zbiornik.erase(it); } return wylosowane; } Maszyna& reset() { zbiornik.clear(); zbiornik.resize(rozmiar); std::for_each(zbiornik.begin(), zbiornik.end(), UIntSequence(1)); return *this; } bool mozna_losowac(const unsigned ilosc_kulek = 6) { return zbiornik.size() >= ilosc_kulek; } }; } int main() { std::srand(std::time(0)); my::Maszyna maszyna; while (maszyna.mozna_losowac()) { std::vector<unsigned> wynik = maszyna.losuj(); std::cout << "Wylosowano: "; std::copy(wynik.begin(), wynik.end(), std::ostream_iterator<unsigned>(std::cout, " ")); std::cout << '\n'; } return 0; }
|
|
| Back to top |
|
 |
Google

|
#
03 Feb 2011 18:02 |
|
|
|
|
|
| Back to top |
|
 |
kolokat Poziom 20

Joined: 13 Oct 2007 Posts: 1081 Location: Poznań
|
#12
04 Feb 2011 14:12 Re: Prosty programik losujący - totolotek |
|
|
|
Ale natrzaskaliście tych bibliotek :D
#include <time.h> #include <conio.h> #include <iostream> using namespace std; int main() { int k, i, n, nn, los[20]; cout<<"podaj ilosc losowanych liczb "; cin>>n; cout<<endl<<"podaj z ilu liczb losujesz "; cin>>nn; time_t t; srand((unsigned) time(&t)); k=rand()%nn+1; los[ 0]=k; i=1; tag: do { k=rand()%nn+1; for(int j=0;j<=i-1;j++) {if(los[ j]==k)goto tag;} los[ i]=k; i=i+1; } while (i<=n); for(i=0;i<=n;i++) cout<<los <<" "; getch(); }
Jeśli chcesz poznać zasadę działania tego poszukaj w Google jako: Generator liczb pseudolosowych, lub generator liczb pseudoprzypadkowych.
|
|
| Back to top |
|
 |
Xitami Poziom 21

Joined: 10 Aug 2004 Posts: 1126 Location: Gliwice
|
#13
05 Feb 2011 15:44 Re: Prosty programik losujący - totolotek |
|
|
|
if(c,z,b,n,k)={ if(z<b, print1(c" "); \\ wynik[k]=c; if(n,f(c+1, z , b*k \n, n-1, k-1 )); , if(n,f(c+1, z-b, b*(n-k)\n, n-1, k )); ); } f(1, 0, 48*47\2*46\3*45\4*44\5, 48, 5) \\ pierwsza f(1, random(49*48\2*47\3*46\4*45\5*44\6)+1, 48*47\2*46\3*45\4*44\5, 48, 5) \\ losowa f(1, 49*48\2*47\3*46\4*45\5*44\6 -1, 48*47\2*46\3*45\4*44\5, 48, 5) \\ ostatnia
f(c,z,b,n,k)
funkcja pokazujaca K-elementowa kombinacje ze zbioru N elementowego, kombinacja ta jest Z-ta z kolei, N-elementowy zbiór to kolejne liczby naturalne poczynając od C. Pomocnicze B sluzy do obliczania symbolu Newtona.
|
|
| Back to top |
|
 |
Clubber Poziom 14

Joined: 16 Sep 2009 Posts: 178 Location: Baza Białystok
|
#14
07 Feb 2011 23:29 Re: Prosty programik losujący - totolotek |
|
|
|
Miał być prosty, a obiektowość się zagnieździła ;>
|
|
| Back to top |
|
 |