TP Ordinapoche

jeu. 10 septembre 2009

Préliminaires

  1. Créer le répertoire Ordinapoche dans votre répertoire de travail (man mkdir).
  2. Faire d'Ordinapoche votre répertoire de travail (man cd).
  3. Lancer l'exécutable ordinapoche.tcl.

Partie Ordinapoche décimal


Exercice 1. Echauffement

Il y a deux difficultés pour ces premiers 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 à notre disposition que l'instruction TAC. On supposera que les données entrées respectent les énoncés.

  1. 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).
  2. Ecrire un programme qui demande deux entiers A et B (B > A) et qui affiche tous les entiers compris entre A et B (inclus).
  3. 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.

Exercice 2. Décomposition d'une opération simple

L'Ordinapoche n'intègre pas l'opérateur 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
  1. Ecrire le programme correspondant pour l'Ordinapoche.
  2. Exécuter votre programme pour a=6 et b=13, quel est le résultat obtenu ?
  3. Exécuter votre programme pour a=237 et b=8, quel est le résultat ? Est-il correct ? Expliquer ce qui s'est passé.
  4. 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. Du langage machine vers le langage algorithmique

Soit le programme suivant :

Adr.

Instruction Commentaires
00 INP N
01 CLA N
02 STO N
03 TAC 06
04 OUT N reste 0 : N est divisible
05 HRS
06 SUB un
07 TAC 10
08 OUT N reste 1 : N n'est pas divisible
09 HRS
10 SUB un
11 TAC 14
12 OUT N reste 2 : N n'est pas divisible
13 HRS
14 SUB un
15 JMP 02
... ... ...
20 0 zero
21 1 un
22 valeur de N
  1. Exécuter le programme ci-dessus pour les valeurs successives suivantes : 10, 27 et 0.
  2. 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 ?
  3. Ecrire l'algorithme correspondant et le faire vérifier par l'enseignant.

Exercice 4. Un programme dynamique

Soit le programme suivant, exécutable par notre Ordinapoche :

Adresse Code Instruction Explication
28 730    
29 002    
30 228    
31 529    
32 333    
33 900    

Le compteur ordinal (CO) est initialisé à 30. Commenter et expliquer ce programme.


Partie Ordinapoche hexadécimal


Exercice 1. Un programme mystérieux

Soit le programme suivant :

Adr.

Instruction Code Commentaires
00 0 zero
01 valeur de A
02 valeur de M
... ... ... ...
20 INP A 001
21 CLA A 201
22 STO M 302
23 TMP zero A00
24 TAC 27 827
25 OUT M 102
26 HRS 900
27 TMP M A02
28 GTH 2A C2A
29 STO M 302
2A INP A 001
2B CLA A 201
2C JMP 23 723
  1. Exécuter le programme ci-dessus pour les valeurs successives suivantes : 10, 20, 14, 9, 17 et 0.
  2. Commenter le programme. Quelle est sa fonction ?
  3. Modifier le programme de telle sorte qu'il n'y ait qu'une seule instruction de saisie (INP).

Exercice 2. Du langage algorithmique vers le langage machine

On considère l'algorithme suivant :

Algorithme somme des carrés des N premiers entiers
Déclaration
   n, i, S des nombres entiers
debut
  demander-une-valeur-pour n
  affecter 0 à S
  affecter 1 à i
  tant que (i != (n+1)) faire
     affecter (i*i)+S à S
     affecter i+1 à i
  fintq
  montrer-la-valeur-de S
fin
  1. Écrire le programme Ordinapoche correspondant à cet algorithme.
  2. Tester le programme pour les valeurs n=5, n=13. Donner le résultat fournit par Ordinapoche.
  3. Quelle est la plus grande valeur de n pour laquelle Ordinapoche retourne un résultat correct ? Justifier votre réponse.

Exercice 3. Soit n un nombre entier de deux chiffres (< 100), on appelle u et d respectivement le chiffre des unités et le chiffre des dizaines de n. Le "miroir" de n est le nombre entier m de deux chiffres ayant d comme chiffre des unités et u comme chiffre des dizaines (par exemple, le "miroir" de n=15 est m=51).

On considère la méthode suivante : pour un n donné par un utilisateur, on calcule le "miroir" m de n, puis on retranche le plus petit des deux nombres au plus grand, on affecte la valeur de la différence obtenue à n. On réitère l'opération pour cette nouvelle valeur de n et ce, jusqu'à ce que n prenne la valeur F.

  1. Ecrire un algorithme que décrit la méthode ci-dessus : il doit prendre en entrée un nombre n et afficher chacune des valeurs de n et m en utilisant impérativement une boucle tant que ... faire.
  2. Implanter le programme correspondant pour l'Ordinapoche.
  3. Que se passe-t-il si le nombre donné n est tel que u=d (par exemple pour n=55) ?

Exercice 4. Un nombre parfait est nombre égal à la somme de ses diviseurs propres i.e y compris 1 mais lui-même exclu.

  1. Implantez le programme qui détermine si un nombre N, entré au clavier, est un nombre parfait.
  2. Sur l'ensemble des entiers connus de l'Ordinapoche, implantez le programme qui affiche ceux qui sont des nombres parfaits.
  3. Les nombres amiables sont des sortes de nombres parfaits mutuels i.e chaque nombre est la somme des diviseurs propres de l'autre. Il n'existe qu'un couple de nombres parfaits mutuels inférieurs à 1000, qui est connu depuis l'antiquité ("Un ami est celui qui est l'autre comme sont ? et ?" - Pythagore). Implantez le programme qui le détermine et qui l'affiche.
  4. Nombre abondant : un nombre entier est abondant s'il est inférieur à la somme de ses diviseurs propres. Par exemple, 12 est abondant car 1 + 2 + 3 + 4 + 6 = 16 > 12 . Implantez le programme qui détermine le plus petit entier abondant impair inférieur à 1000.

Exercice 5. Racine carrée entière

Ecrire un programme qui calcule le plus grand carré d'entier inférieur à un nombre entré au clavier.

Pour écrire un programme efficace, on s'appuiera sur la propriété suivante :

"calcul de la racine carrée"