Wyjątki dla funkcji c++

0

Napisz program, w którym funkcja main będzie wywoływała funkcje: oblicz objętość kuli, oblicz pole powierzchni stożka, oblicz objętość prostapadloscianu. Każda z funkcji będzie oczekiwała odpowiednich argumentow typu double i zwracała wartość double. Każda z nich będzie rzucała wyjątek w przypadku zerowych lub ujemnych parametrów. Wyjątki będą przechwytywane w funkcji main. Dla każdej funkcji należy stworzyć oddzielny typ wyjątku.

Napisałam taki kod, ale nie działa. Co jest nie tak?

#include<iostream>
using namespace std;

struct Blad_obliczeniowy
{
	string opis_bledu;
};

double policz_objetosc_kuli(double promien);
double policz_objetosc_prostopadloscianu(double dlugosc, double szerokosc, double wysokosc);
double policz_pole_stozka(double promien, double wysokosc);

int main()
{
	int objetosc_kuli;
	int pole_stozka;
	int objetosc_prostopadloscianu;

	double r;
	cout << "podaj promien kuli: ";
	cin >> r;

	double t;
	cout << "podaj promien podstawy stozka: ";
	cin >> t;

	double l;
	cout << "podaj dlugosc sciany stozka: ";
	cin >> l;

	double a;
	cout << "podaj dlugosc prostopadloscianu: ";
	cin >> a;

	double b;
	cout << "podaj szerokosc prostopadloscianu: ";
	cin >> b;

	double c;
	cout << "podaj wysokosc prostopadloscianu: ";
	cin >> c;

	try
	{
		cout << "objetosc kuli o promieniu " << r << ": " << policz_objetosc_kuli(r) << endl;
		cout << "pole stozka o promieniu " << t,l << ": " << policz_pole_stozka(t,l) << endl;
		cout << "objetosc prostopadloscianu o podstawie " << a,b,c << ": " << policz_objetosc_prostopadloscianu(a,b,c) << endl;
	}
	catch (Blad_obliczeniowy wyjatek)
	{
		cout << "przechwycony wyjatek: " << wyjatek.opis_bledu << endl;
	}
	return 0;
}

double policz_objetosc_kuli(double r)
{
	cout << "obliczanie objetosci kuli" << endl;
	if (r > 0)
	{
		return 4/3 * r * r * r * 3.14;
	}
	else
	{
		cout << "rzucenie wyjatku!" << endl;
		Blad_obliczeniowy blad;
		blad.opis_bledu = "zerowy lub ujemny promien kuli!";
		throw blad;
	}
}

double policz_pole_stozka(double t, double l)
{
	cout << "obliczanie objetosci stozka" << endl;
	if (t > 0 && l > 0)
	{
		return 3.14 * t * (t+l);
	}
	else
	{
		cout << "rzucenie wyjatku!" << endl;
		Blad_obliczeniowy blad;
		blad.opis_bledu = "zerowy lub ujemny promien podstawy stozka lub dlugosc sciany!";
		throw blad;
	}
}

double policz_objetosc_prostopadloscianu(double a, double b, double c)
{
	cout << "obliczanie objetosci prostopadloscianu" << endl;
	if (a > 0 && b > 0 && c > 0)
	{
		return a*b*c;
	}
	else
	{
		cout << "rzucenie wyjatku!" << endl;
		Blad_obliczeniowy blad;
		blad.opis_bledu = "zerowy lub ujemna wartosc sciany prostopadloscianu!";
		throw blad;
	}
}
5

Napisz że się nie kompiluje a nie że nie działa ;)

Popraw to:

cout << a,b  << endl;

przecinek w tym kontekście nie działa tak jak myślisz.

1

Co do tych wyjątków:

// wszystkie wyjątki z logiki aplikacji
class MyAppErrors : public std::exception
{};

// wyjątki o charakterze nieprawidłowych argumentów
class MyAppInvalidArguments : public MyAppErrors {};

class InvalidSphereRaduis : public MyAppInvalidArguments  {
public:
  const char* what() const noexcept override {
      return "Sphere radius must be greater then zero";
  }
};

class InvalidConeData : public MyAppInvalidArguments {
public:
  const char* what() const noexcept override {
      return "Cone dimensions must be greater then zero";
  }
};

class InvalidRectangularCuboidData : public MyAppInvalidArguments {
public:
  const char* what() const noexcept override {
      return "Rectangular cuboid dimensions must be greater then zero";
  }
};

Ty zrobiłeś niezgodnie z instrukcją bo masz tylko jeden typ wyjątku.

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