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

C++ - Duży lotek na funkcjach i tablicach

Ostatnio zmodyfikowano 2016-11-28 23:23
Autor Wiadomość
Mashnar
Temat założony przez niniejszego użytkownika
C++ - Duży lotek na funkcjach i tablicach
» 2016-11-27 22:47:49
Mam problem z porównaniem liczb z dwóch tablic ( w tym przypadku z wylosowanymi liczbami przez komputer i tymi wpisanymi przez użytkownika).

Jak mogę napisać aby wypisało mi ile liczb trafiłeś? Probowałem z ifami w funkcji policz lecz coś mi nie działa, tak jakby nie odczytywał w ogole danych z tablic z innych funkcji.

C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

void podaj( int liczby[ 6 ] )
{
   
    cout << "Witaj w kumulacji duzego lotka! " << endl;
    cout << " Na poczatku podaj swoje 6 liczb " << endl;
    for( int i = 0; i <= 5; i++ )
    {
        cin >> liczby[ i ];
    }
   
}
void losuj( int wylos[ 6 ] )
{
   
    time_t t;
    srand(( unsigned ) time( & t ) );
   
   
    cout << "Nastepuje zwolnienie blokady" << endl;
    cout << " Wylosowane dzis liczby TO " << endl;
    for( int i = 0; i <= 5; i++ )
    {
        wylos[ i ] = rand() % 49 + 1;
       
       
    }
    for( int j = 0; j <= 5; j++ )
    {
        cout << wylos[ j ] << ",";
       
    }
}
int policz( int liczby[ 6 ], int wylos[ 6 ] )
{
   
   
    int ilosc = 0;
   
   
    for( int i = 0; i >= 5; i++ )
    {
        if( liczby[ i ] == wylos[ i ] )
             ilosc++;
       
    }
   
    cout << ilosc;
   
}





int main()
{
    int liczby[ 6 ];
    int wylos[ 6 ];
    int traf;
    losuj( wylos );
    podaj( liczby );
    policz( liczby, wylos );
   
   
   
   
    return 0;
}
P-154195
DejaVu
» 2016-11-28 10:49:06
Twój kod jest nieprawidłowy. Wykonujesz losowanie z powtórzeniami, a nie bez powtórzeń.
P-154204
darko202
» 2016-11-28 11:08:20
1.
w  funkcji policz(...) zmień warunek  i >= 5;
na  i <= 5;

2.
poznaj technikę debugowania kodu
np.
ustawiasz breakpoint i od tej linii śledzisz każdy krok kodu
(w tym stan zmiennych - w tej linijce kodu)

http://www.cprogramming.com​/tutorial​/visual_studio_breakpoints.html
http://www.youtube.com/watch​?v=z5gBIizwsY0
P-154205
Anim
» 2016-11-28 12:05:36
Dodatkowo zauważ, że porównujesz czy na konkretnych miejscach są te same liczby, a nie czy w zbiorze liczb wyniki się pokrywają, czyli załózmy ,że wylosowałeś:

1,15,8, 48,20,21,

a następnie podałeś własne liczby:

15 ,1, 48, 8, 21, 20

Zauważ, że trafiłem szóstkę, a mimo to wynik w Twoim kodzie będzie 0 (jak poprawisz to o czym wspomniał @DejaVu i @darko202). Posortuj najpierw wartości w tablicach.
P-154208
Mashnar
Temat założony przez niniejszego użytkownika
» 2016-11-28 19:38:14
Dziękuje za pomoc ale nadal nawet po sortowaniu nie działa  ( sprawdzałem czy funkcja sort działa). Ma ktoś jakiś pomysł?

 
C/C++
#include <iostream>
#include <cstdlib>
#include <time.h>
#include <algorithm>
using namespace std;

