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 moyenne, minimum, maximum et allocation dynamique


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut Exercice moyenne, minimum, maximum et allocation dynamique
    Bonjour,

    J'ai un exercice simple à faire mais mon programme plante :

    On souhaite stocker dans un tableau les moyennes de tous les étudiants d’une promotion et
    afficher le minimum, le maximum et la moyenne des valeurs du tableau qui sont des réels compris
    entre 0 et 20.
    Le nombre d'étudiants d'une promotion pouvant varier d'une année sur l'autre, il faut que cette valeur
    soit saisie au clavier.
    2.1. Écrivez en langage C la définition d’une fonction qui a en paramètre le tableau et permet la
    saisie des moyennes au clavier.
    2.2. Écrivez en langage C la définition d’une fonction qui a en paramètre le tableau, qui
    détermine le minimum, le maximum et la moyenne des éléments du tableau puis transmet ces trois
    résultats à la fonction appelante.
    2.3. Écrivez en langage C un programme qui :
    - permet la saisie au clavier du nombre d’étudiants d’une promotion, limité à 150 ;
    - gère dynamiquement en mémoire un tableau de réels ;
    - permet la saisie au clavier de toutes les moyennes de la promotion et l’affichage du minimum, du
    maximum et de la moyenne des valeurs du tableau en appelant les fonctions définies précédemment.

    Voici mon programme :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void saisie_moyennes(double tableau[],int nbre)
    {
        int i, ok;
        for(i=0;i<nbre;i++)
            do
            {
                printf("Veuillez saisir la moyenne numero %d : (entre 0 et 20)",i+1);
                ok = scanf("%lg",tableau[i]);
                while( getchar( ) != '\n' );
            } while (!ok || tableau[i] < 0 || tableau[i] > 20);
    }
     
    void calcul(double tableau[],int nbre,double* mini,double* maxi,double* moyenne)
    {
        double somme;
        int i;
     
        somme = 0;
     
        for(i=0;i<nbre;i++)
        {
            somme = somme + tableau[i];
        }
     
        *moyenne = somme / nbre;
        *mini = tableau[i];
        *maxi = tableau[i];
     
        for(i=0;i<nbre;i++)
        {
            if (tableau[i] < *mini) *mini = tableau[i];
            if (tableau[i] > *maxi) *maxi = tableau[i];
        }
    }
     
    int main()
    {
        int nbre, ok;
        double* moyenne;
        double* mini;
        double* maxi;
     
        do
        {
            printf("Combien de moyennes voulez vous saisir : (de 1 a 150) ");
            ok = scanf("%d",&nbre);
            while( getchar( ) != '\n' );
        } while (!ok || nbre > 150 || nbre <1);
     
        double* tableau = malloc(nbre * sizeof(double));
     
        if (!tableau)
        {
            printf("Erreur\n");
            exit(1);
        }
        else
        {
            saisie_moyennes(tableau,nbre);
            calcul(tableau,nbre,&moyenne,&mini,&maxi);
            printf("La moyenne est %f, le minimum est %f, le maximum est %f",*moyenne,*mini,*maxi);
        }
        free(tableau);
     
        return 0;
    }
    Pouvez-vous m'aider ? Merci !

  2. #2
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    J'ai trouvé une erreur, j'avais oublié le & dans la fonction saisie_moyennes mais ça ne marche toujours pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ok = scanf("%lg",&tableau[i]);

  3. #3
    Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2014
    Messages
    123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2014
    Messages : 123
    Points : 66
    Points
    66
    Par défaut
    C'est bon j'ai trouvé mes erreurs, je m'étais mélangé dans les pointeurs. Comment est-ce que je peux optimiser mon code ?

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <stdio.h>
    #include <stdlib.h>
     
    void saisie_moyennes(double tableau[],int nbre)
    {
        int i, ok;
        for(i=0;i<nbre;i++)
            do
            {
                printf("Veuillez saisir la moyenne numero %d : (entre 0 et 20)",i+1);
                ok = scanf("%lg",&tableau[i]);
                while( getchar( ) != '\n' );
            } while (!ok || tableau[i] < 0 || tableau[i] > 20);
    }
     
    void affichage_tableau(double tableau[],int nbre)
    {
        int i;
        for (i=0;i<nbre;i++)
            printf("%f",tableau[i]);
    }
     
    void calcul(double tableau[],int nbre,double *moyenne,double *mini,double *maxi)
    {
        double somme;
        int i;
     
        somme = 0;
     
        for(i=0;i<nbre;i++)
        {
            somme = somme + tableau[i];
        }
     
        *moyenne = somme / nbre;
        *mini = tableau[i];
        *maxi = tableau[i];
     
        for(i=0;i<nbre;i++)
        {
            if (tableau[i] < *mini) *mini = tableau[i];
            if (tableau[i] > *maxi) *maxi = tableau[i];
        }
    }
     
    int main()
    {
        int nbre, ok;
        double moyenne;
        double mini;
        double maxi;
     
        do
        {
            printf("Combien de moyennes voulez vous saisir : (de 1 a 150) ");
            ok = scanf("%d",&nbre);
            while( getchar( ) != '\n' );
        } while (!ok || nbre > 150 || nbre <1);
     
        double* tableau = malloc(nbre * sizeof(double));
     
        if (!tableau)
        {
            printf("Erreur\n");
            exit(1);
        }
        else
        {
            saisie_moyennes(tableau,nbre);
            affichage_tableau(tableau,nbre);
            calcul(tableau,nbre,&moyenne,&mini,&maxi);
            printf("La moyenne est %f, le minimum est %f, le maximum est %f",moyenne,mini,maxi);
        }
        free(tableau);
     
        return 0;
    }

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Armays Voir le message
    Comment est-ce que je peux optimiser mon code ?
    Bonjour

    Remplacer tes accès aux éléments [i] par des pointeurs. Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void affichage_tableau(double tableau[],int nbre)
    {
        int i;
        double *pt;
        for (i=0, pt=tableau ;i<nbre; i++, pt++)
            printf("%f",*pt);
    }

    Encore ici ça n'influe pas car la boucle ne fait qu'un seul accès à l'élément [i]. Ca commence à influer quand l'élément [i] est demandé au-moins deux fois dans une boucle. Dans ce cas, le remplacer par le pointeur apportera l'avantage de ne faire qu'une seule fois le décalage.

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void saisie_moyennes(double tableau[],int nbre)
    {
        int i, ok;
        double *pt;
        for (i=0, pt=tableau; i<nbre; i++, pt++)
            do
            {
                printf("Veuillez saisir la moyenne numero %d : (entre 0 et 20)", i+1);
                ok = scanf("%lg", pt);
                while (getchar( ) != '\n');
            } while (!ok || *pt < 0 || *pt > 20);
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/10/2010, 16h27
  2. probleme dans un exercice d'allocation dynamique
    Par Msakeni dans le forum Débuter
    Réponses: 4
    Dernier message: 26/02/2009, 01h55
  3. Réponses: 6
    Dernier message: 02/04/2007, 14h20
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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