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-08-28 14:00:54
wyswietl_tablice( tablica_2_el, 2, 1 );
 tutaj powinieneś przekazać obie tablice i rozmiar drugiej.
Wypisujesz wartość pierwszej tablicy z indeksem zapisanym w drugiej tablicy.
Rozbij sobie wypisywanie na dwie funkcje:
1. Wypisz dane użytkownika
2. Wypisz dane wynikowe.
Jak skumasz co jest nie tak możesz spróbować je połączyć w jedną całość.
P-136988
Deivid
Temat założony przez niniejszego użytkownika
» 2015-08-28 14:13:38
Na razie sie zastanawiam co Ty do mnie powiedziałeś:)
Jak mam przekazać obie tablice z rozmiarem drugiej?
wyswietl_tablice( tablica_2_el, 2, 1 );
 - faktycznie popełniłem błąd bo trzecim argumentem jest 1 a powinna być 2, jednak to odpowiada tylko dwóm różnym "cout'om". Powinno być:
wyswietl_tablice( tablica_2_el, 2, 2 );

Ten błąd nie zmienia faktu że nadal program mi kijowo losuje ;/

Edit 1: zmieniłem trochę kod, wydaje się jakby teraz działało poprawnie:
if( sprawdzenie_losowania( tablica_2_el, wylosowany_indeks, licznik ) == false )
 wcześniej była tab
tablica_3_el
P-136991
carlosmay
» 2015-08-28 14:38:01
Na razie sie zastanawiam co Ty do mnie powiedziałeś:)
Jak mam przekazać obie tablice z rozmiarem drugiej?

wyswietl_tablice( tablica_3_el, tablica_2_el, 2 );
Napisz do tego funkcję: w
tablica_3_el
 przechowujesz liczby użytkownika, w
tablica_2_el
 przechowujesz wylosowane indeksy.
Do tego etapu wszytko jest ok.

Później chcesz wyświetlić liczby z
tablica_3_el
 , ale jej nie przekazujesz do funkcji.

tablica_3_el
 - tu są wartości
tablica_2_el
 - tu są indeksy do tablicy
tablica_3_el

Do wyświetlenia liczb użytkownika napisz taką funkcję
void wypisz_uzytkownika( int tab[], int rozmiar )

Kluczem do ogarnięcia dużych problemów jest rozbicie ich na jak najmniejsze składniki.
P-136993
Deivid
Temat założony przez niniejszego użytkownika
» 2015-08-28 15:13:08
ok, po kolei. Bo zaczynam mieć mętlik. Na wstępie dzięki, ze próbujesz mi pomóc :)
Tworzę funkcję wyświetlającą. Ma ona wyświetlić 2 tablice?
Czy też mam to zastosować w taki sposób:
C/C++
{...tablica_3_el[ tablica_2_el[ licznik ] ]
    licznik++;
    while( licznik < 2 ) }
Nie żebym szedł na łatwiznę, ale chyba lepiej jak wysłałbyś kod i usiadłbym sobie nad nim do wieczora, a później sprawdziłbym czy zrozumiałem na zadaniu 2.

Edit, Ja nie losuje w zadaniu indexu i nei zapisuje go do tab2, mam wylosowaną całą liczbę z tablicy 3 el i zapisuje caly wynik od razu do tablicy 2 el
P-136998
carlosmay
» 2015-08-28 15:30:11
Ja nie losuje w zadaniu indexu i nei zapisuje go do tab2
 a powinieneś.

A to jest w dobrym kierunku.
C/C++
{...tablica_3_el[ tablica_2_el[ licznik ] ]
    licznik++;
    while( licznik < 2 ) }
 
P-136999
Deivid
Temat założony przez niniejszego użytkownika
» 2015-08-28 16:00:18
O to chodzi:
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 licznik = 0;
   
   
    do
    {
        cout << "Element " << licznik + 1 << " tablicy to: " << tab[ licznik ] << "\n";
        licznik++;
    } while( licznik < rozmiar_tablicy );
   
}
int losowanie_indeksu( int ilosc_losowan )
{
    return(( rand() % ilosc_losowan ) + 0 );
}


