Workshop CAS et évaluation d expressions. Raphaël Shugo Boissel (boisse_r)



Documents pareils
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Traduction des Langages : Le Compilateur Micro Java

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Bases de programmation. Cours 5. Structurer les données

TP1 : Initiation à Java et Eclipse

Utilisation d objets : String et ArrayList

Présentation du langage et premières fonctions

Le langage C. Séance n 4

Cours d initiation à la programmation en C++ Johann Cuenin

EXCEL TUTORIEL 2012/2013

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Algorithmique et Programmation, IMA

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

TP 1. Prise en main du langage Python

Chapitre VI- La validation de la composition.

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

Premiers Pas en Programmation Objet : les Classes et les Objets

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Tp 1 correction. Structures de données (IF2)

Génie Logiciel avec Ada. 4 février 2013

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

TP, première séquence d exercices.

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Algorithme. Table des matières

Programmation par les Objets en Java

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Gestion électronique des procurations

CREG : versailles.fr/spip.php?article803

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Encryptions, compression et partitionnement des données

I. Introduction aux fonctions : les fonctions standards

Chapitre 10. Les interfaces Comparable et Comparator 1

Programmer en JAVA. par Tama

Guide plateforme FOAD ESJ Lille

Utilisez Toucan portable pour vos sauvegardes

Gestion distribuée (par sockets) de banque en Java

Informatique Générale

TUTORIEL INSTALLATION D UNE WENBOX ETHERNET DE WENGO SUR UN MODEM ROUTEUR DG834 G DE NETGEAR

Cours 1: Java et les objets

Initiation à la Programmation en Logique avec SISCtus Prolog

Héritage presque multiple en Java (1/2)

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

J ai peur des souris mais je me soigne Petit manuel à l attention des profs de langues vivantes désireux d affronter le Monstre Informatique

Fiche PanaMaths Calculs avec les fonctions sous Xcas

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

[WINDOWS 7 - LES FICHIERS] 28 avril Logiciel / Windows

Génie Logiciel I. Cours VI - Typage statique / dynamique, fonctions virtuelles et classes abstraites, flots d entrées / sorties, et string

Ingénérie logicielle dirigée par les modèles

les Formulaires / Sous-Formulaires Présentation Créer un formulaire à partir d une table...3

Python - introduction à la programmation et calcul scientifique

Les structures. Chapitre 3

Connexion à SQL server

Maple: premiers calculs et premières applications

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

TD/TP PAC - Programmation n 3

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Auto-évaluation Programmation en Java

Programmation Orientée Objet en C#

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

Chapitre 2. Classes et objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Formation, Audit, Conseil, Développement, UX WinRT Silverlight WPF Android Windows Phone

Les chaînes de caractères

1. Introduction Création d'une requête...2

Corrigés des premiers exercices sur les classes

Infolettre #6: SkyDrive

Formation. Module WEB 4.1. Support de cours

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Classes et Objets en Ocaml.

GOL502 Industries de services

Grille fluide. Une grille fluide sert à structurer la mise en page, la rendre harmonieuse et faciliter le passage au responsive web design

ALGORITHMIQUE ET PROGRAMMATION En C

Dans cette Unité, nous allons examiner

Évaluation et implémentation des langages

Les structures de données. Rajae El Ouazzani

Fiche Pratique. MAJ le 10/04/2013

Claude Delannoy. 3 e édition C++

Solutions du chapitre 4

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Programmation Objet - Cours II

Premiers pas avec Mathematica

Excel 2007 Niveau 3 Page 1

Poker. A rendre pour le 25 avril

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Introduction à Eclipse

TD3: tableaux avancées, première classe et chaînes

Découvrir la messagerie électronique et communiquer entre collègues. Entrer dans le programme Microsoft Outlook Web Access

Construire une application marketing Facebook sur la plateforme Windows Azure

Notions fondamentales du langage C# Version 1.0

Base est le module pour les bases

Transcription:

Workshop CAS et évaluation d expressions Raphaël Shugo Boissel (boisse_r) 23 Novembre 2013

