Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 18 Sep 2013, 16:12
Tu aurais pu recopier l'énoncé...
Voici l'algo pour la première question (donné en ti basic):
Code
//Initialisations
Prompt N
5000->A
2000->B
4000->C
//Calculs des changements
For(I,1,N
.9A+.1B+.01C->D //Nouvelles valeur de A, stockée dans D de façon temporaire
.9B+.1A+.01C->B
.98C->C
D->A //On récupère la valeur de la zone A
End
Autorisation : Membre
Nb de messages : 85
Inscrit le : Sam 20 Juil 2013, 17:00
Posté le : Mer 18 Sep 2013, 16:50
While verifie une condition et for est une boucle qui enregistre dans une variable ( en l'occurrence I) un nombre de début (ici 1) jusqu'à un nombre de fin ( ici la variable N demandée avant ). Le programme qu'à propose Matthieu41 est le meilleur, il a déjà optimisé le tout (d'où l'apparition du .9 au lieu de 0,9 , donc une économie de 1 octet.
---------------------- je prefere la ti-82stats a la fumette ^^
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 18 Sep 2013, 20:01
Tu pourras utiliser la boucle While pour la question f) (il faut que tu fasses les actions tant que N vaut quelque chose.
Je me rend compte d'un petit problème: Si tu restes comme ça, tu vas tourner en boucle infinie (je parle de la question f) ), puisque lorsque tu multiplie C par 0.98 (puisque 2% de la population partent), C ne prendra jamais la valeur 0... Je n'avais pas fait gaffe qu'on parle d'une population. Donc on va considérer que si C vaut 1, et qu'on veut que 2% partent (soit 0.02 personnes), bah on fait partir 1 personne (par défaut si on doit faire partir X personnes et des poussières on en fera partir X+1). Il y a toujours un problème à regler, puisque s'il reste 1 personne et qu'elle doit partir, on ne sait pas si elle doit aller dans le A ou dans le B. On considèrera donc qu'elle ira dans le A (de manière arbitraire). Encore un problème à noter: s'il reste 2 personnes dans le C, on veut en faire passer 1% dans le A (donc 1 personne), et 1% dans le B (donc 1 personnes), or il n'y a que 2 % qui s'en vont (1 personne). Il faut donc rectifier ce problème...
Il n'y a à priori pas ce genre de problèmes dans le B et le A.
En fait, cet algo n'est pas adapté au Ti Basic, qui ne permet pas une gestion simple des entiers...
Voici mon code revu en fonctions des remarques précédentes (on utilisera la partie entière de l’opposé, qui renvoi par exemple -3 si on passe -2.3 en argument):
Code
//Initialisations
Prompt N
-5000->A
-2000->B
-4000->C
//Calculs des changements
For(I,1,N
partEnt(.01C->E //Les 1% du C par excès
ent(.9A)+partEnt(.1B)+Rép->D //Nouvelle valeur de A (stockée dans D de façon temporaire //Edit: on utilise ent(.9A) parce que ça permet d'effectuer une troncature (ent(-2.3) donne en effet -2, alors que partEnt(-2.3) donne -3) (voir explication à mon post suivant. Idem pour le calcul de .9B.
ent(.9B)+partEnt(.1A)+E(C<=2E->B //J'utilise ici la technique des booléens: si C<=2E, on rajoute E, sinon on rajoute 0 (ça permet d'éviter de rajouter 1 personne dans le A s'il y a déjà 1 personne qui est passée dans le B, et qu'il n'en restait plus qu'une dans le C à la base)
min(0,C-2E->C //Si 98% de C > 0 après le calcul (et donc qu'on a retiré plus de personnes qu'il y en avait puisqu'on travaille sur l'opposé de la valeur de la population, qui ne peut pas être négative), on stocke 0 dans C, sinon on stocke le résulat des 98%.
D->A //On récupère la valeur de la zone A
End
Disp -{A,B,C //Affichage des valeurs des 3 zones (on reprend l’opposé)
Je répète que cet algo n'est pas adapté à du ti basic, c'est pas mal compliqué quand même...
@rpgcreator: je suis loin d'être le meilleur, Linka a par exemple beaucoup plus d'expérience que moi pour ne citer que lui
Ah donc je peux pas le taper sur ma Ti. je vais dire au prof. ce que tu m'as dit et on trouvera une autre solution je pense qu'il va me dire de l'écrire à la main... juste c'est pour la question f) c'est bien ça je me trompe pas ?
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 18 Sep 2013, 20:18
En fait le premier programme que je t'ai donné bah il faudrait le transformer dans un langage qui gère mieux les entiers, et il marche niquel.
Sinon le second (qui utilise partEnt() ) marche sur la calto, même s'il faut que tu précise au prof que tu as du choisir de prendre X+1 personnes s'il y en a X et des poussières, et que tu expliques aussi qu'on doit calculer les 98% de C en enlevant 2 fois 1% (calculés avec un arrondi en excès), et qu'il faut faire gaffe en rajoutant 1% du C au B, que ce soit possible d'enlever 2 fois 1% au C...
Et aussi la remarque que je met en éditant mon précédent prgm, parce qu'il y a un petit problème: Si on doit prendre 10% de 333 du A pour les mettre dans le B, et 9qu'on fait partEnt(-333*.1), on trouve 34, et partEnt(-333*9.), on trouve 300, la somme des 2 est égale à 334, il y a une personne en plus. Donc quand on enlève, si .9A donne X et des poussière, on tronque le résultat à mettre dans A. Pareil pour B. Pour C on a pas ce problème, puisqu'on stocke le flux dans E.
Autorisation : Membre
Nb de messages : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mer 18 Sep 2013, 20:33
En fait je pense qu'il s'attendait à un prgm fait sur algobox par exemple... Vous avez étudié la programmation sur quel langage? Juste le ti basic ou un truc du genre d'algobox?
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 19 Sep 2013, 0:46
C'est déjà bien avancé.
Moi j'ai pensé immédiatement à l'ambiguité des entiers, mais pas à ses conséquences.
Je suis déstabilisé par ta manipulation de nombres négatifs, tout ça pour arrondir avec excès de valeur absolue, alors que j'aurais simplement arrondi avec défaut dans les positifs.
Moi j'utiliserais simplement une boucle While et testerais C>0, et des réductions avec int(X).
==============
Je considère que seules des quantités entières de populations peuvent être échangées.
J'aurais pu utiliser N comme variable du For, mais je ne veux pas vous embrouiller.
J'utilise l'affichage automatique de la dernière ligne.
Code
5000->A
2000->B
4000->C
Prompt N
For(J,1,N
int(.9A)+int(.1B)+int(.01C->P
int(.9B)+int(.1A)+int(.01C->B
int(.98C->C
P->A
End
{A,B,C
Les questions mathématiques sans tenir compte des entiers.
R0=A0+B0+C0=5000+2000+4000=11000
On suppose Rn=A+B+C=A0+B0+C0=R0
R[n+1]=a[n+1]+b[n+1]+c[n+1]
=.9An+.1Bn+.01Cn+.9Bn+.1An+.01Cn+.98Cn
=An+Bn+Cn
=Rn
Par récurrence Rn=R0 pour tout N entier naturel.
d1=.8d0-0.01c0
d2=.8d1-0.01c1 =.8^2d0-.8*0.01c0-0.01c1
d3=.8d2-0.01c2 =.8(.8^2d0-.8*0.01c0-0.01c1)-0.01c2 =.8^3d0-.8^2*0.01c0-.80.01c1-0.01c2
dn=.8^n*d0 -.8^(n-1)*0.01c[0] -.8^(n-2)*0.01c[1] -... -.8^0*0.01c[n-1]
dn=.8^n*d0 - somme(j,0,n-1, .8^(n-1-j)*.01c[j] )
dn=.8^n*d0 - somme(j,0,n-1, .8^(n-1-j)*40*.98^j )
Je ne sais pas quoi faire de plus. Je ne connais ni nom ni formule à associer à la "nature" de (dn).
Je déterminerai N vérifiant C=0 avec une boucle While.
Code
5000->A
2000->B
4000->C
A-B->D // ajouter pour question G
Prompt N
0->J
While C>0
J+1->J
int(.9A)+int(.1B)+int(.01C->P
int(.9B)+int(.1A)+int(.01C->B
int(.98C->C
P->A
---------------------- 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 : 848
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Jeu 19 Sep 2013, 20:17
Mais si tu arrondi toujours par défaut tu est en déficit de population:
Code
//C = 1
int(.9A)+int(.1B)+int(.01C->P
//Au niveau du int(0.01C), le résultat est 0 (int(0.01) = 0)
int(.9B)+int(.1A)+int(.01C->B
//idem
int(.98C->C
//Et là int(.98) = 0
Résultat: la personne qui était dans le C a disparu: elle est partie du C mais n'est allée nulle part.
C'est pourquoi j'ai proposé d'arrondir par défaut lorsqu'on enlève (pour que C arrive un jour à 1), et par excès lorsqu'on rajoute (pour ne perdre personne), tout en gérant différemment le C puisqu'il y a 2 transfert à effectuer (pour éviter d'inventer ou de perdre du monde selon les cas).
Je n'ai pas suivi toutes tes démonstrations par récurrence j'avoue que tu m'as un peu perdu là
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Jeu 19 Sep 2013, 21:54
J'ai essayé de répondre à toutes les questions de l'exercice. (sauf celle de an et bn que j'ai oublié)
Mais je n'y suis pas parvenu. ^^
En plus j'ai écrit certains raisonnements sans démontrer rigoureusement la récurrence.
Toi ce qui te concernait directement était seulement la partie programmation. T'inquiète pas pour les maths.
Je comprend mieux maintenant pourquoi tu joues sur les troncatures et réductions.
---------------------- 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)