• Aucun résultat trouvé

Informatique et Programmation Examen N°2 5 juin 2007 18h30-20h30

N/A
N/A
Protected

Academic year: 2022

Partager "Informatique et Programmation Examen N°2 5 juin 2007 18h30-20h30"

Copied!
6
0
0

Texte intégral

(1)

Informatique et Programmation Examen N°2

5 juin 2007 18h30-20h30

Nom : Prénom :

Nom de la machine : Répertoire de travail : Remarques :

Exercice 1 :

Analyser le programme personne.c fourni en annexe.

1) Quelle est la taille du fichier personne.dat ? Justifiez votre réponse en décrivant la structure du fichier (nom, taille et valeur des champs).

2) Quelle est la taille du type de données "Personne" ?

3) Comment faudrait-il modifier le programme pour que le fichier personne.dat soit en mode texte ?

4) Quelle serait la taille du nouveau fichier ?

Exercice 2 :

Ecrire un programme numligne.c qui affiche le contenu d'un fichier texte en numérotant les lignes. L'affichage devra s'effectuer à l'écran ou dans un fichier de sortie si l'utilisateur le souhaite. Les paramètres (noms des fichiers d'entrée et de sortie) pourront être passés en arguments sur la ligne de commande.

Exercice 3 :

Ecrire un programme cmots.c qui compte les mots contenus dans un fichier et affiche le résultat. De manière à vérifier le bon fonctionnement du programme, on pourra afficher les mots comptabilisés.

(2)

Annexe

1 /*************************************

2 * Programme personne.c * 3 *************************************/

4

5 #include <stdio.h>

6

7 typedef struct {

8 char nom[20],prenom[20];

9 char age;

10 } Personne;

11

12 int main() 13 {

14 FILE *f;

15 Personne p,p2;

16

17 sprintf(p.nom,"Martin");

18 sprintf(p.prenom,"Jean");

19 p.age=0x14;

20

21 // Ecriture

22 f=fopen("personne.dat","wb");

23 fwrite(&p,sizeof(Personne),1,f);

24 fclose(f);

25 26

27 // Verification

28 f=fopen("personne.dat","rb");

29 fread(&p2,sizeof(Personne),1,f);

30 fclose(f);

31 printf("Nom : %s\n",p2.nom);

32 printf("Prenom : %s\n",p2.prenom);

33 printf("Age : %d\n",p2.age);

34 return 0;

35 }

(3)

Correction

Exercice 1 :

1) Le fichier personne.dat contient 41 octets :

nom : 20 octets prenom : 20 octets

age : 1 octet nom : Martin\0xxxxxxxxxxxxx (x signifie "indéfini")

prenom : Jean\0xxxxxxxxxxxxxxx age : 20

2) La taille (donnée par sizeof()) du type de données Persone est 41 octets.

3) Il faudrait ouvrir le fichier en mode "wt" (ou "w") puis en mode "rt" (ou "r") et utiliser des printf() et scanf() pour écrire et lire :

1 /*************************************

2 * Programme personne.c * 3 *************************************/

4

5 #include <stdio.h>

6

7 typedef struct {

8 char nom[20],prenom[20];

9 char age;

10 } Personne;

11

12 int main() 13 {

14 FILE *f;

15 Personne p,p2;

16

17 sprintf(p.nom,"Martin");

18 sprintf(p.prenom,"Jean");

19 p.age=0x14;

20

21 // Ecriture

22 f=fopen("personne.dat","wt");

23 fprintf(f,"%s %s %c",p.nom,p.prenom,p.age);

24 fclose(f);

25

26 // Verification

27 f=fopen("personne.dat","rt");

28 fscanf(f,"%s %s %c",p2.nom,p2.prenom,&p2.age);

29 fclose(f);

30 printf("Nom : %s\n",p2.nom);

31 printf("Prenom : %s\n",p2.prenom);

32 printf("Age : %d\n",p2.age);

33 return 0;

34 }

4) La taille serait de 6+1 pour le nom et son espace, 4+1 pour le prenom et son espace et 1

(4)

Exercice 2 :

1 /*************************************

2 Programme numligne.c

3 *************************************/

4

5 #include <stdio.h>

6 #define LLIGNE 200 7

8 int main(int argc, char **argv) { 9 FILE *in=NULL,*out=stdout;

10 char ligne[LLIGNE];

11 int n;

12 if(argc<2) {

13 printf("usage : %s fichier_entree [fichier_sortie]\n", 14 argv[0]);

15 goto fin;

16 }

17 if((in=fopen(argv[1],"r"))==NULL) {

18 printf("erreur : Impossible d'ouvrir le fichier d'entree "

19 "\"%s\"\n",argv[1]);

20 goto fin;

21 }

22 if(argc>2 && (out=fopen(argv[2],"w"))==NULL) {

23 printf("erreur : Impossible d'ouvrir le fichier de sortie "

24 "\"%s\"\n",argv[2]);

25 goto fin;

26 }

27 for(n=1; fgets(ligne,LLIGNE,in)!=NULL; ++n) { 28 if(fprintf(out,"%3d %s",n,ligne)==0) {

29 printf("erreur : Impossible d'ecrire la ligne %d dans "

30 "fichier de sortie\n",n);

31 goto fin;

32 } 33 } 34 35 fin:

36 if(in) fclose(in);

37 if(out && out!=stdout ) fclose(out);

38 return 0;

39 }

(5)

Exercice 3 :

Version simple basée sur scanf()

1 /*************************************

2 Programme cmots1.c

3 *************************************/

4

5 #include <stdio.h>

6 #define LLIGNE 200 7

8 int main(int argc, char **argv) { 9 FILE *in=NULL,*out=stdout;

10 char ligne[LLIGNE];

11 int n;

12

13 if(argc<2) {

14 printf("usage : %s fichier_entree\n",argv[0]);

15 goto fin;

16 }

17 if((in=fopen(argv[1],"r"))==NULL) {

18 printf("erreur : Impossible d'ouvrir le fichier d'entree "

19 "\"%s\"\n",argv[1]);

20 goto fin;

21 }

22 for(n=1; fscanf(in,"%s",ligne)==1; ++n) { 23 printf("%3d %s\n",n,ligne);

24 }

25 printf("\"%s\" contient %d mots\n",argv[1],n);

26 27 fin:

28 if(in) fclose(in);

29 if(out && out!=stdout ) fclose(out);

30 return 0;

31 }

Version plus élaborée

1 /*************************************

2 Programme cmots.c

3 *************************************/

4

5 #include <stdio.h>

6 #include <stdlib.h>

7 #include <string.h>

8 #include <ctype.h>

9

10 #define LMOT 100

11 int main(int argc, char **argv) 12 {

13 FILE *in=NULL,*out=NULL;

14 char c,mot[LMOT];

15 int n,dmot,ok;

16 if(argc<2) {

(6)

17 printf("usage : %s fichier_entree\n",argv[0]);

18 goto fin;

19 }

20 if((in=fopen(argv[1],"r"))==NULL) {

21 printf("erreur : Impossible d'ouvrir le fichier d'entree "

22 "\"%s\"\n",argv[1]);

23 goto fin;

24 }

25 if(argc>2 && (out=fopen(argv[2],"w"))==NULL) {

26 printf("erreur : Impossible d'ouvrir le fichier de sortie "

27 "\"%s\"\n",argv[2]);

28 goto fin;

29 }

30 printf("out %s %p\n",argv[2],out);

31

32 n=0;

33 dmot=0;

34 while((c=fgetc(in))!=EOF) {

35 ok=(tolower(c)>='a' && tolower(c)<='z');

36 if(!dmot) { 37 if(ok) {

38 mot[dmot]=c;

39 dmot++;

40 } 41 } else { 42 if(!ok) { 43 ++n;

44 if(dmot<LMOT) mot[dmot]='\0';

45 printf("%d %s\n",n,mot);

46 dmot=0;

47 } else {

48 if(dmot<LMOT) mot[dmot]=c;

49 dmot++;

50 } 51 } 52 }

53 mot[LMOT-1]='\0';

54 printf("\"%s\" contient %d mots\n",argv[1],n);

55 56 fin:

57 if(in) fclose(in);

58 if(out) fclose(out);

59 return 0;

60 }

Références

Documents relatifs

Ecrire un programme conv.c qui convertit un fichier texte nommé &#34;saisie.txt&#34; contenant des nombres réels (comme celui créé lors de l'exercice 1), en un

Reprendre le programme de l'exercice 1 et fixer N à 5 puis traiter le cas où le nombre de caractères est trop important pour la taille du tableau en avertissant l'utilisateur et

Reprendre le programme de l'exercice 2 et trier dans l’ordre croissant les valeurs contenues dans le tableau à l’aide d’une fonction tri(…) qu’on définira. On vérifiera

Ecrivez un programme qui accepte une chaîne de caractères minuscules (255 caractères maximum) en entrée et qui affiche la même chaîne avec tous ses caractères en majuscule..

Ecrire un programme qui permet de saisir une ligne de caractères (suite de caractères terminé par le caractère '\n') et de la mémoriser dans un tableau (de caractères) comme une

La fonction devra renvoyer 1 dans le cas où les deux chaines (s1 et s2) sont identiques (même longueur et même contenu) et 0 sinon. Ecrire un petit programme permettant de tester

Modifier la fonction de l’exercice précédent pour obtenir une fonction recevant un pointeur s à la place du tableau tab (adresse de la case 0 d’un tableau) et retournant

Écrivez un programme qui demande deux nombres réels et qui calcule puis affiche le résultat de leur division entière ainsi que son reste.. Pour cela, on commence par constituer un