Faites-moi mon agenda en C

Fermé
julien - 6 mai 2002 à 16:47
 julien - 26 mai 2002 à 17:28
jé un devoir d'informatique a faire pour dans 3 semaines mais je n'y comprends rien !qq'un oré t il déja fé ou soré fér ce devoir ! merci d'avance

On désire écrire un programme permettant la gestion d'un agenda. Pour cela, on va créer une liste chaînée, dans laquelle chaque cellule, de type struct fiche, contiendra les informations concernant une personne. On utilisera par conséquent les directives d'inclusion et les définitions suivantes :

#include <stdio.h>
#include <stdlib.h>
#define N 40
#define T 10
struct personne
{

char nom[N+1];

char tel[T+1];
};
struct fiche
{

struct personne p;

struct fiche *p_suivant;
};
La principale difficulté de cet exercice sera l'allocation dynamique de mémoire (cf. la séance 5 de travaux dirigés) pour toute nouvelle cellule de la liste chaînée. Il est demandé de n'utiliser aucune variable globale. On propose de procéder de la manière suivante :

1) Dans le programme principal main, on effectue la déclaration et l'initialisation suivantes :

struct fiche *p_liste=NULL;

Cette variable, qui pointera sur le premier élément de la liste chaînée, sera passée en paramètre aux différentes fonctions, soit par valeur, soit par adresse (auquel cas un des paramètres formels sera de type struct fiche **).

2) Dans le programme principal, on affiche le menu suivant en boucle :

Vous pouvez :


1 - Ajouter une personne.

2 - Afficher le contenu de l'agenda.

0 - Quitter l'application.

Votre choix :
jusqu'à ce que l'utilisateur tape le caractère 0. On gérera les différentes réponses possibles à l'aide d'une instruction d'aiguillage à choix multiple (mot-clé switch, cf. le paragraphe 2).

3) Ecrire les fonctions suivantes :

ajouter, d'en-tête :
void ajouter(struct fiche **pp_liste)

Cette fonction permet la saisie du nom (40 caractères maximum) et du numéro de téléphone (10 chiffres) d'une personne. Il ne faut pas oublier de faire l'allocation dynamique d'une zone mémoire de taille sizeof(struct fiche), et de stocker l'adresse de cette zone mémoire dans une variable locale, de nom p_nouv.

L'ajout d'une nouvelle personne dans l'agenda se fera selon l'algorithme suivant :

Copier la valeur de *pp_liste dans le champ p_suivant de la cellule pointée par p_nouv.
Copier la valeur de p_nouv dans *pp_liste.
afficher, d'en-tête :
void afficher(struct fiche *p_liste)

Cette fonction affiche à l'écran l'ensemble des personnes inscrites dans l'agenda, en indiquant le nom et le numéro de téléphone d'une personne par ligne.

quitter, d'en-tête :
void quitter(struct fiche **pp_liste)

Cette fonction libère la totalité de l'espace mémoire qui a été alloué dynamiquement pour la création de la liste chaînée. On conseille de commencer par libérer la première cellule de la liste chaînée, et ainsi de suite.

Attention :
Pour écrire cette fonction, on doit appeler la fonction free autant de fois qu'il y a de personnes dans l'agenda. Il ne suffit pas de libérer l'espace mémoire pointé par *pp_liste !

Contrôle des allocations dynamiques :
Dans le but de contrôler si la gestion des allocations dynamiques a été correctement effectuée, on demande de rajouter à ce programme :
La déclaration des deux variables globales suivantes :
int cpt_malloc=0,cpt_free=0;
Une incrémentation de la variable globale cpt_malloc après chaque appel à la fonction malloc, et une incrémentation de la variable globale cpt_free après chaque appel à la fonction free
La séquence suivante, à la fin de la fonction main :
if (cpt_free==cpt_malloc)
{

printf("Mémoire correctement gérée :\n");

printf("%d allocations dynamiques.\n",cpt_malloc);

return(0);
}
else
{

printf("Mauvaise gestion des allocations dynamiques !\n");

return(1);
}
Questions subsidiaires :
Ecrire la fonction compa, d'en-tête :
int compa(char *s,char *t)

Cette fonction permet de comparer deux chaînes de caractères passées en paramètres.

Ecrire la fonction retirer, d'en-tête :
void retirer(struct fiche **pp_liste)

Cette fonction permet de retirer une personne de l'agenda, dans le cas bien sûr où elle s'y trouve. Le nom de cette personne doit être demandé à l'utilisateur à l'intérieur de la fonction. L'espace mémoire occupé par cette personne doit être libéré.

Ecrire la fonction trier, d'en-tête :
void trier(struct fiche **pp_liste)

Cette fonction modifie le chaînage, de telle sorte que les personnes soient "chaînées" par ordre alphabétique.

Modifier la fonction ajouter, de manière à vérifier que la personne rajoutée dans l'agenda n'y figure pas déjà.
Modifier le programme principal, de manière à l'adapter à ces nouvelles fonctions.
A voir également:

3 réponses

Cluergue manuel
6 mai 2002 à 18:03
tu serais pas en deust toi
c M.clergue c pas bien tauras un 00.
0
non je suis en école d'éléctronique et l'info n'est vraiment po mon truc!alors si tu connais qq'un qui maitrise ou que toi méme tu te débrouille tu serais fort aimable de m'aider!
0
conio > julien
22 mai 2002 à 09:00
Moi, je suis en dut info à montreuil et moi aussi je dois rendre un agenda en C mais le mien est 10 fois plus dur à réaliser que le tien.
0
ok, avant tout, il faut bien comprendre le principe des listes chainées.

Tu as deux structures :

Une qui est composé de deux variables :
-> 1 entier qui contient le nombre d'élements total (de personnes dans ton cas)


-> 1 pointeur vers la premier élément de ta liste (vers la première personne dans ton cas).

Puis une autre structure composé de différents champs. Pour toi, ce sera noms et téléphones.
Et surtout, un pointeur vers un autre élément de la même structure.

----------------------------------

On va dire que t'as ces deux structures :

struct fiche
{

struct personne p;

struct fiche *p_suivant;
};

struct principal
{
fiche *premier;
int nb_elements;
}

Lors d'une insertion, tu as trois cas :

-1-
premier est NULL.
Dans ce cas, c'est tout con, tu cré une nouvelle fiche, et tu fais pointer premier dessus.

-2-
Insertion "classique"
T'as deux pointeurs temporaires, de fiche.

En gros, ca doit donner un truc de ce genre :

pt1 = principal.premier

TANT QUE i < nb_elements ET pt1.nom < nom FAIRE
pt2 <-- pt1
pt1 <-- pt1.suivant
FIN TANT QUE

FICHE *pt3 // la fiche à insérer
(...)
pt2.suivant = pt3;
pt3.suivant = pt2;

-3-
C'est que tu te retrouve à la fin de ta liste.
C'est tout con, il faut juste que le dernier élément pointe sur ton élément.



Dans tout cas cas, il faut aussi incrémenter le nombre de personnes (principal.nb_elements++).

Voilà, aussi juste un mot pour les allocations dynamiques.
Pour allouer dynamiquement, il te faut utiliser malloc.

sa prend en paramètre une taille et sa retourne vers une zone mémoire.
Tu veut faire un malloc pour une fiche.

FICHE *pt_fiche;
ptfiche = malloc ( sizeof(fiche) );
ptfiche -> suivant = XXX // (*ptfiche).suivant = XXX

Puis pour le supprimer :
free(ptfiche).

Voilà, si t'as des questions, hesite pas, je sais pas si j'ai été très clair.
0
FICHE *pt3 // la fiche à insérer
(...)
pt2.suivant = pt3;
pt3.suivant = pt1;
0
merci je commence à comprendre!
0