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

tabelka + i -

Ostatnio zmodyfikowano 2013-03-23 15:34
Autor Wiadomość
tylkolegia
Temat założony przez niniejszego użytkownika
tabelka + i -
» 2013-03-22 13:11:59
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

#define ILOSC_PYTAN   10
#define ILOSC_TESTOW  2

enum Symbol { e, a, b, c, d };

void Wyswietlaj( Symbol x );
Symbol ElementPrzeciwny( Symbol x );
int SprawdzCzyMozna( Symbol poz_1, char znak, Symbol poz_2 );

struct Pytanie
{
    char OperatorDzialania;
    Symbol WynikDzialania;
};

Pytanie ZbiorPytan[ ILOSC_PYTAN ] = {
    { '+', a }, { '-', c }, { '+', e }, { '-', d }, { '+', b },
    { '-', a }, { '+', c }, { '-', e }, { '+', d }, { '-', b } };

Symbol TabDodawania[ 5 ][ 5 ] =
{
    { e, a, b, c, d },
    { a, b, c, d, e },
    { b, c, d, e, a },
    { c, d, e, a, b },
    { b, c, d, e, a }
};

Symbol operator +( Symbol x, Symbol y )
{
    return TabDodawania[ x ][ y ];
}

Symbol operator -( Symbol x, Symbol y )
{
    Symbol przeciwna = e;
    while( y + przeciwna != e )
         przeciwna = przeciwna + a;
   
    return x + przeciwna;
}

istream & operator >>( istream & StrmWej, Symbol & WczytSym )
{
    Symbol TabSymboli[] = { a, b, c, d, e };
    char ZnakSymbolu;
   
    StrmWej >> ZnakSymbolu;
    if( ZnakSymbolu <= 'a' && 'e' >= ZnakSymbolu )
    {
        cerr << "Blad! Wprowadzony znak nie odpowiada zadnemu symbolowi" << endl;
        exit( 1 );
    }
    WczytSym = TabSymboli[ ZnakSymbolu - 'a' ];
    return StrmWej;
}


ostream & operator <<( ostream & StrmWyj, Symbol x )
{
    StrmWyj << "eabcd"[ x ];
    return StrmWyj;
}


void Wyswietlaj( Symbol x )
{
    if( x == a )
         cout << 'a';
   
    if( x == b )
         cout << 'b';
   
    if( x == c )
         cout << 'c';
   
    if( x == d )
         cout << 'd';
   
    if( x == e )
         cout << 'e';
   
}

int SprawdzCzyMozna( Symbol poz_1, char znak, Symbol poz_2 )

{
    int czy_blad = 0;
   
    if( poz_1 != 'a' && poz_1 != 'b' && poz_1 != 'c' && poz_1 != 'd' && poz_1 != 'e' )
    {
        czy_blad = 1;
       
        cout << "ZLE - symbol '" << poz_1 << "' jest niepoprawny" << endl;
        cout << "masz wpisac a,b,c,d albo e " << endl;
        cout << "Popraw to" << endl;
    }
   
    if( znak != '+' && znak != '-' )
    {
        czy_blad = 1;
       
        cout << "ZLE - znak '" << znak << "' jest niepoprawny" << endl;
        cout << "masz wpisac znak + lub - " << endl;
        cout << "Popraw to" << endl;
    }
   
    if( poz_2 != 'a' && poz_2 != 'b' && poz_2 != 'c' && poz_2 != 'd' && poz_2 != 'e' )
    {
        czy_blad = 1;
       
        cout << "ZLE - symbol '" << poz_2 << "' jest niepoprawny" << endl;
        cout << "masz wpisac a,b,c,d albo e" << endl;
        cout << "Popraw to" << endl;
    }
   
    return czy_blad;
   
}


int main()
{
   
    Symbol poz_1, poz_2;
    char znak;
    int czy_dobrze = 0;
    int zle_odpowiedzi;
    float wynik_procentowy;
   
    srand( time( 0 ) );
   
    for( int j = 0; j < ILOSC_TESTOW; j++ )
    {
        int i = rand() % 10;
       
        if( ZbiorPytan[ i ].OperatorDzialania == '+' )
       
        {
            cout << "Podaj operacje dodawania, ktorej wynikiem jest: ";
            Wyswietlaj( ZbiorPytan[ i ].WynikDzialania );
            cout << endl;
           
            do
           
            {
                cout << "Twoja odpowiedz to: ";
                cin >> poz_1;
                cin >> znak;
                cin >> poz_2;
            }
           
            while( SprawdzCzyMozna( poz_1, znak, poz_2 ) == 0 );
           
           
            if(( poz_1 + poz_2 ) == ZbiorPytan[ i ].WynikDzialania && znak == '+' )
           
            {
                czy_dobrze++;
                cout << "Odpowiedziales poprawnie";
                cout << endl;
            }
           
            else
           
            {
                cout << "ZLE - wynikiem tej operacji jest: ";
                Wyswietlaj( poz_1 + poz_2 );
                cout << endl;
            }
        }
       
        else
       
        {
            cout << "Podaj operacje odejmowania, ktorej wynikiem jest: ";
            Wyswietlaj( ZbiorPytan[ i ].WynikDzialania );
            cout << endl;
           
            do
           
            {
                cout << "Twoja odpowiedz to: ";
                cin >> poz_1;
                cin >> znak;
                cin >> poz_2;
            }
           
            while( SprawdzCzyMozna( poz_1, znak, poz_2 ) == 0 );
           
            if(( poz_1 - poz_2 ) == ZbiorPytan[ i ].WynikDzialania && znak == '-' )
           
            {
                czy_dobrze++;
                cout << "Odpowiedziales poprawnie";
                cout << endl;
            }
           
            else
           
            {
                cout << "ZLE - wynikiem tej operacji jest: ";
                Wyswietlaj( poz_1 - poz_2 );
                cout << endl;
            }
        }
       
        zle_odpowiedzi = ILOSC_TESTOW - czy_dobrze;
        wynik_procentowy =( czy_dobrze * 100 ) / ILOSC_TESTOW;
       
    }
    cout << endl << "Koniec testu" << endl <<
    endl;
    cout << "Dobre odpowiedzi: " << czy_dobrze <<
    endl;
    cout << "Zle odpowiedzi: " << zle_odpowiedzi <<
    endl;
    cout << "Wynik procentowy poprawnych odpowiedzi: " <<
    wynik_procentowy << "%" << endl;
    cout << "Tyle statystyk, dzieki!" << endl;
}



Program kompiluje sie bez zastrzezen ( prawie ) w visuala i dziala, natomiast nawet jesli wprowadzam dobre symbole to i tak za kazdym razem wyskakuje "ZLE - wprowadziles bledny symbol " i to 2 razy :/
Problem tkwi w funkcji SprawdzCzyMozna, jest zle chyba wkomponowana w calosc, nie wiem czy to
while( SprawdzCzyMozna( poz_1, znak, poz_2 ) == 0 );
 tak moze byc wpiete do maina, licze na pomoc.
P-79113
Monika90
» 2013-03-23 08:17:43
To
if( ZnakSymbolu <= 'a' && 'e' >= ZnakSymbolu )
 jest źle, pewnie chodziło ci o:
if( ZnakSymbolu < 'a' || ZnakSymbolu > 'e' )
.

A tutaj
if( poz_1 != 'a' && poz_1 != 'b' && poz_1 != 'c' && poz_1 != 'd' && poz_1 != 'e' )
 porównujesz Symbol z kodami znaków, a powninieneś porónywać z enumami e,a,b,c,d.
Zresztą, w ogóle to sprawdzanie jest nie potrzebne, bo przecież operator>> przerywa program gdy user wprowadzi niepoprawny znak.
P-79178
tylkolegia
Temat założony przez niniejszego użytkownika
» 2013-03-23 15:34:45
OK poradzilem juz sobie dzieki ;)
P-79221
« 1 »
  Strona 1 z 1