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

Lekcja 21 - Podanie 10 liczb do tab i wylosowanie 8 bez pow.

Ostatnio zmodyfikowano 2017-11-14 14:47
Autor Wiadomość
marcinpro
Temat założony przez niniejszego użytkownika
Lekcja 21 - Podanie 10 liczb do tab i wylosowanie 8 bez pow.
» 2017-11-13 19:19:24
Witam ponownie, chciałbym aby ponownie ktoś zerknął na mój kod. Jestem zdziwiony bo działa :) Uczę się programowania bardzo krótko więc proszę o wyrozumiałość w pytaniach.
Program działa, zastanawiam się czy jest dobrze zrobiony i na co znów mogę zwrócić uwagę co razi w oczy żebym sobie złych nawyków nie wyrabiał.

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.
2. Zmodyfikuj program z pierwszego zadania tak, aby użytkownik musiał podać 10 liczb, a 8 z nich będzie losowanych bez powtórzeń. Sprawdź czy wyniki są poprawne.

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

using namespace std;

void podajliczbe( int liczby[] )
{
    int ile = 0;
    do
    {
        cout << "Podaj " << ile + 1 << " liczbe:" << endl;
        cin >> liczby[ ile ];
        cin.clear();
        cin.sync();
        ile++;
    } while( ile < 10 );
   
}

void wysliczby( int liczby[] )
{
    int ile = 0;
    do
    {
        cout << "Liczby to:" << liczby[ ile ] << endl;
        ile++;
    } while( ile < 10 );
   
}

int losuj()
{
    int a =( rand() % 10 ) + 0;
    return a;
}

bool czybyla( int liczba, int tab[], int pom )
{
    if( pom <= 0 )
    {
        return false;
    }
    int a = 0;
    do
    {
        if( tab[ a ] == liczba )
        {
            return true;
        } else
        {
            a++;
        }
       
       
    } while( a < pom );
   
    return false;
}


void pokaz( int wylosowane[] )
{
    int ile = 0;
    do
    {
        cout << "Liczby to:" << wylosowane[ ile ] << endl;
        ile++;
    } while( ile < 8 );
   
}



int main()
{
    srand( time( 0 ) );
    int liczby[ 10 ];
    int wylosowanych = 0;
    int wylosowane[ 8 ];
    int pom = 0;
    cout << "Podaj teraz 10 liczby, ktore potem wylosuje bez powtorzen" << endl;
    podajliczbe( liczby );
    wysliczby( liczby );
    cout << "Losujemy teraz 8 z 10 podanych bez powtorzenia" << endl;
    do
    {
        int liczba = liczby[ losuj() ];
        if( czybyla( liczba, wylosowane, pom ) == false )
        {
            wylosowane[ pom ] = liczba;
            pom++;
        }
    } while( pom < 8 );
   
    pokaz( wylosowane );
   
    return 0;
}


Ciekawi mnie jakby można zabezpieczyć program przed podaniem takich samych liczb bo inaczej nie wylosuje:D
P-166859
mateczek
» 2017-11-13 19:42:45
program wydaje się być ok!!! funkcję czy była można by krócej zapisać, choć to bez znaczenia
C/C++
bool czybyla( int liczba, int tab[], int pom ) {
    for( int i = 0; i < pom; i++ ) {
        if( liczba == tab[ i ] ) return true;
       
    }
    return false;
}

jeśli chcesz zabezpieczyć przed podaniem takich samych liczb, To wywołuj czyByła() przy wczytywaniu tak by wyeliminować duble!!! Lub zamiast sprawdzać liczby, sprawdzaj index.

W sensie: "czyBył index" zamiast "czyByła liczba".

Zależy czy chcesz mieć unikatowe liczby?? czy unikatowe indexy??

C/C++
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
int main() {
    srand( time( 0 ) );
    vector < int > tablica = { 1, 2, 3, 4, 4, 3, 3, 1, 8, 8 };
    for( int i = 0; i < 8; i++ ) {
        int index = rand() % tablica.size();
        cout << "wylosowałem liczbę " << tablica[ index ] << endl;
        //kasuje z tablicy wylosowaną liczbę
        tablica.erase( tablica.begin() + index );
    }
   
    //w tablicy zostało
    cout << "\nw tablicy zostalo: " << endl;
    for( int i = 0; i < tablica.size(); i++ )
         cout << tablica[ i ] << " ";
   
}
P-166860
marcinpro
Temat założony przez niniejszego użytkownika
» 2017-11-13 19:50:38
Dzięki za porady, nie doszedłem jescze do działania petli for. Będę miał ją w następnej lekcji. Ten "vector" Też nie wiem co to jest :) Jestem na niskim poziomie korzystam z wiedzy tylko do tej części kursu. Dzięki za opinie. Nie chce unikalnych indeksów tylko liczby które podaje.




Hmmm tutaj jeszcze nie wiem dlaczego nie chce funkcja wywołać funkcji? Nie przekazuje tablicy?

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

using namespace std;

void podajliczbe( int liczby[] )
{
    int liczba = 0;
    int pom = 0;
   
    do
    {
       
        cout << "Podaj " << pom + 1 << " liczbe:" << endl;
        cin >> liczba;
        cin.clear();
        cin.sync();
       
        if( czybyla( liczba, liczby, pom ) == false )
        {
            liczby[ pom ] = liczba;
            pom++;
        } else
        {
            cout << "Podales ja ta liczbe, podaj inna:" << endl;
        }
       
    } while( pom < 10 );
   
}

void wysliczby( int liczby[] )
{
    int ile = 0;
    do
    {
        cout << "Liczby to:" << liczby[ ile ] << endl;
        ile++;
    } while( ile < 10 );
   
}

int losuj()
{
    int a =( rand() % 10 ) + 0;
    return a;
}

bool czybyla( int liczba, int tab[], int pom )
{
    if( pom <= 0 )
    {
        return false;
    }
    int a = 0;
    do
    {
        if( tab[ a ] == liczba )
        {
            return true;
        } else
        {
            a++;
        }
       
       
    } while( a < pom );
   
    return false;
}


void pokaz( int wylosowane[] )
{
    int ile = 0;
    do
    {
        cout << "Liczby to:" << wylosowane[ ile ] << endl;
        ile++;
    } while( ile < 8 );
   
}



int main()
{
    srand( time( 0 ) );
    int liczby[ 10 ];
    int wylosowanych = 0;
    int wylosowane[ 8 ];
    int pom = 0;
    cout << "Podaj teraz 10 liczby, ktore potem wylosuje bez powtorzen" << endl;
    podajliczbe( liczby );
    wysliczby( liczby );
    cout << "Losujemy teraz 8 z 10 podanych bez powtorzenia" << endl;
    do
    {
        int liczba = liczby[ losuj() ];
        if( czybyla( liczba, wylosowane, pom ) == false )
        {
            wylosowane[ pom ] = liczba;
            pom++;
        }
    } while( pom < 8 );
   
    pokaz( wylosowane );
   
    return 0;
}
P-166861
mateczek
» 2017-11-13 20:28:21
funncja musi być znana przed wywołaniem ()
ablo zmień kolejność albo daj deklaracje zapowiadającą w stylu
C/C++
include < ctime >

using namespace std;
bool czybyla( int liczba, int tab[], int pom ); //deklaracja zapowiadająca
void podajliczbe( int liczby[] )
{
    int liczba = 0;
    int pom = 0;
    //[...]
P-166863
marcinpro
Temat założony przez niniejszego użytkownika
» 2017-11-14 06:17:50
Aha, taka sytuacja. Super teraz wiem cos dalej. Ok dzieki za pokierowanie. Na dniach przerabiam nastepne lekcje.
P-166866
mateczek
» 2017-11-14 14:47:01
no i tak na koniec mała uwaga. Losując 8 z 10 równie dobrze możesz wylosować 2 z 10 a pozostałe 8 tylko wypisać. ;) (oczywiście tylko gdy losowanie opisujemy przy pomocy kombinacji dwumianem newtona (liczy się losowana pula nie kolejność))
P-166876
« 1 »
  Strona 1 z 1