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

Losowanie bez powtórzeń. Kurs, zadanie domowe nr 1.

Ostatnio zmodyfikowano 2014-02-01 21:22
Autor Wiadomość
blazerek
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń. Kurs, zadanie domowe nr 1.
» 2014-01-25 19:10:25
Treść zadania.
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.

Bardzo długo szukałem błędu w kodzie. Podstawiałem liczby i krok po kroku obserwowałem co się z nimi stanie, ale nie mogę znaleźć przyczyny. Program czasem wypisuje powtarzające się liczby. Z góry dziękuje za pomoc.


C/C++
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int a = 0;
int ta[ 3 ];
int wynik[ 2 ];
int m;
int wczytanie( int tab[ 3 ] )
{
    cout << "Podaj 3 liczby " << endl;
    for( int i = 0; i < 3; i++ )
    {
        cin >> tab[ i ];
        ta[ a ] = tab[ i ];
        a++;
    }
}

int czybylawylosowana( int liczba1, int kl, int ta1[ 3 ] )
{
    int i = 0;
    if( kl <= 0 ) return false;
   
    do
    {
        if( liczba1 == ta1[ i ] ) return true;
       
        i++;
       
    }
    while( i < kl );
   
   
    return false;
}


int main()
{
    srand( time( NULL ) );
    int tablica[ 3 ];
    int k = 0;
    int liczba;
    wczytanie( tablica );
    cout << "##################" << endl;
    for( int i = 0; i < 3; i++ )
    {
        cout << ta[ i ] << endl;
    }
    cout << "###################" << endl;
    do
    {
        m =( rand() % 3 ) + 0;
        liczba = ta[ m ];
        if( czybylawylosowana( liczba, k, ta ) == false )
        {
            wynik[ k ] = liczba;
            cout << wynik[ k ] << endl;;
            k++;
        }
       
    }
    while( k < 2 );
   
    system( "pause" );
   
}
P-103179
DejaVu
» 2014-01-27 14:53:45
Tablice globalne to zło. Źle zabrałeś się za zadanie. W kodzie nie powinno być żadnej tablicy globalnej. Ponadto zapisujesz i czytach dane z innych tablic.
P-103313
leon_w
» 2014-01-27 17:18:48
Poza tym nawet by to działało, gdybyś do funkcji sprawdzającej wysyłał tablicę "wynik", zamiast tablicy gdzie wpisuje się liczby.
P-103334
blazerek
Temat założony przez niniejszego użytkownika
» 2014-01-29 20:10:58
Dzięki za odpowiedzi. Poprawiłem zadanie nie używając tablic globalnych(kod poniżej). Teraz działa, ale mam 2 pytania.
1. Dlaczego tablice globalne to zło?
2. Czy w poniższym kodzie popełniłem jeszcze jakieś karygodne błędy, które powinienem poprawiać?
C/C++
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void wczytanie( int tablica[] )
{
    cout << "podaj 3 liczby" << endl;
    for( int i = 0; i < 3; i++ )
    {
        cin >> tablica[ i ];
    }
   
}
int sprawdzenie( int tablica[], int n, int liczb1, int wynik1[] )
{
    if( liczb1 <= 0 ) return false;
   
    if( tablica[ n ] == wynik1[ 0 ] ) return true;
   
    return false;
   
}

int main()
{
    srand( time( NULL ) );
    int tab[ 3 ];
    int liczb = 0;
    int wynik[ 2 ];
    wczytanie( tab );
    cout << "########" << endl;
    int m;
   
    do {
        m =( rand() % 3 ) + 0;;
       
        if( sprawdzenie( tab, m, liczb, wynik ) == false )
        {
            wynik[ liczb ] = tab[ m ];
            cout << wynik[ liczb ] << endl;
            liczb++;
        }
       
    }
    while( liczb < 2 );
   
    return 0;
}
[ / cpp }
P-103545
Deyvin
Zmiana typu
» 2014-01-31 10:46:00
Cześć. Według mnie mógłbyś jeszcze zmienić typ funkcji "sprawdzenie" z int na bool.
Jeśli źle prawię proszę mnie poprawić :)
P-103674
ktos-tam
» 2014-02-01 21:22:40
1. Bo zżerają RAM i muszą istnieć przez cały czas pracy programu.
P-103790
« 1 »
  Strona 1 z 1