La programmation de l'algorithme sur la calculatrice graphique, permet d'obtenir directement les réponses justifiées aux premières question, mais aussi de servir de support de recherche et vérification pour les questions suivantes.
Pour la modélisation de la suite ak finie des chiffres de la carte, on peut utiliser le type de variable liste de la calculatrice.
Rajoutons une instruction en fin des deux boucles Pour pour avoir les justifications.
Initialisation : I prend la valeur 0 P prend la valeur 0 R prend la valeur 0 Traitement : Pour k allant de 0 à 7 : R prend le reste de 2a(2k+1) par 9 I prend la valeur I+R Afficher k, a(2k+1), 2a(2k+1), R, I Fin Pour Pour k allant de 1 à 7 : P prend la valeur P+a(2k) Afficher k, a(2k) et P Fin Pour Sortie : S prend la valeur I+P+c Si S est multiple de 10 alors : Afficher "numéro carte correct" Sinon : Afficher "numéro carte incorrect" Fin Si
{5,6,3,5,4,0,0,2,9,5,6,1,3,4,1}→⌊A 1→C 0→I 0→P 0→R For(K,0,7) reste(2⌊A(2K+1),9)→R I+R→I Disp {K,⌊A(2K+1),2⌊A(2K+1),R,I} End Pause For(K,1,7) P+⌊A(2K)→P Disp {K,⌊A(2K),P} End I+P+C→S If reste(S,10)=0 Then Disp"NUM. CARTE CORRECT" Else Disp"NUM. CARTE INCORR." End
{5,6,3,5,4,0,0,2,9,5,6,1,3,4,1}→⌊A 1→C 0→I 0→P 0→R For(K,0,7) remainder(2⌊A(2K+1),9)→R I+R→I Disp {K,⌊A(2K+1),2⌊A(2K+1),R,I} End Pause For(K,1,7) P+⌊A(2K)→P Disp {K,⌊A(2K),P} End I+P+C→S Ifremainder(S,10)=0 Then Disp"NUM. CARTE CORRECT" Else Disp"NUM. CARTE INCORR." End
{5,6,3,5,4,0,0,2,9,5,6,1,3,4,1}→List1 1→C 0→I 0→P 0→R For0→K To 7 MOD(2List1[2K+1],9)→R I+R→I List1[2K+1]→U {K,U,2U,R,I}◢ Next For1→K To 7 P+List1[2K]→P List1[2K]→U {K,U,P}◢ Next I+P+C→S IfMOD(S,10)=0 Then "NUM. CARTE CORRECT" Else "NUM. CARTE INCORR." IfEnd
{5,6,3,5,4,0,0,2,9,5,6,1,3,4,1}⇒a 1⇒c 0⇒i 0⇒p 0⇒r For0⇒k To 7 mod(2a[2k+1],9)⇒r i+r⇒i Print {k,a[2k+1],2a[2k+1],r,i} Next For1⇒k To 7 p+a[2k]⇒p Print {k,a[2k],p} Next i+p+c⇒s Ifmod(s,10)=0 Then Print "numéro carte correct" Else "numéro carte incorr." IfEnd
EXPORT liban2017sspe() BEGIN LOCAL a; a:={5,6,3,5,4,0,0,2,9,5,6,1,3,4,1}; C:=1; I:=0; P:=0; R:=0; FOR K FROM 0 TO 7 DO R:=2*a[2*K+1] MOD 9; I:=I+R; PRINT({K,a[2*K+1],2*a[2*K+1],R,I}); END; FOR K FROM 1 TO 7 DO P:=P+a[2*K]; PRINT({K,a[2*K],P}); END; S:=I+P+C; IF (S MOD 10)=0 THEN PRINT("numéro de carte correct"); ELSE PRINT("numéro de carte incorrect"); END; END;
Question 1)a) :
Le tableau demandé correspond à la première partie de l'affichage de la calculatrice, soit ce qui est affiché par la première boucle et qu'il suffit juste de recopier.
k
0
1
2
3
4
5
6
7
a2k+1
5
3
4
0
9
6
3
1
2a2k+1
10
6
8
0
18
12
6
2
R
1
6
8
0
0
3
6
2
I
1
7
15
15
15
18
24
26
Question 1)b) : A la fin de la première boucle Pour, la variable I vérifiant les chiffres de rang impair vaut donc 26. Poursuivons l'exécution de l'algorithme avec la deuxième boucle Pour :
Produisons la justification avec la trace par itération, correspondant cette fois-ci à la deuxième partie de l'affichage de la calculatrice
k
1
2
3
4
5
6
7
a2k
6
5
0
2
5
1
4
P
6
11
11
13
18
19
23
A la fin de la deuxième boucle Pour, la variable P vérifiant les chiffres de rang pair vaut donc 23. Donc en sortie d'algorithme, la variable S vaut
I+P+c=26+23+11+P+c=50
. 50 étant bien un multiple de 10, le numéro de carte est donc correct.
2 questions : 1) La fonction "remainder(" sur z80, c'est à partir de quel OS ? 2) Est-ce vraiment au programme l'utilisation d'une fonction interne à la calculette (comme le calcul du reste d'une division euclidienne, par exemple) ?
J'imagine que tous les profs de spécialité ont expliqué la fonction "mod" ou les fonctions de division euclidienne à leurs élèves... mais est-ce exigible au Bac ?
Bisam wrote:2 questions : 1) La fonction "remainder(" sur z80, c'est à partir de quel OS ?
Bonne remarque. A partir des versions 2.xx il me semble, donc ça excluerait les TI-83 non-USB ainsi que les TI-82.
Mais ce ne sera plus un problème dans quelques semaines...
Bisam wrote:2) Est-ce vraiment au programme l'utilisation d'une fonction interne à la calculette (comme le calcul du reste d'une division euclidienne, par exemple) ?
Niveau programmation, on est de toutes façons déjà hors programme avec une variable de type liste. Mais on peut s'en tirer sans aucune programmation, en prenant le temps de tester/vérifier à la main pour chaque question de l'exercice.
Je trouvais juste qu'il était pertinent de montrer comment faire, vu le temps que cela fait gagner.
En tous cas, l'algorithme du sujet ne mentionne le reste que sur une seule ligne sans le détailler, et donc le référence comme quelque chose de déjà existant, de la même façon qu'un cosinus ou un logarithme. Donc de même sur machine, il m'a paru fidèle de transcrire cet algorithme en appelant la fonction reste de la machine. Elle n'est pas cachée, en français elle s'appelle reste() et se trouve très facilement dans .
Oui, en fait, je dis n'importe quoi à propos des fonctions.
Les fonctions à un seul argument sont courantes... mais celles à plusieurs arguments aussi, ne serait-ce que pour les probas ! Bref, ma remarque ne tient pas la route. C'est juste que j'étais étonné de l'utilisation de cette fonction en particulier.
Les fonctions à plusieurs variables étaient mentionnées au programme de Seconde de 2009. Je n'ai pas encore bien fait attention à ça dans le nouveau programme de 2017, mais à mon avis ça reste d'une façon ou d'une autre puisque les algorithmes sont présentés comme des fonctions et peuvent prendre plusieurs arguments.
Après en pratique, on n'avait pas forcément le temps de faire grand chose avec, surtout quand les fonctions à 1 variable ne tournent déjà pas rond dans la tête de nombre d'élèves...
Moi j'y consacrais 1 activité concrète dans le contexte de l'algorithmique, avec le calcul de l'indice IMC même si certes on perdait alors l'écriture fonctionnelle, puis bien sûr 4-5 lignes de cours et des exos d'application avec des f(x,y). Bref c'était fait, mais ça n'allait pas bien loin.
Encore un sujet ou il s'agit de faire du reverse-engeneering au lieu de demander aux eleves de concevoir un algorithme alors qu'ici c'est quand meme tres simple avec deux boucles non imbriquees : on est quand meme avec des eleves de TS specialite maths! Si toutefois on craint que cela leur soit trop difficile de concevoir un algorithme de but en blanc, il est possible de donner une maquette a completer. Le travail demande aux eleves n'est pas creatif, en fait il s'apparente au travail d'un prof qui corrige des copies, c'est ininteressant. En plus, je suis persuade que les concepteurs font fausse route : comprendre une regle a partir d'un algorithme non commente est souvent plus difficile que l'inverse : ici il faut commencer par retenir des notations de variables qui ne deviennent claires qu'une fois la regle comprise, et l'utilisation de 2 variables pour faire les sommes est etrange (une seule variable suffit algorithmiquement parlant) tant qu'on n'a pas compris la regle, sans parler de la mise a l'ecart de c. Sur HP Prime (et probablement sur TI nspire et ti89/92/v200 et peut-etre d'autre modeles) on peut remplacer les boucles par des sum. Voici l'algorithme en Xcas traduit sous forme d'une fonction prenant en argument une liste (noter que les indices commencent a 0 en Xcas d'ou le decalage):
Le meme prenant un nombre entier de 16 chiffres et renvoyant un entier qui doit etre multiple de 10, avec une variable locale pour stocker les chiffres du nombre
fonction f(x) local l,k; l:=revlist(convert(x,base,10)); // extraction des chiffres de x en base 10 return sum(irem(2*l[2*k],9),k,0,7)+sum(l[2*k+1],k,0,7); ffonction:;
Si le code de la carte commence par des 0, il faut rajouter la ligne de code suivante apres la definition de l:
si size(l)<16 alors l:=concat(seq(0,16-size(l)),l); fsi;
Il n'y a vraiment pas beaucoup d'arithmetique la-dedans (la division euclidienne par 9 c'est du programme du primaire en fait!) et elle a ete rajoutee artificiellement car le veritable test des cartes bancaires ne calcule pas le reste de la division euclidienne par 9 mais retire 9 si on est plus grand que 9. Je m'en suis apercu en testant mon numero de carte bancaire qui est considere comme incorrect par la regle de cet exercice de bac.
parisse wrote:Si toutefois on craint que cela leur soit trop difficile de concevoir un algorithme de but en blanc, il est possible de donner une maquette a completer.
En même temps, dans les IUFM/ESPE on présente le texte à trous comme la pire des abominations. Je ne suis donc pas surpris que les algorithmes à trous restent extrêmement rares au BAC, même si personnellement je les sors régulièrement en DS (histoire qu'il y ait un minimum de "production" par l'élève).
Faire écrire un cours, c'est pas intéressant pour les élèves, faut pas faire. Donner des polycopiés de cours pour passer plus rapidement à l'application, c'est pas bien puisque l'élève ne s'approprie pas le cours. Donner des polycopiés à trous pour que l'élève soit obligé de suivre le cours, c'est exclu.
Conclusion logique ? Ben je suppose qu'on a voulu nous faire comprendre qu'il ne fallait plus faire cours...
@parisse Ah ben voilà, tu vas être content je pense, et l'ESPE aussi :
La toute première fois que ça tombe au BAC il me semble, hier en Polynésie française. En plus, c'est l'algo type présent dans l'écrasante majorité des sujets, avec recherche d'un seuil sur une suite récurrente.
Sauf que... c'est le sujet pour non spécialites commun aux séries ES/L. J'ai peur qu'il y ait eu beaucoup de dégâts, avec nombre de candidats sautant la question (ou pire le reste de l'exercice alors que c'est sans rapport). De quoi convaincre les concepteurs de sujets de ne pas récidiver, je crains.