Saisir une liste de nombres

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Saisir une liste de nombres

Message par insan » mar. avr. 10, 2012 8:32 am

Bonjour,

Voici une partie du code qui s'exécute de manière incorrecte :

Code : Tout sélectionner

saisir("p = ? ",p);
pour k de 1 jusque p faire
saisir("V[",k-1,"] = ",V[k-1]);
fpour;
Ensuite j'ai modifié la commande de la boucle POUR en :

Code : Tout sélectionner

afficher("V[",k-1,"] = "); saisir(V[k-1]);
mais ça réagit pareillement.

Merci pour toute aide.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Saisir une liste de nombres

Message par alb » mar. avr. 10, 2012 9:17 am

Peut-être quelque chose de ce style ?

Code : Tout sélectionner

SaisirListe():={
  local p,L,k;
  saisir("p = ? ",p);
  L:=[0$p];
  pour k de 1 jusque p faire
    saisir("entrez la valeur numéro "+k,L[k-1]);
  fpour
  retourne L
}:;
Si tu veux conserver ta syntaxe pour saisir, je pense qu'il faut faire plutôt:

Code : Tout sélectionner

saisir("V["+(k-1)+"] = ",V[k-1])

insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Re: Saisir une liste de nombres

Message par insan » mar. avr. 10, 2012 9:54 am

Merci ...

J'ai toujours le même problème : une fenêtre qui s'affiche où est marqué "p = ?" et qui attend une valeur et après d'autre fenêtres du même style qui attendent à saisir des valeurs MAIS sans un message écrit (comme plus haut avec : p = ?) et aussi sans prendre en compte les valeurs saisies ...

insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Re: Saisir une liste de nombres

Message par insan » mar. avr. 10, 2012 10:39 am

Je viens d'installer la nouvelle version (0.9.6) et maintenant ça marche SAUF que dans la fenêtre invitant à saisir les valeurs de la liste, il est toujours affiché L[k-1] ... je ne sais pas s'il y aurait une possibilité pour que la valeur de k change à chaque demande de saisie ?

Merci.

parisse
Messages : 5084
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Saisir une liste de nombres

Message par parisse » mar. avr. 10, 2012 11:08 am

Il faut definir V avant comme une liste et mettre des + dans saisir pour concatener les chaines avec la valeur numerique. Vous pouvez utiliser des () pour l'adressage en commencant a 1 ce qui donnerait ici

Code : Tout sélectionner

V:=[];
saisir("p = ? ",p);
pour k de 1 jusque p faire
saisir("V("+k+") = ",V(k));
fpour;
Attention toutefois a ne pas ecrire V(k):=qqchose, sinon il definira une fonction. Avec des crochets ca donnerait

Code : Tout sélectionner

V:=[];
saisir("p = ? ",p);
pour k de 1 jusque p faire
saisir("V["+k-1+"] = ",V[k-1]);
fpour;

insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Re: Saisir une liste de nombres

Message par insan » mar. avr. 10, 2012 1:06 pm

Merci pour votre réponse ... mais j'obtiens toujours le message V(k)= qui m'invite à saisir une valeur de la liste : c'est-à-dire que j'obtiens le nom de la variable k et nom pas valeur (qui change à chaque saisie)...

Autre chose : le retour de ce programme dans le "niveau des réponses" donne des nombres entre ( ) et [ ] correspondant apparemment aux valeurs de différentes variables du programme. Y aurait-il une possibilité pour éviter cet affichage ?

Dernière chose : Existerait-t-il une commande permettant de fixer le nombre de décimales pour les valeurs des variables affichées ? Je voudrais éviter l'utilisation de evalf() pour ne pas encombrer les expressions. La commande Digits est similaire mais fixe le nombre total de chiffres.

Merci infiniment d'avance.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Saisir une liste de nombres

Message par alb » mar. avr. 10, 2012 2:46 pm

Sur ces 3 points:
1/ saisir("L["+(k-1)+"] = ",L[k-1]) marche tres bien, je ne comprends pas
2/ pour la valeur de retour c'est une séquence ou une liste ce qui permet d'appeler la fonction SaisirListe
dans une autre fonction, par exemple:

Code : Tout sélectionner

SaisirListe():={
  local p,L,k;
  saisir("p = ? ",p);
  L:=[];
  pour k de 1 jusque p faire
    saisir("L["+(k-1)+"] = ",L[k-1]);
  fpour
  retourne L
}:;
SommeCarres():={
  local L,s,res,k;
  L:=SaisirListe();
  s:=dim(L);
  res:=0;
  pour k de 0 jusque s-1 faire
    res:=res+L[k]^2
  fpour
  retourne res
}:;
3/ round(pi,3) renvoie 3.142

insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Re: Saisir une liste de nombres

Message par insan » mar. avr. 10, 2012 4:52 pm

Merci pour cette réponse détaillée ...

En fait, je voudrais présenter ce programme sous forme "classique" et non pas sous forme d'une fonction...

Sinon, je dois dire que la commande:

Code : Tout sélectionner

saisir("L["+(k-1)+"] = ",L[k-1]);
donne une fenêtre avec le message :
L[k-1]

Alors que la commande

Code : Tout sélectionner

saisir("L[k-1] = ",L[k-1]);
donne le message :
"L[k-1]="

Et donc presque la même chose (la variable k ne varie pas) ... (j'utilise la version 0.9.6 sous Windows Vista)

Une question : quelle est la différence entre evalf(pi,3) et round(pi,3) ?

Merci.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Saisir une liste de nombres

Message par alb » mar. avr. 10, 2012 9:04 pm

Je vais essayer de décrire ce qui se passe chez moi (0.9.7 sous linux)
Dans une ligne de commande je tape (remarque: les :; c'est pour ne pas afficher le résultat)

Code : Tout sélectionner

saisir("p = ? ",p):;
L:=[]:;
pour k de 1 jusque p faire
saisir("L["+(k-1)+"] = ",L[k-1])
fpour:;
Je valide
"p=?"
Je tape 3 et je valide
"L[0]="
Je tape 5 et je valide
"L[1]="
Je tape 6 et je valide
"L[2]="
Je tape 7 et je valide
Puis je vérifie que L contient la liste [5,6,7] et que p contient 3
En apparence aucune difficulté !

Pour evalf et round je pensais que evalf(...,5) donnait 5 chiffres significatifs et
round(...,5) 5 chiffres après la virgule, mais c'est la même réponse, du coup je ne sais plus bien quelle est la différence !

parisse
Messages : 5084
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Saisir une liste de nombres

Message par parisse » mer. avr. 11, 2012 8:27 am

en effet, il n'y a pas de difference entre round et evalf si le nombre de digits est <14 en tout cas.

insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Re: Saisir une liste de nombres

Message par insan » mer. avr. 11, 2012 11:11 am

Bonjour,

alb,
J'ai exécuté le code que tu as donné et voici ce que ça me donne (je reprends ton post) :
Je valide
"p=?"
Je tape 3 et je valide
"L[k-1]="
Je tape 5 et je valide
"L[k-1]="
Je tape 6 et je valide
"L[k-1]="
Je tape 7 et je valide


Et rien n'est affiché comme réponse sauf le (Done, Done, Done) dans le niveau de réponse grâce aux :; (merci pour cet idée !)

Par contre si j'ajoute dans la boucle la ligne :

Code : Tout sélectionner

afficher("L["+(k-1)+"] = "+L[k-1]);
Je vois affiché en dessous du programme :

L[0]=5
L[1]=6
L[2]=7


Peut-être que ce "problème" viendrait de la version 0.9.6 par rapport à la 0.9.7 ...

Merci beaucoup en tout cas.

alb
Messages : 1229
Inscription : ven. août 28, 2009 3:34 pm

Re: Saisir une liste de nombres

Message par alb » mer. avr. 11, 2012 1:27 pm

Je viens d'essayer sous windows avec la 0.9.6, effectivement le (k-1) n'est pas évalué dans saisir
Reste à savoir si c'est un pb de version ou d'OS

parisse
Messages : 5084
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Saisir une liste de nombres

Message par parisse » mer. avr. 11, 2012 3:36 pm

Ca semble plutot etre un pb d'OS, ca ne marcherait pas sous win et mac.
(Info pour moi: inputform_pre_analysis non appele dans Xcas_debugger lorsque status==3 et v non vide, c'est peut-etre la cause).

insan
Messages : 12
Inscription : dim. oct. 23, 2011 3:46 pm

Re: Saisir une liste de nombres

Message par insan » mer. avr. 11, 2012 4:53 pm

J'espère que ce problème finira par être contourné dans la (ou les) prochaine(s) version(s)...

parisse
Messages : 5084
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Saisir une liste de nombres

Message par parisse » mer. avr. 11, 2012 7:42 pm

Si c'est bien ce que j'ai indique, il ne devrait pas y avoir de problemes, je mettrai ca dans la 0.9.7.

Répondre