Programme moyenne

Résolu
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 - Modifié par cptpingu le 16/09/2015 à 17:57
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 - 16 sept. 2015 à 21:34
Bonjour, je souhaite votre aide pour un programme que j'ai écris ! Je précise que je suis étudiant, que c'est un exercice qui n'a pas de correction mais je voudrais savoir surtout pour moi, j'espère que vous comprendrez :

// -- bibliothèques nécessaires --
#include <stdio.h>
#include <conio.h>

// -- programme principal --
int main () {
 
 // déclarations
 float note = 0 ;
 float cumul = 0 ;
 float nbre ;
 const char * rep = "O" ;
 
 
 // saisie de la moyenne
 while(rep = "O") {
  printf(" Entrer une note = ") ;
  scanf("%f",¬e) ;
  cumul += note ;
  nbre++ ;
  printf(" Voulez-vous continuer ? (O/N)") ;
  scanf("%s",&rep) ;
 }
 printf(" Afficher cumul/nb ") ;
 
 getch () ;
 return 0 ;
}


je précise la dessus que e n'ai pas d'erreur mais 2 warning : Un qui dit (format '%s' expects type 'char*', but argument 2 has type 'const char**' ), et l'autre qui me dit : suggest parentheses around assignment used as truth value

2 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 16/09/2015 à 18:03
Bonjour.

Tu as plusieurs soucis:
  • Tu assignes une variable au lieu de la comparer => while(rep = "O") devrait être while(rep == "O")
  • La variable est de toute façon constante, donc non modifiable, ce qui n'a pas de sens, vu que tu veux vraiment la modifier.
  • En C, un char* n'est pas une chaîne de caractères automatique mais un pointeur. Donc soit tu crées une chaine préallouée, du style "char rep[32]", soit tu alloues de la mémoire avec malloc (mais si tu débutes, c'est un peu tôt pour en parler). Dans ton cas, vu que tu n'as besoin que d'une seule lettre, un simple "char rep" suffit largement.
  • On préfère généralement les "double" aux "float", pour des raisons de précisions (les "float" sont peu précis).
  • Lors d'un scanf, celui-ci à tendance à manger le buffer des saisies précédentes. Il faut donc nettoyer le buffer. Je ne vais pas rentrer dans le détail. Généralement on crée une fonction "clear", qu'on prend le soin d'appeler avant un scanf, pour éviter cela.


Voici une correction propre de ton code:
#include <stdio.h>

void clear(void)
{
  while (getchar() != '\n')
    ;
}

int main()
{
  double note = 0;
  double cumul = 0;
  double nb = 0;
  char rep = 'o';

  while (rep != 'N' && rep != 'n')
  {
    printf("Entrez une note: ");
    scanf("%lf", ¬e);
    cumul += note;
    nb++;
    printf("Voulez-vous continuer ? (O/N): ");
    clear();
    scanf("%c", &rep);
  }
  printf("Cumul/nb, %f/%f => %f\n", cumul, nb, cumul / nb);

  return 0;
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
16 sept. 2015 à 21:34
Vraiment merci alors, j'espère que tu restera dans le coin car je risque d'avoir besoin de toi souvent :)
0
Rejoignez-nous