QCM : Spécification et programmation en C/C++ — 24 questions
Questions et réponses du QCM
1. Quelle définition décrit le mieux un algorithme ?
Un fichier exécutable contenant des instructions traduites dans un langage machine
Une séquence d’instructions permettant d’obtenir un résultat reproductible dans un environnement donné
Un dispositif matériel chargé d’effectuer automatiquement des calculs numériques
Une notation graphique servant à représenter les composants d’un ordinateur
Une séquence d’instructions permettant d’obtenir un résultat reproductible dans un environnement donné
Explication
Un algorithme décrit les étapes à suivre pour obtenir un résultat reproductible dans un environnement donné. Un fichier exécutable correspond plutôt à un programme déjà traduit pour être exécuté.
2. Quelle distinction entre un algorithme et un programme est correcte ?
Un algorithme concerne le matériel, tandis qu’un programme décrit les résultats d’une expérience
Un algorithme utilise du code binaire, tandis qu’un programme est formulé sans langage informatique
Un algorithme est toujours exécuté directement, tandis qu’un programme reste une description théorique
Un algorithme est indépendant du langage, tandis qu’un programme le traduit pour l’ordinateur
Un algorithme est indépendant du langage, tandis qu’un programme le traduit pour l’ordinateur
Explication
L’algorithme reste général et indépendant du langage, alors que le programme en constitue une traduction compréhensible par l’ordinateur. Le code binaire appartient à une forme de traduction du programme, pas à la définition générale de l’algorithme.
3. Quelle succession correspond au traitement complet d’un problème informatique ?
Programmer, exécuter, analyser, compiler, concevoir l’algorithme, puis formuler le problème
Compiler, analyser les résultats, programmer, exécuter, concevoir l’algorithme, puis analyser le problème
Analyser, concevoir l’algorithme, programmer, compiler, exécuter, puis analyser les résultats
Concevoir l’algorithme, compiler, analyser le problème, programmer, analyser les résultats, puis exécuter
Analyser, concevoir l’algorithme, programmer, compiler, exécuter, puis analyser les résultats
Explication
La démarche commence par l’analyse du problème et se poursuit par la conception, la programmation, la compilation, l’exécution et l’analyse des résultats. Modifier cet ordre peut conduire à compiler ou exécuter une solution qui n’a pas encore été correctement conçue.
4. Quelle affirmation distingue correctement compilation, interprétation et machine virtuelle ?
La compilation exécute un langage générique, l’interprétation traduit tout le programme à l’avance et la machine virtuelle analyse les résultats
La compilation et l’interprétation produisent le même traitement, tandis qu’une machine virtuelle remplace l’étape de programmation
La compilation traite chaque instruction pendant l’exécution, l’interprétation produit un binaire complet et la machine virtuelle dépend d’un processeur précis
La compilation traduit tout le programme avant son exécution, l’interprétation traite les instructions à l’exécution et la machine virtuelle vise une machine générique
La compilation traduit tout le programme avant son exécution, l’interprétation traite les instructions à l’exécution et la machine virtuelle vise une machine générique
Explication
La compilation produit une traduction préalable, tandis que l’interprétation simule les instructions lors de leur exécution et qu’une machine virtuelle fournit un environnement générique. Confondre compilation et interprétation revient à inverser le moment où les instructions sont traitées.
5. Quelle affirmation décrit correctement le bit et l’octet ?
Un bit regroupe 8 octets, et un octet peut valoir 0 ou 1
Un bit représente un caractère, et un octet décrit une instruction complète
Un bit contient 8 valeurs distinctes, et un octet correspond à une seule valeur binaire
Un bit peut valoir 0 ou 1, et un octet regroupe 8 bits
Un bit peut valoir 0 ou 1, et un octet regroupe 8 bits
Explication
Un bit possède deux valeurs possibles, 0 et 1, tandis qu’un octet est constitué de 8 bits. Un octet ne se limite donc pas à une seule valeur binaire.
6. Quelles valeurs un entier non signé stocké sur n bits peut-il représenter ?
De −2n à 2n−1
De 1 à 2n
De 0 à 2n−1
De −2n−1 à 2n−1−1
De $$0$$ à $$2^n-1$$
Explication
Un entier non signé utilise tous ses bits pour représenter des valeurs non négatives, de 0 à 2n−1. L’intervalle centré autour de zéro correspond à une représentation signée, pas non signée.
7. Comment sont répartis les 32 bits d’un nombre flottant selon IEEE-754 ?
1 bit de signe, 23 bits d’exposant et 8 bits de mantisse
1 bit de signe, 8 bits d’exposant et 23 bits de mantisse
8 bits de signe, 1 bit d’exposant et 23 bits de mantisse
1 bit de signe, elf bits d’exposant et 20 bits de mantisse
1 bit de signe, 8 bits d’exposant et 23 bits de mantisse
Explication
Le format IEEE-754 simple précision répartit les 32 bits en 1 bit de signe, 8 bits d’exposant et 23 bits de mantisse. Les autres répartitions échangent les rôles ou les tailles de ces champs.
8. Dans un programme C, quel rôle joue l’instruction `return 0` placée à la fin de la fonction `main` ?
Elle demande au compilateur d’ignorer les avertissements
Elle relance la fonction principale après son exécution
Elle indique que le programme s’est terminé avec succès
Elle réserve zéro case dans la mémoire du programme
Elle indique que le programme s’est terminé avec succès
Explication
La valeur retournée par `main` informe le système de l’état de terminaison, et `0` conventionnellement signale le succès. Les avertissements du compilateur et la gestion de la mémoire ne dépendent pas de cette instruction.
9. Pour lire une donnée au clavier dans un programme C++, quelle association correspond aux flux C++ ?
`scanf` pour l’entrée et `printf` pour la sortie
`cin` pour l’entrée et `cout` pour la sortie
`main` pour l’entrée et `return` pour la sortie
`cout` pour l’entrée et `cin` pour la sortie
`cin` pour l’entrée et `cout` pour la sortie
Explication
En C++, `cin` reçoit les données d’entrée et `cout` produit les sorties via les flux C++. `scanf` et `printf` sont les fonctions classiques du C, tandis que `main` et `return` n’assurent pas ces opérations.
10. Quelle succession d’étapes permet de construire un exécutable à partir de fichiers sources C ou C++ ?
Compiler en fichiers objets, puis effectuer l’édition des liens
Exécuter les fichiers sources, puis générer leurs prototypes
Convertir les bibliothèques en sources, puis compiler l’exécutable
Effectuer l’édition des liens, puis compiler les fichiers objets
Compiler en fichiers objets, puis effectuer l’édition des liens
Explication
La compilation transforme les fichiers sources en fichiers objets, puis l’édition des liens assemble ces objets avec les bibliothèques pour produire l’exécutable. L’édition des liens intervient donc après la production des fichiers objets.
11. Comment répartit-on généralement les prototypes et les définitions des fonctions entre les fichiers d’un programme C ou C++ ?
Les prototypes et les définitions vont ensemble dans un fichier `.o`
Les prototypes vont dans `.h` ou `.hpp`, les définitions dans `.c` ou `.cpp`
Les prototypes vont dans `.c` ou `.cpp`, les définitions dans `.h` ou `.hpp`
Les prototypes vont dans les bibliothèques, les définitions dans les fichiers exécutables
Les prototypes vont dans `.h` ou `.hpp`, les définitions dans `.c` ou `.cpp`
Explication
Les fichiers d’en-tête `.h` ou `.hpp` déclarent les fonctions, tandis que les fichiers `.c` ou `.cpp` contiennent leur implémentation. Un fichier objet `.o` est un résultat de compilation et ne constitue pas l’organisation source habituelle.
12. Quelle affirmation distingue correctement `float` et `double` en C et C++ ?
`float` représente les réels en simple précision, tandis que `double` les représente en double précision
`float` est un tableau dynamique, tandis que `double` est un tableau de taille fixe
`float` stocke des caractères, tandis que `double` stocke des chaînes de caractères
`float` représente les entiers signés, tandis que `double` représente les entiers non signés
`float` représente les réels en simple précision, tandis que `double` les représente en double précision
Explication
`float` et `double` sont des types de nombres réels, avec respectivement une simple et une double précision. Les entiers, les caractères et les tableaux correspondent à d’autres catégories de types.
13. Dans quelle situation un `vector` C++ est-il le choix adapté ?
Lorsqu’un tableau doit conserver une taille fixée à la compilation
Lorsqu’il faut déclarer uniquement un prototype de fonction
Lorsqu’il faut regrouper des champs de types différents dans un objet
Lorsqu’un tableau doit pouvoir changer de taille pendant l’exécution
Lorsqu’un tableau doit pouvoir changer de taille pendant l’exécution
Explication
Un `vector` est un tableau dynamique dont la taille peut évoluer pendant l’exécution. Un tableau statique répond au besoin d’une taille fixe, tandis qu’une structure regroupe des champs et qu’un en-tête déclare des fonctions.
14. Quelle caractéristique définit un `array` en C++ par rapport à un `vector` ?
Il contient les arguments transmis à la ligne de commande
Sa taille est fixe et connue à la compilation
Sa taille augmente automatiquement selon les insertions
Il rassemble plusieurs champs de types différents
Sa taille est fixe et connue à la compilation
Explication
Un `array` est un tableau statique dont la taille est déterminée à la compilation. La possibilité de modifier la taille pendant l’exécution caractérise plutôt un `vector`, tandis que les autres propriétés concernent d’autres notions.
15. Dans un bloc interne, que se passe-t-il lorsqu’une variable porte le même nom qu’une variable déclarée dans le bloc externe ?
La variable interne masque celle du bloc externe
Les deux variables sont automatiquement fusionnées
Le programme convertit les deux variables en constantes
La variable externe remplace celle du bloc interne
La variable interne masque celle du bloc externe
Explication
La portée d’une variable locale est limitée à son bloc, et une déclaration interne du même nom masque la déclaration externe. La fusion des deux variables ne correspond pas au fonctionnement des blocs en C.
16. Quelle affirmation distingue correctement les opérateurs % et / en C ?
% affecte une valeur, tandis que / compare deux valeurs
% donne le reste, tandis que / effectue la division
% effectue la division, tandis que / donne le reste
% incrémente une variable, tandis que / la décrémente
% donne le reste, tandis que / effectue la division
Explication
L’opérateur % calcule le reste d’une division, alors que / réalise la division. Confondre ces deux opérateurs conduit à interpréter incorrectement le résultat d’une expression arithmétique.
17. Quelle boucle convient lorsqu’un bloc d’instructions doit être exécuté au moins une fois avant le test de la condition ?
Une boucle do while
Une boucle for sans incrément
Une boucle while
Une structure conditionnelle if
Une boucle do while
Explication
La boucle do while évalue sa condition après la première exécution du bloc, ce qui garantit au moins un passage. Une boucle while teste sa condition avant le bloc et peut donc ne produire aucune itération.
18. Dans une condition en C, quelle opération compare deux valeurs sans en affecter une à l’autre ?
L’opérateur +=
L’opérateur =
L’opérateur !
L’opérateur ==
L’opérateur ==
Explication
L’opérateur == teste l’égalité entre deux valeurs et produit une valeur logique utilisable dans une condition. L’opérateur = réalise une affectation, même si une expression d’affectation peut parfois être accidentellement utilisée comme condition.
19. Quels éléments caractérisent la définition d’une fonction en C ?
Une variable globale, une macro, un fichier et une classe
Un opérateur, une adresse, un pointeur et une structure
Une condition, une constante, une étiquette et une boucle
Un type de retour, un nom, des paramètres et un bloc
Un type de retour, un nom, des paramètres et un bloc
Explication
Une fonction est définie par son type de retour, son nom, sa liste de paramètres et son bloc d’instructions. Elle utilise return pour renvoyer une valeur, sauf lorsque son type de retour est void.
20. Quelle différence décrit correctement le passage par valeur et le passage par référence ?
La valeur transmet une adresse, la référence crée une constante
La valeur modifie l’original, la référence protège la donnée
La valeur utilise le même objet, la référence transmet une copie
La valeur transmet une copie, la référence utilise le même objet
La valeur transmet une copie, la référence utilise le même objet
Explication
Le passage par valeur transmet une copie de l’argument, tandis que le passage par référence donne accès au même objet sous un autre nom. La modification d’une copie ne change donc pas l’argument original, contrairement à une modification effectuée par référence.
21. Pourquoi une fonction comme sommediff(int a, int b, int *somme, int *diff) peut-elle fournir deux résultats à son appelant ?
Elle transforme automatiquement les deux paramètres en valeurs de retour
Elle utilise des variables locales qui remplacent celles de l’appelant
Elle renvoie deux objets grâce à deux instructions return
Elle écrit la somme et la différence aux adresses reçues
Elle écrit la somme et la différence aux adresses reçues
Explication
Les paramètres somme et diff sont des pointeurs contenant les adresses où la fonction peut écrire les résultats calculés. Deux instructions return ne permettent pas, à elles seules, de renvoyer simultanément deux valeurs distinctes.
22. Qu’est-ce qu’un pointeur en programmation ?
Une variable qui contient directement la valeur d’une donnée quelconque
Une fonction qui modifie l’adresse d’une donnée en mémoire
Un type de donnée réservé aux nombres entiers
Une variable qui contient l’adresse d’une donnée d’un type donné
Une variable qui contient l’adresse d’une donnée d’un type donné
Explication
Un pointeur stocke l’adresse mémoire d’une donnée et son type indique la nature de la donnée pointée. Une variable qui contient directement une valeur n’est pas nécessairement un pointeur, car elle ne stocke pas une adresse.
23. Quelle association entre les opérateurs `&` et `*` est correcte en C++ ?
`&` compare deux pointeurs et `*` transforme une adresse en entier
`&` accède à une donnée et `*` obtient l’adresse de cette donnée
`&` obtient une adresse et `*` accède à la donnée située à cette adresse
`&` libère une zone mémoire et `*` réserve une nouvelle zone
`&` obtient une adresse et `*` accède à la donnée située à cette adresse
Explication
L’opérateur `&` récupère l’adresse d’une variable, tandis que `*` déréférence un pointeur pour atteindre le contenu correspondant. Confondre leurs rôles revient à attribuer à `&` l’action de déréférencement et à `*` celle de prise d’adresse.
24. Quelle proposition décrit correctement `nullptr`, `new` et `delete` ?
`nullptr` représente un lien vide, `new` alloue une mémoire et `delete` la libère
`nullptr` libère une mémoire, `new` représente un lien vide et `delete` l’alloue
`nullptr` déclare une donnée, `new` copie un pointeur et `delete` change son type
`nullptr` alloue une mémoire, `new` la libère et `delete` représente un lien vide
`nullptr` représente un lien vide, `new` alloue une mémoire et `delete` la libère
Explication
`nullptr` indique l’absence de lien valide, `new` réserve une zone mémoire et renvoie un pointeur, puis `delete` libère la mémoire associée. La confusion la plus courante consiste à inverser les rôles de `new` et de `delete`, alors que l’un alloue et l’autre libère.
Révisez avec les flashcards
Mémorisez les réponses avec 66 flashcards sur Spécification et programmation en C/C++.
Qu'est-ce qu'un algorithme en informatique ?
Une séquence d'instructions décrivant des étapes reproductibles.
Quelle différence principale existe entre un programme et un algorithme ?
Le programme est une traduction d'un algorithme dans un langage compréhensible par un ordinateur.
Quelles sont les étapes du traitement d'un problème informatique ?
Analyse, conception d'algorithme, programmation, compilation, exécution, analyse des résultats.