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

[Rozdział 21] Zadanie 1. - Proszę o szczegółową podpowiedź.

Ostatnio zmodyfikowano 2015-09-02 16:38
Autor Wiadomość
Deivid
Temat założony przez niniejszego użytkownika
[Rozdział 21] Zadanie 1. - Proszę o szczegółową podpowiedź.
» 2015-08-27 20:07:57
Witajcie, jestem dość kiepski z programowania i tym oto sposobem od samego rana siedzę nad tym zadaniem. W końcu się poddałem, jeśli wy mi nie pomożecie nie poradzę sobie z nim. Uprzedzę pytania przeglądałem forum ale nie natrafiłem na rozwiązanie moje problemu, bądź co jest bardziej prawdopodobne nie zrozumiałem go.
Więc od początku.
Stworzyłem sobie funkcję do wypełnienia tablicy:
C/C++
int funkcja_wypelnij_tablice( int tablica[], int wielkosc_tablicy )
{
    int index = 0;
    cout << "Wprowadz trzy liczby calkowite: \n";
    do
    {
        cin.clear();
        cin.sync();
        cin >> tablica[ index ];
        index++;
    } while( index < wielkosc_tablicy );
   
}
następnie funkcję do wyświetlenia tablicy (niby zbędne ale dla ułatwienia bym widział gdzie co mam):
C/C++
int funkcja_wyswietl_tablice( int tablica[], int wielkosc_tablicy )
{
    int index = 0;
    do
    {
        cout << "Liczba " << index + 1 << " to: " << tablica[ index ] << "\n";
        index++;
    } while( index < wielkosc_tablicy );
   
}
funkcja losujaca:
C/C++
int funkcja_losujaca_2( int stop )
{
    int losowanie = 0;
    losowanie =( rand() % stop ) + 0;
    return losowanie;
}
Teraz kolej na int main (+ funkcja sprawdzająca, której nie wiem jak napisać)

C/C++
int main()
{
    srand( time( NULL ) );
    int tab_1[ 3 ], index = 0;
    funkcja_wypelnij_tablice( tab_1, 3 ); // wypelniamy
    funkcja_wyswietl_tablice( tab_1, 3 ); // wyswietlamy
    int tab_2[ 2 ], losowanie_pierwsze = 0;
    //Ponizej ide na latwizne i przypisuje sobie do pierwszej komorki tab_2 losowa liczbe z tab_1.
    losowanie_pierwsze = funkcja_losujaca_2( 3 );
    tab_2[ 0 ] = tab_1[ losowanie_pierwsze ];
   
    //Nastepnie probuje zrobic sprawdzenie zawartosci tablicy 1 aby zapisac ja do tablicy 2:
   
    /*TUTAJ MIEJSCE NA ODNOSNIK*/
   
    index = 0;
    do
    {
        cout << tab_2[ index ] << "\n";
        index++;
    } while( index < 2 );
   
    return 0;
}


przechodzimy do funkcji sprawdzajacej:
C/C++
bool funkcja_sprawdzenie_losowania( int tablica_1[], int tablica_2[], int wielkosc_tablicy )
//Sprawdzenie czy liczba była już wylosowana
{
    int index_1 = 0, index_2;
    do
    {
        if( tablica_2[ 0 ] == tablica_1[ index_1 ] )
        {
            return true;
        }
        else
             return false;
       
        index_1++;
    } while( index_1 < wielkosc_tablicy );
   
}
//chcialem stworzyc cos na zasadzie: Jeśli tab_2[0] już jest wylosowane i tablica 1 to po porownaniu zwroci true a wiec nie bedzie wykonane, a jak nie znajdzie tej liczby to przejdzie wykorzysta dany inex do zapisu w tablicy 2 w int main
a to napisałem w int main jako ODNOSNIK:
C/C++
do
{
    int losowanie_drugie = 0;
    losowanie_drugie = funkcja_losujaca_2( 3 );
    if( funkcja_sprawdzenie_losowania( tab_1, tab_2, 3 ) == false )
    {
        tab_2[ 1 ] = tab_1[ losowanie_drugie ];
    }
    index++;
} while( index < 1 );


Proszę o rady jak to naprawić. Z góry przepraszam za ilość tekstu ale bardzo zależy mi na tym by ktoś mi to wytłumaczył. Nie chce przechodzić dalej nie opanowując tego rozdziału.
Z góry dzięki,
Dawid.
P-136935
carlosmay
» 2015-08-27 20:33:35
int funkcja_wypelnij_tablice( int tablica[], int wielkosc_tablicy )
 nie zwraca wartości (void)
