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ść
carlosmay
» 2015-09-02 13:37:34
Działa poprawnie. Jest to tylko przykład do analizy.
A jeśli użytkownik poda trzy razy tą samą liczbę? (to program się zapętli).

Ty nie wiesz jakie liczby poda użytkownik! Losujesz dwa elementy z trzech, a co w nich jest to wielka tajemnica user'a.

Jeśli chcesz zrobić po swojemu to zabezpiecz program przed wprowadzeniem przez user'a liczby, która już istnieje w tablicy.
P-137139
Deivid
Temat założony przez niniejszego użytkownika
» 2015-09-02 15:26:16
Zinterpretowałem zadanie ciut inaczej, patrząc na to z Twojej perspektywy (pewnie lepszej niż mojej, heh) masz rację i zwracam honor. Program działa poprawnie.
Jednak patrząc z mojej perspektywy by wylosował po liczbie z tablicy 1 i zapisał do tablicy 2 napisałem coś takiego: (co sądzicie:)
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 )
{
    int licznik = 0;
    cout << "Wypisz " << rozmiar_tablicy << " liczby calkowite: \n";
    do
    {
        cin.clear();
        cin.sync();
        cin >> tab[ licznik ];
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}

int losowanie_liczb( int z_ilu_liczb_losowac )
{
    return rand() % z_ilu_liczb_losowac;
}

void wyswietl_tablice( int tab[], int rozmiar_tablicy )
{
    int licznik = 0;
    do
    {
        cout << "Element " << licznik + 1 << " to: " << tab[ licznik ] << "\n";
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}

bool sprawdzenie_wypelnienia( int tab[] )
{
    if( tab[ 0 ] == tab[ 1 ] && tab[ 1 ] == tab[ 2 ] )
    {
        cout << "Wprowadziles 3 razy ta sama liczbe, ponow probe !! \nKoniec programu";
        return 0;
    }
    return true;
}

bool sprawdzenie_losowania( int tab[], int wylosowana_liczba, int rozmiar_tablicy )
{
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == wylosowana_liczba )
        {
            return false;
        }
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
    return true;
}
int main()
{
    srand( time( NULL ) );
    const int rozm_tab1 = 3;
    const int rozm_tab2 = 2;
    int tab1[ rozm_tab1 ]; // liczby zapisane przez uzytkownika
    int tab2[ rozm_tab2 ]; // dwie wylosowane liczny z liczb uzytkownika
    wypelnij_tablice( tab1, rozm_tab1 );
    cout << "Wypisane przez Ciebie liczby to: \n";
    wyswietl_tablice( tab1, rozm_tab1 );
    int licznik = 0, licznik1 = 0, losowana_liczba = 0;
    //Pierwsze sprawdzenie:
    if( sprawdzenie_wypelnienia( tab1 ) == true )
    {
        do
        {
            losowana_liczba = tab1[ losowanie_liczb( 3 ) ];
            do
            {
                if( sprawdzenie_losowania( tab2, losowana_liczba, rozm_tab2 ) == true )
                {
                    tab2[ licznik1++ ] = losowana_liczba;
                }
                licznik++;
            } while( licznik < rozm_tab1 );
           
        } while( licznik1 < rozm_tab2 );
       
        cout << "Twoja nowa tablica:\n";
        wyswietl_tablice( tab2, rozm_tab2 );
    }
   
    return 0;
}
P-137152
carlosmay
» 2015-09-02 15:47:26
Teraz zmodyfikuj program. Podajesz 10 liczb a losujesz 7.

Do sprawdzania liczb user'a użyj tej samej funkcji, która sprawdza losowane liczby.
Na tym polega dobrodziejstwo funkcji, że dobrze napisana daje możliwość wykorzystania w wielu sytuacjach.
P-137153
Deivid
Temat założony przez niniejszego użytkownika
» 2015-09-02 15:51:01
I tu mnie masz :) Nie próbuję nawet bo wiem że w tym przypadku mój tok myślenia jest beznadziejny. Zbyt wiele warunków musiałbym napisać abym to osiągnął. W przypadku wielu liczb lepiej (a nawet chyba koniecznie) zastosować trzeba losowanie według indexu z tablicy użytkownika a nie według podanych przez niego liczb.

