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

[Lekcja 21] Porównanie zminnej do danych z całej tablicy

Ostatnio zmodyfikowano 2013-03-23 14:22
Autor Wiadomość
renegat2x
Temat założony przez niniejszego użytkownika
[Lekcja 21] Porównanie zminnej do danych z całej tablicy
» 2013-03-21 16:04:16
Witam.
Mój problem polega na tym że nie bardzo wiem jak porównać wylosowaną liczbę do wszystkich liczb z tablicy.
Poniżej przykład z lekcji rozwiązany na mój sposób:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    srand( time( NULL ) );
    int i = 0;
    int los;
    int lp = 1;
    int t[ i ];
    do
    {
        los =(( rand() % 10 ) + 1 );
        if( los != t[ i - 1 ] )
        if( los != t[ i - 2 ] )
        if( los != t[ i - 3 ] )
        if( los != t[ i - 4 ] )
        if( los != t[ i - 5 ] )
        {
            t[ i ] = los;
            std::cout << lp << " Wylosowane liczby " << t[ i ] << std::endl;
            lp++;
            i++;
        }
        else( t[ i ] = 0 );
       
    } while( i < 5 );
   
   
    return 0;
}
Zadanie działa i losuje różne liczby ale zapis z 5 ifami nie sprawdzi się jak będę miał więcej liczb do zapisania w tablicy.
Zamierzam napisać ten program na funkcjach ale jeszcze nie do końca rozumiem rozwiązanie przykładu na lekcji i nadal pozostaje problem jak porównać wylosowaną liczbę do całej tablicy a nie tylko do danego elementu tablicy.
Proszę o wyjaśnienie jeśli jest to możliwe.
P-79013
pekfos
» 2013-03-21 16:14:32
porównać wylosowaną liczbę do wszystkich liczb z tablicy.
Przy losowaniu bez powtórzeń nie musisz porównywać ze wszystkimi.
wylosowałeś element 0 - nic nie sprawdzasz
wylosowałeś element 1 - sprawdzasz element 0
wylosowałeś element 2 - sprawdzasz elementy 0 i 1
wylosowałeś element n - sprawdzasz elementy od 0 do n
itd.. Po takim rozpisaniu od razu przychodzi na myśl pętla tego typu:
C/C++
for( int x = 0; x < aktualny; ++x )
P-79017
renegat2x
Temat założony przez niniejszego użytkownika
» 2013-03-23 13:00:42
Dzięki za odpowiedź. Niestety do tej lekcji jeszcze nie było omawianej pętli for :(. Ale analizując to co napisałeś zrozumiałem sens przykładu na lekcji:

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

bool czyBylaWylosowana( int iLiczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tab[ i ] == iLiczba )
             return true; //przerywa funkcję zwracając prawdę
       
        i++; /* 'i' się zwiększa tylko wtedy gdy iLiczba jest różna od danego miejsca w tablicy. Jeśli nie jest różna to zwracany jest fałsz i możliwe jest wpisanie liczby do tablicy. Max wartość 'i' jest zależna od ilości wprowadzonych już liczb do tablicy i na początku to będzie 0 */
    } while( i < ile );
   
    return false;
}

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

int main()
{
    srand( time( 0 ) );
    int wylosowane[ 5 ];
    int wylosowanych = 0;
    do
    {
        int liczba = wylosuj();
        if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) /*tutaj jest ustalane które miejsce w tablicy jest wprowadzane*/
        {
            wylosowane[ wylosowanych ] = liczba;
            wylosowanych++;
        } //if
    } while( wylosowanych < 5 );
   
    wylosowanych = 0;
    do
    {
        std::cout << wylosowane[ wylosowanych ] << std::endl;
        wylosowanych++;
    } while( wylosowanych < 5 );
   
    return 0;
}
Problemem było to że szukałem porównania losowanej liczby do całej tablicy.
A tutaj podane jest, jeśli dobrze zrozumiałem, że liczba jest porównywana z wartościami wpisanymi do tablicy. Wykorzystano do tego funkcje z jedną pętla do...while - jeśli tam nigdzie nie było liczby zwraca tylko wynik false=nie ma takiej liczby (ważne nie wpisuje jej do tablicy) a następnie druga pętla w ciele programu po otrzymaniu komunikatu false dodaje tą liczbę do tablicy.

