Problème saisie en C
Résolu
diocool
Messages postés
367
Date d'inscription
Statut
Membre
Dernière intervention
-
diocool Messages postés 367 Date d'inscription Statut Membre Dernière intervention -
diocool Messages postés 367 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Le programme suivant se ferme aussitôt après la saisie du numéro et du libellé à l'exécution et je ne vois toujours pas où se trouve le problème, mais j'ai remarqué que si je mets "int" pour le type du "pu", ça marche et je ne vois vraiment pas lien.
Si quelqu'un peut m'expliquer, il est la bienvenue. Voici le programme:
#include<stdio.h>
#include<conio.h>
#define N 4
void main()
{ struct Produit
{ int num;
char libp[25];
float pu;
int qte;
};
struct Produit P[N];
float ptotal; int i,dnum;
clrscr();
for(i=0;i<N;i++)
{ printf("\nProduit P%d: \n",i+1);
printf("Num‚ro: ");
scanf("%d",&P[i].num);
printf("Libell‚: ");
scanf("%s",&P[i].libp);
printf("Prix Unitaire: ");
scanf("%f",&P[i].pu);
printf("Quantit‚: ");
scanf("%d",&P[i].qte);
}
printf("\nDonnez le num‚ro recherch‚: ");
scanf("%d",&dnum);
i=0; ptotal=0;
while(i<N)
{ if(P[i].num==dnum)
{ ptotal=ptotal+P[i].pu*P[i].qte;
}
i++;
}
printf("Le prix total du produit\
ayant pour num‚ro %d est: %.1f",dnum,ptotal);
getch();
}
Le programme suivant se ferme aussitôt après la saisie du numéro et du libellé à l'exécution et je ne vois toujours pas où se trouve le problème, mais j'ai remarqué que si je mets "int" pour le type du "pu", ça marche et je ne vois vraiment pas lien.
Si quelqu'un peut m'expliquer, il est la bienvenue. Voici le programme:
#include<stdio.h>
#include<conio.h>
#define N 4
void main()
{ struct Produit
{ int num;
char libp[25];
float pu;
int qte;
};
struct Produit P[N];
float ptotal; int i,dnum;
clrscr();
for(i=0;i<N;i++)
{ printf("\nProduit P%d: \n",i+1);
printf("Num‚ro: ");
scanf("%d",&P[i].num);
printf("Libell‚: ");
scanf("%s",&P[i].libp);
printf("Prix Unitaire: ");
scanf("%f",&P[i].pu);
printf("Quantit‚: ");
scanf("%d",&P[i].qte);
}
printf("\nDonnez le num‚ro recherch‚: ");
scanf("%d",&dnum);
i=0; ptotal=0;
while(i<N)
{ if(P[i].num==dnum)
{ ptotal=ptotal+P[i].pu*P[i].qte;
}
i++;
}
printf("Le prix total du produit\
ayant pour num‚ro %d est: %.1f",dnum,ptotal);
getch();
}
A voir également:
- Problème saisie en C
- Saisie gestuelle iphone - Guide
- Saisie vocale whatsapp - Accueil - Messagerie instantanée
- Saisie vocale sms - Guide
- Gboard saisie vocale - Accueil - Applications & Logiciels
- Saisie automatique - Guide
7 réponses
c'est simple si tu ne met pas une séquence pour interrompre ton programme il s'exécutera puis se fermera tous seul sans te le demander c'est pour cela qu'il faut crée une var int ou char n'importe puis demander d'entrer cette valeur a la fin de ton programme
diocool
Messages postés
367
Date d'inscription
Statut
Membre
Dernière intervention
12
Je ne comprends pas ,car ce genre de démarche, j'en ai fais plusieurs et ça a toujours marché.
Non, t'inquiète, ce n'est pas ça l'erreur. Tu as bien pensé au getch();
Par contre, évite d'utiliser cette fonction qui n'est pas portable (conio.h n'est pas standard C). Utilise getchar(); de stdlib.h. Et pendant qu'on y est, le prototype du main est int main(void) et non void. De plus scanf("%s",P[i].libp); (pas besoin de l'esperluette (&) pour un tableau ou un pointeur.
Mais, ça ne corrigera pas ton problème ^^ (à moins que...)
Sinon, tu veux dire que ton programme se ferme tout juste après avoir rentré le libellé ? Si ce n'est pas ça, donne un exemple d'exécution.
Cdlt
Par contre, évite d'utiliser cette fonction qui n'est pas portable (conio.h n'est pas standard C). Utilise getchar(); de stdlib.h. Et pendant qu'on y est, le prototype du main est int main(void) et non void. De plus scanf("%s",P[i].libp); (pas besoin de l'esperluette (&) pour un tableau ou un pointeur.
Mais, ça ne corrigera pas ton problème ^^ (à moins que...)
Sinon, tu veux dire que ton programme se ferme tout juste après avoir rentré le libellé ? Si ce n'est pas ça, donne un exemple d'exécution.
Cdlt
Ok, j'ai compris d'où vient l'erreur. C'est à cause du '\n' stocké dans le buffer clavier.
Après ton scanf("%s") ... effectue :
Cdlt
Après ton scanf("%s") ... effectue :
while(getchar()!='\n');
Cdlt
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Re,
Ben, voici un test
Ben, voici un test
lami20j@debian:~/trash$ cat ccm17_problemesaisie.c #include<stdio.h> #define N 4 int main () { struct Produit { int num; char libp[25]; float pu; int qte; }; struct Produit P[N]; float ptotal; int i, dnum; // clrscr (); for (i = 0; i < N; i++) { printf ("\nProduit P%d: \n", i + 1); printf ("Num,ro: "); scanf ("%d", &P[i].num); printf ("Libell,: "); scanf ("%s", &P[i].libp); printf ("Prix Unitaire: "); scanf ("%f", &P[i].pu); printf ("Quantit,: "); scanf ("%d", &P[i].qte); } printf ("\nDonnez le num,ro recherch,: "); scanf ("%d", &dnum); i = 0; ptotal = 0; while (i < N) { if (P[i].num == dnum) { ptotal = ptotal + P[i].pu * P[i].qte; } i++; } printf ("Le prix total du produit\ ayant pour num,ro %d est: %.1f", dnum, ptotal); getchar (); return 0; }Le résultat
lami20j@debian:~/trash$ gcc ccm17_problemesaisie.c lami20j@debian:~/trash$ ./a.out Produit P1: Num,ro: 1 Libell,: aaa Prix Unitaire: 1 Quantit,: 1 Produit P2: Num,ro: 2 Libell,: bbb Prix Unitaire: 2 Quantit,: 2 Produit P3: Num,ro: 3 Libell,: ccc Prix Unitaire: 3 Quantit,: 3 Produit P4: Num,ro: 4 Libell,: ddd Prix Unitaire: 4 Quantit,: 4 Donnez le num,ro recherch,: 3 Le prix total du produitayant pour num,ro 3 est: 9.0lami20j@debian:~/trash$
N'oublie pas que t'es sous linux, et que tu lances le programme en console. Donc ta fenêtre ne se ferme pas à la fin.
Dans son cas, il a bien mis le getch à la fin, mais à la fin du scanf, il y a un '\n' qui va trainer dans le buffer et répondre au getch() et après, fin du programme. Enfin, vu que je suis pas sûr de bien à voir compris son erreur (c'est d'ailleurs pour ça que je voulais une trace d'exécution sur sa machine ^^).
Dans son cas, il a bien mis le getch à la fin, mais à la fin du scanf, il y a un '\n' qui va trainer dans le buffer et répondre au getch() et après, fin du programme. Enfin, vu que je suis pas sûr de bien à voir compris son erreur (c'est d'ailleurs pour ça que je voulais une trace d'exécution sur sa machine ^^).
En fait, je pense savoir l'erreur. C'est tout con, vu le message d'erreur, les scanf de float ne marche pas en natif avec ton turbo C. Tu devrais faire un essai avec un simple programme qui contient juste un float toto; scanf("%f",&toto);
En tout cas, vaut mieux utiliser des compilateurs qui respectent les normes. Ca évite les mauvaises surprises.
En tout cas, vaut mieux utiliser des compilateurs qui respectent les normes. Ca évite les mauvaises surprises.
Confirmation, c'est bien à cause de turbo C.
http://c-faq.com/fp/fpnotlinked.html
Ne l'utilise plus ;)
http://c-faq.com/fp/fpnotlinked.html
Ne l'utilise plus ;)
Oh-la-là! ça sera dur pour moi de le laisser car c'est avec lui que j'ai appris le C.
Ce qui m'étonne quand même c'est que c'est la première fois que je rencontre ce type de problème avec Turbo C depuis 2 ans.
D'après ce que j'ai compris, il faut ajouter ce qui suit dans la déclaration et ça marche avec Turbo C:
Extern unsigned _floatconvert;
#pragma extref _floatconvert
oubien:
void forcefloat (float * p)
{ float f = * p;
forcefloat (& f);
}
/*Ne pas appeler la fonction*/
MERCI A TOUS
Ce qui m'étonne quand même c'est que c'est la première fois que je rencontre ce type de problème avec Turbo C depuis 2 ans.
D'après ce que j'ai compris, il faut ajouter ce qui suit dans la déclaration et ça marche avec Turbo C:
Extern unsigned _floatconvert;
#pragma extref _floatconvert
oubien:
void forcefloat (float * p)
{ float f = * p;
forcefloat (& f);
}
/*Ne pas appeler la fonction*/
MERCI A TOUS