Talamak Temat założony przez niniejszego użytkownika |
Liczba losowa i 2^n » 2016-03-06 02:17:32 Serdeczne cześć wszystkim użytkownikom! Jest to mój pierwszy post, a więc szybciutko zrobię wprowadzenie, a następnie przejdę do meritum. Jestem studentem automatyki i robotyki na politechnice, przyszedł przedmiot zwany informatyką i trzeba zacząć uczyć się programować. Nigdy nie miałem z tym styczności, ale teraz dzielnie brnę przez tajniki C++. Cieszę się, bo bardzo mi się to podoba, a z drugiej strony często jest z tym sporo problemów. Z większością sobie radziłem, ale teraz napotkałem coś, czego przeskoczyć nie potrafię, a więc proszę Was o pomoc. Skoro już się tu zarejestrowałem - myślę, że to nie będzie mój ostatni temat na tym forum. Przez całe studia mogę tu zajrzeć jeszcze parę razy. (: A teraz do rzeczy: Mam zrobić program, który wyświetla wszystkie potęgi liczby 2 mniejsze od m, gdzie m możemy wprowadzić lub, jeśli zechcemy, komputer ma wybierać m losowo. Dla przykładu, jeśli m = 129, to program wyswietli: 1, 2, 4, 8, 16, 32, 64, 128. Problem siedzi właśnie w tym losowaniu m. Wybierając m samodzielnie, nie ma żadnego problemu. Program działa idealnie, wszystko tak jak być powinno (stąd domyślam się, że sam moduł wyświetlania potęg jest prawidłowy). Gdy tylko wybieram opcję, żeby komputer losował m i podawał wszystkie potęgi, pojawia się multum problemów. Potęgi dwójki w ogóle się nie zgadzają z m (jest ich mniej), sama liczba m ograniczona funkcją modulo w ogóle nie trzyma się ograniczonego przedziału, a na dodatek jako pierwsza potega (2^0) nie pojawia się jedynka. Podsumowując: obłęd w ciapki. Przypuszczam, że to nie jakiś głupi błąd, a po prostu grubsza sprawa, o której nie mam pojęcia. Mam nadzieję tylko, że jako bardzo świeży mam do takowego prawo. Mógłby mi ktoś powiedzieć, co tu jest nie tak i jak to poprawić? Z góry dziękuję. #include <iostream> #include <time.h> #include <windows.h>
using namespace std;
int liczba = 1, wybor, m;
int main() { srand( time( NULL ) ); cout << "Wyswietlam kolejne potegi liczby 2, ktore sa mniejsze od m." << endl << endl; cout << "Aby wprowadzic m wcisnij 1." << endl; cout << "Aby wylosowac m wcisnij 2." << endl; cin >> wybor; switch( wybor ) { case 1: cout << "Prosze wprowadzic m: "; cin >> m; break; case 2: m = rand() % 10000; cout << "wylosowano m= " << m; break; } while( liczba < m ) { cout << liczba; liczba = liczba * 2; cout << endl; } return 0; }
|
|
BadBullPL |
» 2016-03-06 07:19:23 Dodaj tu: cout << "wylosowano m= " << m; endl i wszytkie problemy znikną. |
|
carlosmay |
» 2016-03-06 07:38:09 #include <iostream> #include <ctime> #include <cstdlib>
Jeszcze nagłówki. Współczesne C++. |
|
Talamak Temat założony przez niniejszego użytkownika |
» 2016-03-06 13:04:51 Rany, patent z endlinem działa! Rzeczywiście wszystkie problemy zniknęły! Bardzo dziękuję za pomoc. Pytanie tylko: czemu endline robi tutaj taką różnicę? Ktoś mi wytłumaczy, dlaczego bez tej komendy pojawiają się takie problemy?
I jeszcze a propos uwagi z bibliotekami. Dziękuje, też będę je stosować, ale czy ma to rzeczywiście jakieś znaczenie, czy po prostu używa się ich, bo są nowe? Z góry dziękuje za odpowiedzi. |
|
carlosmay |
» 2016-03-06 13:45:53 Pytanie tylko: czemu endline robi tutaj taką różnicę? |
Bez std::endl : 124816
Z std::endl 1 2 4 8 16
Tyle w znaczeniu przejścia do nowej linii. czy po prostu używa się ich, bo są nowe? |
W większości przypadków są przepisane dla nowszego standardu i biblioteki z dopiskiem 'c' przed nazwą mogą mieć dodatkowe usprawnienia. Przyjęto w C++ stosować zamiast #include <stdlib.h> wersję #include <cstdlib> . |
|
Talamak Temat założony przez niniejszego użytkownika |
» 2016-03-08 14:54:54 Wszystko już rozumiem, bardzo dziękuję! |
|
« 1 » |