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 :

Exercice de calcul de min,max et moy


Sujet :

C

  1. #1
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut Exercice de calcul de min,max et moy
    Bonjour,

    Il y a un exercice qui m'affiche toujours un résultat de 0 pour mon minimum.

    L'énoncé (classique) est +- le suivant : Un prof veut entrer un nombre indéfini de cote (il tape -1 pour arreter) et le programme calcule la cote min, max et la moyenne des cotes.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdio.h>
    #include <conio.h>
     
    int main()
    {
    	float point,min,max,moy;
    	int cpt;
    	cpt = 0;
    	printf ("Veuillez entrer la cote %d : ",cpt+1);
    	scanf("%f", & point);
    	min,max,moy = point;
    	do
    		{
    		cpt +=1;
    		if (max< point)
    			{
    			max=point;
    			}
    		if (min > point)
    			{
    			min=point;
    			}
    		printf("Veuillez entrer la cote %d : ",cpt+1);
    		scanf("%f", & point);
    		if (point != -1)
    			{
    			moy=moy+point;
    			}
    		}
    	while (point != -1);
    	moy=moy/cpt;
    	printf("\n\nLe maximum obtenu est de %.2f\nLe minimum obtenu est de %.2f\nLa moyenne est de %.2f",max,min,moy);
    	getch();
    	return(0);
    }

    Voila, je me casse les dents dessus et j'arrive tjr pas a comprendre...
    Merci pour vos futurs eclaircissements



    EDIT : Si quelqu'un passe par là j'ai une autre question ^^ : Comment sortir d'une boucle avec une simple pression de enter (dans mon programme il faut marquer "-1"). Voila merci d'avance^^

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    min,max,moy = point;
    Je n'avais jamais vu une telle syntaxe ... Ca compile ??
    Si cela est faux, remplace par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    min =point;
    max= point;
    moy = point;

  3. #3
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Tout compte fait c'était vraiment bête ^^

    Et oui ca compilais donc je m'étais pas vraiment posé de question surtout que le maximum et la moyenne s'affichaient correctement.

    Enfin la programmation et ses mystères (et je dois dire que j'en suis que au début^^)

    Merci


    EDIT : Si quelqu'un passe par là j'ai une autre question ^^ : Comment sortir d'une boucle avec une simple pression de enter (dans mon programme il faut marquer "-1"). Voila merci d'avance^^

  4. #4
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut
    Pour sortir de la boucle avec une pression sur enter, il faut a mon avis utiliser getchar() ou un de ses homologue.

    On pourrais faire quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char c;
    while ((c= getchar()) != '\n')
    {
        /* Faire les action */
    }
    Avec '\n' code de retour chariot.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    min,max,moy = point;
    Je n'avais jamais vu une telle syntaxe ... Ca compile ??
    Si cela est faux, remplace par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    min =point;
    max= point;
    moy = point;
    Voilà une autre alternative, à connaître, mais attention la lisibilité est moins claire que la solution de SofEvans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    min = (max = (moy = point));

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Merci, c'est toujours bon à savoir.

    Je vais un peu me renseigner sur la fonction getchar(), parce que ca ne fonctionne toujours pas comme je voudrais dans mon programme (forcément à chaque fois que je clique sur enter il sort de la boucle^^).

    Merci de votre aide.

    Bye bye

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut
    Ah, desolé, il est vrai que je t'ai donner une piste, mais cela n'est pas tres bien


    Voici comment je procederai :

    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
     
    /* Variable recuperant l'entrer du clavier */
    char c;
     
    /* Servira comme un booleen */
    int continuer = 1;
    while(continuer)
    {
        /* Ici, il faut vider le buffer clavier.
            fflush est une mauvaise maniere, se reporter a la FAQ pour plus de renseignement */
        fflush(stdin);
        c = getchar();
        if (c != '\n')
        {
            /* Traitement */
        }
        else
            continuer = 0;
    }

    Voila, a toi d'adapter ce bout de code a ce que tu veux faire

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par philippe_21 Voir le message
    Voilà une autre alternative, à connaître, mais attention la lisibilité est moins claire que la solution de SofEvans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    min = (max = (moy = point));
    Les parenthèses sont inutiles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    min = max = moy = point;
    Le code est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    min =point;
    max= point;
    moy = point;
    lorsque le type des trois variables est le même.

  9. #9
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    min,max,moy = point;
    Je n'avais jamais vu une telle syntaxe ... Ca compile ??
    Pour information, ce code correspond à l'utilisation de l'opérateur , (virgule).
    Les expressions séparées par des , sont évaluées de gauche à droite dans l'ordre et l'expression totale prend pour valeur celle de la dernière évaluation. Si les expressions qui précèdent la dernière n'ont pas d'effets de bord (comme dans cet exemple), elles ne servent à rien.
    Dans le cas présent, l'action de ce code se résume donc à écrire

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ....
        /* Ici, il faut vider le buffer clavier.
            fflush est une mauvaise maniere, se reporter a la FAQ pour plus de renseignement */
        fflush(stdin);
    ....
    ...
    fflush() ne doit pas être utilisée sur un flux d'entrée (comme stdin), son comportement est alors indéfini. A n'utiliser donc que pour des flux de sortie (comme stdout)

  11. #11
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut
    Citation Envoyé par diogene Voir le message
    fflush() ne doit pas être utilisée sur un flux d'entrée (comme stdin), son comportement est alors indéfini. A n'utiliser donc que pour des flux de sortie (comme stdout)
    Je sais, c'est pour ca que j'ai dit qu'il fallait se referer a la FAQ.
    D'ailleurs, a ce propos, le code de la FAQ ne tourne pas chez moi.
    Dans la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do
    {
    }
    while((c != '\n') && (c != EOF));
    (Je l'ai fait de tete, ya peut etre des erreurs).
    Bref, j'ai copier coller le code de la FAQ mais il ne detecte pas EOF. Pour sortir de la boucle, je suis obliger d'appuyer sur entrer.
    Quid ??
    (compile sous vista avec code::block et gcc)


    Pour revenir a fflush(), ca me fait marrer ... c'est de cette maniere que les prof de mon IUT nous on enseigner pour vider le buffer clavier .....

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    (Je l'ai fait de tete, ya peut etre des erreurs).
    il manque le c= getchar();

    Bref, j'ai copier coller le code de la FAQ mais il ne detecte pas EOF. Pour sortir de la boucle, je suis obliger d'appuyer sur entrer.
    Quid ??
    Oui, sous Windows, il faut taper <CTRL_z> et finir la ligne par <Entrée>. Taper <CTRL_z> seul n'est pas suffisant.
    Pour revenir a fflush(), ca me fait marrer ... c'est de cette maniere que les prof de mon IUT nous on enseigner pour vider le buffer clavier .....
    Ca marche effectivement sous Windows, mais pas sur (tous ?) les genres Unix/Linux.

  13. #13
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Raaaah ca semble bien compliqué tout ça je suis des tutoriels pour mieux comprendre les flux d'entrées/sorties.
    En tout cas merci de vos réponses rapides qui m'auront guidées et éclairées sur certains points .

    <<< Résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/07/2013, 15h07
  2. Requête, calcul, extraction du max,min
    Par charlottedie dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/01/2010, 18h19
  3. calcul du diamètre de féret(min,max)
    Par billyjo dans le forum Images
    Réponses: 1
    Dernier message: 07/04/2009, 13h11
  4. Calculer le flow max sur un graphe
    Par faressam dans le forum C++
    Réponses: 6
    Dernier message: 09/02/2006, 16h35
  5. Emuler un min/max-width ou un min/max-height
    Par Perceval dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 18/09/2005, 18h43

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