c++
TłumokMatematyczny: Jak zrobić, aby program losował 6 liczb jednocześnie, np. tak: 34−23−12−10−9−8, a nie tylko
jedną liczbę?
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int a,b,c,wiek;
int main()
{
cout<<"Ile masz lat? ";
cin>>wiek;
switch (wiek)
{
case 0 ... 17:
cout <<"Jestes niepelnoletni, nie mozesz wziac udzialu w turnieju";
break;
default:
cout <<"Jestes "<<wiek<<" latkiem i mozesz wziac udzial w turnieju"<<endl;
cout<<"Podaj 6 liczb z zakresu 1−49"<<endl;
cout<<"Twoj limit zgadywania to 200 prob"<<endl<<"Czas start..."<<endl;
srand(time(NULL));
for (a=1;a<201;a++)
{
b=1+rand()%49;
cout<<"Zgadnij co wylosowal program! ";
cout<<b<<endl;
cin>>c;
if (c==b)
{
cout<<"Gratulacje−wygrales/wygralas milion zlotych!"<<endl;
break;
}
else
{
cout<<"Niestety PUDLO, graj dalej..."<<endl;
}
}
cout<<"Dziekujemy za udzial w turnieju!"<<endl;
}
return 0;
}
26 kwi 17:07
f123: W sensie? Ze program najpierw losuje nam 6 pseudolosywch liczb, a pozniej naszym zadaniem jest
je zgdnac?
26 kwi 17:12
Saizou :
W sensie taki Totolotek
26 kwi 17:13
f123: Mialas vectory?
26 kwi 17:15
TłumokMatematyczny: Nie kojarzę vectorów..
26 kwi 17:16
ICSP: zbiór może?
Losujesz do momentu gdy rozmiar zbioru będzie równy 6.
26 kwi 17:16
TłumokMatematyczny: 17:12 tak
26 kwi 17:16
f123: To w takim razie − przed for'em() − losujesz jedna liczbe i zapisujesz ja w tablicy − i tak 6x
razy
26 kwi 17:18
Saizou :
Nawet od biedy można zrobić to tylko na zmiennych
26 kwi 17:19
f123: Zalezy czy milion sie wygrywa, kiedy trafisz 6
26 kwi 17:22
TłumokMatematyczny: Zrobiłam tymi zmiennymi ale te liczby są ze sobą zlepione. Jak zrobić żeby miały między sobą
myślnik?
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int a,b,c,d,e,f,g,h,i,wiek;
int main()
{
cout<<"Ile masz lat? ";
cin>>wiek;
switch (wiek)
{
case 0 ... 17:
cout <<"Jestes niepelnoletni, nie mozesz wziac udzialu w turnieju";
break;
default:
cout <<"Jestes "<<wiek<<" latkiem i mozesz wziac udzial w turnieju"<<endl;
cout<<"Podaj 6 liczb z zakresu 1−49"<<endl;
cout<<"Twoj limit zgadywania to 200 prob"<<endl<<"Czas start..."<<endl;
srand(time(NULL));
for (a=1;a<201;a++)
{
b=1+rand()%49;
c=1+rand()%49;
d=1+rand()%49;
e=1+rand()%49;
f=1+rand()%49;
g=1+rand()%49;
h=1+rand()%49;
cout<<"Zgadnij co wylosowal program! ";
cout<<b;
cout<<c;
cout<<d;
cout<<e;
cout<<f;
cout<<g;
cout<<h;
cin>>b;
cin>>c;
cin>>d;
cin>>e;
cin>>f;
cin>>g;
cin>>h;
if ((b==b),(c==c),(d==d),(e==e),(f==f),(g==g),(h==h))
{
cout<<"Gratulacje−wygrales/wygralas milion zlotych!"<<endl;
break;
}
else
{
cout<<"Niestety PUDLO, graj dalej..."<<endl;
}
}
cout<<"Dziekujemy za udzial w turnieju!"<<endl;
}
return 0;
}
26 kwi 17:36
TłumokMatematyczny: Teraz zauwazylam ze mam 7 liczb, zaraz poprawie
26 kwi 17:37
wredulus_pospolitus:
Czy ja dobrze widzę ... porównujesz czy b == b
itd.
Przecież to zawsze będzie spełnione.
Jak zmienna nie może być równa sobie samej
26 kwi 17:42
wredulus_pospolitus:
Druga sprawa −−− w totku nie można wylosować takich samych liczb −−− powyższy algorytm (jeżeli
go dobrze odczytuję) to umożliwia.
26 kwi 17:42
TłumokMatematyczny: No to ja nie wiem jak to zrobic....
26 kwi 17:43
wredulus_pospolitus:
trzecia sprawa −−− odgadnąć trzeba nie tylko jakie liczby zostały wylosowane, ale także w
jakiej kolejności −−− co jest bzduuurą
26 kwi 17:43
TłumokMatematyczny: Wiem, ale nauczyciel jeszcze nie wymagał losowania bez powtórzeń.
26 kwi 17:43
TłumokMatematyczny:
26 kwi 17:45
f123: No dobra, ale tak wlasciwie co chcesz zrobic
26 kwi 17:49
TłumokMatematyczny: ogólnie polecenie jest dosyć obszerne... mam napisać program, który zrealizuje losowanie
sześciu liczb i
1) Ma odbyć się 200 losowań − użyj albo pętli for... albo while... albo do...while
2) Program ma zapytać czy gracz ma przynajmniej 18 lat, jeśli tak, to może przystąpić do
losowania jeśli nie to ma wrócić do pętli głównej za pomocą continue;
3) Jeżeli gracz ma 18 i więcej lat ma podać swoich 6 liczb z zakresu od 1−49
4) Następnie system ma wylosować 6 liczb z zakresu od 1−49 (jeżeli chcesz, spróbuj zrobić
losowanie bez powtórzeń, choć nie jest to na razie wymagane − zrób obojętnie)
5) Następnie ma zostać dokonane sprawdzenie i jeśli jest zgodność 6 − informacja o wygranej i
wyjście z pętli za pomocą break;
6) Przed zakończeniem − program ma poinformować o ilości odbytych losowań (jak nie wygra − to
200, jak wygra − to pewno mniej)
7) Następnie program ma zakończyć działanie
26 kwi 17:53
Shizzer: 1. Jeśli chcesz, żeby x warunków była spełnionych w jednym if'ie to te warunki oddzielasz &&,
nie przecinkiem.
2. Nadpisujesz zmienne, które przechowywały wylosowane liczby wskutek czego użytkownik
sam sobie definiuje wylosowane liczby wprowadzając je z klawiatury.
3. Użyj tablicy, bo ilość zmiennych w tym programie jest bardzo nieoptymalna w sensie czytania
tego kodu chociażby.
4. Zrób sobie zmienną np. "guess", która będzie przechowywała liczbę, którą zgadł użytkownik
i aktualizuj ją sobie w pętli, która będzie przechodziła po tablicy tych Twoich wylosowanych
liczb.
Skoro miałaś instrukcje break i continue to robisz tak:
for (int i = 0; i < arr__size; i++) {
cin >> guess;
if (guess == arr[i]) {
continue;
} else {
cout << "Nie zgadles " << i + 1 << " liczby!" << endl;
break;
}
}
Gdzie arr − tablica z liczbami wylosowanymi, guess − zmienna przechowująca liczbę wprowadzoną
przez usera.
Jeśli chcesz być programistą/ką to ten kod można jeszcze bardziej upiększyć, ale jeśli nie to
nie będę wkraczał w funkcję itd.
26 kwi 17:54
Shizzer: Ogólnie nauczenie się używania funkcji w programowaniu bardzo się przydaje, bo wtedy
dzielisz sobie większy problem na mniejsze części i w kolejnych krokach zbliżasz się do
jego rozwiązania. Na lekcjach programowania w szkołach nauczyciele niestety nie uczą
raczej jak szybko można rozwiązywać problem − obchodzi ich jedynie to, żeby
problem został rozwiązany.
Tzn. np. zmienne typu a, b, c, d zamiast opisowe. Jak sobie napiszesz kod, który można CZYTAĆ
to i łatwiej powinieneś/nnaś wpadać na pomysły jak dany algorytm zaimplementować
26 kwi 17:57
wredulus_pospolitus:
Shizzer −−− ale użytkownik NAJPIERW podaje liczby, więc musisz je przechować w tablicy
26 kwi 18:00
26 kwi 18:00
f123: Te polecenie dobrze przepisales
26 kwi 18:01
TłumokMatematyczny: Tak, a czemu
26 kwi 18:02
f123: Na pewno musisz miec tablice, gdzie bedziesz trzymac liczby, ktore podaje uzytkownik
26 kwi 18:05
Shizzer: wreduluspospolitus − myślałem, że program najpierw losuje liczby. W takim razie albo można
odwrócić tzn. napisać pętlę przechodzącą po tablicy liczb wpisanych przez użytkownik i w każdej
iteracji tej pętli losować liczbę. Jeśli będzie zgodna to continue, jeśli nie to break.
TłumokMatematyczny − tak, chodzi o te tablice. Są bardzo pomocne
26 kwi 18:05
f123: masz cos takiego;
//wprowadzenie danych
int arr[6];
for (int i = 0; i < 6; i++) {
int number;
std::cin >> number;
arr[i] = number;
}
26 kwi 18:11
TłumokMatematyczny: Okeej, po kolei. Przesyłam link do imgura gdzie jest pokazane co mi wyskakuje przy moim
pierwszym kodzie.
https://imgur.com/7mLTGn1
A więc to co na razie udało mi się zrobić to
warunek z wiekiem oraz 200 losowań.
To z czym mam problem to
− że system ma wylosować 6 liczb z zakresu od 1−49 (wiem tylko jak wylosować jedną liczbę)
− sprawdzenie i jeśli jest zgodność 6 − informacja o wygranej i wyjście z pętli za pomocą
break;
− przed zakończeniem − program ma poinformować o ilości odbytych losowań (jak nie wygra − to
200, jak wygra − to pewno mniej)
26 kwi 18:34
ICSP: skoro wiesz jak wylosować jedną
to wylosuj 6 razy po jednej.
będziesz miał 6 (niestety niekoniecznie różnych)
26 kwi 18:39
TłumokMatematyczny: Ale wtedy chyba po każdej poprawnie wylosowanej liczbie bedzie mi sie pokazywalo ze wygralam
milion.
26 kwi 18:43
f123: 200 losowan − co to znaczy? Rozumiem ze jedno losowanie to, ze uzytkownik podaje 6 liczb oraz
program losuje i sprawdza czy trafil 6?
26 kwi 19:01
TłumokMatematyczny: 19:01 tak, dokladnie
26 kwi 19:05
f123: To najlepiej liczby podane przez uzytkownika oraz wylosowane zapisywac do dwoch ronic tablic,
obie o size == 6
26 kwi 19:19
TłumokMatematyczny: Mógłbyś mi to wkeić w odpowiednie miejsce w tym kodzie?
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int a,b,c,wiek;
int main()
{
cout<<"Ile masz lat? ";
cin>>wiek;
switch (wiek)
{
case 0 ... 17:
cout <<"Jestes niepelnoletni, nie mozesz wziac udzialu w turnieju";
break;
default:
cout <<"Jestes "<<wiek<<" latkiem i mozesz wziac udzial w turnieju"<<endl;
cout<<"Podaj 6 liczb z zakresu 1−49"<<endl;
cout<<"Twoj limit zgadywania to 200 prob"<<endl<<"Czas start..."<<endl;
srand(time(NULL));
for (a=1;a<201;a++)
{
b=1+rand()%49;
cout<<"Zgadnij co wylosowal program! ";
cout<<b<<endl;
cin>>c;
if (c==b)
{
cout<<"Gratulacje−wygrales/wygralas milion zlotych!"<<endl;
break;
}
else
{
cout<<"Niestety PUDLO, graj dalej..."<<endl;
}
}
cout<<"Dziekujemy za udzial w turnieju!"<<endl;
}
return 0;
}
26 kwi 19:21
f123: for (int a = 1; a < 201; a++) {
//uzytkownik podaje 6 liczb i wpisujemy je do tablicy
int input[6];
for (int i = 0; i < 6; i++) {
int number;
std::cin >> number;
input[i] = number;
}
//losowanie
int luckynumbers[6];
for (int i = 0; i < 6; i++) {
luckynumbers[i] = 1 + std::rand() % 49;
}
//nastepnie musisz zobaczyc, czy te dwie tablice sa identyczne
}
26 kwi 19:29
WhiskeyTaster: Losowanie w tym kodzie nie ma sensu. Liczby do odgadnięcia powinny być wylosowane przed
zgadywaniem. Na ten moment losujesz liczbę b za każdym razem, gdy nie zgadniesz jaka to
liczba. Więc nie bardzo ma to sens.
Zacznij od tego, by wylosować te kilka liczb i przechowaj je w tablicy, dopiero potem rób
następną rzecz jaką jest myślenie nad tym, jak sprawdzać, czy zgadliśmy
26 kwi 19:32
TłumokMatematyczny: @f123 − w którym miejscu mam to wstawić... proszę wklej mi to do kodu który podałam
26 kwi 19:38
f123: #include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int a,b,c,wiek;
int main()
{
cout<<"Ile masz lat? ";
cin>>wiek;
switch (wiek)
{
case 0 ... 17:
cout <<"Jestes niepelnoletni, nie mozesz wziac udzialu w turnieju";
break;
default:
cout <<"Jestes "<<wiek<<" latkiem i mozesz wziac udzial w turnieju"<<endl;
cout<<"Podaj 6 liczb z zakresu 1−49"<<endl;
cout<<"Twoj limit zgadywania to 200 prob"<<endl<<"Czas start..."<<endl;
srand(time(NULL));
for (a=1;a<201;a++)
{
//uzytkownik podaje 6 liczb i wpisujemy je do tablicy
int input[6];
for (int i = 0; i < 6; i++) {
int number;
std::cin >> number;
input[i] = number;
}
//losowanie
int luckynumbers[6];
for (int i = 0; i < 6; i++) {
luckynumbers[i] = 1 + std::rand() % 49;
}
//nastepnie musisz zobaczyc, czy te dwie tablice sa identyczne
}
cout<<"Dziekujemy za udzial w turnieju!"<<endl;
}
return 0;
}
26 kwi 19:40
f123: zostalo ci zastanowic sie nad tym, jak zobaczyc czy dwie tablice sa identyczne − czyli maja
takie same elementy i kazdy z nich wystepuje tyle samo razy:
//identryczne
input = [3, 2, 23, 4, 34]
luckynumbers = [34, 3, 23, 4, 2]
//zle
input = [3, 34, 12, 2, 17]
luckynumbers = [3, 3, 34, 12, 2]
26 kwi 19:42
f123: i zastanow sie, co ci daje fakt, ze wylosowane liczby sa w zakresie <1, 49> −−− jak juz
bedziesz sie zastanawiac nad tym, jak porownac dwie tablice
26 kwi 19:44
TłumokMatematyczny: Bardzo pasuje mi tu zdanie ''Im więcej wiem, tym bardziej wiem, że nic nie wiem''
26 kwi 20:07
f123: witamy w swiecie programowania
26 kwi 20:20
Mariusz:
f123 No fajnie a co z losowaniem tych samych liczb ?
Już wredulus zauważył że wasz kod powinien uniemożliwić wylosowanie tych samych liczb
Kiedyś w Pascalu sobie taki programik napisałem
Jeżeli chodzi o losowanie różnych liczb to można napisać program losujący
takie liczby co najmniej na dwa sposoby
Można zaoszczędzić pamięć kosztem złożoności czasowej
albo zaoszczędzić czas kosztem złożoności pamięciowej
liczbaWylosowanych = 0
dopóki liczbaWylosowanych <= 6:
wylosuj liczbę z przedziału 1..49
wyszukaj wylosowaną liczbę w tablicy
jeżeli liczby w tablicy nie znaleziono to
zapisz liczbę w tablicy
liczbaWylosowanych+=1
Można też w tablicy przechowywać wszystkie możliwe do wylosowania liczby
i po wylosowaniu zamienić element tablicy z k. elementem od końca
Co do sprawdzania to dobrym pomysłem byłoby posortowanie obydwu tablic
28 kwi 11:15
f123: Mozna posortowac, jednak autorka posta nie miala jeszcze takich rzeczy jak, std::vector lub
std::array, wiec uzycie std::sort() odpada. Moze jedynie zaimplementowac najprostsza wersje
bubble sorta.
28 kwi 11:24
f123: Patrzac na poziom autorki, takze dla niej trudem bedzie napisanie losowania unikatowych liczb
−−− chociazby z twojego algorytmu, ktory jest bardzo prosty w implementacji
28 kwi 11:26
f123: Co do zlozonosci obliczeniowej oraz pamieciowej. Tez narazie bym zostawil
28 kwi 11:28