A ja próbowałem to wszystko zrobić w jednej pętli nie bardzo wiedząc jak zagnieździć pętle w pętli żeby nawzajem do siebie wracały i były od siebie zależne - problemy były z iteracją miejsca w tablicy.
Może troszkę namotałem swoją wypowiedź :(. Mam nadzieję że na kodzie komentarze lepiej wyjaśniają moje zrozumienie problemu. Na chwile obecną nie wiem jak to można prościej ująć. Wiem że dla doświadczonego programisty to wszystko jest jasne ale jeśli dobrze zrozumiałem i zapisałem swoje rozumowanie to może się to przyda kolejnym osobą mającym problem w zrozumieniu zagadnienia :)


Poniżej moje wypociny bez zastosowania funkcji:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    srand( time( NULL ) );
    int i = 0;
    int los;
    int lp = 1;
    int t[ 5 ];
    int ile = 0;
    bool spr = true;
    do
    {
        los =(( rand() % 10 ) + 1 );
        std::cout << "losowana liczba " << los << std::endl; //sprawdzanie losowanych wartoœci
       
       
        {
            i = 0;
           
            do
            {
               
                if( ile == 0 )
                     spr = false;
               
                else
                {
                   
                    if( t[ i ] == los )
                    {
                       
                        spr = true;
                        std::cout << "Porownuje miejsce " << i << " w tablicy ktore ma wartosc " << t[ i ] << " do wylosowanej liczby = " << los << " true" << std::endl;
                        std::cout << "wartosc juz jest w tablicy" << std::endl;
                        los =(( rand() % 10 ) + 1 );
                        std::cout << "nowa liczba to " << los << std::endl;
                        i = 0;
                    }
                   
                    else
                    {
                        std::cout << "Porownuje miejsce " << i << " w tablicy o wartosci " << t[ i ] << " do wylosowanej liczby = " << los << " false" << std::endl;
                        spr = false;
                        i++;
                    }
                }
               
               
            } while( i < ile );
           
        }
       
        std::cout << "Jakie jest obecnie miejsce w tablicy " << i << std::endl;
       
        if( spr == false )
        {
            std::cout << "Dla miejsca " << i << " w tablicy wpisywana jest liczba " << los << " poniewaz spr=false " << std::endl; //spr co jest wpisywane do tablicy
            t[ i ] = los;
            ile++;
        }
       
    } while( ile < 5 );
   
    i = 0;
    lp = 1;
    do
    {
        std::cout << lp << " Wylosowane liczby wpisane do tablicy " << t[ i ] << std::endl; //wyswietlenie wartosci z tablicy
        lp++;
        i++;
    } while( lp < 6 );
   
    return 0;
}

Zastosowałem takie rozwiązanie (bez funkcji) w celu lepszego zrozumienia problemu losowania bez powtórzeń. Troszkę to trwało :( aż program właściwie zaczął działać :). Musiałem sobie ustawić wypisywanie danej operacji na ekran w celu znalezienia problemów.

Wynika z tego jasno jak przydatne są funkcje i jak ważne jest rozumienie ich zastosowań.

Wielkie dzięki za pomoc @pekfos czasami oczywiste sprawy są trudne do zauważenia :)

Mam jeszcze jedno pytanie czy zapis funkcji
srand( time( NULL ) )
 jest tym samym co
srand( time( 0 ) )
?
W moim rozumowaniu NULL=0 a w przykładzie na lekcji jest podane 0 i nie wiem czy to tylko inny zapis tego samego czy jakaś inna wartość.
P-79205
pekfos
» 2013-03-23 14:02:20
Można przyjąć, że NULL to 0.
P-79208
renegat2x
Temat założony przez niniejszego użytkownika
» 2013-03-23 14:22:03
Wnioskuję z wypowiedzi że dobrze zrozumiałem zagadnienie :) Skoro nie było zastrzeżeń.
Jeszcze raz wielkie dzięki za zainteresowanie problemem i pomoc w obu pytaniach. Zamykam temat.
P-79211
« 1 »
  Strona 1 z 1