Aller au menu - Aller au contenu

Icône Les tableaux

Mise à jour : 22/01/2012
Difficulté : Facile Facile Creative Commons BY-NC-SA
114 794 visites depuis 7 jours, dont 3 366 sur ce chapitre classé 3/786
Ce chapitre est la suite directe des pointeurs et va vous faire comprendre un peu plus leur utilité. Vous comptiez y échapper ? C'est raté! Les pointeurs sont partout en C, vous avez été prévenus !


Dans ce chapitre, nous apprendrons à créer des variables de type « tableaux ». Les tableaux sont très utilisés en C car ils sont vraiment pratiques pour organiser une série de valeurs.

Nous commencerons dans un premier temps par quelques explications sur le fonctionnement des tableaux en mémoire (schémas à l'appui). Ces petites introductions sur la mémoire sont extrêmement importantes : elles vous permettent de comprendre comment cela fonctionne. Un programmeur qui comprend ce qu'il fait, c'est quand même un peu plus rassurant pour la stabilité de ses programmes, non ? ;-)
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les tableaux dans la mémoire

« Les tableaux sont une suite de variables de même type, situées dans un espace contigu en mémoire. »

Bon, je reconnais que ça ressemble un peu à une définition du dictionnaire. Concrètement, il s'agit de « grosses variables » pouvant contenir plusieurs nombres du même type (long, int, char, double…).

Un tableau a une dimension bien précise. Il peut occuper 2, 3, 10, 150, 2 500 cases, c'est vous qui décidez. La fig. suivante est un schéma d'un tableau de 4 cases en mémoire qui commence à l'adresse 1600.

Un tableau de 4 cases


Lorsque vous demandez à créer un tableau de 4 cases en mémoire, votre programme demande à l'OS la permission d'utiliser 4 cases en mémoire. Ces 4 cases doivent être contiguës, c'est-à-dire les unes à la suite des autres. Comme vous le voyez, les adresses se suivent : 1600, 1601, 1602, 1603. Il n'y a pas de « trou » au milieu.

Enfin, chaque case du tableau contient un nombre du même type. Si le tableau est de type int, alors chaque case du tableau contiendra un int. On ne peut pas faire de tableau contenant à la fois des int et des double par exemple.

En résumé, voici ce qu'il faut retenir sur les tableaux.
  • Lorsqu'un tableau est créé, il prend un espace contigu en mémoire : les cases sont les unes à la suite des autres.
  • Toutes les cases d'un tableau sont du même type. Ainsi, un tableau de int contiendra uniquement des int, et pas autre chose.

Définir un tableau

Pour commencer, nous allons voir comment définir un tableau de 4 int :

Code : C
1
int tableau[4];


Voilà, c'est tout. Il suffit donc de rajouter entre crochets le nombre de cases que vous voulez mettre dans votre tableau. Il n'y a pas de limite (à part peut-être la taille de votre mémoire, quand même).

Maintenant, comment accéder à chaque case du tableau ? C'est simple, il faut écrire tableau[numeroDeLaCase].

Attention : un tableau commence à l'indice n° 0 ! Notre tableau de 4 int a donc les indices 0, 1, 2 et 3. Il n'y a pas d'indice 4 dans un tableau de 4 cases ! C'est une source d'erreurs très courantes, souvenez-vous-en.


Si je veux mettre dans mon tableau les mêmes valeurs que celles indiquées sur la fig. suivante, je devrai donc écrire :

Code : C
1
2
3
4
5
6
int tableau[4];

tableau[0] = 10;
tableau[1] = 23;
tableau[2] = 505;
tableau[3] = 8;


Je ne vois pas le rapport entre les tableaux et les pointeurs ?


En fait, si vous écrivez juste tableau, vous obtenez un pointeur. C'est un pointeur sur la première case du tableau. Faites le test :

Code : C
1
2
3
int tableau[4];

printf("%d", tableau);


Résultat, on voit l'adresse où se trouve tableau :

Code : Console
1600


En revanche, si vous indiquez l'indice de la case du tableau entre crochets, vous obtenez la valeur :

Code : C
1
2
3
int tableau[4];

printf("%d", tableau[0]);


Code : Console
10


De même pour les autres indices. Notez que comme tableau est un pointeur, on peut utiliser le symbole * pour connaître la première valeur :

Code : C
1
2
3
int tableau[4];

printf("%d", *tableau);


Code : Console
10


Il est aussi possible d'obtenir la valeur de la seconde case avec *(tableau + 1) (adresse de tableau + 1).
Les deux lignes suivantes sont donc identiques :

Code : C
1
2
tableau[1] // Renvoie la valeur de la seconde case (la première case étant 0)
*(tableau + 1) // Identique : renvoie la valeur contenue dans la seconde case


En clair, quand vous écrivez tableau[0], vous demandez la valeur qui se trouve à l'adresse tableau + 0 case (c'est-à-dire 1600).
Si vous écrivez tableau[1], vous demandez la valeur se trouvant à l'adresse tableau + 1 case (c'est-à-dire 1601).
Et ainsi de suite pour les autres valeurs.

