Skip to content

C – Compter dans un Tableau

3 mars 2016

L’exercice 6.3 de la série de TD sur les Tableaux en C nous demande :

Écrire un programme permettant à l’utilisateur de saisir un nombre quelconque de valeurs, qui devront être stockées dans un tableau. L’utilisateur doit commencer par entrer le nombre de valeurs qu’il compte saisir. Il effectuera  ensuite cette saisie. Enfin, une fois la saisie terminée, le programme compte :

  1. le nombre de valeurs négatives et de valeurs positives,
  2. le nombre de valeurs paires et impaires,
  3. le nombre de valeurs multiples de 3,
  4. le nombre de valeurs positives, paires et multiples de 3.

Pour compter quelque chose dans un tableau, il faut utiliser… un compteur ! Le principe est simple : il consiste à initialiser une variable (qui servira de compteur) à zéro, puis parcourir le tableau grâce à une boucle (for de préférence) pour répéter un test (if) qui incrémentera le compteur seulement si la condition est vérifiée.

Voici donc une solution :


#include <stdio.h>

int main(void)
{
    int n;
    printf("Combien de valeurs comptez-vous saisir ? ");
    scanf("%d", &n);
    int t[n];
    for (int i=0 ; i<n ; ++i){
        printf("%d%se valeur : ", i+1, i?"":"r");
        scanf("%d", &t[i]);
    }
    int pos=0, neg=0, pair=0, mul3=0, ppm3=0;
    for (int i=0 ; i<n ; ++i){
        if (t[i] > 0)
            ++pos;
        else if (t[i] < 0)
            ++neg;
        if (t[i] % 2 == 0)
            ++pair;
        if (t[i] % 3 == 0){
            ++mul3;
            if (t[i] > 0 && t[i] % 2 == 0)
                ++ppm3;
        }
    }
    puts("Résultats des comptes :");
    printf("- valeurs negatives : %d\n", neg);
    printf("- valeurs positives : %d\n", pos);
    printf("- valeurs nulles : %d\n", n-neg-pos);
    printf("- valeurs paires : %d\n", pair);
    printf("- valeurs impaires : %d\n", n-pair);
    printf("- valeurs multiples de 3 : %d\n", mul3);
    printf("- valeurs positives, paires et multiples de 3 : %d\n",
           ppm3);
    return 0;
}

Dans cette solution je me suis permis de considérer que le compilateur est assez récent pour accepter ce qui dans la norme du C99 (qui date quand même de 17 ans !) est appelé les tableaux à longueur variable ou variable length arrays (VLA). Cela permet de déclarer un tableau en utilisant comme taille une variable (c’est n ici). Comme ça je peux demander à l’utilisateur la taille du tableau et ne réserver après (dans la déclaration) que le nombre d’éléments dont j’ai besoin.

Si vous préférez utiliser la norme de 1990, il faudra obligatoirement déclarer le tableau avec une taille constante et mettre les déclarations au début du bloc de main() (cette norme n’acceptait pas les déclarations au milieu des instructions). Utilisez une constante, par exemple NMAX (nommez toujours vos constantes en majuscules) définie par #define au début du programme, c’est mieux qu’une constante littérale. Seulement il faudra choisir une valeur assez grande et vérifier que l’utilisateur ne la dépasse pas. Ensuite vous remplirez seulement les n premières cases de ce tableau. Les NMAX-n cases restantes occuperont inutilement la mémoire.

Le début du programme pourra se présenter ainsi :

#include <stdio.h>
#define NMAX 500
int main(void)
{
    int t[NMAX];
    int n, i;
    do {
        printf("Combien de valeurs comptez-vous saisir ? ");
        scanf("%d", &n);
    } while (n > NMAX && printf("Pas plus de %d SVP.", NMAX)); 
    for (i=0 ; i<n ; ++i){

Les tests sont simples, il n’y a pas de grandes difficultés dans cet exercice. Le else de la ligne 17 n’est pas obligatoire mais il permet d’éviter de tester si le nombre est négatif quand on a déjà trouvé qu’il était positif. De même, le if de la ligne 23 est imbriqué dans celui de la ligne 21 pour éviter de tester deux fois si le nombre est multiple de 3 inutilement.

Question défi : Sauriez-vous trouver une méthode utilisant un pointeur au lieu de la variable i et n’utilisant pas d’instructions de tests (ni if ni switch) ?

Réponse : Remplacez la boucle for par la suivante (cliquez pour voir la réponse) :

    for (int *p=t ; p-t<n ; ++p){
        pos += *p>0;
        neg += *p<0;
        pair += !(*p%2);
        mul3 += !(*p%3);
        ppm3 += *p>0 && !(*p%6);
    }
Publicités
3 commentaires
  1. WhizzMirray permalink

    merci professeur :)

    J'aime

  2. WhizzMirray permalink

    Merci professeur

    J'aime

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :