aide pour un programme en c - C - Programmation
Marsh Posté le 12-08-2014 à 14:18:13
je sais que j commis plusieurs erreurs , alors svp aidé moi pour arrangé CA est aussi m’éclairè sur mes erreurs
Marsh Posté le 12-08-2014 à 14:40:34
Tu ne reçois pas de réponses car :
- Ton code est illisible (pas d'indentation, sauts de ligne intempestifs...)
- Tu ne précises pas les erreurs
- Tu écris mal : j'ai du m'y reprendre à 2 fois pour lire le contenu de ton post (hors code), pas de ponctuation, des abréviations compréhensibles que par toi même...
Donc :
- Formate ton code, et poste le entre les balises "code"
- Précise ce pour quoi il ne marche pas (messages d'erreurs, n° de ligne...)
- Essaie de faire un effort pour t'exprimer correctement
Marsh Posté le 15-08-2014 à 13:11:35
personne pour m'aider !! j corrigé mon poste , si il y'a qlq chose autre à modifié avisé moi svp.
Marsh Posté le 15-08-2014 à 15:25:16
Bon, j'ai réindenté ton code, il était illsible
Code :
|
Plein plein de soucis dans ce code... Je les ai pas tous notés, mais en vrac :
- utilisation de variables non initialisées
- utilisation de scanf() sans aucune vérification des entrées
- fonctions déclarées après le main
- ....
Déjà première chose : VIRE TOUS LES SCANF() et remplace les par fgets(), qui te permettra de sécuriser tes entrées. Déjà, ça éliminera un paquet de bugs.
Ensuite, ta fonction trie(), elle es bien jolie, mais pourquoi ne pas avoir utilisé qsort() au lieu de faire ta propre fonction de tri ? (qui est tout sauf scalable, i.e si tu saisis 50 000 clients, tu peux aller te coucher en attendant que ton tri soit fini, c'est ce qu'on appelle un algo en O(n²), un des pires au niveau performances.
Prend l'habitude d'initialiser TOUTES les variables que tu déclares, surtout en C qui ne pardonne pas les accés mémoire non protégés.
Déjà fait tout ça, et ensuite je regarderai ton code + en détail
Marsh Posté le 16-08-2014 à 02:22:22
vraiment merci beaucoup Harkonnen, depuis que j lu votre message , j essayé de me documenté toute la journée sur tes suggestions ,et les points que tu as soulevé , je tiens a te dire que je ss débutant, et j jamais utilisé fgets() , sa bloque lorsque j'essaye de remplacer les scanf avec les fgets pour les entiers , mais pour les char sa passe même si j'ai remarque que sa saute de ligne et que je dois mettre avant dans le code fflush(stdin)
ex(o sa bloque) :ligne (34) j'ai mis a la place :
Code :
|
aussi , j'aimerais que tu m'éclaire concernant l'utilisation de variables non initialisées
Marsh Posté le 16-08-2014 à 22:31:58
Bon déjà a la base, ceci ne peux pas marcher:
int n;
saisie(TB,n);
jo(TB,n);
trie(TB,n);
Pour être plus clair:
si tu déclare saisie(struct client TB[], int k) [je renomme le paramètre k et non n exprès pour que ce soit plus clair], alors quand tu fais l'appel
saisie(TB,n);
ça signifie que tu donnes a k la valeur du n de main, mais c'est avec ce k que tu vas travailler dans saisie et non pas avec le n de main, bref, la valeur du n de main ne sera pas modifiée par ce qui se passe dans saisie.
idem pour jo.
Et quand tu arrives a trie(TB,n); tu passes a trie une valeur de n qui n'a pas encore été modifiée par quoi que ce soit, et comme elle n'a pas encore été initialisée, elle peut valoir n'importe quoi.
Et ça va se payer quand tu vas vouloir effectuer l'instruction for(j=0;j <= n-1;j++) de trie.
A+,
Marsh Posté le 17-08-2014 à 01:45:42
oallal sa marche merci gilou ,je pense que Harkonnen parlé de ça aussi sur son poste , sa fonction pour les tries maintenant , aussi Harkonnen ma conseillé d'utiliser fgets a la place de scanf , comme j'ai cité avant fgets bloque pour moi pour la saisie d'un entier
Marsh Posté le 17-08-2014 à 02:31:31
http://fr.openclassrooms.com/infor [...] -securisee
A+,
Marsh Posté le 19-08-2014 à 00:01:40
je te remercie beaucoup , mais j'arrive pas avec fgets pour la saisie d'un nombre , pour les chaines de caractères sa passe son souci , stp
aide moi sur cette partie de mon code , j remplacé scan f avec fgets mais sa bloque , ex:
Code :
|
a la place de :
Code :
|
Marsh Posté le 19-08-2014 à 08:45:29
Essaye de saisir une chaîne de caractères (char *) plutôt que de saisir l'int directement. Comme ça tu peux vérifier avant de mettre l'input en mémoire et engueuler l'utilisateur si besoin.
Une fois que tu es sûr que c'est bien une entrée valide, tu peux utiliser par exemple la fonction atoi() pour stocker l'int (exemple ici : http://www.cplusplus.com/reference/cstdlib/atoi/ )
Marsh Posté le 19-08-2014 à 10:30:40
kolkom a écrit : je te remercie beaucoup , mais j'arrive pas avec fgets pour la saisie d'un nombre , pour les chaines de caractères sa passe son souci , stp
|
Je t'ai donné un lien (en français en plus) qui a trois sections:
- Les limites de la fonction scanf (ie pourquoi ça chie souvent avec cette fonction)
- Récupérer une chaîne de caractères (comment on récupère l'input dans une chaîne de caractères (a.k.a. un buffer))
- Convertir la chaîne en nombre (comment on transforme la chaîne récupérée en nombre) (bon, c'est pas in int, mais une fois qu'on a un long, c'est pas dur d'en faire un int, cf aussi cet article sur les limites de atoi)
avec des exemples de codes pour illustrer.
Je vois pas ce que je peux faire de plus, sauf écrire le code à ta place...
A+,
Marsh Posté le 09-09-2014 à 11:40:35
je vous remercie beaucoup pour votre aide , vous fêtes un excellent boulot .
je ne sais pas si je dois crée un autre poste , ou continué ici , voila je bloque a la question 3 , effet j pas compris comment procédé
voila l'exercice :
Tous les programmes doivent être écrits dans un langage de programmation structurée.
Un client peut acheter plusieurs actions dans des dates différentes. On stocke les informations suivantes :
• Nom Client.
• Nom Action.
• Date d’achat.
• Montant de l’action.
• Nombre action acheté.
Pour la date, il s’agit d’un champ compose de trois entiers qui représentent respectivement le jour, mois et année.
1. Créer les structures Date et Action. (4 pts)
2. Créer le tableau A de type Action. Créer un sous-programme qui permet d’ajouter une Action dans A. (4 pts)
3. Créer un sous-programme qui permet d’afficher les Actions achetées par un client dont le nom est passé comme paramètre. (2 pts)
4. Créer le sous-programme qui permet d’afficher les actions achetées à une date passée comme paramètre. (4 pts)
5. Créer le sous-programme qui permet de calculer le montant total des actions achetées par un client dont le nom est passé comme paramètre. (4 pts)
6. Créer le sous-programme, sans paramètre, qui permet d’afficher, pour chaque client, la liste des actions achetées classées par ordre décroissant sur le montant d’achat. (6 pts)
7. Créer le sous-programme qui permet d’enregistrer le résultat de la question précédente dans un fichier. (4 pts)
8. Ecrire un programme principal dont lequel vous exploiter les sous programmes précédents, utiliser un menu pour cette réalisation (4 pts)
je veux savoir la signification , de passé le nom ou date comme paramètre
merci encore une fois .
Marsh Posté le 10-09-2014 à 10:37:50
C'est du B A BA, ça! A croire que tu n'as pas ouvert le moidre bouquin de programmation C ou autre.
> Créer un sous-programme qui permet d’afficher les Actions achetées par un client dont le nom est passé comme paramètre. (2 pts)
C'est donc écrire une fonction comme
void Affiche_Actions_Achetees_Par_Client(char *nom_du_client);
La fonction Affiche_Actions_Achetees_Par_Client a pour paramètre nom_du_client qui est de type char * (une chaine de caractères C donc)
A+,
Marsh Posté le 12-08-2014 à 03:45:16
je vois merci , je vais essayé d'être plus clair et aussi je ss tout nouveau ici ,je me ss précipite un peu pour posté sans trop y réfléchir (pardon) , voila j'ai 3 question sur mon programme :
1/quand est ce que je dois utilisé les pointeurs ?
2/sur mon programme lors de l'affichage des résultats des tries , j'ai pas tout les résultats qui s'affiche !
3/comment faire faire pour améliore le programme ?
voila mon code:
Message édité par kolkom le 13-08-2014 à 01:22:06