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

[Lekcja - 21] Analiza przykładu oraz zadanie domowe

Ostatnio zmodyfikowano 2012-07-18 17:30
Autor Wiadomość
pendrakk14
Temat założony przez niniejszego użytkownika
[Lekcja - 21] Analiza przykładu oraz zadanie domowe
» 2012-07-17 14:00:28
Mam problem z jedna linijka w poniższym przykładzie:

#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;
       
        i++;
    } 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 )
        {
            wylosowane[ wylosowanych ] = liczba;
            wylosowanych++;
        } //if
    } while( wylosowanych < 5 );
   
    wylosowanych = 0;
    do
    {
        std::cout << wylosowane[ wylosowanych ] << std::endl;
        wylosowanych++;
    } while( wylosowanych < 5 );
   
    return 0;
}







konkretnie chodzi o "if( ile <= 0 )" w funkcji czyBylaWylosowana, kiedy zmienna ile przyjmuje wartosci mniejsze od zera? przeciez nie moze byc ujemna ilosc liczb wylosowanych?
P-60334
kubawal
» 2012-07-17 14:06:14
Jeśli miała by to być funkcja, która używa się w wielu programach, to owszem - sprawdzenie argumentów.
Ale w tym kontekście? Równie dobrze mogło by jej tam nie być!
P-60336
pendrakk14
Temat założony przez niniejszego użytkownika
» 2012-07-17 14:16:52
a ja się dwa dni głowiłem do czego ta linijka ;p po prostu wole do wszystkiego dojsc sam ale jak widac nie zawsze to wychodzi na dobre ;p

btw, przydałoby się usunąć/skomentowac jakos te linijke w kursie
P-60338
xevuel
» 2012-07-17 14:40:23
Wbrew pozorom nie jest to bezsensowna linijka, więc nie trzeba w kursie nic zmieniać. Po pierwsze, należy zawsze filtrować dane wejściowe, a po drugie takie sprawdzenie argumentów może nieznacznie przyspieszyć działanie programu.
P-60347
pendrakk14
Temat założony przez niniejszego użytkownika
» 2012-07-17 19:30:53
proszę o sprawdzenie pierwszego zadania domowego


1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void wczytanie_liczb( int tab[], int iRozmiar )
{
    int i = 0;
    do
    {
        cout << "Podaj liczbe: ";
        cin >> tab[ i ];
        ++i;
    }
    while( i < iRozmiar );
   
}

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

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

int main()
{
    srand( time( 0 ) );
    int tablica[ 3 ];
    int wylosowane[ 2 ];
    wczytanie_liczb( tablica, 3 );
    int wylosowanych = 0;
    int licznik = 0;
    do
    {
        int indeks_tab = wylosuj();
        if( czyBylaWylosowana( indeks_tab, wylosowane, wylosowanych ) == false )
        {
            wylosowane[ licznik ] = tablica[ indeks_tab ];
            ++licznik;
        }
    }
    while( licznik < 2 );
   
    licznik = 0;
    do
    {
        cout << wylosowane[ licznik ] << endl;
        ++licznik;
    }
    while( licznik < 2 );
   
    return 0;
}

chyba mam cos zle bo liczby czasem sie powtarzaja przy losowaniu
P-60400
diego997
» 2012-07-17 21:22:25
Zauważ, że za każdym razem losujesz liczby od 0 do 2, następnie ktoras z tych liczb wysylasz do czyByłaWylosowan. I tak się dzieje za każdym razem. Program działa tylko w przypadku podania na początku liczb 0,1,2
P-60418
pendrakk14
Temat założony przez niniejszego użytkownika
» 2012-07-18 12:50:56
mógłbyś trochę rozwinąć wskazówke? masz racje sprawdziłem w kilkudziesieciu próbach dla liczb 0,1,2 i nie powtorzyły sie ani razu

sprawdzam tylko liczby 0,1,2 bo to indeksy elementow tablic za ktorymi kryja sie podane liczby i jesli one sie nie powtarzaja to liczby tez nie powinny sie powtarzac jednak tak sie nie dzieje

prosze o wskazówke
P-60458
Sungrazer
» 2012-07-18 17:10:13
Błąd jest tylko w tym miejscu, w funkcji czyBylaWylosowana:
if( tab[ i ] == iLiczba )
. W tej chwili działa to w taki sposób, że sprawdzasz czy wartość z tablicy wylosowanych jest równa wartości wylosowanego indeksu (0, 1 lub 2). Prawidłowo powinno wyglądać to tak:
if( tab[ i ] == tablica[ iLiczba ] )
. Druga tablica to ta, w której masz zapisane 3 liczby podane przez użytkownika. Oczywiście musisz przesłać ją wcześniej do funkcji sprawdzającej. Chyba wszystko jasne?
Swoją drogą, mógłbyś dla ułatwienia nadawać argumentom funkcji te same nazwy, jakie mają zmienne, które tam przekazujesz:P
P-60482
« 1 » 2
  Strona 1 z 2 Następna strona