Simples algoritmo em C

1 resposta
diegohsi

Olá pessoal, alguem poderia me da um auxilio neste algoritmo, não sei se é a minha lógica ou se é uma especificação da linguagem c, em fim, não estou recebendo o valor desejado,
o algoritmo se trata do somatorio de n termos que o usuario infomra retornando seu resultado.

[b]Faça um programa para calcular seno ou cosseno de um dado ângulo. O seno ou
cosseno deve ser calculado iterativamente por meio da soma aproximada das séries
infinitas que os definem, a saber: Considere a equação que usei*

Entradas / saida

Você deseja entrar com o ângulo em graus ou radianos (g/r)? g
Qual a medida do ângulo? 30
Você deseja calcular seno ou cosseno deste ângulo (s/c)? s
Quantas iterações da série você deseja executar? 10
Resposta = 0.49998[/b]

#include<stdio.h>
#include<math.h>
/*PI = 3,14159...
 * RAD = PI*G/180
 * */

int main(void) {

	char grausRad, senCos;
	int i, iteracao;
	float sen, cos, angulo, rad, PI;
	PI = 3.14159;

	printf("Voce deseja entrar com o angulo em Graus ou Radianos (g/r)? ");
	scanf("%s", &grausRad);

	printf("Qual a medida do angulo: ");
    scanf("%f", &angulo);

	printf("Voce deseja calcular Seno ou Cosseno deste angulo (s/c)? ");
	scanf("%s", &senCos);

	printf("Quantas iteracoes da serie voce deseja executar? ");
	scanf("%d", &iteracao);

	if(grausRad == 'g'){
		rad = PI*angulo / 180;
		printf("%.5f g", rad);}
	else
      if(grausRad == 's') {
         rad = angulo;
         printf("%.5f r", rad);}

	sen = 0.0;
	cos = 0.0;
	if(senCos == 's') {
		for(i = 0; i <= iteracao; i++){
			sen = sen + (float) ((pow(-1, i) / fatorial(2*i + 1)) * pow(rad, 2*i+1));
			//Mostrando sen na tela para teste
            printf("sen: %d\n", sen);
		}
		printf("\n\nResposta: %.5f\n\n\n", sen);
	}
	else {
		for(i = 0; i < iteracao; i++){
			cos = cos +  (float)(((pow(-1, i)) / ((fatorial(2*i)) * pow(rad, 2*i))));
			//Mostrando o cos na tela para teste
			printf("cos: %d\n", cos);
		}
		printf("\n\nResposta: %.5f\n\n\n", cos);
	}

	return 0;
}

int fatorial(int numero) {
    int j, fat;
    fat = 1;
	for(j = 1; j < numero; j++) {
		fat *=  j;
	}
	//Mostrando o fat na tela para teste
	printf(" - fat: %d\n", fat);
	return fat;
}

1 Resposta

jamirdeajr
A função que calcula fatorial tem um errinho:
int fatorial(int numero) {
    int j, fat;
    fat = 1;
	for(j = 1; j <= numero; j++) {   // Aqui tinha que ser '<=' e não  '<' - então fatorial de 2 por exemplo retornava 1 e não 2... e assim por diante
		fat *=  j;
	}
	//Mostrando o fat na tela para teste
	printf(" - fat: %d\n", fat);
	return fat;

}
Se quiser deixar mais 'elegante' faça ela usando recursividade:
int fatorial (int numero)  {  
        if(numero==1)   
            return numero;  
        return fatorial(numero-1) * numero;            
}
Outra coisa, teus printfs de depuração estavam usando %d em vez de %f para variáveis float, então o resultado não era mostrado corretamente; No scanf também estava esperando array de chars e definido somente char, então poderia haver sobreposição de memória. Abaixo sugestão das alterações:
#include<stdio.h>  
#include<math.h>  
/*PI = 3,14159... 
* RAD = PI*G/180 
* */  
  
int main(void) {  
	char grausRad[2], senCos[2];
	int i, iteracao;
	float sen, cos, angulo, rad, PI;
	PI = 3.14159;

	printf("Voce deseja entrar com o angulo em Graus ou Radianos (g/r)? ");
	scanf("%s", grausRad);

	printf("Qual a medida do angulo: ");
        scanf("%f", &angulo);

	printf("Voce deseja calcular Seno ou Cosseno deste angulo (s/c)? ");
	scanf("%s", senCos);

	printf("Quantas iteracoes da serie voce deseja executar? ");
	scanf("%d", &iteracao);

	if(grausRad[0] == 'g'){
		rad = PI*angulo / 180;
		printf("%.5f g", rad);}
	else
        if(grausRad[0] == 's') {
           rad = angulo;
           printf("%.5f r", rad);
        }
	sen = 0.0;
	cos = 0.0;
	if(senCos[0] == 's') {
		for(i = 0; i <= iteracao; i++){
			sen = sen + (float) ((pow(-1, i) / fatorial(2*i + 1)) * pow(rad, 2*i+1));
			//Mostrando sen na tela para teste
            printf("sen: %.5f\n", sen);
		}
		printf("\n\nResposta: %.5f\n\n\n", sen);
	}
	else {
		for(i = 0; i < iteracao; i++){
			cos = cos +  (float)(((pow(-1, i)) / ((fatorial(2*i)) * pow(rad, 2*i))));
			//Mostrando o cos na tela para teste
			printf("cos: %.5f\n", cos);
		}
		printf("\n\nResposta: %.5f\n\n\n", cos);
	}
	return 0;
}

int fatorial (int numero)  {  
        if(numero==1)   
            return numero;  
        return fatorial(numero-1) * numero;            
}
Criado 18 de maio de 2011
Ultima resposta 18 de mai. de 2011
Respostas 1
Participantes 2