Posté le 25/02/2012 à 00:09 Membre depuis le 25/04/2011, 6 messages
Bonjour,
Voila j'essaie de coder un petit programme sur lequel je bloque complètement.
A vrai dire, je suis vraiment pas familier des listes, j'ai cherché un peu sur internet, mais pour les ti89 les informations sont peu nombreuses.
Donc voila mon problème.
J'ai 2 listes de valeurs, on va les appeler l1 et l2.
Mon but est de ranger les 2 listes dans un ordre croissant de valeurs.
Et ensuite de comparer les deux listes tel que les termes de la liste contenant le moins d'éléments se voit attribuer un rang pour ensuite calculer la somme des rangs.

Par exemple :
l1 : 1 5 7
l2 : 4 6 2 9
Apres avoir rangé :
l1 : 1 5 7
l2 : 2 4 6 9
Le tout mélangé et rangé : 1 2 4 5 6 7 9
1 occupe le premier rang, 5 occupe le 4eme rang et 7 occupe le 6ème rang
Rang total = 1 + 4 + 6 = 11

Je trouve aucun moyen de faire ca sans mettre une bonne dose de if partout (rendant le code juste horrible), mais encore une fois je suis pas très habile en basic.

Pour tout dire, je bloque sur la manipulation des listes :
- Comment remplir la liste de manière "dynamique" ? En gros, avec un Input "Nombre de valeur",n puis mettre les n éléments.
Mon problème sur ce point est que je ne sais mettre des valeurs que de manière isolée, en redéfinissant la liste.
De la façon suivante : {a} -> l1
Bien sûr, je me doute qu'il doit y avoir une façon de rajouter des valeurs à une liste existante (ce qui ma faciliterais la tâche, j'aurais plus qu'à mettre en oeuvre un For), mais j'ai beau avoir cherché j'ai rien trouvé de simple pour la ti89 sad

- Et surtout, comment fusionner les 2 listes en gardant un "marqueur" de l'origine de la liste ?
J'ai une petite idée la dessus, mais je sais pas si c'est possible de ranger une liste selon la valeur absolue des élements, c'est faisable ?
Je m'explique, mon idée serait de définir 2 listes, une contenant un nombre n1 d'elements, une autre contenant un nombre n2 d'elements.
A l'aide d'une condition je dirais que si n1 < n2 alors -l1 -> l1 et sinon -l2 -> l2.
J'aurais alors "marqué" la liste des elements qui m'interesse à l'aide du signe moins.
Puis en fusionnant les 2 listes (j'ai vu qu'il y avait une fonction pour ca), j'aurais plus qu'à classer les 2 listes selon leurs valeurs absolue.
Si c'est pas faisable, une autre idée serait de créer une deuxieme liste, copie de la premiere ou j'applique la fonction valeur absolue.
Puis je demande à classer les 2 listes, selon la seconde liste, en gardant la relation entre les 2 (c'est à dire, que la premiere valeure de la premiere liste doit rester associer à celle de la seconde liste). J'ai cru comprendre que cela est faisable, non ?

Que pensez-vous de mon idée ?

- Mon dernier problème est, si j'arrive jusque la, comment récuperer le rang des valeurs "marqués" (dans mon idée, celles qui portent un signe moins)
Je pourrais faire ca à l'aide de conditions, en testant chaque valeur, mais cela n'est pas un peu bourrin comme méthode ?
Si je choisi cette méthode, alors comment isoler une valeur de la liste ? Encore une fois, en cherchant sur internet, j'ai trouvé que des méthodes (très simples) ne fonctionnant pas sur Ti83

Voila, voila
Merci de votre éventuelle aide smile
Posté le 25/02/2012 à 00:20 Membre depuis le 18/06/2001, -26078 message
Pour une liste L de n éléments, tu peux écrire ça :

15->L[x]
Avec x compris entre 1 et n

42->L[n+1]
Ca va ajouter un élément à la fin de la liste.


Pour ce que tu veux faire, fusionner et trier les listes, je pense que ça devrait marcher :
augment(list1,list2)->list3
SortA list3

La première instruction ajoute list2 au bout de list1, et stocke le résultat dans list3
La seconde trie list3

Le problème est que ça ne garde pas de trace de l'origine des élément. Je reviens sur ce point dans le post suivant.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 25/02/2012 à 00:35 Membre depuis le 25/04/2011, 6 messages
Merci pour la rapidité de ta réponse smile
J'attend avec impatience le post suivant ^^

Concernant :

15->L[x] et 42->L[n+1]

Je ne comprend pas trop leurs utilisation sad
l5 représente quoi ? Ma liste ? Une valeur à mettre dans la liste ?
Idem, L represente quoi ?
Serait-il possible d'avoir un exemple de son utilisation si possible ? ^^'

En tout cas, merci smile
Posté le 25/02/2012 à 01:00 Membre depuis le 18/06/2001, -26078 message
Ah, c'est pas l5, mais 15, quinze.

J'ai pris 15 au hasard, mais ça veut dire que tu peux attribuer une valeur particulière à n'importe quel élément de la liste
L représente une liste, que j'ai appelé L.

Par exemple :
newList 4 -> a
Ca crée une liste de 4 éléments, initialisés à 0:
a = {0, 0, 0, 0}


Si je fais
6 -> a [2]
Ca donne :
a = {0, 6, 0, 0}
Ca perme de donner une valeur à un élément de a


Si maintenant je veux rajouter lavaleur 8 à la fin de a :
8 -> a (dim (a) + 1)
Ca donne :
a = {0, 6, 0, 0, 8}
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 25/02/2012 à 12:20 Membre depuis le 25/04/2011, 6 messages
Alors merci smile
J'ai réussis à mettre en oeuvre mon programme grâce à tes indications.
Ma méthode avec le signe moins et l'utilisation d'une liste parallele a marché sans soucis.
En gros j'ai fais ca :
augment (l1,l2)->l3
-l1->l1
augment (l1,l2)->l4
SortA l3,l4
J'obtenais donc une liste L4 rangé selon l'ordre de l3.
Ma liste l1 est caractérisé dans l4 par le fait que ses valeurs portent un signe moins par rapport à leurs équivalent dans l3.
Je les met donc en evidence par : l4(i)+l5(i)=0

En tout cas merci smile
(je faisais un programme pour automatiser les test statistiques non paramétriques de Mann Withney Wilcoxon pour ceux qui connaissent)
Posté le 25/02/2012 à 15:06Edité par Folco le 25/02/2012 à 15:45 Membre depuis le 18/06/2001, -26078 message
Désolé de pas avoir aidé pour la suite. Hier soir j'ai écrit presque tout l'algo, mais j'étais vraiment fatigué et j'ai dû arrêter. Aujourd'hui, Stephano joue, il est arrivé en demi et va jouer contre Puma.
Mais je te montrerai comment faire, il y a vraiment des fonctions avancées que tu peux utiliser, et qui résolvent ton problème en 20 lignes.
Regarde ls fonctions SortA, seq, left/mid/right pour te donner des idées.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Posté le 25/02/2012 à 15:43 Membre depuis le 25/04/2011, 6 messages
D'accord, j'aimerais bien voir pour ma curiosité personelle, mais le problème est résolue ^^ (mon programme marche sans problème, mais il fait plus de 20 lignes).
En fait le vrai problème était un peu plus complexe que celui que j'ai décris.
J'men suis rendu compte au fur et à mesure de ma réalisation.

Car en fait dans le test statistique en question, si une valeur apparaît plusieurs fois identique à elle même, il faut ne la prendre qu'une fois, et lui attribuer comme rang la moyenne des rangs de chacune de ses représentations.
Mais j'ai réussis à résoudre le problème, de façon pas très propre certes (le programme final fait 100 lignes environs) mais j'ai vraiment pas cherché l'optimisation, mon but était juste que ca marche smile