CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

besoin aide tri par insertion sur struct

poupstm2
poupstm2
Niveau 29
28 février 2012 à 19:40:40

Bonsoir a tous,

voila, j'avais un travail a faire pour jusqu'a ce soir minuit concernant la gestion d'une fiche patient (struct)

bref, le général m'as l'air "fini"
le problème c'est que ma fonction d'insertion n'as pas l'air de fonctionner et je ne trouve pas pourquoi... ca me rend dingue et le temps m'est compté, donc, si un de vous à le temps de jeter un coup d’œil ca serait magnifique.

je précise, le tri par insertion fonctionne sur les fiches déja encodé (qui sont déclarées à la création du vecteur de fiche) par contre, l'insertion ne se fait pas bien (ligne 413);

Au lieu de s’enserrer correctement dans le vecteur (donc de s’insérer en se triant) il se contente de l’insérer à la fin...

http://paste.maxux.net/203540331

en vous remerciant d'avance :)

chris_27
chris_27
Niveau 10
28 février 2012 à 20:53:01

J'abandonne à la ligne 7. Aucun espoir que le code marche quand je vois une macro pareille. :peur:

En vrai, je suis quand même allé plus loin par curiosité :

« void main() » :d) PAN ! main doit TOUJOURS retourner un "code d'erreur" de type int.

« printf("\n En esp%crant que ce programme vous auras %ct%c utile et agr%cable %c l'utilisation \n",138,130,130,130,133); » :d) il n'aura pas été agréable à programmer en tout cas. Si les accents ne passent pas directement, change d'éditeur de texte pour coder.

« fflush(stdin); » :d) c'est pas un truc complètement absurde ça ? (ceci est une vraie question)

« gets » ligne 737 :d) donc absolument TOUT peux arriver en exécutant ton code.

« memcpy » :d) WOW. Tu es sûr de devoir utiliser un truc aussi ba niveau ? Et tu es sûr de t'en servir comme il faut ?

Il ne manquerait pas un else ligne 933 ? :doute:

Quant au "blindage"... bravo... faire autant d'effort pour à peu près rien est remarquable. Si d'aventure tu devais refaire une chose pareil, préviens moi et je t'expliquerai comment utiliser lex/yacc (histoire d'en avoir pour 50 lignes maxi).

Bref, tout ça pour dire que je ne comprends pas la logique entre les lignes 1180 et 1182. Tu compares insert à une case du tableau, ok... mais pourquoi tu échanges deux cases du tableau juste en dessous ? :question:

chris_27
chris_27
Niveau 10
28 février 2012 à 21:01:47

PS: bonjour, et désolé pour le ton agressif de mon message précédent. Tu n'as pas à profiter de ma journée de merde (à déboguer du code bien pire que le tiens... et pourtant écrit par quelqu'un qui est censé savoir codé :( )

poupstm2
poupstm2
Niveau 29
28 février 2012 à 21:03:02

tout d'abord, merci pour tes critiques, j'avais complètement zappé le gets de insertiondate,
concernant le void main, vu que c'est une application console de bas niveaux, nous n'utilisons aucun retour de valeur.

concernant les %c pour l'affichage, c'est tout simplement parce que nous ne somme pas obligé de travailler avec accent, c'est juste moi qui passe mon temps à le faire pour le plaisir.

concernant fflush(stdin) je me demande si ce n'est pas plutôt ta question qui est absurde, si tu n'en voi pas l'utilité, c'est que dois être en partie à mon avis (3éme mois d'apprentissage en cours du soir).

memcpy n'est pas de moi, c'est un ami qui m'as passé son code de tri par insertion, je l'ai donc juste adapté au minimum à mon programme, je sait juste qu'il copie la structure entière pour eviter de passer son temps à recopier la structure champs par champs.

il me semble qu'il y'a bien un else pour la ligne 933

concernant le blindage, j'ai demandé de l'aide sur ce forum, puis j'ai fini par tenter moi même un blindage de mon coté, n sachant que je ne peut pas me contenter d'un blindage de niveaux "verif=scanf(...);" vu que je dois retourner une phrases d'erreur bien définie à l'user.

entre la ligne 1180 et 1182 se trouve la logique même du tri par insertion

si la case est plus petite, je l'efface en prenant la case suivante.

en te remerciant d'avoir pris le temps de lire mon programme.

poupstm2
poupstm2
Niveau 29
28 février 2012 à 21:10:41

pas de problème, on à tous un jour pourris de temps en temps :D

ca fait 2 jours que je tente de trouver pourquoi il ne trie pas les fiches encodées et ca me rend malade, j'en perd patience aussi...
surtout que je me suis retrouvé avec un code trop lourd pour si peu...

chris_27
chris_27
Niveau 10
28 février 2012 à 21:20:43

« nous n'utilisons aucun retour de valeur. » :d) mais il en FAUT une. Le système est en droit de la récupérer et d'en faire des choses utiles, même si toi tu n'en fais jamais rien.

« nous ne somme pas obligé de travailler avec accent, c'est juste moi qui passe mon temps à le faire pour le plaisir. » :d) oui, enfin ta technique pour afficher des accents elle n'est plus utilisée depuis 1975. :-)))
Normalement, tu peux mettre directement des accents dans le premier champ de ton printf, et ça marche. :oui:

« memcpy n'est pas de moi » :d) dans ce cas, tu ferais mieux de l'éviter. Un struct, ça peut se manipuler comme un int normalement. Typiquement,
    struct INDEX insert = tableau[i];
ou
    tableau[i] = tableau[i+1];
ça devrait marcher.

« si la case est plus petite, je l'efface en prenant la case suivante. » :d) certes. Mais il y a une constante dans les tris (basés sur des échanges). Tu échanges TOUJOURS le deux éléments que tu viens de comparer. Hors là, tu fais autre chose, et à mon avis c'est là qu'est le soucis. :(

Quant au flush de stdin, je vais rechercher. Mais il me semble que c'est une énorme boulette, au sens où ça ne fait absolument pas ce qu'on attent de lui (à savoir vider l'entrée standard des données superflues).

chris_27
chris_27
Niveau 10
28 février 2012 à 21:26:12

[Si échange il y a, ] tu échanges TOUJOURS le deux éléments que tu viens de comparer. :rouge:

Pocolo
Pocolo
Niveau 10
28 février 2012 à 21:26:56

" Tu échanges TOUJOURS le deux éléments que tu viens de comparer. "

Il le fait après la boucle while avec :

memcpy(ptindex+i+1, insert, sizeof(struct INDEX));

Le code du tri insertion, bien qu'assez fouillis, est correct, c'est ailleurs que ça merde.

poupstm2
poupstm2
Niveau 29
28 février 2012 à 21:28:22

j'utilise code::block pour le tout,

théoriquement, ce tri fonction pour les fiches que je déclare dans le vecteur, mais vas savoir pourquoi cela ne fonctionne pas avec les fiches que j'encode moi même.

le fflush de ce que je me souviens sert à "vidder le buffer", en gros, éviter que fgets (ou scanf,gets,getch, ...) ne prenne une valeur entrée par l'utilisateur par mégarde (et nos testeur prennent un malin plaisir a appuyer sur des touches au hasard par-ci par la, je voulais être sur que le buffer sois propre au moment de la saisie de l'user.

chris_27
chris_27
Niveau 10
28 février 2012 à 21:36:57

À la réflexion, tu fais un tri bulle en fait. Tu en es conscient ? la consigne parle explicitement d'un tri par insertion ?

Et je persiste et signe : tu as un soucis soit dans le test de ta boucle (comparer les cases i et i+1 donnerait un tri bulle), soit dans l'affectation DANS la boucle (échanger la case i et insert donnerait un tri par insertion).

chris_27
chris_27
Niveau 10
28 février 2012 à 21:38:50

Pocolo: ha zut... j'avais pas fait gaffe à l'interlocuteur. Mais non, il ne le fait pas, après la boucle, il faut la partie "insertion" du tri par insertion. Mon problème est qu'il échange les cases i et i+1 DANS la boucle alors que ces deux valeurs n'ont pas été comparées, ce qui n'a moralement aucun sens.

poupstm2
poupstm2
Niveau 29
28 février 2012 à 21:40:00

oui, c'est spécifiquement un tri par insertion que je dois faire (le dossier précédent était un heap sort, ce qui était mieux adapté)

le tri par insertion ressemble au tri a bulle, en commenceant par la fin, c'est juste qu'ont fait decaller toutes les cases vers la droite, jusqu'a trouvé une valeur plus grande et la, on insert le produit

chris_27
chris_27
Niveau 10
28 février 2012 à 21:46:43

poupstm2: petite précision, je suis prof d'info (même si l'état actuel de mon cerveau doit me faire descendre au niveau d'étudiant en master/école d'ingé :-))) ).

Si tu veux trouver la plus grande valeur d'un bout de tableau, tu dois donc bien comparer la case i et ta variable insert. En revanche, dans ta boucle while (ligne 1182), ce sont ces deux quantités là que tu dois échanger, pas les cases i et i+1.

poupstm2
poupstm2
Niveau 29
28 février 2012 à 21:53:00

car a partir de 1194 c'est la fonction insertion, elle ne fait que décaler les structures vers la droite :
while(i >= 0 && strcmp((ptindex+i)->Nom, insert->Nom) > 0)
tant que ptindex+i est inférieur a insert

une foi ces décalages fait, memcpy insert la structure "insert"

poupstm2
poupstm2
Niveau 29
28 février 2012 à 21:53:59

je cherche a faire comme j'ai fait a partir de la ligne 211

mais pour les structures

Pocolo
Pocolo
Niveau 10
28 février 2012 à 21:57:01

Désolé mais c'est bien un tri insertion et il est bien correct, je sais que c'est peut-être dur à voir ici mais j'en suis assez certain.

Pocolo
Pocolo
Niveau 10
28 février 2012 à 22:05:51

Et autrement regarde bien les arguments que tu transmets dans l'appel de la fonction finsertion à la ligne 413 :

finsertion((pstrucIND-nbc+1), nbc,(pstrucIND-nbc+1));

Y'a comme un problème là il me semble. :(

poupstm2
poupstm2
Niveau 29
28 février 2012 à 22:08:19

ca c'est dans mes tentatives de débugages :D

a la base il passe
finsertion(pstrucIND,nbc,&tempo);

Pocolo
Pocolo
Niveau 10
28 février 2012 à 22:10:02

" finsertion(pstrucIND,nbc,&tempo); "

Et là à quoi correspond chaque argument?

poupstm2
poupstm2
Niveau 29
28 février 2012 à 22:13:14

pstrucIND c'est l'adresse de la première cases du vecteur de structures d'index

nbc c'est le nombre de fiches existantes

&temp c'est une structure temporaire qui contient les données à indexer (NumCarteSis, nom, prénom, position)
(mais il me semble qu'elle ne sert a rien et peut être remplacé par pstruncIND+nbc-1)

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment