aide pour un programme en c

aide pour un programme en c - C - Programmation

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:

Code :
  1. #include<stdio.h>
  2. struct commande
  3. {
  4.     int cdcmd;
  5.     char dycmd[10];
  6. };
  7. struct client
  8. {
  9.     int cdclt;/* 1er question: dois je  declaré (cdclt)   comme pointeur ?*/
  10.     char nmclt[10];
  11.     struct  commande tabcmd[40];
  12. };
  13. main()
  14. {int n;
  15.     struct client TB[3];
  16. saisie(TB,n);
  17. jo(TB,n);
  18. trie(TB,n);
  19. }
  20. void saisie(struct client TB[],int n)
  21. {
  22. int i;
  23. printf("saisir le nombre DES  commandes n \n" );
  24. scanf("%d",&n);
  25.     for(i=0;i<n;i++)
  26.     {
  27. printf("saisir LE code de la commande  %d:\n",i+1);
  28. scanf("%d",&TB[i].tabcmd[i].cdcmd);
  29. printf("saisir LA  DATE DE SAISIE  DE LA  COMMANDE   %d\n",i+1);
  30. scanf("%s",TB[i].tabcmd[i].dycmd);
  31. }}
  32. void jo(struct client TB[],int n )
  33. {int i;
  34.     printf("saisie le nombre des clients " );
  35. scanf("%d",&n);
  36. for(i=0;i<n;i++)
  37. {printf("saisir le code  du client\n " );
  38. scanf("%d",&TB[i].cdclt);
  39. printf("saisir le  nome du client \n " );
  40. scanf("%s",TB[i].nmclt);
  41. }}
  42. void trie(struct client TB[],int n)
  43. {
  44. int j,i,k;
  45. for(j=0;j<=n-1;j++)
  46. {
  47.     for(i=j+1;i<=n-1;i++)
  48. {
  49.     if (TB[j].cdclt>TB[i].cdclt)
  50.     {
  51.     k=TB[i].cdclt;
  52.         TB[i].cdclt=TB[j].cdclt;
  53.         TB[j].cdclt=k;
  54.     }}}
  55. for(i=0;i<=n-1;i++)
  56. {
  57.     printf("lE trie donne %d %d \n",i,TB[i].cdclt);/* 2  question :lors des tries,  j'ai pas  tout les  resultat qui s'affiche  */
  58. }
  59. }


Message édité par kolkom le 13-08-2014 à 01:22:06
Reply

Marsh Posté le 12-08-2014 à 03:45:16   

Reply

Marsh Posté le 12-08-2014 à 14:18:13    

je  sais  que  j  commis  plusieurs  erreurs  , alors  svp  aidé  moi  pour  arrangé CA :jap:   est  aussi  m’éclairè  sur mes  erreurs

Reply

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

Reply

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.

Reply

Marsh Posté le 15-08-2014 à 15:25:16    

Bon, j'ai réindenté ton code, il était illsible

Code :
  1. #include<stdio.h>
  2. struct commande
  3. {
  4.    
  5.     int cdcmd;
  6.     char dycmd[10];
  7.    
  8. };
  9. struct client
  10. {
  11.    
  12.     int cdclt;/* 1er question: dois je  declaré (cdclt)   comme pointeur ?*/
  13.     char nmclt[10];
  14.     struct  commande tabcmd[40];
  15.    
  16. };
  17. main()
  18. {
  19.     int n;
  20.     struct client TB[3];
  21.     saisie(TB,n);
  22.     jo(TB,n);
  23.     trie(TB,n);
  24.    
  25. }
  26. void saisie(struct client TB[],int n)
  27. {
  28.    
  29.     int i;
  30.     printf("saisir le nombre DES  commandes n \n" );
  31.     scanf("%d",&n);
  32.     for(i=0;i < n;i++)
  33.     {
  34.        
  35.         printf("saisir LE code de la commande  %d:\n",i+1);
  36.         scanf("%d",&TB[i].tabcmd[i].cdcmd);
  37.         printf("saisir LA  DATE DE SAISIE  DE LA  COMMANDE   %d\n",i+1);
  38.         scanf("%s",TB[i].tabcmd[i].dycmd);
  39.        
  40.     }
  41.    
  42. }
  43. void jo(struct client TB[],int n )
  44. {
  45.     int i;
  46.     printf("saisie le nombre des clients " );
  47.     scanf("%d",&n);
  48.     for(i=0;i < n;i++)
  49.     {
  50.         printf("saisir le code  du client\n " );
  51.         scanf("%d",&TB[i].cdclt);
  52.         printf("saisir le  nome du client \n " );
  53.         scanf("%s",TB[i].nmclt);
  54.        
  55.     }
  56.    
  57. }
  58. void trie(struct client TB[],int n)
  59. {
  60.    
  61.     int j,i,k;
  62.     for(j=0;j <= n-1;j++)
  63.     {
  64.        
  65.         for(i=j+1;i <= n-1;i++)
  66.         {
  67.            
  68.             if (TB[j].cdclt > TB[i].cdclt)
  69.             {
  70.                
  71.                 k=TB[i].cdclt;
  72.                 TB[i].cdclt=TB[j].cdclt;
  73.                 TB[j].cdclt=k;
  74.                
  75.             }
  76.            
  77.         }
  78.        
  79.     }
  80.    
  81.     for(i=0; i<=n-1; i++)
  82.     {
  83.        
  84.         printf("lE trie donne %d %d \n",i,TB[i].cdclt);/* 2  question :lors des tries,  j'ai pas  tout les  resultat qui s'affiche  */
  85.        
  86.     }
  87.    
  88.    
  89. }


 
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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

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 :
  1. fgets(n,sizeof(n),stdin);


aussi  , j'aimerais  que tu m'éclaire  concernant l'utilisation de variables non initialisées  

Reply

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+,


Message édité par gilou le 16-08-2014 à 22:33:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :??:

Reply

Marsh Posté le 17-08-2014 à 02:31:31    

http://fr.openclassrooms.com/infor [...] -securisee
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :
  1. fgets(n,sizeof(n),stdin);


 a la place de :

Code :
  1. scanf("%d",&n);


Message cité 1 fois
Message édité par kolkom le 19-08-2014 à 00:04:43
Reply

Marsh Posté le 19-08-2014 à 00:01:40   

Reply

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/ )


Message édité par Yonel le 19-08-2014 à 08:48:07
Reply

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  
aide  moi  sur cette partie de mon code  , j remplacé scan f  avec fgets mais  sa  bloque , ex:

Code :
  1. fgets(n,sizeof(n),stdin);


 a la place de :

Code :
  1. scanf("%d",&n);



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+,


Message édité par gilou le 19-08-2014 à 10:31:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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  :jap: .


Message édité par kolkom le 09-09-2014 à 14:08:23
Reply

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+,

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed