Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

problème de While en langage C ^^


Messages recommandés

Posté(e)

Bonjour,

 

Voici déjà le prog (pas fini hein, y a juste le case 1 de fait) (il s'agit d'un TP)

 

#include <stdio.h>
int saisie(char nom[50], char article[50], int *nbr, int *prix)
{FILE* fic;
fic=fopen("donnees.txt","w");
fprintf(fic,"%s %s %d %d\n",nom,article,nbr,prix);
fclose(fic);
return 0;}
int affiche(char nom[50], char article[50], int nbr, int prix)
{;
return 0;}
int ecrit_fic(char nomfic[50], int n)
{;
return 0;}
int rech_nom(char nomfic[50], char nomrech[50])
{;
return 0;}
int rech_piece(char nomfic[50], char nomrech[50])
{;
return 0;}
int menu()
{int d;
printf("1- Entrer les donnees dans un nouveau fichier.\n");
printf("2- Lire les donnees d'un fichier.\n");
printf("3- Ajout de donnees dans un fichier.\n");
printf("4- Recherche par nom de la personne.\n");
printf("5- Recherche par nom de la piece.\n");
printf("6- Quitter.\n");
printf("Choix ?\n");
scanf("%d",&d);
return d;
}
int main()
{int a,b;
char nom[80], article[80];
do {
	switch(menu()){
				   case 1:
						printf("Rentrez le nom : ");
						scanf("%s",nom);
						printf("\nRentrez l'article : ");
						scanf("%s",article);
						printf("\nRentrez le nombre : ");
						scanf("%d",&a);
						printf("\nRentrez le prix : ");
						scanf("%d",&b);
						printf("\n");
						saisie(nom,article,a,b);
						break;
				   case 2:
						break;
				   case 3:
						break;
				   case 4:
						break;
				   case 5:
						break;
				   default:
						return 0;}
				   }
while(menu()<6);
return 0;}

 

question donc : quand j'execute le prog en choisissant 1 à chaque fois, au premier coup il execute la case 1 puis me redonne le menu mais si je remets 1 il me remet à nouveau le menu et si là encore je remets 1 il execute le case 1 Oo

 

autrement une fois sur 2 il se comporte bien et une fois sur deux il va remettre directement le menu en considérant qu'il n'y a rien dans le case 1.

 

Pourquoi ?

 

 

Merci d'avance ^^.

Posté(e)

Une fois sur deux, tout simplement parce que tu appelles deux fois menu() par boucle, ce qui est inutile puisque tu gères déjà la sortie de boucle dans le case default du switch()

Utilise while(true) au lieu de while(menu() < 6) ;-)

 

Au passage, il faudrait utiliser autre chose qu'un return pour sortir de la boucle...

Posté(e)

Merci, effectivement utiliser une fonction pour vérifier une condition....

 

Mais je n'ai pas utiliser ton while(true) (que je ne connais pas d'ailleurs ^^), j'ai mit un d=menu(); et je me suis servi du d (et j'ai par contre supprimé le return 0 et j'ai mit un printf à 6 et aux nombres supérieur à 6).

 

Pour le while j'ai fait while(d!=6) et puis voilà :P.

Posté(e)

J'en profite tant que j'y suis, j'ai quasi terminé cet exercice donc mais je ne comprends pas très bien le "2-" du menu, voici un scan du TP :

tp7ji0.th.jpg

 

Et voici ce que j'ai fait (tout juste sauf le petit 2- qui ne fonctionne pas mais à vrai dire je ne comprends pas la fonction affiche, pourquoi lui donner directement les 4 champs ? serait-ce seulement une fonction avec un printf ?

 

