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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 4
    Points : 8
    Points
    8
    Par défaut 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

    Nom : codeblocks_2019-10-22_10-22-53.png
Affichages : 128
Taille : 62,9 Ko

    Nom : cb_console_runner_2019-10-22_10-23-28.png
Affichages : 128
Taille : 4,0 Ko

  2. #2
    Membre du Club Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    avril 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2019
    Messages : 38
    Points : 50
    Points
    50
    Par défaut
    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/tutorie...ion-langage-c/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2018
    Messages : 4
    Points : 8
    Points
    8
    Par défaut
    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 du Club Avatar de nl.smart
    Homme Profil pro
    ouvrier
    Inscrit en
    avril 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : ouvrier
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2019
    Messages : 38
    Points : 50
    Points
    50
    Par défaut
    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é
    Avatar de emixam16
    Homme Profil pro
    Doctorant en sécurité
    Inscrit en
    juin 2013
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Doctorant en sécurité

    Informations forums :
    Inscription : juin 2013
    Messages : 264
    Points : 1 374
    Points
    1 374
    Par défaut
    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.

    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
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    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é
    Avatar de emixam16
    Homme Profil pro
    Doctorant en sécurité
    Inscrit en
    juin 2013
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Doctorant en sécurité

    Informations forums :
    Inscription : juin 2013
    Messages : 264
    Points : 1 374
    Points
    1 374
    Par défaut
    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.666667Ici, 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
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 7 598
    Points : 21 648
    Points
    21 648
    Billets dans le blog
    1
    Par défaut
    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é
    Avatar de emixam16
    Homme Profil pro
    Doctorant en sécurité
    Inscrit en
    juin 2013
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Doctorant en sécurité

    Informations forums :
    Inscription : juin 2013
    Messages : 264
    Points : 1 374
    Points
    1 374
    Par défaut
    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

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

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 21h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 22h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 21h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 13h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 19h55

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