Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 2002
Réponses : 32
Type : discussion
Etat : réponses autorisées

Un peu d'algorithmique / simplification de programme

The K le 10/10/2011 à 19:16
Bonjour à tous happy.gif
Je vous poserai deux questions ici ... la première, la voici. J'aimerai savoir si il y a moyen de faire sur TI un algorithme tel que celui-ci :
Demander A,B,C
(la partie que je ne sais pas : )
Trouver U et V tel que :
AC = UV
B = U+V
(et enfin : )
Afficher U
Afficher V

Ma seconde question est de savoir si on peut raccourcir ce bout de code qui est (je trouve) très lourd crazy.gif

Code
Prompt B
If B=0:Goto 2B
Prompt C
If C=0:Goto 2B
Prompt D
If D=0:Goto 2B
Prompt E
If E=0:Goto 2B
Prompt F
If F=0:Goto 2B
Prompt G
If G=0:Goto 2B
Prompt H
If H=0:Goto 2B


Merci à vous d'avance happy.gif

The K
The K le 10/10/2011 à 21:02
Euh ... AC -> U ?
J'ai marqué "AC = UV" ^^' T'es sur de toi ^^'
(si je me trompe la faudra m'expliquer crazy.gif )
tilo1996 le 10/10/2011 à 21:08
Ah oui en effet. Je revois mon prog... [Edit] Je suis un peu cramé... Je verrai demain... sad.gif Je supprime mon premier post
The K le 10/10/2011 à 21:18
Nan parce que moi j'ai essayé qqes petits trucs, mais je tombais sur des carrés ce qui impliquait plusieurs solutions, un code assez dense (et au passage pas de mon niveau ^^), etc etc ...
Bref ^^'
azerty1 le 10/10/2011 à 21:19
Tu veux que cela gère les décimaux, ou seulement les entiers (relatifs)?
Si seulement entiers, on peut décomposer le produit AC et dans les facteurs trouvés, en rassemblé certains (en multipliant) pour arriver a ce que la somme de 2 facteurs donnant AC soit égale à B, je me penche plus dessus demain si j'ai le temps winkle.gif
Sachant que j'ai déjà un code pour décomposer un nombre en facteurs (premiers).
The K le 10/10/2011 à 21:53
L'idéal serait de trouver un code qui marche pour tous les nombres winkle.gif
Mais je suis preneur de tout ^^ et aimerai bien voir le pgrm que tu me décris ^^
azerty1 le 10/10/2011 à 22:05
Oui évidemment! happy.gif Regarde ici! happy.gif après si les facteurs trouvés ne suffisent pas, ont peut toujours rajouter des 1... crazy.gif
Métalocif le 11/10/2011 à 17:27
Pour raccourcir ton code,utilise la propriété du produit nul:
Code
Prompt [tes valeurs]
If BCDEFGH=0
Goto 2B

Ce code implique que si une seule des variables est nulle,le programme saute jusqu'au label 2B...ce qui est, je l'espère, ton souhait(dans le cas contraire, je devrais me remettre en question et je déteste ça! angry.gif ) !
En espérant t'avoir aidé,
Métalocif
The K le 11/10/2011 à 22:01
Metaloctif, ma (lourde) méthode me permettait de passer direct au 2B si E était égal a 0. Ici, ce que tu me décris est exactement la mm chose que ça :
Code
Prompt B, C, D, E, F, G, H
Goto 2B

Donc voilà ^^' (cependant tu mets l'index sur un défaut de mon programme ... Il aurait fallu que je rajoute ça a la fin : If H [différent de] 0 : Goto 2B (ou qqchose du même genre crazy.gif ) )


Quand à toi Trotuthutur, eh bien ... Mes modestes connaissances de ti-basic font que je ne comprend ... Strictement rien a ton code XD. Et donc par conséquent je ne comprend pas le rapport de ton programme avec mon algorithme ><'
Une explication ^^' ?
Métalocif le 12/10/2011 à 13:53
Au fait que tu sembles avoir des difficultés à orthographier des pseudos n'étant pas une lettre de l'alphabet? Aucune.
Plus sérieusement (et avec moins de méchanceté),tu peux essayer la méthode dite de substitution pour résoudre les systèmes:
AC=UV
Donc U=AC/V
Avec la deuxième équation:
B=U+V
B=AC/V+V
Bon,là ça ne marche pas, mais tu vois l'idée...

Ta lourde méthode te permettait effectivement d'arrêter de demander des valeurs dès qu'une est égale à 0.La mienne, bien que plus légère, n'offrait pas cette possibilité.
Je dois aller au lycée cry.gif ,mais je reviendrai!
Métalocif
The K le 12/10/2011 à 18:52
Dsl de la faute d’orthographe x')Mais c'est pas toujours simple depuis un ipod ... bref je regarde ce que tu m'as envoyé et j'y réfléchis ...
The K le 12/10/2011 à 19:25
En fait ce que me dis est vrai ... Mais ne m'avance pas notgood.gif
Parce que sinon on tombe sur des trucs Genre :
U=AC/(B-U) sachant qu'on ne connais pas U donc :
U=AC/[B-(AC/(B-U))] etc. Etc.
Peut être mon algorithme est impossible a résoudre par calculette cry.gif
sandro le 12/10/2011 à 21:53
Je crois que j'ai réussit à trouver mathématiquement (se mettre en mode complexxe pour éviter les erreures, cout à éliminer les solutions non réelles par la suite). Voici le résonnement (je suis trop fatiguer pour le programmer ce soir, je m'y met demain si j'ai le temps.

