Votre IP: 38.107.179.244 
  
 
Google
 
Accueil e-mail Linux
Linux
Perl
Perl
C
Langage C
Dico
Dictionnaire
Biblio liens
Bibliothèque de liens
Index articles
Index articles
 

Date création : 18-01-2009 12:39:25
Date de la dernière modification : 18-01-2009 18:50:59
C  Vous êtes dans : Langage C Astuces / Exercices

Calculer la moyenne des éléments d'une liste chaînée

Recquistable de matières

La connaissances de mécanisme des listes simplement chaînées et recquis pour la compréhension de cet exercice.

Ennoncétable de matières

Calculer la moyenne des éléments d'une liste chaînée de nombres entiers.


Solutiontable de matières

Avec votre editeur de texte préféré créez un fichier lmoyenneelements.c et ecrivez dédans le code ci-dessous :


#include<stdio.h>
#include "liste.h"

float MoyenneListeElements(Liste *L);
int main()
{
        Liste *L;
        float moyenne;
        char nomfichier[100];

        printf("Nom fichier ? ");
        scanf("%s",nomfichier);

        L=CreerListeDepuisFichier(nomfichier);
        moyenne = MoyenneListeElements(L);
        AfficheListe(L);
        ViderListe(&L);
        printf("La moyenne des éléments est : %.2f\n",moyenne);
        return 0;
}

float MoyenneListeElements(Liste *L){
        Liste *p;
        int n,somme;
        float moyenne;
        somme=0;
        for(p=L,n=0;p!=NULL;p=p->suivant,++n)
                somme += p->donnee;
        return (float) somme/n;
}
 

La liste sera rempli depuis le fichier fic.txt

Compilationtable de matières

Les fichiers liste.h, liste_funct.c et lmoyenneelements.c se trouvent dans le même répertoire

$ gcc -c liste_funct.c lmoyenneelements.c
$ gcc liste_funct.o lmoyenneelements.o -o lmoyenneelements

Explicationtable de matières

Toute les fonctions pour l'implémentation de la liste se trouvent dans le fichier liste_funct.c.
Pour calculer la moyenne des éléments de la liste nous allons calculer la somme des éléments ainsi que le nombre (moyenne = Somme / Nombre éléments).
 

Exemples exécutiontable de matières

Le nom de fichier sera demandé pendant l'exécution du programme.
 $ ./lmoyenneelements
Nom fichier ? fic.txt
1 1 2 3 1 1 1 4 5 2
La moyenne des éléments est : 2.10


liste.htable de matières



#ifndef __LISTE__
#define __LISTE__

typedef struct Element{
        int donnee;
        struct Element *suivant;
}Liste;

Liste *InitialiserListe();
Liste *InsertionDebutListe(Liste *L,int donnee);
Liste *InsertionFinListe(Liste *L,int donnee);
Liste *CreerListeDansOrdre();
Liste *CreerListeInverse();
void ViderListe(Liste **L);
void AfficheListe(Liste *L);
Liste *alloc();
Liste *CreerListeDepuisFichier(char *nomfichier);

#endif


liste_funct.ctable de matières



#include "liste.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

Liste *InitialiserListe(){
    return NULL;
}

Liste *alloc(){
    return (Liste *)malloc(sizeof(Liste));
}

Liste *InsertionDebutListe(Liste *L,int donnee){
    Liste *nouveau;
    nouveau = alloc();
    nouveau->donnee = donnee;
    nouveau->suivant = NULL;

    nouveau->suivant=L;
    return nouveau;
}

Liste *CreerListeInverse(){
    Liste *L;
    char c = 'o';
    int N;
    L=InitialiserListe(L);
    while(c=='o'){
        printf("Entrez numéro : ");
        scanf("%d",&N);
        getchar();
        L = InsertionDebutListe(L,N);
        printf("Continuer ? o/n : ");
        c=getchar();
    }
    return L;
}

Liste *InsertionFinListe(Liste *L,int donnee){
    Liste *nouveau,*pL;
    nouveau = alloc();
    nouveau->donnee = donnee;
    nouveau->suivant = NULL;

    if(L==NULL)
        L=nouveau;
    else{
        for(pL=L;pL->suivant!=NULL;pL=pL->suivant)
            ;
        pL->suivant=nouveau;
    }
    return L;
}

Liste *CreerListeDansOrdre(){
    Liste *L;
    char c = 'o';
    int N;
    L=InitialiserListe(L);
    while(c=='o'){
        printf("Entrez numéro : ");
        scanf("%d",&N);
        getchar();
        L = InsertionFinListe(L,N);
        printf("Continuer ? o/n : ");
        c=getchar();
    }
    return L;
}



void AfficheListe(Liste *L){
    Liste *pL;
    for(pL=L;pL!=NULL;pL=pL->suivant)
        printf("%d ",pL->donnee);
    printf("\n");
}

void ViderListe(Liste **L){
    Liste *courant;
    while(*L!=NULL){
        courant=*L;
        *L=(*L)->suivant;
        free(courant);
    }
    *L=NULL;
}

Liste *CreerListeDepuisFichier(char *nomfichier){
    FILE *F;
    Liste *L;
    int n;

    L=InitialiserListe();
    F=fopen(nomfichier,"r");
    while((n=fgetc(F))!=EOF)
        if(n!='\n')
            L=InsertionFinListe(L,n-'0');
    return L;
}

fic.txttable de matières

$ cat fic.txt
1
1
2
3
1
1
1
4
5
2


Création : octobre 2007  © Tous droits réservés 2007 linux-perl-c
Valid HTML 4.01 TransitionalValid CSS