Les tableaux à taille dynamique



Le langage C existe en plusieurs versions.
Une version récente, appelée le C99, autorise la création de tableaux à taille dynamique, c'est-à-dire de tableaux dont la taille est définie par une variable :

Code : C
1
2
int taille = 5;
int tableau[taille];


Or cela n'est pas forcément reconnu par tous les compilateurs, certains planteront sur la seconde ligne. Le langage C que je vous enseigne depuis le début (appelé le C89) n'autorise pas ce genre de choses. Nous considèrerons donc que faire cela est interdit.

Nous allons nous mettre d'accord sur ceci : vous n'avez pas le droit d'utiliser une variable entre crochets pour la définition de la taille du tableau, même si cette variable est une constante ! Le tableau doit avoir une dimension fixe, c'est-à-dire que vous devez écrire noir sur blanc le nombre correspondant à la taille du tableau :

Code : C
1
int tableau[5];


Mais alors… il est interdit de créer un tableau dont la taille dépend d'une variable ?


Non, rassurez-vous : c'est possible, même en C89. Mais pour faire cela, nous utiliserons une autre technique (plus sûre et qui marche partout) appelée l'allocation dynamique. Nous verrons cela bien plus loin dans ce cours.

Parcourir un tableau

Supposons que je veuille maintenant afficher les valeurs de chaque case du tableau.
Je pourrais faire autant de printf qu'il y a de cases. Mais bon, ce serait répétitif et lourd, et imaginez un peu la taille de notre code si on devait afficher le contenu de chaque case du tableau une à une !

Le mieux est de se servir d'une boucle. Pourquoi pas d'une boucle for ? Les boucles for sont très pratiques pour parcourir un tableau :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
int main(int argc, char *argv[])
{
    int tableau[4], i = 0;

    tableau[0] = 10;
    tableau[1] = 23;
    tableau[2] = 505;
    tableau[3] = 8;

    for (i = 0 ; i < 4 ; i++)
    {
        printf("%d\n", tableau[i]);
    }

    return 0;
}


Code : Console
10
23
505
8


Notre boucle parcourt le tableau à l'aide d'une variable appelée i (c'est le nom très original que les programmeurs donnent en général à la variable qui leur permet de parcourir un tableau !).

Ce qui est particulièrement pratique, c'est qu'on peut mettre une variable entre crochets. En effet, la variable était interdite pour la création du tableau (pour définir sa taille), mais elle est heureusement autorisée pour « parcourir » le tableau, c'est-à-dire afficher ses valeurs !
Ici, on a mis la variable i, qui vaut successivement 0, 1, 2, et 3. De cette façon, on va donc afficher la valeur de tableau[0], tableau[1], tableau[2] et tableau[3] !

Attention à ne pas tenter d'afficher la valeur de tableau[4] ! Un tableau de 4 cases possède les indices 0, 1, 2 et 3, point barre. Si vous tentez d'afficher tableau[4], vous aurez soit n'importe quoi, soit une belle erreur, l'OS coupant votre programme car il aura tenté d'accéder à une adresse ne lui appartenant pas.


Initialiser un tableau



Maintenant que l'on sait parcourir un tableau, nous sommes capables d'initialiser toutes ses valeurs à 0 en faisant une boucle !

Bon, parcourir le tableau pour mettre 0 à chaque case, c'est de votre niveau maintenant :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
int main(int argc, char *argv[])
{
    int tableau[4], i = 0;

    // Initialisation du tableau
    for (i = 0 ; i < 4 ; i++)
    {
        tableau[i] = 0;
    }

    // Affichage de ses valeurs pour vérifier
    for (i = 0 ; i < 4 ; i++)
    {
        printf("%d\n", tableau[i]);
    }

    return 0;
}


Code : Console
0
0
0
0


Une autre façon d'initialiser



Il faut savoir qu'il existe une autre façon d'initialiser un tableau un peu plus automatisée en C.
Elle consiste à écrire tableau[4] = {valeur1, valeur2, valeur3, valeur4}. En clair, vous placez les valeurs une à une entre accolades, séparées par des virgules :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
int main(int argc, char *argv[])
{
    int tableau[4] = {0, 0, 0, 0}, i = 0;

    for (i = 0 ; i < 4 ; i++)
    {
        printf("%d\n", tableau[i]);
    }

    return 0;
}


Code : Console
0
0
0
0


Mais en fait, c'est même mieux que ça : vous pouvez définir les valeurs des premières cases du tableau, toutes celles que vous n'aurez pas renseignées seront automatiquement mises à 0.

Ainsi, si je fais :

Code : C
1
int tableau[4] = {10, 23}; // Valeurs insérées : 10, 23, 0, 0


… la case n° 0 prendra la valeur 10, la n° 1 prendra 23, et toutes les autres prendront la valeur 0 (par défaut).

Comment initialiser tout le tableau à 0 en sachant ça ?
Eh bien il vous suffit d'initialiser au moins la première valeur à 0, et toutes les autres valeurs non indiquées prendront la valeur 0.

Code : C
1
int tableau[4] = {0}; // Toutes les cases du tableau seront initialisées à 0


Cette technique a l'avantage de fonctionner avec un tableau de n'importe quelle taille (là, ça marche pour 4 cases, mais s'il en avait eu 100 ça aurait été bon aussi).

Attention, on rencontre souvent int tableau[4] = {1};, ce qui insère les valeurs suivantes : 1, 0, 0, 0.
Contrairement à ce que beaucoup d'entre vous semblent croire, on n'initialise pas toutes les cases à 1 en faisant cela : seule la première case sera à 1, les autres seront à 0. On ne peut donc pas initialiser toutes les cases à 1 automatiquement, à moins de faire une boucle.

Passage de tableaux à une fonction

Vous aurez à coup sûr souvent besoin d'afficher tout le contenu de votre tableau. Pourquoi ne pas écrire une fonction qui fait ça ? Ça va nous permettre de découvrir comment on envoie un tableau à une fonction (ce qui m'arrange).

Il va falloir envoyer deux informations à la fonction : le tableau (enfin, l'adresse du tableau) et aussi et surtout sa taille !
En effet, notre fonction doit être capable d'initialiser un tableau de n'importe quelle taille. Or, dans votre fonction, vous ne connaissez pas la taille de votre tableau. C'est pour cela qu'il faut envoyer en plus une variable que vous appellerez par exemple tailleTableau.

Comme je vous l'ai dit, tableau peut être considéré comme un pointeur. On peut donc l'envoyer à la fonction comme on l'aurait fait avec un vulgaire pointeur :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Prototype de la fonction d'affichage
void affiche(int *tableau, int tailleTableau);
 
int main(int argc, char *argv[])
{
    int tableau[4] = {10, 15, 3};
 
    // On affiche le contenu du tableau
    affiche(tableau, 4);
 
    return 0;
}
 
void affiche(int *tableau, int tailleTableau)
{
    int i;
 
    for (i = 0 ; i < tailleTableau ; i++)
    {
        printf("%d\n", tableau[i]);
    }
}


Code : Console
10
15
3
0


La fonction n'est pas différente de celles que l'on a étudiées dans le chapitre sur les pointeurs. Elle prend en paramètre un pointeur sur int (notre tableau), ainsi que la taille du tableau (très important pour savoir quand s'arrêter dans la boucle !).
Tout le contenu du tableau est affiché par la fonction via une boucle.

Notez qu'il existe une autre façon d'indiquer que la fonction reçoit un tableau. Plutôt que d'indiquer que la fonction attend un int *tableau, mettez ceci :

Code : C
1
void affiche(int tableau[], int tailleTableau)


Cela revient exactement au même, mais la présence des crochets permet au programmeur de bien voir que c'est un tableau que la fonction prend, et non un simple pointeur. Cela permet d'éviter des confusions.

J'utilise personnellement tout le temps les crochets dans mes fonctions pour bien montrer que la fonction attend un tableau. Je vous conseille de faire de même. Il n'est pas nécessaire de mettre la taille du tableau entre les crochets cette fois.

Quelques exercices !



Je ne manque pas d'idées d'exercices pour vous entraîner ! Je vous propose de réaliser des fonctions travaillant sur des tableaux.

Je donne juste les énoncés des exercices ici pour vous forcer à réfléchir à vos fonctions. Si vous avez du mal à réaliser ces fonctions, rendez-vous sur les forums pour poser vos questions.

Exercice 1



Créez une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau (utilisez un return pour renvoyer la valeur). Pour vous aider, voici le prototype de la fonction à créer :

Code : C
1
int sommeTableau(int tableau[], int tailleTableau);


Exercice 2



Créez une fonction moyenneTableau qui calcule et renvoie la moyenne des valeurs. Prototype :

Code : C
1
double moyenneTableau(int tableau[], int tailleTableau);


La fonction renvoie un double car une moyenne est souvent un nombre décimal.


Exercice 3



Créez une fonction copierTableau qui prend en paramètre deux tableaux. Le contenu du premier tableau devra être copié dans le second tableau.
Prototype :

Code : C
1
void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau);


Exercice 4



Créez une fonction maximumTableau qui aura pour rôle de remettre à 0 toutes les cases du tableau ayant une valeur supérieure à un maximum. Cette fonction prendra en paramètres le tableau ainsi que le nombre maximum autorisé (valeurMax). Toutes les cases qui contiennent un nombre supérieur à valeurMax doivent être mises à 0. Prototype :

Code : C
1
void maximumTableau(int tableau[], int tailleTableau, int valeurMax);


Exercice 5



Cet exercice est plus difficile. Créez une fonction ordonnerTableau qui classe les valeurs d'un tableau dans l'ordre croissant. Ainsi, un tableau qui vaut {15, 81, 22, 13} doit à la fin de la fonction valoir {13, 15, 22, 81}.
Prototype :

Code : C
1
void ordonnerTableau(int tableau[], int tailleTableau);


Cet exercice est donc un peu plus difficile que les autres, mais tout à fait réalisable. Ça va vous occuper un petit moment.

Faites-vous un petit fichier de fonctions appelé tableaux.c (avec son homologue tableaux.h qui contiendra les prototypes, bien sûr !) contenant toutes les fonctions de votre cru réalisant des opérations sur des tableaux.


Au travail ! :-)

Q.C.M.

Laquelle de ces lignes crée un tableau de 10 double ?
A quel indice commence un tableau ?
Qu'est-ce qu'un tableau à dimension dynamique ?
Lequel de ces prototypes de fonction ne permet pas de faire passer mon tableau ?
Si je crée un tableau de 20 char appelé tableau situé à l'adresse 45782015... quelle est l'adresse de tableau[3] ?
Quelle est l'autre façon d'initialiser mon tableau avec ces valeurs ?


Code : C
1
2
3
4
5
6
int tableau[4];

tableau[0] = 10;
tableau[1] = 23;
tableau[2] = 505;
tableau[3] = 8;

Statistiques de réponses au QCM

En résumé

  • Les tableaux sont des ensembles de variables du même type stockées côte à côte en mémoire.
  • La taille d'un tableau doit être déterminée avant la compilation, elle ne peut pas dépendre d'une variable.
  • Chaque case d'un tableau de type int contient une variable de type int.
  • Les cases sont numérotées via des indices commençant à 0 : tableau[0], tableau[1], tableau[2], etc.
Chapitre précédent Sommaire Chapitre suivant

Partager

913 commentaires pour "Les tableaux"
Note moyenne : 3.87 / 4 (3048 votes)
Pseudo Commentaire
Hors ligne Claire Waterlot # Posté le 29/04/2012 à 09:40:01
Avatar

Avis : Bon

wha j'ai rien dis j'ai reussi ^^
merci de ton aide ^^

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int m = 0, n = 1;
    int tableau[m];
    do
    {
        printf("entrer votre %d ieme nombres : ",n);
        scanf("%d", &tableau[m]);
        m++;
        n++;
    }while ( m < 6);

    for ( m = 0; m < 6 ; m++)
    {
        printf(" %d \n", tableau[m]);
    }
    return 0;
}
Hors ligne Halarp27 # Posté le 29/04/2012 à 15:54:22
1 || 0

Avis : Décevant

Euh... Est-ce que quelqu'un pourrais m'expliquer clairement à quoi sert les tableaux en C? Par-ce que j'ai très bien compris comment ça fonctionne, mais je ne vois pas trop à quoi ça sert...

De plus je trouve ce chapitre un peu en deçà des autres, alors que le précédent sur les pointeurs était excellent (je l'ai d'ailleurs trouvé plus facile que prévue), celui-là est un peu décevant :(

Et aussi, je peux le dire franchement je me suis fais chier pendant ce cours, et encore plus pour les exercices :colere:

Enfin, bref... J'espère que les suivants ne sont pas comme ça, parce que là vraiment...
Hors ligne G0lumm # Posté le 07/05/2012 à 19:39:33
Mon précieux
Avatar

Avis : Très bon

Merci pour ce cour toujours aussi passionnant et à bientôt =) ! :D


Code : Exercice1-c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>

int sommeTableau(int tableau[], int tailleTableau);

int main()
{
    int resultat = 0;
    int tableau[5] = {1, 2, 3, 4 , 5};
    resultat = sommeTableau(tableau, 5);
    printf("Donc le resultat final est : %d", resultat);
}

int sommeTableau(int tableau[], int tailleTableau)
{
    int resultat = 0, i = 0;
    for (i = 0; i < tailleTableau; i++)
    {
        resultat = tableau[i] + resultat;
    }
    return resultat;
}


