QCM Language C

Description:Un rapide QCM sur le language C.
Auteur:Mikaël NAVARRO <klnavarro@gmail.com>
Date: 2011-08-31
Revision: 2
License:GNU FDL
Info:Cf. <http://klnavarro.free.fr/spip/spip.php?rubrique12>.

Contents

1ère série

Généralités

  1. Le langage C a été inventé au début des années
  • 1970
  • 1980
  • 1960
  1. Un commentaire sur une ligne est introduit par :
  • //
  • %/
  • \\
  1. Une directive de préprocesseur est une ligne qui commence par :
  • #
  • {
  • //
  1. Quelles sont les en-têtes de déclaration de la fonction « main » que vous avez déjà rencontré ?
  • void Main (id1, id2, ..., idn)
  • void main ()
  • void main (id1, id2, ..., idn)
  1. Quel type n'existe pas dans le langage C :
  • bool
  • float
  • int
  1. Le type char correspond à :
  • un entier codé sur un unique octet
  • un réel.
  • ni l'un ni l'autre.
  1. Le type unsigned int correspond à :
  • un entier.
  • un réel.
  • ni l'un ni l'autre.
  1. Le type extended correspond à :
  • un entier.
  • un réel.
  • ni l'un ni l'autre.
  1. Le type int correspond à :
  • un entier.
  • un réel.
  • ni l'un ni l'autre.
  1. Le type double correspond à :
  • un entier.
  • un réel.
  • ni l'un ni l'autre.
  1. On est obligé d'affecter une valeur à une variable lors de sa déclaration ?
  • vrai
  • faux
  1. Où peut-on déclarer une variable ?
  • dans la fonction principale main
  • avant la fonction principale main
  • avant une directive au précompilateur "#include"
  1. Les fonctions d'entrée/sortie standard sont contenues dans la bibliothèque :
  • stdio.h
  • stdlib.h
  • windows.h
  1. Qu'est-ce qui n'existent pas dans le langage C :
  • références
  • pointeurs
  • structures
  1. Qu'est-ce que C++ ?
  • un langage de programmation
  • un compilateur
  • une bibliothèque contenant des focntions C très évoluées
  1. Quelle fonction permet d'afficher du texte dans la console ?
  • printf
  • cout
  • scanf
  1. Quelle fonction permet de récupérer une valeur entrée par l'utilisateur ?
  • scanf
  • cin
  • printf
  1. On alloue de la mémoire avec :
  • malloc
  • new
  • delete
  1. Quel mot-clé n'existe pas en C.
  • free
  • short
  • case

Bases C

  1. Pour compiler du C avec gcc en ayant un maximum de warnings du compilateur, il faut utiliser :
  • -Wall
  • -std=c99
  • -Wextra
  1. En C, pour lire une valeur entière dans la variable toto, on peut faire :
  • printf("%u", toto);
  • scanf("%u", toto);
  • scanf("%u", &toto);
  1. Le morceau de code suivant

    for (int i = 0; i <= 10; i++);
    {
      printf("%u", i);
    }
    
  • fera 10 appels à printf
  • fera 11 appels à printf
  • fera un appel à printf
  1. Une boucle for (A; B; C) { D; } peut se traduire par :
  • A; while (B) { C; D }
  • A; while (B) { D; C }
  • while (A; B) { C; D }
  1. Si on définie une variable comme ceci

    struct paire {
      int premier;
      int second;
    };
    
    struct paire v;
    

alors on peut accéder au premier élément de v comme ceci :

  • v->premier
  • v.premier
  • v[0]
  • premier(v)
  1. Si t est un tableau, alors on peut accéder à l'élément numéro 3 de t avec :
  • t(3)
  • t[3]
  • *(t + 3)
  • 3[t]
  1. Le code suivant

    int *f(void) {
      int x;
      return &x;
    }
    
  • est correct
  • est incorrect. On pourrait écrire return malloc(sizeof(int)) à la place.
  • est incorrect. On ne peut pas renvoyer de pointeur dans une fonction en C.
  1. En C, si on définit int *x, que représente x ?
  • Un entier non nul
  • Un pointeur
  • Une adresse

Notions avancées

  1. Pour déclarer un tableau T non-constant de caractères constants, on peut utiliser :
  • const char *T
  • char const *T
  • char * const T
  1. Si a et b sont de type char *, alors le code while (*a++ = *b++); effectue ...
  • Une comparaison de chaines de caractères
  • Rien d'intéressant
  • Une copie de chaine de caractères
  1. Pour obtenir le 23ème bit d'un mot de 32 bits X (i.e. 0 si le bit est à 0, et autre chose si le bit est à 1), on peut écrire :
  • (1 << 23) & X
  • 0x800000 & X
  • (X << 9) >> 31
  1. Le programme

    int *f() {
      int x = 42;
      return &x;
    }
    
  • Provoque une erreur à la compilation
  • Provoque une erreur à l'édition de liens
  • Provoque une erreur à l'exécution
  1. Un bon programmeur C écrirait plutôt :
  • #define MAX(a, b) (a >= b) ? a : b
  • #define MAX(a, b) (((a) >= (b)) ? (a) : (b))
  1. Un bon programmeur C écrirait plutôt :
  • #define SWAP(x, y) tmp = x; x = y; x = tmp
  • #define SWAP(x, y) { int tmp = x; x = y; x = tmp; }
  • #define SWAP(x, y) do { int tmp = (x); (x) = (y); (x) = tmp; } while (0)

2ème série

QCM 2 (complet)

  1. La déclaration

    int tab[100];
    

réserve :

  • 100 variables de type entier en mémoire
  • 99 variables de type entier en mémoire
  • 101 variables de type entier en mémoire
  1. Ce code

    int i;
    i = 10;
    
    if (i=10)
    {
      printf ("i vaut dix\n");
    }
    
  • est incorrect et provoque une erreur de compilation
  • est probablement incorrect mais ne provoque pas d'erreur de compilation
  • est probablement correct et provoque une erreur de compilation
  1. Ce code

    for (i=0; i<10; i++)
    {
      for (j=0; j<10; j++)
      {
        tab[i] = tab[i] + j;
      }
    printf ("Fin des 2 boucles\n");
    }
    
  • n'est pas correctement indenté
  • est correctement indenté
  1. Le code suivant affiche

    int i;
    int tab[10];
    
    for (i=0; i<10; i++)
    {
      tab[i] = i;
    }
    printf ("i = %d\n", i);
    
  • i = 9;
  • i = 11;
  • i = 0;
  • i = 10;
  1. Ce code affiche

    int i;
    i = 15;
    
    if ( i < 10)
    {
      if (i < 20)
      {
        printf ("i est inférieur à 20\n");
      }
      else if (i < 30)
      {
        printf ("i est inférieur à 30\n");
      }
    }
    else
    {
      printf ("i est plus grand que 10\n");
    }
    
  • i est inférieur à 20
  • i est inférieur à 30
  • i est plus grand que 10
  • i est inférieur à 20 i est inférieur à 30
  • i est inférieur à 20 i est inférieur à 30 i est plus grand que 10
  1. Ce code

    int i;
    int tab[10];
    
    for (i=0; i <100; i++)
    {
      tab[i] = 0;
    }
    
  • provoque une erreur de compilation
  • est incorrect, ne provoque pas d'erreur de compilation mais peut provoquer une erreur lors de l'exécution
  • est incorrect, ne provoque pas d'erreur de compilation et peut s'exécuter sans erreur apparente
  • est correct
  1. Pour affecter la valeur 10 à la variable entière i, on écrit :
  • 10 = i;
  • i = 10;
  1. Ce code

    i = 0;
    if (i)
    {
      printf ("i est nul\n");
    }
    
  • semble correct
  • semble incorrect
  1. Ce code affiche

    int i;
    i = 15;
    
    if ( i < 30)
    {
      printf ("i est inférieur à 30\n");
    }
    else if (i < 20)
    {
      printf ("i est inférieur à 20\n");
    }
    else if (i < 10)
    {
      printf ("i est inférieur à 10\n");
    }
    
  • i est inférieur à 30
  • i est inférieur à 20
  • i est inférieur à 10 i est inférieur à 20
  • i est inférieur à 10
  1. Ce code affiche

    int i;
    int j;
    
    i = 0;
    do
    {
      j = i + 1;
      i = i + 3;
    } while (i < 10);
    printf ("i = %d\n", i);
    
  • i = 9
  • i = 10
  • i = 11
  • i = 12
  1. Quelle ligne s'affiche

    int i;
    int j;
    
    i = 0;
    j = 0;
    do
    {
      i++;
      j++;
    } while (i+j < 10);
    printf ("i = %d, j = %d\n", i, j);
    
  • i=5, j=5
  • i=1, j=4
  • i=0, j=0
  1. Ce code

    #define NB 10
    
    int x;
    x = NB +1;
    printf ("x = %d\n", x);
    
  • semble incorrect
  • est correct et affiche : x = 101
  • est correct et affiche : x = 11
  1. Le code suivant vous paraît-il correct

    int age;
    age = 70;
    
    if (age < 21)
    {
      printf("Vous êtes jeune !\n");
    }
    else if (age >= 60)
    {
      printf("Vous commencez à être agé...\n");
    }
    
  • oui
  • non
  1. Combien de caractères X le code suivant affiche-t-il

    int i;
    
    for(i=0; i<10; i++)
    {
      for(j=0; j<5; j++)
      {
        printf("X");
      }
    }
    printf ("\n");
    
  • 49
  • 50
  • 51
  1. Quelle ligne s'affiche

    int i;
    int j;
    
    i = 1;
    j = 10;
    do
    {
      j = j - 1;
      if (j == 5)
      {
        i = 0;
      }
    } while (i != 0);
    printf ("i = %d, j = %d\n", i, j);
    
  • i=0, j=5
  • i=1, j=0
  • i=0, j=1
  • i=1, j=5

QCM 3 (divers, if / while / gcc)

  1. Pour fabriquer le fichier exécutable correspondant au fichier source toto.c, on écrit :
  • gcc toto -o toto.c
  • gcc toto.c -o toto
  • gcc -c toto.c
  • gcc -c toto
  1. Quelle ligne s'affiche

    int i;
    i = 10;
    
    if ( i == 10)
    {
      printf ("bonjour ");
    }
    if ( i < 20)
    {
      printf ("bonsoir ");
    }
    else if ( i == 10)
    {
      printf ("au revoir ");
    }
    
  • bonjour
  • bonsoir
  • bonjour bonsoir
  • bonjour bonsoir au revoir
  • bonjour au revoir
  1. Quelle ligne s'affiche

    int i;
    
    do
    {
      i = i + 1;
    } while (i < 5);
    printf ("i = %d\n", i);
    
  • i=0
  • i=4
  • i=5
  • il est impossible de répondre avec certitude à cette question

QCM 5 (tableau)

  1. L'expression balayer un tableau signifie :
  • enlever la poussière pour mieux voir le contenu d'un tableau
  • vérifier qu'une boucle ne déborde pas d'un tableau
  • faire une boucle pour parcourir les éléments d'un tableau
  1. Ce code

    #include <stdio.h>
    
    main()
    {
      int i;
      int quantite[5];
      int somme;
    
      quantite[0]=100;
      quantite[1]=13;
      quantite[2]=32;
      quantite[3]=50;
      quantite[4]=200;
      quantite[5]=24;
    
      for (i=0; i < 10; i++)
      {
        somme = somme + quantite[i];
      }
      printf("Quantité totale : %d\n", somme);
    }
    
  • est correct
  • comporte une erreur
  • comporte deux erreurs
  1. Soit l'extrait de code suivant

    int piece[50];
    piece[7] = 20;
    

On peut dire :

  • on place 20 dans élément d'indice 7 du tableau pièce
  • on met 20 dans le huitième élément du tableau pièce
  • on place 7 dans l'indice 20 du tableau
  1. Les éléments d'un tableau sont rangés consécutivement en mémoire :
  • du plus petit indice vers le plus grand
  • du plus grand indice vers le plus petit
  • dans un ordre indeterminé
  1. Ce code

    int i;
    int tab[10];
    
    for (i=0; i <100; i++)
    {
      tab[i] = 0;
    }
    
  • provoque une erreur de compilation
  • est incorrect, ne provoque pas d'erreur de compilation mais peut provoquer une erreur lors de l'exécution
  • est incorrect, ne provoque pas d'erreur de compilation et peut s'exécuter sans erreur apparente
  • est correct
  1. Dans la notation

    char piece[16];
    

le nombre 16 représente :

  • la dimension du tableau piece
  • un indice du tableau piece
  • le nombre d'éléments du tableau piece
  • le nombre d'octets qu'utilise le tableau piece en mémoire
  1. Dans la notation

    piece[10] = 3;
    

le nombre 10 représente :

  • la taille du tableau piece
  • un indice
  • la valeur du tableau piece pour l'indice 3
  1. La déclaration

    int tab[100];
    

réserve :

  • 100 variables de type entier en mémoire
  • 99 variables de type entier en mémoire
  • 101 variables de type entier en mémoire
  1. Ce code

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

affiche :

  • i = 9;
  • i = 11;
  • i = 0;
  • i = 10;
  1. Soit le tableau de caractères

    char reference[30];
    

Pour désigner le dixième caractère, on écrit :

  • R1 reference[9]
  • R2 reference[10];
  • R3 reference[11];
  1. Dans la notation

    int piece[10];
    

le nombre 10 représente :

  • la taille du tableau piece
  • la dimension du tableau piece
  • un indice du tableau piece
  • le nombre d'éléments du tableau piece
  • le nombre d'octets qu'utilise le tableau piece en mémoire

Pourriez-vous confirmer ou réfuter mes réponses ?

et donner la bonne réponse le cas échéant.

  1. Il existe des pointeurs. VRAI
  1. Le code source est portable. FAUX
  1. Le code binaire est portable. FAUX
  1. Il supporte la notion d'objet. FAUX
  1. || sert à concaténer 2 chaînes de caractères. FAUX
  1. for (i=0; i<10; i++) fait varier i de 0 à 10. VRAI
  1. if(a=b) teste l'égalité entre a et b. FAUX