void podaj( int liczby[ 6 ] )
{
   
    cout << "Witaj w kumulacji duzego lotka! " << endl;
    cout << " Na poczatku podaj swoje 6 liczb " << endl;
    for( int i = 0; i <= 5; i++ )
    {
        cin >> liczby[ i ];
    }
   
}
void losuj( int wylos[ 6 ] )
{
    int x;
    time_t t;
    srand(( unsigned ) time( & t ) );
   
   
    cout << "Nastepuje zwolnienie blokady" << endl;
    cout << " Wylosowane dzis liczby TO " << endl;
    for( int i = 0; i <= 5; i++ )
    {
        do {
            x = rand() % 49 + 1;
        }
        while(( wylos[ 0 ] == x ) ||( wylos[ 1 ] == x ) ||
        ( wylos[ 2 ] == x ) ||( wylos[ 3 ] == x ) ||( wylos[ 4 ] == x ) ||( wylos[ 5 ] == x ) );
       
        wylos[ i ] = x;
       
       
    }
    for( int j = 0; j <= 5; j++ )
    {
        cout << wylos[ j ] << ",";
       
    }
}
int policz( int liczby[ 6 ], int wylos[ 6 ] )
{
    int ilosc = 0;
    sort( liczby, liczby + 6 );
    sort( wylos, wylos + 6 );
   
   
   
   
    for( int i = 0; i <= 5; i++ )
    {
        if( liczby[ i ] == wylos[ i ] )
             ilosc++;
       
    }
   
    cout << ilosc;
   
}





int main()
{
    int liczby[ 6 ];
    int wylos[ 6 ];
    int traf;
    losuj( wylos );
    podaj( liczby );
    policz( liczby, wylos );
   
   
   
   
    return 0;
}
P-154224
mateczek
» 2016-11-28 22:11:20
przy takim algorytmie sprawdzającym losowanie musisz wyzerować tablice !!!
C/C++
int liczby[ 6 ] { 0 };
int wylos[ 6 ] { 0 };
P-154232
Mashnar
Temat założony przez niniejszego użytkownika
» 2016-11-28 22:31:35
Hmm..ale jak wyzeruje tablice to przecież nie bedzie miala elementów dobrze rozumiem? Ale jeśli tak , to w ktorym miejscu?
P-154233
mateczek
» 2016-11-28 22:50:03
będzie miała wszystkie zera. W obecnej sytuacji masz losowe liczby w tablicach. Tablice zerujesz przy deklaracji,
deklaracja ma wyglądać tak
int liczby[ 6 ] { 0 };
 po prostu dopisz te klamry z zerami do swojej deklaracji!!!

Możesz również zmienić trochę algorytm losowania. I sprawdzać tablicę tylko do jej aktualnego rozmiaru a nie po całości.
C/C++
#include <iostream>
#include <time.h>
using namespace std;

//np funkcja sprawdzająca czy liczba już wcześniej była wylosowana

bool czyByla( int tabl[], int liczba, int actualSize ) {
    for( int i = 0; i < actualSize; i++ ) {
        if( tabl[ i ] == liczba ) return true;
       
    }
    return false;
}
//zmodyfikowana funkcja losująca
void losuj( int wylos[] )
{
    int x; time_t t;
    srand(( unsigned ) time( & t ) );
    cout << "Nastepuje zwolnienie blokady" << endl;
    cout << " Wylosowane dzis liczby TO " << endl;
    for( int i = 0; i <= 5; i++ )
    {
        do {
            x = rand() % 49 + 1;
        }
        while( czyByla( wylos, x, i ) ); //sprawdza od 0 do i-1;
       
        wylos[ i ] = x;
        cout << x << " ";
    }
}
// funkcja policz bez konieczności sortowania tablic
int policz( int liczby[], int wylos[] ) {
    int ilosc = 0;
    for( int i = 0; i <= 5; i++ ) {
        for( int j = 0; j <= 5; j++ ) {
            if( liczby[ i ] == wylos[ j ] ) ilosc++;
           
        }
    }
    return ilosc;
}
P-154234
« 1 » 2
  Strona 1 z 2 Następna strona