Traitement d'une feuille de calcul TABLE DES MATIÈRES Traitement d'une feuille de calcul...1 1.Introduction......2 2.Utilisation du programme......2 1.Principe général......2 2.Test du programme......2 3.Fonctionnement du tableur......3 1.Description d'une feuille de calcul......3 2.Structures de données particulières......3 1.Les cellules......3 2.Les expressions......3 3.Fonctions particulières......4 1.Référence a une autre cellule......4 2.Recherche d'une cellule.....5 3.Autres fonctions......5 4.Limites du programme et problèmes rencontrés......5 1.Limites......5 2.Problèmes rencontrés......5 Gaël Cuenot Année 2006 / 2007 Page: 1
1.Introduction Ce projet consiste à écrire un langage qui permet d'écrire des feuilles de calcul. Le but du programme est donc de représenter en mémoire le contenu de la feuille de calcul (cellules, expressions, valeurs...) et d'afficher les différentes cellules de la feuille avec l'évaluation de la valeur de l'expression contenue dans chaque cellule de la feuille. 2.Utilisation du programme 1. Principe général La compilation du programme génère un fichier exécutable: tableur. Pour traiter une feuille de calcul, il suffit d'exécuter: $./tableur < feuille_calcul.txt Le résultat de toutes les cellules s'affichera alors à l'écran. 2. Test du programme Pour faciliter les test, une feuille de calcul de test est fournie dans mon archive. Il s'agit du fichier feuille_test.txt, il contient quelques cas de test permettant d'évaluer le fonctionnement de mon programme et de voir la structure que doit avoir une feuille de calcul pour fonctionner. Les règles d'écriture d'une feuille de calcul seront détaillée dans le chapitre suivant de cette documentation. Pour exécuter la feuille de test, il faut procéder comme expliquer dans le point précédent, en exécutant la ligne suivante: $./tableur < feuille_test.txt Année 2006 / 2007 Page: 2
3.Fonctionnement du tableur 1. Description d'une feuille de calcul Une feuille de calcul est composé de cellules. Une et une seule cellule peut être décrite sur chaque ligne de la feuille. Chaque cellule est identifiée par des coordonnées (2 entiers: abscisse, ordonnée), suivies du signe "=" puis une valeur, opération, fonction... La fin d'une cellule est identifiée par le caractère ";". Chaque ligne de la feuille doit impérativement se terminer par les trois "caractères" suivants: point-virgule, espace, retour chariot. Exemple: [1,1]=2; [1,3]=2-4; 2. Structures de données particulières 1. Les cellules Structure de donnée permettant de stocker une cellule en mémoire: struct cell { struct cell * prec; enum cell_type type; struct coord co; /* coordonnnes */ union cellv { char * str; double nbr; } v; }; Une cellule contient donc au final un type permettant d'identifier le contenu de la cellule, des coordonnées permettant de connaître la position de la cellule et les 2 types de données qu'elle peut contenir: un nombre (double) et une chaîne de caractères (char *). Enfin chaque cellule contient un pointeur vers la cellule précédente (prec) qui permet de remonter l'ensemble des cellules pour en chercher une en particulier. Dans la première cellule de la feuille, prec est à la valeur NULL. 2. Les expressions Une expression est une structure qui peut contenir n'importe quelle donné de la feuille avant qu'elles soient identifiées ou stockées dans une autre structure plus précise. Année 2006 / 2007 Page: 3
struct expr { enum expr_type type; union expru { char * chaine; double nombre; struct expropun opun; struct expropbin opbin; struct expropsousch opsousch; struct coord co; /* coordonnees */ int absco; /* valeur d'une abcisse ou ordonnee absolue */ enum coord_type xtyp; /* type de coordonnes pour l'abscisse */ enum coord_type ytyp; /* type de coordonnes pour l'ordonnee */ } u; }; Un peu comme une cellule, une expression contient une variable type permettant d'identifier le type de données contenues. Puis un type ou une structure permettant de stocker les différents type de données possibles. Elle possède des types spéciaux lui permettant de stocker des coordonnées avec toute la gestion que cela nécessite. La variable co permet de stocker des coordonnée (x/y). absco permet de stocker une valeur d'abscisse ou d'ordonnée, cette variable est utilisée lors de la définition de coordonnées absolues. Enfin, dans le cas ou l'expression définit les coordonnées d'une cellule, les variables xtyp et ytyp permettent de savoir si l'abscisse (x) ou l'ordonnée (y) rencontrée doit être utiliser pour identifier une cellule avec des coordonnées relatives ou absolues (valeurs possibles contenues dans enum coord_type. 3. Fonctions particulières 1. Référence a une autre cellule struct expr * cell_ref(struct expr * x, struct expr * y) Renvoi une expression contenant des coordonnées identifiées selon qu'elles soient relatives ou absolues pour chaque composante (x et y). Si une des coordonnée est négative, la valeur négative est calculée avant d'être stockée. void cell_eval_ref(struct expr * e, struct cell * c) Copie dans la cellule passée en paramètre la cellule à laquelle fait référence l'expression passée également en paramètre. Dans un premier temps, les coordonnées de la cellule cherchée sont calculées puis cette cellule est recherchée et recopiée. Année 2006 / 2007 Page: 4
2. Recherche d'une cellule struct cell * cell_backward_search(int x, int y, struct cell * c) Cette fonction effectue une recherche en arrière par rapport à la cellule ou on se trouve, c'est à dire de cette cellule jusqu'au début de la feuille de calcul. Les coordonnées de la cellule cherché sont passés en paramètres (x, y). La fonction s'appelle récursivement tant que la cellule n'a pas été trouvée ou tant qu'on n'est pas arrivé au début de la feuille de calcul. La cellule trouvée sera recopiée dans la cellule passée en paramètre de cette fonction. 3. Autres fonctions Les autres fonctions sont plus simples et peuvent être regroupées en trois catégories: Tri des données selon leur type ; évaluation de l'opération contenue dans la cellule ; fonctions d'accès aux données des différentes structures. 4.Limites du programme et problèmes rencontrés 1. Limites Mon programme se limite aux fonctions de base, par manque de temps, les opérations conditionnelles ne sont pas gérées. 2. Problèmes rencontrés Certaines fonctions du programme ne fonctionnent pas correctement, la référence à une cellule de la feuille de calcul notamment. J'ai rencontré des difficultés dans la fonction: struct expr * cell_ref(struct expr * x, struct expr * y) Pour une raison que je ne comprend pas, la valeur des coordonnées (surtout x) sont recopiées sans problème dans l'expression à l'intérieur d'une condition if mais ne sont plus accessibles une fois sorti de cette condition. Année 2006 / 2007 Page: 5
Je n'ai pas réussi à régler ce problème ce qui fait que mon programme n'arrive pas à récupérer une valeur ou opération d'une cellule dans une autre. Les erreurs sont en général gérées du moment que l'expression est reconnue par la grammaire du langage mis en place. Année 2006 / 2007 Page: 6