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

Zadanie domowe rozdział 21 / Problem ze zrozumieniem błędu

Ostatnio zmodyfikowano 2017-09-06 12:25
Autor Wiadomość
kundelko
Temat założony przez niniejszego użytkownika
Zadanie domowe rozdział 21 / Problem ze zrozumieniem błędu
» 2017-08-28 11:25:27
Witam , zrobiłem pierwsze zadanie domowe z rozdziału 21 . Mój problem polega na tym , że (wydaje mi się ) zrobiłem dobrze zadanie ale nie wiem czemu  w przypadku użycia funkcji "losowaniee" , wszystko działa jak powinno ale jak chciałem użyć funkcji "losowanie " nie chciało zakończyć pentli i program nie działał . A przecież te funkcje są identyczne tylko inna kolejność parametrów . Mógłby ktoś pomóc ? / wytłumaczyć błąd w moim rozumowaniu . Poniżej kod z obiema funkcjami . Jeśli ktoś zauważył inne błędy lub jakieś  moje złe praktyki proszę o zwrócenie uwagi ;)

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

bool losowaniee( int n, int b[] )
{
    int c = 0;
    do
    {
        if( b[ c ] != n )
             c++;
       
        if( b[ c ] == n )
             return false;
       
    } while( c != 2 );
   
    return true;
}

bool losowanie( int t[], int g )
{
    int c = 0;
    do
    {
        if( t[ c ] != g )
             c++;
       
        if( t[ c ] == g );
       
        return false;
    } while( c != 2 );
   
    return true;
}



int main()

{
    int k, i = 0, tablica[ 3 ], z = 0, f[ 2 ];
    srand( time( 0 ) );
    k =( rand() % 3 ) + 0;
    cout << "Podaj 3 liczby" << endl;
    do
    {
        cin >> tablica[ i ];
        i++;
    } while( i != 3 );
   
    cout << "wylosowane liczby to " << endl;
    do
    {
        if( losowanie( f, k ) == true )
        {
            f[ z ] = k;
            z++;
           
        }
        else
        {
            k =( rand() % 3 ) + 0;
        }
       
       
    } while( z != 2 );
   
    cout << tablica[ f[ 0 ] ] << endl;
    cout << tablica[ f[ 1 ] ] << endl;
   
   
   
    return 0;
}
.
P-164347
maly7
» 2017-08-28 12:58:30
W funkcji losowanie za warunkiem if masz średnik:
if( t[ c ] == g );
 
więc jeśli nawet się wykona to nie zwróci false.
P-164349
mateczek
» 2017-08-29 07:34:47
C/C++
bool losowaniee( int n, int b[] )
{
    int c = 0;
    do
    {
        if( b[ c ] != n )
             c++;
       
        if( b[ c ] == n ) //sprawdzasz następny element a powinieneś poprzedni
             return false;
       
    } while( c != 2 );
   
    return true;
}

Jeden błąd poprawiłem (wiązał się z tym że pierwszy warunek sprawdzałeś dla f[c] a drugi dla f[c+1]). A masz jeszcze jeden trudniejszy do wyczajenia. Błąd u mnie się objawia tym, że nie możesz wylosować liczby 2 na pierwszym miejscu. Użyj debugera do namierzenia tego błędu.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
bool losowanie( int t[], int g )
{
    int c = 0;
    do
    {
        if( t[ c ] == g ) {
            return false;
        }
        c++;
    } while( c != 2 );
   
    return true;
}



int main()

{
    int k, i = 0, z = 0;
    int f[ 2 ];
    srand( time( 0 ) );
    do
    {
        k =( rand() % 3 ) + 0;
        if( losowanie( f, k ) == true )
        {
            f[ z ] = k;
            z++;
           
        }
       
    } while( z != 2 );
   
    cout << f[ 0 ] << endl;
    cout << f[ 1 ] << endl;
    return 0;
}
P-164358
matix04
» 2017-09-06 11:19:37
Witam
Mam pytanie do autora tematu odnośnie jego zadania szczerze mówiąc nie rozumiem jak działa ten jego kod. W ogóle sam mam problem z tym zadaniem domowym i próbowałem przeanalizować kolegi rozwiązanie ale nie rozumiem go :)
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

bool losowaniee( int b[], int n )
{
    int c = 0;
    do
    {
        if( b[ c ] != n )
             c++;
       
        if( b[ c ] == n )
             return false;
       
    } while( c != 2 );
   
    return true;
}

int main()

{
    int k, i = 0, tablica[ 3 ], z = 0, f[ 2 ]; // Dla czego tutaj mamy 2 tablice ??
    srand( time( 0 ) );
    k =( rand() % 3 ) + 0;
    cout << "Podaj 3 liczby" << endl;
    do
    {
        cin >> tablica[ i ]; // Wpisujemy do tablicy "tablica [] " a wypisujemy z tablicy "f [] " ??
        i++;
    } while( i != 3 );
   
    cout << "wylosowane liczby to " << endl;
    do
    {
        if( losowaniee( f, k ) == true )
        {
            f[ z ] = k;
            z++;
           
        }
        else
        {
            k =( rand() % 3 ) + 0;
        }
       
       
    } while( z != 2 );
   
    cout << tablica[ f[ 0 ] ] << endl; // Chyba że chodzi o to że tablica[] zawiera liczby nasze wpisane a f[] zawiera wylosowane liczby
    cout << tablica[ f[ 1 ] ] << endl; // i tablica w tablicy :) tego jeszcze nie było w kursie :)
    return 0;
}
Mógłby ktoś napisać inny przykład rozwiązania tego zadania ??
Pozdrawiam
P-164629
karambaHZP
» 2017-09-06 12:25:44
Zacznij pisać od początku. W funkcji main jest za dużo odpowiedzialności, a funkcja losowaniee niczego nie losuje.

int losuj() - zwróci wylosowaną liczbę.
bool czyByla() - sprawdzi czy liczba występuje w tablicy i zwróci true lub false.
void wypelnijTablice() - wypełnia tablicę randomowymi liczbami.
void wypiszTablice() - wypisuje zawartość tablicy.
int main() - zostaje tylko podstawowa logika. Wywołania funkcji.

Można to zadanie zrobić dużo prościej, ale narzędziami które nie były omówione.
std::vector<>
std::shuffle()
std::find()
std::generate()
itd

P-164632
« 1 »
  Strona 1 z 1