matematykaszkolna.pl
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 emotka
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 emotka
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: emotka
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. emotka
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
TłumokMatematyczny: Chodzi o takie tablice? http://cpp0x.pl/kursy/Kurs-C++/Tablice-zmiennych/298 Bo pierwszy raz o nich słyszę szczerze mówiąc
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 emotka
26 kwi 19:32
TłumokMatematyczny: @f123 − w którym miejscu mam to wstawić... proszę wklej mi to do kodu który podałam emotka
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 emotka
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