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