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

[Lekcja 21] Problem z zadaniem.

Ostatnio zmodyfikowano 2012-12-16 18:34
Autor Wiadomość
Reavey
Temat założony przez niniejszego użytkownika
[Lekcja 21] Problem z zadaniem.
» 2012-12-15 18:34:36
Witam.
Od dłuższego czasu męczę się z doprowadzeniem tego zadania do stanu, w którym by działało. Jednakże - bezskutecznie.
Czy mógłbym prosić o jakąś poradę, bądź o wskazanie błędów?
Z góry dziękuję.
Pozdrawiam.

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

//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.

using namespace std;

int wylosuj( int iTablica[] )
{
    return iTablica[( rand() % 3 ) + 0 ];
}

bool sprawdzenie( int iLiczba, int tab[], int miejsca )
{
   
    if( miejsca <= 0 )
         return false;
   
    int i = 0;
   
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    }
    while( i < miejsca );
   
    return false;
}

int main()
{
    srand( time( NULL ) );
    int a, b, c;
    int tablica[ 3 ];
    cout << "Podaj 3 liczby calkowite: " << endl;
    cin >> a;
    a = tablica[ 0 ];
    cin >> b;
    b = tablica[ 1 ];
    cin >> c;
    c = tablica[ 2 ];
   
    int pom = 0;
   
    do
    {
        int liczba = wylosuj( tablica );
        if( sprawdzenie( liczba, tablica, 2 ) == false )
        {
            cout << liczba << endl;
            pom++;
        }
    }
    while( pom < 2 );
   
    system( "Pause" );
    return 0;
}
P-71119
Admixior
» 2012-12-15 22:22:29
Programowanie jest trochę luźniejsze i bardziej intuicyjne niż C się wydaje (to nie assembly):
( rand() % 3 ) + 0  //po co robisz +0  ??

C/C++
cin >> a;
a = tablica[ 0 ];
//możesz przecież:
cin >> tablica[ 0 ];
//albo nawet
cin >> tablica; //wtedy wczyta ci się do tablicy tyle znaków ile user poda "po spacji" do entera (miejmy nadzieje że za dużo nie poda)

Po za tym twój algorytm w ogóle coś jest zły (mam dokładnie na myśli funkcje sprawdzenie())
Najpierw losujesz liczbę później funkcja sprawdzenie sprawdza czy jest ona na zerowym (indeksowanie od zera) miejscu jeśli tak to zwraca true.. później sprawdza i robi to samo dla 1 miejsca w tablicy. Czyli można wywnioskować, że najpierw losuje liczbę z 3 elementowej tablicy i później sprawdza czy jest ona na którymś z 2 pierwszych miejsc. Jeśli tak to jeszcze raz. Czyli powinno wypisać 2 razy ostatnią liczbę.
P-71136
Berux
» 2012-12-15 22:29:22
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

//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.

using namespace std;

int wylosuj()
{
    return( rand() % 3 ) + 0; // tutaj nie potrzebnie zwracałeś element tablicy
}

bool sprawdzenie( int iLiczba, int tab[], int miejsca )
{
   
    if( miejsca <= 0 )
         return false;
   
    int i = 0;
   
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    }
    while( i < miejsca );
   
    return false;
}

int main()
{
    srand( time( NULL ) );
    int a, b, c;
    int tablica[ 3 ];
    cout << "Podaj 3 liczby calkowite: " << endl;
    cin >> tablica[ 0 ];
   
    cin >> tablica[ 1 ];
   
    cin >> tablica[ 2 ];
   
   
    int pom = 0;
   
    do
    {
        int liczba = wylosuj();
        if( sprawdzenie( liczba, tablica, pom ) == false ) //tutaj nie mogło być 2, bo nigdy by w sprawdzenie() nie zwróciło false
        {
            cout << tablica[ liczba ] << endl;
            pom++;
        }
    }
    while( pom < 2 );
   
    system( "Pause" );
    return 0;
}
 
P-71137
Reavey
Temat założony przez niniejszego użytkownika
» 2012-12-15 22:45:33
Dziękuję za odpowiedzi, ale mam jedno pytanie.
Skoro w moim kodzie w funkcji main() przy sprawdzaniu, czy liczba nie została wylosowana, nie może wystąpić wartość "2", to w tym:
» Kurs C++ » Poziom 2Losowanie bez powtórzeń lekcja
rozdziale, co oznacza zmienna "ile" w funkcji "czyBylaWylosowana()" ?
Prawdę mówiąc, od początku miałem z tym problem. Jest to ilość "zajętych" miejsc w tabeli, czy ich maksymalna ilość? A może coś zupełnie innego?
Pozdrawiam.
P-71139
Berux
» 2012-12-15 23:00:01
Jest to ilość wylosowanych już liczb
P-71142
Reavey
Temat założony przez niniejszego użytkownika
» 2012-12-16 18:34:06
Przepraszam za zawracanie głowy, ale ciągle czegoś nie rozumiem.
Mianowicie, oto moja funkcja, która sprawdza, czy liczba nie została już wylosowana:
C/C++
bool sprawdzenie( int iLiczba, int tab[], int elem )
{
   
    if( elem <= 0 )
         return false;
   
    int i = 0;
   
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    }
    while( i < elem );
   
    return false;
}

A tutaj jest jej zastosowanie:
C/C++
do
{
    int liczba = wylosuj();
    if( sprawdzenie( liczba, tablica, pom ) == false )
    {
        cout << tablica[ liczba ] << endl;
        pom++;
    }
}
while( pom < 2 );


Jeżeli funkcja
wylosuj()
 zwraca wartość od 0 do 2 i ta wartość jest podstawiana jako zmienna
liczba
, to jakim prawem ten cały program działa, skoro w tym:
C/C++
if( tab[ i ] == iLiczba )
     return true;

miejscu wartość danego elementu w owej tablicy nigdy nie będzie równa tej liczbie?
np.
tab[ 0 ]
 nigdy nie będzie równy
1
 o ile użytkownik nie poda takich liczb.

Przepraszam jeszcze raz za zawracanie głowy.
Pozdrawiam.
P-71209
« 1 »
  Strona 1 z 1