/*Antud on funktsioon ja teatud algväärtused. 
 * Leida funktsiooni väärtused antud punktides (mitte rohkem kui 15).
 * Kui funktsiooni väärtus pole määratud, väljastada vastavasse veergu
 * 'puudub'. Funktsiooni väärtused esitada tabelina. */

#include <stdio.h> 
#include <math.h>

#define veerg 2
#define rida 15

//Prototüübid
double sisestusA();
double sisestusH();
double sisestusC();
double sisestusYM();
void XVäärtused(double, double, double, double, double[][15]);
void YVäärtused(double[][15], double[]);
void Väljastus(double, double[][15], double[]);
	
	
int main(void)
{
	double A = sisestusA();  //argumendi x algväärtus A
	double H = sisestusH();  //Samm
	double C = sisestusC();  //Sammu koefitsent
	double YM = sisestusYM(); //Väärtuste ülempiir
	double Vastus[veerg][rida]; 	//Tabeli veergude ja ridade massiiv
	double puudub[rida];		//Massiiv, et näidata x väärtusi, mille korral y väärtus puudub.
	
	XVäärtused(A, H, C, YM, Vastus);
	YVäärtused(Vastus, puudub);
	Väljastus(YM, Vastus, puudub);
	return 0;	
}


//Sisestus
double sisestusA()
{
	double A;
	int Kontroll;	//Muutuja, mis näitab mitu sisendväärtust omistati kindlale muutujale
	do	
	{	
		printf("Sisestage argumendi x algväärtus A \n");
		Kontroll = scanf("%lf", &A); //Kontroll näitab mitu väärtust omistati muutujale
									//Antud juhul 0 (sisestatud väärtus pole double) või 1.
		if(Kontroll == 0) //Sisestati väärtus, mis pole reaalarv.
		{
		printf("Sisestatud väärtus ei sobi, sisestage reaalarv.");
		scanf("%*s");					//Kui väärtus pole reaalarv, ei anta A-le väärtust. 
		}								//Ehk sisestatud väärtust ei arvestata. Vastasel juhul loop ei lõpeks.
	} while(Kontroll == 0);				//Kontroll, kas sisestatud on reaalarv, 
										/*Kui ...=0, siis A-le ei ole määratud väärtust ehk
										*(A ei ole double väärtus), kui ...=1, siis on.*/
	return A;
}
	
double sisestusH()
{
	double H;
	int Kontroll;					
	do
	{
		printf("Sisestage samm H \n");
		Kontroll = scanf("%lf", &H);	
		if(Kontroll == 0 || H<=0)	//H ei saa olla väiksem kui 0, peab olema reaalarv.
		{
		printf("Sisestatud väärtus ei sobi, sisestage reaalarv, mis on suurem kui 0");
		scanf("%*s");
		}
	}	while(Kontroll == 0 || H<=0); 	//H ei saa olla väiksem kui 0.
										//H peab olema reaalarv.
		return H;
}
double sisestusC()
{
	double C;
	int Kontroll;
	do
	{
		printf("Sisestage sammu koefitsent C (C>=1) \n");
		Kontroll = scanf("%lf", &C);
		if(Kontroll == 0 || C<0)	
		{
		printf("Sisestatud väärtus ei sobi, sisestage reaalarv, mis on suurem või võrdne kui 1");
		scanf("%*s");
		}
	}	while(C<0 || Kontroll == 0); //C<0 ja reaalarv kontroll	
	return C;
}
	
double sisestusYM()
{
	double YM;
	int Kontroll;
	do
	{
		printf("Sisestage funktsiooni väärtuse y ülempiir YM \n");
		Kontroll =scanf("%lf", &YM);
		if(Kontroll == 0)	
		{
		printf("Sisestatud väärtus ei sobi, sisestage reaalarv.");
		scanf("%*s");
		}
	}	while(Kontroll == 0);		//reaalarvu kontroll
	return YM;
}

//Töötlus
//x väärtuste leidmine
void XVäärtused(double A, double H, double C, double YM, double Vastus[][rida])
{
	int i;					//Järjenumber
	double XSumma;			//Ajutine summa, et leida x väärtuste rea liikmeid.
	for(i = 0;i < rida;i++)		//funktsiooni väärtusi võib olla max 15.
	{
		switch (i)
		{
			case 0:
			Vastus[0][i]=A;
			XSumma=Vastus[0][i];	//Jada 1. liikme A leidmine
			break;
			case 1:
			XSumma=XSumma+H;
			Vastus[0][i]=A+H;		//Jada 2. liikme A+H leidmine
			break;
			default:
			XSumma=XSumma+(H*(pow(C,(i-1)))); //Jada n. liige A+H+CH+C^(i-1)*H+....
			Vastus[0][i]=XSumma;
		}
	}	
}
//y väärtuste leidmine
void YVäärtused(double Vastus[][rida], double puudub[])
{
	int i;
	double x;	//Ajutine väärtus x väärtuste leidmiseks
	for(i=0;i<rida;i++)		//funktsiooni väärtusi võib olla max 15.
		{
			if(Vastus[0][i]<-2 || Vastus[0][i]>2)	//Määramispiirkond (-2;2)
			{
				Vastus[1][i]=puudub[i];
			}
			else
			{
				x=Vastus[0][i];
				Vastus[1][i]=(7*pow(x,2)+18*x-14)/(sqrt(4-pow(x,2)));
			}
		}	
}		

	//Väljastus
	
void Väljastus(double YM, double Vastus[][rida], double puudub[])
{
	printf("\n Tulemused on esitatud tabelis: \n");
	int i;
	for (i=0;i < rida;i++) 		//15 rida
	{	
		if(Vastus[1][i]<YM)
		{
			if (Vastus[1][i] == puudub[i])	
			{
			printf("%lf, Puudub ", Vastus[0][i]);
			}else
			{ 
			printf("%lf, %lf ", Vastus[0][i], Vastus[1][i]);
			}
		printf("\n");	
		}else
		{
			i=rida;
		}
	}
}