1 Présentation du workshop.................... 2 1.1 Définition du cas..................... 2 1.2 Définition de l évaluation................ 2 1.3 Objectif........................... 2 2 Créer l interface utilisateur................... 2 2.1 Création d une application Windows Forms..... 2 2.2 La fonction d effacement................ 3 3 Les valeurs............................. 4 3.1 La création de la classe Value............. 4 3.2 Les opérations....................... 4 3.3 Les conversions implicites................ 5 3.4 Chaînes de caractères et Value............ 5 3.5 Est-ce que c est zéro?.................. 6 4 Les expressions.......................... 7 4.1 La classe abstraite Exp.................. 7 4.2 L expression constante.................. 7 4.3 L expression variable................... 9 4.4 Les autres expressions.................. 9 5 Créer une expression à partir d une string......... 10 5.1 Lecture d une chaîne en NPI (Notation Polonaise Inverse)............................ 10 5.2 Lecture d une chaîne en notation infixe........ 11 6 Finir l interface.......................... 12 GConfs 2013 1

1 Présentation du workshop 1.1 Définition du cas Le CAS (Computer Algebra System ou système de calcul formel en français), est un système qui a pour objectif de travailler sur des expressions mathématiques qui contiennent par exemple des inconnues (x, y,... ) ou des symboles (π, e,... ). Le CAS peut faire des opérations telles que la dérivé d une expression ou la recherche des solutions d une équation. Exemple d expression sur laquelle un CAS peut travailler : 5 π + 2 x 1.2 Définition de l évaluation Contrairement au CAS l évaluation de l expression va consister à travailler sur des quantités connues et finies. On utilisera alors des variables dont la valeur a été préalablement définie et les constantes telles que π, e,... seront approximées. Le but de l évaluation est de fournir une valeur. 1.3 Objectif L objectif de ce workshop est de créer en C# un petit logiciel qui puisse à la fois faire divers traitements sur une expression comme la dérivée, ou la simplification et qui soit également capable de faire l évaluation de cette expression à condition qu on spécifie les valeurs des variables se trouvant dans l expression. 2 Créer l interface utilisateur 2.1 Création d une application Windows Forms Lorsque vous créez un nouveau projet dans Visual Studio vous vous trouvez face à une multitude de choix. Dans notre cas nous allons utiliser une Application Windows Forms que nous nommerons CAS. Une fois l application créée une fenêtre nommée form1 apparaît à l écran. À l aide de GConfs 2013 2

la boite à outils (généralement située sur le côté de l écran) nous allons insérer les composants suivants : un champ de texte (TextBox) qui nous servira à rentrer les lignes de calculs à traiter, un bouton qui déclenchera l évaluation de l expression, un bouton qui simplifiera l expression, un bouton qui dérivera l expression, une liste de choix (ListBox) qui contiendra l historique de toutes les opérations effectuées, un bouton qui permettra d effacer l historique. Une fois tous ces composants ajoutés, notre interface devrait ressembler à ceci : Figure 1 Exemple d interface La disposition est bien entendu laissée à votre convenance : soyez créatif! 2.2 La fonction d effacement La première fonction que nous allons coder est la fonction qui permet d effacer l historique, c est-à-dire celle qui permet de vider la liste de choix, lorsque l on appuie sur Clear. GConfs 2013 3

Aide : pour créer une fonction qui est appelée au moment où on clique sur un bouton, double-cliquez simplement sur le bouton en question. 3 Les valeurs 3.1 La création de la classe Value Nous allons commencer par créer une classe Value. Cette classe représentera une valeur constante de la forme : a + b π + c e Classe dans laquelle nous ajouterons donc trois valeurs flottantes a, b, c. On demande ici uniquement la création de la classe : les méthodes qui vont modifier les valeurs de ces variables seront écrites plus tard. Note : cette représentation va nous permettre par exemple d effectuer des opérations telles que 2π + π sans perte de précision. 3.2 Les opérations C# nous donne la possibilité de définir nos propres opérateurs (+,,, /,... ) sur des types que nous avons nous-même créés. C est ce que nous allons faire avec Value. En effet, il serait agréable de pouvoir utiliser directement les opérateurs + / sur nos valeurs plutôt que de faire appel à des fonction comme Add, Sub,... qui alourdiraient vite le code. La syntaxe est la suivante : public static Value operator +(Value A, Value B) Value C = new Value(); return C; Note : un opérateur doit obligatoirement être déclaré public static. GConfs 2013 4

Nous allons donc coder les opérateurs +,, et / en considérant que si l un des deux membres de l opération est un flottant le résultat sera sous la forme d un flottant. 3.3 Les conversions implicites Parfois il serait plus agréable de pouvoir utiliser un int ou un float en tant que Value et inversement. Pour cela C# dispose des opérateurs de conversions implicites : c est-à-dire que c est le compilateur qui décidera quand est-ce-qu il est nécessaire d utiliser un int ou un float ou bien une Value. La syntaxe est la suivante : public static implicit operator Value(int A) Value C = new Value(); return C; Note : l extrait de code ci-dessus montre comment écrire une conversion implicite d un int vers une Value. Nous allons donc écrire les conversions suivantes : int Value float Value Value float 3.4 Chaînes de caractères et Value Une Value vers une chaîne On se propose d écrire la fonction ToString() qui retourne la chaîne de caractères correspondante à la valeur. Voici le prototype de la fonction : public override string ToString() Note : le mot-clé override vient du fait qu il existe une méthode ToString par défaut dans chaque classe. GConfs 2013 5

Une chaîne vers une Value On se propose d écrire la fonction FromString() qui retourne la valeur correspondante à une chaîne de caractères. Afin de simplifier la fonction et parce que les autres cas sont inutiles, nous ne considèrerons que les chaînes de caractères de la forme suivante : "10", "10.0", "11.97", " 11.97",... "10 π", "10.0 π", "11.97 π", " 11.97 π",... "10 e", "10.0 e", "11.97 e", " 11.97 e",... On considérera également qu il y a toujours une espace entre le nombre et π ou e. Les opérations suivantes sur les chaînes de caractères pourront être utilisées : string number = "10.0"; number = number.replace(".", ","); // number contient maintenant "10,0" float a = Convert.ToSingle("10,65"); // le nombre doit contenir une, et non un. pour que ToSingle fonctionne Voici le prototype de la fonction : public static Value FromString(string str) Note : La méthode est statique car elle retourne une nouvelle Value. Elle n a donc pas besoin de dépendre d une Value déjà existante (d une instance de Value). On aurait également pu écrire cela comme un constructeur. 3.5 Est-ce que c est zéro? Il faut maintenant créer la méthode IsNull qui retourne vraie seulement si la Value vaut 0 c est-à-dire si a = b = c = 0 (on laissera de côté les cas pathologiques de la forme a = 0 b = e et c = π). GConfs 2013 6

Voici le prototype de la fonction : public static bool IsNull() 4 Les expressions 4.1 La classe abstraite Exp Nous allons créer la classe abstraite Exp qui va définir les méthodes qui devront être présentes dans chacune des classes qui vont hériter de Exp. Cette classe abstraite va se contenter de définir les prototypes des méthodes et non les implémenter. Afin d éviter tout problème lors de la réalisation de cette classe le code basique de la classe est disponible ci-dessous : abstract class Exp public abstract Exp Simplify(); public abstract Exp Diff(string Var); public abstract Value Evaluate(Dictionary<string, Value> Variables); public abstract Value ToValue(); public abstract bool IsNull(); public abstract bool IsConst(); public virtual new string ToString()return ""; Par la suite nous allons modifier cette classe mais pour le moment, nous pouvons continuer en la laissant en l état. 4.2 L expression constante Commençons par coder une expression assez particulière, l expression constante. Pour déclarer une classe qui hérite d une autre classe la syntaxe est la suivante : class Cst : Exp GConfs 2013 7

Toute classe qui hérite d une classe abstraite doit impérativement redéfinir les méthodes marquées comme abstract, déclarées dans la classe abstraite dont il hérite. Dans notre cas Cst va devoir redéfinir Simplify, Diff, Evaluate, ToValue, IsNull, IsConst, ToString (même si cette méthode est marquée comme virtual et non comme abstract, nous allons quand même la redéfinir). Pour redéfinir une méthode dans une classe il faut utiliser la syntaxe ci-dessous : public override bool IsConst() Maintenant que nous savons comment faire nous allons le faire. L expression constante est une expression qui est construite avec une valeur. Il est donc nécessaire d écrire un constructeur dont le prototype est le suivant : public Cst(Value value) Note : vous devez définir la/les différentes variable(s) nécessaire(s) vous-même pour que ce constructeur puisse fonctionner. La particularité de la classe constante est que quelque soit l ensemble de variables passé en paramètre, Evaluate renverra toujours la valeur avec laquelle la classe a été construite. La dérivé renverra toujours la constante construite avec la valeur nulle (new Cst(0)). IsNull testera si la valeur est nulle, IsConst renverra toujours vrai, ToValue retournera la valeur avec laquelle la classe a été initialisée et ToString retournera la chaîne de caractères correspondant à la valeur avec laquelle la chaîne a été initialisée. Implémentons donc ces méthodes. Symplify est une commande qui renvoie l expression simplifiée mais comme dans le cas d une constante il n y a rien à simplifier, nous renverrons simplement une nouvelle constante initialisée avec la même valeur que la première. GConfs 2013 8

4.3 L expression variable La structure de l expression variable reprend celle de la constante : class Var : Exp Nous commencerons donc par écrire le constructeur de l expression variable qui prend en paramètre une string qui représentera le nom de la variable : public Var(string value) Note : vous devez définir la/les différentes variable(s) nécessaire(s) vous même pour que ce constructeur puisse fonctionner. Il devrait être assez facile maintenant d implémenter les méthodes Diff, ToValue, IsNull, IsConst, ToString. On considérera que IsNull() ne peut jamais être vraie et que ToValue renvoie null (ToValue n existe que s il y a possibilité de transformer l expression en valeur or ce n est pas le cas ici). Intéressons nous maintenant à Evaluate. Pour accéder à un dictionnaire, la syntaxe est la même que pour accéder à un tableau. En effet, pour récupérer la valeur de la variable toto dans le dictionnaire de variables, en supposant qu elle existe, il suffit de faire Variables[toto] et nous obtiendrons sa valeur. En sachant cela nous pouvons donc coder la fonction Evaluate pour les expressions variables. Une fois de plus pour Symplify il n y a rien à simplifier, nous renverrons simplement une nouvelle expression variable initialisée avec la même valeur que la première. 4.4 Les autres expressions Après avoir codé les deux expressions particulières nous allons maintenant pouvoir travailler sur des expressions plus conventionnelles. Nous GConfs 2013 9

allons commencer par coder l addition (Add), la soustraction (Sub), la division (Div) et la multiplication (Mul). Vous pouvez bien sûr rajouter par la suite autant d expression qu il vous plaira : cos et sin par exemple. Toutes ces expressions ont un constructeur similaire qui prend en paramètre deux expressions (A et B) qui sont respectivement la partie gauche et la partie droite de l opération : public Add(Exp A, Exp B) Ainsi pour déclarer Toto = 5 + 2 nous déclarerons : toto = new Add(new Cst(5), new Cst(2)). Nous pouvons à présent coder toutes les opérations nécessaires pour que ces expressions fonctionnent correctement. Note : Soignez particulièrement votre fonction de simplification pour chaque expression ; c est elle qui fera la force de votre CAS. 5 Créer une expression à partir d une string 5.1 Lecture d une chaîne en NPI (Notation Polonaise Inverse) Vous connaissez sans doute le principe de la notation polonaise inverse. Pour rappel, 5 + 8 6 s écrit en npi 8 6 5 +. À vous de trouver un algorithme (en utilisant une pile de string : Stack<string> en C#) qui permet de transformer une chaîne en npi vers une expression. Note : On pourra utiliser un switch... case GConfs 2013 10

5.2 Lecture d une chaîne en notation infixe La notation infixe est la notation que nous utilisons tous les jours. Par exemple : (5 + x) 10 (π + 10) La prise en charge de ce genre de notation est une étape plutôt délicate. C est pourquoi nous allons procéder en deux temps. Dans un premier temps nous allons convertir la chaîne en notation infixe vers une chaîne en npi puis nous utiliserons la fonction précédemment écrite pour en extraire une expression. Un des algorithmes qui permet de passer d une notation infixe à une notation en npi s appelle Shunting-yard algorithm (littéralement algorithme de la voie de garage). Le nom de cet algorithme vient de la façon dont on procède pour créer la chaîne en npi. Voici une version simplifiée de son fonctionnement : On utilisera une pile de string (Stack<string> en C#) pour la voie de garage et une string pour la sortie. L élément est ( : on empile ( L élément est ) : on dépile et on met les éléments dépilés dans la sortie jusqu à trouver l élément (. L élément ( ne sera pas ajouté à la sortie. L élément est un nombre ou une variable : on le met directement dans la sortie L élément est un opérateur opp1 : 1. Tant qu il y a un opérateur opp2 sur le sommet de la pile et que la priorité de opp2 est supérieure ou égale à la priorité de opp1, on dépile opp2 et on le met dans la sortie. 2. On met opp1 au sommet de la pile. Quand il n y a plus d éléments on dépile les éléments de la pile jusqu à ce que la pile soit vide. Attention : cet algorithme ne marche que si tous les opérateurs sont associatifs à gauche. Voir le véritable Shunting-yard algorithm pour les autres cas. GConfs 2013 11

6 Finir l interface Maintenant que notre CAS est capable de plein de choses, il faut finir l interface afin de permettre à l utilisateur de rentrer une expression puis d effectuer tout un tas d opérations dessus. Pour cette dernière étape vous êtes totalement libre! GConfs 2013 12