twoxu Temat założony przez niniejszego użytkownika |
» 2014-07-17 01:05:09 Dzięki Moorfox, użyłem Twojego kodu i teraz wyświetlają się na ekranie "wylosowane" liczby, a w nawiasie dlatego, gdyż pojawił się kolejny problem. Niby wszystko dobrze, lecz funkcja WylosujLiczbe chyba się nie sprawuje, gdyż wszystkie liczby drukowane na ekran nie są takie jak mają być. Wynik pracy programu: Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen. 1 2 3 4 5 6 7 8 9 0 Oto Wylosowane Liczby: 1 z nich to jest:1969392853 2 z nich to jest:4 3 z nich to jest:-2 4 z nich to jest:1969295714 5 z nich to jest:1969642436 6 z nich to jest:4273296 7 z nich to jest:2686760 8 z nich to jest:4273398
Process returned 0 (0x0) execution time : 6.734 s Press any key to continue.
A to teraźniejszy kod programu: #include <iostream> #include <ctime> #include <cstdlib>
using namespace std; void wydrukuj( int IleWydrukowac, int Wylosowane[] ) { cout << IleWydrukowac + 1 << " z nich to jest:" << Wylosowane[ IleWydrukowac ] << endl; } bool czyBylaWylosowana( int iLiczba, int tab[], int wylosowanych ) { if( wylosowanych >= 0 ) { return false; } int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < wylosowanych ); return false; } int wylosujLiczbe() { int los =( rand() % 8 ) + 0; return los; } int main() { srand( time( NULL ) ); int LiczbyUzytkownika[ 10 ]; int wylosowane[ 8 ]; int wylosowanych = 0; int ilePodac = 0; int IleWydrukowac = 0; cout << "Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen." << endl; do { cin >> LiczbyUzytkownika[ ilePodac ]; ilePodac++; } while( ilePodac <= 9 ); do { int Liczba = wylosujLiczbe(); if( czyBylaWylosowana( Liczba, wylosowane, wylosowanych ) == false ) { wylosowanych++; wylosowane[ wylosowanych ] = Liczba; } } while( wylosowanych > 8 ); cout << "Oto Wylosowane Liczby: " << endl; do { wydrukuj( IleWydrukowac, wylosowane ); IleWydrukowac++; } while( IleWydrukowac < 8 ); return 0; }
|
|
Moorfox |
» 2014-07-17 01:12:56 Napisałem też wcześniej while( wylosowanych > 8 ); czego nie poprawiłeś wylosowanych = 0 czyli while( wylosowanych > 8) <=> while ( 0 > 8 ) <=> while (false) Zostaną wypisane wartości które domyślnie były przypisane komórkom pamięci Zmień na: while( wylosowanych < 8 );
Że nie wywala ci warninga o naruszeniu pamięci...
EDIT: nie w nawiasie a w cudzysłowiu (mówie o twoim poście) |
|
twoxu Temat założony przez niniejszego użytkownika |
» 2014-07-17 01:24:01 Dzięki! Poprawię mój program nad ranem! A i wiem, że nie nawias tylko cudzysłów, pomyliłem się, mam nadzieję że mnie nie uważasz za totalnego idiotę :) |
|
Moorfox |
» 2014-07-17 02:16:50 A pro po jak już poprawisz program to zajmij się jeszcze 1.Formatowaniem kodu 2.Zamianą pętli do while na for będzie mniej zmiennych po za pętlą 3.Żeby było jak najlepiej wizualnie Kiedy zrobisz powyższe kroki usuń wszystko i zacznij jeszcze raz wymyślając lepszy algorytm teraz losujesz 8 z 10 liczb Myśląc jak programista algorytm działa tak losujesz liczbe i sprawdzasz czy ona jest już wylosowana jeśli tak ponawiasz Powiedzmy, że masz 99 z 100 liczb To wyobraż sobie, że wylosowałeś już 98 liczb i brakuje ci jeszcze jednej i wtedy jest 98% szansy, że kolejna liczba którą wylosowałeś była już wylosowana i 2%, że będzie to ta oczekiwana, która to zakończy powiedzmy, że losujemy 9999 z 10000, takie losowanie może trwać baaaaaaaaaaaaaaaaaaaaaaaaaaaaardzo długo, złożoność obliczeniowa więc jest ogromna i nie da się jej zapewne ustalić. Mało sprawny algorytm n - liczba liczb w puli k - ile do wylosowania założenie k<n jeżeli k jest prawie równe n zwiększa się baaaaaaaaaaaaaaaaaaaaaardzo złożoność obliczeniowa i jest tym większa im większe jest k i n. Wymyśl lepszy algorytm, można na przykład inaczej, czyli wylosować te liczby które mają być usunięte np tab[] - tablica 10 liczb for(i=0;i<n-k;i++){ wylosuj a usun tab[a] 'wyrownaj' elementy tablicy } return tab
|
|
pekfos |
» 2014-07-17 11:18:24 Zadanie nie polega na osiągnięciu celu najlepszym algorytmem. Póki co, niech pisze 'na pałę', jak oczekuje od niego kurs. Najpierw niech zrozumie co w ogóle pisze, a potem dopiero myśli, czy jego rozwiązania są optymalne. Inaczej nic z tego nie będzie. |
|
twoxu Temat założony przez niniejszego użytkownika |
» 2014-07-17 13:57:05 Pętla for jest dopiero na następnej lekcji, napiszę nie na pałę gdy się jej nauczę. Dzięki za pomoc :) EDIT: Zrobiłem jeszcze 3 małe bugfixy w postaci przenoszenia pewnych linijiek kodu w inne miejsce, aby wykonywały się w dobrej kolejności, i program wreszcie działa! Oto wynik: Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen. 12 23 34 45 56 67 78 89 90 01 Oto Wylosowane Liczby: 1 z nich to jest: 23 2 z nich to jest: 67 3 z nich to jest: 78 4 z nich to jest: 34 5 z nich to jest: 45 6 z nich to jest: 56 7 z nich to jest: 89 8 z nich to jest: 12
Process returned 0 (0x0) execution time : 14.859 s Press any key to continue.
A tutaj kod programu, dla tych co mają taki problem jak ja miałem: #include <iostream> #include <ctime> #include <cstdlib>
using namespace std; void wydrukuj( int IleWydrukowac, int Wylosowane[], int LiczbyUzytkownika[] ) { cout << IleWydrukowac + 1 << " z nich to jest: " << LiczbyUzytkownika[ Wylosowane[ IleWydrukowac ] ] << endl; } bool czyBylaWylosowana( int iLiczba, int tab[], int wylosowanych ) { if( wylosowanych == 0 ) { return false; } int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < wylosowanych ); return false; } int wylosujLiczbe() { int los =( rand() % 8 ) + 0; return los; } int main() { srand( time( NULL ) ); cin.clear(); cin.sync(); int LiczbyUzytkownika[ 10 ]; int wylosowane[ 8 ]; int wylosowanych = 0; int ilePodac = 0; int IleWydrukowac = 0; cout << "Prosze podac 10 liczb. Program wylosuje z nich 8 bez powtorzen." << endl; do { cin.clear(); cin.sync(); cin >> LiczbyUzytkownika[ ilePodac ]; ilePodac++; } while( ilePodac <= 9 ); do { int Liczba = wylosujLiczbe(); if( czyBylaWylosowana( Liczba, wylosowane, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = Liczba; wylosowanych++; } } while( wylosowanych < 8 ); cout << "Oto Wylosowane Liczby: " << endl; do { wydrukuj( IleWydrukowac, wylosowane, LiczbyUzytkownika ); IleWydrukowac++; } while( IleWydrukowac < 8 ); return 0; }
WIELKIE DZIĘKI! |
|
1 « 2 » |