PageRenderTime 23ms CodeModel.GetById 20ms RepoModel.GetById 0ms 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. \input{config}
  7. \begin{document}
  8. \title{
  9. \vspace{1cm}
  10. \textbf{\Huge{\Tp{} \workshoptitle}}\\
  11. %\vspace{1cm}
  12. %\includegraphics[scale=0.75]{images/logo.png}
  13. }
  14. \author{
  15. \Large{Sbastien \textit{AzrYel} \textsc{Crozet} ({\ttfamily crozet\_s})}\\\\
  16. }
  17. \date{
  18. \vspace{1cm}
  19. % GConfs logo
  20. \includegraphics[scale=0.5]{\baserelTPpath/images/gconfs.png}\\
  21. \vspace{0.5cm}
  22. Day xx Month 201x
  23. }
  24. \maketitle
  25. \newpage
  26. \tableofcontents
  27. \newpage
  28. % beginning of document
  29. \section{Introduction}
  30. \subsection{Environnement de Travail}
  31. \begin{itemize}
  32. \item Lancer Visual Studio 2008
  33. \item Fichier / Nouveau / Projet / C\# / Application console
  34. \item Une portion de code minimale sera gnre:
  35. \end{itemize}
  36. \begin{lstlisting}
  37. using System;
  38. using System.Collections.Generic;
  39. using System.Linq;
  40. using System.Text;
  41. namespace ConsoleApplication1
  42. {
  43. class Program
  44. {
  45. static void Main(string[] args)
  46. {
  47. }
  48. }
  49. }
  50. \end{lstlisting}
  51. Vous venez de mettre en place votre environnement de travail. Il est compos de plusieurs fichiers.
  52. Parmi ceux-ci, seul un nous intresse pour le moment: Program.cs\\
  53. De nombreux autres fichiers seront gnrs tels que des fichiers contenant des informations de dbogage.\\
  54. Un fichier est toutefois important: ControleApplication1.sln. Il s'agit du fichier que vous devrez ouvrir si vous fermez puis r�-ouvrez VS2008. En effet,
  55. il contient toutes les information concernant votre projet. (En ralit, il reprsente une "solution", et vous trouverez aussi un fichier ConsoleApplication1.csproj qui reprsente un "projet".
  56. De ce fait vous pouvez avoir plusieurs "projets" dans une solution, mais ce n'est pas important pour ce TP).\\
  57. \\
  58. Comme vous pouvez le voir, le fichier Program.cs contient une fonction "Main". Il s'agit du point d'entre de l'application: la premi�re fonction appel�e automatiquement lors du d�marrage de votre programme.\\
  59. C'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
  60. est parfois prfrable de travailler dans plusieurs fichiers spars.
  61. \subsection{Hello World !}
  62. Comme tout bon tutoriel qui se respecte, la premire chose vous faire
  63. faire est dafficher Hello World!. Pour cela il vous faudra utiliser la procdure
  64. Console.WriteLine( ). Tous les paramtres donns seront
  65. convertis en chane de caractres (pour les types prdfinis) puis
  66. affichs sur la sortie standard.
  67. Dans un premier temps nous allons le placer dans le fichier Program.cs, et complter la fonction Main(string[] args).
  68. \begin{lstlisting}
  69. using System;
  70. using System.Collections.Generic;
  71. using System.Linq;
  72. using System.Text;
  73. namespace ConsoleApplication1
  74. {
  75. class Program
  76. {
  77. static void Main(string[] args)
  78. {
  79. Console.WriteLine("Hello world");
  80. Console.ReadLine();
  81. }
  82. }
  83. }
  84. \end{lstlisting}
  85. \emph{- Remarque }La fonction ReadLine() va attendre que l'utilisateur appuie sur
  86. Entre. Cela permet que le programme ne s'arr�te pas directement mais nous
  87. laisse le temps de lire notre Hello World!
  88. \subsection{Voir le rsultat de votre travail!}
  89. Coder 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.\\
  90. Visual Studio vous permet de compiler trs 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 flche 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.
  91. Ainsi, 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.
  92. Pour cela, choisissez le menu "G�n�rer -- G�n�rer la solution". Compiler sans excuter est utile si vous souhaitez juste voir les messages d'erreurs, ou v�rifier que tout compile.\\
  93. Toutefois, utiliser les boutons devient rapidement pnible. Il existe donc deux raccourcis: F5 pour compiler+excuter et F6 pour compiler uniquement.\\
  94. Faites donc un F5 et regardez le rsultat!
  95. \subsection {Premire Fonction}
  96. Votre premire fonction va crire Hello World! sur la sortie. Vous devrez
  97. la placer dans le fichier Program.cs en dehors de la fonction Main(), mais intrieur de la classe (dlimite par des accolades \{ \}) Program.
  98. Votre fonction ressemblera la fonction Main actuelle, mais sans arguments.\\
  99. Toute fonction a un type de retour: int, float, string, etc... Toutefois, une fonction n'est pas toujours oblig�e de renvoyer quelque-chose!
  100. Elle peut donc renvoyer 'rien', c'est � dire 'void'. Une telle fonction est usuellement appel�e "proc�dure".\\
  101. Lorsque vous dclarez une fonction, vous lui donnez donc: des attributs, un type, un nom, des paramtres, un contenu (le code excut lorsqu'elle est appel�e).
  102. Pour le moment, nous ne ferons pas attention aux attributs et mettrons 'static' qui signifie que cette fonction peut tre appele sans avoir crer un objet.\\
  103. Voici donc, quoi devrait ressembler votre procdure HelloWorld():
  104. \begin{lstlisting}
  105. using System;
  106. using System.Collections.Generic;
  107. using System.Linq;
  108. using System.Text;
  109. namespace ConsoleApplication1
  110. {
  111. class Program
  112. {
  113. static void Main(string[] args)
  114. {
  115. }
  116. static void HelloWorld()
  117. {
  118. Console.WriteLine("Hello world");
  119. Console.ReadLine();
  120. }
  121. }
  122. }
  123. \end{lstlisting}
  124. Maintenant que nous avons cod la fonction il faut l'appeler, c'est dans
  125. le Main que vous allez le faire. Celui-ci va donc contenir :
  126. \begin{lstlisting}
  127. static void Main(string[] args)
  128. {
  129. HelloWorld();
  130. }
  131. \end{lstlisting}
  132. Bravo, vous tes maintenant prts coder des fonctions plus compliques !
  133. \section{Factorielle}
  134. \subsection{Dfinition de Factorielle}
  135. Pour une gestion plus simple des cas derreurs nous allons imposer une
  136. dfinition de factorielle spciale qui vaut 1 pour des nombres ngatifs.\\
  137. \begin{center}
  138. \begin{math}
  139. n! = \left\{
  140. \begin{tabular}{ccc}
  141. 1 & si & n <= 1\\\\
  142. n * (n - 1)! & si & n > 1
  143. \end{tabular}
  144. \right.
  145. \end{math}
  146. \end{center}
  147. Afin de pouvoir tester votre code, voici quelques exemples.\\
  148. \begin{center}
  149. \begin{tabular}{|c|c|c|c|c|c|c|c|c|}
  150. \hline
  151. \textbf{n} & -42 & -1 & 0 & 1 & 2 & 3 & 5 & 10\\
  152. \hline
  153. \textbf{n!} & 1 & 1 & 1 & 1 & 2 & 6 & 120 & 3628800\\
  154. \hline
  155. \end{tabular}
  156. \end{center}
  157. \helpbox{Aide}{lorsque vous aurez choisir des exemples par vous mme par
  158. la suite, veillez bien prendre en compte tous les cas particuliers (et les
  159. implmenter) ! Ici il ne faut pas oublier les nombres ngatifs, ni 0, ni 1.}
  160. \subsection{Version Recursive}
  161. Nous allons dbuter par une version rcursive de la fonction qui dj t
  162. vue en \caml{}. Il sagit dcrire le code C\# qui va retranscrire la lettre la
  163. formule mathmatique.
  164. \begin{lstlisting}
  165. static int fact(int n)
  166. {
  167. }
  168. \end{lstlisting}
  169. \emph{Syntaxe: } Pour raliser des alternatives vous devez utiliser la structure
  170. \begin{lstlisting}
  171. if (Condition)
  172. {
  173. Action1();
  174. }
  175. else
  176. {
  177. Action2();
  178. }
  179. \end{lstlisting}
  180. Si la Condition est gale vrai alors lAction1 est effectue, sinon cest
  181. lAction2 qui lest.
  182. \subsection{Version Imprative - While}
  183. Nous allons transcrire cette fonction en impratif. Nous allons utiliser des boucles
  184. pour simuler les appels rcursifs. Il existe plusieurs types de boucles mais la
  185. plus simple pour commencer reste la boucle While.
  186. \begin{lstlisting}
  187. static int fact_while(int n)
  188. {
  189. }
  190. \end{lstlisting}
  191. \emph{Syntaxe: } La boucle while sutilise de cette faon :
  192. \begin{lstlisting}
  193. while (Condition)
  194. {
  195. Action;
  196. }
  197. \end{lstlisting}
  198. Tant que la Condition est vrifie, alors on effectue lAction. Avec la Condition
  199. tant une expression de type bool.\\
  200. Par exemple le code suivant va afficher
  201. les nombres de i 0.
  202. \begin{lstlisting}
  203. while (i>=0)
  204. {
  205. Console.WriteLine(i);
  206. i--; // ou bien i = i - 1;
  207. }
  208. \end{lstlisting}
  209. \subsection{Version Imperative - For}
  210. Maintenant que vous avez russi retranscrire grce la boucle While la
  211. fonction factorielle, nous allons utiliser la boucle For. Lorsque lon connait
  212. le nombre ditrations lavance elle est plus pratique utiliser.
  213. \begin{lstlisting}
  214. static int fact_for(int n)
  215. {
  216. }
  217. \end{lstlisting}
  218. \emph{Syntaxe: } La boucle For sutilise de cette faon :
  219. \begin{lstlisting}
  220. for(int i=0; i < 10; i++)
  221. {
  222. action;
  223. }
  224. \end{lstlisting}
  225. Pour comprendre son fonctionnement, on peut la rcrire avec une boucle
  226. While. Vous remarquerez la concision de la boucle for.
  227. \begin{lstlisting}
  228. int i = 0;
  229. while (i < 10)
  230. {
  231. action;
  232. i++; // ou bien i = i + 1;
  233. }
  234. \end{lstlisting}
  235. \section{Point 2D}
  236. \subsection{Type - Structure}
  237. Nous allons apprendre crer un nouveau type : un vecteur mathmatique.
  238. Il comporte deux coordonnes reprsentes par deux champs dans notre
  239. structure.
  240. \begin{lstlisting}
  241. struct Point2D
  242. {
  243. public int x;
  244. public int y;
  245. }
  246. \end{lstlisting}
  247. Vous pouvez placer cette dfinition deux endroits: avant la dclaration de la classe Program, ou
  248. dans un fichier spar. Le plus propre est encore de le faire dans un fichier spar.\\
  249. Si toutefois, vous souhaitez le mettre dans le mme fichier que votre Main, vous devrez le placer dans la partie "namespace",
  250. mais avant la dclaration "class Program". Vous obtiendrez ceci:
  251. \begin{lstlisting}
  252. using System;
  253. using System.Collections.Generic;
  254. using System.Linq;
  255. using System.Text;
  256. namespace ConsoleApplication1
  257. {
  258. struct Point2D
  259. {
  260. public int x;
  261. public int y;
  262. }
  263. class Program
  264. {
  265. static void Main(string[] args)
  266. { /* du code ici */ }
  267. // d'autres fonctions ici
  268. }
  269. }
  270. \end{lstlisting}
  271. \emph{Utilisation: } Son utilisation est trs simple. Il vous suffit de dclarer une
  272. variable du type \textbf{Point2D}. Ensuite pour accder chacun des champs il vous
  273. suffit de mettre un \textbf{.} devant son identifiant. Remarquez l'attribut "public" devant chaque d�finition de variable
  274. de 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)
  275. de la structure. En gnral, c'est une pratique � �viter car cela brise certains principes li�s � la Programmation Orient�e Objet.
  276. Toutefois, ici notre structure est trs simple, donc pour plus de simplicit, nous conserverons l'attribut public.
  277. \begin{lstlisting}
  278. Point2D pt;
  279. pt.x = 0;
  280. pt.x = pt.x + 1; // ou bien pt.x++
  281. Console.WriteLine(pt.x);
  282. // Affiche 1
  283. \end{lstlisting}
  284. \subsection{Afficher un Point2D}
  285. La premire chose faire avant de coder quoi que ce soit est de sassurer
  286. que lon peut afficher ce que lon est en train de faire. Nous allons donc raliser
  287. une fonction qui prend un \textbf{Point2D} en paramtre, par exemple ${x = 12 \choose y = ?5}$,
  288. et qui affiche dans la console:\\
  289. \begin{verbatim}
  290. x=12 ; y=-5
  291. \end{verbatim}
  292. \begin{lstlisting}
  293. static void print_pt2d(Point2D p)
  294. {
  295. }
  296. \end{lstlisting}
  297. \warnbox{Attention}{lorsque lon vous demande dcrire quelque chose dans la
  298. sortie vous devez respecter le format la lettre ! Pas despace autour du
  299. =, les deux sur une mme ligne ... Lorsque vous serez corrigs par une
  300. moulinette, la moindre faute de syntaxe vous vaudra 0.}
  301. \subsection{Addition}
  302. Passons aux choses srieuses. Vous devez coder laddition de deux vecteurs,
  303. inutile de vous donner la formule ...
  304. \begin{lstlisting}
  305. static Point2D add_pt2d(Point2D pa, Point2D pb)
  306. {
  307. }
  308. \end{lstlisting}
  309. \subsection{Oppos}
  310. En prvision de la fonction de soustraction, nous allons coder une fonction
  311. qui donne loppos dun Point2D, cest dire loppos de tous les champs.
  312. Par exemple:
  313. \begin{center}
  314. \begin{math}
  315. -{x = 2 \choose y = -5} = {x = -2 \choose y = 5}
  316. \end{math}
  317. \end{center}
  318. \begin{lstlisting}
  319. static Point2D opp_pt2d(Point2D pa)
  320. {
  321. }
  322. \end{lstlisting}
  323. \subsection{Oppos par rfrence}
  324. Il faut savoir que lorsque lon retourne un type structur par une fonction,
  325. tous les champs sont recopis dans une nouvelle variable. Mme si dans cet
  326. exemple ce nest pas important, lorsque ces oprations sont effectues des
  327. millions de fois par seconde, toute optimisation, mme aussi mineure que
  328. celle-ci, est bonne prendre.
  329. La mthode pour palier ce problme est le passage par rfrence. En effet,
  330. la variable est directement modifie et non copie. Par contre il nest plus
  331. possible dutiliser lancienne variable.
  332. \begin{lstlisting}
  333. static void opp_pt2d(ref Point2D pa)
  334. {
  335. }
  336. \end{lstlisting}
  337. \subsection{Soustraction avec Oppos}
  338. Maintenant que vous avez les deux fonctions Addition et Oppos, il va
  339. faloir les combiner afin de coder la fonction Soustraction.
  340. \begin{lstlisting}
  341. static Point2D sub_pt2d(Point2D pa, Point2D pb)
  342. {
  343. }
  344. \end{lstlisting}
  345. \subsection{Distance}
  346. Il est possible partir de vecteurs dobtenir dautres types que des vecteurs.
  347. Par exemple on peut calculer la distance entre deux vecteurs qui est
  348. un rel.\\
  349. \begin{center}
  350. \begin{math}
  351. dist({x1 \choose y1} , {x2 \choose y2}) = \sqrt{(x2 - x1)^{2} + (y2 - y1)^{2}}
  352. \end{math}
  353. \end{center}
  354. \begin{lstlisting}
  355. static float dist_pt2d(Point2D pa, Point2D pb)
  356. {
  357. }
  358. \end{lstlisting}
  359. \helpbox{Remarque}{il existe plusieurs reprsentations des nombres rels en C\#.
  360. Les plus couramment utiliss sont les float. Les double permettent de stocker de plus grandes valeurs.}\\
  361. \helpbox{Aide}{Vous devrez utiliser la fonction racine carre suivante : \textbf{Math.sqrt()}}
  362. \section{Bonus}
  363. Bravo, vous avez termin le TP guid, voici quelques exercices bonus pour
  364. parfaire vos notions de C\#.
  365. \subsection{Un gnrateur de particules!}
  366. % end of document
  367. \end{document}