begin process at 2012 02 11 19:28:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

problème d'execution!!!


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème d'execution!!!

mardi 24 août 2004 à 16:46:32 | problème d'execution!!!

theidiot

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;

}

mardi 24 août 2004 à 17:30:20 | Re : problème d'execution!!!

pinderlot

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 !
mardi 24 août 2004 à 18:31:56 | Re : problème d'execution!!!

theidiot

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.
mardi 24 août 2004 à 19:41:25 | Re : problème d'execution!!!

leprov

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)
mardi 24 août 2004 à 19:58:08 | Re : problème d'execution!!!

theidiot

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?
mardi 24 août 2004 à 20:48:49 | Re : problème d'execution!!!

leprov

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
mardi 24 août 2004 à 21:49:17 | Re : problème d'execution!!!

theidiot

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
mercredi 25 août 2004 à 00:41:03 | Re : problème d'execution!!!

theidiot

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.
mercredi 25 août 2004 à 08:56:09 | Re : problème d'execution!!!

pinderlot

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 !
mercredi 25 août 2004 à 12:28:52 | Re : problème d'execution!!!

djl

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

1 2

Cette discussion est classée dans : mail, taille, liste, adresse, char


Répondre à ce message

Sujets en rapport avec ce message

Trie liste de saisit sans passer par une insertion [ par Nexouille ] Voila je dois a partir d'un fichier prendre toute les ip qui s'y trouve dont on ne connait pas le nombre et je dois compter combien de fois elles appa Taille de ma structure [ par crocejf2000 ] Salut a tous, J'ai un tres gros probleme qui me bloque toute mon avancé dans mon prog : j'ai une structure : typedef struct{ unsigned short Locate; ch Gestion des espaces en C [ par maximax ] Bonjour à tous...je suis nouveau ici et j'ai un pb avec un petit programme tout bête en C...En gros, je veux que l'utilisateur entre les informations Ayez pitié de moi !!! HELP PLEASE ! [ par maximax ] Bonjour à tous...je suis nouveau ici et j'ai un pb avec un petit programme tout bête en C...En gros, je veux que l'utilisateur entre les informations regardez ma source HELP [ par asnow ] BonjourJe debute en C. j'ai voulu apprendre à enregistrer des données dans un fichier, ca a donné ce code .Si vous pouviez me donner des recommandatio Adresse disque d'un enregistrement de taille variable dans un fichier [ par exar ] Hello !Comment forcer l'écriture d'un enregistrement à une adresse spécifique sur le disque. Comment ensuite y accéder ? Le but est de permettre l'é Conversion d'adresse en char ? [ par supergrey ] Bonjour, voila mon probleme:Dans mon programme j'ai un tableau: VOID* szTemp[256]qui contient des trucs du genre: 0xcccccc59 0xcc utiliser l adresse complete pour l ouverture d un fichier [ par gagaet22 ] Bonjour à tous! J utilise la fonction _getcwd pour connaitre l adresse le dossier courant puis je rajoute le nom du fichier que je veux ouvrir. mai [c] erreur malloc (incompatible types in assignment) [ par Diony ] voici mon programme : #include #include #include typedef struct recette { char * nom; struct ingredient * ing; [c] pour les motivés ,structurer un fichier [ par Diony ] bonjour , voici mon programme . je n arrive pas a structurer mon fichier a cause de la fonction inserer_recette_fin_liste qui doit normalement inserer


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,543 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales