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

[Lekcja 21] Zadanie domowe - wyloswanie iczb podanych z klawiatury bez powtórzeń

Ostatnio zmodyfikowano 2015-01-29 19:14
Autor Wiadomość
dzozda
» 2015-01-25 20:35:48
Pozwolicie, że podczepię się pod temat. Udało mi się rozwiązać większość problemów które wyżej opisujecie, ale z jednym nie mogę sobie poradzić. Podczas wczytywania danych z klawiatury (funkcja wczytaj), sprawdzanie czy liczby się nie powtarzają działa bez zarzutu (funkcja sprawdz), natomiast podczas losowania indeksów tablicy (funkcja losuj) ta sama funkcja sprawdz już nie spełnia swoich założeń. Proszę o pomoc, gdzie leży błąd bo ja nie mam pojęcia...

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

void wczytaj( int itab[], int iroz );
bool sprawdz( int liczba, int itab[], int ile );
int losuj( int itab[], int poz );

using namespace std;

int main()
{
    srand( time( NULL ) );
    const int rozmiar = 10;
    int tab[ rozmiar ];
   
    wczytaj( tab, rozmiar );
    losuj( tab, 8 );
   
}

void wczytaj( int itab[], int iroz )
{
    int a, i = 0;
    bool s;
    do
    {
        do
        {
            cout << "Podaj liczbe: " << i << endl;
            cin >> a;
            s = cin.fail();
            cin.clear();
            cin.sync();
        } while( s );
       
        if( sprawdz( a, itab, iroz ) == false )
        {
            itab[ i ] = a;
            i++;
        }
        else
        {
            cout << "Twoja liczba sie powtarza" << endl;
           
        }
    } while( i < iroz );
   
}

int losuj( int itab[], int poz )
{
    int los, i = 0;
    do
    {
        los =(( rand() % poz ) + 0 );
        if( sprawdz( los, itab, poz ) == false )
        {
           
            cout << "wylosowano:" << itab[ los ] << endl;
            i++;
           
        }
    } while( i < poz );
   
}

bool sprawdz( int liczba, int itab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( itab[ i ] == liczba )
             return true;
       
        i++;
    } while( i < ile );
   
    return false;
}

[ / code ][ / i ]
P-125546
darko202
» 2015-01-26 08:53:32
1.
masz nowy problem tworzysz nowy temat

