Préliminaires
- Créer le répertoire Ordinapoche dans votre répertoire de travail (man mkdir).
- Faire d'Ordinapoche votre répertoire de travail (man cd).
- Lancer l'exécutable ordinapoche.py.
Exercice 1. Langage machine vs langage Python
Soit le programme suivant :
==== =========== ============
Adr. Instruction Commentaires
==== =========== ============
00 INP N
01 CLA N
02 STO N
03 TAC 06
04 OUT N divisible
05 HRS
06 SUB un
07 TAC 10
08 OUT N non divisible
09 HRS
10 SUB un
11 TAC 14
12 OUT N non divisible
13 HRS
14 SUB un
15 JMP 02
... ...
20 1 un
21 N
==== =========== ============
- Exécuter le programme ci-dessus pour les valeurs successives suivantes : 10, 27 et 0.
- A partir du peu de commentaires associés au programme et des jeux d'essais ci-dessus, déterminer le rôle de ce programme. Quelle est la double fonction de la variable N ?
Exercice 2. Décomposition d'une opération simple
L'Ordinapoche n'intègre pas l'opérateur arithmétique de multiplication X. Pour réaliser la multiplication de a par b (avec b >= 1) on doit donc effectuer b-1 additions en effet :
a x b = a + a + ... + a (b fois)
On procède de la façon suivante :
1. on saisit au clavier les valeurs respectives de a et de b et on les stocke en mémoire
2. on initialise un mot-mémoire (une variable P) à la valeur de a
3. on initialise un mot-mémoire (un compteur C) à b-1
4. si le compteur C est strictement supérieur à zéro alors
a. on calcule P+a et on stocke ce résultat dans le mot-mémoire correspondant à P
b. on décrémente le contenu du mot-mémoire correspondant au compteur C (C décroît de 1)
c. on recommence à l'étape 4
5. on affiche la valeur du mot-mémoire correspondant à P
- Ecrire le programme correspondant pour l'Ordinapoche.
- Exécuter votre programme pour a=6 et b=13, quel est le résultat obtenu ?
- Exécuter votre programme pour a=237 et b=8, quel est le résultat ? Est-il correct ? Expliquer ce qui s'est passé.
- pour a=2 et b=0, lancer l'exécution pas à pas et surveiller le contenu des cases mémoires correspondant à C et P. Que se passe-t-il ? Expliquer. Corriger le programme s'il ne traitait pas ce cas.
Exercice 3. Variations sur les entiers
Il y a deux difficultés dans cette suite d'exercices : la première c'est la programmation d'une structure répétitive, la seconde c'est la traduction de la condition d'arrêt en n'ayant à sa disposition que l'instruction TAC.
Pour des raisons de simplicité, on supposera que les données entrées respectent les énoncés.
- Ecrire un programme qui demande un entier N pair (1 < N < 999) et qui affiche tous les entiers pairs compris entre 1 et N (inclu) dans cet ordre.
- Ecrire un programme qui demande deux entiers A et B (avec B > A) et qui affiche tous les entiers compris entre A et B (inclus) dans cet ordre. Conseil : prendre garde à éviter toute soustraction qui ne donnerait pas un résultat positif ou nul.
- Ecrire un programme qui demande un entier N (0 < N < 1000) et qui affiche 1 si N est impair ou qui affiche 2 si N est pair. Conseil : progresser à petits pas (unitaire).
Exercice 4. Minimum de deux entiers.
Ecrire un programme qui demande deux entiers A et B (0 < A, B < 999) et qui détermine puis affiche le plus petit des deux.
Exercice 5. Le nombre secret
Ce petit jeu consiste à deviner un nombre compris entre 1 et 999 préalablement mémorisé par l'Ordinapoche (à l'adresse 50 par exemple, ce nombre est donc une donnée prédéfinie du programme). En fonction de la proposition de l'utilisateur, l'Ordinapoche doit afficher 0 si le nombre proposé est plus petit que le nombre à deviner ou afficher 1 si le nombre proposé est plus grand que le nombre à deviner.
- La principale difficulté de cet exercice est l'existence d'une seule instruction conditionnelle (TAC) et l'incapacité qu'à l'Ordinapoche de traiter les nombres négatifs ; il faut donc adopter l'algorithme suivant qui traite une proposition (nb_o est le nombre à chercher, nb_u est le nombre proposé par l'utilisateur) :
cpt = 1
si nb_o - cpt == 0 alors
si nb_u - cpt == 0 alors
afficher("trouvé")
sinon
afficher("trop grand")
sinon
si nb_u - cpt == 0 alors
afficher("trop petit")
sinon
cpt = cpt + 1
Ecrire le programme correspondant.
- Modifier le programme de tel sorte que le nombre s'affiche ainsi que le nombre de coups qui vous ont été nécessaire pour le trouver.
Exercice 6. Instructions vs données
Soit le programme suivant, exécutable par l'Ordinapoche :
==== ==== =========== ===========
Adr. Code Instruction Explication
==== ==== =========== ===========
00 702 JMP 02
01 002
02 200 CLA 00
03 501 SUB 01
04 305 STO 05
05 900 HRS
==== ==== =========== ===========
Commenter et expliquer ce programme.
Exercice 7. Calcul de moyenne
Ecrire un programme qui calcule la moyenne (entière par valeur inférieure) d'une suite de nombres, chacun d'eux compris entre 1 et 20, dont le premier terme est à l'adresse 50 et dont le dernier terme précède la valeur 0 (qui marque la fin de la suite et qui est d'adresse maximale 99).
On procèdera de la façon suivante : calcul de la somme de tous les termes de la suite ainsi que du nombre de termes, puis calcul de la moyenne en effectuant une soustraction successive du total par le nombre de terme (en prenant une nouvelle fois garde de ne pas dépasser la valeur 0).
Exercice 8. Racine carrée entière
Ecrire un programme qui calcule le plus grand carré d'entier inférieur ou égal à un nombre compris entre 2 et 999 entré au clavier et qui affiche la racine carrée entière correspondant.
Pour écrire un programme efficace, on s'appuiera sur la propriété suivante :