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

Lekcja 2.21

Ostatnio zmodyfikowano 2016-08-15 13:25
Autor Wiadomość
carlosmay
» 2016-08-14 18:27:25
Możecie mi to poprawić
Tylko co? Tam nie ma błędu.

Małpa (hi hi);) @Gibas11 dał ci dwie dobre wskazówki. Albo to zrozumiesz, albo nie. (ta małpka przed loginem zawsze rozbawia jak czyta się dosłownie)
Pomyśl o tym tak:
Przekazujesz coś do funkcji, a funkcja to odbiera, coś na zasadzie przypisania.
C/C++
void printNumber( int argument ) { } // odbierasz wartość i przypisujesz ją (inicjalizujesz) zmienną 'argument' ==> int argument = arrayOfNumbers[0]

void printArray( int argument[] ) { }

int main()
{ int arrayOfNumbers[] = { 1, 2, 3 };
    printNumber( arrayOfNumbers[ 0 ] ); // przekazujsz wartość pierwszego elementu (liczbę)
    printArray( arrayOfNumbers ); // przekazujesz tablicę (adres)
}
P-150851
chrust
» 2016-08-14 18:28:55
Jestem świeżakiem, ale zauważyłem, że masz błąd:
 "if( tab[ i++ ] == iLiczba )".
Postinkrementacja powinna być za
" return true; ",
 ponieważ pierw musisz porównać tab[0] z nowa wylosowana liczba, czy nie są takie same. Nawet masz to w kodzie napisane z lekcji.
Pierwszy raz pisze na forum. Sory za formatowanie ;)
P-150852
carlosmay
» 2016-08-14 18:31:37
ponieważ pierw musisz porównać tab[0] z nowa wylosowana liczba, czy nie są takie same. Nawet masz to w kodzie napisane z lekcji.
Ten kod właśnie to robi. Najpierw porównuje wartości, następnie wykonuje się postinktrementacja na zmiennej 'i'.
Poczytaj o różnicach między preinkrementacjią a postinkrementacją.

Postinkrementacja powinna być za
" return true; ",
To nie ma sensu, bo wejście do if'a skutkuje wykonanie
return
 i opuszczenie funkcji,
więc do inkrementacji nawet nie dojdzie.
P-150853
chrust
» 2016-08-14 18:36:12
Przeczytałem, mój błąd, teraz zapamiętam:) Dobrze jest tak pisać? Zawsze parę linijek mniej w programie.
P-150854
carlosmay
» 2016-08-14 18:40:09
W prostych przykładach tak, bo okiem ogarniasz co się dzieje.
W bardziej skomplikowanych kodach lepiej wyróżniać inkrementację, dekrementację.
Zyskasz na czytelności, a o to w tym chodzi, żeby na pierwszy rzut oka było widać co robi dany fragment kodu.
P-150855
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-08-14 18:57:26
Panowie nie wkleiłem całego kodu, mój błąd. Staram się zrozumieć ale kod mi nie trybi, pomału do celu staram się dotrzeć.
Gibas11 ładnie to napisał ale mam problem z przepisaniem tego na do while i nie chcę tego przeskoczyć z forem bo nie o to chodzi.
int tab[ 2 ] = { - 1, - 1 }
 Kolega to wytłumaczył ale zdałem sobie sprawę że nie umiem sobie tego wyobrazić, w rożnych tematach ludzie obchodzą się bez wartości -1 i nie wiem jak to obejść, napisać poprawnie.

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

using namespace std;

bool czyBylaWylosowana( int iLiczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tab[ i++ ] == iLiczba )
             return true;
       
    } while( i < ile );
   
    return false;
}


void podjaliczbe( int tab2[] )
{
    int i = 0;
    int liczba = 0;
    cout << "Podaj 3 liczby: " << endl;
    do
    {
        cout << "Liczba: ";
        cin >> liczba;
        tab2[ i++ ] = liczba;
    } while( i < 3 );
   
}

int losowanie()
{
    int liczba = rand() % 3;
    return liczba;
}
int main()
{
    srand( time( NULL ) );
    int tab2[ 3 ];
    int tab[ 2 ] = { - 1, - 1 };
    int los = 0;
    int i = 0;
    podjaliczbe( tab2 );
   
    i = 0;
    do
    {
        los = losowanie();
        if( czyBylaWylosowana( los, tab2, 2 ) )
        {
            tab[ i++ ] = tab[ los ];
            cout << tab2[ tab[ i ] ] << endl;
           
        }
    } while( i < 2 );
   
   
    return 0;
   
}
[ cpp ]
P-150856
chrust
» 2016-08-14 19:12:36
Nie losujesz liczb które podał użytkownik, tylko losujesz nowe.
Rand jest źle napisany.
Zrobiłem coś takiego:

int losy(int tab[])
{
    return (rand()%3)+0;
}

i

int zbior_liczb[3];
int losowanie = zbior_liczb[losy(zbior_liczb)];

Zapewne nie jest to profesionalne, ale działa :D
P-150857
carlosmay
» 2016-08-14 19:17:30
C/C++
do
{
    los = losowanie();
    if( !czyBylaWylosowana( los, tab, i ) ) {
        tab[ i++ ] = los;
    }
} while( i < 2 );

for( int i = 0; i < 2; ++i ) {
    cout << tab2[ tab[ i ] ] << ' ';
}
cout << '\n';
To jest dość proste, więc tłumaczenie chyba nie jest potrzebne.

@chrust:
return( rand() % 3 ) + 0;
 ==>
return rand() % 3;
Dodanie zera nic nie zmienia w wyniku działania.

edit: edytowałem kod, skopiowałem nie tego for'a.
P-150858
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona