Problème saisie en C

Résolu/Fermé
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 23 déc. 2008 à 22:32
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 - 24 déc. 2008 à 01:35
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();
}

7 réponses

spoophy Messages postés 354 Date d'inscription mercredi 17 décembre 2008 Statut Membre Dernière intervention 19 août 2009 41
23 déc. 2008 à 22:45
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
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12
23 déc. 2008 à 22:56
Je ne comprends pas ,car ce genre de démarche, j'en ai fais plusieurs et ça a toujours marché.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
23 déc. 2008 à 23:25
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
23 déc. 2008 à 23:32
Salut,

Utilise getchar(); de stdlib.h.
Tu dois être fatigué ;-))

man getchar
GETS(3)                                                                           Manuel du programmeur Linux                                                                           GETS(3)

NOM
       gets, fgetc, fgets, getc, getchar, ungetc - Saisie de caractères et de chaînes

SYNOPSIS
       #include <stdio.h>

0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
23 déc. 2008 à 23:40
Erf, bien vu ;) T'avais même pas besoin de me sortir le man ^^.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
23 déc. 2008 à 23:42
Re,

En fait man c'était pour diocool ;-))
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
23 déc. 2008 à 23:41
le programme se ferme tout juste après la saisie du libellé.
ça ne marche toujours pas.
0
spoophy Messages postés 354 Date d'inscription mercredi 17 décembre 2008 Statut Membre Dernière intervention 19 août 2009 41
23 déc. 2008 à 23:45
c'est que vous avez m*rdais met la demande du char avant la fin du programme
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
23 déc. 2008 à 23:52
c'est que vous avez m*rdais met la demande du char avant la fin du programme
Lla demande du char à la fin du programme est présente. Regarde son getch(); final ;)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
23 déc. 2008 à 23:49
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 :
while(getchar()!='\n');

Cdlt
0

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

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
23 déc. 2008 à 23:55
Re,

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$
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
23 déc. 2008 à 23:59
Lol, toi t'as pas relu la modification de mon message ^^.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
24 déc. 2008 à 00:07
Re,

Effectivement, on été en train de poster en même temps.
Mais sans aucune modification dans les instructions (sauf conio et clrsrc et int main) le programme fonctionne
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
24 déc. 2008 à 00:10
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 ^^).
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
24 déc. 2008 à 00:23
Voici une vue de l'exécution:

Produit P1:
Numéro: 1
Libellé: montre
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836 > diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010
24 déc. 2008 à 00:33
t'as bien mis :
while(getchar()!='\n');

après chacun de tes scanf ?
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12
24 déc. 2008 à 01:08
Je les ai mis mais ça ne marche toujours pas.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
24 déc. 2008 à 01:11
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.
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12
24 déc. 2008 à 01:21
J'ai essayé ce qui suit et c'est bon:

#include<stdio.h>
#include<conio.h>
void main()
{ float toto;
clrscr();
printf("Saisir: ");
scanf("%f",&toto);
printf("Val = %f",toto);
getch();
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836 > diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010
24 déc. 2008 à 01:24
Confirmation, c'est bien à cause de turbo C.
http://c-faq.com/fp/fpnotlinked.html

Ne l'utilise plus ;)
0
diocool Messages postés 367 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 21 octobre 2010 12 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
24 déc. 2008 à 01:35
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
0