marmal Temat założony przez niniejszego użytkownika |
Tablice jednowymiarowe - losowanie liczb z określonego przedziału » 2014-05-28 11:44:09 Witam, chciałem napisać program podobny do zadanego w rozdziale 18 kursu C++, który wylosuje 999 liczb z zakresu podanego przez użytkownika, wypisze je, a następnie zsumuje. Pisałem go, aby użyć funkcji oraz tablicy. #include <iostream> #include <cstdlib> #include <time.h> using namespace std;
int wylosuj( int start, int stop ) { int losowanie; losowanie =(( rand() %( stop - start ) + 1 ) + start ); return losowanie; }
int main() { srand( time( NULL ) ); int start, stop; int losowanie[ 999 ]; int licznik = 0; cout << "OD:" << endl; cin >> start; cout << "DO:" << endl; cin >> stop; do { losowanie[ licznik ] = wylosuj( start, stop ); licznik++; } while( licznik < 999 ); cout << "Wylosowano:" << endl; licznik = 0; do { cout << losowanie[ licznik ] << ","; licznik++; } while( licznik < 999 ); int suma; licznik = 0; do { suma += losowanie[ licznik ]; licznik++; } while( licznik < 999 ); cout << "\nSuma liczb: " << suma << endl; return 0; }
Oto mój kod. Jednak gdy podam przedział np. od 1 do 2 to wylosuje mi same 2. Aa suma jest liczbą nieparzystą, więc gdzieś musi być błąd. Skoro losuje mi błędnie to myślę, że w funkcji 'wylosuj' podałem niepoprawny przedział, ale nie jestem pewny. Proszę o pomoc. |
|
pekfos |
» 2014-05-28 14:18:25 Nie losujesz liczb z przedziału [start; stop]. 2+2*2.. |
|
Moorfox |
» 2014-05-28 17:40:30 losowanie =(( rand() %( stop - start ) + 1 ) + start );
start = 1 stop = 2 (rand()% (2-1) + 1)+start = rand()%1 + 1 + start rand()%1 = 0 nie zaleznie od wartosci rand() wiec jest to wylosuj 0 pozniej dodaj do niego 1 i jeszcze wartosc start czyli tez 1 wynik bedzie zawsze 2 WNIOSEK: mylisz kolejnosc operatorow POPRAWIONE: losowanie =( rand() %(( stop - start ) + 1 ) + start );
I staraj się programować tak jak robią to inni programiści, żaden dobry programista nie napisze: int losowanie; losowanie =( rand() %(( stop - start ) + 1 ) + start ); return losowanie;
tylko return rand() %(( stop - start ) + 1 ) + start;
Nie mówiąc już o 3 pętlach i ciągłej zamianie licznik = 0 zamiast użycia for'a |
|
marmal Temat założony przez niniejszego użytkownika |
» 2014-05-28 17:46:51 Rzeczywiście. Dzięki Moorfox za sugestie. Poprawiłem: #include <iostream> #include <cstdlib> #include <time.h> using namespace std;
int wylosuj( int start, int stop ) { return rand() %(( stop - start ) + 1 ) + start; }
int main() { srand( time( NULL ) ); int start, stop; int losowanie[ 999 ]; int suma = 0; cout << "OD:" << endl; cin >> start; cout << "DO:" << endl; cin >> stop; for( int i = 0; i < 999; i++ ) { cout << wylosuj( start, stop ) << ","; suma += wylosuj( start, stop ); } cout << "Suma wylosowanych liczb wynosi: " << suma; return 0; }
Mam jeszcze jeden problem z kolejnym zadaniem z kursu. Postanowiłem nie zakładać nowego wątku, gdyż jest ono związane z tablicami jednowymiarowymi. 1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje. Nie miałem pojęcia jak się za to zabrać, ale wykombinowałem coś takiego, lecz nie działa: #include <iostream> #include <cstdio> #include <cstdlib> #include <time.h> #include <windows.h>
int losuj() { return rand() % 3; }
bool czyWylosowana( int liczba, int wyb[], int wylos[], int ile ) { if( ile == 0 ) return false; int i = 0; do { if( wylos[ ile ] == wyb[ liczba ] ) return true; i++; } while( i < ile ); }
using namespace std;
int main() { srand( time( NULL ) ); int wylosowane[ 2 ]; int wybrane[ 3 ]; for( int i = 0; i < 3; i++ ) { cin >> wybrane[ i ]; } int liczba = 0; int ile = 0; cout << "Wybrane:\n"; for( int i = 0; i < 3; i++ ) { cout << wybrane[ i ] << endl; } do { losuj(); liczba = losuj(); if( czyWylosowana( liczba, wybrane, wylosowane, ile ) == false ) { wybrane[ liczba ] = wylosowane[ ile ]; ile++; } } while( ile < 2 ); cout << "Wylosowane: \n"; for( int i = 0; i < 2; i++ ) { cout << wylosowane[ i ] << endl; } }
|
|
Moorfox |
» 2014-05-31 18:55:38 Naucz się formatować trochę kod. losuj(); liczba = losuj();
... Co do kodu jakie widzę błędy. Tu jeden sam się domyśl: wybrane[ liczba ] = wylosowane[ ile ];
A tu jeśli żaden warunek nie zajdzie to ?: bool czyWylosowana( int liczba, int wyb[], int wylos[], int ile ) { if( ile == 0 ) return false; int i = 0; do { if( wylos[ ile ] == wyb[ liczba ] ) return true; i++; } while( i < ile ); }
A tego całkiem nie moge zrozumieć: int i = 0; do { if( wylos[ ile ] == wyb[ liczba ] ) return true; i++; } while( i < ile );
Bardziej sformatowana wersja for( int i = 0; i < ile; i++ ) { if( wylos[ ile ] == wyb[ liczba ] ) return true; }
Po co ci to "i" w takim razie chyba, że nie jesteś pewny i musisz sprawdzić ile-razy czy 2 jest równe 2 for( int i = 0; i < ile; i++ ) { if( wylos[ i ] == wyb[ liczba ] ) return true; }
|
|
pekfos |
» 2014-05-31 20:03:01 Bardziej sformatowana wersja |
Zmianę pętli na inną nazywasz formatowaniem kodu..? Nie bądź śmieszny. A przerabiając tutejszy kurs i losowanie bez powtórzeń/tablice, nie zna jeszcze pętli for. |
|
Moorfox |
» 2014-05-31 20:10:51 Nazwałem to bardziej sformatowaną wersją pętli, bo tak jest. Łatwiej się to czyta czyż nie ? Po za tym nie wiedziałem, że nie zna, nigdy nie przerabiałem tego kursu czystego C++.
EDIT: zna wystarczy popatrzec na kod wyzej |
|
pekfos |
» 2014-05-31 21:01:34 Jedyne co się zmieniło w formatowaniu, to brak nowej linii między if a return. IMHO trudniej się czyta bez tego przejścia. Poza tym, nie ma żadnych (widocznych przez pryzmat STC) różnic w formatowaniu kodu. Zmiana struktury językowej jest czymś zupełnie innym. Sprzecznym z definicji. |
|
« 1 » 2 3 |