Bonjour,

Voici un projet de première année d'iut informatique. J'ai déjà rendu le projet et j'ai eu une note de 11/20.

Je le poste ici dans le but d'avoir des aides pour améliorer ma façon de programmer et de comprendre mes erreurs.

Merci par avance pour votre aide.
Kiruban


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
	// DUT INFORMATIQUE - Semestre 1 Décalé - Groupe 114 - 2009/2010
// Projet 2 Algorithmique-Programmation
// Le Répertoire Téléphonique
 
#include "stdafx.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // On inclut cette bibliothèque pour utiliser la fonction toupper()
#include <string.h>
#include <conio.h>
 
typedef struct Personne Personne;
typedef struct Ville Ville;
 
typedef char CH10[11];
typedef char CH12[13];
typedef char CH15[16];
 
struct Personne
{
	char* nom; // Nom de la personne
	char* tel; // N° de téléphone
	int dpt; // N° du département
	int indV; // Indice de la ville
};
 
struct Ville
{
	char* nomVille; // Nom de la ville
	int nbOcc; // Nombre d'occurence d'une ville
 
};
 
void main()
{
	system("TITLE REPERTOIRE TELEPHONIQUE - PROJET 2");
 
	/* Prototypes des fonctions */
 
	int INSCRIRE_PERSONNE(Personne *TP[], Ville *TV[], char zlNom[], int nbp, int *nbv);
	int SUPPRIMER(Personne *TP[], Ville *TV[], int nbp, int r);
	void CONSULTER(Personne *TP[], Ville *TV[], int r);
	void VISUALISER(Ville *TV[], int nbv);
	void AFFICHER(Personne *TP[], Ville *TV[], int nbp);
 
	int RECHERCHER_NOM(Personne *TP[], char zlNom[], int nbp);
	int RECHERCHER_VILLE(Ville *TV[], char zlVille[], int nbv);
 
	void QUITTER(Personne *TP[], Ville *TV[], int nbp, int nbv);
	void PAUSE();
 
	/* Tableaux de pointeurs de structure fixe */
	Personne *TP[50];
	Ville *TV[50];
 
	int nbp=0; // nombre de Personne répertorié
	int nbv=0; // nombre de Ville répertorié
 
    int r; // variables résultats de fonctions
 
	// Zone de Lecture
	CH10 zlNom;
 
	char code;
 
	do
	{
		system("cls");
		printf("\n");
		printf("        +-------------------------------------------+\n");
		printf("        |      MENU DU REPERTOIRE TELEPHONIQUE      |\n");
		printf("        +-------------------------------------------+\n");
		printf("        | I pour INSCRIRE une personne              |\n");
		printf("        | S pour SUPPRIMER une personne             |\n");
		printf("        | C pour CONSULTER une personne             |\n");
		printf("        | V pour VISUALISER les villes referencees  |\n");
		printf("        | A pour AFFICHER le repertoire             |\n");
		printf("        | Q pour QUITTER le programme               |\n");
		printf("        +-------------------------------------------+\n");
		printf("\n        Entrez un code : ");
		code = toupper(getchar());
		fflush(stdin);
		system("cls");
		printf("\n\n");
		switch(code)
		{
		case 'I':
			printf("	Veuillez saisir le nom: ");
			gets(zlNom);
			r = RECHERCHER_NOM(TP,zlNom,nbp);
			if(r==-1)
				nbp = INSCRIRE_PERSONNE(TP,TV,zlNom,nbp,&nbv);
			else
				printf("\n	NOM DEJA ENREGISTRE");
			break;
		case 'S':
			printf("	Entrez le nom a supprimer : ");
			gets(zlNom);
			r = RECHERCHER_NOM(TP,zlNom,nbp);
			if(r==-1)
				printf("\n	NOM INCONNU");
			else
				nbp = SUPPRIMER(TP,TV,nbp,r);
			break;
		case 'C':
			printf("	Entrez le nom a chercher : ");
			gets(zlNom);
			r = RECHERCHER_NOM(TP,zlNom,nbp);
			if (r==-1)
				printf("\n	NOM INCONNU");
			else
				CONSULTER(TP,TV,r);
			break;
		case 'V':
			if(nbv>0)
				VISUALISER(TV,nbv);
			else
				printf("\n	REPERTOIRE VIDE");
			break;
		case 'A':
			if(nbp > 0)
				AFFICHER(TP,TV,nbp);
			else
				printf("\n	REPERTOIRE VIDE");
			break;
		case 'Q':
			QUITTER(TP,TV,nbp,nbv);
			break;
		default:
			printf("\n	Code Introuvable!");
		}
 
		PAUSE(); // On appelle une fonction Pause() qui permet de revenir au menu en appuyant sur une touche quelconque du clavier.
 
	} while (1); // J'utilise ici une boucle infini, ça me permet d'afficher le menu une fois qu'une tâche a été réalisé.
 
}
 
int INSCRIRE_PERSONNE(Personne *TP[], Ville *TV[], char zlNom[], int nbp, int *nbv)
{
	int INSCRIRE_VILLE(Personne *TP[], Ville *TV[], char zlVille[], int nbv, int i);
	int RECHERCHER_VILLE(Ville *TV[], char zlVille[], int nbv);
 
	int i,t;
	CH12 zlTel;
	CH15 zlVille;
 
	// Insertion du nom par ordre alphabétique
	for(i=nbp-1; i>=0 && (strcmp(zlNom,TP[i]->nom) < 0); i--)
		TP[i+1] = TP[i];
 
	i = i + 1;
	TP[i] = (Personne*)malloc(sizeof(Personne));
	TP[i]->nom = strdup(zlNom);
 
	printf("	Veuillez saisir la ville : ");
	gets(zlVille);
 
	printf("	Veuillez saisir le numero de departement : ");
	scanf("%d",&(TP[i]->dpt));
	fflush(stdin);
 
	printf("	Veuillez saisir le numero de Telephone : ");
	gets(zlTel);
	TP[i]->tel = strdup(zlTel);
 
	printf("\n	INSCRIPTION EFFECTUE %s\n",zlNom);
 
	t=RECHERCHER_VILLE(TV,zlVille,*nbv);
 
	if(t==-1) // Ville Non Trouvé & Inscription de la nouvelle ville
		*nbv = INSCRIRE_VILLE(TP,TV,zlVille,*nbv,i);
	else
	{    // Ville Trouvé & Mise à jour de la ville existante
		TV[t]->nbOcc++;
		TP[i]->indV = t;
	}
	nbp++;
	return(nbp);
}
 
int INSCRIRE_VILLE(Personne *TP[], Ville *TV[], char zlVille[], int nbv, int i)
{
	TV[nbv] = (Ville*)malloc(sizeof(Ville));
	TV[nbv]->nomVille = strdup(zlVille);
	TV[nbv]->nbOcc = 1;
	TP[i]->indV = nbv;
	printf("\n	NOUVELLE VILLE %s\n",zlVille);
	nbv++;
	return(nbv);
}
 
int SUPPRIMER(Personne *TP[], Ville *TV[], int nbp,  int r)
{
	int i;
	printf("\n	SUPPRESSION EFFECTUE %s\n",TP[r]->nom);
	TV[TP[r]->indV]->nbOcc--;
 
	if(TV[TP[r]->indV]->nbOcc==0)
	{
		printf("	CETTE VILLE %s NE SERA PLUS REFERENCEE",TV[TP[r]->indV]->nomVille);
	}
 
	free(TP[r]->nom);
	free(TP[r]);
 
	nbp--;
	for(i=r;i<nbp;i++)
	{
		TP[i] = TP[i+1];
	}
	return(nbp);
}
 
 
void CONSULTER(Personne *TP[], Ville *TV[], int r)
{
	printf("\n		Nom : %s\n",TP[r]->nom);
	printf("		Ville : %s\n",TV[TP[r]->indV]->nomVille);
	printf("		Departement : %d\n",TP[r]->dpt); 
	printf("		Telephone : %s\n",TP[r]->tel);
}
 
void VISUALISER(Ville *TV[], int nbv)
{
	int i,j;
	int ipp; // indice du plus petit, utilisé dans l'affichage par ordre alphabétique des villes
	CH15 TVabc[50]; // Tableau de noms de ville servant au tri alphabetique des noms de ville
	int iTVabc[50]; // Tableau d'indices servant au tri alphabetique des noms de ville
 
	// Copie du tableau de pointeur TV dans un nouveau tableau TVabc
	for(i=0;i<nbv;i++)
	{
		strcpy(TVabc[i],TV[i]->nomVille);
		iTVabc[i] = i;
	}
 
	printf("    +----------------------------------+\n");
	printf("    |  VILLES  (Habitants)             |\n");
	printf("    +----------------------------------+\n");
 
	// Tri Par Ordre Alphabétique à l'affichage
	for(i=0;i<nbv;i++)
	{
		for(ipp=i,j=i+1;j<nbv;j++)
			if(strcmp(TVabc[j],TVabc[ipp])<0) ipp=j;
 
		// Test si la ville est référencée <=> (nombre habitant > 0)
		if(TV[iTVabc[ipp]]->nbOcc > 0)
		{
			printf("        %s (%d)                 \n",TVabc[ipp],TV[iTVabc[ipp]]->nbOcc);
		}
		strcpy(TVabc[ipp],TVabc[i]);
		iTVabc[ipp] = iTVabc[i];
	}
}
 
void AFFICHER(Personne *TP[], Ville *TV[], int nbp)
{
	int i;
	char lettre = 'z'; // Variable temporaire utilisée pour comparer
 
	for(i=0;i<nbp;i++)
	{
		if(TP[i]->nom[0] != lettre)
		{
			lettre = TP[i]->nom[0];
			printf("\nLettre %c\n",lettre);
		}
		printf("	%s	",TP[i]->nom);
		printf("%s	",TP[i]->tel);
		printf("%d	",TP[i]->dpt);
		printf("%s\n",TV[TP[i]->indV]->nomVille);
	}
}
 
void QUITTER(Personne *TP[], Ville *TV[], int nbp, int nbv)
{
	int i;
 
	// Libération des zones allouées dynamiquement pour les personnes
	for (i=0;i<nbp;i++)
	{
		free(TP[i]->nom);
		free(TP[i]);
	}
 
	// Libération des zones allouées dynamiquement pour les villes
	for (i=0;i<nbv;i++)
	{
		free(TV[i]->nomVille);
		free(TV[i]);
	}
 
	// On ferme le programme avec exit
	exit(0);
}
 
int RECHERCHER_NOM(Personne *TP[], char zlNom[], int nbp)
{
	int i;
	for(i=0;i<nbp && (strcmp(TP[i]->nom,zlNom)!=0);i++);
	if(i < nbp)
		// Nom Trouvé
		return(i);
	else
		// Nom Pas Trouvé
		return(-1);
}
 
int RECHERCHER_VILLE(Ville *TV[], char zlVille[], int nbv)
{
	int i;
	for(i=0;i<nbv && (strcmp(TV[i]->nomVille,zlVille)!=0);i++);
	if(i < nbv)
		// Ville Trouvé
		return(i);
	else
		// Ville Pas Trouvé
		return(-1);
}
 
void PAUSE()
{
	printf("\n\n    Appuyez sur une touche pour retourner au menu... ");
    _getch();
}