/* Programa    primeiro_grau.cc  
	Assunto:    Calcula os coeficentes de f(x) = b + m(x-a) 
	Condicionantes:  Compile com
		g++ -Wall -oprog   primeiro_grau.cc
		
	Programa sem erros

	Descrição:  determina os coeficientes de um polin. do primeiro
				dados dois pontos por onde passa o seu gráfico.
				Escreve o polinômio no formato f(x) = b + m(x-a)

	palavras chave: passando vetor por referência (30)
	palavras chave: passando valor por referência - evite ponteiro
	palavras chave: comentário no meio da impressão (120)
   por Tarcisio Praciano Pereira,    
    - 10 licoes para aprender C++
   Sobral, Janeiro de 2008 - UeVA    	      		
*/


# include <iomanip>
# include <iostream>
# include <math.h>
# include "/home/tarcisio/tex/c/cplus/Ambiente.h" // Biblioteca particular: comunicacao com usuário
using namespace std; // a evitar - polui o espaço de nomes 



Ambiente Tela;  // Uma instância de Ambiente - herda seus métodos
;

// definindo um tipo de dado - vetorial
typedef struct
{
    double a1; double a2; double a3;
} 	vetor;



// função de tipo vetor - devolve um vetor
vetor calcula_parametros();

int main()
{
   vetor 	parametros={-5,2,7};  // (10)   a,m,b  f(x) = m(x-a) + b
	parametros = calcula_parametros();// (30) recebe e passa os parâmetros
	cout << setiosflags( ios::fixed | ios::showpoint )
           << setprecision(3) ;// o número de casas decimais    	
	cout	<< "f(x) = " << parametros.a1 <<" + "
			<<  parametros.a2 <<"(x - "<< parametros.a3 <<")"<<  endl;
	return(0);
}


// Recebe os dados - dois pontos que determinam uma reta e devolve parâmetros
vetor		calcula_parametros()
{
  double	P1, P2, Q1, Q2; // os dois pontos P, Q por onde passa a reta.
  double	a,m,b; // como em f(x) = b + m(x-a)
  vetor	A; // A.a1 = a; A.a2 = m; A.a3 = b;
	cout << setiosflags( ios::fixed | ios::showpoint )
           << setprecision(18) ;// o número de casas decimais    
           
  cout	<< "Os dois pontos por onde passa o gráfico da função:\n"
          << "P1 = (a1, b1)   e   P2 = (a2, b2)   \n";
  cout	<< "P1 = "; cin >> P1;
  cout	<< "    P2 = "; cin >> P2;
  cout	<< "\n Q1 = "; cin >> Q1;
  cout	<< "    Q2 = "; cin >> Q2;
  if ( P1 == Q1)
  		{ 
  		A.a1 = P1; A.a2 = 13241341343341341343413134.3241414; A.a3 = P1;  // criando vetor saída 
  		return (A);
  		}
  else
  	{
  		m = (P2-Q2)/(P1-Q1); 
  		a = P1; 
  		b = P2; // a reta passa por (P1, P2)
  		A.a1 = a; A.a2 = m; A.a3 = b; // criando vetor saída 
  		return(A); // devolvendo a,m,b --> A (vetor)
	}
}

 
 
/* Comentários:  A numeração dos comentários, como num programa em
		BASIC,  não   é continuada, pode dar saltos...para
		  facilitar a reutilização de programas.

(10) 	Estes valores de inicialização não serão usados! Coloquei aqui
		apenas para me lembrar qual é a estrutura do vetor de dados.

(30)  Passando valor por referência - passa o valor que se encontra na
		memória cujo endereço é indicado.

(100) Esta funçao recebe um vetor de parametros  a,m,b  em que
		a  é o ponto onde o polinômio está sendo desenvolvido
		m,b  são os coeficientes do polinômio neste caso seria
			x -->  m(x - a) + b		  

(120) com um comentário no meio da impressão, com printf() fica difícil
		fazer isto (não impossível - acho que não existe nada impossível
		com printf() )
*/

