Prog C , ou est l'erreur

Résolu/Fermé
Soufedj - 26 janv. 2010 à 23:20
 Soufedj - 27 janv. 2010 à 05:49
Bonjour,

Je débute en C , j'essaye d'écrire un pgm qui me fait une liste de citoyens dont je fais plusieurs opérations sur celle ci
et j'ai un petit souci , lorsque j'entre les données dans la liste et que je veut faire une autre opération le pgm sort directement ,

un coup de main serait vraiment très apprécie ^^

les autres procedures ou fonction a part creation , importe peu pour l'instant , je veu juste que creation marche et que je peu choisire une autre opération a faire ,

voici le code :



#include<stdio.h>
#include<stdlib.h>



char num;

typedef struct pers {
char nc ;
char nom [10];
char prenom [10];
char adresse [20];
char date ;
char lieu[20];
char nation[20];
char dv ;

pers*suiv;
pers*prec;

}pers;

struct pers *tete,*e;




void creation (void)

{

char rep='o';

while (rep=='o')

{

e=(pers*)malloc(sizeof(pers));

if (tete==NULL)

{

printf("entrez le numero de la cn \n");
_flushall();
scanf("%s",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",&e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",&e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",&e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%d",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",&e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",&e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%s",&e->dv);

}

else {

printf("liste pas vide , entrez un nouveu element \n" );
printf("entrez le numero de la cn \n");
_flushall();
scanf("%s",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",&e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",&e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",&e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%d",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",&e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",&e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%s",&e->dv);

}

tete=e;
e->suiv=NULL;
e->prec=NULL;

printf ("avez vous une autre personne a entrez? o / n ");

_flushall();

scanf ("%s",&rep);

_flushall();
}
}


void consultation (void)
{
printf("la liste des citoyens \n ");
e=tete;

if (e==NULL)
{
printf(" la liste est vide \n");
}
else
{
while ( e!=NULL )
{
puts("");
puts("========================================");
printf("%d",e->nc);
printf("%s",e->nom);
printf("%s",e->prenom);
printf("%s",e->adresse);
printf("%s",e->lieu);
printf("%s",e->date);
printf("%s",e->nation);
printf("%s",e->dv);
puts("========================================");
puts("");

e=e->suiv;
}
}
}


int totale ()
{
int co;
co=0;
e=tete;

if (e==NULL)
{
printf("il n'ya aucun citoyen enregistré \n");
}
else
{
while (e!=NULL)
{
e=e->suiv;
co=co++;
}
printf (" le nombre totale de citoyens enregistrés est : %d \n",co );
}
return 0 ;
}

int recherche ()

{

printf("entrez le numero de la cn de la personne ");

_flushall();
scanf("%s",&num);

if (e==NULL)

{
printf("la liste est vide \n ");
}

else
{
if ( num==e->nc)
{
printf("son adresse est %s:",e->adresse );
}
else
{
while ((e->suiv!=NULL) && (e->nc != num ))
{
e=e->suiv;
}
if (e->suiv==NULL)
{
printf("la personne n'a pas eté trouvé");
}
else
{
printf("son adresse est %s:",e->adresse );
}
}
}
return 0;
}

main ()

{
tete = NULL ;

char ans='o';

int choice ;

while (ans == 'o' )

{

puts (" 1 - enregistrez un citoyens ");
puts (" 2 - Chercher un citoyen ");
puts (" 3 - Suprimer un citoyen ");
puts (" 4 - Consultaion ") ;
puts (" 5 - Nombre total des citoyen ");
puts (" 6 - Quiter ! ");

printf("choisissez une opération :\n");

scanf("%d",&choice);

if (choice == 1)
{
creation();
}
if (choice==2)
{
recherche();
}
if (choice == 4)
{
consultation();
}
if (choice == 5)
{
totale();
}
if (choice == 6)
{
puts(" au revoir ");
}

_flushall();
printf("avez vous une autre opération a faire ? o / n " );
_flushall();

scanf("%s",& ans );

}

}

7 réponses

aramir Messages postés 959 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 26 décembre 2016 222
26 janv. 2010 à 23:36
Je te répond rapidement avant d'aller me coucher:
d'après GCC: struct pers n'a pas de menbre nommé prec ou suiv.
erreur l.18 102 103 142 162 193 195 197
0
merci aramir , je vais voir
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
26 janv. 2010 à 23:57
Bonjour,

C'est une bonne idée d'éviter d'avoir plusieurs fois les mêmes lignes de code écrites comme ici :

if (tete==NULL)
{
printf("entrez le numero de la cn \n");
_flushall();
scanf("%s",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",&e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",&e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",&e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%d",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",&e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",&e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%s",&e->dv);

}

else {

printf("liste pas vide , entrez un nouveu element \n" );
printf("entrez le numero de la cn \n");
_flushall();
scanf("%s",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",&e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",&e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",&e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%d",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",&e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",&e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%s",&e->dv);

} 


puisque les scanf sont exécutés dans les deux cas, pourquoi ne pas écrire simplement :

if (tete!=NULL)
{
  printf("liste pas vide , entrez un nouveu element \n" );
}

printf("entrez le numero de la cn \n");
_flushall();
scanf("%s",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",&e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",&e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",&e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%d",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",&e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",&e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%s",&e->dv);


?

Ce genre de choses éclaircit le code, donc améliore sa lisibilité (pour trouver un bug ou simplement relire son programme après quelques semaines) et aussi évite des bugs (on modifie une partie, mais on oublie de modifier l'autre qui fait exactement la même chose)
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
27 janv. 2010 à 00:00
PS: lorsque tu envoies un gros code comme le tien sur ce forum, utilise les balises < code > (bouton à coté de gras italique souligné), ainsi les espaces d'indentation seront conservés
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
27 janv. 2010 à 00:02
Et PS encore :

D'ailleurs je n'ai pas regardé bien plus loin, mais il y a un risque d'erreur ici, puisque apparemment même si tête est vide tu demandes des données...
0
merci paco

je vais donc faire autrement ,


si tete == null

jentre les données

tete reçoit e ( mon enregistrement )
e->suiv = Null

sinon

entrez données
parcours de la liste jusk a null
p->suiv = e
e->suiv = null

est ce que c'est juste ??
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
27 janv. 2010 à 00:07
Hello,

J'ai pas tout regardé, mais :
tu écris : scanf("%s",&e->nc); alors que e->nc est de type char.
Il faut donc utiliser %c.
Il ne faut pas mettre non plus d'esperluette (&) devant les chaînes de caractères pour afficher son adresse.
scanf ("%s",&e->nom);
Il faut mettre : e->nom tout simplement.

De plus attention avec ton utilisation des scanf. Tu ne fais aucun contrôle sur la taille. C'est pourquoi il vaut mieux utiliser fgets avec les contrôles qui vont bien. Tu peux même faire une fonction pour rendre encore le tout plus propre.

Le prototype de main() sans argument est : int main(void). Il ne faut pas non plus oublier de renvoyer 0 ou EXIT_SUCCESS enfin de programme pour signaler que tout va bien.

Corrige tout ces points et n'hésite pas à reposter la nouvelle version s'il y a toujours des erreurs en les décrivant.

Cdlt,
0
voici mon nouveau code , dont j'ai pas fait de grand changement a part le ' & ' d'adressage que j'ai enlevé des chaines de caracteres , et le int main(void)
, et mettre EXIT SUCCESS a la fin

j'ai oublié de preciser que je travaille avec Code:Blocks ,

si quelqun pourrait l'essayer sur C et voir comment se comporte le programme

voici ce que me retourne le programme Process terminated with status -1073741819

Merci beacoup pour votre aide

#include<stdio.h>
#include<stdlib.h>

char num;

typedef struct pers {
                      char nc ;
                      char nom [10];
                      char prenom [10];
                      char adresse [20];
                      char date ;
                      char lieu[20];
                      char nation[20];
                      char dv ;

        pers*suiv;
        pers*prec;
}pers;

struct pers *tete,*e;

void creation (void)

 {

char rep='o';

while (rep=='o')

{

e=(pers*)malloc(sizeof(pers));

if (tete==NULL)

{

printf("entrez le numero de la cn  \n");
_flushall();
scanf("%c",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%s",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%c",&e->dv);

}

   else {

printf("liste pas vide , entrez un nouveu element \n" );
printf("entrez le numero de la cn  \n");
_flushall();
scanf("%s",&e->nc);
printf ("entrez le nom\n");
_flushall();
scanf ("%s",e->nom);
printf ("prenom?\n");
_flushall();
scanf ("%s",e->prenom);
printf ("entrez l'adresse\n");
_flushall();
scanf ("%s",e->adresse);
printf ("entrez la date de naissance\n");
_flushall();
scanf ("%d",&e->date);
printf ("entrez le lieu de naissance\n");
_flushall();
scanf ("%s",e->lieu);
printf ("entrez la nationalité\n");
_flushall();
scanf ("%s",e->nation);
printf ("entrez la date de délivrance\n");
_flushall();
scanf ("%s",&e->dv);

    }

tete=e;
e->suiv=NULL;
e->prec=NULL;

printf ("avez vous une autre personne a entrez?  o / n ");

_flushall();

scanf ("%s",&rep);

_flushall();
  }
}


void consultation (void)
{
printf("la liste des citoyens \n  ");
e=tete;

if (e==NULL)
{
printf(" la liste est vide \n");
}
else
{
while ( e!=NULL )
{
puts("");
puts("========================================");
printf("%d",e->nc);
printf("%s",e->nom);
printf("%s",e->prenom);
printf("%s",e->adresse);
printf("%s",e->lieu);
printf("%s",e->date);
printf("%s",e->nation);
printf("%s",e->dv);
puts("========================================");
puts("");

e=e->suiv;
}
}
}


int main (void)

{
tete = NULL ;

   char ans='o';

   int choice ;

 while (ans == 'o' )

  {
   puts (" Bonjour \a ");
   puts (" 1 - enregistrez un citoyens ");
   puts (" 2 - Chercher un citoyen ");
   puts (" 3 - Suprimer un citoyen ");
   puts (" 4 - Consultaion ") ;
   puts (" 5 - Nombre total des citoyen ");
   puts (" 6 - Quiter ! ");

   printf("choisissez une opération :\n");

   scanf("%d",&choice);

   if (choice == 1)
   {
   creation();
   }
   if (choice == 4)
   {
   consultation();
   }
   if (choice == 6)
   {
   puts(" au revoir ");
   }

_flushall();
printf("avez vous une autre opération a faire ? o / n " );
_flushall();

scanf("%c",& ans );

 }

EXIT_SUCCESS;

}
0

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

Posez votre question
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
27 janv. 2010 à 01:35
tu as toujours ton bout de code en double dont je t'ai parlé avant

de plus je vois que ton indentation n'est pas bonne.

Ce n'est pas seulement pour faire joli, c'est primordial si tu veux pouvoir lire toi même, comprendre et faire lire et faire comprendre rapidement ton code.

La règle (simple) : après chaque accolade ouvrante tu indentes. A chaque accolade fermante tu enlève l'indentation.

if (...)
{
  code;
  code;

  while(...)
  {
    code;
    code;
  }

  code;

}
0
je crois que le double code ne nui pas a la totalité du programme donc j'ai laissé

et pour l'indentation je vois pas ou est le probleme ? puisque le pgm s'execute sans probleme ( sinon c'est ou exactement l'erreur d'indentation ? :s )

je trouve toujours pas mon probleme , quand le pgm sort d'un seul coup sa veut dire quoi , et a tu vu le Process terminated with status -1073741819

sa veut dire quoi sa aussi ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
27 janv. 2010 à 01:37
d'autre part :
EXIT_SUCCESS;

ici c'est comme si tu écrivais :
0;

c'est à dire c'est comme
;

(instruction vide qui ne fait rien)

je pense que tu voulais dire
return EXIT_SUCCESS;


(main est in fonction et doit retourner qqchose)
c'est peut-être la cause de ta valeur de sortie bizarre.
0
nan malheuresement ce n'est pas sa :S

j'ai essayé auparavant avec return 0 ; mais toujours rien ,

as tu essayé de l'executer chez toi ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662 > Soufedj
27 janv. 2010 à 02:31
non, je n'ai pas de compilateur sous la main aujourd'hui .

ceci dit :

char date ;

ceci me parait suspect, puisque après tu fais scanf(...%s..., e->date)
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662 > Soufedj
27 janv. 2010 à 02:37
d'autre part, tu me dis "ce n'est pas ça"... oui mais non.

Une mauvaise écriture (répétition des memes lignes de code inutile, mauvaise indentation), ça laisse la porte ouverte à d'autres bugs qui peuvent se rajouter, et ça empêche de voir ceux existants. ça doit être une priorité.

Donc ça ne mange pas de pain de le faire, et de reposter ensuite ton code, qui gagnera en lisibilité (et qui donnera peut-être envie à plus de personnes de te donner un coup de main ;) )
0
Soufedj > Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
27 janv. 2010 à 02:40
o fait ,

j'ai normalement trouvé le problème pourquoi sa passait pas ,

c'est parce que j'avais mis rep comme char , et quand j'entrais si je voulais continuer ou arrêter dans création j'ai mis rep comme "%s" alors il fallait mettre " %c "

alalallalalalal , c'était vraiment pas grand chose mais qui fait beaucoup de dégâts

je vais voir si le tout marche ou pas !
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662 > Soufedj
27 janv. 2010 à 02:43
ahhh oui ça doit certainement être ça.

Vérifie aussi avec la variable date...


et évite d'avoir des copié collé de bout de code !!!!

sinon tu risques d'avoir l'erreur à double aussi... deux fois plus de travaille pour corriger (si tu y penses!)
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 662
27 janv. 2010 à 02:56
et pour l'indentation je vois pas ou est le probleme ? puisque le pgm s'execute sans probleme ( sinon c'est ou exactement l'erreur d'indentation ? :s )

ici par exemple :

while (rep=='o')

{

e=(pers*)malloc(sizeof(pers));

if (tete==NULL)

{

printf("entrez le numero de la cn  \n");
_flushall();
scanf("%c",&e->nc);
...

}

   else {

printf("liste pas vide , entrez un nouveu element \n" );
printf("entrez le numero de la cn  \n");
_flushall();
scanf("%s",&e->nc);
.....

    }

tete=e;
e->suiv=NULL;
e->prec=NULL;

printf ("avez vous une autre personne a entrez?  o / n ");

_flushall();

scanf ("%s",&rep);

_flushall();
  }
}



ça devrait plutot être quelquechose comme :
type fonction(...) {
   while (rep=='o')
   {

      e=(pers*)malloc(sizeof(pers));

      if (tete==NULL)
      {

         printf("entrez le numero de la cn  \n");
         _flushall();
         scanf("%c",&e->nc);
         ...
      }
      else {

         printf("liste pas vide , entrez un nouveu element \n" );
         printf("entrez le numero de la cn  \n");
         _flushall();
         scanf("%s",&e->nc);
         .....
      }

      tete=e;
      e->suiv=NULL;
      e->prec=NULL;

      printf ("avez vous une autre personne a entrez?  o / n ");

      _flushall();

      scanf ("%s",&rep);

      _flushall();
   }
}


(j'ai juste fait copié collé avec les erreurs... bref c'est juste pour voir les indentations)
0
merci beacoup beacoup pour ton aide ainsi que les autres

c'est bon ,j'ai résolu le probleme , ou bien le tas d'erreur que j'avais ^^ ,

tout marche nickel

il me reste une procedure de tri a faire et sa sera fini
0