IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

erreur de logique


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut erreur de logique
    Bonjour,je suis une debutante en programmation ,j ai ecris ce pgr mais je n arrive pas a trouver l erreur,le but etant de calculer les termes de la suite:1/2!+2p2/5!+3p3/8!....+t avec un epsilon donne par l utilisateur,(2p2=2 puissance 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    main()
    {
     int i,j,k;
     float eps,s,p;
     do
     {
      printf("Quelle est la precision desiree?(0<eps<1)");
      scanf("%f",&eps);
     }while((eps<=0)||(eps>=1));
      s=0;
     for(i=1,j=2;i<j*eps,j<i/eps;i++,j+=3)
     {
      p=1;
      for(k=2;k<=j;k--)
      {
       p=p*k;
      }
      s=s+(pow(i,i)/p);
     
     }
     
     printf("s= %f (avec eps= %f)",s,eps);
     getch();
     }
    Biensur tout est elementaire ds ce pgr ,vu que je n en suis qu au tout debut
    Merci d avance pour votre aide

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Et d'une : dans : i<j*eps,j<i/eps , (ton test de boucle for) il y a comme un problème, puisque j < i / eps est sensiblement identique à j * eps < i, donc il faut choisir
    • ou i < j * eps
    • ou i > j * eps
    mais pas les deux en même temps.
    Et de deux, dans l'enchainement i < j * eps, j < i / eps, la valeur retournée par l'évaluation, en C, est celle de j < i / eps.

    Donc réfléchis bien à ce que tu veux faire et enlève une des deux inégalités.

    Maintenant, le prototype de main dans ton cas est int main(void), il ne faut pas écrire main(), c'est du mauvais C.

    Enfin, (pour le moment), es-tu sûr de cette boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      for(k=2;k<=j;k--)
      {
       p=p*k;
      }
    Car soit tu ne rentres jamais dans la boucle si 2 est plus grand que j, soit tu n'en sors jamais puisque tu décrémentes k au lieu de l'augmenter, (k++)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Trap D
    Maintenant, le prototype de main dans ton cas est int main(void), il ne faut pas écrire main(), c'est du mauvais C.
    C'est pas du mauvais, c'est pas du C (selon la norme actuelle du langage).

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par mujigka
    C'est pas du mauvais, c'est pas du C (selon la norme actuelle du langage).
    Oui mais selon la norme la plus utilisée (C90), c'est authorisé, en l'absence de type de retour, c'est int par défaut (c'est moins pire que mettre void)

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Par défaut
    Effectivement il faut k++ pour le calcul de la factoriel
    p=1;
    for(k=2;k<=j;k--)
    {
    p=p*k;
    }

    Mais aussi les tests d'arrêt i<j*eps,j<i/eps à la précision epsilon de ta série risque de poser un problème de convertion (je n'en suis pas certain):

    i,j sont des entiers divisés ou mutipliés par un flottant compris dans ]0 1[

  6. #6
    Nouveau candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 2
    Par défaut
    Ah oui ,c est en effet vrai,donc i<j*eps est suffisante si j ai bien compris?
    pour la décrémentation de k c est k++
    En ce qui concerne le main(),c est vrai que dans un .c il y aurait un warning par contre dans un .cpp il l'accepte.Et je suis d'accord sur le fait que ce n est pas rigoureux ,je me demande d'ailleurs pourquoi on ns apprend a programmer avec C ds des fichiers cpp ?!
    merciii bppp pour votre aide

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par 1debutante
    En ce qui concerne le main(),c est vrai que dans un .c il y aurait un warning par contre dans un .cpp il l'accepte.
    Non c'est l'inverse : Les incompatibilités entre le C et le C++

Discussions similaires

  1. Erreur de logique avec do while switch
    Par artemis93 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 26/06/2011, 21h54
  2. erreur n'est pas logique
    Par info_sara dans le forum Flash
    Réponses: 14
    Dernier message: 05/06/2008, 21h36
  3. erreur n'est pas logique
    Par info_sara dans le forum C++Builder
    Réponses: 9
    Dernier message: 01/06/2008, 17h51
  4. Erreur de logique introuvée
    Par gorgonite dans le forum Prolog
    Réponses: 5
    Dernier message: 28/09/2006, 15h20
  5. Réponses: 4
    Dernier message: 04/08/2006, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo