C++ zadanie z argumentem przekazywanym przez referencję

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;
}
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; 	
        }
}
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.

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";
}
  1. To isCorrect w funkcji iloraz() to zmienna lokalna czy globalna? Nie mylą Ci się?
  2. 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.

1
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

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