Devoir Surveillé - Atelier de Programmation Avancée

Page 1 sur 4Lecteur de document UniversityLib

Devoir Surveillé - Atelier de Programmation Avancée

Computer Science · exam

Voir tous les documents en programmation

Université de Carthage

Ecole supérieure de technologie

et d’Informatique

AU 2011/2012

Devoir surveillé

Atelier de programmation avancée

Enseignante : Mme Wiem Yaiche Elleuch

Filière / Classe : LA ARS (1ère année)

Date : 16 mars 2012

Durée : 1h30

Documents : non autorisés

CIN : …………………… Salle : ……………….

Nom : …………………… Prénom : .……………………..

Section : ………….. Groupe : …………….

Signature

RÉPONDRE SUR CETTE FEUILLE

Exercice 1 :

Soient les structures de données suivantes :

struct date

{

int jour;

int mois;

int annee;

};

typedef struct date DATE;

struct employe

{

int cin;

char nom[30];

DATE date_naiss ;

};

typedef struct employe EMPLOYE;

Soit le programme suivant :

Publicité

void main()

{

FILE *fp ;

int n, pos ; long taille;

EMPLOYE *tab ;

printf(« saisir nombre d’employés ») ;

scanf(« %d », &n) ;

tab=allocation(n) ; // ou bien allocation2(&tab,n) ;

remplir_tab(tab,n) ; // remplir le tableau dynamique par des employés

afficher_tab(tab,n) ; // afficher le tableau d’employés

employes_1982 (tab, n) ; // affiche les noms des employés nés en 1982.

ouverture (&fp) ;

remplir_fichier(fp,tab,n) ; // copier le contenu du tableau dynamique dans le fichier

printf (« saisir une position ») ;

scanf (« %d », &pos) ;

modifier (fp,pos) ; // modifier l’employé ayant la position pos dans le fichier ; le 1er employé

// créer et ouvrir un fichier binaire

// possède la position 1.

// ou bien modifier2 (fp, pos) ;

calcul_taille_fichier (fp, &taille) ;

printf(« la taille du fichier en octets est %ld », taille) ;

fclose(fp) ; }

1

Ecrire les fonctions suivantes en préçisant l’en-tête de chaque fonction.

• allocation : permet de créer un tableau dynamique de n employés. La fonction

retourne l’adresse de début de cet espace. (1,5 pts).

EMPLOYE *allocation(int n)

{

EMPLOYE *tab;

tab=(EMPLOYE ) malloc (n sizeof(EMPLOYE));

if (!tab) exit (-1);

return tab;

}

Publicité

• allocation2 : 2ème version de la fonction allocation (1,5 pts).

void allocation2 (EMPLOYE **tab, int n)

{

tab=(EMPLOYE ) malloc (n * sizeof(EMPLOYE));

if (!*tab) exit (-1);

}

• void remplir_un_employe (EMPLOYE *e) : permet de saisir les informations sur un

seul employé. (1,5 pts).

void remplir_un_employe (EMPLOYE *e)

{

printf("saisir cin, nom et date de naissance ");

scanf("%d%s%d%d%d", &e->ce, e->nom, &e->date_naiss.jour,

&e->date_naiss.mois, &e->date_naiss.annee);

}

remplir_tab : permet de remplir le tableau dynamique d’employés. utiliser la

fonction précédente remplir_un_employe. (1,5 pts).

void remplir_tab(ETUDIANT *t,int n)

{

int i;

for(i=0; i<n; i++)

remplir_un_employe(t+i);

}

2

• void afficher_un_employe (EMPLOYE e) : permet d’afficher les informations sur un

employé. (1,5 pts).

void afficher_un_employe (EMPLOYE e)

{

printf("%d%s", e.cin, e.nom);

printf("%d%d%d", e.date_naiss.jour, e.date_naiss.mois, e.date_naiss.annee );

}

• afficher_tab: permet d’afficher le tableau d’employés. (1,5 pts).

void afficher_tab(EMPLOYE *tab, int n)

Publicité

{

int i;

for(i=0; i<n; i++)

afficher_un_employe(*(t+i));

}

• employes_1982 : permet d’afficher les noms des employés nés en 1982. (2 pts).

void employes_1982 (EMPLOYE *tab, int n)

{

int i;

for(i=0; i<n; i++)

if( (tab+i)->date_naiss.annee ==1982)

printf(« %s », (tab+i)->nom) ;

}

• ouverture : permet de créer et d’ouvrir un fichier binaire. Le nom du fichier doit être

saisi par l’utilisateur. (1,5 pts).

void ouverture (FILE **fp)

{

char nf[20];

printf("saisir nom fichier");

gets(nf);

*fp=fopen(nf,"wb+");

}

3

remplir_fichier : permet de copier le contenu du tableau dynamique dans le fichier.

(1,5 pts).

void remplir_fichier (FILE fp, EMPLOYE tab, int n)

{

fwrite (tab, sizeof(EMPLOYE), n, fp) ;

}

• modifier : permet de modifier les informations sur l’étudiant ayant la position pos

dans le fichier. Le 1er a la position pos. Utiliser la fonction remplir_un_employe.

(2,5 pts).

Publicité

void modifier (FILE*fp,int pos)

{

long p ;

EMPLOYE emp ;

fseek(fp, (pos-1) * sizeof(EEMPLOYE), SEEK_SET);

p=ftell(fp);

fread(&emp,sizeof(EMPLOYE),1,fp);

remplir_un_employe(&emp);

fseek(fp, p, SEEK_SET);

fwrite(&emp, sizeof(EMPLOYE), 1,fp);

}

• modifier2 : une deuxième version de modifier. (2,5 pts).

void modifier2 (FILE*fp,int pos)

{

EMPLOYE emp ;

fseek(fp, (pos-1) * sizeof(EEMPLOYE), SEEK_SET);

fread(&emp,sizeof(EMPLOYE),1,fp);

remplir_un_employe(&emp);

fseek(fp, -(long)sizeof(EMPLOYE), SEEK_CUR);

fwrite(&emp, sizeof(EMPLOYE), 1,fp);

}

• calcul_taille_fichier : permet de calculer la taille du fichier en octets. (1 pts).

void calcul_taille_fichier (FILE fp, long taille)

{

Long l ;

fssek (fp, 0, 2) ;

*taille= ftell(fp) ;

}

4