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

Rozdział 22, ćwiczenie 3 - próba dodania funkcji bool uniemożliwiającej powtórne wylosowanie tej samej liczby

Ostatnio zmodyfikowano 2017-01-28 22:28
Autor Wiadomość
bobby.hl
Temat założony przez niniejszego użytkownika
Rozdział 22, ćwiczenie 3 - próba dodania funkcji bool uniemożliwiającej powtórne wylosowanie tej samej liczby
» 2017-01-28 18:46:56
hej, dodałem do tego zadania funkcję bool, która ma uniemożliwić dodanie do tablicy drugi raz tej samej liczby, na wzór poprzedniego rozdziału, ale niestety nie działa.
próbowałem na różne sposoby ale nic z tego. trzeba dodac dodatkową tablicę or sth? Możecie pomóc?

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

using namespace std;

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


int wylosuj( int tab[], int ile )
{
    for( int i = 0; i < ile; i++ )
         tab[ i ] =( rand() %( 30 - 10 + 1 ) ) + 10;
   
}

void wypiszTablice( int tab[], int ile )
{
    for( int i = 0; i < ile; i++ )
         cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl;
   
}

void wypiszTabliceOdTylu( int tab[] )
{
    for( int i = 9; i > - 1; i-- )
         cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl;
   
   
}

int znajdzMIN( int tab[], int ile )
{
    int liczba = tab[ 0 ];
    for( int i = 1; i < ile; i++ )
    if( liczba > tab[ i ] )
         liczba = tab[ i ];
   
    return liczba;
}

int znajdzMAX( int tab[], int ile )
{
    int liczba = tab[ 0 ];
    for( int i = 1; i < ile; i++ )
    if( liczba < tab[ i ] )
         liczba = tab[ i ];
   
    return liczba;
}
wypiszMinMax( int iMIN, int iMAX )
{
    cout << "Najmniejsza liczba to: " << iMIN << endl;
    cout << "Największa liczba to: " << iMAX << endl;
}
int main()
{
    srand( time( 0 ) );
    int tablica[ 10 ];
    int i = 0;
    do
    {
        int liczba = wylosuj( tablica, 10 );
        if( czyByla( liczba, tablica, i ) == false )
             tablica[ i ] = liczba;
       
        i++;
    } while( i < 10 );
   
    wypiszTablice( tablica, 10 );
    cout << endl;
    wypiszTabliceOdTylu( tablica );
    cout << endl;
    int iMIN = znajdzMIN( tablica, 10 );
    int iMAX = znajdzMAX( tablica, 10 );
    wypiszMinMax( iMIN, iMAX );
   
   
    return 0;
}

EDIT:

C/C++
do
{
    if( tab[ licznik ] == i );
   
    {
        return true;
        i++;
    }

ten błąd już znalazłem, zmieniłem na
licznik++
ale nadal nie dziala
P-157069
mateczek
» 2017-01-28 21:04:53
Uważaj gdzie stawiasz średniki
C/C++
if( tab[ licznik ] == i ); //średnik koniec waruku

{
    //to wykonuje się zawsze
}


tutaj po poprawkach :

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

using namespace std;

bool czyByla( int liczba, int tab[], int ile ) //tutaj sprawdzenie czy liczba znajduje się w tablicy
{
    for( int i = 0; i < ile; i++ ) {
        if( tab[ i ] == liczba ) return true;
       
    }
    return false;
}


int wylosuj() // tutaj funkcja była lekko bezsensu
{
    return( rand() %( 30 - 10 + 1 ) ) + 10;
   
}

void wypiszTablice( int tab[], int ile )
{
    for( int i = 0; i < ile; i++ )
         cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl;
   
}

void wypiszTabliceOdTylu( int tab[] )
{
    for( int i = 9; i > - 1; i-- )
         cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl;
   
   
}

int znajdzMIN( int tab[], int ile )
{
    int liczba = tab[ 0 ];
    for( int i = 1; i < ile; i++ )
    if( liczba > tab[ i ] )
         liczba = tab[ i ];
   
    return liczba;
}

int znajdzMAX( int tab[], int ile )
{
    int liczba = tab[ 0 ];
    for( int i = 1; i < ile; i++ )
    if( liczba < tab[ i ] )
         liczba = tab[ i ];
   
    return liczba;
}
wypiszMinMax( int iMIN, int iMAX )
{
    cout << "Najmniejsza liczba to: " << iMIN << endl;
    cout << "Największa liczba to: " << iMAX << endl;
}
int main()
{
    srand( time( 0 ) );
    int tablica[ 10 ];
    int i = 0;
    do
    {
        int liczba = wylosuj(); //normalnie wylosuj liczbę
        if( czyByla( liczba, tablica, i ) == false )
             tablica[ i++ ] = liczba;
       
    } while( i < 10 );
   
    wypiszTablice( tablica, 10 );
    cout << endl;
    wypiszTabliceOdTylu( tablica );
    cout << endl;
    int iMIN = znajdzMIN( tablica, 10 );
    int iMAX = znajdzMAX( tablica, 10 );
    wypiszMinMax( iMIN, iMAX );
   
   
    return 0;
}
P-157075
bobby.hl
Temat założony przez niniejszego użytkownika
Dzięki :)
» 2017-01-28 21:42:28
@mateczek o super, dzięki wielkie, właśnie takiej odpowiedzi oczekiwałem :)
czyli problem tkwił w funkcji losuj, bo nawet jak nie zmieniłem czyByla to działa teraz poprawnie
ciekawe czemu pętla
for
 w int main nie sprawdza się w przypadku używania czyByla, a
do...while
 działa jak należy?

jeszcze jedno pytanie:

zapis
C/C++
if( czyByla( liczba, tablica, i ) == false )
{
    tablica[ i ] = liczba;
    i++;
}

jest równoważny do zapisu?
C/C++
if( czyByla( liczba, tablica, i ) == false )
     tablica[ i++ ] = liczba;

P-157079
mateczek
» 2017-01-28 21:55:44
nawet jak nie zmieniłem czyByla to działa teraz poprawnie
W funkcji "czyByła" jest, źle średnik i namieszane ze zmiennymi; Jeśli to poprawiłeś to ok.

poprawione mniej więcej tak:
C/C++
bool czyByla( int i, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == i ) //; //średnik do usunięcia
        {
            return true;
            //i++; //do usunięcia
        }
        licznik++; //inkremenetacja za klamrami nie w klamrach
    } while( licznik < ile ); //i pomylone z licznik
   
    return false;
}


Ad2. tak te zapisy są równoważne Ale muszą być te klamry{}. W kodzie u góry brak klamer, Więc z rozpędu dodałem inkrementacje przy zapisie do tablicy.
P-157080
bobby.hl
Temat założony przez niniejszego użytkownika
» 2017-01-28 22:28:22
dokładnie, u mnie jedyna różnica to to, że nie mam w ogóle klamer w miejscu gdzie funkcja zwraca
true
może tak być? chyba tak, bo po
if
 jest tylko jedna komenda, zgadza się?
generalnie Twój zapis jest znacznie krótszy i bardziej przejrzysty dzięki
for
ten średnik, który postawiłem po if powodował, że funkcja nigdy by nie zwróciła
true
 ?


C/C++
bool czyByla( int i, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == i )
             return true;
       
        licznik++;
       
    } while( licznik < ile );
   
    return false;
}
P-157083
« 1 »
  Strona 1 z 1