Autorisation : Membre
Nb de messages : 4
Inscrit le : Jeu 16 Oct 2014, 22:56
Posté le : Jeu 16 Oct 2014, 23:41
Salut à tous,
Je voudrais faire un programme qui me permettrait de convertir un nombre donné d'une base X en une base Y avec les étapes de calcul.
Il y a t-il une possibilité de faire ceci en plus bien sûr du résultat final ?
Donc voici ce que j'aimerais faire :
Décimal > Binaire : divisions euclidiennes par 2
Décimal > Hexadécimal : divisions euclidiennes par 16
Binaire > Décimal : multiplications par les puissances de 2
Binaire > Hexadécimal : on coupe par paquet de 4 (il me semble)
Hexadécimal > Décimal : multiplications par les puissances de 16
Hexadécimal > Binaire : on regroupe les paquets de 4 (il me semble)
Affichage sur la calculette pour Décimal > Binaire :
Décimal : 68
68 / 2 Q = 34 R = 0
34 / 2 Q = 17 R = 0
17 / 2 Q = 8 R = 1
8 / 2 Q = 2 R = 0
4 / 2 Q = 2 R = 0
2 / 2 Q = 1 R = 0
1 / 2 Q = 0 R = 1
Résultat : 1000100
Pourquoi j'aimerais faire ça ? Simplement car, je suis en BAC PRO SEN (opt EIE) et on a besoin à chaque fois de convertir d'une base à l'autre (par exemple quand on doit dessiner des trames)... et parfois les profs veulent les détails qui nous ont permis de trouver le résultat final.
Donc vous imaginez bien que cela me serait clairement plus rapide.
PS : Je possède une TI-82 Stats.fr ainsi qu'une TI-83 Plus.fr
Autorisation : Membre
Nb de messages : 504
Inscrit le : Ven 07 Déc 2012, 20:09
Posté le : Ven 17 Oct 2014, 16:42
Bonjour à toi et bienvenue sur le forum Drym !
Citer : Drym
Y a t-il une possibilité de faire ceci en plus bien sûr du résultat final ?
C'est tout à fait possible avec des fonctions que je vais te donner !
Citer : Drym
Décimal > Binaire : divisions euclidiennes par 2
Décimal > Hexadécimal : divisions euclidiennes par 16
Binaire > Décimal : multiplications par les puissances de 2 Binaire > Hexadécimal : on coupe par paquet de 4 (il me semble)
Hexadécimal > Décimal : multiplications par les puissances de 16 Hexadécimal > Binaire : on regroupe les paquets de 4 (il me semble)
Pour les phrases en gras : dans mon souvenir, c'était bien plus long que ça à convertir. Mais rien ne vaut l'expérience, donc je te propose d'essayer déjà de coder ton programme sans les affichages spéciaux et d'avoir une base exploitable (histoire que déjà les conversions soient justes ! )
Bon, la partie qui va t'intéresser : les affichages.
Tu as peut être déjà entendu parler du Output(), une commande d'affichage qui te permet de placer tes affichages. Elle fonctionne comme ceci : Output(ligne,colonne, affichage).
Tu possèdes un écran matriciel de 8 lignes et 16 colonnes, la 1re ligne ou colonne étant la ligne ou colonne 1 (dans l'écran de calcul).
Ton code, avec cette commande, ressemblera à ça :
Code
://Menu pour le choix de la fonction
://labels et calculs des conversions
:...
:Output(X,Y,[texte avec blancs donnant la place d'afficher les valeurs]
:Output(X',Y',[valeurs affichées dans les blancs]
:...
Je sais pas si tu as bien compris le principe, je peux développer et expliciter si besoin !
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 17 Oct 2014, 20:34
Des programmes existent mais la plupart ne donnent pas les détails des calculs intermédiaires, donc ils ne manquent plus que d'affichages des données intermédiaires si tu veux les détails.
Celui de Mdr1 dans son tutoriel sur OpenClassrooms est le plus optimisé, et le mien ajoute une facilité de reconvertir plusieurs fois. Avec celui-ci tout est optimisé façon mdr1 et mon menu de restart.
Les groupements des puissances, par exemple utilisés pour échanger 2,4,8,16, ne sont pas une nécessité et les programmes de Mdr1 et moi ne sont pas conçus pour ça, donc c'est un algorithme qui reste encore à rédiger.
La fonction Texte() permet d'afficher plus de choses sur la même ligne puisque c'est plus petit, et c'est facile d'enchaîner du texte sur la même ligne, plus facile qu'Output().
Je combine toujours Output à des ClrHome s'il y a aussi des Disp, pour aligner correctement les rangées.
Tandis que l'affichage le plus basique, Disp, a aussi un équivalent avec la fonction Pause.
Pour économiser un peu, car c'est mon habitude, j'utilise la variable Ans (Rép, dernière réponse), donc il faut savoir que les calculs hors des fonctions et les calculs dans Pause sont stockés dans Ans.
Avec l'algorithme de conversion de X vers 10 (polynôme) puis 10 vers Y (par division répétée par Y) comme Mdr1 et moi, il nous suffit de montrer les résultats intermédiares, quitte à perdre en optimisation.
Ci-dessous je prend la version ultime que j'ai déjà pointé précédemment et je décompose les calculs et affiche des données.
EDIT 30/10/2014: Des erreurs seront corrigées dans la suite du message. C'est-à-dire que je modifie le message alors qu'il était déjà posté.
La première balise ci-dessous est légèrement modifiée pour des détails mineurs.
-Un affichage utilisais Q au lieu de R. (voir commentaire)
-Je corrige l'unicode de la première ligne, ¤ remplace thêta pour le forum.
Code
"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ¤->Str1 // ¤ est thêta
Input "BASE=",X
Input "VERS=",Y
Input "X=",Str2
length(Str2->N
0->P
//ci-dessous la conversion de X vers 10
For(W,0,N-1
X^W->D // le poids
inString(Str1,sub(Str2,N-W,1->A // position dans la chaîne, donc la valeur
A*D->S // le produit
P+S->P // la somme avec les précédents produits
ClrDraw
Text(0,0,A,"*",X,"^",W,"=",A,"*",D,"=",S // par exemple "2*16^2=2*256=512"
Text(6,0,"TOTAL:",P
Pause
End
// ci-dessous la conversion de 10 vers Y par répétition de division par Y
"0"+Str1->Str1
Lbl R
P->Z
"_->Str2
While Z
iPart(Z/Y->Q // quotient
Z-YQ->R // reste
sub(Str1,R+1,1)->Str3 // symbole du reste
Str3+Str2->Str2 // stockage dans la chaîne finale
Z->D
Q->Z
ClrDraw
Text(0,0,D,"=",Y,"*",Q,"+",R // 19=2*9+1
Text(6,0,"ON RECOPIE",R,"ET DIVISE",Q,"... // copie 1 et divise 9
If Y>10 and R>9 /////// CORRIGEZ LE Q EN R
Text(12,0,R,"=",Str3 /////// CORRIGEZ LE Q EN R
Pause
End
ClrDraw
Disp "LU DANS L'ORDRE:
Pause Str2
Menu("RESTART","STOP",Q,"RECONVERTIR",S
Lbl S
Input "RECONV=",Y
Goto R
Lbl Q
EDIT 30/10/2014 : Ci-dessous la balise est une correction ajoutée. (elle n'était pas présente le Ven 17 Oct 2014, 20:34)
-J'ajoute Str3 dans la partie de X à 10. Le calcul a donc une étape de plus, ainsi qu'une ligne d'affichage insérée.
-Je remplace Y par T pour éviter le conflit avec le graphique. (bug de TI)
-Je déplace une affectation de Z de la partie de division et élimine la variable D alors inutile.
Code
"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ¤->Str1
Input "BASE=",X
Input "VERS=",T
Input "X=",Str2
length(Str2->N
0->P
//ci-dessous la conversion de X vers 10
For(W,0,N-1
X^W->D // le poids
sub(Str2,N-W,1->Str3 // symbole
inString(Str1,Str3->A // position dans la chaîne, donc la valeur
A*D->S // le produit
P+S->P // la somme avec les précédents produits
ClrDraw
If A>9
Text(0,0,Str3,"=",A
Text(6,0,A,"*",X,"^",W,"=",A,"*",D,"=",S // par exemple "2*16^2=2*256=512"
Text(12,0,"TOTAL:",P
Pause
End
// ci-dessous la conversion de 10 vers Y par répétition de division par Y
"0"+Str1->Str1
Lbl R
P->Z
"_->Str2
While Z
iPart(Z/T->Q // quotient
Z-TQ->R // reste
sub(Str1,R+1,1)->Str3 // symbole du reste
Str3+Str2->Str2 // stockage dans la chaîne finale
ClrDraw
Text(0,0,Z,"=",T,"*",Q,"+",R // 19=2*9+1
Text(6,0,"ON RECOPIE",R,"ET DIVISE",Q,"... // copie 1 et divise 9
If T>10 and R>9
Text(12,0,R,"=",Str3
Pause
Q->Z
End
ClrDraw
Disp "LU DANS L'ORDRE:
Pause Str2
Menu("RESTART","STOP",Q,"RECONVERTIR",S
Lbl S
Input "RECONV=",T
Goto R
Lbl Q
### fin des ajouts de corrections
On peut aussi rédiger un programme pour les divisions par puissances décroissante, mais je n'en ai pas l'envie et tu ne le voulais pas au départ.
Pour grouper les puissances, il faut réaliser un algorithme de compression ou de décompression. Ce que tu as mentionné est juste.
Entre 16 et 2, on groupe par 4. Entre 8 et 2, par 3. Entre 4 et 2, par 2.
Et pour les autres, on passe par l'intermédiaire de 2.
Cela fonctionne pour n'importe quelles bases pourvu qu'elles soient des puissances communes. (des paires pour 3 et 9=3*3 par exemple)
EDIT 22heures27minutes:
J'applique au cas particulier de 2 et 16.
La conversion de chaque digit est déjà définie par les chaînes Str3 et Str4, c'est plus facile pour moi.
Pour saisir en binaire, veuillez saisir des groupes de 4 bits et les séparer par un quelconque caractère. D'autres séparateurs conviendront tel que le programme est actuellement, mais en utiliser est indispensable et bénéfique pour la lisibilité.
Si vous n'avez pas un quartet au début du nombre, alors vous devez compléter avec des zéros.
Code
ClrHome
" "->Str2
"0123456789ABCDEF->Str3
"0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111->Str4
Menu("","16>2",1,"2>16",2
Lbl 1
Input Str1
length(Str1->N
For(A,1,N // parcours des digits de base 16
sub(Str1,A,1 // un digit
Disp Ans
inString(Str3,Ans->P // position qui donnera la valeur associée
If P>10 // si le symbole est une lettre (A à F) ...
Disp P-1 // ... alors afficher la valeur
Pause sub(Str4,5*P-4,5 // quatre digits de la base 2
Str2+Ans->Str2
End
Goto 3
Lbl 2
Output(1,1,"VEUILLEZ SAISIR EN GROUPANT PAR 4 BITS, EXEMPLE : 0101 1010
Pause
ClrHome
Input Str1
1+length(Str1->N // incrémente 1 pour supporter un manque de dernier espace caractère
For(A,1,N,5 // parcours de 5 caractères en 5 (4 bits)
sub(Str1,A,4 // quatre digits de la base 2
Disp Ans
inString(Str4,Ans // position dans la chaîne de base 2
(Ans-1)/5 // valeur associée
Disp Ans
Pause sub(Str3,Ans+1,1 // digit de la base 16
Str2+Ans->Str2
End
Lbl 3
Disp "CONCLUSION
Pause Str2
Pour aucun des programmes je n'ai suivi exactement l'affichage que tu suggères, mais tu peux bien-sûr les modifier.
Retiens surtout qu'afficher des choses sur une même ligne est plus facile avec Text() qu'avec Output().
On peut toujours t'aider en donnant d'autres conseils pour tes propres bidouilles, il n'y a qu'à demander.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Désolé, je n'ai pas eu le temps de répondre ce week-end.
Je vous remercie pour vos réponses.
Je connais un peu la programmation en TI-Basic, j'avais créé un petit programme pour les équations à deux inconnues (avec les étapes détaillés) alors je pense que ça ne poserait pas trop de problème pour créer un petit programme moi même.
Mais, je vais voir pour le moment de modifier directement les programmes proposé par linkakro, pour pas trop m'embêter et question de facilité.
Je ne connaissais pas la fonction Texte(), je vais voir ça aussi.
J'avais utilisé que Disp() en coupant avec des guillemets et des virgules pour tout afficher à l'écran et un OutPut() pour afficher un petit message au milieu sur mon programme d'équations.
Je vous tiens au courant.
Bonne journée et merci.
Dwym Invité
Posté le : Mar 21 Oct 2014, 22:54
J'ai recopié le programme de linkakro en y rajoutant un menu, mais celui-ci ne semble pas donner les bons résultats.
Voici le code :
Code
Lbl 0
Menu("CONVERTION","X vers 10",A,"10 vers Y",B,"Quitter",C)
Lbl B
"0"+Str1->Str1
Lbl R
P->Z
" ->Str2 // J'ai remplacé le tiret bas par un espace (ne pouvant pas le mettre)
While Z
iPart(Z/Y->Q
Z-(Y*Q)->R // J'ai mis Z-(Y*Q) au lieu de Z-YQ
sub(Str1,R+1,1)->Str3
Str3+Str2->Str2
Z->D
Q->Z
ClrDraw
Text(0,0,D,"=",Y,"*",Q,"+",R
Text(6,0,"ON RECOPIE",R,"ET DIVISE",Q,"...
If Y>10
Text(12,0,Q,"=",Str3
Pause
End
ClrDraw
Disp "LU DANS L'ORDRE:
Pause Str2
Goto 0
Lbl C
Pour télécharger le programme et le tester sur votre calculette (pas besoin de recopier et de s'embêter) : http://uptobox.com/tusaivp1b7io
Si je choisis "X vers 10" qu'ensuite je mets :
BASE=2
VERS=10
X=10100
Cela me donne donc :
0*2^0=0*1=0
TOTAL:0
[ENTRER]
0*10^1=0*10=0
TOTAL:0
[ENTRER]
1*10^2=1*100=100
TOTAL:100
[ENTRER]
0*10^3=0*1000=0
TOTAL:100
[ENTRER]
1*10^4=1*10000=10000
TOTAL:10100
[ENTRER] >> Et c'est fini
Cela me redonne donc, le nombre X (alors que je veux le X en décimal).
Idem si je mets :
BASE=10
VERS=2
X=20
Cela me redonnera le nombre X
Si je choisis "10 vers Y" : j'ai une erreur de syntaxe à la ligne Text(0,0,D,"=",Y,"*",Q,"+",R
J'ai essayé en rajoutant une virgule et une guillemet, mais c'est pas ça la solution.
Bref, du coup je sais pas trop quoi faire pour résoudre ces problèmes, ne comprenant pas très bien le code, mais je cherche néanmoins de mon côté.
D'ailleurs pourquoi on utilise la fonction ClrDraw ? Elle sert à quoi vu q'on ne trace/dessine pas ?
On pourrait utiliser ClrHome, si c'est pour effacer l'écran, non ?
Autorisation : Membre
Nb de messages : 4
Inscrit le : Jeu 16 Oct 2014, 22:56
Posté le : Mar 21 Oct 2014, 23:06
Arf... J'ai pas calé que j'ai posté en invité mon dernier message (ainsi que l'autre), du coup je ne peux pas éditer.
Je voulais juste préciser que j'ai aussi essayé de supprimer les points de suspension de cette ligne (ça me semblait louche) Text(6,0,"ON RECOPIE",R,"ET DIVISE",Q,"... ça ne résout pas le problème.
PS: Au cas où, j'ai utilisé TI Program Editor pour écrire le programme.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Mer 22 Oct 2014, 18:30
Je n'ai pas testé le résultat après mes ajouts d'affichages. Je dois absolument tester pour m'assurer de la source de l'erreur.
L'algorithme utilisé par mdr1 et moi réalise systématiquement deux conversions. Il n'y avait pas de différenciations des cas.
Par ailleurs la conversion de 10 numérique à Y chaîne de caractères apporte un avantage certain dans l'affichage des 13 ou 14 chiffres valides au lieu de 9 ou 10.
Ta séparation des parties est incorrecte car la chaîne des symboles n'est pas correctement initialisée si tu n'exécute pas l'une après l'autre. Déplace la première initialisation "123..." au début. Ainsi la concaténation de "0" fonctionnera toujours comme prévu.
La fonction Text() utilise l'écran du graphique. Le graphique est indépendant de l'écran principal. L'effacement du graphique se fait avec ClrDraw et celui de l'écran principal avec ClrHome.
Je n'ai pas inclus au programme de modification des paramètres du graphique. Si tu veux, tu peux désactiver les axes ou les fonctions en utilisant AxesOff et FnOff au début du programme, et les réactiver avec AxesOn et FnOn. Le premier est dans le menu Format, l'autre est dans le menu Y-var (sous menu de var pour les ti82stats et supérieures, 2nde+var dans la ti82.)
Z-YQ est parfaitement valide dans une calculatrice TI. Les produits implicites sont prioritaires sur les sommes.
Tu as bien fait de remplacer le underscore "_" par un espace puisque j'utilise justement underscore pour expliciter des espaces. N'importe quel caractère reconnaissable fait l'affaire.
Je peux éditer les messages de tout le monde car je suis actuellement modérateur global. Si tu veux modifier quelque chose de spécifique, tu peux toujours me contacter avec un mail du forum.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Autorisation : Membre
Nb de messages : 4
Inscrit le : Jeu 16 Oct 2014, 22:56
Posté le : Jeu 30 Oct 2014, 14:59
Salut,
Me revoilà après quelques jours sans nouvelles..
Voici actuellement le programme :
Code
Lbl 0
"123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0"->Str1
Menu("CONVERTION","X vers 10",A,"10 vers Y",B,"Quitter",C)
Lbl A
Input "BASE=",X
Input "VERS=",Y
Input "X=",Str2
length(Str2->N
0üP
For(W,0,N-1
X^W->D
inString(Str1,sub(Str2,N-W,1->A
A*D->S
P+S->P
ClrDraw
Text(0,0,A,"*",X,"^",W,"=",A,"*",D,"=",S
Text(6,0,"TOTAL:",P
Pause
End
Goto 0
Lbl B
Input "BASE=",X
Input "VERS=",Y
Input "X=",Str2
"0"+Str1->Str1
Lbl R
P->Z
" ->Str2
While Z
iPart(Z/Y->Q
Z-YQ->R
sub(Str1,R,1)->Str3
Str3+Str2->Str2
Z->D
Q->Z
ClrDraw
Text(0,0,D,"=",Y,"*",Q,"+",R
Text(6,0,"ON RECOPIE",R,"ET DIVISE",Q,"...
If Y>10
Text(12,0,Q,"=",Str3
Pause
End
ClrDraw
Disp "LU DANS L'ORDRE:
Pause Str2
Goto 0
Lbl C
Comme tu peux le voir, je n'ai pas respecté la séparation que tu m'as conseillé de faire.
Cependant, la première partie du programme (X vers 10) fonctionne correctement puisque je reçois le bon résultat :
BASE=2
VERS=10
X=11101011
Résultat : 235
BASE=16
VERS=10
X=EB
Résultat : 235
Alors qu'avant le résultat était le nombre donné dans X.
Pour la deuxième partie du programme (10 vers Y) cela me donne une erreur "DOMAINE" sur la ligne sub(Str1,R,1)->Str3 le pointeur de la calculatrice est sur la parenthèse fermente.
Tu as une idée pour corriger ce problème ?
Je ferais par la suite l'affichage désiré, mais j'essaye pour le moment de faire fonctionner correctement le programme.
Je ne savais pas que le "Z-YQ" était automatiquement traduit par "Z-Y*Q" alors j'avais préféré rajouté le * en plus des parenthèses, au cas où.
EDIT 2 :
J'ai essayé en modifiant la valeur de position des Text() car, d'après ce sujet c'est quand on veut afficher quelque chose hors de l'écran, mais ça ne fonctionne pas. Peut-être que j'ai mal fait ou que cela ne soit pas la cause du problème.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 30 Oct 2014, 21:23
Je ne conseillais pas de séparer les parties, au contraire je conseillais d'utiliser les deux ensemble. Répéter une opération superflue avec la base 10 n'était pas un problème lorsqu'il n'y avait pas de détails. Et la conversion de chaîne à nombre et de nombre à chaîne était très pratique.
Maintenant que nous ajoutons des détails, la séparation des parties gagne plus d'importance pour ne pas se répéter et je n'y avais pas pensé avant ta tentative.
Je suis persuadé que tu as aussi mal effectué la séparation des routines en n'adaptant pas parfaitement l'entrée pour la seconde.
Mais avant toute chose je dois prendre le temps (dont je manquais jusqu'alors) nécessaire pour recopier moi-même mon programme détail puis ta tentative pour corriger les deux.
Tu as saisis un zéro en place de thêta dans la chaîne de caractères des symboles. Il ne faut pas utiliser zéro car dans la partie X->10 cela fausserait toute entrée contenant le symbole zéro.
Toutefois tu ne t'intéresses qu'aux bases 2,10,16 donc tu peux t'arrêter à F, tu n'as pas besoin de "G...Z¤".
Lorsque j'avais posté le code avec détails dans le début de ce sujet, j'avais oublié de corriger les symboles unicode de thêta et sto, donc je pense que tu t'es trompé à cause de moi. Maintenant j'utilise le symbole ¤ pour le thêta, facile à saisir avec mon clavier.
Je signale que quiconque peut utiliser un éditeur pour copier le programme, donc le lien de téléchargement est simplement une facilité.
Quelques remplacements automatiques des sto, thêta et symboles dans un notepad et c'est plié.
Je recommande SourceCoder (outil en ligne) ou TokenIDE (logiciel) du site Cemetech.
####
Je reviens à la correction de mon programme. Quelques étourderies sont modifiées dans ma balise code originale, message du Ven 17 Oct 2014, 20:34.
Des corrections significatives sont dans la balise que j'ai ajoutée en dessous.
J'ai choisi de placer la correction là-bas pour faciliter les comparaisons entre eux deux, et comprendre plus facilement les changements.
Depuis que j'ai ajouté des affichages Text() dans le graphique et ClrDraw, on a une réinitialisation de Y. Ce bug de la calculatrice m'ennuiera jusqu'à ma fin. Donc je modifie le programme en remplaçant Y par T.
J'avais utilisé Q au lieu de R... un commentaire ajouté le montre.
Quitte à corriger un affichage de symbole, je modifie un autre affichage pour ajouter un second rappel de la valeur des symboles.
Mon expérience avec ces changements semblent parfaitement fonctionner.
J'ai aussi séparé les parties et cela fonctionne.
Donc je pense que je n'aurai pas besoin de copier le tien pour chercher les problèmes.
Ci-dessous ce que j'ai testé en séparant les parties de mon programme corrigé. Attention aux Labels puisque tu avais changé le nom du Lbl de fin.
Code
"123456789ABCDEF->Str1
Menu("CONVERTION","X VERS 10",A,"10 VERS Y",B,"QUITTER",Q)
Lbl A
Input "BASE=",X
Disp "VERS 10
Input "NOMBRE=",Str2
length(Str2->N
0->P
For(W,0,N-1
X^W->D
sub(Str2,N-W,1->Str3
inString(Str1,Str3->A
A*D->S
P+S->P
ClrDraw
If A>9
Text(0,0,Str3,"=",A
Text(6,0,A,"*",X,"^",W,"=",A,"*",D,"=",S
Text(12,0,"TOTAL:",P
Pause
End
Pause P
Stop
Lbl B
Input "BASE 10 VERS:",T
Input "NOMBRE=",P
"0"+Str1->Str1
Lbl R
P->Z
" ->Str2
While Z
iPart(Z/T->Q
Z-TQ->R
sub(Str1,R+1,1->Str3
Str3+Str2->Str2
ClrDraw
Text(0,0,Z,"=",T,"*",Q,"+",R
Text(6,0,"COPY",R,"DIVISE",Q,"...
If T>10 and R>9
Text(12,0,R,"=",Str3
Pause
Q->Z
End
ClrDraw
Disp "FINAL
Pause Str2
Menu("","STOP",Q,"RECONV",S
Lbl S
Input ">BASE:",T
Goto R
Lbl Q
Je n'ai pas enlevé la reconversion. Si vous le voulez, vous pouvez retirer le menu reconv, le Lbl R, l'affectation de Z par P, et utiliser une seule des deux variables pourvu que la saisie soit cohérente.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Autorisation : Membre
Nb de messages : 4
Inscrit le : Jeu 16 Oct 2014, 22:56
Posté le : Ven 31 Oct 2014, 18:39
Salut,
En effet, je n'avais pas vu que c'était un thêta et non un zéro qu'il fallait mettre dans la chaîne de caractère, bien vu.
Pas de problème pour le fait de m'arrêter à F, c'est aussi ce que j'avais pensé faire.
Je ne connaissais pas les deux logiciels que tu proposes, ils ont l'air bien mieux que celui que j'utilise, je vais regarder ça.
J'ai essayé le programme que tu as fait cette après-midi, il fonctionne niquel.
J'ai juste remarqué un petit problème : dans "10 VERS Y", le résultat stocké dans Str2 comportait les anciennes conversions faite et aussi le nombre donné dans "X VERS 10" en plus du résultat de la conversion. J'ai alors remplacé les Str2 qui sont dans "10 VERS Y" par Str4 (puisque les chaines 1 2 & 3 sont utilisés précédemment) pour résoudre ce problème.
Voici donc actuellement le programme fonctionnel :
Code
"123456789ABCDEF->Str1
Menu("CONVERTION","X VERS 10",A,"10 VERS Y",B,"QUITTER",Q)
Lbl A
Input "BASE=",X
Disp "VERS 10
Input "NOMBRE=",Str2
length(Str2->N
0->P
For(W,0,N-1
X^W->D
sub(Str2,N-W,1->Str3
inString(Str1,Str3->A
A*D->S
P+S->P
ClrDraw
If A>9
Text(0,0,Str3,"=",A
Text(6,0,A,"*",X,"^",W,"=",A,"*",D,"=",S
Text(12,0,"TOTAL:",P
Pause
End
Pause P
Stop
Lbl B
Input "BASE 10 VERS:",T
Input "NOMBRE=",P
"0"+Str1->Str1
Lbl R
P->Z
" "->Str4 // Ici c'était Str2, j'ai rajouté un guillemet et un espace, car sinon on a le droit à une erreur.
While Z
iPart(Z/T->Q
Z-TQ->R
sub(Str1,R+1,1->Str3
Str3+Str4->Str4 // Changé là
ClrDraw
Text(0,0,Z,"=",T,"*",Q,"+",R
Text(6,0,"COPY",R,"DIVISE",Q,"...
If T>10 and R>9
Text(12,0,R,"=",Str3
Pause
Q->Z
End
ClrDraw
Disp "FINAL
Pause Str4 // Et aussi ici
Menu("","STOP",Q,"RECONV",S
Lbl S
Input ">BASE:",T
Goto R
Lbl Q
Je vais donc maintenant voir pour afficher les informations comme je veux, maintenant que les conversions sont correctes et que le programme fonctionne sans problème.
Je n'ai pas essayé le menu de reconversion, car une fois que j'ai le message "Fait" ("Done" en Anglais), il me suffit de cliquer sur "Entrer" et le programme redémarre.
Encore merci pour le temps que tu consacres à répondre avec en plus les explications ce qui permet de bien comprendre et à m'aider, ça a du t'utiliser pas mal de temps.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 31 Oct 2014, 21:40
Str2 est initialisée avec un espace dans 10 vers Y. Donc le phénomène que tu décris montre que l'initialisation dans la calculatrice est défectueuse. Si c'est bien cela alors Str4 sera facultative.
L'espace est indispensable mais le second guillemet ne l'est pas. Ce guillemet explicite la présence de l'espace mais c'est tout. Avant cette discussion j'avais utilisé un underscore "_" dans ce même but d'explicitation de l'invisible .
La reconversion permet de ne pas recommencer la saisie pour convertir plusieurs fois un même nombre. Quand un exercice est un tableau à compléter, du temps est gagné.
Oui tu peux modifier les affichages. Je te recommande de répartir les égalités en plusieurs lignes pour éviter les nombres longs qui dépassent.
Tu peux te restreindre à l'écran principal d'ailleurs. Le conflit de Y est déjà écarté donc l'un ou l'autre n'a aucune importance.
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)