Code correct?

Fermé
jaouabi Messages postés 5 Date d'inscription mardi 8 novembre 2016 Statut Membre Dernière intervention 10 novembre 2016 - Modifié par Judge_DT le 8/11/2016 à 15:33
CrazyGeekMan Messages postés 873 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 26 novembre 2024 - 8 nov. 2016 à 21:07
bonjour a tous
c'est un programme qui prend l'enseble des reels ecrit au clavier et lorsque le nombre 12.34 s'ecrit il calcule leurs moyenne.
est ce que vous pouvez me dire qu'elle est la faute dans mon code et merci d'avance.
voici le code source
#include <stdio.h>
int main()
{
float x,s,moy;
int i;
scanf("%i", &x);
s=0;
i=0;
while (x!=12.34)
{
    s+=x;
    scanf("%i",&x);
    i++;
}
moy=s/i;
printf ("%f",moy);
return 0;
}
A voir également:

2 réponses

CrazyGeekMan Messages postés 873 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 26 novembre 2024 136
Modifié par CrazyGeekMan le 8/11/2016 à 15:06
Salut,

Je n'ai pas trop compris le fonctionnement du programme ^^
En tout cas, si tu met int i alors tu dois mettre scanf("%d",&i)
Et pour float x, tu dois mettre printf("%f",&x)
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
8 nov. 2016 à 15:29
Non, i est un entier utilisé comme compteur du nombre de notes saisies.
0
CrazyGeekMan Messages postés 873 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 26 novembre 2024 136 > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
8 nov. 2016 à 16:09
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 8/11/2016 à 16:23
%i
est utilisé dans le
scanf
, et c'est un spécificateur qui existe

http://www.cplusplus.com/reference/cstdio/scanf/

cependant, c'est plutôt
%f
que devrait utiliser jaouabi car le paramètre passé est un pointeur sur float.

ensuite il y a d'autres problèmes liés au fait qu'il tente de comparer un float avec un littéral qui est de type double par défaut... alors sa comparaison devrait être plutôt
while (x!=12.34f)
pour préciser expressément que ce littéral est un float ... cela dit la précision de représentation des nombres flottants fait que ce genre de comparaisons est hasardeuse.

Voir https://stackoverflow.com/questions/8266878/why-floating-point-value-conditions-failed-in-if-condition

par ailleurs, il risque une division par zéro aussi car
i
est mal incrémenté.
0
CrazyGeekMan Messages postés 873 Date d'inscription dimanche 1 novembre 2015 Statut Membre Dernière intervention 26 novembre 2024 136 > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
8 nov. 2016 à 21:07
Eh bien autant pour moi ^^
Désolé et merci pour cette nouveauté pour moi :)
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
8 nov. 2016 à 16:31
Voir https://forums.commentcamarche.net/forum/affich-1928928-c-ansi-comparer-des-doubles-comment pour un exemple prenant en compte la marge de précision.

Epsilon est une constante définie pour chaque type flottant dans float.h

Pour un float, la constante est FLT_EPSILON
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
Modifié par jisisv le 8/11/2016 à 17:08
Ceci fonctionnera mieux:
#include <stdio.h>
#include <math.h>

#define epsilon 1.0e-6

int main()
{
  float x, s, moy;
  int i;
  
  scanf("%f", &x);
  s=0;
  i=0;

while ( fabs( (x - 12.34) /12.34 ) > epsilon )
    {
      s += x;
      scanf("%f", &x);
      i++;
    }

  if ( i )
    {
      moy = s / i;
      printf ("Moyenne : %f\n",moy);
    }
  return 0;
}


Vu la représentation de floats/double sur un ordinateur, tu ne peux pas utiliser la comparaison == / !=
Gates gave ^W  sold  you the windows.
GNU gave us the whole house.(Alexandrin)
0
jaouabi Messages postés 5 Date d'inscription mardi 8 novembre 2016 Statut Membre Dernière intervention 10 novembre 2016
8 nov. 2016 à 17:14
merci pour mais esque il ya une solution possible avec la boucle while seulement car je ne peux pas utiliser la "define epsilon" dans les examens et merci d'ava,ce
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
8 nov. 2016 à 17:57
Essaye :
#include <stdio.h>
#include <math.h>

const float epsilon = 1.0e-6;
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 8/11/2016 à 19:05
Comment sais tu la valeur de epsilon pour son implémentation ?

Si l'on veut bien faire, à mon sens https://forums.commentcamarche.net/forum/affich-34074667-code-correct#5

Epsilon est une constante définie pour chaque type flottant dans float.h

Pour un float, la constante est FLT_EPSILON


Cette constante est définie depuis le standard C89, et sa valeur dépend de l'implémentation, le standard ne fixant qu'une valeur 1E-5 maximale, la valeur réelle pouvant être plus petite (donc la précision plus grande).

Voir le standard (Annexe A.4) + aussi http://www.cplusplus.com/reference/cfloat/
0