Structure en C

Fermé
assile - 28 déc. 2010 à 12:54
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 28 déc. 2010 à 14:54
Bonjour,

Je souhaiterais creer un repertoire en langage C mais vu mes compétences limitées en informatique, je n'arrive pas à avancer car il y a des erreurs dans le début de mon programme que je n'arrive pas à expliquer. Si quelqu'un pouvait m'aider, ce serait super sympa!! Voici ce que j'ai commencer à faire :

#include<stdio.h>
#include<string.h>
#define MAX 200

struct t_contact
{
char categorie[20];
char nom[40];
char adresse[100];
char telephone[20];
char email[40];
char nom_photo[40];
};

struct t_repertoire
{
struct t_contact TAB[MAX];
};

void ajouter(struct t_contact *contact, struct t_repertoire repertoire, int *n)
{
//precondition : 0<=n<MAX
//postcondition : le repertoire contient un contact de plus, à la fin du tableau, n vaut n+1

repertoire[(*n)] = *contact;
(*n) = (*n)+1;
}

int main()
{
int choix;
struct t_contact *contact;
struct t_repertoire repertoire;
int n=0;
char nom[40];

do
{
printf("\n\n1- Ajouter un contact\n");
printf("2- Afficher le contenu du repertoire\n");
printf("3- Afficher un contact (en fonction de son nom)\n");
printf("4- Supprimer un contact (en fonction de son nom)\n");
printf("5- Classer les contacts (par nom)\n");
printf("6- Enregistrer\n");
printf("7- Restaurer\n");
printf("0- Fin\n\n");

printf("Quel est votre choix?\n");
scanf("%d",&choix);

switch(choix)
{
case 1: printf("\nNouveau contact :\n");
printf("Quelle est la categorie?\n");
scanf("%s",(*contact).categorie);
printf("Quel est le nom?\n");
scanf("%s",(*contact).nom);
printf("Quel est l'adresse?\n");
scanf("%s",(*contact).adresse);
printf("Quel est le telephone?\n");
scanf("%s",(*contact).telephone);
printf("Quel est l'email?\n");
scanf("%s",(*contact).email);
printf("Quel est le nom de la photo?\n");
scanf("%s",(*contact).nom_photo);

printf("%d\n",n);
if(n<MAX && n>=0)
ajouter(contact,repertoire,&n);
else
printf("Repertoire plein");
printf("%d\n",n);

break;
}

}
while(choix!=0);

return 0;
}

Merci d'avance.

2 réponses

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
28 déc. 2010 à 14:01
Remarques pêle-mêle :

# On écrit généralement x->y au lieu de faire (*x).y

# Si tu veux modifier n dans ajouter, il faut mettre &n dans la définition et directement n dans le code (pas de *n) mais il serait plus logique que n soit dans la structure t_repertoire.

# Il est plus simple de définir de nouveaux type plutôt que de toujours transporter tes mot-clés struct :

typedef struct t_contact 
{ 
	char categorie[20]; 
	...
} *Contact;

typedef struct t_repertoire 
{ 
	Contact tab[MAX]; 
	int n; // le nombre de contact : 0<=n<=MAX
} *Repertoire;

Dans ce cas c'est des & que tu auras dans tes définitions plutôt que des *
Exemple : void ajouterContact(Contact &contact, Repertoire &repertoire)

# Tu n'as pas besoin de char nom[40] dans le main

# Il serait plus lisible de faire des fonctions intermédiaires dans ton main :

do
{
	choisirMenu(choix);

	switch (choix)
	{
		case 1 : nouveauContact(repertoire); break;
	}
}
while (choix!=0);

Remarque : ici le nouveau contact serait une variable locale de la fonction nouveauContact : Contact contact = repertoire->tab[repertoire->n];
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
28 déc. 2010 à 14:20
Autre remarque (la plus importante sans doute) :
Tu dois allouer dynamiquement de la mémoire à ton répertoire !

#include "stdlib.h"

void initialiser(Repertoire &repertoire)
{
	repertoire=(Repertoire) malloc(sizeof(struct t_repertoire));
	repertoire->n=0;
	int i;
	for (i=0; i<MAX; i++)
		repertoire->tab[i]=(Contact) malloc(sizeof(struct t_contact));
}
0
Le problème c'est que mes structures sont définies telles quelles et que je ne peux pas les modifier (c'est la consigne). Je te remercie de ton aide mais je crois que je vais abandonner, il y a trop d'erreurs!! merci encore et bonne aprem
0
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
28 déc. 2010 à 14:54
Excepté le n que j'ai rajouté à Repertoire, je n'ai pas modifié les structures, j'ai juste utilisé des typedef pour les manipuler plus simplement, ce qui ne change rien aux restes des remarques.
0