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

[Lekcja 15] Redukcja długości kodu

Ostatnio zmodyfikowano 2012-01-26 10:25
Autor Wiadomość
tqit71
Temat założony przez niniejszego użytkownika
[Lekcja 15] Redukcja długości kodu
» 2012-01-25 18:02:17
C/C++
#include <iostream>
using namespace std;

int main()
{
    int a, b;
    int wynik = 0;
    int dzialanie;
    cout << "1: Dodawanie" << endl;
    cout << "2: Odejmowanie" << endl;
    cout << "3: Mnozenie" << endl;
    cout << "4: Dzielenie" << endl;
    cout << "0: Koniec" << endl;
    do {
        cout << "Obecny wynik to: " << wynik << endl;
        do {
            cin.clear();
            cin.sync();
            cout << "Podaj rodzaj dzialania ";
            cin >> dzialanie;
        } while( cin.fail() == 1 );
       
        switch( dzialanie )
        {
        case 1:
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe a ";
                cin >> a;
            } while( cin.fail() == 1 );
           
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe b ";
                cin >> b;
            } while( cin.fail() == 1 );
           
            wynik = a + b;
            break;
           
        case 2:
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe a ";
                cin >> a;
            } while( cin.fail() == 1 );
           
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe b ";
                cin >> b;
            } while( cin.fail() == 1 );
           
            wynik = a - b;
            break;
           
        case 3:
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe a ";
                cin >> a;
            } while( cin.fail() == 1 );
           
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe b ";
                cin >> b;
            } while( cin.fail() == 1 );
           
            wynik = a * b;
            break;
           
        case 4:
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe a ";
                cin >> a;
            } while( cin.fail() == 1 );
           
            do {
                cin.clear();
                cin.sync();
                cout << "Podaj liczbe b ";
                cin >> b;
            } while( cin.fail() == 1 );
           
            if( b == 0 )
                 cout << "Nie dziel przez zero.";
            else
            {
                wynik = a / b;
            }
            break;
           
        case 0:
            break;
           
        default:
            cout << "Nie ma takiego dzialania.\n";
            break;
        }
    } while( dzialanie != 0 );
   
    cout << "Koniec.";
    return 0;
}

Zadanie zrobiłem, mam nadzieję, że dobrze, przynajmniej na to wygląda przy użytkowaniu. W związku z tym, że kod jest trochę długi, a w case'ach jest prawie to samo pomyślałem sobie czy nie dałoby się tego skrócić przy użyciu funkcji. Niestety, na chwilę obecną jedyne co mi działa to cztery oddzielne funkcje dla poszczególnych działań zwracające wyniki. Ja wolałbym funkcję jedynie od wczytywania danych, która ustawiałaby nowe wartości dla argumentów.
W skrócie moja wizja - funkcja wczytanie danych(a, b) wczytywałaby dane (cała pętla do...while) i zwracała nowe wartości zmiennych, które dalej byłyby wykorzystywane do podania wyniku. Jak to zrobić, przy użyciu czego?
P-49439
DejaVu
» 2012-01-25 18:34:45
Skoro widzisz problem powtarzającego się kodu to dobrze. Będziesz widział tym samym sens istnienia narzędzi, które są omówione w dalszych rozdziałach kursu.
P-49440
tqit71
Temat założony przez niniejszego użytkownika
» 2012-01-26 10:25:24
Zgodnie z zadaniem z kolejnej pracy domowej ulepszyłem kalkulator deklarując dwie funkcje (już bez całego programu, nie ma to sensu):
C/C++
int wczytajLiczbeA();
int wczytajLiczbeB();

//kawałek main
int main()
{
    switch( dzialanie )
    {
    case 1:
        a = wczytajLiczbeA();
        b = wczytajLiczbeB();
        wynik = a + b;
        break;
    }
}
//koniec main

int wczytajLiczbeA()
{
    int a;
    do {
        cin.clear();
        cin.sync();
        cout << "Podaj liczbe a ";
        cin >> a;
    } while( cin.fail() == 1 );
   
    return a;
}
//analogicznie w wczytajLiczbeB()

Jednak mimo wszystko czułem pewien niedosyt, który by na pewno rozwiały zmienne globalne ;) Ale to tak kusi jak goto + warunki w if'ach, gdy w pętli coś nie idzie, mimo wszystko szukałem czegoś schludniejszego. I po niedługim czasie znalazłem, wskaźniki rozwiązały mój problem, jeśli ktoś również będzie miał ochotę skrócić ten kalkulator do minimum i go upiększyć to polecam lekturę właśnie na ich temat:

C/C++
#include <iostream>
using namespace std;

void wczytajDane( double * p, double * q );

int main()
{
    double a, b;
    double wynik = 0;
    int dzialanie;
    cout << "1: Dodawanie" << endl;
    cout << "2: Odejmowanie" << endl;
    cout << "3: Mnozenie" << endl;
    cout << "4: Dzielenie" << endl;
    cout << "0: Koniec" << endl;
    do {
        cout << "Obecny wynik to: " << wynik << endl;
        do {
            cin.clear();
            cin.sync();
            cout << "Podaj rodzaj dzialania ";
            cin >> dzialanie;
        } while( cin.fail() == 1 );
       
        switch( dzialanie )
        {
        case 1:
            wczytajDane( & a, & b );
            wynik = a + b;
            break;
           
        case 2:
            wczytajDane( & a, & b );
            wynik = a - b;
            break;
           
        case 3:
            wczytajDane( & a, & b );
            wynik = a * b;
            break;
           
        case 4:
            wczytajDane( & a, & b );
            if( b == 0 )
                 cout << "Nie dziel przez zero." << endl;
            else
            {
                wynik = a / b;
            }
            break;
           
        case 0:
            break;
           
        default:
            cout << "Nie ma takiego dzialania.\n";
            break;
        } //switch
    } while( dzialanie != 0 );
   
    cout << "Koniec.";
    return 0;
}

void wczytajDane( double * p, double * q )
{
    cout << "Podaj liczbe ";
    cin >> * p;
    cout << "Podaj liczbe ";
    cin >> * q;
}
Pozdrawiam.
P-49489
« 1 »
  Strona 1 z 1