Tri shell : problème de décalage
salut les programmeurs ;
J'ai un petit problème concernant le tri Shell ;
voilà tout dabord son code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| procedure trishell (var t:tab; n:integer ) ;
var p,i,j,v: integer;
begin
p:=0;
while p<= n do
p:= 3*p+1;
while p <> 0 do
begin
p:=p div 3;
for i:= p to n do
begin
v:=t[i];
j:=i;
while (j > p-1) and (t[j-p] > v ) do
begin
t[j]:=t[j-p];
j:=j-p;
end;
t[j]:=v;
end;
end;
end; |
et le problème se trouve au niveau de décalage ; c'est à dire au niveau :
Citation:
while (j > p-1) and (t[j-p] > v ) do
cette instruction va nous amener à l'indice zéro (t[0] ) !!!! c'est mon problème ? est alors ! y-a-t-il une solution ?
une remarque tres importante : si ma remarque concernant cette boucle est dans sa place, alors les livres scolaires (4 ieme SI) est aussi mal rédiger :roll:
car ils comportes tous cette solution ?
MErci d'avance :yaisse2:
Non je dit bien il y a un problème !!
Citation:
Envoyé par
benmansouran
il n'y a pas de problème dans ton procédure
Non Mr Benmansouran !! pour moi, il y a un problème, j'explique encore ;
au niveau de la boucle :
Citation:
while ( (j>p-1) and (t[j-p]) ) do
t[i] := t[j-p]
......
précisament c'est au niveau de : ; cette instruction va donner t[0] qui est impossible en Pascal !!:(
j'ai besoin d'aide pour comprendre comment se fonctionne cette boucle ?
Merci d'avance :)
voila mon vrai problème avec tri shell
Citation:
Envoyé par
droggo
Gio,
D'où tires-tu ça ?
En Pascal, on peut même avoir des indices négatifs, tout dépend de la manière dont on définit le type pour le tableau. :)
Au nivau de (while), la comparaison se fait ente t[0] et aux . c'est vrai ou non !
tandis que la valeur de t[0] ne figure pas dans T !! voila mon vrai problème.
car T commence dans sa declaration par [1..50] par exp.
et si vous voulez j'explique comment T[0] ? :
- On a : i := p (for i:= p to n Do) ; ensuite aux := T[i] ; puis j:= i ; enfin
on arrive au pble ; c'est lorsque :
- On a while (j>p-1 and T[j-p]>aux) Do ????? dans ce cas là, je n'interresse pas est ce que turbo Pascal accepte ou non T[0] ; mais quelles la valeur de T[0] ???? voila mon vrai pble !!! :arf: et Merci.
meme problème (autre formulation)
Citation:
Envoyé par
droggo
Gio,
Je répondais à l'affirmation
cette instruction va donner t[0] qui est impossible en Pascal !!
Qui est parfaitement fausse sans autre information, et je précisais que cela dépendait de la définition du type pour le tableau, que nous ne trouvions nulle part jusqu'à ce que tu viennes nous le donner.
Ma boule de cristal est en panne (pour deviner cette définition), mais cela ne m'empêche pas de répondre à ce genre d'affirmation dans le vide : sans information suffisante, elle est fausse. Point.
Mon problème : est ce que dans ce programme le tableau T commence par l'indice 0 ou non ?
le problème resiste encore pour moi !!!
Citation:
Envoyé par
haythem78
le code n'est pas érroné mais tous simplement basé sur le langage C et pas Pascal
en tous cas c'est bien de trouver quelques fautes veut dire que tu es un bon programmeur:king:
mais fait attention les indices d'un tableau en pascal dépend que de la déclaration veut dire on peut retrouver t[0] autrement le code sera juste si on déclare t:array[0..100]of integer; par exemple8O
bien c tous bon travail
Merci haythem ,ainsi tous les autres programmeurs qui ont participés ;
mais cette faute se trouve dans le manuel scolaire (4 si ) :( c'est pour cela je suis sur le point d'affirmer que le tableau commence par l'indice 0 , car cela se trouve dans ce livre scolaire. mais pas problème car j'ai la traversée.
merci encore. :)