[Lekcja 17] Zadanie domowe 1
Ostatnio zmodyfikowano 2012-02-21 02:41
Yeti Temat założony przez niniejszego użytkownika |
» 2012-02-14 09:31:20 Ok, dzięki za pomoc myślę że o to chodziło: #include <iostream> using namespace std; int wczytajLiczbe() { int a; do { if( cin.good() == false ) { cout << "Czy napewno podales liczbe? " << endl; } cin.clear(); cin.sync(); cin >> a; } while( cin.good() == false ); return a; }
int main() { cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); cout << "Podales liczbe: " << liczba << endl; return 0; }
Jeśli nie to powiedz co zrobiłem źle ;) Mam jeszcze jedno pytanie, da się zrobić coś, że jak wpisze 123aaaa to nie wyskoczy liczba 123 tylko to to co jest w if? edit Od razu zadam drugie pytanie :) W zadaniu 4 trzeba podać przedział w argumentach, to zrobiłem bo jest łatwe, ale nie wiem po co trzeba wpisywać start i stop gdy już program się odpali. Zrobiłem takie coś, nie wiem czy o to chodziło: #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int wylosuj( int start, int stop ) { start =( rand() + start ); stop =( rand() % stop ); return start, stop; } int main() { srand( time( NULL ) ); int start; cin >> start; int stop; cin >> stop; int ile = 20; do { cout << wylosuj( start, stop ) << endl; ile--; } while( ile > 0 ); return 0; }
W większości przypadków liczby mieszczą się w przedziale który się poda, ale nie wszystkie. Tak samo jest jak poda się liczby powyżej 1000 wtedy wychodzi nie wiem co. |
|
RazzorFlame |
» 2012-02-14 19:19:48 Dam ci gotowca na te 2 pytanie: #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int wylosuj( int start, int stop ) { int liczba; if( stop > start ) liczba =( rand() %( stop - start ) ) + start; else { cout << "Error: Start nie moze byc wiekszy lub rowny Stop!!!" << endl; } return liczba; } int main() { srand( time( NULL ) ); int start; cin >> start; int stop; cin >> stop; int ile = 20; do { cout << wylosuj( start, stop ) << endl; ile--; } while( ile > 0 ); return 0; }
"liczba = ( rand() % (stop - start) ) + start;" jezeli liczba maxymalna jest wieksza od liczby minimalnej to losuj liczbe od max - min. Generalnie chodzi o to zeby nie losowalo tak jak jest standardowo czyli jezeli masz kod "liczba = ( rand() % stop ) + start;" to wylosuje liczbe od start do liczby o stop wieksza. |
|
Yeti Temat założony przez niniejszego użytkownika |
» 2012-02-15 09:05:17 Nie wiem czy to było trzeba tak rozwiązać bo w kursie nic o tym nie było :/ |
|
pekfos |
» 2012-02-15 19:01:12 To zrób używając tego co jest opisane w kursie. Jak nie wiesz jak, to znaczy, że nie potrafisz zastosować poznanych rzeczy. Czytaj tę lekcję aż zrozumiesz. Innego sposobu nie ma. No można jeszcze walnąć temat na forum by dostać gotowca. Już od Ciebie zależy czy chcesz zrobić zadanie, czy zrozumieć i zrobić zadanie. |
|
benq |
jeszcze inna możlowość » 2012-02-17 23:13:58 #include <iostream> #include <cstdio> int wczytajLiczbe() { int a; do { std::cin.clear(); std::cin.sync(); std::cin >> a; switch( std::cin.good() ) { case false: std::cout << "podaj liczbe poprawnie jeszcze raz :"; break; default: break; } } while( std::cin.fail() ); return a; }
int main() { std::cout << "Podaj liczbe: "; int liczba = wczytajLiczbe(); std::cout << "Podales liczbe: " << liczba << std::endl; return 0; } Proszę jeszcze jedno rozwiązanie dla tych co mają problem z tym zadaniem i które wydaje mi się dobre.Jeśli nie to bardzo proszę komentarz. (sam miałem nie mały problem ale podpatrzyłem u pana Yeti metodę cin.good() za co jestem bardzo wdzięczny). |
|
nowy007 |
» 2012-02-21 02:41:57 mała poprawka do losowania liczby z przedziału (stop - start), wtedy ten przedział nie jest pełny i liczba jest losowana z pominięciem górnej granicy, zrób sobie na przykładzie start 10 i stop 20, wtedy jako że losujesz spośród przedziału 10 liczbowego i zaczynasz od liczby 10 to ostatnia jest 19 bo 10 też jest w tym przedziale. Aby losowało z całego przedziału trzeba zrobić tak: #include <iostream> #include <cstdlib> #include <ctime>
int wylosuj( int start, int stop )
{ int liczba; std::cin.clear(); std::cin.sync(); if( start < stop ) liczba =( rand() %( stop - start + 1 ) + start ); else std::cout << "Podales bledny przedzial. " << std::endl; return liczba; }
int main() { srand( time( NULL ) ); int start; std::cin >> start; int stop; std::cin >> stop; int ile = 20; do { std::cout << wylosuj( start, stop ) << std::endl; ile--; } while( ile > 0 ); return 0; }
ps. zresztą tak samo w poprzednim zadaniu był podchwytliwie podany przedział 50 do 60 włącznie zatem trzeba było dać "%11" ;) teraz jeszcze kwestia, aby nie wyskakiwał błąd przy podaniu większego "start" niż "stop" bez ingerencji w kod funkcji main, ale raczej się nie da dobrze mówię? |
|
1 « 2 » |