L'objectif de ce TP est de développer une calculatrice simple gérant les opérations arithmétiques de base sur les entiers.
Le programme prend en entrée un nombre puis une séquence d'opérations. Chaque opération est identifiée par un caractère et est suivie d'une opérande éventuelle.
Les espaces et sauts de ligne qui précèdent les opérateurs sont ignorés.
En cas d'opérateur inconnu, un message "Erreur d'opérateur!" est affiché et le programme se termine.
Note d'implémentation: lisez les nombres et opérandes avec DECI
et les opérateurs avec CHARI
.
L'opération =
affiche le résultat du calcul (suivi d'une saut de ligne) et recommence le programme au début avec un nouveau calcul.
L'opération q
fait la même chose que =
mais quitte le programme.
Les exemples et programmes de tests se terminent toujours avec l'opération q
Entrée 0:
~~~ 1 = 2 q ~~~
Sortie 0:
~~~ 1 2 ~~~
ATTENTION Ce test minimal simple conditionne l'acceptabilité de votre TP (voir la section Programme à rendre plus bas).
Les opérations +
et -
sont suivies d'une opérande qui est additionnée (ou soustraite).
Entrée 1:
~~~ 1 + 1 = 6 - 10 = 10 - 3 + 4 + -2 = 1000 - 2000 + 4000 q ~~~
Sortie 1:
~~~ 2 -4 9 3000 ~~~
L'opération *
fait la multiplication avec l'opérande.
Entrée 2:
~~~ 2 * 3 = 1 + 2 * 3 = 2 * 3 * 5 = -3 * 4 = 123 * 234 q ~~~
Sortie 2:
~~~ 6 9 30 -12 28782 ~~~
Comme sur une calculatrice basique, les opérations sont appliquées dans l'ordre. Il n'y a pas de priorité d'opérateurs.
Note d'implémentation: comme il n'y a pas de multiplication en Pep/8, vous devez utiliser une boucle d'addition. Ainsi, vous devez également utiliser une boucle d'addition pour la partie Java. Il est interdit d'utiliser en Java la multiplication ou toute autre opération inconnue de Pep/8.
L'opération /
calcule le quotient de la division entière avec l'opérande.
L'opération %
calcule le reste de la division entière avec l'opérande.
Entrée 3:
~~~ 11 / 4 = 32412 / 124 =
11 % 4 = 32412 % 124 q ~~~
Sortie 3:
~~~ 2 261 3 48 ~~~
Note d'implémentation: de même, utilisez une boucle de soustraction et comptez le nombre de tours.
En cas de division par zéro (avec / ou %), le résultat devient indéfini et toutes les opérations restantes dans le calcul seront sans effet jusqu'à l'affichage du résultat (avec =
ou q
).
Lors de l'affichage du résultat, DIV/0
sera affiché.
Le calcul suivant sera ensuite exécuté normalement.
Entrée 4:
~~~ 1 / 0 = 1 + 1 = 1 + 2 % 0 - 15 = 2 + 2 q ~~~
Sortie 4:
~~~ DIV/0 2 DIV/0 4 ~~~
Dans le cas des nombres négatifs, plusieurs comportements sont théoriquement possibles. Vu qu'il s'agit d'une calculatrice on demandera le comportement généralement utilisé par les mathématiciens, à savoir:
Entrée 5:
~~~ 4 / 3 = 4 % 3 = 3 * 1 + 1 =
4 / -3 = 4 % -3 = -3 * -1 + 1 =
-4 / 3 = -4 % 3 = 3 * -2 + 2 =
-4 / -3 = -4 % -3 = -3 * 2 + 2 q ~~~
Sortie 5:
~~~ 1 1 4 -1 1 4 -2 2 -4 2 2 -4 ~~~
Dans ce dernier exemple, on utilise la définition de la division entière pour illustrer le lien entre le dividende, le diviseur, le quotient et le reste : diviseur * quotient + reste = dividende.
La réalisation de ce programme se fera par groupes d’au plus deux personnes. Chaque membre de l'équipe devra maîtriser tous les aspects du programme.
Le travail pratique comporte deux parties :
Les programmes réalisés devront fonctionner sur la machine des tests publics (voir ci dessous).
ATTENTION L'objectif de la partie Java est de vous aider à concevoir un algorithme qui fonctionne mais qui soit transposable en Pep/8. C'est pourquoi les contraintes particulières suivantes doivent êtres respectés :
new
d’instanciation.char[]
ou int[]
.ATTENTION Si vous ne respectez pas les contraintes, en particulier si vous utilisez une multiplication ou une division, un 0 sera automatiquement attribué pour le livrable.
Vous pouvez faire autant de remises que vous voulez (seule la dernière est conservée).
ATTENTION L'entrée 0 est utilisée pour valider la remise du programme (compilation et exécution minimale). Si ce test ne passe pas un 0 est automatiquement attribué pour le livrable.
Vous pouvez tester automatiquement vos TP via oto:
privat_j
Calc.java
En cas de mauvaise qualité, de mauvais style ou de mauvaise documentation du code, des points négatifs seront appliqués.
Au plus tard le 1er février (au début du cours)
calc.pep
.
Les règles de remises, de vérification et d'évaluation restent les mêmes.Au plus tard le ~~15~~ 22 février (au début du cours)
entree 6
~~~ 0 + 0 = -1 + -1 = -1 + 0 + 2 - -4 - 0 - -8 q ~~~
sortie 6
~~~ 0 -2 13 ~~~
entree 7
~~~ 10 * 0 = 0 * 10 = 10 * -10 = -10 * -10 = 1 + 2 * 3 * 4 + 1 q ~~~
sortie 7
~~~ 0 0 -100 100 37 ~~~
entree 8
~~~ 0 / 10 = 0 % 10 = 10 / 10 = 10 % 10 = 10 / 1 = 10 % 1 = 1 / 10 = 1 % 10 = 25000 / 2 = 25000 % 2 = 25000 / 5000 = 25000 % 5000 = 25001 / 2 = 25001 % 2 = 25001 / 5000 = 25001 % 5000 q ~~~
sortie 8
~~~ 0 0 1 0 10 0 0 1 12500 0 5 0 12500 1 5 1 ~~~
entree 9
~~~ 1 = 0 / 0 = 2 = 10 / 0 / 0 / 0 / 0 + 1 = 3 = 10 % 0 % 0 % 0 % 0 + 1 = 4 = 10 / 0 + 10 % 0 = 5 = -10 / 0 = 6 = -10 % 0 q 7 = ~~~
sortie 9
~~~ 1 DIV/0 2 DIV/0 3 DIV/0 4 DIV/0 5 DIV/0 6 DIV/0 ~~~
entree 10
~~~ 0 / -10 = 0 % -10 = 10 / -10 = 10 % -10 = 10 / -1 = 10 % -1 = 1 / -10 = 1 % -10 = 25000 / -2 = 25000 % -2 = 25000 / -5000 = 25000 % -5000 = 25001 / -2 = 25001 % -2 = 25001 / -5000 = 25001 % -5000 =
-10 / 10 = -10 % 10 = -10 / 1 = -10 % 1 = -1 / 10 = -1 % 10 = -25000 / 2 = -25000 % 2 = -25000 / 5000 = -25000 % 5000 = -25001 / 2 = -25001 % 2 = -25001 / 5000 = -25001 % 5000 =
-10 / -10 = -10 % -10 = -10 / -1 = -10 % -1 = -1 / -10 = -1 % -10 = -25000 / -2 = -25000 % -2 = -25000 / -5000 = -25000 % -5000 = -25001 / -2 = -25001 % -2 = -25001 / -5000 = -25001 % -5000 q ~~~
sortie 10
~~~ 0 0 -1 0 -10 0 0 1 -12500 0 -5 0 -12500 1 -5 1 -1 0 -10 0 -1 9 -12500 0 -5 0 -12501 1 -6 4999 1 0 10 0 1 9 12500 0 5 0 12501 1 6 4999 ~~~