ep2-1891316.cpp
/*******************************************************/
/* Aluno: Roberto Gumercindo Furtado */
/* N?mero USP: 1891316 */
/* Exercicio-Programa 2 -- grafico seno e cosseno */
/* MAC115 -- 2008 -- IFUSP, turma 21 -- Prof. Reverbel */
/* Compilador: DevC++ vers?o 4.9.9.2 */
/*******************************************************/
#include<stdio.h>
#include<stdlib.h>
#define EPSILON 1.0e-8
#define PI 3.14159265359
float modulo(float x){ /* fun??o que devolve |x| */
if (x < 0)
return -x;
else
return x;
}
float raiz_quadrada(float x, float eps){ /* calcula raiz quadrada de qualquer x real */
float r1=0.0, r2 = modulo(x); /* para evitar erro em x<0, tomamos |x|, neste caso a raiz ? complexa */
while (modulo(r2-r1) >= eps){
r1=r2;
r2=0.5*(r1+(x/r1));
}
return r2;
}
float seno(float x, float eps){ /* fun??o que calcula seno de qualquer x real */
int n=3;
float soma, parcela; /* seno = soma final soma = parcela1 + parcela2 + ... */
while (x > PI){ /* reduz x positivo entre 0 e PI */
x = x - (2*PI);
}
while (x < (-1*PI)){ /* reduz x negativo entre 0 e -PI */
x = x + (2*PI);
}
soma=x;
parcela=x;
while (modulo(parcela) >= eps){
parcela = (-1)*parcela*x*x/(n*(n-1));
soma = soma + parcela;
n = n+2;
}
return soma;
}
float cosseno(float x, float seno_x){ /* fun??o que calcula cosseno de qualquer x real */
while (x > PI){ /* reduz x positivo entre 0 e PI */
x = x - (2*PI);
}
while (x < (-1*PI)){ /* reduz x negativo entre 0 e -PI */
x = x + (2*PI);
}
if (modulo(x) > (PI/2))
return (-1)*raiz_quadrada(modulo(1-(seno_x*seno_x)),EPSILON); /* para cos < 0 */
else
return raiz_quadrada(modulo(1-(seno_x*seno_x)),EPSILON); /* para cos >= 0 */
}
void imp(int n){ /* fun??o que imprime n caracteres "branco" */
for (;n>0;n--){
printf(" ");
}
return;
}
int main( ){
float x,x1,x2,aux,passo; /* x ? o argumento das fun??es seno e cosseno, e passo ? a varia??o do argumento */
int a1,a2,a3,cos,sen,n; /* a1,a2 e a3 s?o os valores da posi??o de impress?o dos caracteres + x e | */
char c1,c2,c3; /* c1,c2,c3 s?o os carcteres x ou + ou | impressos na tela em ordem de acordo com a1,a2 e a3 */
printf("\n digite intervalo do grafico em radianos\n valor inicial :");
scanf("%f",&x1);
printf(" valor final :");
scanf("%f",&x2);
printf(" digite o numero de pontos do grafico :");
scanf("%d",&n);
printf("\n");
passo = (x2-x1)/n;
printf("-1"); /* come?a impress?o do eixo f(x) e da escala */
imp(37);
printf("0");
imp(37);
printf("1\n");
printf("-+");
for (a1=1;a1<38;a1++)
printf("-");
printf("+");
for (a1=1;a1<38;a1++)
printf("-");
printf("+-\n"); /* termina impress?o do eixo f(x) */
for (x=x1; x<=x2; x=x+passo){ /* come?o do la?o para calcular e imprimir n pontos */
aux = seno(x,EPSILON);
cos = (int)(38*cosseno(x,aux) + 39.5);
sen = (int)(38*aux + 39.5);
if (sen > cos){ /* inicio da rotina que vai ordenar em a1,a2 e a3 os valores de sen,cos e eixo */
a1=cos; /* nesta rotina c1 recebe o caractere correspondente ao menor entre sen, cos e eixo */
c1='x'; /* o valor de eixo = 39 (local central do gr?fico) com carctere | */
a2=sen; /* se sen<0, e cos >0 ; teremos a1=sen, a2=39(eixo) e a3=cos */
c2='+'; /* neste exemplo c1=+ , c2=| e c3=x */
}
else {
a2=cos;
c2='x';
a1=sen;
c1='+';
}
if (a1>39){
a3=a2;
a2=a1;
a1=39;
c3=c2;
c2=c1;
c1='|';
}
else {
if(a2<39){
a3=39;
c3='|';
}
else {
a3=a2;
c3=c2;
a2=39;
c2='|';
}
} /* final da rotina que ordenou sen, cos e eixo em a1, a2 e a3, com os correspondentes c1, c2 e c3 */
printf(" "); /* come?a impress?o de f(x) e a primeira coluna fica em branco */
imp(a1-1);
if (a1==a2) /* neste caso a1=a2 temos que sen=cos ou igual ao eixo central, marcamos ent?o * */
printf("*");
else
printf("%c",c1);
a1=a2-a1; /* a variavel a1 foi usda como aux para calcular os espa?os em branco, pois ela n?o mais ser? usada */
if (a1>0){
imp(a1-1);
if (a2==a3) /* neste caso a2=a3 temos que sen=cos ou igual ao eixo, marcamos ent?o * */
printf("*");
else{ /* neste caso a1, a2 e a3 s?o diferentes e marcamos al?m de c1, o c2 e c3 */
printf("%c",c2);
imp(a3-a2-1);
printf("%C",c3);
}
}
else{ /* neste caso s? a3 ? diferente, pois a1=a2, marcamos na posi??o a3 o carctere c3 */
if (a3>a2){
imp(a3-a2-1);
printf("%C",c3);
}
}
printf("\n");
}
system ("pause"); /* linha acrescentada para visualizar o programa na tela*/
return 0;
}