<repo_name>universaln/MetodaTrapezow<file_sep>/MetodaTrapezów.cpp
#define _USE_MATH_DEFINES
#include <iostream>
#include <conio.h>
#include <math.h>


using namespace std;

void bladWczytywania()
{
	if (cin.fail())
	{
		system("cls");
		cout << "Zle dane";
		exit(0);
	}
}

float poleTrapezu(float a, float b, float h)
{
	return (a + b) * h / 2;
}

float wartoscFunkcjiKwadratowej(float a, float b, float c, float x)
{
	return a * x * x + b * x + c;
}

float wartoscFunkcjiSzescian(float a, float b, float c, float x)
{
	return a * x * x * x + b * x * x + c * x;
}
float funkcjaKwadratowaTrapez(float a, float b, float c, int n, float A, float B)
{
	float h = (B - A) / n;
	float poleCalkowite = 0;
	for (int i = 0; i < n; i++)
	{
		float a2 = wartoscFunkcjiKwadratowej(a, b, c, A + h * i);
		float b2 = wartoscFunkcjiKwadratowej(a, b, c, A + h * (i + 1));
		
		poleCalkowite += poleTrapezu(a2, b2, h);
	}
	return poleCalkowite;
}

float funkcjaKwadratowaCalka(float a, float b, float c, float A, float B)
{
	float a2 = a / 3;
	float b2 = b / 2;
	float c2 = c;

	return wartoscFunkcjiSzescian(a2, b2, c2, B) - wartoscFunkcjiSzescian(a2, b2, c2, A);
}

void obslugaFunkcjiKwadratowej()
{
	float a, b, c;
	cout << "Podaj wspolczynniki rzeczywiste a (rozne od 0), b, c (ax^2+bx+c): " << endl;

	cout << "a = ";
	cin >> a;
	bladWczytywania();

	while (true)
	{
		if (a == 0)
		{
			cout << "a ma byc rozne od 0!!!" << endl;
			cout << "Podaj a: ";
			cin >> a;
		}
		else break;
	}

	cout << "b = ";
	cin >> b;
	bladWczytywania();

	cout << "c = ";
	cin >> c;
	bladWczytywania();

	float A, B;
	cout << "Podaj przedzial <A, B>: " << endl;
	cout << "A = ";
	cin >> A;
	bladWczytywania();

	cout << "B = ";
	cin >> B;
	bladWczytywania();

	if (A > B)
	{
		cout << "Podales zly przedzial, zamieniam liczby" << endl;
		float buff = A;
		A = B;
		B = buff;
	}

	int n;
	cout << "Podaj gestosc podzialu n: ";
	cin >> n;
	bladWczytywania();

	cout << "Metoda trapezow: " << funkcjaKwadratowaTrapez(a, b, c, n, A, B) << endl;
	cout << "Blad procentowy: " <<
		(funkcjaKwadratowaTrapez(a, b, c, n, A, B) - funkcjaKwadratowaCalka(a, b, c, A, B)) / funkcjaKwadratowaCalka(a, b, c, A, B);
	cout << "\nCalka: " << funkcjaKwadratowaCalka(a, b, c, A, B) << endl;
}

double degToRad(float degrees)
{
	return degrees * M_PI / 180;
}

double sinusTrapez(float A, float B, int n)
{
	double h = degToRad((B - A) / n);
	double poleCalkowite = 0;
	double A2 = degToRad(A);
	for (int i = 0; i < n; i++)
	{
		poleCalkowite += (h/2)*(sin(A2+h*i)+sin(A2+h*(i+1)));
	}
	return poleCalkowite;
}

double sinusCalka(float A, float B)
{
	return -cos(degToRad(B)) + cos(degToRad(A));
}

void obslugaSinusa()
{
	float A, B;
	cout << "Podaj przedzial <A, B> (w stopniach): " << endl;

	cout << "A = ";
	cin >> A;
	bladWczytywania();

	cout << "B = ";
	cin >> B;
	bladWczytywania();

	if (A > B)
	{
		cout << "Podales niepoprawny przedzial! Zamieniam liczby" << endl;
		float buff = A;
		A = B;
		B = buff;
	}
	int n;
	cout << "Podaj gestosc podzialu n: ";
	cin >> n;
	bladWczytywania();

	cout << "Metoda trapezow: " << sinusTrapez(A, B, n) << endl;
	cout << "Blad procentowy: " << (sinusCalka(A, B) - sinusTrapez(A, B, n)) / sinusCalka(A, B) << endl;
	cout << "Calka: " << sinusCalka(A, B) << endl;
}

float tangensTrapez(float A, float B, int n)
{
	while (B - A >= 180)
	{
		B -= 180;
	}

	int a2, b2;
	a2 = A;
	b2 = B;
	if (a2 / 90 < b2 / 90)
	{

	}

	A = degToRad(A);
	B = degToRad(B);
	float h = degToRad((B - A) / n);

	float poleCalkowite = 0;
	for (int i = 0; i < n; i++)
	{
		poleCalkowite += poleTrapezu(tan(A + h * i), tan(A + h * (i + 1)), h);
	}
	return poleCalkowite;
}
void obslugaTangensa()
{
	float A, B;
	cout << "Podaj przedzial <A, B> (w stopniach): " << endl;

	cout << "A = ";
	cin >> A;
	bladWczytywania();

	cout << "B = ";
	cin >> B;
	bladWczytywania();

	if (A > B)
	{
		cout << "Podales niepoprawny przedzial. Zamieniam liczby!" << endl;
		float buff = A;
		A = B;
		B = buff;
	}
	int n;
	cout << "Podaj gestosc podzialu n: ";
	cin >> n;
	bladWczytywania();

	cout << "Metoda trapezow: ";
}

void opcje()
{
	string funkcja;
	cin >> funkcja;
	while (funkcja != "a" && funkcja != "b" && funkcja != "c" && funkcja != "d")
	{
		cout << "Musisz podac a, b, c lub d!" << endl;

		cin >> funkcja;
	}

	switch (funkcja[0])
	{
	case 'a':
		obslugaFunkcjiKwadratowej();
		break;
	case 'b':
		obslugaSinusa();
		break;
	case 'c':
		obslugaTangensa();
		break;
	case 'd':
		cout << "Dowidzenia!";
		exit(0);
		break;
	}
	
}
int main()
{
	while (true)
	{
		cout << "Wybierz funkcje: " << endl;
		cout << "a) ax^2+bx+c" << endl;
		cout << "b) sin(x)" << endl;
		cout << "c) tan(x)" << endl;
		cout << "d) zakoncz" << endl;
		opcje();
	}
}

