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

Lekcja 17 - Kalkulator z wczytywaniem liczb i operatora.

Ostatnio zmodyfikowano 2017-11-12 14:27
Autor Wiadomość
marcinpro
Temat założony przez niniejszego użytkownika
Lekcja 17 - Kalkulator z wczytywaniem liczb i operatora.
» 2017-11-04 12:13:38
Witam,

Sprawdziłby ktoś czy ten kal spełnia wytyczne i na co zwrócić uwagę, że lepiej pisać prog.

C/C++
#include <iostream>

using namespace std;

int wczytajliczbe()
{
    int a;
    bool spr;
    do {
        cin >> a;
        spr = cin.good();
        if( spr == 0 )
             cout << "Podales bledna liczbe! Podaj poprawna:";
       
        cin.clear();
        cin.sync();
       
    } while( spr == 0 );
   
    return a;
}

int sproperatora()
{
    int a;
    bool spr;
    cout << "Wybierz opcje: ";
    do {
        cin >> a;
        if( a > 0 && a < 7 ) {
            spr = true;
            cout << "Wybrales: ";
        }
        else {
            cout << "Podales bledny operator! Podaj jeszcze raz:";
            spr = false;
            cin.clear();
            cin.sync();
        }
    } while( spr != true );
   
    return a;
}


int main()

{
   
    int a, b, c; // zmienne
   
    do {
       
        cout << " Kalkulator by Ziolo" << endl;
        cout << " [1] Dodawanie" << endl;
        cout << " [2] Odejmowanie" << endl;
        cout << " [3] Mnozenie" << endl;
        cout << " [4] Dzielenie" << endl;
        cout << " [5] Reszta z dzielenia" << endl;
        cout << " [6] Rezygnuj" << endl;
        c = sproperatora();
        cout << endl;
       
       
       
        switch( c )
        {
           
        case 1:
            cout << " [1] Dodawanie" << endl;
            cout << "Podaj liczbe a:";
            a = wczytajliczbe();
            cout << "Podaj liczbe b:";
            b = wczytajliczbe();
            cout << "Wynik = " << a + b << endl;
           
            break;
           
        case 2:
            cout << " [2] Odejmowanie" << endl;
            cout << "Podaj liczbe a:";
            a = wczytajliczbe();
            cout << "Podaj liczbe b:";
            b = wczytajliczbe();
            cout << "Wynik = " << a - b << endl;
            break;
           
        case 3:
            cout << " [3] Mnozenie" << endl;
            do {
                cout << "Podaj liczbe a:";
                a = wczytajliczbe();
                cout << "Podaj liczbe b:";
                b = wczytajliczbe();
                if( a != 0 && b != 0 )
                     cout << "Wynik = " << a * b << endl;
                else {
                    cout << "Jak mnozysz przez zero glabie to masz zero!" << endl;
                    cout << "Podaj dobre!" << endl;
                }
            } while( a == 0 || b == 0 );
           
            break;
           
        case 4:
            cout << " [4] Dzielenie" << endl;
            do {
                cout << "Podaj liczbe a:";
                a = wczytajliczbe();
                cout << "Podaj liczbe b:";
                b = wczytajliczbe();
                if( b != 0 )
                     cout << "Wynik = " << a / b << endl;
                else {
                   
                    cout << "Nie dizelimy przez zero!" << endl;
                    cout << "Wroc sie do podstawowki!" << endl;
                }
            } while( b == 0 );
           
            break;
           
        case 5:
            cout << " [5] Reszta z dzielenia" << endl;
            do {
                cout << "Podaj liczbe a:";
                a = wczytajliczbe();
                cout << "Podaj liczbe b:";
                b = wczytajliczbe();
                if( b != 0 )
                     cout << "Wynik = " << a % b << endl;
                else {
                   
                    cout << "Nie dizelimy przez zero!" << endl;
                    cout << "Wroc sie do podstawowki!" << endl;
                }
            } while( b == 0 );
           
            break;
           
           
        }
       
    } while( c != 6 );
   
    return 0;
   
}
P-166450
YooSy
» 2017-11-04 14:47:14
cin.sync()
zamienić na
std::cin.ignore()
.

Podzielić kod na funkcje. Są powtarzające się fragmenty.

Pobieranie liczb może być w jednym miejscu. Przed wykonaniem się instrukcji
switch
.
P-166458
marcinpro
Temat założony przez niniejszego użytkownika
» 2017-11-04 18:01:56
Z tym cin'em to też stosować na windowsie
cin.ignore()
?

Sugerujesz, żeby najpierw wczytywać liczby, a dopiero potem wybierać co z nimi będziemy robić.

Zastanawiam się gdzie jeszcze dodałbyś funkcje? Pewnie tam gdzie nie można użyć zero?

Pozdrawiam
P-166469
YooSy
» 2017-11-04 18:59:41
Metoda
ignore()
 służy do odrzucania danych z bufora strumienia wejściowego,
natomiast działaniem ubocznym metody
sync()
 jest oczyszczanie i zależy od implementacji.

Można zrobić to w dokładnie tej samej kolejności, jak jest teraz.
C/C++
c = sproperatora();
a = wczytajliczbe();
b = wczytajliczbe();
// ...
switch( c )
//...
W instrukcji switch wywołujesz tylko odpowiednie funkcje.

Napisałbym dla każdej operacji osobną funkcję lub napisał jedną, która przyjmie jako w argumentach
operandy oraz znak działania, choć ta pierwsza opcja wydaje się czytelniejsza i łatwiejsza w utrzymaniu.



P-166471
marcinpro
Temat założony przez niniejszego użytkownika
» 2017-11-04 21:03:48
Ok, zrobiłem fukcje na każde działanie:

C/C++
#include <iostream>

using namespace std;

int wczytajliczbe()
{
    int a;
    bool spr;
    do {
        cin >> a;
        spr = cin.good();
        if( spr == 0 ) {
            cout << "Podales bledna liczbe! Podaj poprawna:";
            cin.clear();
            cin.ignore();
        }
    } while( spr == 0 );
   
    return a;
}

int sproperatora()
{
    char a;
    bool spr;
    cout << "Wybierz opcje: ";
    do {
        cin >> a;
        if( a == '+' || a == '-' || a == '*' || a == '/' || a == '%' || a == 'X' ) {
            spr = true;
        }
        else {
            cout << "Podales bledny operator! Podaj jeszcze raz:";
            spr = false;
            cin.clear();
            cin.ignore();
        }
    } while( spr != true );
   
    return a;
}

int dodawanie( int a, int b )
{
    int wynik;
    wynik = a + b;
    return wynik;
}
int odejmowanie( int a, int b )
{
    int wynik;
    wynik = a + b;
    return wynik;
}
int mnozenie( int a, int b )
{
    int wynik;
    wynik = a * b;
    return wynik;
}

int dzielenie( int a, int b )
{
    int wynik;
    wynik = a / b;
    return wynik;
}

int reszta( int a, int b )
{
    int wynik;
    wynik = a % b;
    return wynik;
}

int main()

{
   
    int a, b, wynik; // zmienne
    char c;
    do {
       
        cout << " Kalkulator by Ziolo" << endl;
        cout << " [+] Dodawanie" << endl;
        cout << " [-] Odejmowanie" << endl;
        cout << " [*] Mnozenie" << endl;
        cout << " [/] Dzielenie" << endl;
        cout << " [%] Reszta z dzielenia" << endl;
        cout << " [X] Rezygnuj" << endl;
       
        c = sproperatora();
        cout << endl;
        cout << "Podaj liczbe a:";
        a = wczytajliczbe();
        cout << "Podaj liczbe b:";
        b = wczytajliczbe();
       
        switch( c )
        {
           
        case '+':
           
            wynik = dodawanie( a, b );
            cout << " [+] Dodawanie" << endl;
            cout << "Wynik = " << wynik << endl;
           
            break;
           
        case '-':
           
            wynik = odejmowanie( a, b );
            cout << " [-] Odejmowanie" << endl;
            cout << "Wynik = " << wynik << endl;
           
            break;
           
        case '*':
           
            wynik = mnozenie( a, b );
            cout << " [*] Mnozenie" << endl;
            cout << "Wynik = " << wynik << endl;
           
            break;
           
        case '/':
            wynik = dzielenie( a, b );
            cout << " [/] Dzielenie" << endl;
            cout << "Wynik = " << wynik << endl;
           
            break;
           
        case '%':
            wynik = reszta( a, b );
            cout << " [%] Reszta z dzielenia" << endl;
            cout << "Wynik = " << wynik << endl;
           
        }
    } while( c != 'X' );
   
    return 0;
   
}




Zastanowię się jutro jak rozwiązać problem z dzieleniem i resztą przez 0 i jak pominąć problem zamykania programu, żęby bez sensu licznie podawać.

OK to jeszcze dzisiaj zrobiłem

C/C++
if( c != 'X' ) {
    cout << "Podaj liczbe a:";
    a = wczytajliczbe();
    cout << "Podaj liczbe b:";
    b = wczytajliczbe();
}
P-166476
YooSy
» 2017-11-04 21:15:30
Kilka podpowiedzi, jak to skrócić:
C/C++
int dodawanie( int a, int b )
{
    return a + b;
}

// ...

case '+':
cout << " [+] Dodawanie" << endl;
cout << "Wynik = " << dodawanie( a, b ) << endl;

rozwiązać problem z dzieleniem i resztą
Musisz zmienić zwracany typ, oraz typy operandów przekazywanych do funkcji na typ zmiennoprzecinkowy.

przez 0
Wystarczy w funkcji sprawdzić ifem czy b jest równe 0 i wypisać stosowny komunikat oraz zwrócić 0.
P-166477
marcinpro
Temat założony przez niniejszego użytkownika
» 2017-11-05 09:20:26
Ok, bo chciałem zrobić coś na zasadzie, żeby jak poda zero to mógł się poprawić. Poprawiłem kod i zmieniłem typy zmmiennych, ale teraz nie wiem jak zrobić resztę z dzielenia na zmienno przecinkowych :D
C/C++
#include <iostream>

using namespace std;



float wczytajliczbe()
{
    float a;
    bool spr;
    do {
        cin >> a;
        spr = cin.good();
        if( spr == false ) {
            cout << "Podales bledna liczbe! Podaj poprawna:";
            cin.clear();
            cin.ignore();
        }
    } while( spr == false );
   
    return a;
}

int sproperatora()
{
    char a;
    bool spr;
    cout << "Wybierz opcje: ";
    do {
        cin >> a;
        if( a == '+' || a == '-' || a == '*' || a == '/' || a == '%' || a == 'X' || a == 'x' ) {
            spr = true;
        }
        else {
            cout << "Podales bledny operator! Podaj jeszcze raz:";
            spr = false;
            cin.clear();
            cin.ignore();
        }
    } while( spr != true );
   
    return a;
}

float dodawanie( float a, float b )
{
    return a + b;
}
float odejmowanie( float a, float b )
{
    return a - b;
}
float mnozenie( float a, float b )
{
    return a * b;
}

float dzielenie( float a, float b )
{
    if( b == 0 ) {
        return 0;
    } else {
        return a / b;
    }
}

float reszta( float a, float b )
{
    if( b == 0 ) {
        return 0;
    } else {
    }
    return a % b;
}

int main()

{
   
    float a, b; // zmienne
    char c;
    do {
        cout << endl;
        cout << " Kalkulator by Ziolo" << endl;
        cout << " [+] Dodawanie" << endl;
        cout << " [-] Odejmowanie" << endl;
        cout << " [*] Mnozenie" << endl;
        cout << " [/] Dzielenie" << endl;
        cout << " [%] Reszta z dzielenia" << endl;
        cout << " [X] Rezygnuj" << endl;
       
        c = sproperatora();
        cout << endl;
        if( c != 'X' && c != 'x' ) {
            cout << "Podaj liczbe a:";
            a = wczytajliczbe();
            cout << "Podaj liczbe b:";
            b = wczytajliczbe();
        }
        switch( c )
        {
           
        case '+':
            cout << " [+] Dodawanie" << endl;
            cout << "Wynik = " << dodawanie( a, b ) << endl;
           
            break;
           
        case '-':
            cout << " [-] Odejmowanie" << endl;
            cout << "Wynik = " << odejmowanie( a, b ) << endl;
           
            break;
           
        case '*':
            cout << " [*] Mnozenie" << endl;
            cout << "Wynik = " << mnozenie( a, b ) << endl;
           
            break;
           
        case '/':
            cout << " [/] Dzielenie" << endl;
            if( dzielenie( a, b ) == 0 ) {
                cout << "Nie dzielimy przez 0!" << endl;
            } else {
                cout << "Wynik = " << dzielenie( a, b ) << endl;
            }
           
            break;
           
        case '%':
            cout << " [%] Reszta z dzielenia" << endl;
            if( reszta( a, b ) == 0 ) {
                cout << "Nie dzielimy przez 0!" << endl;
            } else {
                cout << "Wynik = " << reszta( a, b ) << endl;
            }
        }
    } while( c != 'X' && c != 'x' );
   
    return 0;
   
}
P-166479
YooSy
» 2017-11-05 09:56:23
teraz nie wiem jak zrobić resztę z dzielenia na zmienno przecinkowych
Mój błąd. Słabo wyszło z tym tłumaczeniem. Mam na myśli działanie przedstawione w
kodzie poniżej.
C/C++
#include <iostream>

int addition( int lhs, int rhs )
{
    return lhs + rhs;
}

double division( double lhs, double rhs )
{
    if( rhs ) {
        return lhs / rhs;
    }
    return 0.0;
}

int modulo( int lhs, int rhs )
{
    return lhs % rhs;
}

int main()
{
    // menu
    char oper = '%'; // sprawdź też dla '+', '/'
    int a = 5;
    int b = 10;
   
    switch( oper ) {
    case '+':
        std::cout << addition( a, b ) << std::endl;
        break;
    case '/':
        std::cout << division( a, b ) << std::endl;
        break;
    case '%':
        std::cout << modulo( a, b ) << std::endl;
        default:
        break;
    }
}
Przy przekazaniu liczb typu
int
 do funkcji
division
 nastąpi niejawna konwersja
na typ
double
.
Można też jawnie rzutować wewnątrz funkcji.
C/C++
double division( int lhs, int rhs )
{
    if( rhs ) {
        return static_cast < double >( lhs ) / rhs; // wystarczy, że jeden operand będzie double
    }
    return 0.0;
}

I dodatkowo reszta z dzielenia liczb zmiennoprzecinkowych » standard Cfmod.
P-166480
« 1 » 2
  Strona 1 z 2 Następna strona