Page 1 of 2

Problème de programmation basique

Unread postPosted: 07 Dec 2012, 20:30
by Martellus
Bonjour à tous et toutes,

Je viens vous demander votre aide sur la création d'un programme sur TI-Nspire CX CAS (sachant que je viens originellement de la TI 82 ...)

Voilà ce que j'ai écris pour le moment :
Code: Select all
Define ds2()=
Prgm
:Local a,b,n,k,u,v
:RequestStr "a=",a
:RequestStr "b=",b
:RequestStr "n=",n
:a→u
:b→v
:0→k
:While k<n
:k+1→n
:((a+b)/(2))→u
:√(((a^(2)+b^(2))/(2)))→v
:u→a
:v→b
:EndWhile
:Disp u,v
:EndPrgm


L'algorithme est issu d'un DS de Terminale (quand j'ai passé le DS j'étais sur TI82 et je n'ai eu aucun problème, mais maintenant pour le retranscrire sur N-Spire CAS j'ai des difficultés)
J'ai différentes questions suite à cela :
- A quoi sert ce que l'on peut (doit ?) mettre en parenthèses après le nom de l'algorithme ? Define ds2()=
- Je lance le programme, il me demande les variables : a=4, b=9, n=2
Puis il me donne une erreur : "Le test n’a pas donné de résultat TRUE ou FALSE." au niveau du "While" Ce que je ne comprends pas parce que j'ai assigné 2 à n et 0 à k.

Voila les deux problèmes rencontrés.
J'espère que vous pourrez m'aider,
Merci.

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 20:49
by Excale
Bonsoir,

Martellus wrote:- A quoi sert ce que l'on peut (doit ?) mettre en parenthèses après le nom de l'algorithme ? Define ds2()=

Il servent à donner des valeurs au programme dès le lancement au lieu que ce soit au programme de te les demander (elles deviennent automatiquement "local")

En pratique:
Code: Select all
Define ds2(a,b,n)=
Prgm
:Local k,u,v
:a→u
:b→v
:0→k

Il te faudra alors lancer le programme de la sorte: ds2(2,5,9) (nombres pris au hasard).

Martellus wrote:Puis il me donne une erreur : "Le test n’a pas donné de résultat TRUE ou FALSE." au niveau du "While" Ce que je ne comprends pas parce que j'ai assigné 2 à n et 0 à k.

RequestStr retourne une chaine de caractères, et non un nombre :).

Une remarque de plus, il est plus logique d'écrire u:=a que a→u (même si ça fait exactement la même chose :) ).

Code: Select all
Define ds2(a,b,n)=
Prgm
:Local k,u,v
:u:=0
:v:=b
:k:=0
:While k<n
:n:=k+1
:u:=((a+b)/(2))
:v:=√(((a^(2)+b^(2))/(2)))
:a:=u
:b:=v
:EndWhile
:Disp u,v
:EndPrgm


Edit: encore une remarque de plus, la variable "u" ne sert à rien, de même que la ligne v:=b
D'où:
Code: Select all
Define ds2(a,b,n)=
Prgm
:Local k,v
:k:=0
:While k<n
:n:=k+1
:v:=√(((a^(2)+b^(2))/(2)))
:a:=((a+b)/(2))
:b:=v
:EndWhile
:Disp u,v
:EndPrgm


Edit2: Il me semble fort que la ligne "n:=k+1" soit en réalité "k:=k+1". Dans ce cas, il vaux mieux utiliser un for :).
Code: Select all
Define ds2(a,b,n)=
Prgm
:Local k,v
:For k,0,n-1
:v:=√(((a^(2)+b^(2))/(2)))
:a:=((a+b)/(2))
:b:=v
:EndFor
:Disp u,v
:EndPrgm


Edit3: Juste pour le fun d'avoir un code encore plus optimisé :P :
Code: Select all
Define ds2(a,b,n)=
Func
:a:={approx(a),approx(b)}
:For b,0,n-1
:a:={((a[1]+a[2])/(2)),√(((a[1]^(2)+a[2]^(2))/(2)))}
:EndFor
:EndFunc

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 20:59
by Hayleia
Excale wrote:Une remarque de plus, il est plus logique d'écrire u:=a que a→u (même si ça fait exactement la même chose :) ).

Cela n'est ni plus logique ni moins logique (et de toute façon, comme tu dis c'est pareil). On peut trouver autant d'arguments pour → que pour :=, je t'en donne trois en faveur du → par exemple

Sachant qu'il vient d'une 82 (d'après ses dires), il est plus logique pour lui de mettre →.
En plus, a→u peut se lire de gauche à droite "on met a dans u" alors que, toujours de gauche à droite, u:=a se lirait "on met dans u a" ce qui n'est pas très français :P
Enfin, ce que fait la calculatrice derrière quand tu écris a→u ou u:=a, c'est bien d'abord évaluer a puis le mettre dans u, donc le a vient avant le u.

Bref, chacun ses préférences ;)

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 21:06
by Martellus
Merci pour cette réponse rapide.
J'ai eu l'habitude d'assigner avec "→", voilà le pourquoi en effet. Et oui je pense à chaque fois "a est assigné à u".
Le RequestStr = RequestString en fait ? D'où le fait qu'il renvoie à une chaine de caractères.
Et donc si je veux faire une demande de variable, non pas dès la "formule d'ouverture" du programme, mais après son lancement (comme cela se fait sur les TI82), je dois utiliser Request tout simplement ?

