PageRenderTime 23ms CodeModel.GetById 13ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/conf Csharp/tp/TP_Simple/sujet.tex

https://bitbucket.org/gconfs/confs
LaTeX | 398 lines | 359 code | 31 blank | 8 comment | 0 complexity | eab87b5ad881d63fac27b2ff05862c23 MD5 | raw file
  1%Version en ligne
  2\documentclass[12pt,a4paper]{report}
  3\newcommand{\caml}{\textsc{Caml}}
  4%Version imprimable
  5%\documentclass[12pt,a4paper,twoside,openright]{report}
  6
  7\input{config}
  8
  9\begin{document}
 10
 11\title{
 12  \vspace{1cm}
 13  \textbf{\Huge{\Tp{} \workshoptitle}}\\
 14  %\vspace{1cm}
 15  %\includegraphics[scale=0.75]{images/logo.png}
 16}
 17\author{
 18  \Large{S�bastien \textit{AzrYel} \textsc{Crozet} ({\ttfamily crozet\_s})}\\\\
 19}
 20
 21\date{
 22  \vspace{1cm}
 23  % GConfs logo
 24  \includegraphics[scale=0.5]{\baserelTPpath/images/gconfs.png}\\
 25  \vspace{0.5cm}
 26  Day xx Month 201x
 27}
 28\maketitle
 29\newpage
 30\tableofcontents
 31\newpage
 32
 33% beginning of document
 34\section{Introduction}
 35\subsection{Environnement de Travail}
 36\begin{itemize}
 37\item Lancer Visual Studio 2008
 38\item Fichier / Nouveau / Projet / C\# / Application console
 39\item Une portion de code minimale sera g�n�r�e:
 40\end{itemize}
 41\begin{lstlisting}
 42using System;
 43using System.Collections.Generic;
 44using System.Linq;
 45using System.Text;
 46
 47namespace ConsoleApplication1
 48{
 49    class Program
 50    {
 51        static void Main(string[] args)
 52        { 
 53        }
 54    }
 55}
 56\end{lstlisting}		
 57Vous venez de mettre en place votre environnement de travail. Il est compos� de plusieurs fichiers.
 58Parmi ceux-ci, seul un nous int�resse pour le moment: Program.cs\\
 59De nombreux autres fichiers seront g�n�r�s tels que des fichiers contenant des informations de d�bogage.\\
 60Un fichier est toutefois important: ControleApplication1.sln. Il s'agit du fichier que vous devrez ouvrir si vous fermez puis r�-ouvrez VS2008. En effet,
 61il contient toutes les information concernant votre projet. (En r�alit�, il repr�sente une "solution", et vous trouverez aussi un fichier ConsoleApplication1.csproj qui repr�sente un "projet".
 62De ce fait vous pouvez avoir plusieurs "projets" dans une solution, mais ce n'est pas important pour ce TP).\\
 63\\
 64Comme vous pouvez le voir, le fichier Program.cs contient une fonction "Main". Il s'agit du point d'entr�e de l'application: la premi�re fonction appel�e automatiquement lors du d�marrage de votre programme.\\
 65C'est donc ici que tout commence et que vous ferez des appels � d'autres fonctions. Par la suite, nous allons �crire d'autres fonctions que vous devrez tester. Vous les �crirez dans ce fichier, mais gardez en t�te qu'il
 66est parfois pr�f�rable de travailler dans plusieurs fichiers s�par�s.
 67\subsection{Hello World !}
 68Comme tout bon tutoriel qui se respecte, la premi�re chose � vous faire
 69faire est d�afficher Hello World!. Pour cela il vous faudra utiliser la proc�dure
 70Console.WriteLine( ). Tous les param�tres donn�s seront
 71convertis en cha�ne de caract�res (pour les types pr�d�finis) puis
 72affich�s sur la sortie standard.
 73Dans un premier temps nous allons le placer dans le fichier Program.cs, et compl�ter la fonction Main(string[] args).
 74\begin{lstlisting}
 75using System;
 76using System.Collections.Generic;
 77using System.Linq;
 78using System.Text;
 79
 80namespace ConsoleApplication1
 81{
 82    class Program
 83    {
 84        static void Main(string[] args)
 85        {
 86            Console.WriteLine("Hello world");
 87            Console.ReadLine();
 88        }
 89    }
 90}
 91
 92\end{lstlisting}
 93\emph{- Remarque }La fonction ReadLine() va attendre que l'utilisateur appuie sur
 94Entr�e. Cela permet que le programme ne s'arr�te pas directement mais nous
 95laisse le temps de lire notre Hello World!
 96\subsection{Voir le r�sultat de votre travail!}
 97Coder c'est bien, mais �a ne sert � rien si on ne peut pas ex�cuter le fruit de son travail! Vous allez donc compiler votre code.\\
 98Visual Studio vous permet de compiler tr�s intuitivement et facilement si vous ne souhaitez pas d'options particuli�res. D'ailleurs, vous avez surement devin� que pour compiler il faut utiliser la petite fl�che verte dans la barre d'outils! Eh bien ce n'est pas tout � fait exact, ce bouton fera deux choses pour vous: la compilation et l'ex�cution.
 99Ainsi, si vous cliquez sur ce bouton, vous verrez au bout d'un moment votre console affichant "Hello World". Il est toutefois possible de compiler SANS ex�cuter le programme automatiquement.
100Pour cela, choisissez le menu "G�n�rer -- G�n�rer la solution". Compiler sans ex�cuter est utile si vous souhaitez juste voir les messages d'erreurs, ou v�rifier que tout compile.\\
101Toutefois, utiliser les boutons devient rapidement p�nible. Il existe donc deux raccourcis: F5 pour compiler+ex�cuter et F6 pour compiler uniquement.\\
102Faites donc un F5 et regardez le r�sultat!
103\subsection {Premi�re Fonction}
104Votre premi�re fonction va �crire Hello World! sur la sortie. Vous devrez
105la placer dans le fichier Program.cs en dehors de la fonction Main(), mais � int�rieur de la classe (d�limit�e par des accolades \{ \}) Program.
106Votre fonction ressemblera � la fonction Main actuelle, mais sans arguments.\\
107Toute fonction a un type de retour: int, float, string, etc... Toutefois, une fonction n'est pas toujours oblig�e de renvoyer quelque-chose!
108Elle peut donc renvoyer 'rien', c'est � dire 'void'. Une telle fonction est usuellement appel�e "proc�dure".\\
109Lorsque vous d�clarez une fonction, vous lui donnez donc: des attributs, un type, un nom, des param�tres, un contenu (le code ex�cut� lorsqu'elle est appel�e).
110Pour le moment, nous ne ferons pas attention aux attributs et mettrons 'static' qui signifie que cette fonction peut �tre appel�e sans avoir � cr�er un objet.\\
111Voici donc, � quoi devrait ressembler votre proc�dure HelloWorld():
112\begin{lstlisting}
113using System;
114using System.Collections.Generic;
115using System.Linq;
116using System.Text;  
117
118namespace ConsoleApplication1
119{
120    class Program
121    {
122        static void Main(string[] args)
123        {
124        }
125
126        static void HelloWorld()
127        {
128            Console.WriteLine("Hello world");
129            Console.ReadLine();
130      }
131   }
132}
133
134\end{lstlisting}
135Maintenant que nous avons cod� la fonction il faut l'appeler, c'est dans
136le Main que vous allez le faire. Celui-ci va donc contenir :
137\begin{lstlisting}
138static void Main(string[] args)
139       {
140            HelloWorld();
141        }
142\end{lstlisting}
143Bravo, vous �tes maintenant pr�ts � coder des fonctions plus compliqu�es !
144
145\section{Factorielle}
146\subsection{D�finition de Factorielle}
147Pour une gestion plus simple des cas d�erreurs nous allons imposer une
148d�finition de factorielle sp�ciale qui vaut 1 pour des nombres n�gatifs.\\
149
150\begin{center}
151\begin{math}
152n! = \left\{
153    \begin{tabular}{ccc}
154        1 & si & n <= 1\\\\
155        n * (n - 1)! & si & n > 1
156    \end{tabular}
157\right. 
158\end{math}
159\end{center}
160
161
162Afin de pouvoir tester votre code, voici quelques exemples.\\
163
164\begin{center}
165\begin{tabular}{|c|c|c|c|c|c|c|c|c|}
166\hline
167\textbf{n} & -42 & -1 & 0 & 1 & 2 & 3 & 5 & 10\\
168\hline
169\textbf{n!} & 1 & 1 & 1 & 1 & 2 & 6 & 120 & 3628800\\
170\hline
171\end{tabular}
172\end{center}
173
174
175\helpbox{Aide}{lorsque vous aurez � choisir des exemples par vous m�me par
176la suite, veillez � bien prendre en compte tous les cas particuliers (et � les
177impl�menter) ! Ici il ne faut pas oublier les nombres n�gatifs, ni 0, ni 1.}
178\subsection{Version Recursive}
179Nous allons d�buter par une version r�cursive de la fonction qui � d�j� �t�
180vue en \caml{}. Il s�agit d��crire le code C\# qui va retranscrire � la lettre la
181formule math�matique.
182\begin{lstlisting}
183static int fact(int n)
184{
185}
186\end{lstlisting}
187\emph{Syntaxe: } Pour r�aliser des alternatives vous devez utiliser la structure
188\begin{lstlisting}
189if (Condition)
190{
191Action1();
192}
193else
194{
195Action2();
196}
197\end{lstlisting}
198Si la Condition est �gale � vrai alors l�Action1 est effectu�e, sinon c�est
199l�Action2 qui l�est.
200\subsection{Version Imp�rative - While}
201Nous allons transcrire cette fonction en imp�ratif. Nous allons utiliser des boucles
202pour simuler les appels r�cursifs. Il existe plusieurs types de boucles mais la
203plus simple pour commencer reste la boucle While.
204\begin{lstlisting}
205static int fact_while(int n)
206{
207}
208\end{lstlisting}
209\emph{Syntaxe: } La boucle while s�utilise de cette fa�on :
210\begin{lstlisting}
211while (Condition) 
212{
213Action;
214}
215\end{lstlisting}
216Tant que la Condition est v�rifi�e, alors on effectue l�Action. Avec la Condition
217�tant une expression de type bool.\\
218Par exemple le code suivant va afficher
219les nombres de i � 0.
220\begin{lstlisting}
221while (i>=0) 
222{
223      Console.WriteLine(i);
224      i--; // ou bien i = i - 1;
225}
226\end{lstlisting}
227\subsection{Version Imperative - For}
228Maintenant que vous avez r�ussi � retranscrire gr�ce � la boucle While la
229fonction factorielle, nous allons utiliser la boucle For. Lorsque l�on connait
230le nombre d�it�rations � l�avance elle est plus pratique � utiliser.
231\begin{lstlisting}
232static int fact_for(int n)
233{
234}
235\end{lstlisting}
236
237\emph{Syntaxe: } La boucle For s�utilise de cette fa�on :
238\begin{lstlisting}
239for(int i=0; i < 10; i++)
240{
241      action;
242}
243\end{lstlisting}
244Pour comprendre son fonctionnement, on peut la r��crire avec une boucle
245While. Vous remarquerez la concision de la boucle for.
246\begin{lstlisting}
247int i = 0;
248while (i < 10) 
249{
250      action;
251      i++; // ou bien i = i + 1;
252}
253\end{lstlisting}
254\section{Point 2D}
255\subsection{Type - Structure}
256Nous allons apprendre � cr�er un nouveau type : un vecteur math�matique.
257Il comporte deux coordonn�es repr�sent�es par deux champs dans notre
258structure.
259\begin{lstlisting}
260struct Point2D
261    {
262        public int x;
263        public int y;
264    }
265\end{lstlisting}
266Vous pouvez placer cette d�finition � deux endroits: avant la d�claration de la classe Program, ou
267dans un fichier s�par�. Le plus propre est encore de le faire dans un fichier s�par�.\\
268Si toutefois, vous souhaitez le mettre dans le m�me fichier que votre Main, vous devrez le placer dans la partie "namespace", 
269mais avant la d�claration "class Program". Vous obtiendrez ceci:
270\begin{lstlisting}
271using System;
272using System.Collections.Generic;
273using System.Linq;
274using System.Text;  
275
276namespace ConsoleApplication1
277{
278
279    struct Point2D
280    {
281        public int x;
282        public int y;
283    }
284
285    class Program
286    {
287        static void Main(string[] args)
288        { /* du code ici */   }
289
290        // d'autres fonctions ici 
291    }
292
293}
294
295\end{lstlisting}
296\emph{Utilisation: } Son utilisation est tr�s simple. Il vous suffit de d�clarer une
297variable du type \textbf{Point2D}. Ensuite pour acc�der � chacun des champs il vous
298suffit de mettre un \textbf{.} devant son identifiant. Remarquez l'attribut "public" devant chaque d�finition de variable
299de la structure \textbf{Point2D}. Cela signifie que vous donnez � tout votre code le droit de lire et modifier les champs (i-e x et y)
300de la structure. En g�n�ral, c'est une pratique � �viter car cela brise certains principes li�s � la Programmation Orient�e Objet.
301Toutefois, ici notre structure est tr�s simple, donc pour plus de simplicit�, nous conserverons l'attribut public.
302\begin{lstlisting}
303Point2D pt;
304pt.x = 0;
305pt.x = pt.x + 1; // ou bien pt.x++
306Console.WriteLine(pt.x);
307// Affiche 1
308\end{lstlisting}
309\subsection{Afficher un Point2D}
310La premi�re chose � faire avant de coder quoi que ce soit est de s�assurer
311que l�on peut afficher ce que l�on est en train de faire. Nous allons donc r�aliser
312une fonction qui prend un \textbf{Point2D} en param�tre, par exemple ${x = 12 \choose y = ?5}$,
313et qui affiche dans la console:\\
314
315\begin{verbatim}
316x=12 ; y=-5
317\end{verbatim}
318
319\begin{lstlisting}
320static void print_pt2d(Point2D p)
321{
322}
323\end{lstlisting}
324\warnbox{Attention}{lorsque l�on vous demande d��crire quelque chose dans la
325sortie vous devez respecter le format � la lettre ! Pas d�espace autour du
326�=�, les deux sur une m�me ligne ... Lorsque vous serez corrig�s par une
327moulinette, la moindre faute de syntaxe vous vaudra 0.}
328\subsection{Addition}
329Passons aux choses s�rieuses. Vous devez coder l�addition de deux vecteurs,
330inutile de vous donner la formule ...
331\begin{lstlisting}
332static Point2D add_pt2d(Point2D pa, Point2D pb)
333{
334}
335\end{lstlisting}
336\subsection{Oppos�}
337En pr�vision de la fonction de soustraction, nous allons coder une fonction
338qui donne l�oppos� d�un Point2D, c�est � dire l�oppos� de tous les champs.
339Par exemple:
340\begin{center}
341\begin{math}
342-{x = 2 \choose y = -5} = {x = -2 \choose y = 5}
343\end{math}
344\end{center}
345\begin{lstlisting}
346static Point2D opp_pt2d(Point2D pa)
347{
348}
349\end{lstlisting}
350\subsection{Oppos� par r�f�rence}
351Il faut savoir que lorsque l�on retourne un type structur� par une fonction,
352tous les champs sont recopi�s dans une nouvelle variable. M�me si dans cet
353exemple ce n�est pas important, lorsque ces op�rations sont effectu�es des
354millions de fois par seconde, toute optimisation, m�me aussi mineure que
355celle-ci, est bonne � prendre.
356La m�thode pour palier ce probl�me est le passage par r�f�rence. En effet,
357la variable est directement modifi�e et non copi�e. Par contre il n�est plus
358possible d�utiliser l�ancienne variable.
359
360\begin{lstlisting}
361static void opp_pt2d(ref Point2D pa)
362{
363}
364\end{lstlisting}
365\subsection{Soustraction avec Oppos�}
366Maintenant que vous avez les deux fonctions Addition et Oppos�, il va
367faloir les combiner afin de coder la fonction Soustraction.
368\begin{lstlisting}
369static Point2D sub_pt2d(Point2D pa, Point2D pb)
370{
371}
372\end{lstlisting}
373\subsection{Distance}
374Il est possible � partir de vecteurs d�obtenir d�autres types que des vecteurs.
375Par exemple on peut calculer la distance entre deux vecteurs qui est
376un r�el.\\
377
378\begin{center}
379\begin{math}
380dist({x1 \choose y1} , {x2 \choose y2}) = \sqrt{(x2 - x1)^{2} + (y2 - y1)^{2}}
381\end{math}
382\end{center}
383
384
385\begin{lstlisting}
386static float dist_pt2d(Point2D pa, Point2D pb)
387{
388}
389\end{lstlisting}	
390\helpbox{Remarque}{il existe plusieurs repr�sentations des nombres r�els en C\#.
391Les plus couramment utilis�s sont les float. Les double permettent de stocker de plus grandes valeurs.}\\
392\helpbox{Aide}{Vous devrez utiliser la fonction racine carr�e suivante : \textbf{Math.sqrt()}}
393\section{Bonus}
394Bravo, vous avez termin� le TP guid�, voici quelques exercices bonus pour
395parfaire vos notions de C\#.
396\subsection{Un g�n�rateur de particules!}
397% end of document
398\end{document}