Page 1 of 2

Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 10:57
by AnToX98
Comment on fait pour supprimer un terme d'une liste en basic ?
Comme le sortD n'est pas utilisable dans une fonction, je suis obligé de me crée ma propre fonction de tri........

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:04
by Excale
Augment, left, right.

Mais pourquoi as-tu besoin de supprimer des termes?

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:09
by AnToX98
Voilà je n'ai pas fait avec augment mais comme je ne peux pas utiliser sort D dans une fonction, voici la mienne, mais elle aussi me dit : "Invalide dans la fonction courante " :(

Code: Select all
Define sortdecr(liste)=
Func
:Local i,maxs,nmax,nliste,listep
:nliste:={}
:For k,1,dim(liste)
:maxs:=""
:nmax:=0
:For i,1,dim(liste)
:  If dim(liste[i])>dim(maxs) Then
:    maxs:=liste[i]
:    nmax:=i
:  EndIf
:EndFor
:listep:={}
:For i,1,nmax-1
:  listep[dim(listep)+1]:=liste[i]
:EndFor
:For i,1,nmax+1
:  listep[dim(listep)+1]:=liste[i]
:EndFor
:liste:=listep
:nliste[dim(nliste)+1]:=maxs
:EndFor
:Return nliste
:EndFunc

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:12
by Excale
Dejà:

Code: Select all
:For k,1,dim(liste)
Stocke dim(liste) à part sinon il le recalcule à chaque tour de boucle.

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:15
by AnToX98
Argh il me dit : "Erreur : Invalide dans une fonction ou expression courante"

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:19
by Lionel Debroux
C'est quand même ballot qu'il n'y ait pas de fonction pour supprimer un terme au milieu d'une liste...
Ca se passerait très naturellement avec les fonctions du CAS, du genre next_expression_index() dans une boucle jusqu'à trouver l'élément d'index i (à supposer que i <= dim(list), bien sûr), ensuite next_expression_index() pour trouver l'index de l'élément i+1 (à supposer qu'il existe), et puis delete_between() / deleted_between() :(

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:20
by Excale
Utilise un vrai algo de tri aussi:
Au choix:
-quicksort
-mergesort
-heapsort

L’intérêt du mergesort c'est qu'il est le plus facile à coder.
L’intérêt des deux autres est qu'ils sont sur place.

Si tu es feignant:
http://www.ticalc.org/pub/nspire/basic/math/
ctrl+f quicksort

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 11:27
by Excale
Quand au pourquoi ça ne marche pas, c'est évident: k :P.

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 13:37
by Bisam
Pour être un peu moins sibyllin, k devrait lui aussi être déclaré comme variable locale.

Et pour supprimer le terme d'indice i de la liste L, tu tapes : augment(left(L,i-1),mid(L,i+1))->L.
Avec une Nspire, tu peux aussi faire ainsi :
Code: Select all
_->L[i]
delvoid(L)


Par ailleurs, sur une calculatrice, utiliser le quicksort ou le mergesort n'a aucun intérêt car les listes n'ont pas des tailles suffisamment grandes pour que le gain se fasse ressentir par rapport à un tri à bulle (ou un tri par insertion)
En plus, c'est d'autant moins intéressant qu'il est impossible de passer des paramètres par référence, ce qui fait que l'implémentation sur la calculette d'un mergesort ou d'un quicksort ferait en fait utiliser beaucoup plus de mémoire qu'un tri à bulle (ou par insertion) !

Re: Supprimer un terme d'une liste ?

Unread postPosted: 08 Jun 2014, 13:42
by Extra44
le k a été vu ... et corrigé (ca venait bien de cela) mais il restait un probleme sur son tri ...

Code: Select all
delVoid(List1) ->  list
Returns a list that has the contents of List1 with all empty (void)
elements removed


Pas mal ;) Bien vu Bisam !