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

Problem z enum-em

Ostatnio zmodyfikowano 2015-10-27 19:58
Autor Wiadomość
Masmix
Temat założony przez niniejszego użytkownika
Problem z enum-em
» 2015-10-27 17:55:10
Witam,
jako zadanie domowe mam do zrobienia program : "Napisz prosty kalkulator (dodawanie, odejmowanie, mnożenie, dzielenie) wykorzystując typ wyliczeniowy enum, pętlę for oraz funkcje. Program powinien kończyć się po wciśnięciu znaku `k` " . I tu się zaczyna mój problem o ile z for, z 'k' i z funkcjami sobie poradziłem, to nie widzę sensu ( podobnie jak moi koledzy ) zastosowania enum-a w tym programie. Dlatego proszę o waszą pomoc w "dodaniu", albo nakierowanie mnie gdzie i jak mam dodać enuma  do mojego programu, którego niżej zamieszczę. ( W for nie miałem pomysłu, dlatego dałem, żeby dodawał do zbioru i)

Z góry dzięki,
Masmix.


#include <iostream>
#include <conio.h>

using namespace std;



double menu()
{
    cout << "[1] - Dodawanie " << endl;
    cout << "[2] - Odejmowanie " << endl;
    cout << "[3] - Mnozenie " << endl;
    cout << "[4] - Dzielenie " << endl;


}
    double dodawanie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << "Wynik dodawania " << a << " i " << b << " to " << a+b << endl;
    }


    double odejmowanie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << " Wynik odejmowania " << a << " i " << b << " to " << a-b << endl;
    }


    double mnozenie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << "Wynik mnozeniea " << a << " i " << b << " to " << a*b << endl;
    }


    double dzielenie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << "Wynik dzielenia " << a << " i " << b << " to " << a/b << endl;
    }




int main()
{
    cout << " Jaka operacje wybierasz?" << endl ;

int liczba, i;
char znak;

for( i=1; znak!='k'; i++ )

{   menu();
    cin >> liczba || znak;
    switch ( liczba )
    {

case 1 :
    dodawanie();
    break;
case 2 :
    odejmowanie();
    break;
case 3 :
    mnozenie();
    break;
case 4 :
    dzielenie();
    break;
default:
    break;
    }
    znak = getche( );

}

return 0;
}

P-139252
michal11
» 2015-10-27 18:05:59
Zamiast cyfr w switchu dodaj sobie enuma, nie wiem na jakim jesteś poziomie ale ja bym dodał sobie jeszcze mapę która by miała zapisaną informację jaki numer jest przypisany do jakiego działania.
C/C++
enum dzialania { dodawanie, odejmowanie, mnozenie, dzielenie };

map < int, dzialania > przypisania;


przypisania[ 1 ] = dodawanie;
przypisania[ 2 ] = odejmowanie;
przypisania[ 3 ] = mnozenie;
przypisania[ 4 ] = dzielenie;

swich( przypisania[ wczytanaLiczba ] )
{
case dodawanie:
    ...
}

Dzięki temu możesz w łatwy sposób sobie zmieniać pod którym numerem masz jakie działanie, zmieniasz przypisanie tylko w jednym miejscu i jest to rozwiązanie dość uniwersalne.
Dodatkowo nie sprawdzasz przy dzieleniu czy liczba przez którą dzielisz nie jest zerem.
Zamiast pętli
P-139253
carlosmay
» 2015-10-27 18:08:52
Enum'a możesz użyć jako opcje menu().

C/C++
enum { DODAWANIE, ODEJMOWANIE, MNOZENIE, DZIELENIE };
cin >> opcja;
if( opcja == DODAWANIE ) // wykonaj dodawanie
 
P-139254
Masmix
Temat założony przez niniejszego użytkownika
» 2015-10-27 18:24:01
Z enumem nie czuję się za bardzo na siłach, czy moglibyście pokazać jakby wyglądał cały program? Tak najlepiej się uczę. P.S michal11 jak pytałeś o mój poziom zaawansowania, to Ci odpowiem, że dzisiaj miałem swoje 4 zajęcia i nie mam pojecia co to jest mapa.
P-139257
carlosmay
» 2015-10-27 18:42:58
C/C++
enum { DODAWANIE = 1, ODEJMOWANIE, MNOZENIE, DZIELENIE };
cin >> opcja;
if( opcja == DODAWANIE ) // wykonaj dodawanie
 
Tak zdefiniowany numeruje elementy składowe od jeden w górę.
Każda nazwa jest aliasem dla liczby całkowitej.

W kodzie dla poprawienia czytelności zamiast gołych liczb np.
C/C++
if( opcja == DODAWANIE ) // if(opcja == 1) to samo
//... czy
switch( opcja ) {
case DODAWANIE: // case 1: to samo
    // wykonaj dodawanie
P-139261
Masmix
Temat założony przez niniejszego użytkownika
» 2015-10-27 19:12:28
Czyli chodziło tylko o to żeby zamiast case 1 napisać case DODAWANIE, co jest równoważne ?( Czuję się teraz trochę głupi z tego powodu :) )  Program teraz wygląda tak jak poniżej, jeżeli nie macie żadnych porad bądź zastrzeżeń to bardzo dziękuję za pomoc.
#include <iostream>
#include <conio.h>

using namespace std;
enum { DODAWANIE=1, ODEJMOWANIE, MNOZENIE, DZIELENIE};

double menu()
{
    cout << "[1] - Dodawanie " << endl;
    cout << "[2] - Odejmowanie " << endl;
    cout << "[3] - Mnozenie " << endl;
    cout << "[4] - Dzielenie " << endl;

    return 0;
}

    double dodawanie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << "Wynik dodawania " << a << " i " << b << " to " << a+b << endl;

    return a+b;
    }


    double odejmowanie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << " Wynik odejmowania " << a << " i " << b << " to " << a-b << endl;
    return a-b;
    }


    double mnozenie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << "Wynik mnozeniea " << a << " i " << b << " to " << a*b << endl;
    return a*b;
    }


    double dzielenie()
    {
    double a,b;
    cout << "Podaj pierwsza liczbe" << endl;
    cin >> a;
    cout << "Podaj druga liczbe" << endl;
    cin >> b;
    cout << "Wynik dzielenia " << a << " i " << b << " to " << a/b << endl;
    return a/b;
    }




int main()
{
    cout << " Jaka operacje wybierasz?" << endl ;

int liczba, i;
char znak;

for( i=1; znak!='k'; i++ )

{   menu();
    cin >> liczba || znak;
    switch ( liczba )
    {

case DODAWANIE :
    dodawanie();
    break;
case ODEJMOWANIE :
    odejmowanie();
    break;
case MNOZENIE :
    mnozenie();
    break;
case DZIELENIE :
    dzielenie();
    break;
default:
    break;
    }
    znak = getche( );

}

return 0;
}
P-139262
carlosmay
» 2015-10-27 19:58:03
Program można skrócić do jednej funkcji wykonującej obliczenia.

C/C++
case DODAWANIE:
obliczenia( '+' );
return;

//....

// funkcja
void obliczenia( char znak )
{
    // wczytywanie liczb itd
    if( znak == '+' ) // dodawanie
    else if( znak == '-' ) // odejmowanie
    // itd
 
Jeśli nie używasz zwracanej wartości z funkcji używaj funkcji typu void.
P-139265
« 1 »
  Strona 1 z 1