FAQ | Points | Add... | Recent posts | Search | Register | Log in


Prosty programik losujący - totolotek


Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> Beginners Programming -> Prosty programik losujący - totolotek
Author
Message
Greebqmaster
Poziom 5
Poziom 5


Joined: 16 May 2010
Posts: 13
Location: Warszawa

Post#1 Post from the author of the topic 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
Code C++ - [expand]
#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
Poziom 2


Joined: 14 Oct 2008
Posts: 3

Post#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

Google Adsense


Post# 26 Jan 2011 21:25   





Back to top
   
Greebqmaster
Poziom 5
Poziom 5


Joined: 16 May 2010
Posts: 13
Location: Warszawa

Post#3 Post from the author of the topic 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:

Code C++ - [expand]
#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
Poziom 2


Joined: 14 Oct 2008
Posts: 3

Post#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
Poziom 5


Joined: 16 May 2010
Posts: 13
Location: Warszawa

Post#5 Post from the author of the topic 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
Poziom 20


Joined: 07 May 2005
Posts: 1000
Location: Łazy

Post#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

Google Adsense


Post# 26 Jan 2011 22:47   





Back to top
   
Greebqmaster
Poziom 5
Poziom 5


Joined: 16 May 2010
Posts: 13
Location: Warszawa

Post#7 Post from the author of the topic 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

Code C++ - [expand]
 
#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
Poziom 20


Joined: 07 May 2005
Posts: 1000
Location: Łazy

Post#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
Poziom 16


Joined: 22 Sep 2004
Posts: 279
Location: Grojec

Post#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
*/
}

Code C++ - [expand]
 
#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
Poziom 14


Joined: 16 Sep 2009
Posts: 178
Location: Baza Białystok

Post#10 02 Feb 2011 23:09   

Re: Prosty programik losujący - totolotek


Zaciekawił mnie ten programik. Oto moja wersja lotto ;)
Code C++ - [expand]
#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
Poziom 12


Joined: 30 Jul 2010
Posts: 99

Post#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:

Code C++ - [expand]
#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

Google Adsense


Post# 03 Feb 2011 18:02   





Back to top
   
kolokat
Poziom 20
Poziom 20


Joined: 13 Oct 2007
Posts: 1081
Location: Poznań

Post#12 04 Feb 2011 14:12   

Re: Prosty programik losujący - totolotek


Ale natrzaskaliście tych bibliotek :D

Code C++ - [expand]
 
#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
Poziom 21


Joined: 10 Aug 2004
Posts: 1126
Location: Gliwice

Post#13 05 Feb 2011 15:44   

Re: Prosty programik losujący - totolotek


Code C++ - [expand]
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
Poziom 14


Joined: 16 Sep 2009
Posts: 178
Location: Baza Białystok

Post#14 07 Feb 2011 23:29   

Re: Prosty programik losujący - totolotek


Miał być prosty, a obiektowość się zagnieździła ;>
Back to top
   
Post new topic  Reply to topic      Main Page -> Forum Index -> Programming Generally -> Beginners Programming -> Prosty programik losujący - totolotek
Page 1 of 1
Similar topics
Napisze ktoś prosty programik PIC16F84 ? (3)
Poprawilem prosty programik .bat (4)
[Turbo Delphi] Prosty Programik (4)
Asembler (Gnu As) - prosty programik (7)
Prosty programik c++ - sprawdzil by mi ktos...? (1)
potrzebuje prosty programik w delphi 5 (1)
Prośba o prosty programik (BASCOM) M16 (35)
Prosty programik w java (4)
Prosty programik w C, problem (9)
Prosty programik w BASCOM proszę o pomoc. (6)

Page generation time: 0.291 seconds


FAQ || Administrator || Moderators || Widgets and banners || Contact
elektroda.pl topic RSS feed