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

Lekcja 21 - zadanie domowe

Ostatnio zmodyfikowano 2015-07-24 11:36
Autor Wiadomość
krzyweldi
Temat założony przez niniejszego użytkownika
Lekcja 21 - zadanie domowe
» 2015-07-23 22:43:52
Witam, mam problem z zadaniem nr 1 z lekcji 21 tj.: "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."
Zdołałem napisać coś takiego, kompilator nic nie pokazuje a jednak coś nie działa. Liczę na jakieś wskazówki :)

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void wczytanie( int liczba[], int liczebnik )
{
    do
    {
        cout << "Podaj " << liczebnik + 1 << " liczbe: ";
        cin >> liczba[ liczebnik ];
        liczebnik++;
    } while( liczebnik < 3 );
   
}

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

int czyByla( int tymczasowa, int liczba[], int wylosowano )
{
    if( wylosowano <= 0 )
         return false;
   
    int i;
    do
    {
        if( tymczasowa == liczba[ i ] )
             return true;
       
        i++;
    } while( i < 2 );
   
    return false;
}

int main()
{
    srand( time( 0 ) );
    int liczba[ 3 ];
    int liczebnik = 0;
    int wylosowana[ 2 ];
    int wylosowano = 0;
   
    wczytanie( liczba, liczebnik );
   
    int tymczasowa = liczba[ losuj() ];
    do
    {
        if( czyByla( tymczasowa, liczba, wylosowano ) == false )
        {
            tymczasowa = wylosowana[ liczebnik ];
            liczebnik++;
        }
    } while( liczebnik < 2 );
   
    liczebnik = 0;
    do
    {
        cout << wylosowana[ liczebnik ] << endl;
        liczebnik++;
    } while( liczebnik < 2 );
   
    return 0;
}
P-135119
pekfos
» 2015-07-23 22:54:05
Liczbę losujesz raz. Przed pętlą.

C/C++
int tymczasowa = liczba[ losuj() ];
A co, jeśli user poda 3 takie same liczby? Wylosujesz jedną i nie będziesz w stanie wylosować innej, bo są takie same. Nie losuj liczb usera, tylko indeksy liczb usera - te są unikatowe. Potem tylko wyświetlisz liczby o wylosowanych numerach. Jesteś kolejną osobą, która rozwiązując zadanie idzie w stronę dosłownej implementacji. Masz uzyskać bardzo konkretny efekt, a nie napisać bardzo konkretny kod.
P-135120
krzyweldi
Temat założony przez niniejszego użytkownika
» 2015-07-23 23:05:49
Czyli losowanie powinno odbyć się przez coś takiego?
C/C++
tymczasowa = wylosuj( liczba ); //wywolanie funkcji

int wylosuj( int tab[ 3 ] )
{
    return tab[ rand() % 3 ];
} // funkcja
P-135121
pekfos
» 2015-07-23 23:12:05
Nie. Funkcja losuj() jest dobra, tylko w złym miejscu i w zły sposób użyta.
P-135122
krzyweldi
Temat założony przez niniejszego użytkownika
» 2015-07-23 23:19:12
Rozumiem, że w złym miejscu, już poprawiłem. Jutro się zabiorę jeszcze raz za to zadanie bo dzisiaj 2 razy próbowałem i nic z tego :D
edit: chyba zajarzyłem :)
P-135123
krzyweldi
Temat założony przez niniejszego użytkownika
» 2015-07-24 10:21:55
Myślałem, poprawiałem, sprawdzałem i jak już myślałem, że wymyśliłem to okazało się, że się myliłem..
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void wczytanie( int liczba[], int liczebnik )
{
    do
    {
        cin.clear();
        cin.sync();
        cout << "Podaj " << liczebnik + 1 << " liczbe: ";
        cin >> liczba[ liczebnik ];
        liczebnik++;
    } while( liczebnik < 3 );
   
}

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

bool czyByla( int tymczasowa, int wylosowana[], int wylosowano )
{
    if( wylosowano <= 0 )
         return false;
   
    int i;
    do
    {
        if( tymczasowa == wylosowana[ i ] )
             return true;
       
        i++;
    } while( i < 2 );
   
    return false;
}

int main()
{
    srand( time( NULL ) );
    int liczba[ 3 ];
    int wylosowana[ 2 ];
    int liczebnik = 0;
    int wylosowano = 0;
   
    wczytanie( liczba, liczebnik );
   
    do
    {
        int tymczasowa = losuj();
        if( czyByla( tymczasowa, wylosowana, wylosowano ) == false )
        {
            wylosowana[ wylosowano ] = tymczasowa;
           
            wylosowano++;
        }
    } while( wylosowano > 2 );
   
    int x = 0;
   
    do
    {
        cout << liczba[ wylosowana[ x ] ] << endl;
        x++;
    } while( x < 2 );
   
    return 0;
}

Wczytuje ładnie 3 liczby, losuje pierwszą, wypisuje ją ale zamiast wypisać drugą to wywala program :/
P-135124
xKTN
» 2015-07-24 11:26:41
W funkcji
bool czyByla
masz
C/C++
int i;
do
{
    if( tymczasowa == wylosowana[ i ] )
         return true;
   
    i++;
} while( i < 2 );

czyli utworzyłeś zmienną i, którą potem inkrementujesz, mimo że nie ma ona określonej wartości początkowej. Poza tym przypisanie moim zdaniem jest błędne. Jeśli już, to chyba powinno być na odwrót.
Dodatkowo zastanawia mnie warunek pętli do while w main():
C/C++
do
{
    int tymczasowa = losuj();
    if( czyByla( tymczasowa, wylosowana, wylosowano ) == false )
    {
        wylosowana[ wylosowano ] = tymczasowa;
       
        wylosowano++;
    }
} while( wylosowano > 2 );

Czy to aby na pewno jest dobrze?
(proszę mnie poprawić jeśli się gdzieś pomyliłem)
P-135127
krzyweldi
Temat założony przez niniejszego użytkownika
» 2015-07-24 11:27:58
Pętlę już wcześniej poprawiłem :) NO TAK! Przecież nie dałem "i" żadnej wartości, a ja siedzę jak głupi i szukam, i szukam..
Dzięki wielkie za pomoc :) Teraz działa elegancko!
P-135128
« 1 » 2
  Strona 1 z 2 Następna strona