Se connecter / S'enregistrer
Votre question

C : chargement et tri de score

Tags :
  • Record
  • Programmation
Dernière réponse : dans Programmation
17 Février 2007 20:47:34

Bonjours !

j'essait de faire un program en C qui :
charge nom et score des meilleur joueur enregistré dans un point texte, compare ces données au score qui vient d'etre fait, si le le score actuel mérite d'etre dans les record a ce moment la remplace le dernier record par le score qui vient d'être fait puis réordonne si besoin le tableau avec un tri a bulle (désolé je sais pas encore mieu faire...)
ensuite, le fichier texte est vidé puis le contenu des tableau ordonnés est recopié dedans.

voila globalement l'algo

au passage, pour éviter d'utiliser ftell, pas fiable parait il j'utilise 2 fichier, un avec les nom et un avec les scores.
les donnée sont stoquée dans une structure.

mais 2 problème se pose :
de 1 le tri a bulle ne tri rien du tout, c'est génant le score actuel reste en dernière position quequesoit sa valeur :sarcastic: 
de 2 les fichier sont bien vidé mais rien n'est mis a l'intérieur...

sur ce place au code (foireux :D )

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct fichier
  5. {
  6. long score;
  7. char nom[15];
  8. };
  9.  
  10. int main()
  11. { struct fichier joueur[6];
  12. char chaineNom[15]={0},temp[15]={0};
  13. int inscrit=0;//booléen pour savoir si le score est assez important pour être inscrit(technique du flag)
  14. int yappermut=0;
  15. long scoreActuel=14,i,tempScore=0;
  16. FILE* fichier = NULL;
  17. FILE* fichierScore = NULL;
  18.  
  19. fichier = fopen("nom.txt", "r");
  20. fichierScore = fopen("score.txt", "r");
  21.  
  22. if(fichier != NULL)
  23. {
  24. for(i=0;i<5;i++)
  25. {
  26. fgets(joueur[i].nom, 15, fichier);//on inscrit les noms dans la strcucture
  27. //puis les scores :)
  28. fscanf(fichierScore, "%ld", &joueur[i].score);
  29. }
  30.  
  31. for(i=0;i<5;i++)
  32. {
  33. if (scoreActuel > joueur[i].score)
  34. inscrit=1;
  35. }
  36. if (inscrit)
  37. {
  38. printf("entrez votre nom\n");
  39. fgets(chaineNom, sizeof chaineNom, stdin);
  40. strcpy(joueur[4].nom, chaineNom);
  41. joueur[4].score=scoreActuel;//le dernier nom et score sont éliminés
  42. while (yappermut)
  43. {
  44. for(i=4;i>=0;i--)//boucle a l'enver, le 4ème score est le moin bon !
  45. {
  46. if (joueur[i].score>joueur[i-1].score)
  47. {
  48. tempScore=joueur[i].score;
  49. strcpy(temp,joueur[i].nom);
  50. joueur[i].score=joueur[i].score;
  51. strcpy(joueur[i-1].nom,joueur[i].nom);//on échange le nom et le score
  52. joueur[i-1].score=tempScore;
  53. strcpy(joueur[i-1].nom,temp);
  54. /*grace au tri a bulle, on permutte les noms et les scores*/
  55. yappermut=1;
  56. }
  57. }
  58. }
  59. printf("voici les scores dans l'ordre : %s, %s, %s , %s, %s", joueur[0].nom,joueur[1].nom,joueur[2].nom,joueur[3].nom, joueur[4].nom);
  60. /*maintenant que les tableau sont ordonnés, on vide les fichier texte*/
  61. fclose(fichier);
  62. fclose(fichierScore);
  63. fichier = fopen("nom.txt", "w+");
  64. fichierScore = fopen("score.txt", "w+");
  65. /*puis on y copie le contenu des tableaux*/
  66. for(i=0;i>5;i++)
  67. {
  68. fputs(joueur[i].nom, fichier);
  69. fputs("\n", fichier);
  70. fputs(joueur[i].score, fichierScore);
  71. fputs("\n", fichierScore);
  72. }
  73. }
  74. }
  75. return 0;
  76. }


merci d'avance ;) 

Autres pages sur : chargement tri score

a c 145 L Programmation
17 Février 2007 20:59:58