int funkcja_wyswietl_tablice( int tablica[], int wielkosc_tablicy )
 też nie zwraca wartości (void)

Popraw na początek to.

Nie chce przechodzić dalej nie opanowując tego rozdziału
No i dobrze. Bez tych podstaw nie ma szans na dalszą naukę.
Powtórz funkcje: jak i kiedy zwracają jakąś wartość i czy zawsze jest to konieczne.

Edit: Program ma składać się z funkcji więc nic nie stoi na przeszkodzie, żeby pisać program po kawałku i sprawdzać czy zachowuje się zgodnie z oczekiwaniem.
P-136936
Deivid
Temat założony przez niniejszego użytkownika
» 2015-08-27 22:37:20
Dzięki za odpowiedź. Czyli z tego co zrozumiałem funkcje wypełnij i wyświetl przyjmują argumenty do funkcji ale nie zwracają wartości a więc zamiast int muszę zastosować void.
Co do funki sprawdzającej bool przecież zwraca wartość 0 lub 1. Mógłbym napisać coś więcej o tym ?
P-136955
carlosmay
» 2015-08-27 22:56:20
Co do funki sprawdzającej bool przecież zwraca wartość 0 lub 1. Mógłbym napisać coś więcej o tym ?
 Sorki. To chyba zmęczenie. Ta funkcja OK - zwraca wartość, ale nigdy nie wykona inkrementacji. Wyjście z funkcji nastąpi po wykonaniu jednego z returnów.
I jeszcze masz zadeklarowaną zmienną
index_2
 , której nie używasz.
P-136958
Deivid
Temat założony przez niniejszego użytkownika
» 2015-08-28 09:41:44
OK. Napisałem dzisiaj program od nowa. Mam problem z funkcją sprawdzającą i przypisaniem liczb z tablicy 3 elementowej do tablicy 2 elementowej. Oto kod:
(do administracji - wklejam cały kod ponieważ potrzebuję dokładnego wytłumaczenia)
C/C++
/*
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.
*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

//Funckja ma wypelnic tablice 3 elementowa (uzytkownika):
void funkcja_wypelniajaca_tablice_3_elementowa( int tab[] )
{
    int zmienna_liczba, licznik = 0;
    cout << "Podaj 3 liczby: \n";
    do
    {
        cin.clear();
        cin.sync();
        cin >> zmienna_liczba;
        tab[ licznik ] = zmienna_liczba;
        licznik++;
    } while( licznik < 3 );
   
}
//Funkcja ma wyswietlic na ekranie liczby wprowadzone przez uzytkownika
void funkcja_wyswietlajaca_tablice_3_elementowa( int tab[] )
{
    int licznik = 0;
    do
    {
        cout << "Liczba " << licznik + 1 << " to: " << tab[ licznik ] << "\n";
        licznik++;
    } while( licznik < 3 );
   
}
int funkcja_losujaca( int ilosc_liczb_losowanych )
{
    int zmienna_losowana = 0;
    zmienna_losowana =( rand() % ilosc_liczb_losowanych ) + 0;
    return zmienna_losowana;
}
//Aby porownac tablice 3 elementowa z tablica 2 elementowa musimy
//wypelnic tablice 2 elementowa zerami w celu porownania
void funckja_wypelniajaca_tablice_2_elementowa( int tab[] )
{
    int licznik = 0;
    do
    {
        tab[ licznik ] = 0;
        licznik++;
    } while( licznik < 2 );
   
}

//Funckja ma sprawdzic czy losowy index tablicy 3 elemenowej znajduje
//sie w tablicy 2 elementowej (sprawdza jeden po drugim)
bool funkcja_sprawdzajaca_zawartosc_tablic( int tab_3_el[], int tab_2_el[], int index_losowy )
{
    int licznik = 0;
    do
    {
        if( tab_2_el[ licznik ] == tab_3_el[ index_losowy ] )
        {
            return false;
        }
        licznik++;
    } while( licznik < 3 );
   
    return true;
   
}
int main()
{
    srand( time( NULL ) );
    //Tworze tablice trzy elementowa
    int tablica_3_elementowa[ 3 ];
    //Wypelniamy tablice z uzyciem funkcji
    funkcja_wypelniajaca_tablice_3_elementowa( tablica_3_elementowa );
    //Wyswietlamy wprowadzone przez nas liczby na ekran
    funkcja_wyswietlajaca_tablice_3_elementowa( tablica_3_elementowa );
    //Aby wylosowac 2 liczby z 3 musimy miec je gdzie zapisac:
    int tablica_2_elementowa[ 2 ];
    //Wypelniamy tablice 2 elementowa zerami
    funckja_wypelniajaca_tablice_2_elementowa( tablica_2_elementowa );
    int licznik = 0;
    do
    {
        int losowy_index = 0;
        losowy_index = funkcja_losujaca( 3 );
        if( funkcja_sprawdzajaca_zawartosc_tablic( tablica_3_elementowa, tablica_2_elementowa, losowy_index ) )
        {
            tablica_2_elementowa[ licznik ] = tablica_3_elementowa[ losowy_index ];
        }
        licznik++;
    } while( licznik < 2 );
   
    licznik = 0;
    do
    {
        cout << "Element " << licznik + 1 << " tablicy drugiej to: " << tablica_2_elementowa[ licznik ] << "\n";
        licznik++;
    } while( licznik < 2 );
   
    return 0;
}

Proszę o wskazówkę.
P-136967
carlosmay
» 2015-08-28 10:39:43
Nie musisz zerować tablicy dwuelem.
W pierwszym cyklu zapisujesz efekt losowania do tablicy bo jeszcze nic w niej nie ma.
Później operujesz na aktualnym rozmiarze tablicy.
Do funkcji sprawdzajacej przekazujesz co wylosowałeś, tab_2_el i aktualny rozmiar (nie cały rozmiar) wtedy nie porównujesz z jeszcze nie zapisanymi elementami tablicy.

Funkcję losująca możesz skrócić do jednej linii.
P-136971
pekfos
» 2015-08-28 10:40:25
C/C++
tablica_2_elementowa[ licznik ] = tablica_3_elementowa[ losowy_index ];
Nie używaj tablicy z liczbami użytkownika, bo nic o nich nie wiesz. Jeśli wszystkie liczby są takie same, to nie wylosujesz dwóch różnych. Losuj miejsca w tablicy, a nie liczby, które się tam znajdują.
P-136972
Deivid
Temat założony przez niniejszego użytkownika
» 2015-08-28 12:27:51
Wydaje mi się że o to tu chodzi, jednak jeszcze coś nie działa. Z waszymi poradami jestem chyba coraz bliżej... a przynajmniej mam taką nadzieję. Oto kod:
C/C++
/*
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.
*/
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void wypelnij_tablice( int tab[], int rozmiar_tablicy )
{
    cout << "Wprowadz 3 liczby: \n";
    int licznik = 0;
    do
    {
        cin.clear();
        cin.sync();
        cin >> tab[ licznik ];
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}
void wyswietl_tablice( int tab[], int rozmiar_tablicy, int ktora_tablica )
{
   
    int licznik = 0;
    if( ktora_tablica == 1 )
    {
        cout << "Wyswietlasz wpowadzone przez Ciebie liczby: \n";
    }
    if( ktora_tablica == 2 )
    {
        cout << "Wyswietlasz wylosowane liczby: \n";
    }
   
    do
    {
        cout << "Element " << licznik + 1 << " tablicy to: " << tab[ licznik ] << "\n";
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}
int losowanie_indeksu( int tab[], int ilosc_losowan )
{
    return tab[( rand() % ilosc_losowan ) ];
}
bool sprawdzenie_losowania( int tab[], int wylosowany_indeks, int licznik_losowan )
{
    if( licznik_losowan <= 0 )
    {
        return false;
    }
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == wylosowany_indeks )
        {
            return true;
        }
        licznik++;
    } while( licznik < licznik_losowan );
   
    return false;
}

int main()
{
    srand( time( NULL ) );
    int tablica_3_el[ 3 ];
    int tablica_2_el[ 2 ];
    wypelnij_tablice( tablica_3_el, 3 );
    wyswietl_tablice( tablica_3_el, 3, 1 );
    int wylosowany_indeks = 0, licznik = 0;
    do
    {
        wylosowany_indeks = losowanie_indeksu( tablica_3_el, 3 );
        if( sprawdzenie_losowania( tablica_3_el, wylosowany_indeks, licznik ) == false )
        {
            tablica_2_el[ licznik ] = wylosowany_indeks;
            licznik++;
        }
       
    } while( licznik < 2 );
   
    wyswietl_tablice( tablica_2_el, 2, 1 );
    return 0;
}

Edit 1:
Poprawiłem tą linijkę kodu:
C/C++
if( tab[ licznik ] == wylosowany_indeks )
{
    return true;
}
licznik++;
 Wcześniej
licznik++;
 byl zaraz po return przed klamerką.
P-136978
« 1 » 2 3
  Strona 1 z 3 Następna strona