Code : Exercice2-c
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
#include <stdio.h>
#include <stdlib.h>

double moyenneTableau(int tableau[], int tailleTableau);

int main()
{
    double resultat = 0;
    int tableau[5] = {17, 15, 20, 14, 19};
    resultat = moyenneTableau(tableau, 5);
    printf("\n%lf", resultat);
    return 0;
}

double moyenneTableau(int tableau[], int tailleTableau)
{
    int i;
    int recommencer = 1;
    int resultat = 0;
    double resultatMoyenne = 0;
    for (i = 0; i < tailleTableau; i++)
    {
        printf("\n%d + %d", tableau[i], resultat);
        resultat = tableau[i] + resultat;
        printf(" = %d", resultat);
    }
    printf("\n%d : %d", resultat, i);
    resultatMoyenne = resultat/i;
    return resultatMoyenne;
}


Code : Exercice3-c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>

void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau);

int main()
{
    int tableauOriginal[5] = {0, 2, 9, 10, 7};
    int tableauCopie[5] = {0};
    copie(tableauOriginal, tableauCopie, 5);
    return 0;
}

void copie(int tableauOriginal[], int tableauCopie[], int tailleTableau)
{
    int i;
    for (i = 0; i < tailleTableau; i++)
    {
        tableauCopie[i] = tableauOriginal[i];
        printf("La valeur tableau copie %d\n\n", tableauCopie[i]);
    }

}


Code : Exercice4-c
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
#include <stdio.h>
#include <stdlib.h>

void maximumTableau(int tableau[], int tailleTableau, int valeurMax);

int main()
{
    int valeurMax = 100;
    int tableau[5] = {50, 45, 101, 65, 157};
    maximumTableau(tableau, 5, 100);
}

void maximumTableau(int tableau[], int tailleTableau, int valeurMax)
{
    int i;
    for (i = 0; i < tailleTableau; i++)
    {
        if (tableau[i] <= 100)
        {
        }
        else
        {
            tableau[i] = 0;
        }
        printf("\n\nLa valeur %d est %d", i+1, tableau[i]);
    }
}


Code : Exercice5-c
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
#include <stdio.h>
#include <stdlib.h>

void ordonnerTableau(int tableau[], int tailleTableau);

int main()
{
    int tableau[5] = {15, 81, 22, 13, 105};
    ordonnerTableau(tableau, 5);
}

void ordonnerTableau(int tableau[], int tailleTableau)
{
    int recommencer = 0, i = 0, iPrime = 0;
    for (recommencer = 0; recommencer < tailleTableau; recommencer++) // Je mets une boucle pour que tous les nombres puissent se rangeaient.
    {
       for (i = 0; i < tailleTableau; i++)
       {
           if (tableau[i] < tableau[i+1])
           {
           }
           else
           {
               iPrime = tableau[i];
               tableau[i] = tableau[i+1];
               tableau[i+1] = iPrime;
           }
       }
    }
    for(i = 0; i < tailleTableau; i++)
    {
        printf("Valeur %d.\n\n", tableau[i]); // Je verifie si les valeurs sont bien rangés.
    }
}
Hors ligne raboulave # Posté le 08/05/2012 à 17:14:30

Comme d'hab, excellent chapitre,
Et comme d'hab, mon programme fonctionnel avec un p'tit menu regroupant tous les exercices :)
Enjoy :p

Mes prototypes dans le fichier Prototypes.h :

Secret (cliquez pour afficher)
Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#ifndef Tableaux_Prototypes_h
#define Tableaux_Prototypes_h

void saisieTab(int tab[], int tailleTab); 

int sommeTab(int tab[], int tailleTab); 

double moyenneTab (int tab[], int tailleTab); 

void copie(int tab[], int tabCopie[], int tailleTab); 

int maxTab(int tab[], int tailleTab);

void ordonnerTab(int tab[], int tailleTab);

void afficher(int tab[], int tailleTab); 
#endif


main.c :

Secret (cliquez pour afficher)
Code : C
  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
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <stdio.h>
#include "Prototypes.h"

void saisieTab(int tab[], int tailleTab)
{
    int i;
    for (i = 0; i < tailleTab; i++)
    {
        printf("Entrez le %dème nombre : ", i+1);
        scanf("%d", &tab[i]);
    }
}

void afficher(int tab[], int tailleTab)
{
    int i;
    for (i = 0; i < tailleTab; i++)
    {
        printf("%d\n", tab[i]);
    }
}

int maxTab(int tab[], int tailleTab)
{
    int max = tab[0], i;
    for (i = 1; i < tailleTab; i++)
    {
        if (tab[i] > max)
        {
            max = tab[i];
        }
    }
    return max;
}

int sommeTab(int tab[], int tailleTab)
{
    int somme = tab[0], i;
    for (i = 1; i < tailleTab; i++)
    {
        somme = somme + tab[i];
    }
    return somme;
}

double moyenneTab(int tab[], int tailleTab)
{
    double moyenne = tab[0];
    int i;
    for (i = 1; i < tailleTab; i++)
    {
        moyenne = moyenne + tab[i];
    }
    moyenne = moyenne / i;
    return moyenne;
}

void copie(int tab[], int tabCopie[], int tailleTab)
{
    int i;
    for (i = 0; i < tailleTab; i++)
    {
        tabCopie[i] = tab[i];
    }
}

void ordonnerTab(int tab[], int tailleTab) // Tri par sélection, très efficace pour les tableaux de 7 éléments ou moins
{
    int i,j,min, aux;
    for (i = 0; i < tailleTab-1; i++)
    {
        min = i;
        for (j = i+1; j < tailleTab; j++)
        {
            if (tab[j] < tab[min]) { min = j; }
            if (min != i)
            {
                aux = tab[i];
                tab[i] = tab[min]; // On est obligés de se servir d'une 3e variable pour faire l'échange de valeur, 
                                           // Si on faisait tab[i] = tab[min] puis tab[min] = tab[i] ça ne marcherait pas 
                                           // Pour la 2e instruction puisque cela reviendrait alors à tab[min] = tab[min],
                                          //  On aurait écrasé la valeur de tab[i] !
                tab[min] = aux;
            }
        }
    }
}

int main (int argc, const char * argv[])
{
    int tab[20] = {0}, tailleTab = 0, choix = 0, tabCopie[20] = {0};
    printf("----- Opérations sur les tableaux -----\n\n");
    printf("Combien de nombres allez-vous entrer ? (Max. 20) ");
    scanf("%d", &tailleTab);
    saisieTab(tab, tailleTab);
    printf("----- Menu -----\n\n");
    printf("1. Somme\n");
    printf("2. Moyenne\n");
    printf("3. Copie\n");
    printf("4. Maximum\n");
    printf("5. Ordonner\n\n");
    printf("Votre choix : ");
    scanf("%d", &choix);
    
    switch(choix)
    {
        case 1:
            printf("La somme des nombres du tableau est %d\n", sommeTab(tab, tailleTab));
            break;
        case 2:
            printf("La moyenne des nombres du tableau est %f\n", moyenneTab(tab, tailleTab));
            break;
        case 3:
            copie(tab, tabCopie, tailleTab);
            printf("Copie effectuée :\n");
            afficher(tabCopie, tailleTab);
            break;
        case 4:
            printf("Le maximum des nombres du tableau est %d\n", maxTab(tab, tailleTab));
            break;
        case 5:
            ordonnerTab(tab, tailleTab);
            printf("Voici les valeurs du tableau maintenant dans l'ordre croissant :\n");
            afficher(tab, tailleTab);
            break;
        default:
            printf("Je n'ai pas compris votre choix.\n");
            break;
    }
    
    return 0;
}

"Heureux est l'étudiant qui, comme la tranquille rivière, suit toujours son cours sans jamais quitter son lit."
 
Hors ligne Horner74 # Posté le 14/05/2012 à 20:23:02

Bonjour, voici mon programme qui combine les 5exercices et quelques bonus, en faisant deux fichiers .c et un .h :

(je suis encore débutant, n'hésitez pas à m'envoyer des messages en critique pour me dire si c'est bien ou pas et/ou ce que je pourrais améliorer)

Main.c :
Secret (cliquez pour afficher)
Code : C
 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
#include <stdio.h>
#include <stdlib.h>
#include "fonctions tableaux.h"

int main()
{
    int choixMenu = 0, retourMenu = 0, tailleTableau = 0;
    double tableau[20] = {0}, tableauCopie[20] = {0}, tableauRange[20] = {0};

    tailleTableau = creerTableau(tableau, tailleTableau);

    do
    {
        switch(menu(choixMenu))
        {
            case 1:
            {
                printf("\n  -La somme des valeurs du tableau est : %f \n", sommeTableau(tableau, tailleTableau));
                break;
            }

            case 2:
            {
                printf("\n  -La moyenne des valeurs du tableau est : %f \n", moyenneTableau(tableau, tailleTableau));
                break;
            }

            case 3:
            {
                copieTableau(tableau, tableauCopie, tailleTableau);
                afficheTableauCopie(tableauCopie, tailleTableau);
                break;
            }

            case 4:
            {
                printf("\n  -La valeur maximale dans le tableau est : %f \n", maximumTableau(tableau, tailleTableau));
                break;
            }

            case 5:
            {
                rangerTableau(tableau, tableauRange, tailleTableau);
                afficheTableauRange(tableauRange, tailleTableau);
                break;
            }

            case 6:
            {
                afficheTableau(tableau, tailleTableau);
                break;
            }

            default :
            {
                printf("\n  -Choix incorrect\n");
                break;
            }
        }
    } while (retournerMenu(retourMenu) == 1);

    return 0;
}


fonctions tableaux.c :
Secret (cliquez pour afficher)
Code : C
  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
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <stdio.h>
#include <stdlib.h>

int menu(choixMenu)
{
    printf("\n\n                  Exercices sur tableaux :\n");
    printf("\n\n\n        Menu :\n\n");
    printf("\n              1. Somme du tableau\n");
    printf("\n              2. Moyenne du tableau\n");
    printf("\n              3. Copie du tableu\n");
    printf("\n              4. Maximum du tableau\n");
    printf("\n              5. Ranger le tableau dans l'ordre croissant\n");
    printf("\n              6. Voir mon tableau\n");
    printf("\n\n        Votre choix : ");
    scanf("%d", &choixMenu);

    return choixMenu;
}

int creerTableau(double tableau[], int tailleTableau)
{
    int i;

    printf("\n\n                  Exercices sur tableaux :\n");
    printf("\n\n\n     Ce programme vous demandera de rentrer la taille du tableau");
    printf("\n   et d'y inserer des valeurs que vous choisirez, par la suite vous");
    printf("\n   choisirez egalement les operations a effectue sur ce tableau, comme");
    printf("\n   une moyenne par exemple.");
    printf("\n\n\n   Rentrez la taille du tableau (maximum 20): ");
    scanf("%d", &tailleTableau);

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        printf("Entrez le %deme nombre : ", i+1);
        scanf("%lf", &tableau[i]);
    }

    return tailleTableau;
}