2.
w funkcji losuj masz błędy
* brak return
* złe losowanie (losujesz liczbę 0-poz), a masz wylosować poz razy
* zła logika ( sprawdzasz wylosowaną liczbę (niezależnie od błędu wyżej), ale nie w całej tablicy (tablica 10, a poz = 8)

3. Funkcja wczytaj też błędy
*szukasz w całej tablicy czy podana liczba różna niezależnie ile elementów już wprowadziłeś np. 0 

4. formatowanie tekstu kod w [cpp] [/cpp]
P-125557
dzozda
» 2015-01-26 23:09:26
Ad.1
No właśnie nie mogłem się zdecydować czy zakładać nowy temat, czy się podłączyć...

Ad.2
w funkcji losuj masz błędy
* brak return
* złe losowanie (losujesz liczbę 0-poz), a masz wylosować poz razy
* zła logika ( sprawdzasz wylosowaną liczbę (niezależnie od błędu wyżej), ale nie w całej tablicy (tablica 10, a poz = 8)

OK, to wydaję się być jasne i poprawiłem, ale...

3. Funkcja wczytaj też błędy
*szukasz w całej tablicy czy podana liczba różna niezależnie ile elementów już wprowadziłeś np. 0 
Szczerze to nie widzę, w tym nic złego. OK za pierwszym wczytaniem liczby sprawdzam pustą tablice ale to chyba nie jest duży problem? Ważne, że program spełnia swoje zadanie.

Poniżej kod, program działa zgodnie z założeniami. A przynajmniej tak mi się wydaję:P

Dzięki i pozdro
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void wczytaj( int itab[], int iroz );
bool sprawdz( int liczba, int itab[], int ile );
void losuj( int itab[], int iroz, int poz );

using namespace std;

int main()
{
    srand( time( NULL ) );
    const int rozmiar = 10;
    int tab[ rozmiar ];
   
    wczytaj( tab, rozmiar );
    losuj( tab, rozmiar, 8 );
   
    return 0;
}

void wczytaj( int itab[], int iroz )
{
    int a, i = 0;
    bool s;
    do
    {
        do
        {
            cout << "Podaj liczbe: " << i << endl;
            cin >> a;
            s = cin.fail();
            cin.clear();
            cin.sync();
        } while( s );
       
        if( sprawdz( a, itab, iroz ) == false )
        {
            itab[ i ] = a;
            i++;
        }
        else
        {
            cout << "Twoja liczba sie powtarza" << endl;
           
        }
    } while( i < iroz );
   
}

void losuj( int itab[], int iroz, int poz )
{
    int tablos[ iroz ];
    int los, i = 0;
    do
    {
        los =(( rand() % iroz ) + 0 );
       
        if( sprawdz( los, tablos, iroz ) == false )
        {
            tablos[ i ] = los;
            cout << "wylosowano:" << itab[ los ] << endl;
            i++;
        }
       
    } while( i < poz );
   
}


bool sprawdz( int liczba, int itab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( itab[ i ] == liczba )
             return true;
       
        i++;
    } while( i < ile );
   
    return false;
}

 
P-125587
darko202
» 2015-01-28 21:46:26
1.
>> szukasz w całej tablicy czy podana liczba różna niezależnie ile elementów już wprowadziłeś np. 0 
jakie to rodzi konsekwencje,
W Twoim programie tablica, której używasz nie została zainicjalizowana co oznacza, że zawiera przypadkowe wartości
np. 1,8, 73983,....
jeśli użytkownik poda jedną z takich przypadkowych liczb to program zgłosi że liczba została już wprowadzona.

oczywiście liczb jest dużo , jest małe prawdopodobieństwo itp.
ale faktem jest że program jest błędny.

jeśli nadal nie będziesz się takim czymś  przejmował to kiedyś zdarzy CI się w bardziej skomplikowanym przypadku
a wtedy "adiós héroe" :)


2.
w  void losuj( int itab[], int iroz, int poz )

masz deklarację tablicy
int tablos[ iroz ];


kompilator (Visual Studio 2010) zgłosił w związku z nią następujące błędy

Error 2 error C2057: expected constant expression C:\Users\ola\Desktop\test1\test1\test1.cpp 55 1 test1
Error 3 error C2466: cannot allocate an array of constant size 0 C:\Users\ola\Desktop\test1\test1\test1.cpp 55 1 test1
Error 4 error C2133: 'tablos' : unknown size C:\Users\ola\Desktop\test1\test1\test1.cpp 55 1 test1
dlaczego ?
deklarujesz tablicę statyczną
w domyśle w ten sposób próbujesz zadeklarować tablicę dynamiczną   
a jak się taką tablicę deklaruje poprawnie ?
sprawdzam na
http://tutorialeit.pl​/tutoriale/cpp​/tworzenie-tablic-dynamicznych​/32/
Tablica dynamiczna jednowymiarowa w C++ tworzona jest w sposób następujący:
int *tablica = new int[n];
 
3.
masz nowy problem tworzysz nowy temat
- sprawdź regulamin forum - takie tematy lądują do kosza



P-125690
dzozda
» 2015-01-29 19:14:40
Ad 1
W Twoim programie tablica, której używasz nie została zainicjalizowana co oznacza, że zawiera przypadkowe wartości...

No racja, nie dostrzegłem tak oczywistej rzeczy wcześniej... Czyli muszę najpierw wczytać wszystkie liczby podane przez użytkownika do tablicy a dopiero później sprawdzać czy się jakaś nie powtarza? Jeżeli tak to trochę słabo, bo program dopuszczałby wpisanie 10 takich samych cyfr i dopiero na końcu by poinformował, że liczby się powtarzają...  no chyba, że funkcja sprawdź, sprawdzałaby tylko elementy wpisane a całą resztę pomijała... ale jeszcze nie wiem jak to zrobić:P

Ad 2
Rozumiem, że kompilator nie zna wielkości tablicy i dlatego się czepia? (pisze w DEVie i nie mam błędów), czyli jak wpisze:

int tablos[ 8 ];

To będzie ok?
P-125748
1 « 2 »
Poprzednia strona Strona 2 z 2