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

[Rozdział 21] Zadanie domowe.

Ostatnio zmodyfikowano 2017-05-17 03:48
Autor Wiadomość
DieG
Temat założony przez niniejszego użytkownika
[Rozdział 21] Zadanie domowe.
» 2017-05-16 19:23:51
Witam.

Na celowniku funkcja wylosujNZmiennych().
Ot, wczoraj jeszcze działała - dzisiaj już nie. Dzisiejsze zmiany w kodzie skomentowane, żeby program je ignorował. Moje starcie z tą funkcją trwa już od dobrych 3 dni. :D
Już sam nie wiem gdzie szukać błędu.

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

using namespace std;

// funkcje

bool input( bool sprLiczba )
{
    if( sprLiczba == true ) // Sprawdz czy wprowadzona wartosc jest liczba.
         return true;
   
    cout << endl << "Wprowadzona wartosc nie jest liczba!" << endl;
    return false;
}

void wylosujNZmiennych( int T_in[], int T_out[], /*int T_out_duped[],*/ int sT_in, int sT_out ) // T - tablica; s - rozmiar tablicy
{ // in - wejsciowe; out - wyjsciowe
    int ile; // duped - status "i" zmiennej z tablicy, ktora pozostala pusta aby pozniej mogla byc pominieta przy wypisaniu
    int random_in;
   
    int i;
    int duplikat;
   
    int maxprob;
    maxprob =( 4 * sT_in );
   
    ile = 0;
    do
    {
        random_in =( rand() % sT_in );
        if( ile == 0 )
        {
            T_out[ ile ] = T_in[ random_in ];
            ile++;
        }
        if( ile > 0 )
        {
            i = 0;
            do
            {
                duplikat = 0;
                if( T_out[ i ] != T_in[ random_in ] )
                {
                    //T_out_duped[i] = 0;
                    i++;
                }
                else
                {
                    duplikat++;
                    if( duplikat >=( maxprob ) )
                    {
                        //T_out_duped[i] = 1;
                        i++;
                    }
                }
            } while( i < sT_out );
           
            if( duplikat <( maxprob ) ) // Bez duplikatow jesli mozna. Dozwol "maxprob" prob - jesli wciaz pojawia sie duplikaty to przejdz dalej.
            {
                T_out[ ile ] = T_in[ random_in ];
            }
            ile++;
        }
    } while( ile < sT_out );
   
}


// /funkcje

int main()
{
    srand( time( 0 ) );
   
    int wprowadzone[ 3 ];
    int wybrane[ 2 ];
    //int wybrane_czyDuplikat[2];
   
   
    int sWprowadzone = 3; // s - rozmiar
    int sWybrane = 2;
   
    int liczba;
    int numerLiczby = 0;
   
    bool sprLiczba;
   
    cout << "Podaj 3 liczby:" << endl;
    do
    {
        cin >> liczba;
        sprLiczba = cin.good();
        cin.clear();
        cin.sync();
        if( input( sprLiczba ) == true )
        {
            wprowadzone[ numerLiczby ] = liczba;
            numerLiczby++;
        }
    } while( numerLiczby < sWprowadzone );
   
    wylosujNZmiennych( wprowadzone, wybrane, /*wybrane_czyDuplikat,*/ sWprowadzone, sWybrane );
   
    cout << "Wypisuje " << sWybrane << " liczb (pomijam duplikaty)." << endl;
    int wypisano;
    wypisano = 0;
    /*do
        {
            if( wybrane_czyDuplikat[i] == 0 )
            {
                cout << wybrane[i] << endl;
                wypisano++;
            }
            else
            {
                cout << "Duplikat, pomijam..." << endl;
                wypisano++;
            }
        } while( wypisano < sWybrane );*/
   
    return 0;
}
P-161210
karambaHZP
» 2017-05-16 19:57:38
C/C++
bool input( bool sprLiczba )
{
    if( sprLiczba == true ) // Sprawdz czy wprowadzona wartosc jest liczba.
         return true;
   
    cout << endl << "Wprowadzona wartosc nie jest liczba!" << endl;
    return false;
}
O co w tym chodzi? Jedyne co robi ta funkcja, to wypisanie komunikatu lub nie.
Nazwa sugeruje inne przeznaczenie, a jej faktyczne przeznaczenie jest mocno naciągane.

Nazywaj zmienne i funkcje tak aby nie trzeba było pisać do nich legendy.
Opisz dokładnie, czym ma się zajmować funkcja
wylosujNZmiennych
,
bo wydaje mi się, że masz tam napchane za dużo logiki.

Wskazówka: zastanów się jakie czynności (zadania) potrzebne są do osiągnięcia celu.
1. Potrzebna jest tablica na wprowadzone liczby.
2. Druga tablica na wylosowane liczby bądź indeksy.
3. Funkcja losująca liczbę z zadanego przedziału.
4. Funkcja sprawdzająca, czy aktualnie wylosowana liczba jest już w tablicy wylosowanych liczb.
5. Funkcja wypisująca zawartość tablicy.
6. Funkcja pobierająca od użytkownika liczbę i zwracająca tą wartość (jeśli poprawna).
7. W main pozostawiamy tylko prostą logikę.
P-161212
DieG
Temat założony przez niniejszego użytkownika
» 2017-05-16 22:18:15
No cóż, przekombinowałem. Nauczka na przyszłość.

Zasiadłem do tego po raz kolejny i udało się.

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

using namespace std;

// funkcje

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

bool sprawdzCzyByla( int t[], int liczba, int rozmiar )
{
    int i;
    int powtorka;
   
    i = 0;
    powtorka = 0;
    do
    {
        if( liczba == t[ i ] )
        {
            powtorka++;
        }
       
        i++;
    } while( i < rozmiar );
   
    if( powtorka > 0 )
    {
        return true;
    }
   
    return false;
}

// /funkcje

int liczba;
bool spr;
int ile;

int wprowadzone[ 3 ];
int rozmiar_wprowadzone = 3;

int wypisane[ 2 ];
int rozmiar_wypisane = 2;

int los;

int main()
{
    srand( time( 0 ) );
   
    cout << "Wprowadz 3 liczby." << endl;
    ile = 0;
    do
    {
        cin >> liczba;
        spr = cin.good();
        cin.clear();
        cin.sync();
        if( spr && !sprawdzCzyByla( wprowadzone, liczba, rozmiar_wprowadzone ) )
        {
            wprowadzone[ ile ] = liczba;
            ile++;
        }
        else
             cout << "Wprowadzona wartosc nie jest liczba lub wprowadziles druga taka sama liczbe!" << endl << "Sprobuj jeszcze raz." << endl;
       
    } while( ile < 3 );
   
   
    cout << "Wprowadzono nastepujace liczby:" << endl;
    ile = 0;
    do
    {
        cout << wprowadzone[ ile ] << endl << endl;
        ile++;
    } while( ile < 3 );
   
   
    ile = 0;
    do
    {
        los = wprowadzone[ wylosuj() ];
       
        if( ile == 0 )
        {
            wypisane[ ile ] = los;
            ile++;
        }
       
        if( ile > 0 )
        {
            if( sprawdzCzyByla( wypisane, los, rozmiar_wypisane ) == false )
            {
                wypisane[ ile ] = los;
                ile++;
            }
        }
    } while( ile < 2 );
   
   
    cout << "Wypisuje 2 z 3 podanych liczb." << endl;
    ile = 0;
    do
    {
        cout << wypisane[ ile ] << endl;
        ile++;
    } while( ile < 2 );
   
   
    return 0;
}
P-161217
Rashmistrz
» 2017-05-17 03:48:25
Gdzie był ten szczególny błąd?
P-161223
« 1 »
  Strona 1 z 1