
|
|
Auteur
|
Message
|
1
|
|
|
|
[Bonjour,
je suis un débutant sur la programmation en c en fait c'est ma première année d'etude informatique.Mon probléme est qu'un de mes professeur m'a donné un projet à réaliser et ceci avant le 15 juillet :hurle: .Le projet porte sur la gestion d'une annuaire téléphonique contenant des information sur des personnes(nom, prénom,adresse profession,ville et numero de tel)
Au début du programme l'annuaire est chargé en mémoire dans une liste chainée a partir d'un fichier sur le disque dur.Et a la fin l'annuaire est sauvegarder en ecrasant le fichier original.
Le travail consite a écrire un programme principal qui offre aux utilisateurs les choix suivants:
ajouter(une ou plusieurs personnes dans l'annuaire)
Supprimer(une ou plusieurs personnes )
rechercher(une ou plusieurs personnes)
lister(pour afficher le contenu de l'annuaire)
quitter(pour terminer le programme)
Je voudrai de l'aide pour réaliser ce travail car je ne suis pas en mesure de le faire avant la date prévue.
Votre point de vue m'interressera beaucoup.
Et :youpi: je voudrai au moins avoir un code qui marche.
J'utilise le compilateur dev c++
|
|
|
|
|
tu dois avoir une formation en c/c++ si ton prof t edemande ca, en tout cas, c'est l'avis de tout le monde ici, le forum n'est pas la pour creer ton programme mais pour t'aider
|
|
Je calcul donc je suis relativ
|
|
|
Tu sais qu'UN annuaire peut devenir tr`s gros. Même si t'as pas l'intention de le rendre à grande portée (tu doit surement parler d'écraser un fichier de 100 entrées...) il faut que tu conçoive grand: Écraser un fichier de 2 millions d'entrées c'est pas évident..
Moi je te proposerais d'utiliser des fichiers pour chaque lettres de l'alphabet. Mais je crois que ça peut poser problème si on fais une recherche par numéro...
Peut-être un syst`me de base de données pourrait-il te satisfaire... (je ne m'y connais pas)
Comptes-tu faire ton projet en mode console ou winAPI?
Prends le temps de te faire un pseudo-code stratégique de ce que tu as besoin...
Gestion des fichiers, interface graphique, sécurité?, portabilité(?!?)
J'aurais bien voulu te présenter un bout de code, mais je ne peux pas installer dev-c++ sur l'ordi public...
a++
-------
vive Linux!
|
|
|
|
|
c'est vrai qu'un seul fichier pour una nnuaire c'est difficile et compliqué
le mieux serait une bdd qomme l'a dit esselfe
|
|
|
|
|
Merci de vos conseils.mais comme je vous l'avais dit c 'est ma première année d'etude informatique(en fait je suis en licence mais au paravant je faisais des etudes mathématiques.)
Après certaines indications du prof je suis parvenu a rediger ceci:
#include<stdio.h>
#include<conio.h>
typedef struct maillon *liste
struct maillon
{char nom[20],prenom[20],char profession[30],char adresse[50],char numero[14];
liste suivant;
};
void ajouter(liste *L)
liste q;
printf("ajout d'une personne dans la liste\n");
q=(liste)malloc(sizeof(struct maillon));
printf("Nom?\n");scanf("%s",&q->nom);
printf("prenom?\n");scanf("%s",&q->prenom);
printf("adresse?\n");scanf("%s",&q->adresse);
printf("profession?\n");scanf("%s",&q->profession);
printf("Numero?\n");scanf("%s",&q->numero);
q->suivant=*L;
*L=q;
}
main()
{
FILE *fichier;
liste L;
int choix,nbre;
printf("entrer le numero de votre choix\n");
printf(1-ajouter\n2-supprimer\n3-rechercher\n4-lister le contenu\n5-quitter\n");
scanf("%d",&choix);
switch(choix)
case 1:
printf("Nombre de personne a ajouter?");
scanf("%d",&nbre);
for(i=1;i<=nbre;i++)
ajouter(&L);
break;
/* Je n'ai pas encore traité le reste(case2,case3,case4 case5)*/
default:
break;/*cette instruction génère une erreur de mémoire*/
getch();
}
Mon probléme est de savoir comment enrégistré les modification apportées au fichier avant de quitter le programme
J'ai aussi un probléme concernant l'ecriture d'une fonction pour rechercher une personne.
|
|
Je calcul donc je suis relativ
|
|
|
- la structure maillon, si tu met des virgules, ne remet pas le type de l'élément. int a=0, b, c=1; char a=1, c, b='b', c=94;
- Il y a une fuite de memoire (pointeur non détruit avec free).
- Un branchement 'switch' doit être définie entre accolades.
int a =0;
switch(a){
......case 0:
........break;
}
- la fonction main se déclare 'int main(){...}' et doit retourner un int(return 0; à la fin de la définition. return est bon pour sortir des fonctions)
- essais de mettre getch() juste avant return.
Pour la gestion des fichiers, il y a trois 'styles`: <fstream> <windows.h> ou
<stdio.h>... <fstream> se trouve à être du C++ ainsi que <windows.h> je crois.. <stdio.h> c'est du C.
Je n'ai jamais étudié stdio.h, mais fstream... dois-tu OBLIGATOIREMENT faire ton projet en C?
Si ça peut t'aider, je sais qu'avec fstream, il faut utiliser des positionneur qui indiquent bien sûr la position de l'octet à lire... à partir de ce pointeur, tu peux faire des manips comme crée supprimmer ou copier même déplacer des données.
L'idée serait de faire un algorithme qui, comme tu n'utilise sûrement qu'un fichier, redécale toutes les entrées suivant celles qui vient d'être inserée.
et vice-versa, en fait, on doit pratiquement s'assurer que tout est fonctionnel!
Un autre algo s'occupe de retracer conditionnellement la signature des mot-clés et retourne une position réutilisable.
Bref, enregistrer les infos se fait (d'habitude) aussitôt que tu poss`de la valeur de la variable utilisée. À l'aide de fonction prédéfinies, tu arrivera à avoir une bonne manipulation de fichiers.
Pour rechercher une personne, tu doit lire chaque octet et les faire passer par un array qui lui sera vérifiable question signature. Cette fonction te donnera une position.
a++
-->Message édité par esselfe le 22/06/2006 23:53:45<--
-------
vive Linux!
|
|
|
|
|
|
Je vais essayer de continuer en suivant ton raisonnement.J'espère que ça marchera.
|
|
|
|
|
|
je suis surement hors sujet mais comment onf ait un chaine de caractères en c++ (et pas un seul avec char) ?
|
|
Je calcul donc je suis relativ
|
|
|
#include <string> // pour le type string
char *array; // pointeur non initialisé
array = new char [1024]; // initialisation
delete [] array; // suppression de l'allocation (sinon, fuite de mémoire)
char array2[1024];
string str1;
ça doit ressembler à ça, je n'ai pas mon compilo...
a++
-------
vive Linux!
|
|
|
|
|
bonjour
c'est encore bassirou et c'est a propos du projet
j'ai un nouveau probleme:je n'arrive pas a charger le contenu du fichier dans la liste(fonction charger).Voici ce j'ai fait#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include <windows.h>
#define nomfic "d:\\annuaire.txt"
typedef struct maillon *liste;
struct maillon
{
char nom[10];
char prenom[20];
char profession[15];
char adresse[50];
char ville[10];
char numero[16];
liste suivant;
};
///////////////////////*Fonction Chargement en mémoire centrale*/////////////////////////
void charger(liste *L)
{int i=0;
struct maillon E;
FILE * fichier;
liste tmp,q;
liste test;
q=tmp;
q=(liste)malloc(sizeof(struct maillon));
test=(liste)malloc(sizeof(struct maillon));
tmp=(liste)malloc(sizeof(struct maillon));
fichier=fopen(nomfic,"rb+");
if (fichier==NULL)//c-a-d le fichier n'exite pas.Je vais le creer
{
fichier=fopen(nomfic,"wb");
if (fichier==NULL){ printf("Erreur fichier");
getchar();return ;}//else fputc(0,fichier);
}
rewind(fichier);//fseek(fichier,0,0);
if(fread(&test->nom,10,1,fichier)==1)
rewind(fichier);
while(!feof(fichier))
{
tmp=(liste)malloc(sizeof(struct maillon));
fread(&E,sizeof(struct maillon),1,fichier);
/*fread(&E.prenom,20*sizeof(char),1,fichier);
fread(&E.profession,15*sizeof(char),1,fichier);
fread(&E.adresse,50*sizeof(char),1,fichier);
fread(&E.ville,10*sizeof(char),1,fichier);
fread(&E.numero,sizeof(int),1,fichier);*/
//tmp->suivant=*L;
//*L=tmp;
strcpy(tmp->nom,E.nom);
strcpy(tmp->prenom,E.prenom);
strcpy(tmp->profession,E.profession);
strcpy(tmp->adresse,E.adresse);
strcpy(tmp->ville,E.ville);
strcpy(tmp->numero,E.numero);
q=tmp;
tmp=tmp->suivant;
q->suivant=*L;
} *L=q;
fclose(fichier);
free(tmp);
free(test);
}
//////////////////////*Fonction Sauvegarder annuaire dans le fichier*////////////////////
void sauvegarder(liste L)
{
FILE * fic;
liste temp;
temp=L;//temp=(liste)malloc(sizeof(struct maillon));
fic=fopen(nomfic,"wb"); //pour stocker l'annuaire dans le fichier
if(fic==NULL){printf("Acces impossible\n");getch();return;}
rewind(fic);
while(temp!=NULL)
{fwrite(&temp->nom,10*sizeof(char),1,fic);
fwrite(&temp->prenom,20*sizeof(char),1,fic);
fwrite(&temp->profession,15*sizeof(char),1,fic);
fwrite(&temp->adresse,50*sizeof(char),1,fic);
fwrite(&temp->ville,10*sizeof(char),1,fic);
fwrite(&temp->numero,16*sizeof(char),1,fic);
temp=temp->suivant;
}
fclose(fic);
}
///////////////////////////////*Fonction ajouter*////////////////////////////////////////
void ajouter(liste *L)
{
liste q;
q=(liste)malloc(sizeof(struct maillon));
if(!q){printf("Impossible d'allouer une zone mémoire\n");return;}
printf("Nom :\n");gets(q->nom);
printf("Prenom :\n");gets(q->prenom);
printf("Profession :\n");gets(q->profession);
printf("Adresse :\n");gets(q->adresse);
printf("Ville :\n");gets(q->ville);
printf("Numero :\n");scanf("%s",&q->numero);
q->suivant=*L;
*L=q;
}
////////////////////////////*fonction Rechercher une peronne*/////////////////////
void rechercher(liste L)
{int trouve=0;
char nom[10],prenom[20],adresse[50];
printf("Donner le nom de la personne que vous rechercher.\n");gets(nom);
printf("Entrer son prenom\n");gets(prenom);
printf("entrer son adresse\n");gets(adresse);
while(L!=NULL)
{
if((strcmp(L->nom,nom)==0)&&(strcmp(L->prenom,prenom)==0)&&(strcmp(L->adresse,adresse)==0))
{trouve=1;
printf("personne trouvée:\n");
printf("%s\t",L->nom);
printf("%s\t",L->prenom);
printf("%s\t",L->profession);
printf("%s\t",L->adresse);
printf("%s\t",L->ville);
printf("%s\n",L->numero);}
L=L->suivant;}
if (trouve=0)printf("cette personne ne se trouve pas dans l'annuaire");
}
////////////////////////*Fonction Supprimer une personne*//////////////////////////
/*void supprimer(liste *L)
{int trouve=0;
char nom[10],prenom[20],adresse[50];
liste q;
printf("Donner le nom de la personne que vous voulez supprimer de l'annuaire\n");gets(nom);
printf("Entrer son prenom\n");gets(prenom);
printf("entrer son adresse\n");gets(adresse);
while(L!=NULL)
{if((strcmp(L->nom,nom)==0)&&(strcmp(L->prenom,prenom)==0)&&(strcmp(L->adresse,adresse)==0))
{trouve=1;
q=*L;*/
///////////////////////////////////*FONCTION LISTER*///////////////////////////////
void lister(liste L)
{
liste tmp;
tmp=L;
printf("Nom\tPrenom\tprofession\tAdresse\t\tville\tNumero\n");
while(tmp!=NULL)
{
printf("%s\t",tmp->nom);
printf("%s\t",tmp->prenom);
printf("%s\t",tmp->profession);
printf("%s\t",tmp->adresse);
printf("%s\t",tmp->ville);
printf("%s\n",tmp->numero);
tmp=tmp->suivant;
}
}
int main()
{
FILE* fichier;
liste L=NULL;
int choix;
charger(&L);
printf(" entrer le numero correspondant a votre choix:\n");
printf("1-Ajouter un contact\n2-Rechercher une personne\n3-Supprimer une personne\n4-Afficher la liste des personnes\n5-Quitter\n");
ajouter(&L);
lister(L);
sauvegarder(L);
/* scanf("%d",&choix);
switch (choix)
{
case 1:
ajouter(&L);
break;
case 2:
rechercher(L);
break;
case 4:
lister(L);
break;
default:
printf("cette fonction n'est pas encore prete\n");
getch();
return 0;
}*/
getch();
return 0;
}
|
|
Je calcul donc je suis relativ
|
|
1
|
|

|






|