/* Programa    primeiro06.cc  
	Assunto:   Tutorial sobre cálculos aritméticos.
	Condicionantes:
		g++ -Wall -oprog primeiro06.cc

	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()
   por Tarcisio Praciano Pereira - 10 licoes para aprender C++
   Sobral, Abril de 2005	- UeVA    	      		
*/

#include <iostream>
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;
	cout << "O comando responsável por isto se encontra acima, \"system()\"   " << 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  << "\t Portanto os pontos calculados estarão verdadeiramente sobre"<< endl
   		<< "uma mesma reta e você vai ver que os coeficientes angulares dos segmentos"<< endl
   		<< "de reta calculados coincidem.... mas a mensagem final é extranha! "<< endl;
   cout 	<< "==========================================================" << endl;		
   cout  << "\t  Calculando primeiro ponto sobre a reta: " << endl; 		
   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 	<< "==========================================================" << endl;		
   cout  << "\t  Calculando o segundo  ponto sobre a reta: " << endl; 		
   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 	<< "==========================================================" << endl;		
   cout  << "\t  Calculando o terceiro  ponto sobre a reta: " << endl; 		
   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 	<< "==========================================================" << endl;		                  
   cout  << "\t Verificando se os pontos se encontram sobre uma mesma 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) O programa não detecta que os coeficientes são iguais
	if (teste == (b3 - b2)/(a3-a2))
			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)
	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 . Veja a diferença no uso de endl e de \n 

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

(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.
		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. Ver primeiro07.cc

*/

