Aide en langage C

Le forum informatique pour discuter programmation, logiciels, os, etc...

Aide en langage C

Messagepar Baschou » 28 Fév 10 à 17:56

Bon, j'ai un petit soucis avec un programme. Je dois trier des tableaux de structure 2 fois en gros. Et ce en utilisant le tri par insertion.

Les tableaux sont des fiches étudiant comportant le nom, prénom, classe (du style A3, B2, etc.) et date de naissance. Les fiches doivent être triées par ordre alphabétique de classe puis de nom.

Je n'arrive déjà pas à trier les classes, je sais que mon erreur se situe dans la boucle while, avec la comparaison (foireuse XD) des chaines de caractères. Et après, je ne sais pas comment faire pour trier les nom, pour chaque classe identique ><

Mon code (sans le main, l'encodage des fiches) :

Code: Tout sélectionner
struct fiche
{
   char nom[30];
   char prenom[30];
   char classe[3];
   char date_naissance[11];
};

Code: Tout sélectionner
void tri(struct fiche etudiant[5])
{
   int k,nouvPos;
   fiche temp;

   for(k=0;k<5;k++)
   {
      nouvPos=k;
      while(nouvPos!=0 && etudiant[nouvPos].classe < etudiant[nouvPos-1].classe)
      {
         temp=etudiant[nouvPos];
         etudiant[nouvPos]=etudiant[nouvPos-1];
         etudiant[nouvPos-1]=temp;

         nouvPos = nouvPos-1;         
      }
   }
}


Le code de tri qu'on doit modifier :

Code: Tout sélectionner
void tri_Insertion (int t[], int n)
{
   int i, //indice de l'element en cours de placement
        nouvPos,//indice de sa nouvelle position dans le tableau
   temp; //variable temporaire pour l'echange

   for(i=0; i<n; ++i){
      //deplacer t[i] a la bonne place (nouvPos) dans t[0:i]
      nouvPos = i ; //position de depart
      while (nouvPos != 0 && t[nouvPos]<t[nouvPos-1])
      {
         //permuter t[nouvPos] et t[nouvPos-1]
         temp = t[nouvPos];
         t[nouvPos]=t[nouvPos-1];
         t[nouvPos-1]=temp;

         nouvPos = nouvPos-1 ;
      }
   }
}
Dernière édition par Baschou le 28 Fév 10 à 18:31, édité 1 fois.
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar hollow » 28 Fév 10 à 18:28

Tu obtiens quoi comme résultat après avoir trié ton tableau ?

Sinon, une petite remarque sur ton code déjà :
Dans le prototype de ta fonction tri, le "5" ici ne sert à rien. Quand tu passes un tableau en paramètre d'une fonction, tu es obligé de lui passer en plus la taille de ton tableau si tu ne la connais pas. Ici tu codes en dur car tu connais la taille de ton tableau (for k=0; k<5;++k), mais ta fonction ne sera pas réutilisable si ton tableau a une taille différente que "5", ce qui diminue énormément son efficacité. la mention "Struct" n'est pas utile non plus.

Ah, et utilise la balise "code" pour copier tes codes aussi, ça permet de garder les indentations ^^
Image
"Tool Up, Honey Bunny. It's Time To Get Bad Guys"
Image
hollow
Pampa Senior
Avatar de l’utilisateur
 
Messages: 3516
Inscription: 05 Juin 06 à 18:45
Localisation: Ankh-Morpork
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 18:34

Il ne trie que dalle en fait XD

Et je ne sais pas comment le faire trier "2 fois" donc ><


Pour la taille du tableau, tout ce qui nous est demandé, c'est de savoir coder l'algorithme. On nous a dit qu'on pouvait prendre une taille fixe pour se faciliter la vie =x
C'est pour le labo d'algorithmie en fait x)


J'ai édité pour les balises code, merci XD
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar hollow » 28 Fév 10 à 18:47

Essaie d'utiliser cette fonction pour comparer tes strings : http://msdn.microsoft.com/en-us/library/bb759938(VS.85).aspx

Et pour trier "deux fois" bah, je vois pas vraiment le problème. Soit tu fais une deuxième boucle "for" de tri à la suite de la première, soit tu crées une deuxième fonction de tri que tu appelles après la première dans ton main.
Image
"Tool Up, Honey Bunny. It's Time To Get Bad Guys"
Image
hollow
Pampa Senior
Avatar de l’utilisateur
 
