• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

amp

Dúvida em C

1 mensagem neste tópico

Boas,

Eu tenho de fazer um programa para calcular a derivada de algumas funções.

O programa deve conter:

a) Uma função ’deriv’, que recebe, como argumentos, um ponteiro para a função a derivar e o ponto em que a deve calcular e que retorna o valor da derivada nesse ponto;

:) A verificação de que a funçãoao está definida nesse ponto;

c) Um menu que permita ao utilizador escolher qual a funçãoao a utilizar e que, concluída a operação, volta a pedir uma nova escolha;

d) A derivada deve ser calculada a partir da expressao aproximada.

Inicialmente, temos de chamar o programa e inserir na shell o que queremos fazer e, feitos todos os calculos, mostra a derivada, assim como o respectivo erro. Depois, temos de mostrar a opção de reiniciar.

A minha dúvida é a seguinte: é possível definir uma função imprime() que  substitua o texto todo que eu tenho no switch?

Se for alguém me poderia dar uma sugestão sobre como fazer?

Deixo aqui o programa que já fiz.

Agradecia imenso se alguém me pudesse ajudar. E fiquem à vontade para falar de eventuais erros  :)  :)

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#include <math.h>

#define N 6
#define h 1e-8

//funcao de derivacao
double 
deriv (double (*f)(double),double x)
{
  double valor;
  
  valor=( f(x+h)-f(x) )/h;
  
  return valor;
}

//Funcao de Ajuda
void
ajuda (status)
{
  printf("\t\t\t MENU AJUDA\n\n");
  printf("A entrada na linha de comando deve ter a seguinte forma:\n\n");
  printf("   <nome_programa> <nome_funcao> <ponto_a_derivar>\n");
  
  printf("\nFuncoes:\n\n");
  printf("    'sin','cos','tan','asin','acos','log','log10'\n");
  
  printf("\nAtencao! As seguintes funcoes apenas tem derivada em:\n");
  printf("\ntan(x)  : {x: x!=k*(PI/2), k inteiro diferente de zero}");
  printf("\nacos(x) : {x:|x|<1}");
  printf("\nasin(x) : {x:|x|<1}");
  printf("\nlog(x)  : {x: x>0}");
  printf("\nlog10(x): {x: x>0}\n\n");
  exit(status);
} 

//funcao: verifica o nome da funcao inserida
int 
verif_func (char *arg, char **f)
{
  int i;
  for(i=0;i<N+1;++i)
    if( strcmp(arg,f[i])==0 )
      break;
  
  if(i>N)
    {
      printf("\n  *** Inseriu um nome invalido para a funcao a derivar! ***\n\n");
      ajuda(-2);
    }
  else
    return (i+1);
}

//funcao:verifica o ponto inserido
double 
verif_ponto (char* arg)
{
  double n;
  
  if( sscanf(arg,"%lf",&n)==0 )
    {
      printf("\n\t*** Tem de inserir um valor numerico valido! ***\n\n");
      ajuda(-3);
    }
  else
    return n;
}

//Pontos onde nao existe derivada
void 
n_def()
{
  printf("\n\t*** A funcao nao tem derivada neste ponto ***\n\n");
  ajuda(-4);
}


//Main
int
main(int argc,char **argv)
{
  int func=0;
  double pt=0,valor,der,erro;
  char *funcao[7]={"sin","cos","tan","asin","acos","log","log10"};
  char s[5],saida[2];
  
  //verifica o numero de argumentos
  if( argc!=3)
    {
      printf("\n\t*** Numero de argumentos invalido! ***\n\n");
      ajuda(-1); 
    }
  
  //verifica a funcao inserida
  func=verif_func (argv[1],funcao);
  //verifica o ponto inserido
  pt=verif_ponto (argv[2]);
  
  while(1)
    {  
      printf("\nFuncao a derivar:%s" ,funcao[func-1]);
      printf("\nPonto escolhido :%.9lf\n\n",pt);
      
      //Imprime os valores da funcao
      switch (func)
{
case 1:printf("\tDerivada de sin(x) no ponto %.9lf : %.9lf",pt,valor=deriv(sin,pt) );
  printf("\n\tValor de cos(x) no ponto    %.9lf : %.9lf",pt, der=cos(pt) );
  break;
case 2:printf("\tDerivada de cos(x) no ponto %.9lf : %.9lf",pt, valor=deriv(cos,pt) );
  printf("\n\tValor de -sin(x) no ponto   %.9lf : %.9lf",pt,der=-sin(pt));
  break;
case 3:
  if(fmod(pt,M_PI/2)==0 && pt!=0) n_def();
  printf("\tDerivada de tan(x) no ponto    %.9lf: %.9lf\n",pt, valor=deriv(tan,pt) );
  printf("\tValor de tan(x)^(2)+1 no ponto %.9lf: %.9lf",pt, der=(tan(pt)*tan(pt)+1));
  break;
case 4:
  if(pt<(-1+h) || (pt+h)>1) n_def();
  printf("\tDerivada de asin(x) no ponto    %.8lf: %.9lf",pt, valor=deriv(asin,pt) );
  printf("\n\tValor de 1/sqrt(1-x*x) no ponto %.8lf: %.9lf",pt, der=1/sqrt(1-pt*pt) );
  break;
case 5:
  if(pt<(-1+h) || (pt+h)>1) n_def();
  printf("\tDerivada de acos(x) no ponto     %.8lf: %.9lf\n",pt, valor=deriv(acos,pt) );
  printf("\tValor de -1/sqrt(1-x*x) no ponto %.8lf: %.9lf",pt, der=-1/sqrt(1-pt*pt) );
  break;
case 6:
  if(pt<=0) n_def();
  printf("\tDerivada de log(x) no ponto %.9lf: %.9lf",pt, valor=deriv(log,pt) );
  printf("\n\tValor de 1/x no ponto       %.9lf: %.9lf",pt, der=1/pt);
  break;
case 7:
  if(pt<=0) n_def();    
  printf("\tDerivada de log10(x) no ponto %.9lf  : %.9lf",pt, valor=deriv(log10,pt) );
  printf("\n\tValor de 1/(x*log(10)) no ponto %.9lf: %.9lf",pt, der=1/(pt*log(10)) );
  break;
}
  		
      //Mostra o erro no calculo
      erro=fabs(valor-der);
      printf("\n\n\tErro absoluto no calculo da derivada : %.9lf\n",erro);
//   printf("\tErro relativo no calculo da derivada : %.9lf %%\n\n",fabs(erro/der)*100);
      
      //Opcao-Reiniciar
      printf("\nDeseja reiniciar ('s'/'n')? ");
      printf("\nRes: ");
      scanf("%s",saida);
      if(strcmp(saida,"s")!=0 && strcmp(saida,"S")!=0)
return 0;
      
      //Pede nova funcao e verifica
      printf("\n\nIntroduza uma nova funcao a derivar:");
      printf("\nRes: ");
      scanf("%s",s);
      func=verif_func(s,funcao);
      
      //Pede ponto de derivacao e verifica
      printf("\nAgora introduza o ponto de derivacao");
      printf("\nRes: ");
      scanf("%s",s);
      pt=verif_ponto(s);
    }
  
  return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora