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

Problème Tri en C !!

le_gameur1
le_gameur1
Niveau 8
27 février 2009 à 14:12:56

slt tout le monde,j'ai vraiment un enrome problème dans le tri de ma liste chainée,ya aucune erreur dans la compilation mais la liste n'est trièe,en fait le prog me trie juste les 3 premiers elements et il m'affiche deux 0 en + des trois element bien entendu,car j'ai 5 element dans la chaine.
voila je vous explique le prog:il s'agit d'appliquer les algorithme d'ordonencement d'un OS(tourniquet,FCFS...) sur des processus qui sont dans une liste chainés,j'ai 5 processus au totale.en fait j'ai testé bcp de methodes mais aucune n'a marché voila madernière methode ,il sagit de choisir le nombre minimum dans la liste puis l'inserer dans une autre liste chainées ainsi de suite...
voila le code source:

  1. include<stdio.h>
  2. include<conio.h>
  3. include<alloc.h>
  4. include<stdlib.h>

struct proc
{
int code;
int da;
int te;
int pri;
proc *suiv;
};

///////FONCTION d'acceuil///////
char MenuG(void)
{ char ch;

window(1,1,80,1);textbackground(15);clrscr();textc
olor(1);
gotoxy(30,1);cprintf("GESTION DES POLYNOMES");

window(1,2,80,25);textbackground(0);clrscr();textc
olor(1);
gotoxy(10,5); printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿");
gotoxy(10,6); printf("³ ³");
gotoxy(10,7); printf("³ MENU PRINCIPALE ³");
gotoxy(10,8); printf("³ ³");
gotoxy(10,9); printf("³ <1> CREER UN PROCESSUS ³");
gotoxy(10,10);printf("³ <2> APPLIQUER LES ALGORITHMES ³");
gotoxy(10,11);printf("³ <3> COMPARAISON ³");
gotoxy(10,12);printf("³ <ESC>QUITTER ³");

gotoxy(10,13);printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÙ");
gotoxy(10,14); printf("ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿");
gotoxy(10,15); printf("³ Votre Choix : ³");
gotoxy(10,16); printf("ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ");
gotoxy(35,15);ch=getche();clrscr();
return ch;
}
void main()
{char chg;
int i,k,h,j;
proc *prem,*n,*prec,*p,*min,*premier,*l,*l2;
clrscr();
do{
chg=MenuG();
switch(chg)
{
case '1':
prem=(proc *)malloc(sizeof(proc));
prem->code=1;
prem->da=random(6-1);
prem->te=random(8-1);
prem->pri=random(5-1);
prem->suiv=NULL;

for(i=0;i<4;i++)
{
n=(proc *)malloc(sizeof(proc));
n->code=i+2;
n->da=random(6-1);
n->te=random(8-1);
n->pri=random(5-1);
n->suiv=prem;
prem=n;
}
/*TRI par date d'arriv‚*/
for(i=0;i<4;i++)
{

min=p=prem;

p=p->suiv;
for(j=0;j<4-i;j++)
{
if(min->da>p->da)
{
min=p;
}
p=p->suiv;
}
if(i==0)
{
l=(proc *)malloc(sizeof(proc));
l->code=min->code;
l->da=min->da;
l->te=min->te;
l->pri=min->pri;
l->suiv=NULL;
}

else
{
l2=(proc *)malloc(sizeof(proc));
l2->code=min->code;
l2->da=min->code;
l2->te=min->te;
l2->pri=min->pri;
l2->suiv=l;
l=l2;
}
}

for(i=0;i<5;i++)
{
printf("\n %d",(l)->da);
l=l->suiv;
}

break;

case '2':
printf("\n appliquation");
break;
case '3':printf("comparaison");
}
getch();
}while(chg!=27);
}

ET MERCI POUR VOS REPONSES!!
vraiment ça serait synpa pour celui qui va m'aider car je dois rendre le mini projet le lundi.

le_gameur1
le_gameur1
Niveau 8
27 février 2009 à 15:30:12

c'est bon j'ai resolu le problème,c'etait vraiment bete j'ai pas fait attention ^^"

void main()
{char chg;
int i,k,h,j;
proc *prem,*n,*prec,*p,*min,*premier,*l,*l2;
clrscr();
do{
chg=MenuG();
switch(chg)
{
case '1':
prem=(proc *)malloc(sizeof(proc));
prem->code=1;
prem->da=random(6-1);
prem->te=random(8-1);
prem->pri=random(5-1);
prem->suiv=NULL;

for(i=0;i<4;i++)
{
n=(proc *)malloc(sizeof(proc));
n->code=i+2;
n->da=random(6-1);
n->te=random(8-1);
n->pri=random(5-1);
n->suiv=prem;
prem=n;
}
/*TRI par date d'arriv‚*/
for(i=0;i<4;i++)
{

min=p=prem;

p=p->suiv;
for(j=0;j<4-i;j++)
{
if(min->da>p->da)
{
min=p;
}
p=p->suiv;
}
if(i==0)
{
l=(proc *)malloc(sizeof(proc));
l->code=min->code;
l->da=min->da;
l->te=min->te;
l->pri=min->pri;
l->suiv=NULL;
}

else
{
l2=(proc *)malloc(sizeof(proc));
l2->code=min->code;
l2->da=min->code; /=>VOILA LE BLEM j'affecte le code àdate<=
l2->te=min->te;
l2->pri=min->pri;
l2->suiv=l;
l=l2;
}
/*et ICI AUSSI j'ai donnée à min->da=30 pour qu'il ne tombe pas sur le meme min la prochaine fois*/
}

for(i=0;i<5;i++)
{
printf("\n %d",(l)->da);
l=l->suiv;
}

break;

case '2':
printf("\n appliquation");
break;
case '3':printf("comparaison");
}
getch();
}while(chg!=27);
}

MEME SI LE FORUM DORT UN PEU PAR RAPPORT ACELUI DE LA PS3 et LA X360,mais bon merci quand meme ^^" !!

godrik
godrik
Niveau 30
27 février 2009 à 17:39:41

je pense que ton probleme principal vient du fait que ton code est mal ecrit et qu'il est du fait incomprehensible.

Utilises des fonctions, ca va rendre ton code vachement plus lisible.
et arrete les magic numbers 'for(i=0;i<5;i++)'
Pourquoi 5, pourquoi pas 42 ?
Ah oui, parceque tu n'as que 5 elements dans ta liste. C'est pour ca que l'on met le dernier element de la liste chaine a NULL pour pouvoir detecter l'arret. Ainsi tu n'as plus besoin de te trimbaler le nombre d'element de ta liste.

"MEME SI LE FORUM DORT UN PEU PAR RAPPORT ACELUI DE LA PS3 et LA X360,mais bon merci quand meme ^^" !! "
Desole, je n'etais pas encore au boulot.

Sinon pour la prochaine fois, utilise un wall pour poser ton code et pas ce forum qui casse l'indentation. Par exemple http://pastebin.com/

En passant, quand on fait ce genre de code, je rappelle qu'il y a des outils magiques: gcc avec tous les warnings
lint et ces derives: clint, splint... (des verificateurs statiques de code)
valgrind pour detecter tous les comportement bizarre sur la memoire.

Finalement, une liste chaine m'a l'air d'etre le mauvais choix pour la gestion des processus. Tes seules operations etant recuperer le min et ajouter un element, un tas m'a l'air beaucoup plus adapte. (mais ce n'etait probablement pas le sujet de ton enonce.)

le_gameur1
le_gameur1
Niveau 8
27 février 2009 à 18:03:42

slt godrik ,pour la boucle de 5 elements c'est pas mon idée mais c'est le prof qui nous a fixé le nombre,donc moi aussi je comprends pas comme toi ,quel est l'interet d'utiliser les listes chainées si on connait deja le nombre d'elements,on pourait tout simplement utiliser les tableaux

le_gameur1
le_gameur1
Niveau 8
27 février 2009 à 18:05:45

et à ce qui concerne les fonctions je vais les utiliser bien entendu,ce prog c'est juste pour tester :ok: et merci encore une autre fois !!

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