Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdzial 21 zadanie domowe

Ostatnio zmodyfikowano 2018-04-08 18:46
Autor Wiadomość
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 ?
C/C++
#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ą
P-170508
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 » Kurs C++ » Poziom XDebugowanie w Visual Studio 2017 lekcja, 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:
C/C++
int a = 2;
int b = 3;
//odkomentuj jedną z tych instrukcji
//a=b;
//b=a;
//sprawdź zawartości zmiennych debuggerem lub wypisz je na ekran
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ć?).
P-170509
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)
P-170510
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?
P-170512
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))
P-170514
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ść).
P-170515
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
C/C++
#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 ] ) //dlaczego tutaj gdy wylosowana liczba się powtorzy funckja if (..) nie zwraca mi fałszu?
             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;
}
P-170517
jankowalski25
» 2018-04-08 10:34:45
} while( c > ile );
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
.
P-170526
« 1 » 2
  Strona 1 z 2 Następna strona