bool sprawdzenie_losowania( int tab[], int wylosowany_indeks, int licznik_losowan )
{
    if( licznik_losowan <= 0 )
         return false;
   
    int licznik = 0;
    do
    {
        if( wylosowany_indeks == tab[ licznik ] )
             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 );
    int wylosowany_indeks, licznik = 0;
    do
    {
        wylosowany_indeks = losowanie_indeksu( 3 );
        if( sprawdzenie_losowania( tablica_2_el, wylosowany_indeks, licznik ) == false )
        {
            tablica_2_el[ licznik ] = wylosowany_indeks;
            licznik++;
           
        }
    } while( licznik < 2 );
   
    cout << "\nNowa tablica: \n";
    licznik = 0;
    do
    {
        cout << "Element " << licznik + 1 << " to: " << tablica_3_el[ tablica_2_el[ licznik ] ] << "\n";
        licznik++;
    } while( licznik < 2 );
   
    return 0;
}

Edit. Na razie się poddaję. Wroce z roboty przeczytam jeszcze raz dzial o liczbach losowych bez powtorzen i usiade do tego od nowa.
P-137002
carlosmay
» 2015-08-28 16:21:59
Na razie się poddaję. Wroce z roboty przeczytam jeszcze raz dzial o liczbach losowych bez powtorzen i usiade do tego od nowa.
 Teraz działa prawidłowo.

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

void wypelnij( int tab[], int rozm )
{
    cout << "Podaj trzy liczby calkowite: " << endl;
    int i = 0;
    do {
        cin >> tab[ i++ ]; // inkrementacja po użyciu indeksu
        cin.clear();
        cin.ignore( 100, '\n' ); // zamiast cin.sync() bo nie wszedzie dziala
    } while( i < rozm );
   
}

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

bool sprawdz( int tab[], int rozm, int iIndeks )
{
    if( rozm < 0 )
         return false;
   
    int i = 0;
    do {
        if( tab[ i++ ] == iIndeks ) // jesli rowny zwroc false
             return false;
       
    } while( i < rozm );
   
    return true; // jesli nie znalazl true
}

void wypisz( int tab1[], int tab2[], int rozm )
{
    cout << "Oto wylosowane wartości: " << endl;
    int i = 0;
    do {
        cout << tab1[ tab2[ i++ ] ] << endl;
    } while( i < rozm );
   
    cout << endl;
}

int main()
{
    srand( time( NULL ) );
    const int roz_tab1 = 3;
    const int roz_tab2 = 2;
    int tab1[ roz_tab1 ];
    int tab2[ roz_tab2 ];
    int indeks = 0;
    int aktual_roz = 0;
    int i = 0;
    wypelnij( tab1, roz_tab1 );
   
    do {
        indeks = losuj( roz_tab2 );
        do {
            if( sprawdz( tab2, roz_tab2, indeks ) )
            {
                tab2[ aktual_roz++ ] = indeks;
                break;
            }
        } while( ++i < roz_tab1 ); // inkrementacja przed uzyciem i
       
    } while( aktual_roz < roz_tab2 );
   
    wypisz( tab1, tab2, roz_tab2 );
   
    system( "pause" );
    return 0;
}
Możesz to zerknąć. Może coś ci się przyda.

Jeśli chcesz działać na wartościach, nie indeksach musisz dodać wykrywanie czy użytkownik nie podaje takich samych liczb (bo jak poda trzy takie same to program się zapętli, bo będzie porównywał wciąż te same wartościl
P-137003
Deivid
Temat założony przez niniejszego użytkownika
» 2015-09-02 12:58:05
Wróciłem na nowo do problemu. Przeanalizowałem Twój kod programu i niestety jest on niepoprawny.
Twój program działa na zasadzie losowania indeksu z tablicy 1 i sprawdzenie czy zostal już on wykorzystany w tablicy 2. Jeśli np tam tab1[0] =4, tab1[1]=4, tab1[2]=3 to jest prawdopodobieństwo że w tablicy2 zostanie zapisana wartośc indexu 1 i 2, a to spowoduje wylosowanie nam liczb 4 i 4 a więc się powtórzą.
Czekam dalej na podpowiedzi.
P-137133
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona