QCM de programmation 2 (une ou plusieurs réponses attendues)
Présentation :
Voici un examen alternatif utilisé en 2020 et qui peut servir d'entrainement à la
bonne gestion d'un code source en C. On pourra notamment constater qu'une bonne mise
en forme du code améliore la lisibilité du programme. La phase essentielle de relecture
permet de corriger les principales erreurs de programmation ; elle est aussi
indispensable dès qu'un code source déjà produit doit être réutilisé et modifié. Elle est cruciale
pour le langage C où les choix faits à différents niveaux par ses concepteurs compliquent
trop souvent la relecture comme la conception du code.
Les exemples des déficiences du C sont nombreux : au niveau du lexique :
un symbole plutôt qu'un mot, symbole !
pour la négation... de
la syntaxe : absence de then
, do while
(pour Repeat Until) et
while do
... des structures de données : caractères comme entiers
relatifs... de la sémantique : gestion chaotique des caractères et des chaines,
manque de contrôle dans la gestion des traitement comme des données... des mauvaises
habitudes de programmation qui se transmettent d'une génération à l'autre... La liste serait
longue, à tel point qu'on pourrait affirmer que le langage C est un très mauvais
langage de programmation. Malheureusement, il est encore très utilisé et sa
syntaxe bancale a inspiré de nombreux autres langages.
Vous ne travaillerez
donc pas ce QCM pour rien !
- écrire dans un fichier
Pour ouvrir un fichier de nom "texte.txt" et y sauvegarder une chaine S avant de fermer ce
fichier, j'écris en C :
N.B. Une seule réponse.
- FILE * F;
F=fopen(F,"texte.txt","w");
fscanf(F,"%s",S);
- FILE * F;
F=fopen(F,"texte.txt","w");
fprintf(F,"%s",S);
- FILE * F;
F=fopen(F,"texte.txt","w");
if (F!=NULL) fscanf(F,"%s",S);
- FILE * F;
F=fopen(F,"texte.txt","w");
if (F!=NULL) fprintf(F,"%s",S);
- FILE * F=("texte.txt","r");
if (F!=NULL) { fscanf(F,"%s",S); fclose(F); }
- FILE * F=("texte.txt","w");
if (F!=NULL) { fprintf(F,"%s",S); fclose(F); }
- FILE * F;
F=fopen(F,"texte.txt","w");
if (F!=NULL) fscanf(F,"%s",S);
fclose(F);
- FILE * F;
F=fopen(F,"texte.txt","w");
if (F!=NULL) fprintf(F,"%s",S);
fclose(F);
- FILE * F;
F=fopen(F,"texte.txt","w");
if (F!=NULL) { fscanf(F,"%s",S); fclose(F); }
- FILE * F;
F=fopen(F,"texte.txt","w");
if (F!=NULL) { fprintf(F,"%s",S); fclose(F); }
- variable type chaine
Pour définir une variable S de type chaine de caractères, je peux écrire en C :
- char S;
- char S *;
- * char S;
- char * S=NULL;
- char[10] S;
- char S[10];
- char S[10]='\0'}
- char S[10]={0};
- type structuré date
Pour définir un type de données structuré TDS correspondant à une date, je peux écrire
en C :
- #define TDS {int jour; int mois; int an};
- typedef enum TDS {int jour; int mois; int an};
- typedef enum {int jour; int mois; int an} TDS;
- typedef struct TDS {int jour; int mois; int an};
- define type TDS {int jour; int mois; int an};
- int TDS[3]={jour; mois; an};
- typedef struct {int jour; int mois; int an} TDS;
- typedef TDS struct {int jour; int mois; int an};
- somme des éléments d'un tableau (1D)
Pour définir une fonction qui retourne la somme des éléments d'un tableau de réels, je
peux écrire en C :
N.B. une seule réponse valide.
- float SOMME(float T[], int N) { float s=0; int i=0; while (i<N) s=s+T[i]; return s;}
- int SOMME(int T[], int N) { int s=0; int i; for (i=1;i<=N;i++) s=s+T[i]; return s;}
- float SOMME(float T[], int N) { float s=0; int i; for (i=1;i<=N;i++) s=s+T[i]; return s;}
- int SOMME(int T[], int N) { int s=0; int i; for (i=0;i<N;i++) s=s+T[i]; return s;}
- float SOMME(float T[], int N) { float s=0; int i; for (i=0;i<N;i++) s=s+T[i]; return s;}
- nombre de majuscules dans une chaine de caractères
Pour obtenir le nombre N de majuscules contenues dans une chaine de caractères S non
vide, je peux écrire en C :
- N=0;
for (i=1;i<strlen(S);i++)
if (S[i]>=48 && S[i]<=73) N++;
- N=0;
for (i=1;i<strlen(S);i++)
if (S[i]>='A' && S[i]<='Z') i++;
- N=0;
for (i=1;i<strlen(S);i++)
if (S[i]>=65 && S[i]<=95) N++;
- N=0;
for (i=1;i<strlen(S);i++)
if (S[i]>='A' && S[i]<='Z') S++;
- N=0;
for (i=1;i<strlen(S);i++)
if (S[i]>='A' && S[i]<='Z') N++;
- définition de la taille d'un tableau (1D)
Pour définir la taille d'un tableau T de 52 éléments, je peux écrire en C :
- #define 52 taille
- define taille=52;
- const unsigned int taille 52;
- unsigned int taille=52;
- #define taille 52
- sizeof(T)=52;
- typedef const {unsigned int taille=52} taille;
- enum taille {52};
- librairies
Pour disposer des fonctions scanf et printf, je dois utiliser en C l'instruction
- define stdlib.h;
- define stdio.h;
- include <stdio.h>
- include stdlib.h
- #include <stdlib.h>
- #include <stdio.h>
- #define <stdio.h>
- #define <stdlib.h>
- type symbolique semaine
Pour définir un type de données symbolique TDS listant les jours de la semaine, je peux
écrire en C :
- #define TDS {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}
- typedef TDS enum {Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi};
- typedef enum {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"} TDS;
- enum TDS[7] = {Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi};
- define type enum {Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi} TDS;
- char* TDS[7]={"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
- typedef struct {Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi} TDS;
- typedef enum {Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi} TDS;
- affichage d'un tableau (1D)
Pour afficher les éléments d'un tableau T de 23 réels, je peux écrire en C :
- for (i=0;i<23;i++) printf("%d ",T[i]);
- for (i=0;i<23;i++) printf("%d ",i);
- for (i=0;i<23;i++) printf("%f ",i);
- for (i=0;i<23;i++) printf("%f\n",T[i]);
- for (i=0;i<23;i++) printf("%f ",T[i]);
- printf(%23d ",T);
- printf("%23f ",T);
- for (i=1;i<=23;i++) printf("%f ",T[i]);
- for (i=1;i<=23;i++) printf("%d",T[i]);
- type structuré contenant un tableau
Pour définir un type structuré TS contenant un tableau d'au plus 25 réels ainsi que sa taille
effective, je peux écrire en C :
- typedef enum { float Tableau[25]; int Taille; } TS;
- typedef enum TS { float Tableau[25]; int Taille; };
- int Taille
- #define Taille 25
- typedef struct TS { float Tableau[Taille]; int Taille; } TS;
- struct Taille[3]={ float Tableau[Taille]; int Taille; };
- int Taille=25;
typedef struct { float Tableau[Taille]; int Taille; } TS;
- #define Taille 25;
typedef TS struct { float Tableau[Taille]; int Taille; };
- #define Taille 25;
typedef struct { float Tableau[Taille]; int Taille; } TS;
- typedef TS struct { float Tableau[25]; int Taille; };
- typedef struct TS { float Tableau[25]; int Taille; };
- typedef struct { float Tableau[25]; int Taille; } TS;
- déclarer un tableau de 15x30 entiers
Pour déclarer un tableau T à deux dimensions de 15×30 entiers, je peux écrire en C :
- int[15][30] T;
- int[15][30] T={0};
- int[15;30] T;
- int[15;30] T={0};
- int T[15;30];
- int T[15;30]={0};
- int T[15][30];
- int T[15][30]={0};
- taille d'une chaine de caractères saisie (difficulté du C)
J'ai écrit en C :
char S[10]={0};
scanf("%s",S);
for (i=0;i<=10;i++) printf("%c ",S[i]);
- Ce code source ne pourra pas compiler parce que le programme demande
d'afficher une chaine qui peut avoir plus de dix caractères, il aurait fallu écrire
scanf("%10s",S) pour limiter la taille de la chaine saisie
- Ce code source ne pourra pas compiler parce qu'on ne peut demander d'afficher
isolément les caractères d'une chaine
- A l'exécution, le programme affichera
segmentation fault
si la chaine
saisie a plus de 10 caractères
- A l'exécution, le programme affichera toute la chaine si elle contient au plus dix
caractères et n'affichera rien sinon
- A l'exécution, le programme affichera toute la chaine saisie
- A l'exécution, le programme affichera toute la chaine si elle contient au plus dix
caractères et sinon il affichera seulement les dix premiers caractères de la chaine saisie
- définir un tableau de structure
Pour gérer une librairie, j'ai défini en C un type structuré LIVRE contenant un Auteur,
un Titre, et un prix. Pour définir un tableau T de 600 LIVRES, je peux écrire :
- typedef struct LIVRE[600] T;
- struct[600] LIVRE T;
- struct LIVRE[600] T;
- struct LIVRE T[600];
- LIVRE[600] T;
- LIVRE T[600];
- afficher la table de multiplication
Parmi les codes suivants, le(s)quel(s) permet(tent) d'afficher une table de multiplication
bien mise en page ?
- int i,j;
for (i=0;i<9;i++)
for (j=0;j<9;j++)
printf("%d ",(i+1)*(j+1));
printf("\n");
- int i,j;
for (i=1;i<=9;i++)
for (j=1;j<=9;j++)
printf("%d ",i*j);
printf("\n");
- int i,j;
for (i=1;i<10;i++) {
for (j=1;j<<10j++)
printf("%2d ",(i+1)*(j+1));
printf("\n");
}
- int i,j;
for (i=1;i<10;i++) {
for (j=1;j<10;j++)
printf("%2d ",T[i]*T[j]);
printf("\n");
}
- int i,j;
for (i=0;i<=9;i++) {
for (j=0;j<=9;j++)
printf("%2d ",T[i]*T[j]);
printf("\n");
}
- int i,j;
for (i=1;i<10;i++) {
for (j=1;j<10;j++)
printf("%2d ",i*j);
printf("\n");
}
- int i,j;
for (i=0;i<9;i++) {
for (j=0;j<9;j++)
printf("%2d ",(i+1)*(j+1));
printf("\n");
}
- retour par adresse dans procédure
Pour avoir le prototype d'une procédure retournant les trois valeurs d'un temps donné en
heures-minutes-secondes saisies par l'utilisateur, je peux écrire en C :
- int *** Saisir(int jour, int mois, int annee);
- int & Saisir(int jour, int mois, int annee);
- void Saisir(* int heure, * int minutes, * int secondes);
- void Saisir(int heure &, int minutes &, int secondes &);
- void Saisir(int heure *, int minutes *, int secondes *);
- void Saisir(int & heures, int & minutes, int & secondes);
- void Saisir(int * heure, int * minute, int * seconde);
- définition des tailles d'un tableau (2D)
Pour définir les tailles N et P d'un tableau T de 4x13 éléments (tableau à deux dimensions),
je peux écrire en C :
- #define 4 N 13 P
- define N=4 && P=13
- #define N 4 && P 13
- struct {int N; int P} tailles;
- #define N 4
#define P 13
- sizeof(T)={N=4,P=13};
- typedef const {unsigned int N=4; unsigned int P=13} tailles;
- enum taille {4,13};
- ouvrir un fichier en lecture
Pour ouvrir un fichier et lire son premier élément qui est une chaine avant de fermer ce
fichier, j'écris en C :
N.B. Une seule réponse.
- char S[10]; FILE * f;
f=fopen("Nomdufichier.txt");
if (f!=NULL) { fprintf(f,S); fclose(f,"r"); }
- char S[10]; FILE f;
fopen(f,"Nomdufichier.txt","r");
fprintf((f,"%s",S);
f=fclose("Nomdufichier.txt");
- char S[10]; FILE f=fopen("Nomdufichier.txt","r");
fprintf((f,S);
fclose(f);
- char S[10]; FILE * f;
fopen(f,"Nomdufichier.txt","r");
if (f!=NULL) { fprintf((f,S);fclose(f); }
- char S[10]; FILE * f;
f=fopen("Nomdufichier.txt","r");
if (f!=NULL) fprintf((f,"%s",S);
fclose(f);
- char S[10]; FILE * f;
fopen(f,"Nomdufichier.txt","r");
if (f!=NULL) fprintf((f,"%s",S);
fclose(f,"Nomdufichier.txt","r");
- char S[10]; FILE * f=("Nomdufichier.txt","r");
fscanf(f,"%s",S);
- char S[10]; FILE * f;
f=("Nomdufichier.txt","r");
if (f!=NULL) { fscanf(f,"%s",S); fclose("Nomdufichier.txt"); }
- char S[10]; FILE * f;
f=fopen("Nomdufichier.txt");
if (f!=NULL) { fscanf(f,S); fclose(f,"r"); }
- char S[10]; FILE f;
fopen(f,"Nomdufichier.txt","r");
fscanf(f,"%s",S);
f=fclose("Nomdufichier.txt");
- char S[10]; FILE f=fopen("Nomdufichier.txt","r");
fscanf(f,S);
fclose(f);
- char S[10]; FILE * f;
fopen(f,"Nomdufichier.txt","r");
if (f!=NULL) { fscanf(f,S);fclose(f); }
- char S[10]; FILE * f;
f=fopen("Nomdufichier.txt","r");
if (f!=NULL) fscanf(f,"%s",S);
fclose(f);
- char S[10]; FILE * f;
fopen(f,"Nomdufichier.txt","r");
if (f!=NULL) fscanf(f,"%s",S);
fclose(f,"Nomdufichier.txt","r");
- char S[10]; FILE * f;
f=fopen("Nomdufichier.txt","r");
fscanf(f,"%s",S);
- char S[10]; FILE * f;
f=fopen("Nomdufichier.txt","r");
if (f!=NULL) { fscanf(f,"%s",S); fclose(f); }
- que fait un algorithme
Que fait cet algorithme ?
Donnée : une chaine S de longueur n indicée de 0 à (n-1)
Résultat : ...
Pour i de 0 à ((n-1) mod 2) faire
si S[i]≠S[n-1-i] alors Retourner Faux;
Retourner Vrai.
- Cet algorithme retournera toujours Vrai car c'est sa dernière instruction.
- Cet algorithme retournera toujours Faux, l'instruction Retourner Vrai ne sera jamais atteinte.
- Cette algorithme retourne toujours Vrai car on ne rentre jamais dans la boucle Pour
- Cette algorithme vérifie que la première moitié de la chaine est un palindrome
- Cette algorithme vérifie que la première moitié de la chaine a un nombre pair de caractères
- Cette algorithme vérifie que la taille de la chaine est bien la valeur n
- Cette algorithme teste si une chaine contient un nombre pair de caractères
- Cette algorithme teste si une chaine est un palindrome
- algorithme de saisie d'un tableau 2D d'entiers
Je veux que l'utilisateur saisisse les valeurs d'un tableau à deux dimensions de
12×24 entiers, je peux écrire en C :
- for (i=0;i<12;i++) for (j=0;j<24;j++) scanf("%d %d",i,j);
- for (i=0;i<=12;i++) for (j=0;j<=24;j++) scanf("%d %d",i,j);
- for (i=0;i<12;i++) for (j=0;j<24;j++) scanf("%d %d",T[i],T[j]);
- for (i=0;i<12;i++) for (j=i;j<12;j++) scanf("%d",T[i][j]);
- for (i=0;i<12;i++) for (j=i;j<24;j++) scanf("%f",T[i,j]);
- for (i=0;i<12;i++) for (j=0;j<i;j--) scanf("%d",T[i][j]);
- for (i=0;i<12;i++) for (j=0;j<24;j++) scanf("%d",T[i][j]);
- for (i=0;i<=11;i++) for (j=0;j<=23;j++) scanf("%d",T[i][j]);
- for (i=0;i<12;i++) for j=0;j<24;j++) scanf("%c",T[i,j]);
- utiliser un tableau de structure
Pour gérer une librairie, j'ai défini en C un type structuré LIVRE contenant un Auteur,
un Titre, et un prix, ainsi qu'un tableau T de 600 LIVRES,. Pour afficher l'Auteur, le Titre,
et le Prix du premier livre, je peux écrire :
- printf("%s, %s, %f", T[1]);
- printf("%s, %s, %f", T[0]);
- printf("%s, %s, %f", T[1][1], T[1][2], T[1][3]);
- printf("%s, %s, %f", T[0][0], T[0][1], T[0][2]);
- printf("%s, %s, %f", T.Auteur.[1], T.Titre[1], T.Prix.[1]);
- printf("%s, %s, %f", T.Auteur.[0], T.Titre[0], T.Prix.[0]);
- printf("%s, %s, %f", T[1].Auteur, T[1].Titre, T[1].Prix);
- printf("%s, %s, %f", T[0].Auteur, T[0].Titre, T[0].Prix);
- lecture dans un fichier
Pour placer proprement le contenu d'un fichier d'entiers dans un tableau de
11 entiers, en tenant compte du fait qu'on ne connait pas à l'avance le nombre d'entiers
dans le fichier, je peux écrire en C :
- Je ne peux pas le programmer en C car je dois savoir à l'avance combien d'entiers
il y a dans le fichier
- FILE * F; int i=0;
F=fopen("fichier.entiers","r");
if (F!=NULL) {
while (!feof(F)) { fscanf(F,"%d",T[i]); i++}
fclose(f);
}
- FILE * F; int i=0; int k=0;
F=fopen("fichier.entiers","r");
if (F!=NULL) {
for (i=0;i<10;i++) fprintf(F,"%d",T[i]);
fclose(f);
}
- FILE * F; int i=0; int k=0;
F=fopen("fichier.entiers","r");
if (F!=NULL) {
for (i=0;i<10;i++) fscanf(F,"%d",T[i]);
fclose(f);
}
- FILE * F; int i=1;
F=fopen("fichier.entiers","r"); while ((!feof(F)) && (i<10)) { fscanf(F,"%d",T[i]); i++}
- FILE * F; int i=0;
F=fopen("fichier.entiers","w");
if (F!=NULL) {
while ((!feof(F)) && (i<10)) { fprintf(F,"%d",T[i]); i++; }
fclose(f);
}
- FILE * F; int i=0;
F=fopen("fichier.entiers","r");
if (F!=NULL) {
while ((!feof(F)) && (i<10)) fscanf(F,"%d",T[i]);
fclose(f);
}
- FILE * F; int i=0;
F=fopen("fichier.entiers","r");
if (F!=NULL) {
while ((!feof(F)) && (i<10)) { fscanf(F,"%d",T[i]); i++; }
fclose(f);
}
- tirage aléatoire
Pour obtenir un nombre aléatoire A compris entre 0 et n, je peux écrire en C :
- A=srand(0..n)
- A=srand(n+1);
- A=srand(0;n)
- A=srand()%n
- A=rand()/n
- A=rand(n+1);
- A=rand(0;n)
- A=rand()%n
- transfert conditionnel de tableau 2D vers 1D
Pour transférer les valeurs positives d'un tableau D à deux dimensions de
10×10 valeurs vers un tableau U à une dimension de 100 valeurs, je peux écrire en C :
- for (i=0;i<=100;i++) if (T[i][j]>=0) T[i%10][j/10]=U[i];
- for (i=0;i<=100;i++) if (T[i][j]>=0) U[i]=T[i%10][j/10];
- k=0; for (i=0;i<10;i++) for (j=0;j<10;j++) if (T[i][j]>=0) { k++; T[i][j]=U[k];}
- k=0; for (i=0;i<10;i++) for (j=0;j<10;j++) if (T[i][j]>=0) { T[i][j]=U[k]; k++; }
- k=0; for (i=0;i<10;i++) for (j=0;j<10;j++) if (T[i][j]>=0) { k++; U[k]=T[i][j]; }
- k=0; for (i=0;i<10;i++) for (j=0;j<10;j++) if (T[i][j]>=0) { U[k]=T[i][j]; k++; }
- moyenne des éléments d'un tableau de réels (1D)
Pour définir une fonction MOYENNE qui retourne la moyenne des éléments d'un
tableau T de N réels, je peux écrire en C :
N.B. : une seule réponse juste.
- float MOYENNE(float T[], int N) { float s=0; int i; for (i=0;i<N,i++) s=s+T[i]; while (i<N); return s%N;}
- float MOYENNE(float T[], int N) { float s=0; int i; for (i=0;i<N,i++) s=s+T[i]; return M/N;}
- float moyenne(float T[], int N) { int s=0; int i; for (i=1;i<=N;i++) s=s+i; return s%N;}
- int MOYENNE(int T[], int N) { int s=0; int i; for (i=0;i<N;i++) s=s+T[i]; return s*1.0/N;}
- float MOYENNE(float T[], int N) { float s=0; int i; for (i=0;i<N;i++) s=s+T[i]; return s/N;}
- définir un tableau de réels prérempli de zéros
Pour définir un tableau de 7 réels, on a écrit en C :float T[7]={0};
et dans cette instruction :
- le compilateur donne une erreur car il aurait fallu écrire : float T[7]; T={0,0,0,0,0,0,0};
- le compilateur donne une erreur car il aurait fallu écrire : float[7] T={0,0,0,0,0,0,0};
- le compilateur donne une erreur car il aurait fallu écrire : float[7] T={0};
- ={0} est toujours ignoré par le compilateur.
- ={0} donne une erreur car pour un tableau de réels il aurait fallu écrire 0.0 et non 0 qui est un entier.
- ={0} signifie que le tableau est initialisé à NULL.
- ={0} signifie que la première valeur du tableau prend la valeur 0.
- ={0} signifie que toutes les valeurs du tableau prennent la valeur 0.
- retour par adresse dans procédure (bis)
Pour avoir le prototype d'une procédure retournant les trois valeurs d'une date saisies
par l'utilisateur, je peux écrire en C :
- int *** Saisir(int jour, int mois, int annee);
- int & Saisir(int jour, int mois, int annee);
- {jour*; mois*; annee*} Saisir()
- (int jour, int mois, int annee) Saisir ();
- (int & jour, int & mois, int & annee) Saisir ();
- (int * jour, int * mois, int * annee) Saisir ();
- void Saisir (int jour, int mois, int annee);
- void Saisir (int & jour, int & mois, int & annee);
- void Saisir (int * jour, int * mois, int * annee);
- que fait une fonction sur un tableau
Que fait la fonction Quefaisje :
float Quefaisje(int T[],int n) {
int i; float k; k=0;
for (i=0;i<n;i++) k=k+T[i];
if (n==0) return 0 else return (k/n);
}
- Cette fonction fait planter le programme parce que le tableau T doit être passé en paramètre par adresse.
- Cette fonction fait planter le programme parce que le tableau T doit être passé en paramètre par valeur.
- Cette fonction fait planter le programme parce qu'il y a une division par zéro si n=0.
- Cette fonction retourne la plus grande des valeurs du tableau T, après avoir modifié en conséquence ce tableau.
- Cette fonction retourne la plus grande des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction retourne la somme des valeurs du tableau T, après avoir modifié en conséquence ce tableau.
- Cette fonction retourne la somme des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction retourne la moyenne des valeurs du tableau T, après avoir modifié en conséquence ce tableau.
- Cette fonction retourne la moyenne des valeurs du tableau T, sans modifier ce tableau.
- fonction retournant une structure
Pour avoir le prototype d'une procédure qui donne une variable de type structuré DATE,
contenant les valeurs de jour, mois et année saisies par l'utilisateur dans la fonction,
je peux écrire en C :
- D={jour;moi;annee} in SaisirDate(int jour, int mois, int annee);
- D=struct DATE SaisirDate(int & jour, int & mois, int & annee);
- D=struct DATE SaisirDate(int * jour, int * mois, int * annee);
- struct DATE D=SaisirDate(int jour, int mois, int annee);
- void SaisirDate(int D.jour, int D.mois, int D.annee);
- void SaisirDate(DATE &D);
- void SaisirDate(DATE * D);
- transfert de tableau 2D vers 1D
Pour transférer les valeurs d'un tableau D à deux dimensions de 10×10 valeurs vers un
tableau U à une dimension de 100 valeurs, je peux écrire en C :
- for (i=0;i<100;i++) T[i%10][j/10]=U[i];
- for (i=0;i<10;i++) for (j=0;j<10;j++) T[i][j]=U[i+10*j];
- for (i=0;i<10;i++) for (j=0;j<10;j++) U[i+10*j]=T[i][j];
- for (i=0;i<10;i++) for (j=0;j<10;j++) T[i][j]=U[i+10*j];
- for (i=0;i<10;i++) for (j=0;j<10;j++) U[i+10*j]=T[i][j];
- for (i=0;i<100;i++) U[i]=T[i%10][j/10];
- structure de structure
J'ai défini un type structuré IDENTITE composé d'un Nom, d'un Prenom, et d'une
Date correspondant à la date de naissance.
Cette Date est de type structuré DATE qui comprend un Jour, un Mois, et une Année.
Pour obtenir l'année de naissance d'une variable X de type identité, je peux écrire en C :
- {X; Date; Annee}
- {X; DATE; Annee}
- X(DATE(Annee))
- X(Date(Annee))
- Annee.DATE.X
- Annee.Date.X
- X.DATE[2]
- X[2].Annee
- X.Date[2]
- X[2][2]
- X.DATE.Annee
- X.Date.Annee
- saisie par caractères
Que fais ce code C ?
char c; do c=getchar() while (c!='\n');
- Il ne saisira rien car il faut utiliser putchar pour lire un caractère
- Il ne saisira rien car il faut impérativement utiliser printf pour lire une chaine
- Il ne saisira rien car il faut impérativement utiliser scanf pour lire une chaine
- Il ne compilera pas car il aurait fallu écrire getchar(c,1) pour préciser qu'on lit un caractère à la fois
- Il permet de lire une suite de chiffres saisis au clavier et se terminant par \0
- Il permet de lire une suite de caractères saisis au clavier et se terminant par un retour à la ligne
- variable de type structuré Date avec valeur
Pour définir une variable D, d'un type de données structuré DATE déjà défini et contenant
les trois éléments Jour, Mois et Annee, qui corresponde au 12/06/2020, je peux écrire en C :
- #define struct {int Jour; int Mois; int Annee} DATE D={12;6;2020}
- struct {int Jour; int Mois; int Annee} DATE D; D={12;6;2020};
- D= struct DATE {int Jour=12; int mois=6; int Annee=2020};
- DATE D= Jour=12 && Mois=6 && Annee=2020;
- DATE D;
D.Annee=2020; D.Jour=12; D.mois=6;
- DATE D;
D.Jour=12; D.mois=6; D.Annee=2020;
- que fait un programme
Que fait ce code C ?
k=0;
for (i=0;i<10;i++) for (j=0;j<15;j++) if (T[i][j]==x) k++; printf("resultat :%d\n",k);
- Il ne compile pas car il aurait fallu utiliser scanf et pas printf
- Il affiche le nombre de valeurs inférieures à x dans le tableau T à une dimension
- Il affiche le nombre de valeurs inférieures à x dans le tableau T à deux dimensions
- Il affiche le nombre de valeurs supérieures à x dans le tableau T à une dimension
- Il affiche le nombre de valeurs supérieures à x dans le tableau T à deux dimensions
- Il affiche le nombre de fois où la valeur x est présente dans le tableau T à une dimensions
- Il affiche le nombre de fois où la valeur x est présente dans le tableau T à deux dimensions
- que fait un programme (bis)
Que fait ce code C ?
k=0;
for (i=0;i<10;i++) for (j=0;j<15;j++) if (T[i][j]>=x) k++;
printf("resultat :%d\n",k);
- Il ne compile pas car il aurait fallu utiliser scanf et pas printf
- Il affiche le nombre de valeurs inférieures à x dans le tableau T à une dimension
- Il affiche le nombre de valeurs inférieures à x dans le tableau T à deux dimensions
- Il affiche le nombre de fois où la valeur x est présente dans le tableau T à une dimensions
- Il affiche le nombre de fois où la valeur x est présente dans le tableau T à deux dimensions
- Il affiche le nombre de valeurs supérieures à x dans le tableau T à une dimension
- Il affiche le nombre de valeurs supérieures à x dans le tableau T à deux dimensions
- que fait un programme (ter)
Que fait cette fonction C ?
int Retourner(int float T[], int n) {
int i; int k=0;
for (i=0;i<n;i++) if (T[i]==x) k++;
}
- Elle ne marche pas car il aurait fallu retourner un entier
- Elle ne marche pas car la variable x n'est pas utilisée
- Elle retourne le nombre de valeurs inférieures à x dans le tableau T
- Elle retourne le nombre de valeurs positives dans le tableau T
- Elle retourne le nombre de valeurs négatives dans le tableau T
- Elle retourne le nombre de valeurs supérieures à x dans le tableau T
- Elle retourne le nombre de fois ou la valeur x est présente dans le tableau T.
- que fait un programme (suite)
Que fait ce code C ?
k=0; x=0;
for (i=0;i<10;i++) for (j=0;j<15;j++) if (T[i][j]<x) k++; printf("resultat :%d\n",k);
- Il ne compile pas car il aurait fallu utiliser scanf et pas printf
- Il affiche le nombre de valeurs strictement supérieures à x dans le tableau T à une dimension
- Il affiche le nombre de valeurs strictement supérieures à x dans le tableau T à deux dimensions
- Il affiche le nombre de fois où la valeur x est présente dans le tableau T à une dimensions
- Il affiche le nombre de fois où la valeur x est présente dans le tableau T à deux dimensions
- Il affiche le nombre de valeurs strictement inférieures à 0 dans le tableau T à une dimension
- Il affiche le nombre de valeurs strictement supérieures à 0 dans le tableau T à une dimension
- Il affiche le nombre de valeurs strictement supérieures à 0 dans le tableau T à deux dimensions
- Il affiche le nombre de valeurs strictement inférieures à 0 dans le tableau T à deux dimensions
- que fait une fonction sur un tableau (ter)
Que fait la fonction suivante :
float Queferaisje(float * T[],int * n) {
int i; float k; k=T[0];
for (i=1;i<(*n);i++) if (T[i]>k) k=k+T[i];
return k;
}
- Cette fonction retourne la plus grande des valeurs du tableau T, après avoir
modifié en conséquence ce tableau.
- Cette fonction retourne la plus grande des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction retourne la moyenne des valeurs du tableau T, après avoir modifié
en conséquence ce tableau.
- Cette fonction retourne la moyenne des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction retourne la somme des valeurs du tableau T, après avoir modifié en
conséquence ce tableau.
- Cette fonction retourne la somme des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction ne compile pas ou fait planter le programme parce qu'il y a une
incohérence sur le passage en paramètre de la variable n.
- Cette fonction ne compile pas ou fait planter le programme parce qu'il y a une
incohérence sur le passage en paramètre du tableau T.
- écriture des boucles
Qu'affiche ce code C ?
for (i=1;i++;i<10) for (j=1;j++;j<10) printf("%d ",i*j);
- Ce code compile, mais à l'exécution il donne une erreur "segmentation fault"
- Ce code donne une erreur de compilation
- Ce code compile sans erreur et affiche les produits de tous les entiers de 1 à 9
- Ce code compile sans erreur mais n'affiche rien
- indiçage d'une chaine
Que fait la fonction suivante ?
int TRUC(char S[]) {
int n=0;
if (S==NULL) return 0;
while ((*(S+n)!='\0') n++;
return n;
}
- Elle ne marche pas si la chaine est vide
- Elle donne le nombre de chiffres différents de '0' dans la chaine
- Elle donne l'adresse en mémoire du premier caractère de la chaine
- Elle donne l'adresse en mémoire du dernier caractère de la chaine
- Elle ne marche pas car il aurait fallu utiliser '\n' et pas '\0'
- Elle ne marche pas car il aurait fallu utiliser "\0" (des guillements) et pas '\0' (des apostrophes)
- Elle vérifie que la chaine ne contient que des chiffres
- Elle vérifie que la chaine ne contient que des caractères majuscules
- Elle donne la taille de la chaine S
- fonction retournant une structure
Pour créer une fonction REMPLIR qui permet d'obtenir un étudiant Jacques MARTIN âgé
de 19 ans, en remplissant les différents champs d'une variable structuré ETUDIANT
contenant un Nom, un Prenom, et un Age, afin que cet étudiant soit disponible dans le
programme, je peux écrire en C :
- void REMPLIR(ETUDIANT * E) { (*E).Nom="MARTIN"; (*E).Prenom="Jacques"; (*E).Age=19; return E; }
- ETUDIANT REMPLIR() { ETUDIANT * E; E.Nom="MARTIN"; E.Prenom="Jacques"; E.Age=19; return E; }
- void REMPLIR(ETUDIANT * E) { (*E).Nom="MARTIN"; (*E).Prenom="Jacques"; (*E).Age=19; }
- ETUDIANT * REMPLIR() { ETUDIANT * E=malloc(sizeof(ETUDIANT)); (*E).Nom="MARTIN"; (*E).Prenom="Jacques"; (*E).Age=19; return E; }
- sauvegarde d'un tableau d'entiers dans un fichier
Je dispose d'un tableau T de dix entiers. Pour sauvegarder ce tableau dans un fichier F
déjà ouvert, je peux écrire en C :
- for (i=0;i<10;i++) fscanf(F,"%d %d %d %d %d %d %d %d %d %d\n",T[i]);
- i=0; while (i<=10) { fscanf(F,"%*d",T); i++ ;}
- for (i in [0..10[) fscanf(F,"%d\n",T[i]);
- while (i<=10) { fscanf(F,"%d",T[i]))); i++; }
- for (i=0;i<10;i++) fscanf(F,"%*d\n",T);
- for (i=0;i<10;i++) fscanf((F,"%d\n",T[i]);
- for (i=0;i<10;i++) fprintf(F,"%d %d %d %d %d %d %d %d %d %d\n",T[i]);
- i=0; while (i<=10) { fprintf(F,"%*d",T); i++; }
- for (i in [0..10[) fprintf(F,"%d\n",T[i]);
- while (i<=10) { fprintf(F,"%d",T[i]); i++; }
- for (i=0;i<10;i++) fprintf(F,"%*d\n",T);
- for (i=0;i<10;i++) fprintf(F,"%d\n",T[i]);
- que fait une fonction sur un tableau (bis)
Que fait la fonction Quefaire :
float Quefaire(float T[],int n) {
int i; float k; k=0;
for (i=0;i<n;i++) k=k+T[i];
return k;
}
- Cette fonction fait planter le programme parce que le tableau T doit être passé en paramètre par adresse.
- Cette fonction fait planter le programme parce que le tableau T doit être passé en paramètre par valeur.
- Cette fonction fait planter le programme parce qu'il y a une division par zéro si n=0.
- Cette fonction retourne la plus grande des valeurs du tableau T, après avoir modifié en conséquence ce tableau.
- Cette fonction retourne la plus grande des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction retourne la moyenne des valeurs du tableau T, après avoir modifié en conséquence ce tableau.
- Cette fonction retourne la moyenne des valeurs du tableau T, sans modifier ce tableau.
- Cette fonction retourne la somme des valeurs du tableau T, après avoir modifié en conséquence ce tableau.
- Cette fonction retourne la somme des valeurs du tableau T, sans modifier ce tableau.
- type structuré heure
Pour définir un type de données HEURE correspondant à une heure, je peux écrire en C :
- typedef enum HEURE {int heures; int minutes; int secondes};
- typedef struct HEURE {int heures; int minutes; int secondes};
- define type HEURE {int heures; int minutes; int secondes};
- int HEURE[3] {jour; mois; an};
- typedef HEURE = struct {int heures; int minutes; int secondes};
- typedef struct {int heures; int minutes; int secondes} HEURE;
- somme des éléments d'un tableau d'entiers (1D)
Pour définir une fonction SOMME qui retourne la somme des éléments d'un tableau T de
N entiers, je peux écrire en C :
N.B. : une seule réponse juste.
- int SOMME(int T[], int N) { int s=0; int i=0; do {s=s+T[i];} while (i<N); return s; }
- float SOMME(float T[], int N) { float s=0; int i=0; do {s=s+T[i];} while (i<N); return s; }
- int SOMME(int T[], int N) { int s=0; int i; for (i=1;i<=N;i++) s=s+i; return s; }
- int SOMME(int T[], int N) { float s=0; int i; for (i=0;i<N;i++) s=s+T[i]; return s; }
- int SOMME(int T[], int N) { intt s=0; int i; for (i=0;i<N;i++) s=s+T[i]; return s; }
- type symbolique
mois
Pour définir un type de données symbolique MOIS listant les jours de la semaine, je peux écrire en C :
- #define MOIS = {"Janvier", "Fevrieri", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"}
- typedef MOIS enum {Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre};
- define type MOIS = {Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre};
- enum MOIS[12] = {Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre};
- define type enum {Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre} MOIS;
- char* MOIS[12]={"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Decembre"};
- typedef struct {Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre} MOIS;
- typedef enum {Janvier, Fevrier, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre} MOIS;
- sauvegarde dans un fichier d'un tableau de structures
Je dispose d'un tableau T de dix DATE, le type date étant un type structuré composé d'un
Jour, d'un Mois et d'une Annee. Pour sauvegarder ce tableau dans un fichier F déjà ouvert
en lecture, je peux écrire en C :
- for (i=0;i<10;i++) fscanf(F,"%d %d %d\n",T[i]);
- for (i=0;i<10;i++) fscanf(F,"%DATE\n",T[i]);
- i=0;
while (i<=10) { fscanf(F,"%d %d %d\n",T[i].Jour,T[i].Mois,T[i].Annee); }
- i=0;
while (!eof(F)) { fscanf(f,"%d %d %d\n",T[i].Jour,T[i].Mois,T[i].Annee); i++; }
- for (i=0;i<10;i++) fscanf(F,"%d %d %d\n",T[i].Jour,T[i].Mois,T[i].Annee);
- for (i=0;i<10;i++) {
fscanf(F,"%d ",T[i].Jour);
fprintf(F,"%d ",T[i].Mois);
fscanf(F,"%d\n",T[i].Annee);
}
- for (i=0;i<10;i++) fprintf(F,"%d %d %d\n",T[i]);
- for (i=0;i<10;i++) fprintf(F,"%DATE\n",T[i]);
- i=0;
while (i<=10) { fprintf(F,"%d %d %d\n",T[i].Jour,T[i].Mois,T[i].Annee);}
- i=0;
while (!eof(F)) { fprintf(f,"%d %d %d\n",T[i].Jour,T[i].Mois,T[i].Annee); i++;}
- for (i=0;i<10;i++) fprintf(F,"%d %d %d\n",T[i].Jour,T[i].Mois,T[i].Annee);
- for (i=0;i<10;i++) {
fprintf(F,"%d ",T[i].Jour);
fprintf(F,"%d ",T[i].Mois);
fprintf(F,"%d\n",T[i].Annee);
}