double sommeTableau(double tableau[], int tailleTableau)
{
    int i;
    double somme = 0;

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        somme = tableau[i] + somme;
    }

    return somme;
}

double moyenneTableau(double tableau[], int tailleTableau)
{
    int i;
    double somme = 0, moyenne = 0;

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        somme = tableau[i] + somme;
    }

    moyenne = somme / tailleTableau;

    return moyenne;
}

void copieTableau(double tableau[], double tableauCopie[], int tailleTableau)
{
    int i;

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        tableauCopie[i] = tableau[i];
    }
}

void afficheTableauCopie(double tableauCopie[], int tailleTableau)
{
    int i;
    printf("\n  -La copie du tableau : \n");

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        printf("%f\n", tableauCopie[i]);
    }
}

double maximumTableau(double tableau[], int tailleTableau)
{
    int i;
    double maximum = 0;

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        if (tableau[i] > maximum)
        {
            maximum = tableau[i];
        }
    }

    return maximum;
}

void rangerTableau(double tableau[], double tableauRange[], int tailleTableau)
{
    int recommencer = 0, i, iPrime = 0;

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        tableauRange[i] = tableau[i];
    }

    for (recommencer = 0; recommencer < tailleTableau; recommencer = recommencer + 1)
    {
       for (i = 0; i < tailleTableau; i++)
       {
           if (tableauRange[i] < tableauRange[i+1])
           {
           }
           else
           {
               iPrime = tableauRange[i];
               tableauRange[i] = tableauRange[i+1];
               tableauRange[i+1] = iPrime;
           }
       }
    }
}

void afficheTableauRange(double tableauRange[], int tailleTableau)
{
    int i;

    printf("\n  -Les valeurs du tableau rangees dans l'ordre croissant : \n");

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        printf("%f\n", tableauRange[i]);
    }
}

void afficheTableau(double tableau[], int tailleTableau)
{
    int i;

    printf("\n  -Les valeurs que vous avez rentrer dans votre tableau sont : \n");

    for (i = 0; i < tailleTableau; i = i + 1)
    {
        printf("%f\n", tableau[i]);
    }
}

int retournerMenu(int retourMenu)
{
    printf("\n\n            Voulez-vous retourner au menu ?  1. OUI  -  2. NON");
    printf("\n\n                                             Votre choix : ");
    scanf("%d", &retourMenu);

    return retourMenu;
}


fonctions tableaux.h :
Secret (cliquez pour afficher)
Code : C
 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
#ifndef FONCTIONS_TABLEAUX_H_INCLUDED
#define FONCTIONS_TABLEAUX_H_INCLUDED

int menu();

int creerTableau();

double sommeTableau();

double moyenneTableau();

void copieTableau();

void afficheTableauCopie();

double maximumTableau();

void rangerTableau();

void afficheTableauRange();

void afficheTableau();

int retournerMenu();

#endif // FONCTIONS_TABLEAUX_H_INCLUDED


Voilà merci pour ceux qui l'auront lu/testé et encore plus à ceux qui donneront leur avis dessus ^^

Voir tous les commentaires