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

voici le programme:
/***************************************************
Programme de pour un carnet d'adresse avec les tableaux dynamiques.
***************************************************/
#include <iostream.h>
#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 <<i<<"\t"<< l->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;
}