Vous êtes sur la page 1sur 11

TD 4 LES STRUCTURE S

Solution exercice 1

Ecrire un programme C qui lit un ensemble de personnes avec leurs âges,


dans un tableau de structures, et supprime ensuite toutes celles qui sont
âgées de vingt ans et plus.

On va définir pour cet exercice la structure personne qui a deux éléments:


une chaîne de caractères pour contenir les noms, et un entier pour les âges
des personnes. Et pour ne pas avoir à réécrire, lors de la déclaration des
variables, le type struct personne, on va lui donner un nom moins long et
plus élégant. Et ceci en se servant du mot clé typedef (ligne 4) et en
mentionnant le nouveau nom avant le point-virgule de la fin de la définition
de la structure (ligne 7). Personne peut donc remplacer sans aucun problème
le type struct personne.
Maintenant, on va lire les données qui seront entrées par l’utilisateur, dans
un tableau t déclaré de type Personne, à l’aide d’une boucle for. A l’intérieur
de cette boucle on lit les noms avec la fonction gets, puisque c’est le nom
complet qui sera entré et qui contiendra nécessairement un espace, et cette
dernière doit être précédée par un getchar car elle vient après la
fonction scanf lors de l’exécution du programme.
Pour la suppression des cases qui représentent des personnes dont l’âge est
supérieur ou égale à vingt ans, on parcourra le tableau pour trouver ce type
de cases. Lorsque on en trouve une dans un indice i, on la supprime en
décalant les cases qui ont un indice entre i+1 et n-1 (les deux compris) d’un
pas vers les indices inférieurs et on doit commencer obligatoirement par la
case i+1 et terminer à n-1 (lignes 30-34).
Pour décaler une case, on déplacera le nom qui est une chaîne de caractères
avec la fonction strcpy, et l’élément âge avec une simple opération
d’affectation.
Après chaque opération de suppression, on se retrouve avec un élément de
moins, donc, on doit décrémenter la taille du tableau par 1 (ligne 35). De
plus, le nouvel élément qui occupe la case i doit être aussi traité. Donc, il
faudra revenir dans la prochaine itération à la même case. Pour assurer cela,
il suffira de décrémenter le i après chaque opération de suppression (ligne
36).
Finalement, on réaffiche le tableau pour visualiser le résultat.
Solution exercice 1

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct personne{
char nom[20];
int age;
}Personne;
int main()
{
Personne t[100];
int n,i,j;
printf("Donnez le nombre de personnes a lire:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
getchar();
printf("Entrez le nom complet de la personne N%d:\t",i+1);
gets(t[i].nom);
printf("Entrez son age:\t");
scanf("%d",&t[i].age);
}
printf("\nLe tabeau avant la suppression:\n");
for(i=0;i<n;i++)
printf("L'age de %s est: %d ans.\n",t[i].nom,t[i].age);

for(i=0;i<n;i++)
{
if(t[i].age>=20)
{
for(j=i+1;j<n;j++)
{
strcpy(t[j-1].nom, t[j].nom);
t[j-1].age = t[j].age;
}
n--;
i--;
}
}
printf("\nLe tabeau apres la suppression:\n");
for(i=0;i<n;i++)
printf("L'age de %s est: %d ans.\n",t[i].nom,t[i].age);
system("pause");
return 0;
}

Enoncé exercice 2

Ecrire un programme C qui lit un instant donné, sous forme d’heures et de


minutes vers une variable de structures, puis affiche cet instant sous la
forme hh:mm (ex : 02:37). La structure à utiliser est composée de deux
éléments entiers h pour les heures et m pour les minutes.

Correction exercice 2

On va commencer le programme par la définition de la structure demandée


et qu’on va l’appeler temps. Cette structure se composera de deux
entiers h et m pour contenir respectivement les heures et les minutes (lignes
3-6).

Dans la fonction main, on va déclarer la variable inst de type struct


temps pour y stocker l’instant que va entrer l’utilisateur (ligne 9). Puis, on
va demander à ce dernier d’entrer les heures et qu’on va lire juste après vers
la composante h de la variable inst, à savoir inst.h (lignes 10-11). De même
pour les minutes, qui seront lises vers inst.m (lignes 12-13).

Maintenant, il suffira d’afficher les heures et les minutes séparées par deux
points. Seulement, on souhaite respecter le format demandé et qui préconise
d’afficher un zéro avant les heures ou les minutes si elles sont composées
juste d’un seul chiffre. Pour exécuter ceci, il faut effectuer un test sur la
valeur des heures et les minutes pour les comparer avec 10 et de les afficher
précédées d’un zéro si elles lui sont inférieures et de les afficher directement
comme elles sont, dans le cas contraire (lignes 14-21).
Solution exercice 2

#include<stdio.h>
#include<stdlib.h>
struct temps{
typedef struct {
int h; int h;
int m;
int m;
}temps;
};
int main()
{
struct temps inst; temps inst;

printf("Donnez l'heure:\n");
scanf("%d",&inst.h);
printf("Donnez les minutes:\n");
scanf("%d",&inst.m);
if(inst.h<10)
printf("0%d:",inst.h);
else
printf("%d:",inst.h);
if(inst.m<10)
printf("0%d\n",inst.m);
else
printf("%d\n",inst.m);
system("pause");
return 0;
}

Enoncé exercice 3

Ecrire un programme C qui lit un ensemble de cercles définis par les


coordonnées de leurs centres et leurs rayons. Puis lit les coordonnées d’un
point et affiche ensuite tous les cercles contenant ce point.

Correction exercice 3

Pour ce programme, on va commencer par la définition des deux structures.


La première appelée cercle contient trois éléments x, y et r pour contenir les
données d’un cercle (lignes 4-8). La deuxième structure
appelée point contient deux éléments réels x et y pour représenter un point
(lignes 9-12).
Une fois les structures dont on aura besoin sont définies, en passera à la
fonction main pour déclarer un tableau de structures c se basant sur la
structure cercle pour contenir les différents cercles que va entrer l’utilisateur
(ligne 15). Puis on va déclarer une variable de type struct point pour
contenir les coordonnées du point (ligne 16).Par la suite, on va demander à
l’utilisateur d’entrer le nombre de cercles qu’il souhaite entrer. Il sera lu vers
la variable n. Puis on va utiliser une boucle for de compteur i, d’un nombre
d’itérations égal à n, pour lire les cercles (lignes 21-28).Pour lire un cercle,
il suffira de demander à l’utilisateur d’entrer les coordonnées du centre et le
rayon, et de lire les trois vers les variables c[i].x, c[i].y et c[i].r (lignes 24-
27). Une fois les données des cercles lus, on lira les coordonnées du point
vers les deux variables p.x et p.y (lignes 29-30).Maintenant qu’on a toutes
les données, on va passer à la recherche de tous les cercles contenant le
point p. Pour ce faire, il suffira de parcourir le tableau c, et pour chaque
cercle c[i] vérifier si le point p se trouve dedans ou pas.Le point p se
trouvera à l’intérieur d’un cercle c[i] si la distance entre le point p et le
centre de ce cercle est inférieure au rayon de ce dernier.La distance entre
deux points dans le plan A(xA,yA) et B(xB,yB) est :

Pour calculer la racine, on va utiliser la fonction sqrt définie dans la


bibliothèque math.h. Et pour calculer les carrés, on va exploiter la
fonction pow définie elle aussi dans la même bibliothèque (ligne 33).Si la
condition précitée est vérifiée, on va afficher le cercle en question (lignes
34-35).

Solution exercice 3

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct cercle{
float x;
float y;
float r;
};
struct point{
float x;
float y;
};
int main()
{
struct cercle c[100];
struct point p;
int n,i;
float dist;
printf("Donner le nombre de cercles: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Cercle N: %d\n",i+1);
printf("Donner les coordonees du centre:\n");
scanf("%f%f",&c[i].x,&c[i].y);
printf("Entrer le rayon du cercle:\n");
scanf("%f",&c[i].r);
}
printf("Entrer les coordonees d'un point:\n");
scanf("%f%f",&p.x,&p.y);
for(i=0;i<n;i++)
{
dist=sqrt(pow(c[i].x-p.x,2)+pow(c[i].y-p.y,2));
if(dist<=c[i].r)
printf("Le cercle de cente (%.2f,%.2f) et de rayon %.2f
contient le point (%.2f,%.2f)\n",c[i].x,c[i].y,c[i].r,p.x,p.y);
}
system("pause");

return 0;
}

Enoncé exercice 4
Ecrire un programme C qui crée un structure couple contenant deux entiers
représentant l’âge de la femme et celui de l’homme. Puis l’utilise pour créer
un tableau de structures où il stocke une liste des âges des couples. Ensuite
affiche le pourcentage de couples où la femme est plus âgée que l’homme.

Correction exercice 4

La première chose à faire sera la définition de la structure couple qui sera


composée des deux entiers f et h qui représentent respectivement l’âge de la
femme puis celui de l’homme (lignes 3-6). Une fois faite, on va passer à la
déclaration d’un tableau de structures c de type struct couple au sein de la
fonction principale main (ligne 9).

Le tableau de structure maintenant prêt, on va demander à l’utilisateur de


saisir le nombre de couples à traiter. Et on va lire cette valeur vers la
variable entière n (lignes 11-12). Ensuite, on va utiliser une boucle for de
compteur i pour lire à chaque itération l’âge de la femme et puis celui de
l’homme, constituant le couple en mains, vers les deux variables composant
la case i du tableau c à savoir c[i].f et c[i].h (lignes 13-20).
Une fois le tableau rempli, on va le parcourir à l’aide d’une autre
boucle for pour compter le nombre de couples où l’âge de la femme est
strictement supérieur à celui de l’homme. On va utiliser pour ça, la
variable k initialisée à la déclaration par 0. Cette variable sera incrémentée
par 1 chaque fois que la condition de la structure de contrôle if sera vraie
(lignes 21-22).
Après cette dernière boucle, on va utiliser la fonction printf pour afficher le
pourcentage recherché. Ce pourcentage sera calculé à partir des valeurs des
variables k et n. Il suffira de multiplier k par 100 puis diviser le produit
par n. Seulement, il faudra faire attention, car les deux variables k et n sont
des variables entières. Donc la division sera considérée par le compilateur
comme une division entière. Pour éviter ce problème, on peut au lieu de
multiplier k par 100, la multiplier par 100.0 qui est un nombre réel dans le
langage C. Comme ça, ce produit aura une valeur réelle et du coup la
division sera une division réelle (ligne 23).
Solution exercice 4

#include<stdio.h>
#include<stdlib.h>
struct couple{
int f;
int h;
};
int main()
{
struct couple c[100];
int i,n,k=0;
printf("Donnez le nombre de couples:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Couple #%d:\n",i+1);
printf("Donner l'age de la femme: ");
scanf("%d",&c[i].f);
printf("Donner l'age de l'homme: ");
scanf("%d",&c[i].h);
}
for(i=0;i<n;i++)
if(c[i].f>c[i].h) k++;
printf("La femme est plus agee dans %.2f%% des
couples\n",k*100.0/n);
system("pause");
return 0;
}

Enoncé exercice 5

Ecrire un programme C qui définit une structure personne contenant le nom


et le prénom d’une personne. Puis définit une autre structure
appelée couple contenant deux éléments h et f de type struct personne,
représentant un homme et une femme constituant un couple. Lire ensuite
une liste de couples puis mettre la première lettre de tous les noms et
prénoms en majuscule. Et afficher pour chaque couple la phrase suivante :

Mr prénom nom est le mari de Mme prénom nom

Correction exercice 5

Dans le même ordre que l’énoncé, on va commencer le programme par la


définition de la structure personne. Cette structure aura deux
éléments nom et prenom qui sont tous les deux des chaînes de caractères
(lignes 3-6). Juste après, on va définir la deuxième structure couple en se
basant sur celle déjà définie. Cette structure qui sera appelée couple a
comme objectif de permettre de stocker le nom et le prénom d’un homme et
d’une femme qui constituent un couple. Elle aura donc deux
éléments h et f de type struct personne. Chacun de ces deux éléments est
capable donc d’abriter le nom et le prénom d’une personne (lignes 7-10).

Pour lire une liste de noms de couples, on aura besoin de déclarer un tableau
de structures qui est dans ce cas le tableau c de type struct couple (ligne 13).
On exploitera ensuite une boucle for pour lire ces noms, en demandant à
chaque fois à l’utilisateur d’entrer quatre chaînes de caractères représentant
les deux prénoms et les deux noms (lignes 18-29). Pour réussir cette tâche, il
suffira de comprendre l’anatomie d’une case i du tableau.

La case c[i] est une case du tableau c qui est une variable de type struct
couple. Elle se compose donc de deux éléments c[i].h et c[i].f qui sont à
leurs tours des variables de structures de type struct personne. Elles
contiendront chacune deux chaînes de caractères qui
sont c[i].h.nom et c[i].h.prenom pour la première,
puis c[i].f.nom et c[i].f.prenom pour la deuxième. Les choses sont
maintenant simples, il suffira de lire ces quatre éléments en tant que des
chaînes de caractères.

Pour mettre en majuscule la première lettre de chaque nom ou prénom, on


va utiliser une boucle for pour parcourir le tableau c. Et pour chaque case,
on va vérifier pour chaque nom et prénom qu’elle contient, si la première
lettre est une minuscule. Et si c’était le cas, on va la convertir en majuscule
(lignes 30-44). Pour accéder à la première lettre, il suffira de prendre les
quatre chaînes de
caractères c[i].h.nom, c[i].h.prenom, c[i].f.nom et c[i].f.prenom et d’ajouter
l’indice de la première case entre deux crochets, comme en faisait
ordinairement pour les chaînes de caractères. Ceci dit, les premières lettres
concernées
sont c[i].h.nom[0], c[i].h.prenom[0], c[i].f.nom[0] et c[i].f.prenom[0].

Pour terminer le programme, on va parcourir le tableau c une dernière fois,


et afficher la phrase demandée (lignes 45-46).

Solution exercice 5

#include<stdio.h>
#include<stdlib.h>
struct personne{
char nom[20];
char prenom[20];
};
struct couple{
struct personne h;
struct personne f;
};
int main()
{
struct couple c[100];
int i,n;
char cc;
printf("Donnez le nombre des couples:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Couple N%d:\n",i+1);
printf(" - Donnez le nom de l'homme: ");
scanf("%s",c[i].h.nom);
printf(" - Donnez le prenom de l'homme: ");
scanf("%s",c[i].h.prenom);
printf(" - Donnez le nom de la femme: ");
scanf("%s",c[i].f.nom);
printf(" - Donnez le prenom de la femme: ");
scanf("%s",c[i].f.prenom);
}
for(i=0;i<n;i++)
{
cc=c[i].h.nom[0];
if(cc>='a' && cc<='z')
c[i].h.nom[0]='A'+cc-'a';
cc=c[i].h.prenom[0];
if(cc>='a' && cc<='z')
c[i].h.prenom[0]='A'+cc-'a';

cc=c[i].f.nom[0];
if(cc>='a' && cc<='z')
c[i].f.nom[0]='A'+cc-'a';
cc=c[i].f.prenom[0];
if(cc>='a' && cc<='z')
c[i].f.prenom[0]='A'+cc-'a';
}
for(i=0;i<n;i++)
printf("Mr %s %s est le mari de Mme %s
%s\n",c[i].h.prenom,c[i].h.nom,c[i].f.prenom,c[i].f.nom);
system("pause");
return 0;}

Vous aimerez peut-être aussi