#include <stdio.h>
int saisie(char nom[50], char article[50], int *nbr, int *prix)
{FILE* fic;
fic=fopen("donnees.txt","w");
fprintf(fic,"%s %s %d %d\n",nom,article,*nbr,*prix);
fclose(fic);
return 0;}
int affiche(char nom[50], char article[50], int nbr, int prix)
{printf("\n%s %s %d %d\n\n",nom,article,nbr,prix);
return 0;}
int ecrit_fic(char nomfic[50], int n)
{int i,a,b;
char nom[80],article[80]; 
FILE* fic;
fic=fopen(nomfic,"a");
for(i=0;i<n;i++)
				{printf("Rentrez le nom : ");
				scanf("%s",nom);
				printf("\nRentrez l'article : ");
				scanf("%s",article);
				printf("\nRentrez le nombre : ");
				scanf("%d",&a);
				printf("\nRentrez le prix : ");
				scanf("%d",&b);
				printf("\n");
				fprintf(fic,"%s %s %d %d\n",nom,article,a,b);}
fclose(fic);
return 0;}
int rech_nom(char nomfic[50], char nomrech[50])
{FILE* fic;
fic=fopen(nomfic,"r");
char nom[50],piece[50];
int nbr,prix;
while(!feof(fic))
				 {fscanf(fic,"%s\n%s\n%d\n%d\n",nom,piece,&nbr,&prix);
				 if(strcmp(nom,nomrech)==0)
								 printf("\n%s %s %d %d\n\n",nom,piece,nbr,prix);
				 }
fclose(fic);
return 0;}
int rech_piece(char nomfic[50], char nomrech[50])
{FILE* fic;
fic=fopen(nomfic,"r");
char nom[50],piece[50];
int nbr,prix;
while(!feof(fic))
				 {fscanf(fic,"%s\n%s\n%d\n%d\n",nom,piece,&nbr,&prix);
				 if(strcmp(piece,nomrech)==0)
								 printf("\n%s %s %d %d\n\n",nom,piece,nbr,prix);
				 }
 fclose(fic);
return 0;}
int menu()
{int d;
printf("1- Entrer les donnees dans un nouveau fichier.\n");
printf("2- Lire les donnees d'un fichier.\n");
printf("3- Ajout de donnees dans un fichier.\n");
printf("4- Recherche par nom de la personne.\n");
printf("5- Recherche par nom de la piece.\n");
printf("6- Quitter.\n");
printf("Choix ?\n\n");
scanf("%d",&d);
printf("\n");
return d;
}
int main()
{int a,b,n,d;
char nom[80], article[80],nomfic[80],nomrech[80];
do {
	d=menu();
	switch(d){
				   case 1:
						printf("Rentrez le nom : ");
						scanf("%s",nom);
						printf("\nRentrez l'article : ");
						scanf("%s",article);
						printf("\nRentrez le nombre : ");
						scanf("%d",&a);
						printf("\nRentrez le prix : ");
						scanf("%d",&b);
						printf("\n");
						saisie(nom,article,&a,&b);
						break;
				   case 2:
						FILE* fic;
						fic=fopen("donnees.txt","r");
						while(!feof(fic)
										 {fscanf(fic,"%s\n%s\n%d\n%d\n",nom,article,&a,&b);
										 affiche(nom,article,a,b);
										 }
						fclose(fic);
						return 0;
						break;
				   case 3:
						printf("Combien d'enregistrements avez-vous a faire ? : ");
						scanf("%d",&n);
						printf("\nDans quel fichier voulez-vous enregistrer vos donnees ? : ");
						scanf("%s",nomfic);
						ecrit_fic(nomfic,n);
						break;
				   case 4:
						printf("Quel nom recherchez-vous ? : ");
						scanf("%s",nomrech);
						printf("\nDans quel fichier voulez-vous rechercher ce nom ? : ");
						scanf("%s",nomfic);
						printf("\n");
						rech_nom(nomfic,nomrech);
						break;
				   case 5:
						printf("Quelle pièce recherchez-vous ? : ");
						scanf("%s",nomrech);
						printf("\nDans quel fichier voulez-vous rechercher cette pièce ? : ");
						scanf("%s",nomfic);
						rech_piece(nomfic,nomrech);
						break;
				   case 6:
						printf("Au revoir !\n");
						break;
				   default:
						printf("Ce chiffre ne correspond à aucun choix\n");}
				   }
while(d!=6);
return 0;}

 

 

Merci d'avance (encore :P ).

Posté(e)

A priori oui, il s'agit juste d'afficher les quatre valeurs correctement formatées... (je vois mal ce que ça pourrait être d'autre, en fait)

On parle bien de "afficher les quatre champs" ?

 

Tant que j'y suis... question bête : pourquoi as-tu remis dans le switch() le contenu de tes fonctions ? Ne serait-il pas plus simple d'appeler les fonctions dans le switch ? (qu'elles servent à quelque chose...)

 

-- edit --

Ah non, en fait c'est pire que ça, tu fais les traitements en double : une fois dans le switch, une fois dans la fonction...

Et... Pourquoi la fonction saisie() (qui, si on se fie à son nom, devrait uniquement faire de la saisie) va écrire dans un fichier ? ;-)

Posté(e)

Ben l'énnoncé donne des prototypes à respecter donc je ne vois pas d'autres manières de faire ^^.

 

(bon après je ne comprends pas forcément ce que tu me dis là car je ne vois pas d'autres solutions).

 

Sinon au passage, histoire de situer mes compétences, je suis en 2ème année de licence de physique et on a juste eu une vingtaine d'heure de langage C en cours et pareil en TP (mais les TP on fait les exos et on appelle à l'aide quand on a un problème ^^).

 

 

Sinon pour le 2- (donc la fonction affiche), si j'ai bien compris, je ne peux pas ouvrir un fichier dans le case 2 ? (ça me met fic undeclared :/).

Posté(e)

Pour ton "fic undeclared", je crois qu'il faut, avant de tester la fin de fichier sur fic, que tu t'assures que fic est bien un descripteur de fichier ;-)

							FILE* fic = fopen("donnees.txt","r");
						if (fic == null) return 0;
						while(!feof(fic)
										 {fscanf(fic,"%s\n%s\n%d\n%d\n",nom,article,&a,&b);
										 affiche(nom,article,a,b);
										 }
						fclose(fic);

... ou quelque chose de similaire

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...