TP1: Calculatrice

L'objectif de ce TP est de développer une calculatrice simple gérant les opérations arithmétiques de base sur les entiers.

Spécification

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.

Opérations d'affichage et de terminaison (= et q)

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).

Opérations d'addition et de soustraction (+ et -)

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 ~~~

Opérations de multiplication (*)

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.

Opérations de division entière (/ et %)

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.

Division par 0

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 ~~~

Division des nombres négatifs

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.

Réalisation

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).

Livrable 1 : Java

Contraintes Java

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 :

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.

Programme à rendre

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:

Évaluation et barème indicatif

En cas de mauvaise qualité, de mauvais style ou de mauvaise documentation du code, des points négatifs seront appliqués.

Date de remise

Au plus tard le 1er février (au début du cours)

Livrable 2 : Pep/8

Programme à rendre

Date de remise

Au plus tard le ~~15~~ 22 février (au début du cours)

Tests privés

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 ~~~