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

Problem z drugim zadaniem domowym w Rozdziale 15.

Ostatnio zmodyfikowano 2016-07-10 20:45
Autor Wiadomość
Rss
» 2016-07-10 18:18:32
Być może trochę późno piszę (6 dni po ostatniej odpowiedzi). Poniżej wklejam kod, który ja skonstruowałam. Dodałam sobie ułamek. Działa, tylko mam jeden problem. Otóż zabezpieczyłam program przed wprowadzeniem z klawiatury innej liczby niż do wyboru działania (1-9). Zabezpieczenie nie działa dla np '555'. '555' czyta jako 5 i wykonuje działanie. Jak się tego pozbyć?


C/C++
#include <iostream>
#include <math.h>

using namespace std;

long double a, b;
char wybor;

int main()
{
    do {
        cout << "Podaj liczbe a: ";
        cin.clear();
        cin.sync();
       
    } while(( !( cin >> a ) ) ||( a == 0 ) );
   
   
    do {
        cout << "Podaj liczbe b: ";
        cin.clear();
        cin.sync();
       
    } while(( !( cin >> b ) ) ||( b == 0 ) );
   
   
   
    do {
        cout << "Wybierz jakie dzialanie chcesz wykonac na wybranych liczbach:" << endl;
        cout << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl;
        cout << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Ulamek z liczby a" << endl << "[6] Ulamek z liczby b" << endl << "[7] Rezygnuj" << endl;
        cin >> wybor;
       
       
        switch( wybor ) {
        case '1':
           
            cout << "Wynik dodawania: " <<( a + b ) << endl;
            break;
           
        case '2':
           
            cout << "Wynik odejmowania: " <<( a - b ) << endl;
            break;
           
        case '3':
           
            cout << "Wynik mnozenia: " <<( a * b ) << endl;
            break;
           
        case '4':
           
            cout << "Wynik dzielania: " <<( a / b ) << endl;
            break;
           
           
        case '5':
           
            cout << "Ulamek z liczby a: " <<( sqrt( a ) ) << endl;
            break;
           
        case '6':
           
            cout << "Ulamek z liczby b: " <<( sqrt( b ) ) << endl;
            break;
           
        case '7':
           
            cout << "Rezygnujesz z dzialan" << endl;
            break;
           
           
        default:
           
            cout << "Nie wybrales zadnej opcji" << endl;
            cin.clear();
            cin.sync();
            break; } } while(( !( wybor == '1' ) ) &&( !( wybor == '2' ) ) &&( !( wybor == '3' ) ) &&( !( wybor == '4' ) ) &&( !( wybor == '5' ) ) &&( !( wybor == '6' ) ) &&( !( wybor == '7' ) ) );
   
   
   
   
   
   
    return 0;
   
}

W tym momencie 'poradziłam' sobie z tym zmieniając nieco kod.
C/C++
do {
    cout << "Wybierz jakie dzialanie chcesz wykonac na wybranych liczbach:" << endl;
    cout << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl;
    cout << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Ulamek z liczby a" << endl << "[6] Ulamek z liczby b" << endl << "[7] Rezygnuj" << endl;
    wybor = getch();

Czyli dałam sobie getch(). Przez co zaraz po wprowadzeniu prawidłowej liczby wyświetla się działanie do niej zdefiniowane. Jednak nadal nurtuje mnie to jak się pozbyć tego błędu w mojej pierwotnej wersji kodu?
P-149812
carlosmay
» 2016-07-10 18:53:43
Zabezpieczenie nie działa dla np '555'. '555' czyta jako 5 i wykonuje działanie. Jak się tego pozbyć?
Nie pozbędziesz się tego. Pamiętaj, że wczytujesz do zmiennej typu
char
, który przechowuje jeden znak.
Wpisanie "555" powoduje, że pierwszy znak (czyli 5) wczytywany jest do zmiennej, a pozostałe zostają w buforze strumienia
i czekają na swoją kolej.

while(( !( wybor == '1' ) ) &&( !( wybor == '2' ) ) &&( !( wybor == '3' ) ) &&( !( wybor == '4' ) ) &&( !( wybor == '5' ) ) &&( !( wybor == '6' ) ) &&( !( wybor == '7' ) ) )
Ten warunek można napisać dużo prościej (przy użyciu dwóch wyrażeń - > <, lub >= <=).

I to całe zło, zmienne globalne. Używaj zmiennych lokalnych, póki sytuacja nie zmusi cię do użycia zmiennych globalnych.
W świetle kursu rozpalony stos czeka.
P-149815
Rss
» 2016-07-10 20:45:22
Faktycznie całkowicie zapomniałam, że char jest typem pojedynczego znaku. Zmieniłam też zmienne globalne na lokalne, oraz uprościłam sobie pętle do while. Dzięki za pomoc:)
Obecnie to wygląda tak:

C/C++
#include <iostream>
#include <math.h>
#include <conio.h>

using namespace std;


int main()
{
   
    double a, b;
    char wybor;
    do {
       
        cout << "Podaj liczbe a: ";
        cin.clear();
        cin.sync();
       
    } while(( !( cin >> a ) ) ||( a == 0 ) );
   
    do {
       
        cout << "Podaj liczbe b: ";
        cin.clear();
        cin.sync();
       
    } while(( !( cin >> b ) ) ||( b == 0 ) );
   
    do {
       
        cout << "Wybierz jakie dzialanie chcesz wykonac na wybranych liczbach:" << endl;
        cout << "[1] Dodawanie" << endl << "[2] Odejmowanie" << endl;
        cout << "[3] Mnozenie" << endl << "[4] Dzielenie" << endl << "[5] Ulamek z liczby a" << endl << "[6] Ulamek z liczby b" << endl << "[7] Rezygnuj" << endl;
        wybor = getch();
       
       
        switch( wybor ) {
        case '1':
           
            cout << "Wynik dodawania: " <<( a + b ) << endl;
            break;
           
        case '2':
           
            cout << "Wynik odejmowania: " <<( a - b ) << endl;
            break;
           
        case '3':
           
            cout << "Wynik mnozenia: " <<( a * b ) << endl;
            break;
           
        case '4':
           
            cout << "Wynik dzielania: " <<( a / b ) << endl;
            break;
           
           
        case '5':
           
            cout << "Ulamek z liczby a: " <<( sqrt( a ) ) << endl;
            break;
           
        case '6':
           
            cout << "Ulamek z liczby b: " <<( sqrt( b ) ) << endl;
            break;
           
        case '7':
           
            cout << "Rezygnujesz z dzialan" << endl;
            break;
           
           
        default:
           
            cout << "Nie wybrales zadnej opcji" << endl;
           
            break; }
       
    } while(( wybor < '1' ) ||( wybor > '7' ) );
   
    return 0;
   
}

Myślę, że przejdzie.
P-149818
1 « 2 »
Poprzednia strona Strona 2 z 2