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

[Lekcja 21] Zadanie nr 1

Ostatnio zmodyfikowano 2015-11-07 01:16
Autor Wiadomość
maciaas87
Temat założony przez niniejszego użytkownika
[Lekcja 21] Zadanie nr 1
» 2015-11-06 23:29:03
Witam,
Mój kod poniżej. Problem polega na tym, że co któreś losowanie losuję mi liczbę, która nie została wpisana przez użytkownika do tablicy. Liczba wygląda jak jakieś śmieci z pamięci (np. liczba -83399.. na VisualStudio... albo liczba 2752912 na Code::Blocks). Poza tym mam problem z zabezpieczeniem programu przed wpisaniem litery. Za każdą literę jest podstawiana liczba "0" (nie było to wymagane w zadaniu, ale strasznie mnie irytuje to że nie mogę dojść do rozwiązania problemu.)
P.S. Proszę nie zwracać uwagi, że wprowadzenie danych nie jest przy użyciu funkcji. Zostanie to poprawione po wyeliminowaniu w/w błędów.

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

using namespace std;


int wylosuj( int tab[] )

{
    int losowana = rand() % 3;
    return tab[ losowana ];
   
}


bool prawdy( int wylosuj, int tab2[], int ile )
{
    if( ile <= 0 )
         return 0;
   
    int i = 0;
    do
    {
        if( tab2[ i ] == wylosuj )
             return true;
       
        i++;
       
    } while( i < ile );
   
    return false;
   
}


int main()

{
    srand( time( NULL ) );
    int tab[ 3 ];
   
   
    int tab2[ 2 ];
    int wylosowanych = 0;
   
   
    cout << " Podaj 3 liczby: " << endl;
    int i = 0;
    do
    {
        cin >> tab[ i ];
        cin.clear();
        cin.sync();
        i++;
    } while( i < 3 );
   
    if( cin.good() && tab[ 0 ] != tab[ 1 ] && tab[ 0 ] != tab[ 2 ] && tab[ 1 ] != tab[ 2 ] )
   
    {
       
        std::cout << "Podales nastepujace liczby: ";
        i = 0;
        do
        {
            std::cout << tab[ i ] << ", ";
            i++;
        } while( i < 3 );
       
        do
       
        {
            int liczba = wylosuj( tab );
            if( prawdy( liczba, tab2, wylosowanych ) == false )
                 tab2[ wylosowanych ] = liczba;
           
            wylosowanych++;
           
        } while( wylosowanych < 2 );
       
       
        cout << endl;
       
        cout << "Wylosowane liczby to: " << endl;
       
        i = 0;
        do
        {
            cout << tab2[ i ] << endl;
            i++;
        } while( i < 2 );
       
    }
    else
    {
        cout << "Wprowadziles kilka razy ta sama liczbe. Urucham program jeszcze raz.";
       
    }
   
    return 0;
}
P-139718
carlosmay
» 2015-11-07 00:05:58
C/C++
do

{
    int liczba = wylosuj( tab );
    if( prawdy( liczba, tab2, wylosowanych ) == false )
         tab2[ wylosowanych ] = liczba;
   
    wylosowanych++; // <-- to powinno dzialac tylko gdy zapiszesz liczbe do tablicy
   
} while( wylosowanych < 2 );

 w tej pętli jest problem. Inkrementujesz nawet gdy liczba nie jest zapisana do tablicy.
P-139722
maciaas87
Temat założony przez niniejszego użytkownika
» 2015-11-07 00:29:47
C/C++
do

{
    int liczba = wylosuj( tab );
    if( prawdy( liczba, tab2, wylosowanych ) == false )
    { tab2[ wylosowanych ] = liczba;
        wylosowanych++; // <-- to powinno dzialac tylko gdy zapiszesz liczbe do tablicy
    }
} while( wylosowanych < 2 );


Dziękuje bardzo za pomoc - teraz nie ma problemu ze śmieciowymi liczbami... :)
Został jednak problem związany z blokadą charów... niestety ten moj "if" z cin.good() nie za bardzo chce działać i dalej działa mimo wpisania litery. Po prostu każdej literze przypisuje liczbę 0.
P-139726
carlosmay
» 2015-11-07 00:39:04
C/C++
int liczba;
if( cin >> liczba )
// przypisz liczbe do czegos
else {
    // liczba nie wczytana
    cin.clear();
    cin.ignore( 999999, '\n' ); }
 do tego czyszczenie strumienia
P-139727
maciaas87
Temat założony przez niniejszego użytkownika
» 2015-11-07 00:56:46
C/C++
do
{
    cin >> tab[ i ];
    if( cin.fail() )
    {
        cout << "Error - podales litere zamiast liczby" << endl;
        cin.clear();
        cin.sync();
        return false;
    }
    i++;
} while( i < 3 );


Dopisalem cos takiego... nie wiem czy do konca madrze, ale to dziala - wylacza program.

Nie rozumiem jednak wczesniejszego komentarza z przypisaniem liczby do czegos... moze dlatego ze juz pozna godzina - czy moglbys podac przyklad ? :)
P-139728
carlosmay
» 2015-11-07 01:13:11
Przykład:
C/C++
int tab[ 3 ];
int liczba;
if( cin >> liczba )
     tab[ 0 ] = liczba; // jesli udalo sie wczytac zapisz liczbe w tablicy ( = operator przypisania )
else {
    // liczba nie wczytana
    cin.clear();
    cin.ignore( 999999, '\n' ); }
 
Taka drobna funkcja do wczytywania podstawowych typów jak int, double czy char
razem z przykładem użycia. Jak masz ochotę to możesz to rozkminić.
C/C++
#include <iostream>
#include <cstdlib>
#include <limits>
#include <conio.h>
using namespace std;

template < typename T >
T GetData( const char * message, const char * errmesg ) // szablon funkcji
{
    bool ctrlErr = true; // kontrolka bledu
    T data = 0;
    do {
        while(( cout << message ) &&( cin >> data ) && ctrlErr ) // wczytaj dane
        {
            ctrlErr = false; // ustaw kontrolke na wyjsci
            cin.clear();
            if( cin.get() != '\n' ) { // jesli cos jest w strumieniu czysc
                cout << errmesg;
                cin.ignore( numeric_limits < streamsize >::max(), '\n' );
                ctrlErr = true; // i ustaw kontrolke na powtorzenie
                continue;
            }
            break;
        }
        if( !cin ) { // jesli nie udane wczytywanie czyszczenie i powtorz wczytywanie
            ctrlErr = true;
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        }
    } while( ctrlErr );
   
    return data; // wszystko OK, mozna zwrocic dane
}

int main()
{
    const char msg[] = { "Write data: " };
    const char errMsg[] = { "Error data. Once again: " }; // komunikaty
    int n;
    double d;
    char ch;
   
    n = GetData < int >( msg, errMsg ); // zapisz zwrot z funkcji do n, <int> to konkretyzacja na typ int
    cout << n << endl << endl;
   
    d = GetData < double >( msg, errMsg ); // <double> to konkretyzacja na typ double
    cout << d << endl << endl;
   
    ch = GetData < char >( msg, errMsg ); // <char> to konkretyzacja na typ char (wczytuje tylko jeden znak)
    cout << ch << endl;
   
    _getch();
    return 0;
}
 jak widać jedna funkcja obsługuje różne typy zmiennych, ale muszą być określone w tym przypadku (konkretyzacja).
P-139729
maciaas87
Temat założony przez niniejszego użytkownika
» 2015-11-07 01:16:20
dzięki za post - ide analizować :)
P-139730
« 1 »
  Strona 1 z 1