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

[Rozdział 21] Zadanie 1

Ostatnio zmodyfikowano 2015-11-17 00:11
Autor Wiadomość
Szymislaw
Temat założony przez niniejszego użytkownika
[Rozdział 21] Zadanie 1
» 2015-11-12 21:59:18
Witam, treść zadania brzmi: 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. Program kompiluje się, jednakże czasami losuje z powtórzeniami. Starałem się znaleźć błąd jednak, bo wielokrotnej analizie kodu nie mogę zauważyć błędu. Proszę o pomoc :).


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

void podajliczby( int t[] )
{
    int numer = 1;
    int i = 0;
    do
    {
        cout << "Podaj liczbe " << numer << endl;
        cin >> t[ i ];
        i++;
        numer++;
    } while( i < 3 );
    //   i=0;
    /*do
    {
        cout<<t[i]<<endl;
        cout<<endl;
        i++;
    }while(i<3); */
   
}
int losowanie( int t[] )
{
   
    return t[( rand() % 3 ) ];
   
}
bool czybylawylosowana( int liczba, int t[], int ile )
{
    if( ile <= 0 )
   
         return false;
   
    int i = 0;
    do
    {
        if( t[ i ] == liczba )
             return true;
       
        i++;
       
    } while( i < ile );
   
    return false;
}

int main()

{
    srand( time( NULL ) );
    int tablica[ 3 ];
    int wylosowanych = 0;
    podajliczby( tablica );
   
    do
    {
        int liczba = losowanie( tablica );
        // cout<<"Czy byla wylosowana"<<czybylawylosowana(liczba, tablica, wylosowanych);
        if( czybylawylosowana( liczba, tablica, wylosowanych ) == false );
       
        {
            tablica[ wylosowanych ] = liczba;
            wylosowanych++;
        }
    } while( wylosowanych < 2 );
   
    wylosowanych = 0;
    cout << endl;
   
    do
    {
        cout << tablica[ wylosowanych ] << endl;
        wylosowanych++;
    } while( wylosowanych < 2 );
   
   
    return 0;
}
P-140047
carlosmay
» 2015-11-13 05:47:18
Losuj indeksy i zapisuj je do drugiej tablicy.
Porównuj wylosowane z elementami z drugiej tablicy.
Nie porównuj liczb z tablicy tylko indeksy.
Użytkownik może podać trzy takie same liczby i program nigdy nie zakończy działania.

C/C++
return t[( rand() % 3 ) ];
 stąd wraca wartość elementu z tablicy. Nadpisujesz nim tablicę
źródłową. Zwróć sam wylosowany indeks i zapisz do drugiej tablicy.
P-140064
Szymislaw
Temat założony przez niniejszego użytkownika
» 2015-11-15 19:51:32
Próbowałem zastosować się do Twoich rad, jednakże dalej coś robię źle. Porównuje indeksy jednakże dalej losuje z powtórzeniami. Wiem również, że można wpisać 3 takie same liczby i program nie zadziała poprawnie lecz to wiem jak poprawić tylko najpierw chciałbym by poprawnie losowało.

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

void podajliczby( int t[] )
{
    int numer = 1;
    int i = 0;
    do
    {
        cout << "Podaj liczbe " << numer << endl;
        cin >> t[ i ];
        i++;
        numer++;
    } while( i < 3 );
   
   
}
int losowanie()
{
   
    return( rand() % 3 ) + 0;
   
}
bool czybylawylosowana( int liczba, int t[], int ile )
{
    if( ile <= 0 )
   
         return false;
   
    int i = 0;
    do
    {
        if( ile == liczba )
             return true;
       
        i++;
       
    } while( i < ile );
   
    return false;
}
int main()

{
    srand( time( NULL ) );
    int tablica[ 3 ];
    int tablica2[ 2 ];
    int wylosowanych = 0;
    podajliczby( tablica );
   
    do
    {
       
        int indeks = losowanie();
       
        // cout<<"Czy byla wylosowana"<<czybylawylosowana(liczba, tablica, wylosowanych);
        if( czybylawylosowana( indeks, tablica, wylosowanych ) == false );
       
        {
            tablica2[ wylosowanych ] = tablica[ indeks ];
            wylosowanych++;
        }
    } while( wylosowanych < 2 );
   
    wylosowanych = 0;
    cout << endl;
   
    do
    {
        cout << tablica2[ wylosowanych ] << endl;
        wylosowanych++;
    } while( wylosowanych < 2 );
   
   
    return 0;
}
P-140188
Gibas11
» 2015-11-15 20:12:52
Nie czytałem twojego kodu (nigdy nie umiałem ogarniać cudzego kodu bez komentarzy / dokumentacji), więc nie pomogę naprawić twojego rozwiązania ale na pierwszy rzut oka widać, że przekombinowałeś. Zrealizowałem to zadanie (pisząc normalnie, bez chamskiego skracania długości) 26 linijkami, w których były 3 pętle i jedna funkcja -
main()
. Kodem na razie nie zarzucam, bo zakładam, że chcesz sam rozwiązać zadanie ale potem będę mógł ci pokazać jak do tego podszedłem gdybyś był ciekaw.
P-140191
carlosmay
» 2015-11-15 21:25:48
C/C++
if( czybylawylosowana( indeks, tablica, wylosowanych ) == false );

{
    tablica2[ wylosowanych ] = tablica[ indeks ];
    wylosowanych++;
}
 średnik z ifem, oczywisty błąd.
Do sprawdzania przekazujesz nie tą tablicę.
Po stwierdzeniu niepowtarzalności zapisz w tablicy tylko indeks.
Na koniec wypisz wynik w pętli:
C/C++
int indeks = 0;
do {
    cout << tablica[ tablica2[ indeks ] ];
    indeks++;
} while( indeks < 2 );
P-140196
Szymislaw
Temat założony przez niniejszego użytkownika
» 2015-11-16 21:45:44
Rozumiem, że tutaj przekazywałem nie tą tablice:
C/C++
if( czybylawylosowana( indeks, tablica2, wylosowanych ) == false )
Nie za bardzo rozumiem jak mam to zrobić, dalej nie mogę wymyślić nic poza poniższym zapisem:
C/C++
tablica2[ wylosowanych ] = tablica2[ indeks ];
Nie do końca rozumiem również poniższy zapis:
C/C++
cout << tablica[ tablica2[ indeks ] ] << endl;

P-140240
carlosmay
» 2015-11-16 22:07:58
Nie za bardzo rozumiem jak mam to zrobić, dalej nie mogę wymyślić nic poza poniższym zapisem:
C/C++
tablica2[ wylosowanych ] = tablica2[ indeks ];
 
rozumiemy tak:
C/C++
tablica2[ wylosowanych ] = indeks;
 

Nie do końca rozumiem również poniższy zapis:
C/C++
cout << tablica[ tablica2[ indeks ] ] << endl;
 
rozumiemy tak:
C/C++
wylosowanych = 0;
do
{
    cout << tablica[ tablica2[ wylosowanych ] ] << endl; // druga tablica ma zapisane nr wylosowanych indeksow
    // i tych wlasnie wartosci uzywamy jako indeksy dla tablicy z wprowadzonymi wartosciami
    wylosowanych++;
} while( wylosowanych < 2 );

 po prostu intuicyjnie użyłem nazwy 'indeks' (wymowna nazwa).
P-140243
Szymislaw
Temat założony przez niniejszego użytkownika
» 2015-11-16 22:24:46
Na początku używałem właśnie poniższego zapisu:
C/C++
tablica2[ wylosowanych ] = indeks;
Jednakże program dalej losuje z powtórzeniami. Cały kod wygląda teraz następująco:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

void podajliczby( int t[] )
{
    int numer = 1;
    int i = 0;
    do
    {
        cout << "Podaj liczbe " << numer << endl;
        cin >> t[ i ];
        i++;
        numer++;
    } while( i < 3 );
   
   
}
int losowanie()
{
   
    return( rand() % 3 ) + 0;
   
}
bool czybylawylosowana( int liczba, int t[], int ile )
{
    if( ile <= 0 )
   
         return false;
   
    int i = 0;
    do
    {
        if( ile == liczba )
             return true;
       
        i++;
       
    } while( i < ile );
   
    return false;
}
int main()

{
    srand( time( NULL ) );
    int tablica[ 3 ];
    int tablica2[ 2 ];
    int wylosowanych = 0;
    podajliczby( tablica );
   
    do
    {
       
        int indeks = losowanie();
       
        // cout<<"Czy byla wylosowana"<<czybylawylosowana(indeks, tablica2, wylosowanych);
        if( czybylawylosowana( indeks, tablica2, wylosowanych ) == false )
        {
            tablica2[ wylosowanych ] = indeks;
            wylosowanych++;
        }
    } while( wylosowanych < 2 );
   
    int indeks = 0;
    cout << endl;
   
    do
    {
        cout << tablica[ tablica2[ indeks ] ] << endl;
        indeks++;
    } while( indeks < 2 );
   
   
    return 0;
}

P-140245
« 1 » 2
  Strona 1 z 2 Następna strona