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 :

Calcul minimum, maximum et moyenne


Sujet :

C

  1. #1
    Membre à l'essai
    Calcul minimum, maximum et moyenne
    Bonjour je débute en c depuis quelque mois et je suis tombé sur quelque chose que je ne comprends pas, si quelqu'un pourrait m'aider.

    Voilà le problème c'est je dois faire une recherche de minimum et de maximum, mais aussi une moyenne des valeurs dans un tableau.
    J'ai fait du python et disons que l'aspect structure de l'algorithme à mettre en place est très simple.
    Mais avec les subtilités du C (comme les conversions automatiques) il y a certainement choses qui m'échappe :


    Le problème c'est que j'obtiens 0 pour ma moyenne ^^'
    Et je doute fort que ma moyenne doit être théoriquement égale à 0




  2. #2
    Membre habitué
    Salut!

    Je ne sais pas encore si ça provient de là, mais en langage c le %d ne t'affichera pas de chiffre décimaux, que des entiers.

    Pour les décimaux il faut passer par %f dans le printf
    Ta variable doit aussi être typée en conséquence, voir code ci-dessous pour les exemples

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        int Nombre_de_vies = 5, niveau = 1;
        printf("tu as %d vies et tu es au niveau %d\n", Nombre_de_vies, niveau);
        return 0;
    }


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        double Nombre_de_vies = 5.5;
        int niveau = 1;
        printf("tu as %f vies et tu es au niveau %d\n", Nombre_de_vies, niveau);
        return 0;
    }


    Pour le langage c je passe un peu de temps ici :-)
    https://melem.developpez.com/tutoriels/langage-c/initiation-langage-c/

  3. #3
    Membre à l'essai
    En effet j'ai fait une erreur d'étourderie et je m'attardais aux endroits où il n'y avait pas de problème.
    Merchi ^^

  4. #4
    Membre habitué
    Super, tu es la première personne que je parviens à aider sur le forum, ne manque pas de passer ton poste en résolu :-)

    les anciens et plus expérimentés ne manqueront peut-être pas de venir ajouter du "contenu"...

  5. #5
    Membre expérimenté
    Bonjour,

    Tout d'abord une petite remarque. Utilise les balises CODE pour poster ton code. Ça permet qu'il soit affiché clairement sur le forum et éventuellement testé plus facilement.

    En fait tu as un deuxième problème dans ton code un peu plus subtil.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    moyenne=somme/N

    Ici, somme est un entier qui vaut 22 et N un entier valant 5.

    En C l'opérateur "/" retourne la division entière si et seulement si les deux arguments sonts des entiers. Donc ça te met 22/5 = 4. Alors que si tu fais moyenne=(float)somme/N; ou moyenne=somme*1.0/N; tu obtiens une division flottante et donc la valeur correcte de 4.4 !

  6. #6
    Expert éminent sénior
    Bonjour
    Citation Envoyé par emixam16 Voir le message
    En C l'opérateur "/" retourne la division entière si et seulement si...
    On dirait que c'est la condition d'un but style "je veux obtenir un résultat entier".
    Non. On dira plutôt "en C toute opération est faite dans le type le plus large des opérandes mis en jeu dans le calcul". Au final c'est la même chose concernant la division de deux entiers mais c'est plus généraliste (ça s'applique donc aux divisions mais aussi aux additions, soustractions, etc...)
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  7. #7
    Membre expérimenté
    Non. On dira plutôt "en C toute opération est faite dans le type le plus large des opérandes mis en jeu dans le calcul".
    En plus de ne pas être très simple à comprendre pour un débutant, c'est faux!

    Regarde ce programme:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
    int main() {
        long a=8;
        float b=3,c=a/b;
        printf("long=%ld float=%ld res=%f\n", sizeof(long), sizeof(float), c);
    }


    Il donne a l’exécution : long=8 float=4 res=2.666667

    Ici, l'opération et fait en type flottant même si le type le plus large est un entier, ce qui contredit ta règle.

    Donc tu dois rajouter à ta règle que le flottant à la priorité sur l'entier. Ou alors ne dire que cette partie là ici puisque c'est la seule partie qui intéresse l'OP et que l'autre est intuitive.

  8. #8
    Expert éminent sénior
    Citation Envoyé par emixam16 Voir le message
    En plus de ne pas être très simple à comprendre pour un débutant
    Ca il n'y a que toi qui le dit. Parce que c'est franchement pas compliqué à comprendre que si je multiplie un int par un float le calcul se fera en float.

    Ne va pas faire du Python parce que là tu peux additionner des strings ou multiplier des strings par des int !!!

    Citation Envoyé par emixam16 Voir le message
    Ici, l'opération et fait en type flottant même si le type le plus large est un entier, ce qui contredit ta règle.
    T'as raison. Toutefois cela n'est pas de moi à l'origine.
    Je pense donc que le terme "plus large" est une simplification hâtive (peut-être issue de la traduction) et devant plutôt se lire "plus précis".

    D'autant plus qu'il me semble avoir lu quelque part (à vérifier) qu'une opération en virgules flottante se fait toujours en double.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  9. #9
    Membre expérimenté
    Citation Envoyé par Sve@r
    Ca il n'y a que toi qui le dit. Parce que c'est franchement pas compliqué à comprendre que si je multiplie un int par un float le calcul se fera en float.

    Ne va pas faire du Python parce que là tu peux additionner des strings ou multiplier des strings par des int !!!
    Oui mais du coup, ça contredit ta règle de la taille des types
    Mais je ne suis pas sectaire, d'ailleurs j'avais déjà entendu ta règle des types. Elle n'est pas débile, elle a juste des exceptions.
    (Note: je fais aussi du Python même si c'est pas le sujet)

    Citation Envoyé par Sve@r

    D'autant plus qu'il me semble avoir lu quelque part (à vérifier) qu'une opération en virgules flottante se fait toujours en double.
    C'est une bonne question, je viens de vérifier, la réponse est non, mais c'était pas si évident à priori.

    Si je prend ce code de test:
    Code c :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char** argv) {
            int a = atoi(argv[1]), b = atoi(argv[2]);
            double c = ((float)a)/b;
            double d = ((double)a)/b;
            printf("%lf %lf\n", c, d);
            return 0;
    }


    En décompilant j'obtiens:
    Code asm :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
          double c = ((float)a)/b;
     6c5:   f3 0f 2a 45 e8          cvtsi2ssl -0x18(%rbp),%xmm0
     6ca:   f3 0f 2a 4d ec          cvtsi2ssl -0x14(%rbp),%xmm1
     6cf:   f3 0f 5e c1             divss  %xmm1,%xmm0
     6d3:   f3 0f 5a c0             cvtss2sd %xmm0,%xmm0
     6d7:   f2 0f 11 45 f0          movsd  %xmm0,-0x10(%rbp)
            double d = ((double)a)/b;
     6dc:   f2 0f 2a 45 e8          cvtsi2sdl -0x18(%rbp),%xmm0
     6e1:   f2 0f 2a 4d ec          cvtsi2sdl -0x14(%rbp),%xmm1
     6e6:   f2 0f 5e c1             divsd  %xmm1,%xmm0
     6ea:   f2 0f 11 45 f8          movsd  %xmm0,-0x8(%rbp)


    On voit bien qu'on a des instruction différentes selon qu'on ait du float/int ou du double/int

    D'ailleurs, ça se vérifie bien à l’exécution:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    $./test 987189687 73367
    13455.500000 13455.500252


    Encore une enquête de résolue mon cher Watson

###raw>template_hook.ano_emploi###