EDIT : je regarde tes EDITs et je te tiens au courant.

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 21:08
by Excale
Ben, pour la peine, je donne trois arguments en faveur du := :D :
-La plupart des langages utilisent ça (souvent sous la forme d'un simple = mais bon)
-Ça peut se lire: "u prend la valeur a", ce qui est français.
-On voit directement quelle est la variable modifiée, alors qu'avec le sto, on est obligé de déplacer son regard en fin de ligne.

Mais bon, comme tu le dis, à partir du moments où tu es plus à l'aise avec l'un de deux, autant utiliser celui que tu préfères.

Et donc si je veux faire une demande de variable, non pas dès la "formule d'ouverture" du programme, mais après son lancement (comme cela se fait sur les TI82), je dois utiliser Request tout simplement ?

Oui.

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 21:23
by Martellus
Ok, alors j'avais une erreur au niveau de la première instruction après le While.
Ce qui me donne :
Code: Select all
Define ds2()=
Prgm
:Local a,b,n,k,u,v
:Request "a=",a
:Request "b=",b
:Request "n=",n
:a→u
:b→v
:0→k
:While k<n
:k+1→k
:((a+b)/(2))→u
:√(((a^(2)+b^(2))/(2)))→v
:u→a
:v→b
:EndWhile
:Disp "u=",u,"; v=",v
:EndPrgm

En partant de ça, qu'est ce qui serait inutile concrètement ?
Sachant que mon habitude du "sto→" est bien ancrée et que je préfère que le programme me demande le a, b et c ? (enfin pour de simples programmes de cours de maths pour le moment)

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 21:29
by Excale
Martellus wrote:En partant de ça, qu'est ce qui serait inutile concrètement ?

Code: Select all
Define ds2()=
Prgm
:Local a,b,n,k,u,v
:Request "a=",a
:Request "b=",b
:Request "n=",n
:a→u
:b→v
:0→k
:While k<n
:k+1→k
:((a+b)/(2))→u
:√(((a^(2)+b^(2))/(2)))→v
:u→a
:v→b
:EndWhile
:Disp "u=",u,"v=",v
:EndPrgm


J'inverse deux lignes:
Code: Select all
Define ds2()=
Prgm
:Local a,b,n,k,u,v
:Request "a=",a
:Request "b=",b
:Request "n=",n
:a→u
:b→v
:0→k
:While k<n
:k+1→k
:√(((a^(2)+b^(2))/(2)))→v
:((a+b)/(2))→u
:u→a
:v→b
:EndWhile
:Disp "u=",u,"v=",v
:EndPrgm


ON voit alors que le u est inutile:
Code: Select all
Define ds2()=
Prgm
:Local a,b,n,k,v
:Request "a=",a
:Request "b=",b
:Request "n=",n
:a→u
:b→v
:0→k
:While k<n
:k+1→k
:√(((a^(2)+b^(2))/(2)))→v
:((a+b)/(2))→a
:v→b
:EndWhile
:Disp "u=",u,"v=",v
:EndPrgm


Et le a→u et b→v sont inutile aussi :) :
Code: Select all
Define ds2()=
Prgm
:Local a,b,n,k,v
:Request "a=",a
:Request "b=",b
:Request "n=",n
:0→k
:While k<n
:k+1→k
:√(((a^(2)+b^(2))/(2)))→v
:((a+b)/(2))→a
:v→b
:EndWhile
:Disp "u=",u,"v=",v
:EndPrgm

Et il serait mieux d'utiliser une boucle for au lie d'une boucle while. Cf mon premier post.

Martellus wrote:Je préfère que le programme me demande le a, b et c ? (enfin pour de simples programmes de cours de maths pour le moment)

Perso je trouve que c'est beaucoup plus rapide de taper directement les arguments en entrée. Mais encore une fois, fais comme tu veux.

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 22:13
by Martellus
J'ai utilisé le While parce que l'algorithme considéré de l'exercice faisait mention de "TANT QUE k<n".
Le a→u et b→v sont inutiles seulement si dès le début k<n par contre : avec n=0 ça donnerait une erreur.

Je vais continuer l'exploitation de la calculatrice, et je repasserais dans la section si cela m'est nécessaire.
Ce qui est sûr c'est que je vais passer du temps sur le site, il est fort intéressant ;)

En tout cas merci beaucoup pour votre aide et bonne soirée :)

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 22:15
by Richou-D-Hunter
N'oublie pas le chat, y'aure sûrement quelqu'un pour te répondre ! :)

Re: Problème de programmation basique

Unread postPosted: 07 Dec 2012, 22:32
by Bisam
Au jeu de l'optimisation, on peut battre Excale à plates coutures :
Code: Select all
Define ds2(a,b,n)=
Func
a:=approx({a,b})
For b,1,n
a:={mean(a),√(mean(a^2))}
EndFor
EndFunc