[résolu][C]Aide programmation somme de série numérique.

Aide programmation somme de série numérique. [résolu][C] - C - Programmation

Marsh Posté le 08-04-2006 à 10:29:35    

Bonjour, je suis débutant en programmation et j 'aurais besoin d'un petit coup de main. Voilà je m'explique, il m'a été demandé de traduire un programme sur une calculatrice TI-89 permettant de calculer les sommes partielles de séries numériques, en langage C.
 
Voilà le programme sur TI-89:
 
 
somme(n)  
Func  
local s,i,u  
1/n^2->u(n)  
0->s  
for i,1,n  
 u(i)+s->s  
endfor  
s  
EndFunc
 
 
En vous remerciant d'avance...

Message cité 1 fois
Message édité par mat445 le 09-04-2006 à 20:37:34
Reply

Marsh Posté le 08-04-2006 à 10:29:35   

Reply

Marsh Posté le 08-04-2006 à 10:43:33    

mat445 a écrit :

Bonjour, je suis débutant en programmation et j 'aurais besoin d'un petit coup de main. Voilà je m'explique, il m'a été demandé de traduire un programme sur une calculatrice TI-89 permettant de calculer les sommes partielles de séries numériques, en langage C.


A part apprendre le langage C, je ne vois pas comment tu pourrais t'en sortir autrement. Ou alors je te fais le code pour 1 euro le signe.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-04-2006 à 11:49:49    


#include <stdio.h>
 
 
double somme (int n)
{      
      int i;
      double s = 0;
      for (i=1;i<n+1;i++)
      {
          s += 1/(i^2);
      }
      return (s);
}      
 
int main()
{
     
    int n;
    printf("donnez un entier\f" );
    scanf("%d",&n);
         
    printf("la somme numerique est %f \n",somme(n));
    return(1);
}      
 
               

Reply

Marsh Posté le 08-04-2006 à 12:13:00    


Ok, tu casses les prix, mais dans  

         s += 1/(i^2);


^ signifie XOR...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-04-2006 à 15:24:42    

mbarekh a écrit :

Code :
  1. s += 1/(i^2);



 
Ce qu'a voulu dire Emmanuel, c'est qu'en langage C, il n'y a pas d'opérateur pour "puissance".
 
En utilisant la librairie "libm.a", tu as accès à la fonction "pow()" mais je ne crois pas que ce soit utile pour un simple carré...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-04-2006 à 15:41:42    

et voila un programme qui marche bien:
 
 
 
#include <stdio.h>
 
 
double somme (int n)
{      
      int i;
      double s = 0;
      for (i=1;i<n+1;i++)
      {
          s += 1/((double)i*(double)i);
      }
      return (s);
}      
 
int main()
{
     
    int n;
    printf("donnez un entier\n" );
    scanf("%d",&n);
         
    printf("la somme numerique est %f \n",somme(n));
    return(1);
}      

Reply

Marsh Posté le 08-04-2006 à 15:56:54    

Je vous remercie de m'avoir aidé. A bientôt...

Reply

Marsh Posté le 08-04-2006 à 17:21:20    

J'ai réussi à compiler se programme et à l'exécuter. Lorsque je l'exécute il me demande bien de "donnez un entier" puis quand je rentre un entier et j'appuie sur entrée la fenêtre se ferme. J'aimerais savoir comment on peut afficher le résultat et si possible généraliser ce programme pour n'importe quelle suite? Merci d'avance...

Reply

Marsh Posté le 08-04-2006 à 17:43:46    

Généraliser ce programme pour n'importe quelle suite ??
 
C'est-à-dire ??
 
Tu peux toujours faire une boucle tant que

Reply

Marsh Posté le 08-04-2006 à 17:53:29    

En fait je voudrais le généraliser dans le sens ou il ne servirait pas qu'à une  fonction particulière comme ici (1/n²) cela me permettrait de mettre n'importe quelle fonction comme (n²,n^3,1/(n+1),etc...).Je sais pas si j'ai répondu à ta question. J'aimerais savoir si tu avais une idée pour pouvoir afficher le résultat final? Merci d'avance...

Reply

Marsh Posté le 08-04-2006 à 17:53:29   

Reply

Marsh Posté le 08-04-2006 à 18:23:54    

ajoute  
 
system("PAUSE" );  
 juste avant le  dernier acolade et recompile

Reply

Marsh Posté le 08-04-2006 à 18:27:29    

je me suis trompé ajoute le avant return(1)

Reply

Marsh Posté le 08-04-2006 à 18:27:37    

ok je te remercie.

Reply

Marsh Posté le 08-04-2006 à 18:45:41    

J'ai placé system("PAUSE" );
là où tu me l'as indiqué mais lorsque je le compile il me retourne une erreur .

Reply

Marsh Posté le 08-04-2006 à 18:48:54    

tu utilises devc++?
sinon quelle compilateur tu utilises?

Reply

Marsh Posté le 08-04-2006 à 19:17:37    

J'utilise devc++ et pour le compilateur je crois que c'est celui par défaut. Pour le problème de system("pause" ) j'ai trouvé la solution. Maintenant il doit y avoir un problème dans la formule car quand j'execute le programme il me demande un entier alors je rentre 10 par exemple et il m'affiche la somme numérique est 0.00000. Merci pour ton aide

Reply

Marsh Posté le 08-04-2006 à 19:24:48    

non chez moi ca marche
monter moi tout ton code

Reply

Marsh Posté le 08-04-2006 à 19:47:01    

Voilà ce que j 'ai:
 
#include <stdio.h>  
#include <stdlib.h>  
 
double somme (int n)  
{      
      int i;  
      double s = 0;  
      for (i=1;i<n+1;i++)  
      {  
          s += 1/((double)i*(double)i);  
      }  
      return (s);  
       
}  
int main(){
     
    int n;  
    printf("donnez un entier\n" );  
    scanf("%d",&n);  
         
    printf("la somme numerique est %f \n","somme(n)" );
    system("pause" );
    return(1);    
}

Reply

Marsh Posté le 08-04-2006 à 19:52:47    

c est normal
y a pas de parenthhèses autour de somme(n) dans la ligne:
printf("la somme numerique est %f \n","somme(n)" )  
 
il faut ecrire
 
printf("la somme numerique est %f \n",somme(n))  

Reply

Marsh Posté le 08-04-2006 à 19:53:52    

mbarekh a écrit :

c est normal
y a pas de parenthhèses


guillemets !
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-04-2006 à 19:54:50    

oui guillemets pardon

Reply

Marsh Posté le 08-04-2006 à 20:44:22    

C'est impeccable ca marche nickel. Je te remercie encore. Est ce que tu saurais passer de 1/((double)i*(double)i) à u(i) afin de mettre n'importe quelle fonction?

Reply

Marsh Posté le 08-04-2006 à 21:48:53    

mat445 a écrit :

C'est impeccable ca marche nickel. Je te remercie encore. Est ce que tu saurais passer de 1/((double)i*(double)i) à u(i) afin de mettre n'importe quelle fonction?


Ca, c'est très complexe. Il faut un analyseur de syntaxe, de sémantique... C'est un problème d'algorithme et non de C.
 
Des outils de réalisation comme lex et yacc (ou GNU/flex & GNU/bison), peuvent aider...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-04-2006 à 22:00:03    

Je vous remercie quand même de votre aide. A bientôt...

Reply

Marsh Posté le 08-04-2006 à 22:17:31    

Emmanuel Delahaye a écrit :

Ca, c'est très complexe. Il faut un analyseur de syntaxe, de sémantique... C'est un problème d'algorithme et non de C.
 
Des outils de réalisation comme lex et yacc (ou GNU/flex & GNU/bison), peuvent aider...


 
 
Ou alors :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4.  
  5. int main(void)
  6. {
  7.  char* debut="#include <stdio.h>\n#include <stdlib.h>\n double u(int i){return ";
  8.  char* fin=";} double somme(int n){/*le code de somme avec u(i); */} int main(void) {/* le main */}";
  9.  char* fonction;
  10.  puts("Entrez la fonction a calculer (avec i la variable):\nU=" );
  11.  scanf("%as",&fonction);
  12.  code = asprintf("echo  \"%s%s%s\" > tmpcode.c && gcc -o tmpexe tmpcode.c",debut,fonction,fin);
  13.  system(code);
  14.  execl("./tmpexe", NULL);
  15. }


 
 :whistle:

Message cité 1 fois
Message édité par 0x90 le 08-04-2006 à 22:20:27

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 08-04-2006 à 22:22:33    

0x90 a écrit :

Ou alors :


Un générateur de code à la volée ? Pas bête...


Message édité par Emmanuel Delahaye le 08-04-2006 à 22:23:09

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-04-2006 à 22:23:45    

mat445 a écrit :

Je vous remercie quand même de votre aide. A bientôt...


Sympa la restriction...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-04-2006 à 22:41:22    

Désolé Emmanuel pour le "quand même" c'est pas ce que je voulais dire. Merci à tous...

Reply

Marsh Posté le 08-04-2006 à 23:15:26    

Bonsoir,
 
Au lieu de 1/(double(i)/double(i)

 


tu peux écrire plus élégamment :
 
1.0/i/i

Reply

Marsh Posté le 09-04-2006 à 10:58:53    

mat445 a écrit :

En fait je voudrais le généraliser dans le sens ou il ne servirait pas qu'à une  fonction particulière comme ici (1/n²) cela me permettrait de mettre n'importe quelle fonction comme (n²,n^3,1/(n+1),etc...).Je sais pas si j'ai répondu à ta question. J'aimerais savoir si tu avais une idée pour pouvoir afficher le résultat final? Merci d'avance...


 
On peut pas généraliser de façon totalement indépendante du programmeur (style je rentre ma suite en littéral et le pgm se débrouille tout seul) mais on peut découper le programme de façon à séparer la suite de la boucle qui calcule sa somme
 
Au lieu d'écrire "s+=1/(double)i/(double)i"
Tu écris "s+=suite(i)"
 
Ensuite, tu codes le corps de "suite(i)" de la façon que tu veux, par exemple

double suite(int i)
{
      return 1/(double)i/(double)i;
}


 
Le jour où ta suite change, tu changes juste le corps de ta fonction...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed