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
other
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); }
other
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; }