Messages: 3516
Inscription: 05 Juin 06 à 18:45
Localisation: Ankh-Morpork
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 18:53

Justement, je ne sais pas comment intégrer ce second tri. A chaque fois, j'ai l'impression qu'il va trié tous les noms sans prendre la classe en compte et tout foutre en l'air ><

Et sinon, je comprend pas ce que tu m'as mis. On m'a appris Strcmp juste pour comparer deux chaines pour savoir si elles sont identiques uniquement >_>


PS : apparemment, je ne suis pas le seul en classe à galérer, d'après Facebook XD
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar hollow » 28 Fév 10 à 19:08

Ah oui, okay pour les tris, j'avais lu à la va vite. Tu es sur que tu dois trier par classe et ensuite par nom ? Parce que si tu peux trier par nom avant de trier par classe, alors tu peux faire comme j'ai dit. Sinon, il faut que tu relances un second tri par nom, mais en rajoutant un test dans le while pour savoir si la classe de l'étudiant à reclasser et la même que la classe de l'étudiant précédent dans le tableau. C'est faisable, mais un peu lourd ceci dit.

Pour StrCmp, il ne sert pas qu'à savoir si deux chaines sont identiques ou non. Si tu lis le paragraphe "Return Value", tu peux voir que cette fonction retourne une valeur positive si ta première chaine de caractère est "plus grande" que la seconde, une valeur nulle si les deux chaines sont identiques, et une valeur négative autrement.

A partir de là, tu devrais pouvoir réécrire ta condition de test en bonne et due forme \m/
Dernière édition par hollow le 28 Fév 10 à 19:09, édité 1 fois.
Image
"Tool Up, Honey Bunny. It's Time To Get Bad Guys"
Image
hollow
Pampa Senior
Avatar de l’utilisateur
 
Messages: 3516
Inscription: 05 Juin 06 à 18:45
Localisation: Ankh-Morpork
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 19:12

Ok, je vais test ^^"

Mais la comparaison se fera sur la longueur de la chaine ou en comparant la valeur des caractères ? (du premier au dernier)
EDIT : non, c'est bon, ce truc là marche, merci ^^


Et oui, faut qu'on trie par classe. Et puis par nom pour chaque classe ><
Et ouais, ça doit pas être trop lourd non plus >_>
Dernière édition par Baschou le 28 Fév 10 à 19:24, édité 1 fois.
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar shadow_project11 » 28 Fév 10 à 20:54

Pour un exo du style j'avais séparé chaque classe avant de retrier un ensemble diffèrent a chaque fois.

En gros on avait un ensemble de départ avec tout le monde.

On trie une fois on a les élèves par classes

On trie une deuxième fois chaque classe séparée dont on met les élèves par ordre alphabétique.
Ex-Mari de Lino@ (paix a son âme)
Marié à la sublime Ceres, à "Booby Master" Mélodie ,
Et surtout, La Belle, la Tendre, la Sublime, l'Unique! Ladybulles
Super-Amant de Hollow
Kuja Ier a écrit:shadow, t'es un Dieu,!
Je t'aime :kitty:
shadow_project11
Gaïa Ultime
Avatar de l’utilisateur
 
Messages: 2746
Inscription: 09 Déc 05 à 21:10
Localisation: Oui
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 21:04

Bah ouais, c'est ce que je dois faire.

Mais pour le deuxième tri, je n'arrive pas à prendre isolément les classe =x
J'ai tenté un truc, ça a foiré, j'arrive pas à coder cette partie XD
Dernière édition par Baschou le 28 Fév 10 à 21:05, édité 1 fois.
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar shadow_project11 » 28 Fév 10 à 21:07

Hum....

Dans la première boucle tu trie non?

Donc ensuite pourquoi ne pas stocker dans un tableau temporaire tous les élèves d'une même classe?

Tu compare la classe de l'élève actuel avec la classe du précèdent, si elles sont identiques tu stocke l'élève dans le tableau temporaire et continue avec le suivant, sinon tu arrête et passe au tri de cette classe....

Tu vois ce que je veux dire?
Ex-Mari de Lino@ (paix a son âme)
Marié à la sublime Ceres, à "Booby Master" Mélodie ,
Et surtout, La Belle, la Tendre, la Sublime, l'Unique! Ladybulles
Super-Amant de Hollow
Kuja Ier a écrit:shadow, t'es un Dieu,!
Je t'aime :kitty:
shadow_project11
Gaïa Ultime
Avatar de l’utilisateur
 
Messages: 2746
Inscription: 09 Déc 05 à 21:10
Localisation: Oui
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 21:11

Je vois pas trop XD


Comme les classes sont triées, je pensais trier les noms jusqu'à ce qu'il trouve une classe différente. Genre :

B en classe 1
C en classe 1
A en classe 1
D en classe 2

Il ferait le même tri qu'avec les classes seulement en s'arrêtant dès qu'il arrive au D. On devrait avoir :

A, puis B, puis C en classe 1
D en classe 2


Mais je sais pas comment mettre ça en place, n'ayant qu'une idée très vague ><
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar shadow_project11 » 28 Fév 10 à 21:16

Hummmmmmmmmmmm

Comme je te l'ai dit en fait ^^

Tant que ton élève a la même classe que l'élève précèdent, c'est que tu es dans la même classe, donc tu peux continuer de trier ^^

Mais a ce moment la tu vérifierai par rapport aux élèves que tu as déjà triés avant...
Ex-Mari de Lino@ (paix a son âme)
Marié à la sublime Ceres, à "Booby Master" Mélodie ,
Et surtout, La Belle, la Tendre, la Sublime, l'Unique! Ladybulles
Super-Amant de Hollow
Kuja Ier a écrit:shadow, t'es un Dieu,!
Je t'aime :kitty:
shadow_project11
Gaïa Ultime
Avatar de l’utilisateur
 
Messages: 2746
Inscription: 09 Déc 05 à 21:10
Localisation: Oui
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 21:26

C'est ce qu'on dit tout les deux, c'est juste que j'arrive pas à le coder ça x)
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar shadow_project11 » 28 Fév 10 à 21:35

Vu vite fais comme ça en fait, je comprend pas où est le pb^^"
Ex-Mari de Lino@ (paix a son âme)
Marié à la sublime Ceres, à "Booby Master" Mélodie ,
Et surtout, La Belle, la Tendre, la Sublime, l'Unique! Ladybulles
Super-Amant de Hollow
Kuja Ier a écrit:shadow, t'es un Dieu,!
Je t'aime :kitty:
shadow_project11
Gaïa Ultime
Avatar de l’utilisateur
 
Messages: 2746
Inscription: 09 Déc 05 à 21:10
Localisation: Oui
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 21:36

Bah le problème, c'est que chaque truc que j'ai testé pour trié les nom par rapport aux classes à foiré x)

Il me remet tout dans le désordre total
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar shadow_project11 » 28 Fév 10 à 21:51

Mais il les mets bien par classes?
Ex-Mari de Lino@ (paix a son âme)
Marié à la sublime Ceres, à "Booby Master" Mélodie ,
Et surtout, La Belle, la Tendre, la Sublime, l'Unique! Ladybulles
Super-Amant de Hollow
Kuja Ier a écrit:shadow, t'es un Dieu,!
Je t'aime :kitty:
shadow_project11
Gaïa Ultime
Avatar de l’utilisateur
 
Messages: 2746
Inscription: 09 Déc 05 à 21:10
Localisation: Oui
Sexe: Homme

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 21:52

Le premier tri par classe se fait correctement.

Mais les trucs qu'on a tenté, avec Laupif, pour trier les nom par rapport aux classe, ça n'a pas marché ^^"
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar Laupif » 28 Fév 10 à 22:24

C'est bon j'ai réglé le problème on avait juste un problème de comparaison de string. Ça fait trop longtemps que j'ai pas fait de C pour me souvenir du bordel des chaine de caractères.
Laupif
 

Re: Aide en langage C

Messagepar Baschou » 28 Fév 10 à 22:33

Merci à ceux qui m'ont aidé là dedans <3

Voilà le code final, c'était le if de la seconde boucle for qui posait soucis :

Code: Tout sélectionner
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <string.h>

#define taille 5

void encode_fiche(struct fiche etudiant[taille]);
void tri(struct fiche etudiant[taille]);
void affiche(struct fiche etudiant[taille]);

struct fiche
{
   char nom[30];
   char prenom[30];
   char classe[5];
   char date_naissance[11];
};

