Poster un nouveau sujet Poster une réponse
aide programme
Auteur Message
chr4
Invité
Posté le : Jeu 09 Jui 2011, 18:44   Citer 

Bonjour à tous,
j'ai crée un programme, qui fonctionne très bien. Mais j'aimerai l'améliorer, et là je tombe face à un gros problème.

1) Le but de mon programme :
Soit Nf le nombre de facteur N1,N2,N3...
Soit x un nombre entré par l'utilisateur.
Mon programme actuel trouve toutes les possibilités de N, pour le cas ou Nf = 3.
En clair :
N1 * N2 * N3 = x
Le programme trouvera toutes les possibilités de N1,N2 et N3 dans un intervalle donné (cohérant !)

2) Introduction à mon programme :
Les principales variables :
A = nombre donné x
B et C = intervalle de recherche [B;C]
I = position d'écriture des résultats dans la liste L1
Z = la progression de la recherche
E,G et J = respectivement N1,N2 et N3
Je programme sur une calculatrice TI-82 Stats.fr


3) Mon programme, actuellement :

Code

:LblA
:EffEcr
:EffListe L1
:300->dim(L1)  #On n'est jamais trop sûr. Je suis d'accord, ça bouffe de la     mémoire.
:Input "Nombre: ",A
:Input "Limite debut:",B
:Input "Limite fin",C
:1->I            #On met le curseur à 1
:EffEcr
:If A<B ou B>C ou BBB>A ou CCC<A    #Vérification de la cohérence des données entrées. BBB revient à B puissance 3
:Then
:Pause "Erreur limites"
:Goto A
:End           #Fin de l'initialisation. On rentre dans le sérieux.


:Output(1,1,"Progres :00")
:For (E,B,C)      #C'est parti. Accrochez-vous !
:Fixe 1           #Coquetterie
:E*100/C->Z
:Output(1,10,Z)     #Affichage de la progression en pourcentage car ça peut être long...
:A/E->F           #Premier test ATTENTION : E est important c'est N1
:If partDéc(F)=0   #La division tombe juste, on peut continuer
:Then
:For(G,B,C)      #et la ça se complique, mais c'est que le début.
:F/G->H          #Continuons avec le F. G est IMPORTANT c'est N2
:If partDéc(H)=0  #ça se répète n'est-ce pas ?
:Then
:for(J,B,C)
:H/J->K      #J est IMPORTANT c'est N3
:If partDéc(K)=0 et K[supérieur ou égal]B et K[inférieur ou égal]C et E*G*J=A
#On s'arrête à ce niveau (on cherche 3 facteurs). K doit être dans [B,C] et SURTOUT nos chers facteurs doivent bien faire A.
:Then
:Flottant
:Output(3,1,"__:__:__")  #les _ sont des espaces (2 chaque fois)
:Output(3,1,E        #On affiche N1
:Output(3,4,G        #On affiche N2
:Output(3,7,J        #On affiche N3
:E->L1(I)            #Les résultats vont défiler : besoin de les enregistrer
:G->L1(I+1)
:J->L1(I+2)
:I+4->I              #On avance le curseur pour les prochains, avec 1 espace de sorte à différencier les couples.
:End
:End
:End
:End
:End
:End   #Eh oui, voilà ce qui nous attend à la fin !
:If I=1    #donc, pas de résultat trouvé
:Disp "Aucun résultat"
:Flottant   #Je préfère ce mode là.
:



4)Commentaire :
Vous l'avez compris, ce code test toutes les possibilités basé sur le fait que N1, N2 et N3 DOIVENT être des entiers. Sinon, on continue à l'étape précédente, en faisant défiler N2 ou N1 si N2 est terminé.
D'où mon compteur de progression, car plus l'intervalle est grand, plus c'est long.
Dans ce cas,
- Les résultats de la liste L1 sont 3 fois similaires (avec N1,N2 et N3 intervertis)
- Pour prouver qu'un nombre x est premier, il faut chercher dans un intervalle [1,x]. Les résultats trouvés doivent être [1,1,X],[1,X,1] et [X,1,1]
- Si vous avez un "Aucun résultat", cela est dû à un mauvais choix d'intervalle (trop peu étendu).
Le code est court, mais efficace !

5) Amélioration :

Je voudrais que l'on puisse demander le nombre de facteur que l'on cherche.
Les problèmes sont simples :
-Je ne peux pas utiliser de Goto, car les boucles en seraient perturbées.
-Je peux recopier 36 fois le même code pour le choix de 36 nombres de facteur différents. Ce que je ne veux pas faire car c'est trop long.
-Pour le while, ça me paraît aussi raté, car il va avec le GOTO comme break.

Si quelqu'un avait une idée. Le reste, ce sont des modifications mineurs.
Vous pouvez d'ors et déjà recopier ce code pour contempler l'efficacité du programme bigmouth.gif
Mais ce sera avec une recherche de 3 facteurs, et pour consulter les résultats, allez dans la liste L1 AVANT de relancer le programme (il remet tout à zéros dès le départ).

Merci pour votre aide !


  Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 09 Jui 2011, 21:53   Citer 

Le coup de génie serait un programme récursif mais j'ai abandonné mon unique programme de ce type...
Si je trouve je poste.


"parDéc(F)=0" peut se simplifier avec "non(partDéc(F"

Le titre du sujet n'est pas précis.

----------------------
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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
chr4
Invité
Posté le : Ven 10 Jui 2011, 16:40   Citer 

D'accord. Merci.

  Haut de page Bas de page 
 
tilo1996



Autorisation : Membre
Nb de messages : 122
Inscrit le : Sam 23 Avr 2011, 10:47
Posté le : Ven 10 Jui 2011, 17:25   Citer 

Tu peux remplacer BBB Par B puissance 3 qui se trouve dans le menu maths...

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 12 Jui 2011, 20:32   Citer 

Mon prototype le plus réussi à ce jour : (v 2.2)

Code
// FACT
Prompt X,N,A,B  // X à décomposer, N nombre de facteurs, A et B les bornes
max(2,A->A   // A>=2
min(X,B->B   // B<=X
If B<A
Then
Disp "BORNES INVALIDES
Stop
End

DelVar J
ClrList L1
prgmFACTZ


Code
// FACTZ
J+1->J         // pointeur (J indique l'étape)
For(W,A,min(B,X
J=N->Q         // teste si on en est à chercher le dernier facteur
If Q           // réutilise le test précédent
min(B,X->W     // le dernier facteur est trouvé sans tester tous les W
fPart(X/W->R
If not(R
W->L1(J        // sauvegarde l'état du programme avant la prochaine itération
If Qnot(R      // verrif combinaison complète
Pause L1       // une combinaison de facteurs trouvée
If not(Q+R     // verrif W diviseur et pas encore dernier facteur
Then
X/W->X
prgmFACTZ      // itération (répétition de l'algorithme)
J-1->J         // rappelle l'état du programme d'avant l'itération
L1(J->W        //
XW->X          //
End
End
               // fin de l'itération (pas besoin de Return)



Je l'ai optimisé mais il reste un crible !
Sa particularité est que le nombre de facteurs à chercher est variable car il fonctionne en récursif ! bigmouth.gif
Méfiez vous tout-de-même pour ne pas rentrer un nombre de facteurs impossible.

1 n'est pas compris dans les facteurs car un paquet de 1 suivi d'un nombre n'est pas vraiment une combinaison de plusieurs facteurs. (mais on peut le rajouter en modifiant la deuxième ligne avec un 1 au lieu d'un 2)

Parfois le programme corrige les bornes sur l'étendue la plus large si ça dépasse plutôt que de bloquer.

J'ai encore des idées pour raccourcir sa durée de calcul, mais ça part en vrille, et c'est un peu plus lourd.
J'ai aussi une idée pour un autre algorithme, mais ça attendra.

=====

EDIT 19/11/2011 =
J'ai grandement amélioré mon programme. version 4.2 !
Rendez-Vous sur le sujet aproprié : FACTEURS avec du RECURSIF

----------------------
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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
chr4
Invité
Posté le : Lun 13 Jui 2011, 21:10   Citer 

ça a l'air bien, mais ça me dépasse un peu.
Déjà, je ne connaissais pas les fonction min( et max(
ensuite, la calculatrice peut lire ça ??:

Citer
J=N->Q // verrif dernier facteur



Un dernier point.

Citer
J+1->J // pointeur


ça s'appelle un pointeur ?
Moi j'appellerais ça plutôt une "incrémentation" ou un "compteur".
Mais "pointeur" fait référence a une notion de programmation qui ne veut pas rentrer dans mon cerveau angry.gif (vive le TI-Basic !)

  Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 13 Jui 2011, 21:16   Citer 

a) Une égalité, en TI-basic ne renvoie pas vrai ou faux mais 0 ou 1, donc on peut l'intégrer dans un calcul
Ex:

Code
2*(A=3)-1         //donne 1 si A=3, sinon -1



b)Sauf erreure de ma part (je ne programme qu'en TI-Basic), pointeur est un therme de programmation désignant une variable qui indique l'emplacement de l'élément cherché dans une liste, un tableau, une matrice,... et qui est utilisé quand cet emplacement n'est pas fixe mais calculé.

Sandro

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 13 Jui 2011, 22:01   Citer 

Oui, un test renvoie 1 ou 0. Et les fonctions qui utilisent des tests lisent cette valeur.
Cela explique "While 1","Repeat 0", "If A", "not(A", ...


Je crois qu'un pointeur dans un language d'ordinateur est un moyen d'indiquer l'adresse d'une donnée. Quand on change l'adresse, on accède à une autre donnée.
Dans mon programme, J sert à indiquer à quelle étape le programme se trouve et à retrouver les nombres stockés dans la liste L1 (comme une adresse).


J'ai modifié quelques commentaires afin de rendre plus net.

----------------------
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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 9 requêtes