Programmation debutant en C

Résolu
Bonjour,
J'ai un exercice que je n'arrive pas a résoudre...

Exercice 3 :

En utilisant la boucle itérative la plus pertinante, proposer un programme en langage C qui permet de calculer Un avec n entier saisie par l'utilisateur (pout tout n>0) :

si n<=3 : Un = somme (2p)
si 3<n<=7 : Un = somme ((p-3)/(p+1)) (Toutes les somme vont de p a n)
si n>7 : Un = somme (2p-3)

Qu'est ce qui ne va pas dans mon programme?

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

int main()
{
int n,i;
double u=0;

do
{
printf("Faire la somme de combien de termes?\n");
scanf("%d",&n);
}while(n<=0);

for(i=1;i<=n;i++)
{
if(i<=3)
u=u+2*i;
else
if(3<i<=7)
u=u+(i-3)/(i+1);
else
u=u+2*i-3;
}

printf("La somme des %d premiers termes est de %lf",n,u);

return 0;
}
Configuration: Windows XP Internet Explorer 7.0

5 réponses

  1. En fait, je précise que le probleme, c'est que si je rentre par exemple 6 (donc n=6), il me renvoie 12.
    En fait, il me renvoie toujours 12 pour n>3 (c'est la valeure de u pour n=3)
    Je pense qu'il y a un probleme a partir du else (ou du second if), mais je ne voie vraiment pas lequel!!)
    Merci d'avance de vos reponses!
    1. Hello,
      je vois deux erreurs.
      D'abord, à la ligne 20 (d'après ton post)

      if (3<i<=7)
      Tu essayes de tester deux choses en même temps. Le premier test, 3<i, renvoie soit 0 soit 1 (le type booléen n'existe pas en C), et ensuite le deuxième test doit comparer soit 0 soit 1 avec 7. Résultat => toujours vrai !
      C'est le genre d'erreur sournoise que le compilateur ne détecte pas :P Il faut utiliser &&

      Ta deuxième erreur est plus une erreur de conception : ton programme ne fait pas ce que demande l'énoncé. L'énoncé demande :
      1/ tester où est n par rapport à 3 et 7
      2/ en fonction du résultat, faire une des trois sommes décrites.

      Ton programme fait :
      1/ commencer une somme à n tours
      2/ à chaque tour, regarder où je suis par rapport à 3 et 7
      3/ en fonction du résultat, ajouter une valeur donné par une des trois formules de somme décrites.

      Je sais pas si j'explique bien mais j'espère que tu vois la différence ;)

      Sinon y'a un truc pas clair dans l'énoncé tel que tu le donnes, « toutes les sommes vont de p à n », c'est comme ça en vrai ?
      1. Ah ouais, merci pour le truc avec le if, il va falloir que j'essaie ca!

        Concernant ta deuxieme remarque, le prof nous a expliqué que justement, contrairement a ce que l'on pourrait penser (et c'est d'ailleurs mal formulé je trouve), il faut regarder a chaque tour l'indice n, et calculer en fonction... C'est a dire tel que le programme est ecrit ici.

        Enfin, concernant l'enoncé, je savais pas trop comment le tapper... En fait, dans l'enoncé, il y a le symbole Sygma, avec en dessous "p=1", et au dessus "n", c'est a dire "somme de 1 a n", mais c'était pas évident a formuler, et je m'en excuse!

        Je souhaiterais rajouter une question : Est ce que ca marche quand j'écrit ca?
        u=u+(i-3)/(i+1);
        Je voudrais confirmation, comme quoi on peut utiliser / pour la division...

        Merci pour tes conseils, je vais essayer ca de suite!
        1. for(i=1;i<=n;i++)
          {
          if(i<=3)
          u=u+2*i;
          else
          if(i<=7)
          u=u+(i-3)/(i+1);
          else
          u=u+2*i-3;
          }

          Eh bien apres modification... Le progamme ne fonctionne toujours pas correctement... Il continue a m'afficher 12 pour tout n>3, ce qui est une abération!
          U1 vaut 2
          U2 vaut 6
          U3 vaut 12
          MAIS U4 vaut 12+1\5

          Je pense qu'il y a un probleme dans la ligne 21 " u=u+(i-3)/(i+1);" est ce que le symbole "\" peut servir pour la division?

          Merci d'avance pour vos reponses!
          1. Eh bien finalement, le probleme venait de la declaration des variables.
            En effet, comme i est un entier, la division (i-3)/(i+1) est egalement declarée comme étant un entier!
            Il suffisait donc de declarer i comme double ou comme float, et le probleme et résolu!

            Merci beaucoup a groarh, sans qui une erreure aurait persister dans ce programme, et pour ces remarques pertinantes!

            A bientot!