int main()
{
   fiche etudiant[taille];
   encode_fiche(etudiant);
   tri(etudiant);
   affiche(etudiant);

   getch();
   return 0;
}

void encode_fiche(struct fiche etudiant[taille])
{
   for(int i=0;i<taille;i++)
   {
      printf("============ Fiche numero %d ============",i+1);
      printf("\n\nNom                    : ");
      scanf("%s",etudiant[i].nom);   
      printf("Prenom                 : ");
      scanf("%s%*c",etudiant[i].prenom);   
      printf("Classe                 : ");
      scanf("%s%*c",etudiant[i].classe);
      printf("Date de Naissance      : ");
      scanf("%s%*c",etudiant[i].date_naissance);   
      printf("\n\n\n");
   }
}

void tri(struct fiche etudiant[taille])
{
   int k,nouvPos;
   fiche temp;

   for(k=0;k<taille;k++)
   {
      nouvPos=k;
      while(nouvPos!=0 && strcmp(etudiant[nouvPos].classe,etudiant[nouvPos-1].classe)<0)
      {
         temp=etudiant[nouvPos];
         etudiant[nouvPos]=etudiant[nouvPos-1];
         etudiant[nouvPos-1]=temp;

         nouvPos = nouvPos-1;         
      }
   }

   for(k=0;k<taille;k++)
   {
      nouvPos=k;
      while(nouvPos!=0 && strcmp(etudiant[nouvPos].nom,etudiant[nouvPos-1].nom)<0)
      {
         if(strcmp(etudiant[nouvPos].classe,etudiant[nouvPos-1].classe) == 0)
         {
            temp = etudiant[nouvPos];
            etudiant[nouvPos] = etudiant[nouvPos-1];
            etudiant[nouvPos-1] = temp;

            nouvPos = nouvPos-1;
         }
         else
         {
            break;
         }
      }
   }
}

void affiche(struct fiche etudiant[taille])
{
   system("cls");

   for(int j=0;j<taille;j++)
   {
      printf("============ Fiche numero %d ============\n",j+1);
      printf("\nNom                    : %s",etudiant[j].nom);
      printf("\nPrenom                 : %s",etudiant[j].prenom);
      printf("\nClasse                 : %s",etudiant[j].classe);
      printf("\nDate de Naissance      : %s",etudiant[j].date_naissance);
      printf("\n\n");
   }
}
Baschou
Modérateur Basch006
 
Messages: 6177
Inscription: 13 Juin 07 à 21:32
Sexe: Non spécifié

Re: Aide en langage C

Messagepar hollow » 01 Mar 10 à 02:32

Yep, au final c'est la version plus élégante de ce que je t'avais dit de tester :-o

Par contre, même remarque qu'au premier post :

Dans ce prototype :
Code: Tout sélectionner
void encode_fiche(struct fiche etudiant[taille])
mettre la taille du tableau entre crochet ne sert à rien. D'ailleurs, tu peux tester en remplaçant dans cette ligne "taille" par 4, 6 ou même 7000, le comportement de ta fonction restera inchangé. Dans ton code, "taille" est une constante donc ça marche, mais si taille était une variable ça ne devrait pas compiler. L'unique moyen de connaitre la taille de ton tableau dans une fonction et de la passer en paramètre, voici une manière plus "propre" d'écrire ta fonction :

Code: Tout sélectionner
void encode_fiche(struct fiche etudiant[], const int taille)


De plus, tu n'as pas besoin de préciser que ton type fiche est une struct, le prototype a uniquement besoin de connaitre le type de ta variable ou de ton tableau. A moins que cela fonctionne différemment en C, mais avec un compilo C++, le prototype peut se résumer à ça :

Code: Tout sélectionner
void encode_fiche(fiche etudiant[taille])


Bon après, peut-être que l'on vous a dit de coder comme ça et que c'est comme ça qu'on vous a montré des exemples, dans ce cas il vaut mieux laisser comme tel.

Voilà, c'était juste quelques précisions, content que ton application marche :-o
Image
"Tool Up, Honey Bunny. It's Time To Get Bad Guys"
Image
hollow
Pampa Senior
Avatar de l’utilisateur
 
Messages: 3516
Inscription: 05 Juin 06 à 18:45
Localisation: Ankh-Morpork
Sexe: Homme

Suivante

Retourner vers Informatique


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité

cron