PageRenderTime 59ms 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{Sébastien \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 générée:
  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 intéresse pour le moment: Program.cs\\
  53. De nombreux autres fichiers seront générés tels que des fichiers contenant des informations de débogage.\\
  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 réalité, il représente une "solution", et vous trouverez aussi un fichier ConsoleApplication1.csproj qui représente 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'entrée 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 préférable de travailler dans plusieurs fichiers séparés.
  61. \subsection{Hello World !}
  62. Comme tout bon tutoriel qui se respecte, la première chose à vous faire
  63. faire est dafficher Hello World!. Pour cela il vous faudra utiliser la procédure
  64. Console.WriteLine( ). Tous les paramètres donnés seront
  65. convertis en chaîne de caractères (pour les types prédéfinis) puis
  66. affichés sur la sortie standard.
  67. Dans un premier temps nous allons le placer dans le fichier Program.cs, et compléter 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. Entrée. 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 résultat 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 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.
  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 exécuter est utile si vous souhaitez juste voir les messages d'erreurs, ou vérifier que tout compile.\\
  93. Toutefois, utiliser les boutons devient rapidement pénible. Il existe donc deux raccourcis: F5 pour compiler+exécuter et F6 pour compiler uniquement.\\
  94. Faites donc un F5 et regardez le résultat!
  95. \subsection {Première Fonction}
  96. Votre première 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 à intérieur de la classe (délimitée 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 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).
  102. Pour 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.\\
  103. Voici donc, à quoi devrait ressembler votre procédure 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 prêts à coder des fonctions plus compliquées !
  133. \section{Factorielle}
  134. \subsection{Définition de Factorielle}
  135. Pour une gestion plus simple des cas derreurs nous allons imposer une
  136. définition de factorielle spéciale qui vaut 1 pour des nombres négatifs.\\
  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 même par
  158. la suite, veillez à bien prendre en compte tous les cas particuliers (et à les
  159. implémenter) ! Ici il ne faut pas oublier les nombres négatifs, ni 0, ni 1.}
  160. \subsection{Version Recursive}
  161. Nous allons débuter par une version récursive de la fonction qui à déjà été
  162. vue en \caml{}. Il sagit décrire le code C\# qui va retranscrire à la lettre la
  163. formule mathématique.
  164. \begin{lstlisting}
  165. static int fact(int n)
  166. {
  167. }
  168. \end{lstlisting}
  169. \emph{Syntaxe: } Pour réaliser 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 effectuée, sinon cest
  181. lAction2 qui lest.
  182. \subsection{Version Impérative - While}
  183. Nous allons transcrire cette fonction en impératif. Nous allons utiliser des boucles
  184. pour simuler les appels récursifs. 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 façon :
  192. \begin{lstlisting}
  193. while (Condition)
  194. {
  195. Action;
  196. }
  197. \end{lstlisting}
  198. Tant que la Condition est vérifiée, 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 réussi à retranscrire grâce à la boucle While la
  211. fonction factorielle, nous allons utiliser la boucle For. Lorsque lon connait
  212. le nombre ditérations à 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 façon :
  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 réécrire 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 à créer un nouveau type : un vecteur mathématique.
  238. Il comporte deux coordonnées représentées 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 définition à deux endroits: avant la déclaration de la classe Program, ou
  248. dans un fichier séparé. Le plus propre est encore de le faire dans un fichier séparé.\\
  249. Si toutefois, vous souhaitez le mettre dans le même fichier que votre Main, vous devrez le placer dans la partie "namespace",
  250. mais avant la déclaration "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 très simple. Il vous suffit de déclarer une
  272. variable du type \textbf{Point2D}. Ensuite pour accéder à 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 général, c'est une pratique à éviter car cela brise certains principes liés à la Programmation Orientée Objet.
  276. Toutefois, ici notre structure est très 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 première 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 réaliser
  287. une fonction qui prend un \textbf{Point2D} en paramètre, 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 décrire quelque chose dans la
  298. sortie vous devez respecter le format à la lettre ! Pas despace autour du
  299. =, les deux sur une même ligne ... Lorsque vous serez corrigés par une
  300. moulinette, la moindre faute de syntaxe vous vaudra 0.}
  301. \subsection{Addition}
  302. Passons aux choses sérieuses. 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 prévision 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 référence}
  324. Il faut savoir que lorsque lon retourne un type structuré par une fonction,
  325. tous les champs sont recopiés dans une nouvelle variable. Même si dans cet
  326. exemple ce nest pas important, lorsque ces opérations sont effectuées des
  327. millions de fois par seconde, toute optimisation, même aussi mineure que
  328. celle-ci, est bonne à prendre.
  329. La méthode pour palier ce problème est le passage par référence. En effet,
  330. la variable est directement modifiée et non copiée. 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 réel.\\
  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 représentations des nombres réels en C\#.
  360. Les plus couramment utilisés sont les float. Les double permettent de stocker de plus grandes valeurs.}\\
  361. \helpbox{Aide}{Vous devrez utiliser la fonction racine carrée 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 générateur de particules!}
  366. % end of document
  367. \end{document}