Console
Clique sur « Exécuter » pour lancer le programme.
Code CoddyRun
@ Configuration et Paramètres
LARG est un nombre
LARG vaut 560
HAUT est un nombre
HAUT vaut 420
film est un tableau
// Position d'affichage
COL_LARG est un nombre
COL_LARG vaut 45
BASE_X est un nombre
BASE_X vaut 420
Y_RETENUE est un nombre
Y_RETENUE vaut 100
Y_NB1 est un nombre
Y_NB1 vaut 160
Y_NB2 est un nombre
Y_NB2 vaut 220
Y_TRAIT est un nombre
Y_TRAIT vaut 250
Y_RESULTAT est un nombre
Y_RESULTAT vaut 310
@ Saisie des deux nombres
nombre1 est un nombre
demande "Premier nombre (le plus grand) : " dans nombre1
nombre1 vaut arrondi_inferieur(absolue(nombre1))
nombre2 est un nombre
demande "Deuxième nombre (à soustraire) : " dans nombre2
nombre2 vaut arrondi_inferieur(absolue(nombre2))
// On s'assure que nombre1 est toujours le plus grand pour éviter les résultats négatifs
si nombre1 < nombre2 alors
temp est un nombre
temp vaut nombre1
nombre1 vaut nombre2
nombre2 vaut temp
fin si
@ Décomposition en chiffres
chiffresA est un tableau
chiffresB est un tableau
na est un nombre
na vaut nombre1
si na = 0 alors
chiffresA ajoute 0
fin si
tant que na > 0
chiffresA ajoute na mod 10
na vaut arrondi_inferieur(na / 10)
fin tant que
nbb est un nombre
nbb vaut nombre2
si nbb = 0 alors
chiffresB ajoute 0
fin si
tant que nbb > 0
chiffresB ajoute nbb mod 10
nbb vaut arrondi_inferieur(nbb / 10)
fin tant que
// Nombre de colonnes = max des deux longueurs
nbCol est un nombre
nbCol vaut maximum(longueur(chiffresA), longueur(chiffresB))
// Tableaux résultat et retenues (init à vide = -1)
resultat est un tableau
retenuesHaut est un tableau
retenuesBas est un tableau
ic est un nombre
pour ic de 0 à nbCol - 1
resultat ajoute -1
retenuesHaut ajoute -1
retenuesBas ajoute -1
fin pour
@ Fonctions utilitaires
fonction chiffreA(colonneId)
si colonneId < longueur(chiffresA) alors
retourne chiffresA[colonneId]
fin si
retourne 0
fin fonction
fonction chiffreB(colonneId)
si colonneId < longueur(chiffresB) alors
retourne chiffresB[colonneId]
fin si
retourne 0
fin fonction
@ Procédure de Dessin
procédure dessinerScene(colActive, msg)
t est une toile
dimension(t, LARG, HAUT)
// Fond principal doux
remplir(t, #e9ecef)
// Carte centrale avec ombre
rectangle_arrondi(t, 34, 34, 492, 352, 12, #adb5bd)
rectangle_arrondi(t, 30, 30, 492, 352, 12, #ffffff)
// Titre
label(t, 50, 60, "Soustraction posée", #495057, 22)
// --- Colonne active mise en surbrillance et guides ---
cg est un nombre
pour cg de 0 à nbCol - 1
xg est un nombre
xg vaut BASE_X - cg * COL_LARG
ligne(t, xg + 20, Y_RETENUE - 20, xg + 20, Y_RESULTAT + 10, #f1f3f5, 2)
fin pour
si colActive >= 0 alors
xa est un nombre
xa vaut BASE_X - colActive * COL_LARG
rectangle_arrondi(t, xa - 12, Y_RETENUE - 24, COL_LARG, Y_RESULTAT - Y_RETENUE + 64, 8, #fff3cd)
fin si
// --- Premier nombre et ses retenues (haut) ---
c1 est un nombre
pour c1 de 0 à nbCol - 1
si c1 < longueur(chiffresA) alors
x1 est un nombre
x1 vaut BASE_X - c1 * COL_LARG
label(t, x1, Y_NB1, convertir_texte(chiffresA[c1]), #1d3557, 26)
si retenuesHaut[c1] > 0 alors
label(t, x1 - 12, Y_NB1, "1", #e63946, 20) // Ajoute un "1" devant pour faire "10+"
fin si
fin si
fin pour
// --- Signe - et deuxième nombre avec ses retenues (bas) ---
label(t, BASE_X - (nbCol - 1) * COL_LARG - 36, Y_NB2, "-", #1d3557, 26)
c2 est un nombre
pour c2 de 0 à nbCol - 1
x2 est un nombre
x2 vaut BASE_X - c2 * COL_LARG
si c2 < longueur(chiffresB) alors
label(t, x2, Y_NB2, convertir_texte(chiffresB[c2]), #1d3557, 26)
fin si
si retenuesBas[c2] > 0 alors
label(t, x2 - 16, Y_NB2 + 18, "+1", #e63946, 16)
fin si
fin pour
// --- Trait de séparation épais ---
xGauche est un nombre
xGauche vaut BASE_X - (nbCol - 1) * COL_LARG - 15
ligne(t, xGauche, Y_TRAIT, BASE_X + 34, Y_TRAIT, #212529, 4)
// --- Résultat ---
colMax est un nombre
colMax vaut 0
cm est un nombre
pour cm de 0 à nbCol - 1
si resultat[cm] >= 1 alors
colMax vaut cm
fin si
fin pour
rr est un nombre
pour rr de 0 à nbCol - 1
si resultat[rr] >= 0 et rr <= colMax alors
xres est un nombre
xres vaut BASE_X - rr * COL_LARG
label(t, xres, Y_RESULTAT, convertir_texte(resultat[rr]), #2a9d8f, 30)
fin si
fin pour
// --- Zone de Message explicatif ---
rectangle_arrondi(t, 40, 330, 472, 40, 6, #f8f9fa)
label(t, 50, 355, msg, #495057, 18)
film ajoute t
fin procédure
@ Calcul Animé
vide film
attente est un nombre
pour attente de 1 à 2
appelle dessinerScene(-1, "On aligne les chiffres à droite.")
fin pour
valeurRetenue est un nombre
valeurRetenue vaut 0
col est un nombre
pour col de 0 à nbCol - 1
da est un nombre
da vaut chiffreA(col)
db est un nombre
db vaut chiffreB(col)
dbAvecRetenue est un nombre
dbAvecRetenue vaut db + valeurRetenue
si valeurRetenue > 0 alors
msg0 est un texte
msg0 vaut "On prend en compte la retenue : " + convertir_texte(db) + " + 1 = " + convertir_texte(dbAvecRetenue)
pour attente de 1 à 2
appelle dessinerScene(col, msg0)
fin pour
fin si
nouvelleRet est un nombre
nouvelleRet vaut 0
si da < dbAvecRetenue alors
nouvelleRet vaut 1
da vaut da + 10
retenuesHaut[col] vaut 1
si col + 1 < nbCol alors
retenuesBas[col + 1] vaut 1
fin si
msg1 est un texte
msg1 vaut convertir_texte(da - 10) + " < " + convertir_texte(dbAvecRetenue) + ". J'emprunte 1 dizaine !"
pour attente de 1 à 3
appelle dessinerScene(col, msg1)
fin pour
fin si
chiffreRes est un nombre
chiffreRes vaut da - dbAvecRetenue
msg2 est un texte
si valeurRetenue > 0 alors
msg2 vaut convertir_texte(da) + " - (" + convertir_texte(db) + " + 1) = " + convertir_texte(chiffreRes) + "."
sinon
msg2 vaut convertir_texte(da) + " - " + convertir_texte(db) + " = " + convertir_texte(chiffreRes) + "."
fin si
resultat[col] vaut chiffreRes
pour attente de 1 à 3
appelle dessinerScene(col, msg2)
fin pour
valeurRetenue vaut nouvelleRet
fin pour
@ Résultat Final
totalCalc est un nombre
totalCalc vaut nombre1 - nombre2
pour attente de 1 à 5
appelle dessinerScene(-1, "Résultat final : " + convertir_texte(totalCalc))
fin pour
// Lancement de l'animation
animation(film, 800, 0)