Tom's Guide > Forum > Programmation > C : chargement et tri de score

C : chargement et tri de score

Forum Programmation : C : chargement et tri de score

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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)

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



merci d'avance ;)

Message cité 1 fois
Message édité par Drife le 17-02-2007 à 20:49:42
------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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?


Message édité par crazycat@idn le 17-02-2007 à 21:02:38
------------------------------ Réseau IRC Francophone | g33k-zone
Répondre à crazycat@idn

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

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

oups, lis mon edit (bsort)

------------------------------ Réseau IRC Francophone | g33k-zone
Répondre à crazycat@idn

ajouter le score ?
utiliser bsort ?

je connais pas bsort :pt1cable:

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

je rappel, le but et d'analyser et de trier les donnée, pas de rajouter n'importequelle score...

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

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

------------------------------ Réseau IRC Francophone | g33k-zone
Répondre à crazycat@idn

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

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

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


Message édité par coca25 le 18-02-2007 à 12:16:23
Répondre à coca25

merci de la précision coca25, j'avais trouvé ça en faisant une recherche sur le bubblesort, je pensais que c'était natif.

------------------------------ Réseau IRC Francophone | g33k-zone
Répondre à crazycat@idn

merci coca je vais essayer de corriger tout ça, si ça marche toujours pas je reviendrais vous embéter :p

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

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 :

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

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

la syntaxe de fprintf:

Code :
  1. int fprintf (FILE *stream, const char *format, ...);


donc le code exact est:

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

Répondre à coca25

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:

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

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

------------------------------ si dieu existe et a inventé la bite, alors il a inventé la masturbation qui va avec. Qu'il ne vienne donc pas se plaindre...
Pour overclocker :
http://www.infos-du-net.com/forum/ [...] pic-unique
Répondre à Drife

Drife a écrit :


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 écrit :


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





sinon effectivement c'est mieux d'uiliser fgets :)

Répondre à coca25
Tom's Guide > Forum > Programmation > C : chargement et tri de score
Aller à :

Il y a 2081 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens