48 questions. Une seule bonne réponse par question, et
l'explication s'affiche dès que vous avez répondu.
Le cours · La fiche
0 / 48
1Que vaut 6 / 7 en C, entre deux entiers ?
0. Entre deux entiers, la division est entière : le reste est jeté. Pour obtenir 0,857 il faut au moins un réel — 6.0 / 7 ou (float) 6 / 7. C'est le piège le plus cher du C, et il ne produit aucun avertissement.
2Pourquoi écrit-on & devant la variable dans scanf, et pas dans printf ?
printflit la valeur : elle lui suffit. scanf doit écrire dans la variable, il lui faut donc son adresse — d'où le &. Moyen mnémotechnique : « printf lit, scanf écrit ».
3Dans un if, quel opérateur compare deux valeurs ?
=affecte, ==compare. if (x = 5) range 5 dans x et vaut toujours vrai : le programme compile, tourne, et prend systématiquement la mauvaise branche.
4Quelle est la différence entre 'A' et "A" ?
'A' est un caractère (type char). "A" est une chaîne : la lettre, plus le caractère nul qui la termine — donc deux octets. Les affecter l'un à l'autre ne fait pas ce qu'on croit.
5Que fait a++ par rapport à ++a ?
Les deux incrémentent a. Mais a++renvoie l'ancienne valeur avant d'incrémenter, ++a la nouvelle. Seule sur sa ligne, la différence ne se voit pas ; dans une expression, elle décale tout d'un cran.
6Que se passe-t-il si on oublie break dans un case ?
L'exécution continue dans les case suivants jusqu'au premier break ou la fin du switch. C'est parfois voulu — regrouper plusieurs valeurs — mais presque toujours un oubli, et le compilateur ne dit rien.
7Que fait le code for (i = 0; i < 10; i++); ?
Le point-virgule est le corps de la boucle : elle tourne dix fois sans rien faire, puis l'instruction d'après s'exécute une seule fois. Le programme compile, tourne, et n'affiche pas ce qu'on attendait — deux programmes du TP en vivaient.
8Le C est-il sensible à la casse ?
Oui, partout.age et Age sont deux variables distinctes, et Int n'existe pas — c'est int. Les deux exemples du chapitre 13 qui ne compilent pas le sont pour cette seule raison.
9Que contient une variable déclarée mais non initialisée ?
Ce qui se trouvait à cet endroit de la mémoire. Le résultat est imprévisible et change d'une exécution à l'autre : c'est l'une des pannes les plus déroutantes du C. Une somme doit toujours partir de 0.
10Quel code de format affiche un réel avec deux décimales ?
%.2f. Par défaut, %f affiche six décimales — d'où les 20.000000 inattendus. %d est pour les entiers, %c pour un caractère, %s pour une chaîne.
11Quelle est la différence entre un prototype et une définition de fonction ?
Le prototype annonce l'existence de la fonction : int additionner(int a, int b);. La définition la contient : int additionner(int a, int b) { return a + b; }. Un fichier peut avoir les deux, jamais deux définitions.
12Dans int additionner(int a, int b) appelée par additionner(10, 20);, que sont 10 et 20 ?
Le paramètre est la variable déclarée dans la définition — ici a et b. L'argument est la valeur fournie à l'appel. Le paramètre est le contenant, l'argument le contenu.
13Un tableau int mesures[10] est passé à une fonction. Que vaut sizeof à l'intérieur de cette fonction ?
Ce n'est pas le tableau qui est transmis, c'est l'adresse de sa première case. Dans main, sizeof rend 40 — dix entiers de quatre octets ; dans la fonction, 8 — la taille d'une adresse. D'où la règle : on passe toujours la taille en second paramètre.
14Pourquoi SaisirTableau() peut-elle remplir un tableau sans rien retourner ?
La fonction reçoit l'adresse, pas une copie : ce qu'elle écrit dans t[i] est écrit dans le tableau d'origine. Avec une variable simple, c'est l'inverse — la fonction en reçoit une copie, et la modifier ne change rien chez l'appelant.
15Dans un tableau de 10 éléments, quelle condition de boucle est juste ?
Les indices vont de 0 à taille − 1, donc de 0 à 9. i <= 10 lirait la case 10, qui n'existe pas — et le C ne le signalerait pas : ni à la compilation, ni à l'exécution.
16Que produit return (float) perdus / envoyes * 100; avec perdus = 25 et envoyes = 500 ?
La conversion (float) force la division à se faire en réels : 25 ÷ 500 = 0,05, puis × 100 = 5,00 %. Sans la conversion, deux entiers divisés donnent un entier : 25 / 500 vaut 0, et le taux affiché serait 0,00 %.
17Pourquoi initialise-t-on max = t[0] plutôt que max = 0 ?
Avec max = 0, un tableau de valeurs toutes négatives ferait renvoyer 0 — une valeur qui ne figure pas dans le tableau. Partir de la première valeur réelle est juste dans tous les cas, et la boucle démarre alors à i = 1.
18Le cours définit void affichercarre(int n) puis appelle afficherCarre(5);. Que se passe-t-il ?
Le C distingue les majuscules des minuscules : ce sont deux noms différents, et un seul existe. Le compilateur répond call to undeclared function 'afficherCarre' — et suggère même did you mean 'affichercarre'?
19Dans le tableau 10 15 20 25 30 35 …, à quelle position se trouve la valeur 30 ?
La position d'une valeur dans un tableau, c'est son indice, et les indices commencent à 0. La variable de boucle i est donc déjà la réponse : on écrit position = i; sans rien ajuster. Le seul endroit où l'on décale, c'est pour parler à l'utilisateur — printf("Valeur %d : ", i + 1).
20Quel test permet de savoir si une fonction est bien découpée ?
« Calcule la moyenne d'un tableau » est une bonne fonction. « Saisit les notes et calcule la moyenne et affiche le résultat » en cache trois. C'est pour cela que l'exercice 9 du TP en demande cinq : chacune fait une chose, et main ne fait qu'orchestrer.
21Que contient p après int age = 20; int *p = &age ?
Un pointeur contient une adresse, jamais une donnée. p vaut l'adresse de age ; c'est *p qui vaut 20.
22Dans int *p; puis *p = 30;, l'étoile joue-t-elle le même rôle ?
Dans int *p; l'étoile fait partie de la déclaration (« p est un pointeur »). Dans *p = 30; c'est un opérateur (« va à l'adresse rangée dans p »). Pour les distinguer : y a-t-il un type devant ?
23Que vaut tab pour int tab[5]; ?
tab == &tab[0]. C'est pour cette raison qu'un tableau n'est jamais copié quand on le passe à une fonction : on passe son adresse sans le savoir.
24Quelle écriture est équivalente à p[3] ?
p[i] est exactement *(p + i). Attention à la place des parenthèses : *p + 3 ajouterait 3 à la valeur du premier élément.
25Dans une boucle, que se passe-t-il si l'on écrit à la fois p[i] et p++ ?
Les deux font avancer : au tour i on lit tab[2i]. Compilé et exécuté sur un tableau de cinq éléments, le programme affiche 1, 6, 7 puis deux valeurs lues hors du tableau. On choisit *p avec p++, oup[i] sans.
26De combien p++ fait-il avancer un int *p ?
L'arithmétique des pointeurs se compte en cases du type pointé, pas en octets. C'est le type du pointeur qui fixe le pas — d'où l'importance qu'il soit juste.
27Pourquoi écrit-on malloc(n * sizeof(int)) et non malloc(n) ?
malloc réserve un nombre d'octets. Un int en occupe 4 : malloc(n) ne réserverait qu'un quart de la place, et l'écriture déborderait sur la mémoire voisine.
28Qu'est-ce qui distingue calloc de malloc ?
calloc(n, taille) prend le nombre d'objets et la taille d'un objet, et initialise tout à zéro. malloc laisse ce qui traînait. Les deux se libèrent avec free.
29Que faut-il faire juste après un malloc ?
malloc rend NULL quand il échoue. Sans le test, on déréférence un pointeur nul : plantage sans message. Le sujet du TP 5 le demande explicitement à l'exercice 4.
30Pourquoi un ; après l'accolade fermante d'un struct ?
Une fonction se termine par }, une structure par };. L'oublier produit des erreurs sur les lignes suivantes — on cherche alors la faute là où elle n'est pas.
31Comment remplit-on un champ char nom[30] d'une structure ?
Un tableau ne s'affecte pas : on copie son contenu avec strcpy, qui demande #include <string.h>. Et à la saisie, pas de & : e1.nom est déjà une adresse.
32Quand utilise-t-on -> plutôt que . ?
Structure → le point ; pointeur sur structure → la flèche. p->age n'est qu'un raccourci pour (*p).age, parenthèses comprises.
33Une fonction reçoit struct Etudiant e et modifie e.age. Que devient l'original ?
Passée par valeur, une structure est copiée. Pour modifier l'original il faut l'adresse : paramètre struct Etudiant *e, appel f(&e1), accès e->age.
34À quoi sert typedef devant une structure ?
typedef ne crée rien : il permet d'écrire Etudiant e1; au lieu de struct Etudiant e1;. Le gain se voit surtout dans les prototypes et les pointeurs.
35Comment accède-t-on au jour de naissance dans une structure imbriquée ?
Un point par étage : e1 → naissance → jour. La flèche ne servirait que si e1 était un pointeur sur la structure.
36Une fonction doit REMPLIR une structure saisie au clavier. Quel paramètre ?
Elle doit écrire dans l'original : il lui faut son adresse. Avec struct Produit p, elle remplit une copie détruite au retour — le programme compile, tourne, et main affiche une structure vide. Faute muette, donc la plus coûteuse.
37Pourquoi écrit-on scanf("%29s", p.nom) plutôt que scanf("%s", p.nom) pour un char nom[30] ?
%s seul écrit autant de caractères qu'on en tape, par-dessus la mémoire voisine. Et c'est 29, pas 30 : toute chaîne en C se termine par un \0 qu'il faut pouvoir ranger.
38Comment réserve-t-on de la place pour n structures Livre ?
Le compilateur ajoute des octets de remplissage entre les champs pour les aligner : la somme des tailles calculée à la main est presque toujours trop petite. sizeof donne la taille réelle sur la machine qui compile.
39Pour chercher le livre le plus récent dans un tableau, que retient-on ?
C'est le livre qu'on doit afficher, avec son titre et son auteur : l'année seule ne les ramène pas. On part de recent = 0 — « pour l'instant, c'est le premier » — ce qui est vrai avant d'avoir regardé les autres.
40Dans struct Equipement, le champ dateAchat est de type struct Date. Que faut-il respecter ?
Le compilateur lit le fichier de haut en bas : pour réserver la place du champ, il doit déjà connaître la taille de struct Date. Inverser les deux donne field has incomplete type. C'est la même règle que le prototype avant l'appel.
41« Un mot de 49 caractères maximum » : comment déclare-t-on le tableau ?
49 lettres plus la case du '\0', soit 50. Oublier cette case fait écrire au-delà du tableau, sans message et sans plantage immédiat.
42Combien de cases occupe char mot[] = "Salut" en mémoire ?
Cinq lettres plus le caractère de fin '\0'. C'est lui qui dit où la chaîne s'arrête : sans lui, rien dans le tableau ne le dirait.
43Que renvoie strcmp(a, b) quand les deux chaînes sont identiques ?
0 veut dire « identiques », ce qui est l'inverse de la convention habituelle du C où 0 est faux. if (strcmp(a, b)) teste donc si elles sont DIFFÉRENTES.
44Pourquoi écrit-on scanf("%s", nom) sans & ?
Un tableau est l'adresse de sa première case. Une variable ordinaire, elle, a besoin du & : scanf("%d", &age).
45Que se passe-t-il si on tape « Jean Dupont » dans un scanf("%s", nom) ?
Avec %s, la lecture s'arrête au premier espace, tabulation ou retour à la ligne. Ce qui reste sera lu par le scanf suivant, qui semblera « ne pas attendre ». Pour lire la ligne entière : fgets.
46Quel format utilise-t-on pour afficher le résultat de strlen() ?
strlen rend un size_t, qui n'est pas un int : le format est %zu. Avec %d, le compilateur avertit.
47Quelle est la différence entre strcpy et strcat ?
C'est toute la différence, et elle est entière. Ni l'une ni l'autre ne vérifie la taille de la destination : c'est au programmeur de la déclarer assez grande.
48Dans while (mot[i] != '\0'), qu'est-ce qui arrête la boucle ?
C'est la convention du C : la chaîne se termine par '\0', et c'est ce qui permet de la parcourir sans connaître sa longueur.