/* Programa    primeiro07.cc  
	Assunto:   Tutorial sobre cálculos aritméticos.
	Condicionantes:
		g++ -Wall -oprog -lm primeiro07.cc  (100)

	Programa sem erros, mas com um defeito 
   			com um problema: uso duplo de cin.get()
         ver (50) (51)

	Descrição:  Pede um valor para  t  e escreve o valor de (3t + 4, 3 - 2t)

	palavras chave: entrada de dados, cin, atribuição variável do tipo int
	palavras chave: atribuição variável do tipo int
	palavras chave: limpa a tela, leitura de números
   palavras chave: recebe enter para continuar cin.get(); cin.get()
   palavras chave: biblioteca math.h  e diretiva de compilação -lm 
   por Tarcisio Praciano Pereira - 10 licoes para aprender C++
   Sobral, Abril de 2005	- UeVA    	      		
*/

#include <iostream>
#include <math.h>
using namespace std; // a evitar - polui o espaço de nomes 


int main()
{
	int t=-1; // (10) uma variável do tipo inteiro
	float a1,a2,a3, b1,b2,b3; // para guardar os pontos calculados
	float teste; // para verificar se os pontos estão sobre uma reta
	system("clear"); // limpando a tela usando um comando do C
	cout  << "\t Observe que neste programa começamos com a tela limpa."<< endl;
	// (15) o uso de  \n  facilita o erro no formato da impressão
   cout  << "\t Este programa pede que você escolha valores para o parâmetro\n  "
			<< "t  e calcula as coordenadas dos pontos sobre uma reta cujas"<< endl
         << "equações paramétricas são "<< endl
         << "\t \t  (3t + 4, 3 - 2t)  "<< endl; //(20)  	
   cout	<< "Me dê um valor para t = "; //  (21)
	cin   >>  t; a1 = 3*t + 4; b1 = 3 - 2*t;// calculando a1, b1
   cout  << "t = " << t << "  --> (a1(t), b1(t)) = "<< " (3t + 4, 3 - 2t) = " 
	 << "(" << a1 << "," << b1 << ")" << endl;// (20)

   cout  << "Me dê outro  valor para t = ";  //  (21)
   	cin   >>  t;  a2 = 3*t + 4; b2 = 3 - 2*t;// calculando a2, b2
   cout  << "t = " << t << "  --> (a2(t), b2(t)) = " 
	<< " (3t + 4, 3 - 2t) = " << "(" << a2 << "," << b2 << ")" << endl;// (20)

   cout  << "Me dê ainda outro  valor para t = ";  //  (21)
   cin   >>  t;  a3 = 3*t + 4; b3 = 3 - 2*t;// calculando a3, b3
   cout  << "t = " << t << "  --> (a3(t), b3(t)) = "<< " (3t + 4, 3 - 2t) = " 
                  << "(" << a3 << "," <<  b3 << ")" << endl;// (20)  	
   cout  << "\t Verificando se os pontos se encontram sobre uma reta. " 
			<< endl
         << "Vou calcular as razões: (b2-b1)/(a2-a1)  e  " << endl
         << "  (b3(t) - b2(t))/(a3(t)-a2(2))." << endl
         << "\t Se os pontos estiverem sobre uma reta, estas duas razões " 
			<< endl
         << "serão iguais. Verificando: "  << endl;
	cin.get(); // (50)
   cin.get(); // (50) (51)
   cout  << "\t Calculando \a \n "
			<< "  (b2 - b1)/(a2-a1) =  " << (b2-b1)/(a2-a1) << endl;
	teste = (b2-b1)/(a2-a1);
   cout  << "  (b3 - b2)/(a3-a2) =  " << (b3 - b2)/(a3-a2) << endl
			<< "Aperte enter para terminar " << endl; 
	// (60) Substituindo igualdade por desigualdade 
	if ( fabs( teste - (b3 - b2)/(a3-a2)  ) < 0.000001 )
			cout << "Os pontos estão sobre uma mesma reta!" << endl;
	else  cout << "Os pontos podem não estar sobre uma mesma reta!" << endl;
   cin.get(); // (50)
   //cin.get(); // (50) (51)
	system("clear"); // limpa a tela com um comando do sh
	return(0);
}


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

(10) 	Toda vez precisarmos de uma variável temos que declará-la
		no início do programa (C++ permite declarar em outros 
		locais, mas você deve evitar de aprender esta desorganização.,,
		Aqui defini uma variável do tipo inteiro:  int 
		Outra formas de fazê-lo
		int t = 0;    definindo e escolhendo um valor inicial
		int t(0);	definindo e escolhendo um valor inicial

(15)  O método do C de trocar linhas permite este erro, depois da
		troca de linha ainda foi impresso o espaço que se encontra
		depois de \n .

(20)  Quando C++ eoncontrar ;  ele considera a sentença terminada.
		Esta sentença contem vários acessos ao objeto "cout",
		exatamente 8 acessos.

(21)  Terminei a sentença, mas não quero mudança de linha neste ponto.

(30)  Fiz um acesso ao objeto cin que atribue valores a variáveis.
		Para fazer o mesmo com variáveis do tipo string é preciso
		usar um outro objeto. Faça
				grep chave 
		para encontrar um programa que faça este tipo de atribução
		como exemplo.

(50)  Acesso ao método   get() de cin para fazer uma leitura de
		coisa nenhuma - somente para parar o programa.
(51)  Aqui é preciso fazer duas leituras porque usei cin para
		receber dados e ficaram dados no buffer de leitura
		Na primeira chamada o buffer é limpo, na segunda chamada
		faz a leitura do teclado (recebe o enter)

(60)  A igualdade  "teste == (b3 - b2)/(a3-a2)"  não é reconhecida
		em primeiro06.cc 
		Este é um problema simples de explicar. Há alguma pequena diferença
		entre os dois números 
			"(b3 - b2)/(a3-a2)"  e  "teste = (b2-b1)/(a2-a1)"
		o suficiente para que C++ não reconheça como iguais. Substitua
		o teste de igualdade por uma desigualdade. 
		A saída consiste em substituir o teste de igualdade por uma 
		teste de desigualdade 

(100) Este programa usa a função fabs -  valor absoluto que se encontra
		definida na biblioteca  math.h  mas é preciso compilar com a diretiva
		-lm  para que seja feita a ligação (lincagem) com esta biblioteca.
		Se você omitir  -lm  na compilação - o compilador vai dizer que não
		sabe que função fabs() é esta. Experimente!
		
*/

