Pawełek Temat założony przez niniejszego użytkownika |
Rozdzial 21 zadanie domowe » 2018-04-07 19:37:33 2. Zmodyfikuj program z pierwszego zadania tak, aby użytkownik musiał podać 10 liczb, a 8 z nich będzie losowanych bez powtórzeń. Sprawdź czy wyniki są poprawne. |
Móglby mi ktos wytlumaczyc dlaczego ten program nie losuje liczb ? #include <conio.h> #include <ctime> #include <cstdlib> #include <iostream> using namespace std;
void wpisz( int tablica[] ) { int i = 0; do { cout << "Podaj " << i + 1 << " liczbe: "; cin >> tablica[ i ]; i++; } while( i < 10 ); }
bool sprawdzenie( int tablica2[], int c, int ile, int a ) { do { if( tablica2[ a ] == tablica2[ c ] ) return false; c++; } while( c > ile ); return true; }
int main() { srand( time( NULL ) ); int tablica[ 10 ]; int tablica2[ 8 ]; int wylosowanych = 0; wpisz( tablica ); int a; int b = 0; int c = 0; do { a = rand() % 10; tablica[ a ] = tablica2[ b ]; if( sprawdzenie( tablica2, c, wylosowanych, a ) == true ) { wylosowanych++; b++; cout << "Wylosowano " << b + 1 << "liczbe: " << tablica[ a ] << endl; } } while( b < 8 ); return 0; }
Tak swoją drogą to coraz trudniejsze są te zadania i według mnie nie proporcjonalne co do umiejętności które zdobywam z każdą kolejną lekcją |
|
jankowalski25 |
» 2018-04-07 20:12:59 tablica[ a ] = tablica2[ b ]; |
Postaw tu breakpointa i zobacz, co się stanie po wykonaniu tej linijki. Podstawy obsługi debuggera znajdziesz w lekcji Debugowanie w Visual Studio 2017, dla Code::Blocks działania są niemal identyczne (inne mogą być niektóre skróty, na przykład debugger uruchamiamy domyślnie klawiszem F8, ale w ustawieniach można to zmienić). Tak swoją drogą to coraz trudniejsze są te zadania i według mnie nie proporcjonalne co do umiejętności które zdobywam z każdą kolejną lekcją |
Dlaczego nieproporcjonalne? Możliwe, że masz jakieś braki w podstawach, na przykład we wspomnianej linijce przy przypisaniu kolejność argumentów jest istotna. Przykład: A co do kursu, to wszelkie sugestie prowadzące do poprawy jakości treści są mile widziane. Co do debuggera, to na razie ta lekcja jest w poziomie X, ale pewnie dobrze byłoby ją przenieść gdzieś wcześniej, gdy programy są już wystarczająco złożone, aby było co debugować (może przy jakimś kalkulatorze czy czymś takim to wprowadzić?). |
|
Pawełek Temat założony przez niniejszego użytkownika |
» 2018-04-07 20:44:51 Jeśli mógłbym coś doradzić z perspektywy osoby która z programowaniem nigdy nie miała do czynienia to za mało jest zadań w tych pierwszych 15-20 lekcjach, teoria teorią ale z tego co zdążyłem już zauważyć, to najwięcej się uczę kodując samodzielnie ( poprzez rozwiązywanie zadań i szukanie rozwiązań ewentualnych błędów) |
|
jankowalski25 |
» 2018-04-07 21:08:04 Co do dyskusji na temat kursu, to w sumie lepiej byłoby ją prowadzić w oddzielnych tematach. Jeśli chodzi o zadania, to myślę, że ich ilość jest wystarczająca. W razie potrzeby są strony typu SPOJ, gdzie masz sporo różnych algorytmicznych zadań i możesz ćwiczyć do woli, od razu dostając informację zwrotną, czy program działa poprawnie (tutaj zgodnie z zasadami zakładania tematów nikt nie ma obowiązku sprawdzania poprawności zadań, zwłaszcza że jest pełno tematów z gotowcami). My nie jesteśmy SPOJem, mamy nieco inne cele i nie ma sensu tworzyć tutaj czegoś, co gdzieś indziej jest już dobrze rozwinięte, sprawdzone i działa.
Myślę, że zwiększenie liczby zadań mogłoby być dla niektórych osób nieco przytłaczające, bo pewnie większość usiłowałaby koniecznie przerabiać takie algorytmiczne problemy zamiast czytać dalej kurs i uczyć się kolejnych technik prowadzących do łatwiejszego rozwiązywania problemów. Nie mówiąc już o tym, że mielibyśmy jeszcze więcej tematów w dziale pierwszej pomocy, jeszcze więcej gotowców i jeszcze więcej bezużytecznych tematów tworzonych przez osoby mające problem z rozwiązywaniem prac domowych.
Natomiast co do szukania błędów, to polecam korzystać z debuggera. Możliwe, że w kolejnej wersji kursu takie rzeczy będą wprowadzone nieco wcześniej, natomiast co do aktualnej treści, to w sumie nie wiem, gdzie to przenieść, aby to miało sens. Poza tym, pewnie dobrze byłoby dorzucić podobną wersję dla Code::Blocks lub zrobić jakąś ogólną lekcję o debugowaniu. Albo może po prostu w treści kursu dać link do tamtej lekcji w poziomie X?
Wracając do właściwego tematu: czy udało się naprawić błąd? |
|
Pawełek Temat założony przez niniejszego użytkownika |
» 2018-04-07 22:42:42 podczas próby uruchomienia debuggera wyskakuje mi taki błąd : ERROR: You need to specify a debugger program in the debuggers's settings. (For MinGW compilers, it's 'gdb.exe' (without the quotes)) (For MSVC compilers, it's 'cdb.exe' (without the quotes))
|
|
jankowalski25 |
» 2018-04-07 23:31:42 Prawidłowa obsługa debuggera to zupełnie inny temat, podobnie jak dyskusja o ogólnej treści kursu, ale może lepiej odpowiem tutaj:
1. "Settings -> Debugger -> GDB/CDB Debugger -> Default -> Executable path". Klikologia różni się nieco w zależności od wersji Code::Blocks, w starszych wersjach ustawienia debuggera są połączone z ustawieniami kompilatora i znajdują się w "Settings -> Compiler and Debugger -> Toolchain executables". 2. Ustawiasz ścieżkę do debuggera. Będzie to coś w stylu "gdb", "gdb.exe", "mingw-gdb.exe", "mingw32-gdb.exe" lub jakoś podobnie, zależnie od systemu operacyjnego, środowiska i paru innych rzeczy. Jeśli używasz instalatora pobranego z tej strony, to samo położenie debuggera zależy od tego, gdzie masz zainstalowany kompilator. Domyślnie całość wyląduje gdzieś w pobliżu Code::Blocks, prawdopodobnie na tym samym dysku w katalogu "MinGW".
W razie problemów z debuggerem pamiętaj, że jeśli chcesz trzymać się ściśle kursu, to wystarczy po prostu wypisywać zmienne na ekran. To jest najprostsze rozwiązanie, które działa prawie zawsze i niemal wszędzie, ale w długoterminowej perspektywie jest po prostu uciążliwe (i dlatego lepiej używać debuggera, co nie znaczy, że nie można się bez niego obejść). |
|
Pawełek Temat założony przez niniejszego użytkownika |
» 2018-04-08 09:46:43 Ogarnąłem debuggera, zrobiłem dzięki niemu kilka poprawek lecz nadal mam problem #include <conio.h> #include <ctime> #include <cstdlib> #include <iostream> using namespace std;
void wpisz( int tablica[] ) { int i = 0; do { cout << "Podaj " << i + 1 << " liczbe: "; cin >> tablica[ i ]; i++; } while( i < 10 ); }
bool sprawdzenie( int tablica2[], int c, int ile, int a, int tablica[] ) { if( ile == 0 ) return true; do { if( tablica[ a ] == tablica2[ c ] ) return false; c++; } while( c > ile ); return true; }
int main() { srand( time( NULL ) ); int tablica[ 10 ]; int tablica2[ 8 ]; int wylosowanych = 0; wpisz( tablica ); int a; int b = 0; int c = 0; do { a = rand() % 10; if( sprawdzenie( tablica2, c, wylosowanych, a, tablica ) == true ) { wylosowanych++; tablica2[ b ] = tablica[ a ]; b++; cout << "Wylosowano " << b << "liczbe: " << tablica[ a ] << endl; } } while( b < 8 ); return 0; }
|
|
jankowalski25 |
» 2018-04-08 10:34:45 Postaw tutaj breakpointa i sprawdź warunek pętli. Wpisując w oknie debuggera print zmienna możesz podglądać wartości zmiennych, możesz również wpisywać wyrażenia warunkowe (takie, jak to wewnątrz pętli) i wtedy dostaniesz wynik w postaci true lub false . |
|
« 1 » 2 |