EXAMEN EN LANGAGE C ( PROGRAMMATION C ) TEST 04 /XX 2022
EXAMEN + CORRIGE EN LANGAGE C
Exercice 01 : 8pts
Soit le code suivant :
void test(){
int *ptint;
int tab1[]={1, 2, 3, 4, 5, 6};
int tab2[6]={23, 20, 900, 4, 5, 26};
int *ptint1;
int *tab3=(int *)calloc(6,sizeof(int));
for (int p=0 ; p<=6 ; ++p) tab3[p]=p*3;
return ;
}
Validez les instructions ou affirmations correctes et celles incorrectes avec justifications a l'appuie :
- ptint=tab1;
- ptint=&tab1;
- ptint=&tab1[0];
- ptint1=tab3;
- ptint1=&tab3;
- tab1, tab2 et tab3 sont des tableaux de 6 entiers.
- ++tab1;
- ++tab3;
Exercice 02 : 04pts
Exercice 03 : 03pts
Ecrire un programme C qui lit un entier puis détermine s'il est premier ou non. On rappelle qu'un entier est dit premier s'il a exactement deux diviseurs différents; 1 et lui-même.
Ex: 2, 3, 7, 17, 101 sont tous premiers, et 4, 10, 27 ne le sont pas.
Exercice 04 : 05pt
Soit un fichier nommé « c:\fichier.data » de données structuré en suite de lignes contenant
chacune un nom de personne, un nom d’article, un nombre, et un prix. Exemple :
Nkenfack Bob 17 1000
Salhi Alice 30 567
Ecrire un programme C qui permet de lire le fichier ligne par ligne et affiche sur l’écran le contenu de chaque ligne.
Correction :
Exercice 01 :
1) Valide , ptint=tab1;
Nous savons que le nom d'un tableau donne accès à l'adresse de la zone occupée par le tableau. Cette instruction est donc correcte.
2) inValide, ptint=&tab1;
tab1 est un tableau de taille fixe, réservé au moment de la compilation. L'utilisation du nom donne accès à l'adresse de la zone réservée. Demander l'adresse de cette adresse par l'emploi de l'opérateur n'a pas de sens, car cette valeur est une constante adresse.
L'utilisation de l'opérateur & n'a pas de signification. Dans ce cas, le compilateur gcc signale cette utilisation inadéquate et l'ignore. C'est pourquoi une telle instruction ne provoque pas l'arrêt de la compilation.
3)valide, ptint=&tab1[0];
Cette instruction permet d'affecter à ptint l'adresse du 1er élément du tableau.
Elle est équivalent à ptint=&tab1
.
4) valide, ptint1=tab3;
Affectation simple entre 2 pointeurs de même type.
5) invalide, ptint1=&tab3;
tab3 est un pointeur sur un entier. &tab3 est donc l'adresse d'un tableau d'entiers. Le type de cette donnée est int **. Les types des opérandes de l'affectation sont différents et aucune conversion implicite n'est possible. C'est une erreur !
6) tab1, tab2 et tab3 sont des tableaux de 6 entiers.
Valide, tab1 et tab2 sont des tableaux et, à ce titre, leurs adresses sont des constantes. tab3 est un pointeur sur un entier qui peut être modifié. Il existe une conversion implicite entre pointeur et tableau permettant d'utiliser l'opérateur [ ] sur un pointeur.
7)++tab1;
non valide, tab1 est un tableau. Le nom peut être utilisé pour l'application de l'opérateur [ ] ou dans une expression adresse. Une expression ne peut être incrémentée.
8) valide, ++tab3;
tab3 est une variable pointeur qui peut être incrémentée.
Exercice 02 :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char s[100];
int i,j,ok;
printf("Donnez une chaine de caracteres:\n");
scanf("%s",s);
ok=1;
for(i=0,j=strlen(s)-1;i<j;i++,j--)
{
if(s[i]!=s[j])
{
ok=0;
break;
}
}
if(ok==1) printf("%s est palindrome.\n",s);
else printf("%s n'est pas palindrome.\n",s);
system("pause");
return 0;
}
Exercice 03 :
#include<stdio.h>
#include<stdlib.h>
int main()
{
int p,i,pr;
printf("Donnez un entier:\n"); scanf("%d",&p); if(p==0 || p==1) printf("%d n'est pas premier.\n",p); else { pr=1; for(i=2;i<p;i++) { if(p%i==0) {pr=0; break; } } if(pr==1) printf("%d est premier.\n",p); else printf("%d n'est pas premier.\n",p); } system("pause"); return 0; } |
Exercice 04 :
#include <stdio.h>
Void main()
{
FILE * Fcommandes ; char cNom [80] ; char cArticle [80] ; int iNombre, iPrix ;
Fcommandes = fopen ( ̋fichier.data ̋, ̋r ̋ ) ;
if (Fcommandes==Null)
printf( ̋ Impossible d’ouvrir le fichier ̋) ;
else{
while (fscanf(Fcommandes, ̋ %s%s%d%d ̋, cNom, cArticle, &iNombre, &iPrix) !=EOF)
printf ( ̋ %s%s%d%d\n ̋, cNom, cArticle, iNombre, iPrix) ;
}
fclose (Fcommandes) ;
}
Ajouter un commentaire