C++ zadanie z argumentem przekazywanym przez referencję

Odpowiedz Nowy wątek
2019-12-01 13:10
0

Witam mam do napisania program w, którym jednym z podpunktów jest obliczenie ilorazu z uwzględnieniem kiedy dzielimy przez 0 . Kiedy wystąpi taki przypadek muszę wyprowadzić na zewnątrz funkcji informacje o niemożności wykonania działania i użyć przy tym argumentu przekazanego przez referencję. Czy sposób w, który to zrobiłem jest poprawny czy można to jakoś inaczej zrobić ?

#include<iostream>
#include<math.h>

using namespace std;
double a, b;
int choice, isCorrect = 1;
double iloraz(double a, double b, int& isCorrect) {
    if (b == 0) {
        return isCorrect = 0;
    }
    else {
        return a / b;
    }
}
int main() {
    cout << "Jakie dzialanie chcesz wykonac \n";
    cout << "1 - iloraz \n2 - pierwiastek kwadratowy \n3 - potega \n4 - iloczyn skalarny dwoch wektorow \n";
    cin >> choice;
    switch (choice) {
        case 1:
            cout << "Podaj liczby dla ktorych mam wykonac dzialanie\n";
            cin >> a >> b;
            iloraz(a, b, isCorrect);
            if (isCorrect == 0) {
                cout << "Dzielisz przez zero nie moge wykonac tego dzialania";
            }
            else {
                cout << "Wynik: " << iloraz(a, b,isCorrect);
            }
            break;
    }
    return 0;
}
edytowany 1x, ostatnio: Raloseq, 2019-12-01 13:10

Pozostało 580 znaków

2019-12-01 13:44
1
  1. Dwukrotnie wywołujesz funkcję iloraz(), raz do określenia prawidłowości, drugi raz do uzyskania wyniku. Teraz jest prosta, ale co gdyby jej wykonanie zajmowało dużo czasu? Jest to nieefektywne, i może prowadzić do błędów, bo gdzieś po drodze a i b mogą się zmienić. Powinieneś przypisać wynik pierwszego wywołania do zmiennej i go wyświetlić potem.
  2. Przyjęło się, że jeśli funkcja oprócz wyniku ma również zwracać jakiś status, to ten status jest zwracany przez return, a wynik przez referencję. Status 0 oznacza, że funkcja wykonała się prawidłowo, inne wartości oznaczają różnego rodzaju błędy.
  3. Linia: return isCorrect = 0; wygląda źle. Najpierw wykona się przypisanie isCorrect = 0, a wynik w sumie jest już nieistotny, ale w efekcie zwracasz jako wynik dzielenia wartość isCorrect a nie to jest przecież Twoją intencją.
int iloraz(double a, double b, double& result) {
    if (b == 0) {
        return 1; // tu w zasadzie powinieneś zwrócić jakąś wartość zdefiniowaną wcześniej jako enum.
    }
    else {
                result = a/b;
        return 0;   
        }
}

Pozostało 580 znaków

2019-12-01 14:11
0

Jeżeli chodzi o podpunkt nr. 2 to zwracanie wyniku przez referencję, a nie status czy funkcja wykonała się poprawnie czy też nie ,chyba koliduje się z treścią zadania. Jeżeli chodzi o 3 to wynik w sumie ma być nie istotny jak podana zostanie zła wartość(no bo po co mi zły wynik), a muszę jakoś zwrócić informację o tym, że podane zostały złe wartości.

Pozostało 580 znaków

2019-12-01 14:33
1
  1. Nie znając implementacji funkcji mogę ją wywołać w ten sposób:
    int isCorrect = 0;
    iloraz(4, 2, isCorrect);
    if (isCorrect == 0) {
    cout << "Dzielisz przez zero nie moge wykonac tego dzialania";
    }
  2. To isCorrect w funkcji iloraz() to zmienna lokalna czy globalna? Nie mylą Ci się?
  3. Postaraj się nie używać zmiennych globalnych.

Jak przeniesiesz

double a, b;
int choice, isCorrect = 1;

do main() to 2. i 3. nie będą już istotne.

Pozostało 580 znaków

2019-12-01 17:44
double iloraz(double a,double b,bool &isCorrect)
{
    isCorrect=(b!=0);
    return isCorrect?a/b:0;
}
bool isCorrect;
double c=iloraz(a,b,isCorrect);
if(isCorrect) cout<<a<<"/"<<b<<"="<<c<<endl;
else cout<<"Dzielisz przez zero nie moge wykonac tego dzialania"<<endl;

Lub

bool iloraz(double a,double b,double &c)
{
    bool ret=(b!=0);
    if(ret) c=a/b;
    return ret;
}

double c;;
if(iloraz(a,b,c)) cout<<a<<"/"<<b<<"="<<c<<endl;
else cout<<"Dzielisz przez zero nie moge wykonac tego dzialania"<<endl;

Wg mnie ten drugi wariant bardziej sensowny


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2019-12-01 18:08
W pierwszym -> return isCorrect?a/b:0; - Delor 2019-12-01 17:56
tak, po ostrej imprezie jestem :D - _13th_Dragon 2019-12-01 18:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0