• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z funkcją używającą wskaźniki funkcji

+1 głos
721 wizyt
pytanie zadane 29 października 2017 w C i C++ przez chucksqll Stary wyjadacz (12,930 p.)

Witam. Robię zadanie z książki Szkoła programowania i mam zaprojektować funkcję calculate() pobierającą 2 wartości double i wskaźnik funkcji mającej 2 parametry double zwracająca typ double. Sama funkcja calculate tez ma zwracać typ double, dla chętnych dodatkowe utrudnienie, którego się podjąłem jest użycie tablicy wskaźników na funkcję. Niestety nie udało mi się to i nie mam pojęcia jak to zrobić, żeby działało.

#include <iostream>

using namespace std;
double calculate(double x, double y,double (*pf)(double, double));
double * add(double x,double y);
double * sub(double x, double y);
double * product(double x, double y);
double * quotient(double x, double y);

int main()
{
    double *(*p1)(double x,double y)=add;
    double *(*p2)(double x, double y)=sub;
    double *(*p3) (double x, double y)= product;
    double *(*p4) (double x, double y)=quotient;
    double *(*pa[4])(double x, double y)= {add,sub,product,quotient};

    cout<<"podaj 2 liczby"<<endl;
    cout<<"A nastepnie wybierz dzialanie:"<<endl;
    cout<<"1.Dodawanie"<<endl;
    cout<<"2.Odejmowanie"<<endl;
    cout<<"3.Mnozenie"<<endl;
    cout<<"4.Dzielenie"<<endl;

    for(;;)
    {
        int x,y,choice;
        cin>>x>>y>>choice;
        double *pa;
        switch(choice)
        {
        case 1 :
            pa=add(x,y);
            break;
        case 2:
            pa=sub(x,y);
            break;
        case 3:
            pa=product(x,y);
            break;
        case 4:
            pa=quotient(x,y);
            break;
        default :
            cout<<"nie ma takiej opcji"<<endl;
        }

        cout<<calculate(x,y,pa);
    }

    return 0;
}
double calculate(double x, double y,double (*pf)(double, double))
{
    double score=pf(x,y);
    return score;
}
double * add(double x,double y)
{
    double sum=x+y;
    double *pt=&sum;
    return pt;
}
double * sub(double x, double y)
{
    double sum=x-y;
    double *pt=&sum;
    return pt;
}
double * product(double x, double y)
{
    double sum=x*y;
    double *pt=&sum;
    return pt;
}

double * quotient(double x, double y)
{
    double sum=x/y;
    double *pt=&sum;
    return pt;
}

 

1 odpowiedź

+1 głos
odpowiedź 29 października 2017 przez criss Mędrzec (172,570 p.)

(...) funkcji mającej 2 parametry double zwracająca typ double.

U ciebie wszystkie poza calculate zwracają wskaźnik na double, a nie double. To zamierzone? Jeśli tak, to też źle, bo zobacz co robisz: tworzysz wewnątrz funkcji zmienną lokalną, pobierasz jej adres i go zwracasz. Zmienna lokalna istnieje tylko podczas tego konkretnego wywołania funkcji.

Reszta jest raczej ok. Dziwne jest tylko, że nazywasz argumenty w typie wskaźnika na funkcje, ale błędem to chyba nie jest (nie jestem pewien, ale na GCC się kompiluje).
Podpowiem też, że zamiast pisać te skomplikowane typy wskaźników, zrób sobie jakiegoś typedefa:

typedef double(*fptr_t)(double, double);
// using fptr_t = double(*)(double, double); // c++11

fptr_t pa[4] /* = ...*/;
komentarz 29 października 2017 przez chucksqll Stary wyjadacz (12,930 p.)

No dobra, dzięki tylko, po zastosowaniu Twoich wskazówek, nie wiem jak wdrożyć tą tablicę wskaźników w program.

#include <iostream>

using namespace std;

double calculate(double x, double y,double (*pf)(double, double));
double add(double x,double y);
double sub(double x, double y);
double product(double x, double y);
double quotient(double x, double y);

int main()
{
    typedef double(*fptr_t)(double, double);
    fptr_t pa[4]= {add,sub,product,quotient};

    cout<<"podaj 2 liczby"<<endl;
    cout<<"A nastepnie wybierz dzialanie:"<<endl;
    cout<<"1.Dodawanie"<<endl;
    cout<<"2.Odejmowanie"<<endl;
    cout<<"3.Mnozenie"<<endl;
    cout<<"4.Dzielenie"<<endl;

    for(;;)
    {
        int x,y,choice;
        cin>>x>>y>>choice;

        switch(choice)
        {
        case 1 :
            cout<<calculate(x,y,add);
            break;
        case 2:
            cout<<calculate(x,y,sub);
            break;
        case 3:
            cout<<calculate(x,y,product);
            break;
        case 4:
            cout<<calculate(x,y,quotient);
            break;
        default :
            cout<<"nie ma takiej opcji"<<endl;
        }

        cout<<" kolejna tura"<<endl;
    }

    return 0;
}
double calculate(double x, double y,double (*pf)(double, double))
{
    double score=pf(x,y);
    return score;
}
double  add(double x,double y)
{
    return x+y;
}
double  sub(double x, double y)
{
    return x-y;
}
double product(double x, double y)
{
    return x*y;
}

double quotient(double x, double y)
{
    return x/y;
}



 

1
komentarz 29 października 2017 przez mokrowski Mędrzec (158,580 p.)

Po minimalnych poprawkach, można tak:

#include <iostream>
 
using namespace std;
 
typedef double(*fptr_t)(double, double);

double calculate(double x, double y, fptr_t pf);
double add(double x,double y);
double sub(double x, double y);
double product(double x, double y);
double quotient(double x, double y);
 
int main()
{
    fptr_t pa[4]= { add, sub, product, quotient};
 
    cout<<"Podaj 2 liczby.\n"
        << "Nastepnie wybierz dzialanie.\n"
        << "Dane oddzielaj spacją.\n"
        << "1. Dodawanie.\n"
        << "2. Odejmowanie.\n"
        << "3. Mnozenie.\n"
        << "4. Dzielenie.\n"
        << "5. Koniec.\n";
 
    for(;;)
    {
        int x,y;
        size_t choice;
        cin >> x >> y >> choice;

        if(choice > 5 || choice < 1) {
            cerr << "Nie ma takiej opcji.\n";
            continue;
        } else if(choice == 5) {
            break;
        }
        cout << "Wynik: " << calculate(x, y, pa[choice - 1]) << '\n';
 
        cout << "Kolejna tura.\n";
    }

    cout << "Koniec programu.\n"; 
}

double calculate(double x, double y,fptr_t pf)
{
    double score = pf(x,y);
    return score;
}

double add(double x,double y)
{
    return x + y;
}

double  sub(double x, double y)
{
    return x - y;
}

double product(double x, double y)
{
    return x * y;
}
 
double quotient(double x, double y)
{
    return x / y;
}

Ogólnie jeśli to możliwe, unikaj swich-case. Przecież już wiesz jak :-)

komentarz 30 października 2017 przez chucksqll Stary wyjadacz (12,930 p.)
Dziękuję bardzo.

Podobne pytania

0 głosów
1 odpowiedź 448 wizyt
0 głosów
1 odpowiedź 751 wizyt
pytanie zadane 15 grudnia 2018 w C i C++ przez niezalogowany

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...