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

Rozdział 21, zadanie 1, napisanie funkcji sprawdzającej.

Ostatnio zmodyfikowano 2014-06-01 21:51
Autor Wiadomość
threaz
Temat założony przez niniejszego użytkownika
Rozdział 21, zadanie 1, napisanie funkcji sprawdzającej.
» 2014-06-01 15:13:29
Witam wszystkich użytkowników.
Zwracam się do Was z pytaniem do zadania pierwszego w lekcji 21(Losowanie bez powtórzeń), które postaram się wyjaśnić zaraz pod kodem.

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

void wczytanie( int tab[] )
{
    int i = 0;
    do
    {
        std::cout << "Podaj " << i + 1 << " liczbe: ";
        std::cin >> tab[ i ];
       
        i++;
    } while( i < 3 );
   
}

bool sprawdzenie( int tab1[], int Indeks )
{
    int i = 0;
   
   
}

int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ], tablica1[ 2 ];
   
    wczytanie( tablica );
   
    int indeks;
    int i = 0;
   
    do
    {
        indeks = std::rand() % 3;
       
        if( sprawdzenie( tablica1, indeks ) == false )
        {
            tablica1[ i ] = tablica[ indeks ];
            i++;
           
        }
       
    } while( i < 2 );
   
    i = 0;
    do
    {
        std::cout << tablica1[ i ] << ", ";
        i++;
    } while( i < 2 );
   
   
   
    return 0;
   
}

Wyjaśnię teraz co chciałem osiągnać i z czym mam problem.

1. Funkcja wczytanie ma za zadanie wczytać 3 liczby od użytkownika i zapisać je do tablicy, którą przekazuję do niej w funkcji main.
2. Pomyślałem, że jeśli zapisałem poszczególne liczby jako, tablica[0], tablica[1], tablica[2], to teraz chcąc wylosować jedną z nich muszę wylosować po prostu jeden z indeksów 0, 1, 2.
3. Wylosowany indeks muszę sprawdzić przy pomocy funkcji sprawdzanie: jeśli true > wracam do losowania, jeśli false(podany indeks jeszcze nie został wylosowany) > zapisuję go do nowej tablicy (tablica1), wracam do losowania.
4. Wypisuję na ekran zawartość drugiej tablicy (tablica1), czyli dwóch liczb wylosowanych spośród 3.

Problem w tym, że nie potrafię prawidłowo sformułować funkcji sprawdzanie. Do czego aktualnie doszedłem to:
C/C++
bool sprawdzenie( int tab[], int Indeks )
{
    int i = 0;
    do
    {
        if(...) // <<-- nie mam pomysłu na warunek, który sprawdziłby mi, czy wylosowany wcześniej indeks już padł czy nie
             return true;
       
        i++;
       
    } while( i < 3 );
   
    return false;
}
P-111255
pekfos
» 2014-06-01 15:20:01
tab[ i ] == Indeks
? Do tego program jest niepoprawny. Sprawdzasz 3 elementy, tablica ma 2 i do tego niezainicjalizowane.
P-111257
threaz
Temat założony przez niniejszego użytkownika
» 2014-06-01 15:45:19
Druga tablica ma służyć do przechowywania wartości już wybranych. Czyli tych 2 z 3, dlatego ma dwa elementy.
Warość nadaję im tutaj:
C/C++
{
    tablica1[ i ] = tablica[ indeks ];
    i++;
   
}

} while( i < 2 );

Czyli załóżmy, że wylosowałem liczbę 1, czyli indeks = 1. Pierwszemu elementowi nowej tablicy, czyli tablica1[0] nadaję więc wartość tablica[1], czyli druga z wpisanych przeze mnie liczb.

P-111261
pekfos
» 2014-06-01 16:06:59
Sprawdzasz 3 elementy, tablica ma 2 i do tego niezainicjalizowane.
P-111263
threaz
Temat założony przez niniejszego użytkownika
» 2014-06-01 17:49:04
Dzięki za wskazówki chociaż postanowiłem zabrać się do tego jeszcze raz. Napisałem to zupełnie inaczej. Nie wiem czy nie zbyt topornie.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void wczytanie( int tab[] )
{
    int i = 0;
    do
    {
        std::cout << "Podaj " << i + 1 << " liczbe: ";
        std::cin >> tab[ i ];
       
        i++;
    } while( i < 3 );
   
}

bool sprawdzenie( int pierwsza, int druga )
{
    if( pierwsza == druga )
         return true;
   
    return false;
   
}


int losowanie()
{
    return std::rand() % 3;
}

int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ];
   
    wczytanie( tablica );
   
    int a, b;
   
    a = losowanie();
   
    do
    {
        b = losowanie();
       
    } while( sprawdzenie( a, b ) == true );
   
    std::cout << tablica[ a ] << std::endl;
    std::cout << tablica[ b ] << std::endl;
   
   
    return 0;
   
}

Gdyby komuś chciało się przejrzeć, prosiłbym o uwagi i wytknięcie ewentualnych błędów.
Pozdrawiam[/b]
P-111268
pekfos
» 2014-06-01 17:53:12
Topornie. Istnienie i używanie sprawdzenie() w tym kodzie, to rozciąganie banalnego zapisu bez większego sensu. Zamiast
while( sprawdzenie( a, b ) == true )
 wystarczy
while( a == b )
.
P-111270
threaz
Temat założony przez niniejszego użytkownika
» 2014-06-01 21:51:38
Dzięki za pomoc. Już mi się udało. Wstawię swój kod, może komuś się przyda.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

void pobieranie( int tab[] )
{
    int i = 0;
    do
    {
        std::cout << "Podaj " << i + 1 << " liczbe: ";
        std::cin >> tab[ i ];
       
        i++;
    } while( i < 3 );
   
}

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

bool sprawdzenie( int tab[], int iLiczba, 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( 0 ) );
    int tablica[ 3 ], tabliczka[ 2 ];
    int liczba, wylosowane = 0;
   
    pobieranie( tablica );
   
    do
    {
        liczba = losowanie();
        if( sprawdzenie( tabliczka, liczba, wylosowane ) == false )
        {
            tabliczka[ wylosowane ] = liczba;
            wylosowane++;
        }
       
    } while( wylosowane < 2 );
   
    std::cout << "Wylosowane przez Ciebie liczby to: " << std::endl;
    wylosowane = 0;
    do
    {
        std::cout << tablica[ tabliczka[ wylosowane ] ] << ", ";
        wylosowane++;
       
    } while( wylosowane < 2 );
   
    return 0;
}
P-111292
« 1 »
  Strona 1 z 1