From 7a09c2b5e6483613b2400b8e9e8c60f8bfc55aea Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 10 Jan 2023 11:53:46 -0500 Subject: Initial commit --- rapport/main.tex | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 rapport/main.tex (limited to 'rapport/main.tex') diff --git a/rapport/main.tex b/rapport/main.tex new file mode 100644 index 0000000..f7afdcb --- /dev/null +++ b/rapport/main.tex @@ -0,0 +1,66 @@ +\documentclass[a11paper, 11pt]{article} + +\usepackage{document} +\usepackage{titlepage} +\usepackage{float} +\usepackage{algorithm} +\usepackage{algpseudocode} +\usepackage{frpseudocode} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} + +% \addbibresource{bibliography.bib} +% \nofiles + +% \institution{Université de Sherbrooke} +% \faculty{Faculté de génie} +% \department{Département de génie électrique et de génie informatique} +\title{Titre du document} +\classnb{GEN420} +\class{Mathématiques des circuits logiques} +\author{ + \addtolength{\tabcolsep}{-0.4em} + \begin{tabular}{rcl} % Ajouter des auteurs au besoin + Benjamin Chausse & -- & chab1704 \\ + Édouard Laurent & -- & laue \\ % TODO: demander le numéro du CIP + \end{tabular} +} +% \teacher{Benjamin Chausse} +% \location{Sherbrooke} +% \date{\today} + + +\begin{document} +\maketitle +\newpage +% \tableofcontents +% \newpage + +\section{Diagrammes UML} + +\section{Pseudo-code} + +Ceci est un test pour voir comment le package frpseudocode fonctionne. +Du pseudo-code est pertinent pour l'APP ira ici. + +\begin{algorithm} +\caption{Euclid's algorithm}\label{alg:euclid} +\begin{algorithmic}[1] + \Function{Euclid}{$a, b$} + \While{$a \neq b$} + \If{$a > b$} + \State $a \gets a - b$ + \Else + \State $b \gets b - a$ + \EndIf + \EndWhile + \State \Return $a$ + \EndFunction +\end{algorithmic} +\end{algorithm} + + + +% \newpage +% \printbibliography[heading=bibintoc] +\end{document} -- cgit v1.2.3 From d9e7b4893a0debc0d170122285db780a7b93e703 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Tue, 10 Jan 2023 12:00:43 -0500 Subject: Update page présentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rapport/main.tex | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'rapport/main.tex') diff --git a/rapport/main.tex b/rapport/main.tex index f7afdcb..5e9cccf 100644 --- a/rapport/main.tex +++ b/rapport/main.tex @@ -15,17 +15,17 @@ % \institution{Université de Sherbrooke} % \faculty{Faculté de génie} % \department{Département de génie électrique et de génie informatique} -\title{Titre du document} -\classnb{GEN420} -\class{Mathématiques des circuits logiques} +\title{Rapport d'APP} +\classnb{GEN241} +\class{Modélisation et programmation orientée objet} \author{ \addtolength{\tabcolsep}{-0.4em} \begin{tabular}{rcl} % Ajouter des auteurs au besoin Benjamin Chausse & -- & chab1704 \\ - Édouard Laurent & -- & laue \\ % TODO: demander le numéro du CIP + Édouard Laurent & -- & laue\textbf{XXXX} \\ % TODO: demander numéro du CIP \end{tabular} } -% \teacher{Benjamin Chausse} +\teacher{Eugène Morin} % \location{Sherbrooke} % \date{\today} @@ -33,8 +33,8 @@ \begin{document} \maketitle \newpage -% \tableofcontents -% \newpage +\tableofcontents +\newpage \section{Diagrammes UML} -- cgit v1.2.3 From 8dd2515cc25fc558f70884894bbc9c7d994e9754 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Sun, 15 Jan 2023 00:48:25 -0500 Subject: Remove never present teammate from authors --- rapport/main.pdf | Bin 138334 -> 137828 bytes rapport/main.tex | 1 - 2 files changed, 1 deletion(-) (limited to 'rapport/main.tex') diff --git a/rapport/main.pdf b/rapport/main.pdf index 7336053..1fbfb35 100644 Binary files a/rapport/main.pdf and b/rapport/main.pdf differ diff --git a/rapport/main.tex b/rapport/main.tex index 5e9cccf..a465927 100644 --- a/rapport/main.tex +++ b/rapport/main.tex @@ -22,7 +22,6 @@ \addtolength{\tabcolsep}{-0.4em} \begin{tabular}{rcl} % Ajouter des auteurs au besoin Benjamin Chausse & -- & chab1704 \\ - Édouard Laurent & -- & laue\textbf{XXXX} \\ % TODO: demander numéro du CIP \end{tabular} } \teacher{Eugène Morin} -- cgit v1.2.3 From e37d4911c750550896c4155f452736200d977b83 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Mon, 16 Jan 2023 02:51:22 -0500 Subject: Almost done... --- .gitignore | 3 + canevas.cpp | 18 +++-- canevas.h | 23 +++--- couche.h | 5 +- forme.h | 8 +- rapport/algpseudocode.sty | 92 +++++++++++++++++++++++ rapport/class.png | Bin 0 -> 142596 bytes rapport/frpseudocode.sty | 7 +- rapport/main.pdf | Bin 137828 -> 577604 bytes rapport/main.tex | 183 ++++++++++++++++++++++++++++++++++++++++++---- rapport/sequence.png | Bin 0 -> 102706 bytes rapport/usecase.png | Bin 0 -> 264876 bytes rectangle.h | 12 +-- tests.cpp | 68 +++++++++++++++++ tests.h | 1 - vecteur.h | 21 +++--- 16 files changed, 375 insertions(+), 66 deletions(-) create mode 100644 rapport/algpseudocode.sty create mode 100644 rapport/class.png create mode 100644 rapport/sequence.png create mode 100644 rapport/usecase.png (limited to 'rapport/main.tex') diff --git a/.gitignore b/.gitignore index 6a1ed24..71895e2 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ tags *.run.xml *.synctex _minted-* +*.lof +*.lot +*.toc diff --git a/canevas.cpp b/canevas.cpp index 959e681..edcb8be 100644 --- a/canevas.cpp +++ b/canevas.cpp @@ -10,7 +10,7 @@ Canevas::Canevas() { Couche couches[MAX_COUCHES]; - couches[0].changerEtat(STATE_ACTIVE); + activerCouche(0); } Canevas::~Canevas() { @@ -37,13 +37,6 @@ bool Canevas::activerCouche(int index) { return couches[index].changerEtat(STATE_ACTIVE); }; -bool Canevas::cacherCouche(int index) { - if (index < 0 || index >= MAX_COUCHES) - return false; - couches[index].changerEtat(STATE_INACTIVE); - return true; -}; - bool Canevas::ajouterForme(Forme *p_forme) { int active = -1; for (int i = 0; i < MAX_COUCHES; i++) @@ -88,6 +81,15 @@ void Canevas::afficher(ostream & s) { }; }; +void Canevas::getEtats(ostream &s) { + s << "[ "; + for (int i = 0; i < MAX_COUCHES; i++) { + s << STATES[couches[i].getEtat()]; + if (i < MAX_COUCHES - 1) s << ", "; + else s << " ]\n"; + }; +} + bool Canevas::reinitialiserCouche(int index) { if (index < 0 || index >= MAX_COUCHES){ return false; diff --git a/canevas.h b/canevas.h index 64b833a..6ccd68a 100644 --- a/canevas.h +++ b/canevas.h @@ -22,22 +22,17 @@ class Canevas { public: Canevas(); ~Canevas(); - - bool reinitialiser(); - - bool activerCouche(int index); - bool cacherCouche(int index); - - bool ajouterForme(Forme *p_forme); - bool retirerForme(int index); - + bool reinitialiser(); + bool activerCouche(int index); + bool ajouterForme(Forme *p_forme); + bool retirerForme(int index); double aire(); - bool translater(int deltaX, int deltaY); - void afficher(ostream & s); - bool reinitialiserCouche(int index); - + bool translater(int deltaX, int deltaY); + void afficher(ostream &s); + void getEtats(ostream &s); + bool reinitialiserCouche(int index); private: - Couche couches[MAX_COUCHES]; + Couche couches[MAX_COUCHES]; }; #endif diff --git a/couche.h b/couche.h index 4ef44a2..ec71444 100644 --- a/couche.h +++ b/couche.h @@ -19,18 +19,15 @@ class Couche { private: - int state; + int state; Vecteur vecteur; public: - // Initialisation Couche(); ~Couche(); - // Informations int getEtat(); Forme *getForme(int index); double aire(); void afficher(ostream &s); - // Modifications bool changerEtat(int newState); bool translater(int deltaX, int deltaY); bool ajouterForme(Forme *f); diff --git a/forme.h b/forme.h index c719366..f1fb5b6 100644 --- a/forme.h +++ b/forme.h @@ -19,11 +19,11 @@ class Forme { public: Forme(int x = 0, int y = 0); virtual ~Forme(); - void translater(int deltaX, int deltaY); + void translater(int deltaX, int deltaY); Coordonnee getAncrage(); - void setAncrage(Coordonnee c); - virtual double aire() = 0; - virtual void afficher(ostream & s) = 0; + void setAncrage(Coordonnee c); + virtual double aire() = 0; + virtual void afficher(ostream & s) = 0; protected: Coordonnee ancrage; }; diff --git a/rapport/algpseudocode.sty b/rapport/algpseudocode.sty new file mode 100644 index 0000000..8cc2bf0 --- /dev/null +++ b/rapport/algpseudocode.sty @@ -0,0 +1,92 @@ +% PSEUDOCODE ALGORITHMIC STYLE -- Released 27 APR 2005 +% for LaTeX version 2e +% +% Copyright Szasz Janos +% E-mail szaszjanos@users.sourceforge.net +% Based on Peter Williams's algorithmic.sty +% +\NeedsTeXFormat{LaTeX2e}% +\ProvidesPackage{algpseudocode}% +\RequirePackage{ifthen}% +\RequirePackage{algorithmicx}% +\typeout{Document Style - pseudocode environments for use with the `algorithmicx' style}% +% +\def\ALG@noend{f}% +\newboolean{ALG@compatible}% +\setboolean{ALG@compatible}{false}% +% +\DeclareOption{noend}{\def\ALG@noend{t}}% +\DeclareOption{end}{\def\ALG@noend{f}}% +\DeclareOption{compatible}{\typeout{For compatibility mode use algcompatible.sty!!!}\setboolean{ALG@compatible}{true}}% +\DeclareOption{noncompatible}{\setboolean{ALG@noncompatible}{false}}% +\ProcessOptions% +% +% *** DECLARATIONS *** +% +\algnewlanguage{pseudocode}% +\alglanguage{pseudocode}% +% +% *** KEYWORDS *** +% +\algnewcommand\algorithmicend{\textbf{end}} +\algnewcommand\algorithmicdo{\textbf{do}} +\algnewcommand\algorithmicwhile{\textbf{while}} +\algnewcommand\algorithmicfor{\textbf{for}} +\algnewcommand\algorithmicforall{\textbf{for all}} +\algnewcommand\algorithmicloop{\textbf{loop}} +\algnewcommand\algorithmicrepeat{\textbf{repeat}} +\algnewcommand\algorithmicuntil{\textbf{until}} +\algnewcommand\algorithmicprocedure{\textbf{procedure}} +\algnewcommand\algorithmicfunction{\textbf{function}} +\algnewcommand\algorithmicif{\textbf{if}} +\algnewcommand\algorithmicthen{\textbf{then}} +\algnewcommand\algorithmicelse{\textbf{else}} +\algnewcommand\algorithmicrequire{\textbf{Require:}} +\algnewcommand\algorithmicensure{\textbf{Ensure:}} +\algnewcommand\algorithmicreturn{\textbf{return}} +\algnewcommand\textproc{\textsc} +% +% *** DECLARED LOOPS *** +% +\algdef{SE}[WHILE]{While}{EndWhile}[1]{\algorithmicwhile\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicwhile}% +\algdef{SE}[FOR]{For}{EndFor}[1]{\algorithmicfor\ #1\ \algorithmicdo}{\algorithmicend\ \algorithmicfor}% +\algdef{S}[FOR]{ForAll}[1]{\algorithmicforall\ #1\ \algorithmicdo}% +\algdef{SE}[LOOP]{Loop}{EndLoop}{\algorithmicloop}{\algorithmicend\ \algorithmicloop}% +\algdef{SE}[REPEAT]{Repeat}{Until}{\algorithmicrepeat}[1]{\algorithmicuntil\ #1}% +\algdef{SE}[IF]{If}{EndIf}[1]{\algorithmicif\ #1\ \algorithmicthen}{\algorithmicend\ \algorithmicif}% +\algdef{C}[IF]{IF}{ElsIf}[1]{\algorithmicelse\ \algorithmicif\ #1\ \algorithmicthen}% +\algdef{Ce}[ELSE]{IF}{Else}{EndIf}{\algorithmicelse}% +\algdef{SE}[PROCEDURE]{Procedure}{EndProcedure}% + [2]{\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}% + {\algorithmicend\ \algorithmicprocedure}% +\algdef{SE}[FUNCTION]{Function}{EndFunction}% + [2]{\algorithmicfunction\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}% + {\algorithmicend}% +% +\ifthenelse{\equal{\ALG@noend}{t}}% + {% + \algtext*{EndWhile}% + \algtext*{EndFor}% + \algtext*{EndLoop}% + \algtext*{EndIf}% + \algtext*{EndProcedure}% + \algtext*{EndFunction}% + }{}% +% +% *** OTHER DECLARATIONS *** +% +\algnewcommand\Require{\item[\algorithmicrequire]}% +\algnewcommand\Ensure{\item[\algorithmicensure]}% +\algnewcommand\Return{\algorithmicreturn{} }% +\algnewcommand\Call[2]{\textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}}% +% +% +% +\ifthenelse{\boolean{ALG@compatible}}% + {% + \ifthenelse{\equal{\ALG@noend}{t}}% + {\RequirePackage[noend]{algcompatible}}% + {\RequirePackage{algcompatible}}% + }% + {}% +% diff --git a/rapport/class.png b/rapport/class.png new file mode 100644 index 0000000..cfb3804 Binary files /dev/null and b/rapport/class.png differ diff --git a/rapport/frpseudocode.sty b/rapport/frpseudocode.sty index 06be0cc..8e1732a 100644 --- a/rapport/frpseudocode.sty +++ b/rapport/frpseudocode.sty @@ -9,7 +9,7 @@ %% Functions %% \algrenewcommand\algorithmicprocedure{\textbf{PROCÉDURE}} \algrenewcommand\algorithmicfunction{\textbf{FONCTION}} -\algrenewcommand\algorithmicreturn{\textbf{RENVOYER}} +\algrenewcommand\algorithmicreturn{Retourner} \algrenewtext{Procedure}[2]% {\algorithmicprocedure\ \textproc{#1}\ifthenelse{\equal{#2}{}}{}{(#2)}\ :} @@ -68,6 +68,11 @@ \algrenewtext{ENDIF}[0]% {\algorithmicend\ \algorithmicifm} + +\algtext*{EndWhile}% Remove "end while" text +\algtext*{EndIf}% Remove "end if" text +% \algtext*{EndFunction}% Remove "end if" text + %% Logical %\algrenewcommand{\algorithmicnot}{\textbf{non}} %\algrenewcommand{\algorithmicand}{\textbf{et}} diff --git a/rapport/main.pdf b/rapport/main.pdf index 1fbfb35..325b471 100644 Binary files a/rapport/main.pdf and b/rapport/main.pdf differ diff --git a/rapport/main.tex b/rapport/main.tex index a465927..638a69d 100644 --- a/rapport/main.tex +++ b/rapport/main.tex @@ -4,6 +4,9 @@ \usepackage{titlepage} \usepackage{float} \usepackage{algorithm} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage{tikz-uml} \usepackage{algpseudocode} \usepackage{frpseudocode} \usepackage[T1]{fontenc} @@ -12,6 +15,7 @@ % \addbibresource{bibliography.bib} % \nofiles + % \institution{Université de Sherbrooke} % \faculty{Faculté de génie} % \department{Département de génie électrique et de génie informatique} @@ -24,7 +28,7 @@ Benjamin Chausse & -- & chab1704 \\ \end{tabular} } -\teacher{Eugène Morin} +\teacher{Domingo Palao Muñoz} % \location{Sherbrooke} % \date{\today} @@ -33,31 +37,178 @@ \maketitle \newpage \tableofcontents +\listoffigures +\listoftables \newpage \section{Diagrammes UML} -\section{Pseudo-code} +La figure \ref{fig:class} montre les diverses relation entre les classes de +graphicus-02. Elle permet d'observer la hiérarchie des classes ainsi que les +facteurs de dépendance entre les classes. + +\begin{figure}[H] % Diagramme de classes {{{ +\centering +\caption{Diagrame de classes de graphicus-02}\label{fig:class} +\includegraphics[width=0.8\textwidth]{class.png} +\end{figure} % }}} + +La figure \ref{fig:sequence} montre comment l'application procéderait +lorsqu'un utilisateur voudrait activer la couche 1 du canevas alors que la +couche 0 est présentement active. Les autres couches ont été omises pour +alléger le diagramme. + +\begin{figure}[H] % Diagramme de séquence {{{ +\centering +\caption{Diagrame de séquence d'activation de couche}\label{fig:sequence} +\includegraphics[width=\textwidth]{sequence.png} +\end{figure} % }}} + -Ceci est un test pour voir comment le package frpseudocode fonctionne. -Du pseudo-code est pertinent pour l'APP ira ici. +La figure \ref{fig:usecase} montre les différentes actions que l'utilisateur +peut exécuter dans l'application. Nous voyos par la suite comment certaines de +ces actions agissent en arrière plan et dépendent d'autres actions (parfois +même d'autres actions accessibles à l'utilisateur). -\begin{algorithm} -\caption{Euclid's algorithm}\label{alg:euclid} +\begin{figure}[H] +\centering\caption{Diagramme de cas d'utilisation}\label{fig:usecase} +\includegraphics[width=\textwidth]{usecase.png} +\end{figure} + + +\section{Pseudo-code} + +\begin{algorithm} % {{{ +\caption{Ajout d'un élément au vecteur}\label{alg:ajouterForme} \begin{algorithmic}[1] - \Function{Euclid}{$a, b$} - \While{$a \neq b$} - \If{$a > b$} - \State $a \gets a - b$ - \Else - \State $b \gets b - a$ - \EndIf - \EndWhile - \State \Return $a$ + \Function{Vecteur::ajouterForme}{$f$}{ Booléen}\\ + \hspace{.5cm}// $f$: Forme à ajouter au vecteur\\ + \hspace{.5cm}// $Vecteur::taille$: nombre d'éléments actuellement dans le vecteur (entier)\\ + \hspace{.5cm}// $Vecteur::capacite$: capacité maximale du vecteur actuellement (entier)\\ + \hspace{.5cm}// $Vecteur::formes$: Liste de pointeurs vers les formes du vecteur (*Forme)\\ + \textbf{DÉBUT}\\ + \hspace{.5cm}// $newCapacite$: nouvelle capacité du vecteur (entier)\\ + \hspace{.5cm}// $newFormes$: nouvelle liste de pointeurs vers les formes du vecteur (*Forme) + \If{$f$ est de valeur nulle} + \Comment{Vérifier si la forme est valide} + \State\Return{Faux} + \EndIf + \If{$Vecteur::taille =\joinrel= Vecteur::capacite$} + \Comment{Si le vecteur est plein} + \State $newCapacite := Vecteur::capacite\times2$ + \If{L'espace disponible en mémoire $<$ $newCapacite\times taille(Forme)$} + \State\Return{Faux} + \EndIf + \State $newFormes :=\ $allouer$(newCapacite\times taille(Forme))$ + \For{\textbf{CHAQUE} Forme $i$ dans $Vecteur::formes$} + \State $newFormes[i] := Vecteur::formes[i]$ + \EndFor + \State $Vecteur::capacite := newCapacite$ + \State libérer$(Vecteur::formes)$ + \State $Vecteur::formes := newFormes$ + \EndIf + \State $Vecteur::taille := Vecteur::taille + 1$ + \State $Vecteur::formes[Vecteur::taille] := f$ + \State \Return{Vrai} \EndFunction \end{algorithmic} -\end{algorithm} +\end{algorithm} % }}} + +\section{Plan de test} + +\subsection{Identification} +\begin{table}[H] % {{{ +\centering\caption{Informations générales du plan de test}\label{fig:planTest} +\begin{tabular}{rl} + \\ \toprule + Nom: & Scénario de test du rapport d'APP \\ + But: & Vérifier les fonctionnalitées globales de graphicus-02\\ + Acteur principal: & classe \verb|Test| \\ + Date de création: & 2023-01-14 \\ + Auteur: & Benjamin Chausse -- chab1704 \\ + Version: & 1.0 \\ + \bottomrule +\end{tabular} +\end{table}% }}} + +\subsection{Scénario} + +\subsubsection{Préconditions} + +\begin{itemize} + \item Un canevas vierge vient d'être créé + \item Ce cas d'utilisation emploie la méthode \verb|tests_application_cas_02| + de la classe \verb|Tests|. La première ayant été utilisée lors de la + validation en classe. +\end{itemize} + + +\subsubsection{Postconditions} + +\begin{itemize} + \item Le déroulement du test se fait sans intervention de l'utilisateur. + \item L'affichage doit-être accessible à l'évaluateur: + \begin{itemize} + \item soit par écriture dans un fichier + \item soit par affichage dans un terminal + \end{itemize} + \item Le numéro de chaque étape est identifié avant son exécution. + \item La description de chaque étape est affichée avant son exécution. + \item Les informations passées à chaque étape sont affichées avant son exécution. +\end{itemize} + + +\subsubsection{Limitations} + +\begin{itemize} + \item Le test ne vérifie pas la totalité des cas limites + (ex: capacité insuffisante en mémoire pour agrandir le vecteur). +\end{itemize} + + +\subsection{Enchaînement nominal} + +\subsubsection{Étapes 1 à 4} +\begin{enumerate} + % \setcounter{enumi}{1} + \item Activer la couche d'index 4 + \item Ajouter les formes suivantes au canevas: + \begin{itemize} + \item un cercle de centre (1, 2) et de rayon $\frac{1}{\sqrt{\pi}}$ + \item un rectangle anchré en (3, 4), de largeur + \item un carré anchré en (-1, -1), de côté 2 + \end{itemize} + \item Afficher le canevas + \item Imprimer l'aire du canevas (doit être égale à $1+12+4$ soit $17$) +\end{enumerate} +\subsubsection{Étapes 5 à 13} +\begin{enumerate} + \setcounter{enumi}{4} + \item Activer la couche d'index 3 + \item Ajouter les formes par défaut au canevas. Soit: + \begin{itemize} + \item un cercle de centre (0, 0) et de rayon 1 + \item un rectangle anchré en (0, 0), de largeur 1 et de hauteur 1 + \item un carré anchré en (0, 0), de côté 1 + \end{itemize} + \item Afficher le canevas + \item Translater le canevas de (1, 1) + \item Afficher le canevas + \item Supprimer la forme de l'index 0 (la première) + \item Activer la couche 4 + \item Supprimer la forme de l'index 2 (la dernière) + \item Afficher le canevas +\end{enumerate} +\subsubsection{Étapes 14 à 18} +\begin{enumerate} + \setcounter{enumi}{13} + \item Initialiser la couche 4 + \item Afficher le canevas + \item Imprimer l'aire du canevas (doit être égale à $1+1$ soit $2$) + \item Réinitialiser le canevas + \item Afficher le canevas +\end{enumerate} % \newpage diff --git a/rapport/sequence.png b/rapport/sequence.png new file mode 100644 index 0000000..bdb1aae Binary files /dev/null and b/rapport/sequence.png differ diff --git a/rapport/usecase.png b/rapport/usecase.png new file mode 100644 index 0000000..2bf4ea9 Binary files /dev/null and b/rapport/usecase.png differ diff --git a/rectangle.h b/rectangle.h index 59b990b..02aeb98 100644 --- a/rectangle.h +++ b/rectangle.h @@ -10,13 +10,13 @@ class Rectangle:public Forme{ public: Rectangle(int x=0, int y=0, int l=1, int h=1); ~Rectangle(); - int getLargeur(); - int getHauteur(); + int getLargeur(); + int getHauteur(); Coordonnee getAncrageForme(); - void setLargeur(int l); - void setHauteur(int h); - double aire(); - void afficher(ostream &s); + void setLargeur(int l); + void setHauteur(int h); + double aire(); + void afficher(ostream &s); }; #endif diff --git a/tests.cpp b/tests.cpp index e3a283c..9a2f359 100644 --- a/tests.cpp +++ b/tests.cpp @@ -197,6 +197,74 @@ void Tests::tests_unitaires_couche() { // Tests sur la classe Canevas {{{ void Tests::tests_unitaires_canevas() { + cout << "----- Tests de la classe Canevas -----\n\n"; + + cout << "--- Initialisation d'un canevas ---\n"; + Canevas c1; + cout << "Couches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Ajout d'une forme (doit aller dans la couche 0) ---\n"; + cout << "Couches: "; + c1.getEtats(cout); + cout << "Reussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non") + << "\nAffichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Activation de la couche 3 ---\n"; + cout << "Reussite: " << (c1.activerCouche(3)? "Oui":"Non") + << "\nCouches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Ajout de forme (doit aller dans la couche 3) ---\n"; + cout << "Reussite: " << (c1.ajouterForme(new Carre())? "Oui":"Non") + << "\nCouches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Reinitialisation de la couche active (3) ---\n"; + cout << "Reussite: " << (c1.reinitialiserCouche(3)? "Oui":"Non") + << "\nCouches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Translation de couche initialisée (couche 3 par 1,2) ---\n"; + cout << "Reussite: " << (c1.translater(1, 2)? "Oui":"Non") + << "\nCouches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Translation d'une couche active (couche 0 par 1,2) ---\n"; + c1.activerCouche(0); + cout << "Reussite: " << (c1.translater(1, 2)? "Oui":"Non") + << "\nCouches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n\n"; + + cout << "--- Réinitialisation du canevas ---\n"; + cout << "Reussite: " << (c1.reinitialiser()? "Oui":"Non") + << "\nCouches: "; + c1.getEtats(cout); + cout << "Affichage: {\n"; + c1.afficher(cout); + cout << "}\n"; + + }; // }}} // Execution de tout les tests unitaires {{{ diff --git a/tests.h b/tests.h index 73aaaad..ebafc72 100644 --- a/tests.h +++ b/tests.h @@ -27,7 +27,6 @@ public: void tests_unitaires_couche(); void tests_unitaires_canevas(); void tests_unitaires(); // Appel de tous les tests unitaires - // Methodes pour les tests unitaires des classes void tests_application_cas_01(); void tests_application_cas_02(); diff --git a/vecteur.h b/vecteur.h index de5e163..0f36348 100644 --- a/vecteur.h +++ b/vecteur.h @@ -8,23 +8,20 @@ using namespace std; class Vecteur { private: - int capacite; // capacité maximale actuelle du vecteur - int taille; - // dynamic array of pointers to Forme - Forme **formes; + int capacite; // capacité maximale actuelle du vecteur + int taille; // nombre d'éléments actuellement dans le vecteur + Forme **formes; // dynamic array of pointers to Forme public: Vecteur(); ~Vecteur(); - // Informations - bool estVide(); + bool estVide(); Forme *getForme(int index); - int getTaille(); - int getCapacite(); - void afficher(ostream &s); - // Manipulations - bool ajouterForme(Forme *f); + int getTaille(); + int getCapacite(); + void afficher(ostream &s); + bool ajouterForme(Forme *f); Forme *supprimerForme(int index); - void vider(); + void vider(); }; #endif -- cgit v1.2.3 From 5f8fa959dab1106105f9e58325f65d0b51bb1631 Mon Sep 17 00:00:00 2001 From: Benjamin Chausse Date: Mon, 16 Jan 2023 03:25:45 -0500 Subject: One graph left... --- cas-dapplication-01.txt | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ cas-dapplication-02.txt | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ couche.cpp | 1 - graphicus-02.cpp | 2 +- rapport/main.pdf | Bin 577604 -> 577902 bytes rapport/main.tex | 8 ++-- tests.cpp | 78 ++++++++++++++++++++++++++++++++++++++- 7 files changed, 272 insertions(+), 7 deletions(-) create mode 100644 cas-dapplication-01.txt create mode 100644 cas-dapplication-02.txt (limited to 'rapport/main.tex') diff --git a/cas-dapplication-01.txt b/cas-dapplication-01.txt new file mode 100644 index 0000000..35821ca --- /dev/null +++ b/cas-dapplication-01.txt @@ -0,0 +1,95 @@ +TESTS APPLICATION (CAS 01) +Etape 1: Activation de la couche 1 +Etape 2: Ajout des trois formes géométriques suivantes + * Un rectangle (x=0, y=0, largeur=2, hauteur=3) + * Un carré (x=2, y=3, cote=4) + * Un cercle (x=7, y=8, rayon=6) +Etape 3: Activer la couche 2 +Etape 4: Ajouter la forme géométrique suivante + * Un rectangle (x=0, y=0, largeur=4, hauteur=5) +Etape 5: Afficher le canevas +----- Couche 0 +----- Couche 1 +Rectangle:(x=0, y=0, l=2, h=3, aire=6) +Carre(x=2, y=3, c=4, a=16) +Cercle (x=7, y=8, r=6, aire=113.097) +----- Couche 2 +Rectangle:(x=0, y=0, l=4, h=5, aire=20) +----- Couche 3 +Couche initialisée +----- Couche 4 +Couche initialisée +Etape 6: Afficher l'aire du canevas + * Aire du canevas: 155.097 +Etape 7: Activer la couche 0 et ajouter les formes suivantes + * Un rectangle (x=0, y=0, largeur=1, hauteur=1) + * Un carré (x=0, y=0, cote=1) + * Un cercle (x=0, y=0, rayon=1) +Etape 8: Translater les formes de la couche selon x=5, y=5 pour obtenir les formes suivantes lorsque affiché + * Un rectangle (x=5, y=5, largeur=1, hauteur=1) + * Un carré (x=5, y=5, cote=1) + * Un cercle (x=5, y=5, rayon=1) +----- Couche 0 +Rectangle:(x=5, y=5, l=1, h=1, aire=1) +Carre(x=5, y=5, c=1, a=1) +Cercle (x=5, y=5, r=1, aire=3.14159) +----- Couche 1 +Rectangle:(x=0, y=0, l=2, h=3, aire=6) +Carre(x=2, y=3, c=4, a=16) +Cercle (x=7, y=8, r=6, aire=113.097) +----- Couche 2 +Rectangle:(x=0, y=0, l=4, h=5, aire=20) +----- Couche 3 +Couche initialisée +----- Couche 4 +Couche initialisée +Etape 9: Couche 2 - initialisée +Etape 10: Couche 3 - initialisée +Etape 11: Couche 4 - initialisée +Etape 12: Afficher le canevas +----- Couche 0 +Rectangle:(x=5, y=5, l=1, h=1, aire=1) +Carre(x=5, y=5, c=1, a=1) +Cercle (x=5, y=5, r=1, aire=3.14159) +----- Couche 1 +Rectangle:(x=0, y=0, l=2, h=3, aire=6) +Carre(x=2, y=3, c=4, a=16) +Cercle (x=7, y=8, r=6, aire=113.097) +----- Couche 2 +Couche initialisée +----- Couche 3 +Couche initialisée +----- Couche 4 +Couche initialisée +Etape 13: Afficher l'aire du canevas +Etape 14: Retirer la première forme de la couche 1 +Etape 15: Afficher le canevas +----- Couche 0 +Rectangle:(x=5, y=5, l=1, h=1, aire=1) +Carre(x=5, y=5, c=1, a=1) +Cercle (x=5, y=5, r=1, aire=3.14159) +----- Couche 1 +Carre(x=2, y=3, c=4, a=16) +Cercle (x=7, y=8, r=6, aire=113.097) +----- Couche 2 +Couche initialisée +----- Couche 3 +Couche initialisée +----- Couche 4 +Couche initialisée +Etape 16: Afficher l'aire du canevas + * Aire du canevas: 134.239 +Etape 17: Réinitialiser le canevas +Etape 18: Afficher le canevas +----- Couche 0 +Couche initialisée +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Couche initialisée +----- Couche 4 +Couche initialisée +Etape 19: Afficher l'aire du canevas + * Aire du canevas: 0 diff --git a/cas-dapplication-02.txt b/cas-dapplication-02.txt new file mode 100644 index 0000000..3bee6df --- /dev/null +++ b/cas-dapplication-02.txt @@ -0,0 +1,95 @@ +TESTS APPLICATION (CAS 02) +Étape 1: Activer la couche d'index 4 +Étape 2: Ajouter les formes suivantes au canevas: + - Un cercle (x= 1, y= 2, rayon=1/sqrt(pi) ) + - Un rectangle (x= 3, y= 4, largeur=3, hauteur=4) + - Un carré (x=-1, y=-1, cote=2) +Étape 3: Afficher le canevas +----- Couche 0 +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Couche initialisée +----- Couche 4 +Cercle (x=1, y=2, r=0, aire=0) +Rectangle:(x=3, y=4, l=3, h=4, aire=12) +Carre(x=-1, y=-1, c=2, a=4) +Étape 4: Imprimer l'aire du canevas (doit etre egale a 1+12+4 soit 17) + * Aire du canevas: 16 +Étape 5: Activer la couche d'index 3 +Étape 6: Ajouter les formes par défaut au canevas. Soit: + - Un cercle (x=0, y=0, rayon=1) + - Un rectangle (x=0, y=0, largeur=1, hauteur=1) + - Un carre (x=0, y=0, cote=1) +Étape 7: Afficher le canevas +----- Couche 0 +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Cercle (x=0, y=0, r=1, aire=3.14159) +Rectangle:(x=0, y=0, l=1, h=1, aire=1) +Carre(x=0, y=0, c=1, a=1) +----- Couche 4 +Cercle (x=1, y=2, r=0, aire=0) +Rectangle:(x=3, y=4, l=3, h=4, aire=12) +Carre(x=-1, y=-1, c=2, a=4) +Étape 8: Translater la couche active de (1,1) +Étape 9: Afficher le canevas +----- Couche 0 +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Cercle (x=1, y=1, r=1, aire=3.14159) +Rectangle:(x=1, y=1, l=1, h=1, aire=1) +Carre(x=1, y=1, c=1, a=1) +----- Couche 4 +Cercle (x=1, y=2, r=0, aire=0) +Rectangle:(x=3, y=4, l=3, h=4, aire=12) +Carre(x=-1, y=-1, c=2, a=4) +Étape 10: Supprimer la forme d'index 0 (la premiere) +Étape 11: Activer la couche d'index 4 +Étape 12: Supprimer la forme d'index 2 (la dernière) +Étape 13: Afficher le canevas +----- Couche 0 +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Rectangle:(x=1, y=1, l=1, h=1, aire=1) +Carre(x=1, y=1, c=1, a=1) +----- Couche 4 +Cercle (x=1, y=2, r=0, aire=0) +Rectangle:(x=3, y=4, l=3, h=4, aire=12) +Étape 14: Initialiser la couche d'index 4 +Étape 15: Afficher le canevas +----- Couche 0 +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Rectangle:(x=1, y=1, l=1, h=1, aire=1) +Carre(x=1, y=1, c=1, a=1) +----- Couche 4 +Couche initialisée +Étape 16: Imprimer l'aire du canevas + * Aire du canevas: 2 +Étape 17: Réinitialiser le canevas +Étape 18: Afficher le canevas +----- Couche 0 +Couche initialisée +----- Couche 1 +Couche initialisée +----- Couche 2 +Couche initialisée +----- Couche 3 +Couche initialisée +----- Couche 4 +Couche initialisée diff --git a/couche.cpp b/couche.cpp index b84cc73..3d31ebb 100644 --- a/couche.cpp +++ b/couche.cpp @@ -71,7 +71,6 @@ Forme *Couche::supprimerForme(int index) { }; bool Couche::reinitialiser() { - if (state == STATE_INIT) return false; state = STATE_INIT; vecteur.vider(); return true; diff --git a/graphicus-02.cpp b/graphicus-02.cpp index f9081d9..800b393 100644 --- a/graphicus-02.cpp +++ b/graphicus-02.cpp @@ -13,7 +13,7 @@ int main() { Tests tests; /* tests.tests_unitaires(); */ - tests.tests_application_cas_01(); + tests.tests_application(); return 0; } diff --git a/rapport/main.pdf b/rapport/main.pdf index 325b471..e705be0 100644 Binary files a/rapport/main.pdf and b/rapport/main.pdf differ diff --git a/rapport/main.tex b/rapport/main.tex index 638a69d..bdf975e 100644 --- a/rapport/main.tex +++ b/rapport/main.tex @@ -175,7 +175,7 @@ même d'autres actions accessibles à l'utilisateur). \item Ajouter les formes suivantes au canevas: \begin{itemize} \item un cercle de centre (1, 2) et de rayon $\frac{1}{\sqrt{\pi}}$ - \item un rectangle anchré en (3, 4), de largeur + \item un rectangle anchré en (3, 4), de dimensions $3\times4$ \item un carré anchré en (-1, -1), de côté 2 \end{itemize} \item Afficher le canevas @@ -193,17 +193,17 @@ même d'autres actions accessibles à l'utilisateur). \item un carré anchré en (0, 0), de côté 1 \end{itemize} \item Afficher le canevas - \item Translater le canevas de (1, 1) + \item Translater la couche active de (1, 1) \item Afficher le canevas \item Supprimer la forme de l'index 0 (la première) - \item Activer la couche 4 + \item Activer la couche d'index 4 \item Supprimer la forme de l'index 2 (la dernière) \item Afficher le canevas \end{enumerate} \subsubsection{Étapes 14 à 18} \begin{enumerate} \setcounter{enumi}{13} - \item Initialiser la couche 4 + \item Initialiser la couche d'index 4 \item Afficher le canevas \item Imprimer l'aire du canevas (doit être égale à $1+1$ soit $2$) \item Réinitialiser le canevas diff --git a/tests.cpp b/tests.cpp index 9a2f359..843454b 100644 --- a/tests.cpp +++ b/tests.cpp @@ -8,6 +8,8 @@ ********/ #include "tests.h" +#include "math.h" + // Tests sur les formes geometriques {{{ void Tests::tests_unitaires_formes() { @@ -387,8 +389,82 @@ void Tests::tests_application_cas_01() { cout << "\t* Aire du canevas: " << c.aire() << endl; }; // }}} +// takes an int pointer and increments it, prints the message: "Step i: msg\n" +void step(string msg, int *i) { + cout << "Étape " << *i << ": " << msg << endl; + (*i)++; +} + // Deuxieme application {{{ void Tests::tests_application_cas_02() { cout << "TESTS APPLICATION (CAS 02)" << endl; - // Il faut ajouter les operations realisant ce scenario de test. + // Mise en place + Canevas c; + int etape = 1; + + + step("Activer la couche d'index 4", &etape); + c.activerCouche(4); + + step("Ajouter les formes suivantes au canevas:", &etape); + cout << "\t- Un cercle (x= 1, y= 2, rayon=1/sqrt(pi) )\n" + << "\t- Un rectangle (x= 3, y= 4, largeur=3, hauteur=4)\n" + << "\t- Un carré (x=-1, y=-1, cote=2)\n"; + c.ajouterForme(new Cercle(1, 2, 1/sqrt(M_PI))); + c.ajouterForme(new Rectangle(3, 4, 3, 4)); + c.ajouterForme(new Carre(-1, -1, 2)); + + step("Afficher le canevas", &etape); + c.afficher(cout); + + step("Imprimer l'aire du canevas (doit etre egale a 1+12+4 soit 17)", &etape); + cout << "\t* Aire du canevas: " << c.aire() << endl; + + step("Activer la couche d'index 3", &etape); + c.activerCouche(3); + + step("Ajouter les formes par défaut au canevas. Soit:", &etape); + cout << "\t- Un cercle (x=0, y=0, rayon=1)\n" + << "\t- Un rectangle (x=0, y=0, largeur=1, hauteur=1)\n" + << "\t- Un carre (x=0, y=0, cote=1)\n"; + c.ajouterForme(new Cercle()); + c.ajouterForme(new Rectangle()); + c.ajouterForme(new Carre()); + + step("Afficher le canevas", &etape); + c.afficher(cout); + + step("Translater la couche active de (1,1)", &etape); + c.translater(1, 1); + + step("Afficher le canevas", &etape); + c.afficher(cout); + + step("Supprimer la forme d'index 0 (la premiere)", &etape); + c.retirerForme(0); + + step("Activer la couche d'index 4", &etape); + c.activerCouche(4); + + step("Supprimer la forme d'index 2 (la dernière)", &etape); + c.retirerForme(2); + + step("Afficher le canevas", &etape); + c.afficher(cout); + + step("Initialiser la couche d'index 4", &etape); + c.reinitialiserCouche(4); + + step("Afficher le canevas", &etape); + c.afficher(cout); + + step("Imprimer l'aire du canevas", &etape); + cout << "\t* Aire du canevas: " << c.aire() << endl; + + step("Réinitialiser le canevas", &etape); + c.reinitialiser(); + + step("Afficher le canevas", &etape); + c.afficher(cout); + }; // }}} -- cgit v1.2.3