Edit:
A oto poprawny program. (oby tak było bo chciałbym przejść już do zadania 2) Proszę o ocenę i zamykam temat :)
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 )
{
    int licznik = 0;
    cout << "Wypisz " << rozmiar_tablicy << " liczby calkowite: \n";
    do
    {
        cin.clear();
        cin.sync();
        cin >> tab[ licznik ];
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}

int losowanie_liczb( int z_ilu_liczb_losowac )
{
    return rand() % z_ilu_liczb_losowac;
}

void wyswietl_tablice( int tab1[], int tab2[], int rozmiar_tablicy )
{
    int licznik = 0;
    do
    {
        cout << "Element " << licznik + 1 << " to: " << tab1[ tab2[ licznik ] ] << "\n";
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}

bool sprawdzenie_losowania( int tab[], int rozmiar_tablicy, int wylosowany_index )
{
    if( rozmiar_tablicy < 0 )
    {
        return false;
    }
    int licznik = 0;
    {
        do
        {
            if( tab[ licznik ] == wylosowany_index )
            {
                return false;
            }
            licznik++;
        } while( licznik < rozmiar_tablicy );
       
    }
    return true;
}


int main()
{
    srand( time( NULL ) );
    const int rozm_tab1 = 3;
    const int rozm_tab2 = 2;
    int tab1[ rozm_tab1 ];
    int tab2[ rozm_tab2 ];
    wypelnij_tablice( tab1, rozm_tab1 );
    int losowany_index = 0;
    int licznik = 0, licznik1 = 0;
    do
    {
        losowany_index = losowanie_liczb( rozm_tab1 );
        do
        {
            if( sprawdzenie_losowania( tab2, rozm_tab2, losowany_index ) == true )
            {
                tab2[ licznik1 ] = losowany_index;
                licznik1++;
            }
            licznik++;
        } while( licznik < rozm_tab1 );
       
    } while( licznik1 < rozm_tab2 );
   
    wyswietl_tablice( tab1, tab2, rozm_tab2 );
   
    return 0;
}
P-137154
carlosmay
» 2015-09-02 16:15:59
Zmodyfikowałem tylko funkcję wpisującą liczby user'a i usunąłem funkcję sprawdzającą user'a (do tego celu wykorzystałem funkcję sprawdzającą losowane liczby)
oraz wywaliłem dodany warunek. Program z poprawkami ( niepotrzebne części kodu wykomentowane);
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;


bool sprawdzenie_losowania( int tab[], int wylosowana_liczba, int rozmiar_tablicy ); // deklarujesz funkcję na początkku, żeby była znana przed jej użyciem,
//lub przenosisz tutaj całą funkcję, wybór należy do ciebie
void wypelnij_tablice( int tab[], int rozmiar_tablicy )
{
    int licznik = 0;
    int liczba;
    cout << "Wypisz " << rozmiar_tablicy << " liczby calkowite: \n";
    do
    {
        cin.clear();
        cin.sync();
        cin >> liczba; // wpisujesz liczbe
        if( sprawdzenie_losowania( tab, liczba, licznik ) ) //  wykorzystanie juz instniejacej funkcji do sprawdzenia liczb user'a
        {
            tab[ licznik ] = liczba; // jesli nie ma takiej liczby dodaj ja do puli liczb user'a
            licznik++;
        }
    } while( licznik < rozmiar_tablicy );
   
}

int losowanie_liczb( int z_ilu_liczb_losowac )
{
    return rand() % z_ilu_liczb_losowac;
}

void wyswietl_tablice( int tab[], int rozmiar_tablicy )
{
    int licznik = 0;
    do
    {
        cout << "Element " << licznik + 1 << " to: " << tab[ licznik ] << "\n";
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}


// ta funkcja jest juz zbedna
//bool sprawdzenie_wypelnienia(int tab[])
//{
// if (tab[0] == tab[1] && tab[1] == tab[2])
// {
// cout << "Wprowadziles 3 razy ta sama liczbe, ponow probe !! \nKoniec programu";
// return 0;
// }
// return true;
//}

bool sprawdzenie_losowania( int tab[], int wylosowana_liczba, int rozmiar_tablicy )
{
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == wylosowana_liczba )
        {
            return false;
        }
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
    return true;
}
int main()
{
    srand( time( NULL ) );
    const int rozm_tab1 = 3;
    const int rozm_tab2 = 2;
    int tab1[ rozm_tab1 ]; // liczby zapisane przez uzytkownika
    int tab2[ rozm_tab2 ]; // dwie wylosowane liczny z liczb uzytkownika
    wypelnij_tablice( tab1, rozm_tab1 );
    cout << "Wypisane przez Ciebie liczby to: \n";
    wyswietl_tablice( tab1, rozm_tab1 );
    int licznik = 0, licznik1 = 0, losowana_liczba = 0;
    //Pierwsze sprawdzenie: i pozbywasz się juz zbednego if'a
    /*if (sprawdzenie_wypelnienia(tab1) == true)
    {*/
    do
    {
        losowana_liczba = tab1[ losowanie_liczb( 3 ) ];
        do
        {
            if( sprawdzenie_losowania( tab2, losowana_liczba, rozm_tab2 ) == true )
            {
                tab2[ licznik1++ ] = losowana_liczba;
            }
            licznik++;
        } while( licznik < rozm_tab1 );
       
    } while( licznik1 < rozm_tab2 );
   
    cout << "Twoja nowa tablica:\n";
    wyswietl_tablice( tab2, rozm_tab2 );
    /*}*/
   
    return 0;
}[ \c pp ]
P-137156
Deivid
Temat założony przez niniejszego użytkownika
» 2015-09-02 16:22:17
Dzięki za poprawę wersji z losowaniem liczb - w domu ją przeanalizuję.
A jak sprawa wygląda z losowaniem po indexie? Wszystko jest ok i mogę ruszać do następnego zadania?
P-137157
carlosmay
» 2015-09-02 16:38:20
Jeśli programy działają tak jak mają działać to jest OK.
P-137159
1 2 « 3 »
Poprzednia strona Strona 3 z 3