Problème d'execution!!!

Résolu
cs_theidiot Messages postés 56 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 27 août 2005 - 24 août 2004 à 16:46
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 25 août 2004 à 16:43
Bonjours,

je suis débutant en programmation et je suis présentement dans l'apprentissage des tableaux dynamiques.

J'ai fait un carnet d'adresse(avec les tableaux dynamiques).
Cela s'est bien compliler ...seulement voila il y a des bogs dans l'execution: parfois les coordonnées sont affichés parfois pas.

Je sais que certain me diront de faire le programme en liste chainée mais seulement je dois le faire en tableau dynamique pour cette exercice.

Quelqu'un pourrait m'aidé svp :shy)

voici le programme:

/***************************************************

Programme de pour un carnet d'adresse avec les tableaux dynamiques.

***************************************************/

#include
#include <stdlib.h>
#include <string.h> //pour l'autorisation de la fonction "strcpy"

/***************************************************

Structure permetant de stoker: taille des tableaux, les noms,les adresses et les e-mails.

***************************************************/


struct Liste
{

int taille;
char (*nom)[20];
char (*adresse)[20];
char (*e_mail) [20];
};

/***************************************************

Fonction permetant d'ajouter un nom.

***************************************************/

void AjouterNom(Liste*l)
{


char valeur_nom[20];


//creation d'un tableau du nom plus grand...
char **n =new char *[l->taille+1];

for(int x=0;x<l->taille+1;x++)
n[x]=new char[20];

//recopie des noms...
for(int i = 0; i < l->taille; i++)
strcpy(n[i],l->nom[i]);

//entrer du nouveau nom...
cout << "Entrez le nom ";
cin.get(valeur_nom,20);
cin.sync();

//placer le nom à la fin...
strcpy(n[l->taille], valeur_nom);

//remplace l'ancien tableau...
for(int i = 0; i < l->taille+1; i++)
strcpy(l->nom[i],n[i]);

//Pour libérer de la mémoire...
delete[] n;

}

/***************************************************

Fonction permetant d'ajouter une adresse.

***************************************************/

void AjouterAdresse(Liste*l)
{


char valeur_adresse[20];


//creation d'un tableau d'adresse plus grand...
char **a =new char *[l->taille+1];

for(int x=0;x<l->taille+1;x++)
a[x]=new char[20];


//recopie des adresses...
for(int i = 0; i < l->taille; i++)
strcpy(a[i],l->adresse[i]);


//entrer de la nouvelle adresse...
cout << "Entrez l'adresse ";
cin.get(valeur_adresse,20);
cin.sync();

//placer l'adresse à la fin...
strcpy(a[l->taille], valeur_adresse);


//remplace l'ancien tableau...
for(int i = 0; i < l->taille+1; i++)
strcpy(l->adresse[i],a[i]);

//Pour libérer de la mémoire...
delete[] a;
}

/***************************************************

Fonction permetant d'ajouter un e-mail.

***************************************************/

void AjouterE_mail(Liste*l)
{

char valeur_e_mail[20];


//creation d'un tableau d'adresse plus grand...
char **e =new char *[l->taille+1];

for(int x=0;x<l->taille+1;x++)
e[x]=new char[20];


//recopie des caractères...
for(int i = 0; i < l->taille; i++)
strcpy(e[i],l->e_mail[i]);

//entrer de le nouveau e-mail...
cout << "Entrez le e-mail ";
cin.get(valeur_e_mail,20);
cin.sync();

//placer le e-mail à la fin...
strcpy(e[l->taille], valeur_e_mail);


//remplace l'ancien tableau...
for(int i = 0; i < l->taille+1; i++)
strcpy(l->e_mail[i],e[i]);

//pour libérer de la mémoire...
delete[] e;


}

/***************************************************

Fonction permetant de trier en ordre alphabétique les noms stokés dans le carnet d'adresse.

***************************************************/

void Trier(Liste*l)
{

if(l->taille>1)
for(int start = 0; start < l->taille-1; start++)

for(int k = start + 1; k < l->taille; k++)


//si le nom d'avant est plus grand que le nom d'aprés...
if(strcmp(l->nom[k],l->nom[start])<0)
{

//change l'ordre du nom...
char tempnom[20];
strcpy(tempnom,l->nom[start]);
strcpy(l->nom[start],l->nom[k]);
strcpy(l->nom[k],tempnom);

//ainsi que les coordonnées qui vont avec...
char tempadresse[20];
strcpy(tempadresse,l->adresse[start]);
strcpy(l->adresse[start],l->adresse[k]);
strcpy(l->adresse[k],tempadresse);

char tempe_mail[20];
strcpy(tempe_mail,l->e_mail[start]);
strcpy(l->e_mail[start],l->e_mail[k]);
strcpy(l->e_mail[k],tempe_mail);
}
}

/***************************************************

Fonction permetant de retirer le nom par son numéro classé ainsi que les coordonnées qui vont avec.

***************************************************/

void Retirer(Liste* l)
{
int index;

// Petite vérification d'usage :
if(!(l->taille))
{
cout << "Il n'y a rien à retirer du tableau\n";
return;
}

// Création d'un tableau plus petit pour le nom...
char **n =new char *[l->taille-1];

for(int x=0;x<l->taille+1;x++)
n[x]=new char[20];

// Création d'un tableau plus petit pour l'adresse...
char **a =new char *[l->taille-1];

for(int x=0;x<l->taille+1;x++)
a[x]=new char[20];

// Création d'un tableau plus petit pour le e-mail...
char **e =new char *[l->taille-1];

for(int x=0;x<l->taille+1;x++)
e[x]=new char[20];

// On recopie toutes les valeurs, sauf celle de la case retirée...
cout << "Quel nom souhaitez-vous retirer du tableau? : ";
cin >> index;
cin.sync();

//si le tableau n'existe pas...
while(index < 0 || index >= l->taille)
{
cout << "Cette valeur ne convient pas. Recommencez: ";
cin >> index;
cin.sync();
}

//recopie pour le nom...for(int i 0, k 0; i < l->taille; i++)
if(i != index)
strcpy(n[k++],l->nom[i]);

//recopie pour l'adresse...for(int i 0, k 0; i < l->taille; i++)
if(i != index)
strcpy(a[k++],l->adresse[i]);

//recopie pour le e-mail...for(int i 0, k 0; i < l->taille; i++)
if(i != index)
strcpy(e[k++],l->e_mail[i]);

// On remplace l'ancien tableau pour le nom...
for(int i = 0; i < l->taille+1; i++)
strcpy(l->nom[i],n[i]);

//pour l'adresse...
for(int i = 0; i < l->taille+1; i++)
strcpy(l->adresse[i],a[i]);

//pour le e-mail...
for(int i = 0; i < l->taille+1; i++)
strcpy(l->e_mail[i],e[i]);



//Pour libérer de la mémoire...
delete[] n;

delete[] a;

delete[] e;

}

/***************************************************

Fonction permetant d'afficher tout les coordonnées de ce carnet.

***************************************************/

void Afficher(Liste*l)
{

for(int i = 0; i < l->taille; i++)
{

cout <nom[i]<<endl;
cout <<" \t"<<l->adresse[i]<<endl;
cout <<" \t"<<l->e_mail[i]<<endl;
}

}

/***************************************************

Fonction permetant de modifier le nom choisi.

***************************************************/

void ModifierNom(Liste*l)
{

//Vérification...
if(!(l->taille))
{
cout << "Il n'y a rien à changer\n";
return;
}

//Numéro pour retracer le nom dans le carnet...
int index;
cout<<"Rentrez le numéro dont vous voulez changer le nom: ";
cin>>index;
cin.sync();

cout<<endl;

// nouveau nom...
char valeur_nom[20];
cout<<"Rentrez le nouveau nom ";
cin.get(valeur_nom,20);
cin.sync();

//supression sur l'ancien nom
strcpy(l->nom[index],valeur_nom);

}

/***************************************************

Fonction permetant de modifier l'adresse choisie.

***************************************************/

void ModifierAdresse(Liste*l)
{

//Vérification...
if(!(l->taille))
{
cout << "Il n'y a rien à changer\n";
return;
}

//Numéro pour retracer l'adresse dans le carnet...
int index;
cout<<"Rentrez le numéro dont vous voulez changer l'adresse: ";
cin>>index;
cin.sync();

cout<<endl;

// la nouvelle adresse...
char valeur_adresse[20];
cout<<"Rentrez la nouvelle adresse ";
cin.get(valeur_adresse,20);
cin.sync();

//supression sur l'ancienne adresse
strcpy(l->adresse[index],valeur_adresse);

}

/***************************************************

Fonction permetant de modifier le e-mail choisi.

***************************************************/

void ModifierE_mail(Liste*l)
{

//Vérification...
if(!(l->taille))
{
cout << "Il n'y a rien à changer\n";
return;
}

//numéro pour retracer le e-mail dans le carnet
int index;
cout<<"Rentrez le numéro dont vous voulez changer le e-mail: ";
cin>>index;
cin.sync();

cout<<endl;

// le nouveau e-mail...
char valeur_e_mail[20];
cout<<"Rentrez le e-mail ";
cin.get(valeur_e_mail,20);
cin.sync();

//suppression sur l'ancien e-mail
strcpy(l->e_mail[index],valeur_e_mail);

}

/***************************************************

Fonction permetant de faire la recheche d'un nom (recherche

avec les trois première lettre seulement)puis d'afficher tous les

noms s'y approchant ainsi que les coordonnées ratachées.

***************************************************/

void Recherche(Liste*l)
{

//Vérification...
if(!(l->taille))
{
cout << "Aucune recherche possible!\n";
return;
}

//les trois première lettre du nom recherché...
char nom_entrer[3];
cout<<"Entrez les trois premieres lettres du nom ";
cin.get(nom_entrer,3);
cin.sync();


char nom_rechercher[20];

//trie de recherche...
for(int x=0;x<l->taille;x++)
{

//Identifier tous les noms par ses trois premières lettres
strcpy(nom_rechercher,l->nom[x]);
nom_rechercher[2]='\0';

//si trouvé afficher nom et coordonnée
if(strcmp(nom_entrer,nom_rechercher)==0)
{
cout <<x<<"\t"<< l->nom[x]<<endl;
cout <<" \t"<<l->adresse[x]<<endl;
cout <<" \t"<<l->e_mail[x]<<endl;
}
}
}

/***************************************************

Fonction principal

***************************************************/


main()
{
int choix;
Liste liste;
liste.taille = 0;
liste.nom = new char[0] [20];
liste.adresse = new char[0] [20];
liste.e_mail = new char[0] [20];

do
{

cout << "1: ajouter coordonne" << endl;
cout << "2: retirer coordonne" << endl;
cout << "3: changer le nom"<<endl;
cout << "4: changer l'adresse"<<endl;
cout << "5: changer le e-mail"<<endl;
cout << "6: afficher le tableau" << endl;
cout << "7: faire une recherhe par nom<<endl;
cout << "8: quitter" << endl;
cin >> choix;
cin.sync();

switch(choix)
{
case 1:
AjouterNom(&liste);
AjouterAdresse(&liste);
AjouterE_mail(&liste);
liste.taille++;
Trier(&liste);
break;

case 2:
Retirer(&liste);
liste.taille--;
break;

case 3:
ModifierNom(&liste);
Trier(&liste);
break;

case 4:
ModifierAdresse(&liste);
break;

case 5:
ModifierE_mail(&liste);
break;

case 6:
Afficher(&liste);
break;

case 7:
Recherche(&liste);
break;

default:
break;
}

} while(choix != 8);


delete[] liste.nom ;


delete[] liste.adresse;


delete[] liste.e_mail;

system("pause");
return 0;

}

11 réponses

cs_theidiot Messages postés 56 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 27 août 2005
25 août 2004 à 16:29
Ça y est j'ai resolu mon problème!!!! :big)

Je me suis tromper au niveau des pointeur( mrd c'est meme logique!!)

j'ai remplacer ma struct par:

struct Liste
{

char nom[20];
char adresse[20];
char e_mail [20];
};

afin de creer un tableau de structure ...et non de membre!!!

changer la variable membre taille par un variable globale(je sais
se n'est pas elégant mais au moin c'est efficace)

faire:

Liste*liste=new list[0];

au lieu de:

Liste liste;
liste.taille = 0;
liste.nom = new char[0] [20];
liste.adresse = new char[0] [20];
liste.e_mail = new char[0] [20];

puis remplacer tous les arguments de fonction de pointeur par adresse puis adresse par pointeur.

et finalement remplacer tous les:
l->nom[i]
l->adresse[i]
l->e_mail[i]

par:

&l.nom[i]
&l.adresse[i]
&l.e_mail[i]

merde !!! je me sens idiot! :blush)

Aller theidiot retourne lire dans tes bouquins c++
3
pinderlot Messages postés 59 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 1 septembre 2004 1
24 août 2004 à 17:30
pourquoi tu crées 3 fonctions (pour ajouter le nom, l'adresse et l'e-mail) alors qu'a priori une seule suffirait ???
-----------------------------------------------
Tout ce qui ne tue pas rend plus fort !
0
cs_theidiot Messages postés 56 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 27 août 2005
24 août 2004 à 18:31
je l'ai mis dans trois fonctions au cas ou j'aurais a modifier mon programme pour ajouter seulement, le nom, l'adresse, et le e-mail.

De plus cela fait plus propre. Je peux m'y retrouver plus facilement.

Mais je devance ta question: si j'assemble en une fonction cela ne réglera pas plus mon bog.
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 19:41
regarde si ce qui ne s'affiche pas a été modifié, si ce n'est pas le cas, le probleme vient des fonctions de création ou du tri. essaie alors de faire afficher sans utiliser le tri, regarde si tas tjs des pobs, sinon regarde a la création....des ke jai un compilo sous la main, je regarde ca si ton pb a pas été résolu (ca sera deja plus facile qu'avec juste du code)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_theidiot Messages postés 56 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 27 août 2005
24 août 2004 à 19:58
Effectivement les coordonnées qui ne s'affiche pas son remplacés par n'importe quoi(parfois des symbôles bizarre).

Pour répondre à l'autre question: non cela ne peut pas etre la fonction de trie puisque j'ai déjà essayé sans cette fonction et le même bug se produit.

Si c'est la fonction de création j'ai aucune idée où sa foire!
Si quelqu'un pourrais mécrairer svp?
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2004 à 20:48
c'est koi ki saffiche pas? c'est juste une partie ou c'est le tt? par exemple, cest juste le nom, ou cest tt le champ voulu? ca aidera deja a savoir ou cherhcer
0
cs_theidiot Messages postés 56 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 27 août 2005
24 août 2004 à 21:49
Cela réussi environs 70% ou 80% de succés.

Dans le cas contraire certain coodonnée ne fonctionne pas.

exemple d'affichage:

0 Bob
23 rue des marais
Bob@com

1 Denis
6e avenue Portail
(la ca ne fonctionne pas!!!)

2 Ford
(ca ne fonctionne pas non plus)
(la encore)

3 Hercule
3 rue bleue
Hercule@bloum

4 Robert
quelque part
Je ne sais plus@com
0
cs_theidiot Messages postés 56 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 27 août 2005
25 août 2004 à 00:41
en faite je vais me corriger il ne marche pas plus que 30%

j'ai retesté.

De plus il plante lorsque je rentre plus de 6 coordonné parfois 8
il finit par planter.
0
pinderlot Messages postés 59 Date d'inscription jeudi 1 juillet 2004 Statut Membre Dernière intervention 1 septembre 2004 1
25 août 2004 à 08:56
c encore un problème de fflush.

avant d'écrire ou de lire dans un fichier, il faut vider le tampon associé au clavier par la fonction fflush sinon ca écrit ce qui restait en mémoire dans le tampon !!

fflush(stdin);


-----------------------------------------------
Tout ce qui ne tue pas rend plus fort !
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
25 août 2004 à 12:28
fflush(stdin); ca n'a aucun effet, du moins c'est extremement pas portable et dangeureux

et ce besoin de sauter tout ce qui traine dans stdin revele une mauvaise utilisation du flux à la base
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
25 août 2004 à 16:43
la taille en variable globale c'est pas du c++, c'est du C suicidaire

si tu galeres trop utilise un std::vector< Liste >, sinon il faudrait encapsulé le tableau et sa taille dans la meme agregation, mais l'important c'est que tu puisses etre sur de ton code
0
Rejoignez-nous