AC=UV
B=U+V

V=AC/U
B=U+AC/U

BU=U²+AC
0=U²-BU+AC
Delta =B²-4*1*AC
U1=(B-rac(B²-4AC))/2 et U2=(B+rac(B²-4AC)/2

Donc V=AC/U1 ou AC/U2

Il reste plus qu’a vérifier si les résultats sont cohérents (je ne suis pas sur que ce soit tous des équivalences, donc il faut vérifier numériquement la réciproque).

ATTENTION : si B=0, alors U=0 et/ou V=0 donc AC = U ou AC = V


Sandro
The K le 12/10/2011 à 22:16
Merci a toi sandro happy.gif
Mais j'ai cependant qqes questions winkle.gif
Multiplier l'équation au carre, oui, mais ne faut il pas faire, tôt ou tard après, une racine carrée ?
Sinon, si B=0, U ou/et V n'est pas forcément égal à 0 ... -3+3 est bien égal à 0 crazy.gif
sandro le 13/10/2011 à 18:54
Ups, oublie donc cette dernière partie, le reste n'en reste pas moins correct (enfin je pense).

Sinon, tu t'occupe toi même de le programmer ou tu as besoins d'aide?

Sandro
The K le 14/10/2011 à 16:03
J'essaie un petit pgrm on verra winkle.gif
The K le 14/10/2011 à 16:42
Donc voila ce que j'ai essayé :

Code

EffEcr
Prompt A,B,C
(B-[racine](B²-4AC)/2 -> D
(B+[racine](B²-4AC)/2 -> E
AC/D -> F
AC/E -> F
Disp "U1",D,"V1",F,"U2",E,"V2",F
Pause
EffEcr


Passons au test : 4x²-7x+3=0
A=4 B=cupsmiley.gif7 C=3
Une solution est le système (-4);(-3)
Car : (-4) + (-3) = (-7) = B
(-4) x (-3) = 12 = AC

Or ma TI ne m'indique pas ce système en solution ... en fait elle me met deux systèmes dont le produit est bel et bien égal à AC mais dont la somme n'est pas égale à B.

cry.gif cry.gif cry.gif cry.gif cry.gif cry.gif cry.gif cry.gif cry.gif cry.gif

Une petite idée sinon pour simplifier mon code du premier post ^^' ?
sandro le 14/10/2011 à 21:15
Um, je crois qu'il manque une parrenthèse avant les /2.
Sinon, y a-t-il un énnoncé d'origine? si oui, pourrais-tu le poster, ça purrais peut-être me donner des idées.

Sandro
The K le 14/10/2011 à 22:34
Et le pire c'est que t'as raison xD
J'avais juste oublie une parenthèse crazy.gif
Si tu veux savoir pour quoi c'était ... C'est la manière british de trouver le discriminant (je fais classe euro) c'est fou comment ils se compliquent la vie je trouve crazy.gif

Hum et sinon pour mon code du premier post que penses tu d'une boucle avec hile et produit nul genre ça ?

Code

1-> I
While I [différent de] 0
Prompt A: AI -> I
End
Goto 2B


Avec des valeurs de A a H y a t'il moyen de faire un code pas beaucoup plus long ?
(je ne connais pas toutes les instructions utilisables crazy.gif )


Merci en tous cas pour ton algorithme sur U et V happy.gif bigmouth.gif






[/code]
sandro le 15/10/2011 à 10:26
Le plus simple serait :
Code
Lbl 2
Prompt B,C,D,E,F,G,H
If non(BCDEFGH:Goto2

Mais ça à l'inconvéniant que l'on recommence que à la fin si jamais il y a une erreur.

Sinon tu aurrais aussi
Code
{0 -> L1
"BCDEFGH -> Chaîne1
Lbl 2
For(A,1,7
Imput SousChaîne(Chaîne1,A,1),Z
Z -> L1(A
If non(prod(L1:Goto 2
End
L1(1 -> B:L1(2 -> C:L1(3 -> D:L1(4 -> E:L1(5 -> F:L1(6 -> G:L1(7 -> H

Ce code est bien plus éfficace si tu enlève la première ligne et que reemploi directement la liste ou ses valeures.

Sandro

PS : pour ton code, tu peut simplifier par
Code
0 -> A
While non(A
Prompt A
End
     //puis tu recommence avec B, puis C, ...
The K le 15/10/2011 à 11:12
Euh ... ton second code est un peu compliqué pour moi pour la simple et bonne raison que je ne maitrise, ni n'utilise les chaines ^^' A quoi servent elles ?
Et dans le troisième je ne comprends pas trop le rôle du "non" ... ça veut dire "tant que A n'a pas de valeur, demander A" ?
crazy.gif
sandro le 15/10/2011 à 21:42
le non( signifie "0=(" mais c'est plus rapide et plus optimisé.

pour les chaînes (c'est du texte en variable), tu peut à la place faire ça (même si c'est un peu moins beau:
Code
{0 -> L1
Lbl 2
For(A,1,7
Imput "NOMBRE",Z
Z -> L1(A
If non(prod(L1:Goto 2
End
L1(1 -> B:L1(2 -> C:L1(3 -> D:L1(4 -> E:L1(5 -> F:L1(6 -> G:L1(7 -> H


Sandro

PS : la chaîne servait ici à afficher les lettres.
linkakro le 15/10/2011 à 21:49
Les chaînes contiennent du texte.
On peut appliquer des tests sur ces chaînes et surtout "découper" les chaînes avec la fonction sous-chaîne.
Sans entrer dans les détails, il utilise une chaîne pour qu'un seul input affiche successivement A,B,...,H : cela évite de multiplier les input et prompt.

"non(" est une opération logique.
Elle transforme 0 en 1 et tous les autres nombres en 0.

sandro: une bonne fois pour toute, utilise Repeat A plutôt que While non(A quand le test est innutile à l'entrée.
sandro le 15/10/2011 à 21:54
Ups, désolé, je l'oublie souvant celui là.
linkakro le 15/10/2011 à 22:28
Le système revient effectivement à résoudre X^2-BX+AC.
Sauf que je l'ai trouvé en appliquant des propriétés connues et avec une recherche : X^2-SX+P dont les solutions sont déjà établies comme étant les antécédents de S et P par somme et produit.

Je suis surpris que tu aies trouvé l'équation du second degré si facilement.
A plusieurs vous auriez dû trouver la résolution vu que vous aviez déjà l'équation.

Je crois que le C ne sert à rien.

Code
Prompt A,B,C
rac(B^2-4AC->D
Disp (B-D)/2,(B+D)/2
The K le 16/10/2011 à 10:37
Les chaînes servent à rentrer des caractères et les sous-chaînes à les morceler euh ... puis-je avoir un petit exemple svp ^^'
Je veux dire, c'est pas que l'algo que vous proposez est faux, mais mélanger des listes et des chaînes quand j'ai du mal avec les listes et que je ne connais pas les chaînes, bref ...
Merci à vous winkle.gif
sandro le 16/10/2011 à 20:19
pour les chaînes :
Code
Disp "ABC"   // ABC est une chaîne
"ABC" -> Chaîne1   //Chaîne1 est dans Var/7/1  ;  enregistre ABC dans la variable chaîne
Disp "ABC"+"DE"         //affiche ABCDE
Disp sousChaîne("ABCDE",2,3  //affiche BCD
Longueur("ABCDE"             //donne 5
CarChaîne("ABCDE","BCD"      //donne 2
Carchaîne("ABCDE","FIG"      //donne 0 (pas trouvable)
Carchaîne("ABCDEABCDE",AB,2       //donne 6 (on ne cherche que à partir du second carractère)


Sandro
The K le 16/10/2011 à 20:57
Ah ok ... Merci a toi ça pourra me servir je pense bigmouth.gif

Tiens pendant que j'y suis et étant curieux ... A quoi correspondent les "BDG" et "Img" dans les variables minied.gif ?
azerty1 le 16/10/2011 à 21:11
Image, ce sont des images happy.gif que tu peux dessiner, sur le graphique, puis sauvegarder [2nde]+[prgm] tu trouveras tout se dont tu as besoin, et les BDG en gros se sont des propriétés comme la taille de la fenetre etc... Tu peux sauvegarder et rappeler tout cela dans un programme happy.gif
Persalteas le 17/10/2011 à 08:34
banque de données graphiques (BDG) sauvegarde toutes tes fonctions [f(crazy.gif] de tous les modes, la taille de ta fenêtre, et les paramètres de graphique (axes On-Off, quadrillage etc...)
The K le 19/10/2011 à 14:16
Ah d'accord ^^
Et comment les utilises-t-on ? happy.gif
Je veux dire, dans un programme, que doit on mettre comme instruction pour faire fonctionner le code ? winkle.gif
sandro le 19/10/2011 à 21:29
SauveImage X ou SauveBDG X avec X un entier de 0 à 9 pour sauvegarder

RappelImage X ou RappelBDG X idem mais il faut que l'on ai déjà sauvegardé ultérieurement (dans le programme ou avant).

C'est fonctions peuvent par example servir à remettre la TI comme avant un jeu : au début tu sauvegarde les deux, et à la fin tu les restaure et tu les supprime avec DelVar.

Sandro
The K le 21/10/2011 à 16:39
Ah oui ! J'ai déja vu ça dans quelques programmes que j'ai recopié crazy.gif
bref, merci à toi Sandro et à tous ceux qui m'ont répondu ici winkle.gif