Probleme d'execution programme en c

Fermé
jhonbouda Messages postés 25 Date d'inscription samedi 21 juin 2014 Statut Membre Dernière intervention 30 décembre 2014 - 25 juin 2014 à 18:27
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 juil. 2014 à 23:20
Bonjour,
slt les amis j'ecris deux programme l 'un charge de creer p factures et l'otre n cheque :
facture code source:
#include<stdlib.h>
#include<stdio.h>


struct facture{
int code;
char nom[20];
int bp;
char ville[20];
int tel;
float montant;
int index_deb;
int index_fin;
};

void creer_facture(int code,char nom[20],int index_deb,int index_fin,int bp,char ville[20],int tel,float montant)
{
printf("entrez le code\n");
scanf("%d",&code);
printf("nom\n");
scanf("%s",&nom);
printf("bp\n");
scanf("%d",&bp);
printf("ville\n");
scanf("%s",&ville);
printf("tel\n");
scanf("%d",&tel);
printf("entrez l index\n");
scanf("%d",&index_deb);
printf("index fin\n");
scanf("%d",&index_fin);
printf("entrer montant\n");
scanf("%f",&montant);
printf("la facture se presente comme suit :\n code:%d\n nom:%s\n bp:%d\n ville:%s\n tel:%d\n index debut:%d\n index fin:%d\n montant:%f\n",code,nom,bp,ville,tel,index_deb,index_fin,montant);
}
int main()
{
int codefact,indexdeb,indexfin,tel,bp;
char nom,ville;
float montantfact;
printf("remplissez la facture\n");
creer_facture(codefact,nom,bp,ville,tel,indexdeb,indexfin,montantfact);
return 0;
}

code source cheque:
#include<stdlib.h>
#include<stdio.h>


struct cheque{
int numcheque;
int numcompte;
float montantpaye;
char nomclient[20];
int codefacture;
};

void creer_cheque(int numcheque,int numcompte,float montantpaye,char nomclient[20],int codefacture)
{
printf("entrez le numero d cheque\n");
scanf("%d",&numcheque);
printf("numero du compte\n");
scanf("%d",&numcompte);
printf("montant paye\n");
scanf("%d",&montantpaye);
printf("nom du client\n");
scanf("%s",&nomclient);
printf("code facture\n");
scanf("%d",&codefacture);
printf("le cheque se presente comme suit :\n numero du cheque:%d\n numero du compte:%d\n montant paye:%f\n nom du client:%s\n code facture:%d\n",numcheque,numcompte,montantpaye,nomclient,codefacture);
}
int main()
{
int numcheque,numcompte,codefacture;
char nomclient;
float montantpaye;
printf("remplissez la facture\n");
creer_cheque(numcheque,numcompte,montantpaye,nomclient,codefacture);
return 0;
}

chaque fois que j 'execute j'ai:

aidez moi svp


5 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 25/06/2014 à 18:41
'lut, le problème se trouve ici:
...float montantpaye,char nomclient[20],int codefacture...

On ne met pas de tableau avec une taille dans les paramètres, on met soit sans taille:
char nomclient[]
, soit en tant que pointeur:
char *nomclient
, sachant que les deux reviennent exactement au même.
Et comme on a un pointeur, on vire l'esperluette du scanf:
scanf("%s",nomclient);

Et du coup, il faut passer un
char* 
à la fonction, qui contient un espace suffisant pour le nom, et on l'alloue dans le main:
char nomclient[20];
...
creer_cheque(numcheque,numcompte,montantpaye,nomclient,codefacture);
Et là c'est automagique, ça marche!
Attention toutefois, si on tape un nom plus long que 19 caractères, de mauvaises choses peuvent arriver...
Pour le programme de facture, c'est la même chose avec
nom
et
ville
.
from human import idiocy
del idiocy
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 juil. 2014 à 23:16
On ne met pas de tableau avec une taille dans les paramètres, on met soit sans taille
C'est parfaitement admis. C'est juste que la valeur est ignorée puisque le compilateur convertit en pointeur. Donc, l'erreur ne se situe pas là.
0
jhonbouda Messages postés 25 Date d'inscription samedi 21 juin 2014 Statut Membre Dernière intervention 30 décembre 2014 1
Modifié par jhonbouda le 25/06/2014 à 19:11
merci beaucoup gravgun de m'avoir aider j'ai corrige le code maintenant pour le montant paye j'ai 0.00000 quel que soit la valeur entree je ne sai pas si jai tout bien fait comme vous avez dit
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 25/06/2014 à 19:18
Sauf que :

- tu ne te sers pas de la struct que tu as créé et qui ne sert à rien
- que l'intérêt d'une telle fonction de "création" comme creer_cheque() serait d'initialiser des données utilisables dans le reste du programme, ce qui n'est pas le cas dans ton implémentation, puisque les données saisies avec les scanf n'auront de durée de vie que limitée à la fonction et n'existeront plus au retour de la fonction

Donc, il faudrait que tu modifies ta fonction pour permettre le passage de pointeurs sur les variables à initialiser.. qui devraient être des variables utilisant l'espace mémoire structuré par la struct que tu définis, tant qu'à faire, pour que ta struct ne soit pas juste décorative.

outres les erreurs déjà signalées, ton scanf pour un float ne devrait pas utiliser le spécificateur %d, mais %f (d'ailleurs, pourquoi un float et pas un double).

de plus, si tu passes des pointeurs sur les données, tu auras déjà des pointeurs pour tes scanf, et tu devras en tenir compte quand tu écriras les scanf (ou tu passes un pointeur sur une structure, ce qui simplifiera ton prototype de fonction).


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 25/06/2014 à 20:00
Je ne sais pas quel compilateur tu utilises, mais une compilation avec gcc et les warnings (option -Wall) t'alerte sur bon nombre des problèmes signalés par gravgun et moi même, y compris le problème de spécificateur %d au lieu de f% (qui est sans doutes à l'origine du pb que tu mentionnes d'absence de prise en compte de la saisie du montant).

Compile toujours avec les warnings, comprend la raison de chaque warning, et traite les un par un.


Dal
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
4 juil. 2014 à 15:13
sans compter ses scanf qui sont pas géré
0
jhonbouda Messages postés 25 Date d'inscription samedi 21 juin 2014 Statut Membre Dernière intervention 30 décembre 2014 1
26 juin 2014 à 23:37
merci pour votre aide je vais essayer d'ameliorer le code
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 juin 2014 à 11:06
Bonjour,

Merci d'éviter les posts doubles... Il aurait été préférable de continuer dans : https://forums.commentcamarche.net/forum/affich-30395336-projet-de-programmation

Enfin trop tard. Continuons ici maintenant.
0

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

Posez votre question
slt les amis merci de m'avoir accepte sur le forum. j'ai un probleme avec mon code lorsque je l'execute apres un instant j'ai une message d'erreur de windows . egalement on m'a dit que la structure que j'ai definie n'est pas utilise par le programme. vu que je suis debutant je ne sais pas trop quoi faire.
le code:

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


typedef struct facture
{
int code;
char nom[20];
int bp;
char ville[20];
int tel;
float montant;
int index_deb;
int index_fin;
}facture;

void creer_facture(int code,char *nom,int index_deb,int index_fin,int bp,char *ville,int tel,float montant)
{
printf("entrez le code:\t");
scanf("%d",&code);
printf("nom:\t");
scanf("%s",nom);
printf("bp:\t");
scanf("%d",&bp);
printf("ville:\t");
scanf("%s",&ville);
printf("tel:\t");
scanf("%d",&tel);
printf("entrez l index:\t");
scanf("%d",&index_deb);
printf("index fin:\t");
scanf("%d",&index_fin);
printf("entrer montant:\t");
scanf("%f",&montant);
printf("la facture se presente comme suit :\n code:%d\n nom:%s\n bp:%d\n ville:%s\n tel:%d\n index debut:%d\n index fin:%d\n montant:%f\n",code,nom,bp,ville,tel,index_deb,index_fin,montant);
}
int main()
{
int codefact,indexdeb,indexfin,tel,bp;
char nom[20];
char ville[20];
float montantfact;
printf("remplissez la facture\n");
creer_facture(codefact,nom,bp,ville,tel,indexdeb,indexfin,montantfact);
return 0;
}

'''
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
4 juil. 2014 à 23:20
Pour bien indenter le code, il faut mettre entre deux balises codes comme suite :
<"code c>ici tu mets ton code<"/code"> (sans les guillemets).

Dans ton code, tu définies une belle structure, mais tu ne t'en sers pas du tout. Du coup, elle ne sert à rien.
Dans ton main, plutôt que déclarer nom, ville et compagnie, tu as juste à faire struct facture f; D'ailleurs pour info, c'est mieux de mettre une majuscule au nom de la structure : struct Facture; (ce n'est que convention).
Ensuite, il faut faire une boucle for pour pouvoir créer plusieurs factures. Et il manque la structure Cheque.
0