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

[C++]Problem z porównywaniem tablic

Ostatnio zmodyfikowano 2016-10-28 23:27
Autor Wiadomość
TheEhe
Temat założony przez niniejszego użytkownika
[C++]Problem z porównywaniem tablic
» 2015-12-23 21:17:07
Witam ostatnio rozpocząłem swoją przygodę z C++. Postanowiłem napisać program "Totolotek" który po wpisaniu 6 liczb zapisanych w tablicy ma porównywać je z tymi wylosowanymi przez komputer. Jeżeli są takie same pogratulować wygranej jeśli nie ma losować dalej. Podczas uruchamiana programu nie potrafię zrozumieć na jakiej zasadzie porównuje on te tablice. Proszę o pomoc w sprawie dokładnego porównywania przedstawionych tablic.


Oto cały kod programu:
C/C++
#include <iostream>
#include <windows.h>
#include <time.h>

using namespace std;

int strzaly[ 5 ], totolotek[ 5 ], liczba_prob = 1, totek;

int main()
{
    srand( time( NULL ) );
   
    cout << "Witaj w Totolotku!" << endl;
    cout << "Witaj w Totolotku! Podaj swoje 6 strzalow (Od 1 do 49): " << endl;
    //cout << "Wpisz ile razy chcesz wyswietlic lotka: " << endl;
    //cin >> totek;
   
    for( int i = 0; i <= 5; i++ )
    {
        cout << "Strzal " << i + 1 << " :";
        cin >> strzaly[ i ];
    }
    /*for(int i=1;i<=totek;i++){
                                                for(int i=0;i<=5;i++)
                                               {
                                                totolotek[i] = rand()%49+1;
                                                }
                                                cout <<totolotek[0]<<", "<<totolotek[1]<<", "<<totolotek[2]<<", "<<totolotek[3]<<", "<<totolotek[4]<<", "<<totolotek[5]<<", "<<endl;
                                                }*/
    while( strzaly[ 5 ] != totolotek[ 5 ] )
    {
       
        liczba_prob++;
       
        for( int i = 0; i <= 5; i++ )
        {
            totolotek[ i ] = rand() % 49 + 1;
        }
       
       
       
        if( strzaly[ 5 ] == totolotek[ 5 ] )
        {
            cout << "Udalo ci sie wygrac za " << liczba_prob << " proba.";
        }
        cout << "Wylosowane: " << totolotek[ 0 ] << ", " << totolotek[ 1 ] << ", " << totolotek[ 2 ] << ", " << totolotek[ 3 ] << ", " << totolotek[ 4 ] << ", " << totolotek[ 5 ] << " Twoje strzaly: " << strzaly[ 0 ] << ", " << strzaly[ 1 ] << ", " << strzaly[ 2 ] << ", " << strzaly[ 3 ] << ", " << strzaly[ 4 ] << ", " << strzaly[ 5 ] << endl;
    }
   
   
   
    return 0;
}
P-142281
carlosmay
» 2015-12-23 21:33:44
C/C++
strzaly[ 5 ] == totolotek[ 5 ]
 
 tak sprawdzasz tylko szóste liczby w tablicach.
Musisz zrobić to na piechotę, w pętli.
Posortuj to co podał użytkownik, oraz to co wylosował komputer.
Następnie sprawdzasz po kolei, obie tablice indeksami.

C/C++
strzaly[ 5 ] != totolotek[ 5 ]
 
 a pętla while zakończy swoje działanie jeśli ostatnie elementy tablicy będą równe,
niezależnie od pozostałych elementów.
P-142283
TheEhe
Temat założony przez niniejszego użytkownika
» 2016-10-28 14:39:01
Wznowiłem prace na totolotkiem popracowałem troszkę nad algorytmem sprawdzającym czy liczby w tablicach są takie same nie zależnie od ich kolejności. Niestety utknąłem w martwym punkcie. Proszę was o jakieś wskazówki co robię źle ?

Oto kod programu:
C/C++
#include <iostream>
#include <windows.h>
#include <time.h>

using namespace std;

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

bool sprawdzanie( int strzaly[], int wylosowane[] )
{
   
    int ile = 0;
    for( int j = 0; j <= 1; j++ )
    {
        cout << endl;
        for( int i = 0; i <= 1; i++ )
        {
            if( strzaly[ j ] == wylosowane[ i ] )
            {
                ile++;
            }
        }
    }
   
    cout << endl << "Liczby powtarzajace sie: " << ile << endl;
    if( ile == 2 )
    {
        return true;
    }
    else return false;
   
}

int wylosuj()
{
    return( rand() % 3 ) + 1;
}


int main()
{
    srand( time( NULL ) );
   
    cout << "Witaj w TOTOLOTKU!" << endl;
    int strzaly[ 3 ];
    cout << "Podaj swoje 2 nie powtarzajacych sie strzalow (Od 1 do 49): " << endl;
    cin >> strzaly[ 0 ] >> strzaly[ 1 ] /*>>strzaly[2]>>strzaly[3]>>strzaly[4]>>strzaly[5]*/;
   
   
   
    int wylosowane[ 2 ];
    int wylosowanych = 0;
   
   
    do
    {
        int liczba = wylosuj();
        if( BylaWylosowana( liczba, wylosowane, wylosowanych ) == false )
        {
            wylosowane[ wylosowanych ] = liczba;
            wylosowanych++;
        }
    }
    while( wylosowanych <= 2 );
   
    cout << "Wylosowane: " << wylosowane[ 0 ] << " " << wylosowane[ 1 ];
   
    wylosowanych = 0;
    sprawdzanie( strzaly, wylosowane );
   
   
   
   
   
    return 0;
}
P-153009
mateczek
» 2016-10-28 19:39:51
zobacz takie podejście. po wylosowaniu usuwasz wylosowaną z puli
C/C++
#include <iostream>
#include<ctime>
#include<vector>
using namespace std;
int main() {
    srand( time( 0 ) );
    vector < int > pula;
    vector < int > wylosowane;
    for( int i = 1; i <= 49; i++ ) pula.push_back( i ); //pula liczb od 1 do 49
   
    for( int i = 0; i < 6; i++ ) {
        int index = rand() % pula.size(); //losuje z puli
        wylosowane.push_back( pula[ index ] ); //odkładam na bok wylosowaną
        pula.erase( pula.begin() + index ); //usówam z puli wylosowaną
    }
    for( int los: wylosowane ) cout << los << " ";
   
}
P-153012
karambaHZP
» 2016-10-28 19:46:40
Najprościej użyć std::set<>. Losujesz póki rozmiar kontenera mniejszy od 6.
P-153013
TheEhe
Temat założony przez niniejszego użytkownika
» 2016-10-28 21:40:34
Zmieniłem zakres liczb i napisałem co dzieje się po kolei. Jednak dla zmiennej sterującej J (funkcji sprawdzającej czy liczby w tablicach są takie same) szufladka w tablicy o numerze J pokazuje złą liczbe znajdującą się w tej tablicy. Wklejam kod + ss. Nie wiem dla czego tak się dzieje. Podaje link do wyniku działania programu: https://drive.google.com/open?id=0Bziwvf3Wg3nuZ3RCUGxrdkR0RHM


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

using namespace std;

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

int main()
{
    srand( time( NULL ) );
   
    cout << "Witaj w TOTOLOTKU!" << endl;
    cout << "Podaj swoje 3 nie powtarzajace sie strzaly (Od 1 do 4): " << endl;
    int strzaly[ 3 ];
    cin >> strzaly[ 0 ] >> strzaly[ 1 ] >> strzaly[ 2 ];
    cout << "Strzaly podane: " << strzaly[ 0 ] << " " << strzaly[ 1 ] << " " << strzaly[ 2 ] << endl;
   
   
    int wylosowane[ 3 ];
    int wylosowanych = 0;
   
    do
    {
        int liczba = rand() % 4 + 1;
        if( BylaWylosowana( liczba, wylosowane, wylosowanych ) == false )
        {
            wylosowane[ wylosowanych ] = liczba;
            wylosowanych++;
        }
    }
    while( wylosowanych <= 3 );
   
    cout << "Wylosowane: " << wylosowane[ 0 ] << " " << wylosowane[ 1 ] << " " << wylosowane[ 2 ] << endl;
   
    int ile = 0;
    for( int j = 0; j <= 2; j++ )
    {
        cout << endl;
        for( int i = 0; i <= 2; i++ )
        {
            cout << "J:  " << j << endl;
            if( strzaly[ j ] == wylosowane[ i ] )
            {
                ile++;
            }
            cout << "Strzaly: " << strzaly[ j ] << endl;
            cout << "wylosowane: " << wylosowane[ i ] << endl;
            cout << "Ile: " << ile << endl;
        }
    }
   
    cout << "Liczby powtarzajace sie: " << ile << endl;
    if( ile == 3 )
    {
        return true;
    }
    else return false;
   
   
    return 0;
}
P-153014
karambaHZP
» 2016-10-28 21:53:23
C/C++
#include <windows.h>
#include <time.h>
zamień na
C/C++
#include <cstdlib> // nie potrzebujesz całego <windows.h>
#include <ctime> // w końcu to c++

Kod podziel na więcej funkcji:
  • Funkcję wczytującą liczby od użytkownika.
  • Funkcję losującą liczby do drugiej tablicy.
  • Funkcję sprawdzającą czy dana liczba znajduje się w tablicy.
  • W main możesz zostawić pętlę, w której będziesz sprawdzać po kolei liczby wprowadzone przez użytkownika z tablicą wylosowanych i jeśli liczba w niej jest to ją wypisujesz. [pkt]
P-153015
TheEhe
Temat założony przez niniejszego użytkownika
» 2016-10-28 22:59:19
Okej wszystko rozumiem tylko zerknij na screna którego załączyłem pod linkiem i wyjaśnij w miarę możliwości jak to się stało.

https://drive.google.com/open?id=0Bziwvf3Wg3nuZ3RCUGxrdkR0RHM
P-153017
« 1 » 2
  Strona 1 z 2 Następna strona