je ne connais pas trop le C, mais la syntaxe de fputs, si c'est comme en php, est: fputs(ressource, string).

Et pourquoi n'ajoute-tu pas le score au tableau puis tu utilises bsort() et tu ne met dans ton fichier que les 4 premiers enregistrements?
17 Février 2007 21:01:57

se pourrais - ce que j'ai fait une erreur aussi grossière ???
inversé les 2 !!
je vais vérifié ;) 

mais il faudrait vraiment m'aider sur le plus gros problème, le tri...

merci :) 
Contenus similaires
Pas de réponse à votre question ? Demandez !
a c 145 L Programmation
17 Février 2007 21:02:58

oups, lis mon edit (bsort)
17 Février 2007 21:04:57

ajouter le score ?
utiliser bsort ?

je connais pas bsort :pt1cable: 
17 Février 2007 21:06:15

je rappel, le but et d'analyser et de trier les donnée, pas de rajouter n'importequelle score...
a c 145 L Programmation
17 Février 2007 21:08:29

Il semblerait bien qu'il y ait une fonction bsort() pour trier un tableau.
Donc, ton algo devient:
lecture des fichiers et entrée dans un tableau (score, nom)
ajout du score et du nom dans ce tableau
bsort pour trier par score
remplissage des fichiers depuis l'item 0 à l'item N-1
17 Février 2007 21:11:06

ok je vais me renseigner sur ça, mais je sais pas si
ça va marche vu que j'utilise une structure avec des nom et tout avec en plus 2 fichier séparé...

cela dit si quelqu'un peut corrigé mon code je suis toujours preneur :D 

merci a toi crazy cat en tout cas...
17 Février 2007 21:19:07

j'ai pas tout vu, mais, yappermut = 0 avant de rentrer dans le while, 0 en C = false, donc tu ne rentres pas dans le while...
un remarque: le fichier est censé être trié par meilleur score, donc il suffit de comparer le score actuel à celui du dernier, si il est supérieur, tu peux le rajouter.
pour la boucle d'ecriture, la condition du for: i>5 est fausse
voila :) 

EDIT: bsort n'existe pas en standard en C
a c 145 L Programmation
17 Février 2007 21:55:43

merci de la précision coca25, j'avais trouvé ça en faisant une recherche sur le bubblesort, je pensais que c'était natif.
18 Février 2007 11:17:37

merci coca je vais essayer de corriger tout ça, si ça marche toujours pas je reviendrais vous embéter :p 
18 Février 2007 16:41:29

bon je suis désolé, je revient, et je sui excédé :fou: 
ce putain de programme de base a la con ne marche toujours pas, et je n'arrive pas a la corriger ...
le tri ne marche pas bien sur, le nom entré au début remplace les 3 dernière place, ainsi que le score.
la ligne pour copier les score dans le fichier fait tout plantée (si je l'enlève ça plante pas).
aidez moi svp j'en peut plus de ce bordel :( 
code :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct fichier
  5. {
  6. long score;
  7. char nom[15];
  8. };
  9.  
  10. int main()
  11. { struct fichier joueur[6];
  12. char chaineNom[15]={0},temp[15]={0};
  13. int inscrit=0;//booléen pour savoir si le score est assez important pour être inscrit(technique du flag)
  14. int yappermut=1;
  15. long scoreActuel=14,i,tempScore=0;
  16. FILE* fichier = NULL;
  17. FILE* fichierScore = NULL;
  18.  
  19. fichier = fopen("nom.txt", "r+");
  20. fichierScore = fopen("score.txt", "r+");
  21.  
  22. if(fichier != NULL && fichierScore != NULL)
  23. {
  24. for(i=0;i<5;i++)
  25. {
  26. fgets(joueur[i].nom, 15, fichier);//on inscrit les noms dans le tableau
  27. /*on inscrit ensuite les scores dans un autre tableau
  28. important, nom[i][12]=score[i], faut pouvoir s'y retrouver quand meme :p */
  29. fscanf(fichierScore, "%ld", &joueur[i].score);
  30. }
  31.  
  32. for(i=0;i<5;i++)
  33. {
  34. if (scoreActuel > joueur[i].score)
  35. inscrit=1;
  36. }
  37. if (inscrit)
  38. {
  39. printf("entrez votre nom\n");
  40. fgets(chaineNom, sizeof chaineNom, stdin);
  41. strcpy(joueur[4].nom, chaineNom);
  42. joueur[4].score=scoreActuel;//le dernier nom et score sont éliminés
  43. while (yappermut)
  44. {
  45. yappermut=0;
  46. for(i=4;i>=0;i--)//boucle a l'enver, le 4ème score est le moin bon !
  47. {
  48. if (joueur[i].score>joueur[i-1].score)
  49. {
  50. tempScore=joueur[i].score;
  51. strcpy(temp,joueur[i].nom);
  52. joueur[i].score=joueur[i].score;
  53. strcpy(joueur[i-1].nom,joueur[i].nom);//on échange le nom et le score
  54. joueur[i-1].score=tempScore;
  55. strcpy(joueur[i-1].nom,temp);
  56. /*grace au tri a bulle, on permutte les noms et les scores*/
  57. yappermut=1;
  58. }
  59. }
  60. }
  61. printf("voici les nom dans l'ordre : %s, %s, %s , %s, %s", joueur[0].nom,joueur[1].nom,joueur[2].nom,joueur[3].nom, joueur[4].nom);
  62. printf("voici les score dans l'ordre : %ld, %ld, %ld , %ld, %ld", joueur[0].score,joueur[1].score,joueur[2].score,joueur[3].score, joueur[4].score);
  63. /*maintenant que les tableau sont ordonnés, on vide les fichier texte*/
  64. fclose(fichier);
  65. fclose(fichierScore);
  66. fichier = fopen("nom.txt", "w+");
  67. fichierScore = fopen("score.txt", "w+");
  68. /*puis on y copie le contenu des tableaux*/
  69. for(i=0;i<5;i++)
  70. {
  71. fprintf(fichier, joueur[i].nom);
  72. fprintf(fichierScore, joueur[i].score);//ligne qui plante mysterieusement
  73. }
  74. }
  75. }
  76. return 0;
  77. }
18 Février 2007 16:58:41

la syntaxe de fprintf:
  1. int fprintf (FILE *stream, const char *format, ...);

donc le code exact est:
  1. fprintf (fichier, "%s\n", joueur[i].nom); // ou encore fputs...
  2. fprintf (fichierScore, "%ld\n", joueur[i].score); // penser à rajouter le \n dans scanf

ta boucle de tri a pour condition de sortie i>=0 donc i-1 peut etre egale à -1, pour un indice de tableau, c'est pas normal :) 
faut pas perdre espoir
20 Février 2007 19:36:41

bon excuse de mettre emporté, mais parfois j'ai vraiment l'impression que je m'en sortirai pas...
tu vois, ces dernière vancances j'ai programé un mastermind enconsole, avec plusieur niveau de difficulté, un mode spécial un mode 2joueur et surtout AUCUNS bug...
seulement, les cour tout ça ça fait un mois que je n'ai pas pu programmé, et je me suis dit que j'allais m'y remettre ces vances laz (dans une semaine) et que en attendant je réviserai un peu...
par rapport au mastermind que j'ai réussi tout seul, ce petit programmé que je voulais faire juste pour m'entrainer me paraissait une broutille quoi...
donc je me suis un peu déçu de ne pas y être arrivé...
enfin voila, merci de m'aider :) 

=> en fait heuresement que je révise puisque je me sert pas corectement de fprintf :sarcastic: 
20 Février 2007 19:42:41

Citation :
// penser à rajouter le \n dans scanf

je ne comprend pas très bien...
bon moi déja j'utilise fgets + sscanf car c'est plus sécurisant et plus "pro" (ok c'est pathétique vu mon niveau mais bon ^^)

et puis, a chaque tour de boucle y'a une ligne de passée non ?

parce que moi, quand le meme nom se met 3 fois et qu'il est réinscrit dans le fichier, les ligns sont passé...
et si je rajoute un "\n" et bien ça m'écrit un nom une ligne sur 2, et ça va tout faire foirré la prochaine fois que j'execute le programme....
20 Février 2007 20:32:21

Drife a dit :

je ne comprend pas très bien...
bon moi déja j'utilise fgets + sscanf car c'est plus sécurisant et plus "pro"


Drife a dit :

  1. fscanf(fichierScore, "%ld", &joueur[i].score);



sinon effectivement c'est mieux d'uiliser fgets :) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS