Probleme de choix de boucle en c

Fermé
Amate2018 Messages postés 4 Date d'inscription jeudi 23 mai 2019 Statut Membre Dernière intervention 27 mai 2019 - Modifié le 27 mai 2019 à 17:48
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 29 mai 2019 à 14:18
Bonjour/Bonsoir....en vérité je fais face à un problème de boucle dans un programme C qui bloque tout mon travail de plus de 120H;la fonction doit normalement demander à l'utilisateur de saisir un certain nombre de véhicule suivant le type soit voiture, camion ou camionnette et le programme doit calculer le nombre de véhicules saisi suivant chaque et d'afficher le type de véhicule qui a plus été saisi .
je joint ma progression ci dessous ainsi que la partie ciblée en surbrillance..Merci d'avance!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct {
char *marque,*type;
int immatriculation; 
}vehicule;
typedef struct maillon{
vehicule val;
struct maillon *suiv; 
}listvehicule;

vehicule saisir_vehicule(listvehicule *l)
{
 vehicule v;
 v.marque=(char*)malloc(sizeof(char)*10);
  printf("marque:");
  scanf("%s",v.marque);
v.type=(char*)malloc(sizeof(char)*20);
   printf("type:");
   scanf("%s",v.type);
 do{
  printf("immatriculation:");  
  scanf("%d",&(v.immatriculation));
  }while(v.immatriculation<=0);
  printf("\n");
  return v;
}
void creer_liste(listvehicule **l)
{


*l=NULL;
}
 
listvehicule* ajout_fin( listvehicule *l,vehicule v)
{ listvehicule *cour,*nouv;
nouv=(listvehicule*)malloc(sizeof(listvehicule));
nouv->val=v;
nouv->suiv=NULL;
if(l!=NULL)
{
 cour=l;
 while(cour->suiv!=NULL)
{
 cour=cour->suiv;
}

cour->suiv=nouv;
}
else
l=nouv;
return l;
}
void quitter_file(listvehicule *l)
{listvehicule *cour;
if(l!=NULL)
cour=l;
l=l->suiv;
free(cour);
}
<ital>void payer_prix(listvehicule *l, vehicule *v)
{  int nv=0,nc=0,nct=0,pv=0,pc=0,pct=0;
int paye=0;
char voiture[10];
char camion[10];
char camionnette[10];
printf("donner le type du vehicule");
scanf("%s",v->type);
if(strcmp(v->type,"voiture")==0)
    {
  pv=10;
  paye=1;
  nv=nv+1;
  printf("le prix associe a la voiture est %d",pv);
     printf("le nombre de voiture est %d",nv);
 }
    else if(strcmp(v->type,"camion")==0)  
    {
     pc=30;
     paye=1;
     nc=nc+1;
     printf("le prix  associe au camion est %d",pc);
        printf("le nombre de camion est %d",nc);
    }
    else if (strcmp(v->type,"camionnette")==0)    
    {
     pct=10;
     paye=1;
     nct=nct+1;
     printf("le prix associe a la camionnette est %d",pct);
        printf("le nombre de camionnette est %d",nct);
     }

}
void  vehicule_plus_passe(listvehicule *l,vehicule *v)
{int nv,nc,nct;
char voiture[10];
char camion[10];
char camionnette[10];
 if((nv>nc)&&(nv>nct))
 printf("le type de vehicule le plus passe est%s",voiture);
 else
 if((nc>nv)&&(nc>nct))
 printf("le type de vehicule le plus passe est%s",camion);
 else
 if((nct>nv)&&(nct>nc))
 printf("le type de vehicule le plus passe est%s",camionnette);
 printf("le nombre de voiture paye est %d",nv);
 printf("le nombre de camion paye est %d",nc);
 printf("le nombre de camionnette est%d",nct); 
 }
int montant_total_cumule(listvehicule *l,vehicule *v,char voiture[],char camion[],char camionnette[])
{int s,pv,pc,pct;
 printf("donner  le type de vehicule");
 scanf("%s",v->type);
   if(strcmp(v->type,"voiture")==0)

   printf("le prix total cumule jusqua lors est%d",s);
   
}
void afficher_vehicule(vehicule v)
{
 printf("marque: %s\n",v.marque);
 printf("immatriculation: %d\n",v.immatriculation);
 printf("type: %s\n",v.type);
}
void Menu()
{
printf("pour ajouter un vehicule a la file:tapez 1");
printf("pour  afficher  le prix associe des vehicules ayant payés:tapez 2");
printf("pour afficher le total cumule :tapez 3");
printf("pour afficher le vehicule le plus passe :tapez 4");
printf("pour quitter la file:tapez 5");
printf("pour affficher un vehicule: tapez 6"); 
} 
void afficher_liste(listvehicule *l)
{ listvehicule *tmp;

tmp=l;
while(tmp!=NULL){
printf("%s%d\t",tmp->val,tmp->val);
tmp=tmp->suiv;  }
}

main()
{listvehicule *l=NULL;
int n,i,choix;
vehicule v;
char voiture[10];
char camion[10];
char camionnette[10];
creer_liste(&l);
do{
printf("donner la taille de la liste");
scanf("%d",&n);
}while(n<0);
for(i=0;i<n;i++);
printf("saisir des infor1mations du vehicule\n");
v=saisir_vehicule(l);
Menu();
printf("donnez votre choix");
scanf("%d",&choix);
switch(choix){
 case 1:{ 
  l=ajout_fin(l,v);
  afficher_liste(l);
  break;
}  
 case 2:{
 payer_prix(l,&v); 
  break;
}
 case 3:{
 montant_total_cumule(l,&v,voiture,camion,camionnette); 
  break ;
}
    case 4:{
    vehicule_plus_passe(l,&v); 
  break;
}
    case 5:{
    quitter_file(l);
    
 afficher_liste(l);
  break;
}
    case 6:{
     afficher_vehicule(v);
  break;
 }
 }
}
    

1 réponse

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 29 mai 2019 à 14:24
Salut Amate2018,

Je ne vois pas bien de quelle boucle tu parles.

Sur tes 200 lignes de code, ton compilateur doit te donner des informations que tu ne devrais pas négliger.

Chez moi, ton code compilé avec gcc et les warnings, donne les problèmes suivants :

$ gcc -Wall 36043163.c
36043163.c: In function ‘payer_prix’:
36043163.c:67:6: warning: unused variable ‘camionnette’ [-Wunused-variable]
 char camionnette[10];
      ^~~~~~~~~~~
36043163.c:66:6: warning: unused variable ‘camion’ [-Wunused-variable]
 char camion[10];
      ^~~~~~
36043163.c:65:6: warning: unused variable ‘voiture’ [-Wunused-variable]
 char voiture[10];
      ^~~~~~~
36043163.c:64:5: warning: variable ‘paye’ set but not used [-Wunused-but-set-variable]
 int paye=0;
     ^~~~
36043163.c: In function ‘montant_total_cumule’:
36043163.c:114:14: warning: unused variable ‘pct’ [-Wunused-variable]
 {int s,pv,pc,pct;
              ^~~
36043163.c:114:11: warning: unused variable ‘pc’ [-Wunused-variable]
 {int s,pv,pc,pct;
           ^~
36043163.c:114:8: warning: unused variable ‘pv’ [-Wunused-variable]
 {int s,pv,pc,pct;
        ^~
36043163.c: In function ‘afficher_liste’:
36043163.c:142:10: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘vehicule {aka struct <anonymous>}’ [-Wformat=]
 printf("%s%d\t",tmp->val,tmp->val);
          ^
36043163.c:142:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘vehicule {aka struct <anonymous>}’ [-Wformat=]
 printf("%s%d\t",tmp->val,tmp->val);
            ^
36043163.c: At top level:
36043163.c:146:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main()
 ^~~~
36043163.c: In function ‘montant_total_cumule’:
36043163.c:121:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
36043163.c: In function ‘vehicule_plus_passe’:
36043163.c:101:4: warning: ‘nv’ is used uninitialized in this function [-Wuninitialized]
  if((nv>nc)&&(nv>nct))
    ^
36043163.c:101:4: warning: ‘nc’ is used uninitialized in this function [-Wuninitialized]
36043163.c:101:12: warning: ‘nct’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  if((nv>nc)&&(nv>nct))
     ~~~~~~~^~~~~~~~~~
36043163.c: In function ‘montant_total_cumule’:
36043163.c:119:4: warning: ‘s’ may be used uninitialized in this function [-Wmaybe-uninitialized]
    printf("le prix total cumule jusqua lors est%d",s);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Les avertissements concernant les lignes 142, 101 et 119 signalent en fait de grosses erreurs dans ton code, que tu devrais corriger, et tant qu'à faire, règle aussi les autres problèmes signalés par le compilateur de variables déclarées mais non utilisées, initialisées mais non utilisées, et d'absence de code de retour attendu pour que ton programme compile proprement.

L'avertissement en ligne 101 concerne ta fonction
vehicule_plus_passe()
, et la ligne 2 dans l'extrait de code ci-dessous, que tu as programmé comme cela :

void  vehicule_plus_passe(listvehicule *l,vehicule *v)
{int nv,nc,nct;
char voiture[10];
char camion[10];
char camionnette[10];
 if((nv>nc)&&(nv>nct))
 printf("le type de vehicule le plus passe est%s",voiture);
 else
 if((nc>nv)&&(nc>nct))
 printf("le type de vehicule le plus passe est%s",camion);
 else
 if((nct>nv)&&(nct>nc))
 printf("le type de vehicule le plus passe est%s",camionnette);
 printf("le nombre de voiture paye est %d",nv);
 printf("le nombre de camion paye est %d",nc);
 printf("le nombre de camionnette est%d",nct); 
 }

La ligne
int nv,nc,nct;
déclare 3 variables de type
int
, qui ne sont pas initialisées à quoi que ce soit par la suite du code. Par conséquent, ces variables peuvent contenir n'importe quoi qui se trouve en mémoire, et quand en lignes 6, 9 et 12 tu effectues des comparaisons du contenu de ces variables, tu compares ... n'importe quoi avec ... n'importe quoi :-)

Pour le reste, je n'ai pas tenté d'exécuter ni de déboguer ton code.

Dal

_______
Note importante : lorsque tu postes du code C sur le forum, fais le avec les balises "code c", afin que ton code soit correctement affiché par le forum, avec préservation de l'indentation, coloration syntaxique et numérotation des lignes. Sinon, ton post est illisible (là il a été corrigé par un modérateur qui a gentiment inséré les balises code sur ton code).

<code c>
copie-colle ton code entre deux ces deux balises
</code>

si tu ne veux pas taper les balises, tu les insères aussi en cliquant sur la flèche qui pointe vers le bas à gauche du bouton du forum servant à poster des images, et en choissant le langage "c", et tu n'as plus ensuite qu'à copier-coller ton code entre les deux balises, comme dans l'exemple ci-dessus.
0