This commit is contained in:
Florian Maury 2014-02-24 18:38:56 +01:00
commit 0b4615ed74
227 changed files with 5555 additions and 0 deletions

84
CoursC.tex Normal file
View file

@ -0,0 +1,84 @@
\documentclass[handout]{beamer}
\usepackage[utf8x]{inputenc}
\usepackage{default}
\usepackage{color}
\usepackage{hyperref}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{multirow}
%to use middle vertical alignment
\usepackage{array}
%\usetheme{Boadilla}
%\usecolortheme{whale}
\title{Le Langage C}
\author{Florian Maury}
\institute{3IL}
%suppression de la barre de navigation
\setbeamertemplate{navigation symbols}{}
%Présentation des rappels de sommaire (léger grisement des autres sections, et puce en forme de cercles numérotés
\setbeamertemplate{section in toc shaded}[default][40]
\setbeamertemplate{section in toc}[circle]
\AtBeginSection[]{
\begin{frame}
\begin{center}
\textcolor{blue}{\Huge \secname}
\end{center}
\end{frame}
}
\begin{document}
\begin{frame}
\titlepage
\vspace{0.5cm}
\par
{\footnotesize\begin{center}
\par
\href{http://www.twitter.com/X\_Cli}{\textcolor{blue}{\underline{Twitter}}}
\vspace{0.2cm}
\par
\href{http://www.identi.ca/ixtli}{\textcolor{blue}{\underline{Status.net}}}
\vspace{0.2cm}
\par
\href{mailto:coursc@x-cli.com}{\textcolor{blue}{\underline{Email}}}
\vspace{0.2cm}
\par
\href{svn://c.svn.x-cli.com/ccourse}{\textcolor{blue}{\underline{Sources}}}
\end{center}}
\end{frame}
\begin{frame}
\tableofcontents
\end{frame}
\section{G\'en\'eralit\'es sur le C}
\input{generalites/generalites}
\section{Structure des programmes}
\input{structure/structure}
\section{Les variables}
\input{variables/variables}
\section{Les opérateurs}
\input{operateurs/operateurs}
\section{Branchements}
\input{branchements/branchements}
\section{Pointeurs}
\input{pointeurs/pointeurs}
\end{document}

75
SujetTP2011.tex Normal file
View file

@ -0,0 +1,75 @@
\documentclass[10pt,twocolumn]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{hyperref}
\begin{document}
\title{TP noté - TNI}
\author{Florian Maury}
\date{}
\maketitle
\section{Traitement numérique des images}
Le programme qui est fourni, avec sa mini-bibliothèque, dans l'exercice 1, permet de faire du traitement numérique des images de base.
\par
Les fonctions implémentées permettent :
\begin{description}
\item[generateImage] La génération d'une image aléatoire
\item[getImageMatrix] Le chargement d'une image depuis un fichier Bitmap
\item[setImageMatrix] La sauvegarde d'une image dans un fichier Bitmap
\item[turnGrey] Convertir une image couleur en niveaux de gris
\item[applyThreshold] Effectuer un seuillage d'une image en niveau de gris pour obtenir une image composée uniquement de pixels noirs ou blancs (pas de demi-teintes).
\end{description}
\par
Ces 4 dernières fonctions utilisent une structure nommée \textbf{ImageData} qui contient une matrice d'entier 32 bits, et ses dimensions.
\par
Chaque entier 32 bits représente un pixel de l'image. Les 8 bits de poids le plus fort sont le canal alpha (inutilisé dans ce format de fichier), puis les 8 bits suivants sont pour le rouge, les 8 bits suivant pour le vert, et les 8 bits de poids le plus faible sont pour le bleu.
\par
La matrice est représentée sous un format à une seule dimension. Il est nécessaire de faire de l'arithmétique binaire pour accéder aux cases de la matrice (voir le code de la fonction \textbf{applyThreshold} pour un exemple.
\vspace{2cm}
\par
{\Large \textbf{Instructions de rendu du TP}}
\par
Les fichiers sources doivent être envoyés à fmaury@3il.fr et coursc@x-cli.com avant l'heure indiquée au tableau (à priori 12H).
\section{Exercice 1}
Intégrez les fichiers \href{http://c.x-cli.com/bmphandler.h}{bmphandler.h}, \href{http://c.x-cli.com/bmphandler.cpp}{bmphandler.cpp} et \href{http://c.x-cli.com/tp6main2011.cpp}{main.cpp} à votre projet vide.
Placez le fichier \href{http://c.x-cli.com/image.jpg}{image.bmp} dans le répertoire Debug de votre projet (au niveau d'en dessous vos fichiers .cpp et .h.
Créez un fichier .h qui contiendra les descriptions de vos fonctions et un fichier .c(pp) qui contiendra votre code.
\section{Exercice 2}
Ecrivez et appelez (depuis la fonction main()) une fonction qui créé un duplicata d'une structure ImageData, représentant une image, passée en paramètre. Ce duplicata occupera une zone mémoire différente de la première structure. Effectuez les ajustements nécessaires dans la fonction main().
Cette fonction sera utile pour le reste du TP car les fonctions turnGrey et applyThreshold modifient les matrices et que nous ne souhaitons pas devoir relire dans le fichier à chaque fois qu'on a besoin d'une nouvelle copie de l'image.
\section{Exercice 3}
Ecrivez une fonction qui renvoie une structure ImageData dont toutes les composantes valent 0, sauf l'une d'entre elles. La composante qui n'est pas annulée est spécifiée en paramètre.
Utilisez cette fonction pour sauvegarder sous trois fichiers différents une image avec seulement le rouge, seulement le bleu et seulement le vert, grâce à la fonction setImageMatrix.
\section{Exercice 4}
Ecrivez une fonction qui se base sur applyThreshold pour seuiller uniquement sur le vert (c'est à dire qu'on génère une image uniquement en noir et blanc. Un point est noir si la composante verte est supérieure à une valeur passée en paramètre).
\section{Exercice 5}
Ecrivez une fonction qui effectue l'ouverture d'une image seuillée et renvoie la matrice érodée.
\par
L'ouverture est une opération de traitement numérique des images qui a pour but l'érosion des contours afin d'agrandir les trous.
\par
Pour effectuer cette érosion, on créé une nouvelle matrice vide de taille identique à la matrice d'origine. Chaque pixel vaut 0 si l'un des 4 pixels adjacents (dans l'image d'origine) vaut 0. Un pixel vaut 0xFFFFFFFF si tous les pixels adjacents et lui-même valent 0xFFFFFFFF dans l'image d'origine. Adjacent signifie 4-connexes : le pixel d'au dessus, le pixel d'en dessous, le pixel à gauche, et le pixel à droite.
Les pixels en bordure d'image considèrent que tous les pixels en dehors de l'image valent 0xFFFFFFFF.
\section{Exercice 6}
Ecrivez une fonction qui effectue la fermeture d'une image seuillée et renvoie la matrice re-remplie.
\par
La fermeture est une opération de traitement numérique des images qui a pour but de combler les trous d'une image seuillée.
\par
Pour effectuer ce remplissage, on créé une nouvelle matrice vide de taille identique à la matrice d'origine. Chaque pixel vaut 0xFFFFFFFF si l'un des 4 pixels adjacents ou lui-même (dans l'image d'origine) vaut 0xFFFFFFFF. Un pixel vaut 0 si tous les pixels adjacents et lui-même valent 0 dans l'image d'origine.
Les pixels en bordure d'image considèrent que tous les pixels en dehors de l'image valent 0.
\end{document}

86
TD1.tex Normal file
View file

@ -0,0 +1,86 @@
\documentclass[10pt,twocolumn]{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\title{TD1}
\author{Florian Maury}
\addtolength{\hoffset}{-1in}
\addtolength{\voffset}{-1.5in}
\setlength{\oddsidemargin}{1cm}
\setlength{\textwidth}{18cm}
\setlength{\headheight}{0pt}
\setlength{\topmargin}{1cm}
\setlength{\textheight}{28cm}
\begin{document}
\maketitle
\section{Exo 1}
Quels types de variable faut-il utiliser dans un environnement embarqu\'e (ressources restreintes) lorsqu'on veut stocker les valeurs suivantes (calculer les valeurs s'il s'agit d'op\'erations math\'ematiques ou logiques):
\begin{itemize}
\item Le num\'ero du jour du mois auquel vous \^etes n\'es ?
\item Le nombre d'\'etudiants \`a 3IL, toutes ann\'ees confondues.
\item Un compteur affichant sur la sortie standard ``0.1, 0.2, 0.3, 0.4''
\item Le solde de votre compte courant
\item true (la valeur bool\'een ``vraie'')
\item 257/3;
\item 1024\%3;
\item 32456789/9;
\item {2, 3.5, 'A', -789};
\item 'A'+3;
\item 127 + 3;
\item chocolat; (\'ecrire la d\'eclaration associ\'ee pour diff\'erentes ``saveurs'')
\item !(245 + 12);
\item 1$<<$10;
\item 255 \& 4;
\item 4 | 127;
\item a==389;
\item 128 \& 2;
\item $\sim$256;
\item 34567544277546 ? 230 : -10;
\item 1024$>$=3
\item 1024$>>$3
\item Votre date de naissance en s\'eparant jour, mois, ann\'ee (mais regroup\'es au sein d'une m\^eme variable)
\item 12376754 ou 2.5
\item Soit un flottant, soit un entier, soit un caract\`ere, soit un bool\'ean, et en plus, dans tous les cas, une \'enum\'eration qui d\'esigne le type de donn\'ee stock\'e dans la premi\`ere partie de ce type.
\item 1$<<$7 + 2
\end{itemize}
\section{Exo 2}
L'extrait de code suivant est il compilable ?
\begin{verbatim}
long lMaVar;
lMaVar = 'z';
\end{verbatim}
\section{Exo 3}
Compl\'etez les op\'erations suivantes pour que la valeur apr\`es le symbole ``=>'' soit retourn\'ee ou donnez la valeur retourn\'ee
\begin{itemize}
\item \verb|4 ... 3 => 7|
\item \verb|4 ... 3 => 0|
\item \verb|... 5 => -6|
\item \verb|char a = 4; ++a + 3 => ...|
\end{itemize}
\section{Exo 4}
Quel est le r\'esultat du code suivant ?
\begin{verbatim}
#include <stdio.h>
int main() {
union { char c; short s; } test;
test.s = 127;
// printf effectue un affichage de type entier
printf(``%d'', test.c);
return 0;
}
\end{verbatim}
\section{Exo 5}
Prouvez par un programme C que -128 ne se code pas 11111111 mais 10000000.
\end{document}

139
TD2.tex Normal file
View file

@ -0,0 +1,139 @@
\documentclass[10pt]{article}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\addtolength{\hoffset}{-1in}
\addtolength{\voffset}{-1.5in}
\setlength{\oddsidemargin}{1cm}
\setlength{\textwidth}{19cm}
\setlength{\headheight}{0pt}
\setlength{\topmargin}{1cm}
\setlength{\textheight}{27cm}
\pagestyle{empty}
\title{TD 2}
\author{Florian Maury}
\begin{document}
\section{Exercice}
{\small
Soit une fonction ``sigma'' qui retourne la somme de tous les nombres entre 1 et son paramètre.
La fonction retourne 0 en cas d'erreur.
Implémenter cette fonction.
\begin{verbatim}
unsigned int sigma(unsigned short limit);
\end{verbatim}
% Penser aux contrôles d'erreurs si limit < 1
}
\begin{center}
\line(1,0){250}
\end{center}
{\small
Ré-implémenter la même fonction pour le prototype suivant.
\begin{verbatim}
unsigned int sigma(unsigned int limit);
\end{verbatim}
% Penser aux contrôles d'erreurs si limit < 1
%limiter avant la somme UINT_MAX - i > somme : une autre méthode, plus performante serait de calculer la valeur limite ; ici, méthode dynamique meilleure pour raisons didactiques (évolution avec malloc)
}
\section{Exercice}
{\small
Construire une structure permettant d'établir une recette contenant tout ou partie de ces ingrédients.
\begin{itemize}
\item Fromages
\item Champignons
\item Epinards
\item Tomates
\item Oignons
\end{itemize}
}
\begin{center}
\line(1,0){250}
\end{center}
{\small
\'Ecrire une énumération ``Ingredients'' contenant les 5 précédents ingrédients. Il faut que cette énumération permettent de stocker dans une même variable une recette.
}
\begin{center}
\line(1,0){250}
\end{center}
{\small
Implémenter une fonction affichant les ingrédients utilisés pour une recette.
\begin{verbatim}
void showIngredientsFromStucture(struct IngredientsStruct recipe);
\end{verbatim}
}
{\small
Même question pour la fonction suivante~:
\begin{verbatim}
void showIngredientsFromEnum(enum Ingredients recipe);
\end{verbatim}
}
\section{Exercice}
{\small
\'Ecrire une énumération comportant 3 niveaux de TVA (5,5, 7, 19,6).
)
\begin{center}
\line(1,0){250}
\end{center}
{\small
Implémenter la fonction suivante qui applique la TVA à un prix hors-taxe et renvoie le prix avec TVA~:
\begin{verbatim}
unsigned int applyTVA(unsigned int priceExclVTA, enum VTARate rate);
\end{verbatim}
% Penser au dépassement d'integer
}
\section{Exercice}
{\small
\begin{verbatim}
1. Afficher le nom
2. Afficher le prénom
3. Afficher age
4. Quitter
\end{verbatim}
Implémenter une fonction qui affiche le précédent menu et renvoie le numéro de l'option choisie. La valeur renvoyée doit être une valeur valide du menu. Si l'utilisateur ne saisit pas une valeur valide, le programme redemande la saisie. La saisie est effectuée par l'intermédiaire de la fonction suivante~:
\begin{verbatim}
unsigned char getInputFromKeyboard();
\end{verbatim}
Voici le prototype de la fonction à implémenter.
\begin{verbatim}
unsigned char displayAndSelectOptions();
\end{verbatim}
}
\begin{center}
\line(1,0){250}
\end{center}
{\small
Implémenter une fonction qui affiche ``Doe'' si l'option 1 est choisie, ``John'' si l'option est choisie, ``42 ans'' si l'option 3 est choisie, et ``Erreur'' en cas d'autre valeur.
Voici son prototype.
\begin{verbatim}
void displayPersonalData(unsigned char input);
\end{verbatim}
}
\end{document}

183
TD3.tex Normal file
View file

@ -0,0 +1,183 @@
\documentclass[10pt]{article}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{acronym}
\addtolength{\hoffset}{-1in}
\addtolength{\voffset}{-1.5in}
\setlength{\oddsidemargin}{1cm}
\setlength{\textwidth}{19cm}
\setlength{\headheight}{0pt}
\setlength{\topmargin}{1cm}
\setlength{\textheight}{27cm}
\pagestyle{empty}
\title{TD 3}
\author{Florian Maury}
\begin{document}
\section{Exercice}
\'Ecrire une fonction qui renvoie une structure contenant le quotient et le reste d'une division de son premier argument par son second. Déclarer la structure utilisée.
\begin{verbatim}
struct div_t {
int q;
int r;
};
struct div_t divide(int leftOperand, int rightOperand) {
struct div_t result;
result.q = leftOperand / rightOperand;
result.r = leftOperand % rightOperand;
return result;
}
\end{verbatim}
\section{Exercice}
\'Ecrire 3 fonctions safeAdd, safeSub, safeMul qui permettent d'effectuer des opérations de calcul sans risque de dépassement sur des int.
Si un integer overflow survient, ces fonctions mettent à 1 une variable globale "g\_iComputeError".
Si aucun dépassement n'intervient, la variable vaut 0.
\begin{verbatim}
int safeAdd(int leftOperand, int rightOperand) {
if ((leftOperand > 0 && rightOperand > 0 && leftOperand > INT_MAX - rightOperand) ||
(leftOperand < 0 && rightOperand < 0 && leftOperand < INT_MIN - rightOperand)) {
g_iComputeError = 1;
}
else {
g_iComputeError = 0;
}
return leftOperand + rightOperand;
}
int safeSub(int leftOperand, int rightOperand) {
if ((leftOperand > 0 && rightOperand < 0 && leftOperand > INT_MAX + rightOperand) ||
(leftOperand < 0 && rightOperand > 0 && leftOperand < INT_MIN + rightOperand)) {
g_iComputeError = 1;
}
else {
g_iComputeError = 0;
}
return leftOperand - rightOperand;
}
int safeMul(int leftOperand, int rightOperand) {
if (((leftOperand > 0 && rightOperand > 0 ) && leftOperand > INT_MAX / rightOperand)||
((leftOperand < 0 && rightOperand < 0 ) && leftOperand < INT_MAX / rightOperand) ||
((leftOperand > 0 && rightOperand < 0 ) && leftOperand > INT_MIN / rightOperand) ||
((leftOperand < 0 && rightOperand > 0 ) && leftOperand < INT_MIN / rightOperand)) {
g_iComputeError = 1;
}
else {
g_iComputeError = 0;
}
return leftOperand * rightOperand;
}
\end{verbatim}
\section{Exercice}
Déclarer et implémenter une fonction qui calcule le \ac{PGCD} de deux nombres.
L'algorithme est le suivant :
\begin{verbatim}
Fonction pgcd (a: Entier, b: Entier) : Entier
Tant que b est différent de 0:
a reçoit la valeur de b
b reçoit l'ancienne valeur de a modulo b
Renvoyer a
Fin fonction pgcd
\end{verbatim}
\begin{verbatim}
int pgcd(int a, int b) {
int tmp;
while(b != 0) {
tmp = a;
a = b;
b = tmp % b;
}
return a;
}
\end{verbatim}
\section{Exercice}
Implémenter la fonction suivante :
\begin{verbatim}
int exercice(int arg1, int arg2);
\end{verbatim}
Voici ce que doit faire cette fonction (dans l'ordre de priorité) :
\begin{enumerate}
\item Si arg1 xor arg2 vaut 2, la valeur renvoyée est $-1$.
\item Si arg2 est égal à 1, alors on considère que arg1 est formé de deux entiers 16 bits concaténés : on renvoie alors la valeur stockée dans les 16 bits de poids le plus fort de arg1.
\item Si arg2 est égal à 2, et arg1 est positif, la valeur renvoyée est le factoriel de arg1.
\item Si arg1 divise arg2 et que le reste est nul, alors la valeur renvoyée est un entier dont les 16 bits de poids le plus fort sont constitués des 16 bits de poids le plus fort de arg1 et ses 16 bits de poids le plus faible des 16 bits de poids le plus faible d'arg2.
\item Cette fonction renvoie la somme de ses deux arguments si arg1 est inférieur à 10 et arg2 supérieur à 15
\item Elle renvoie la multiplication des deux arguments si arg1 est un multiple de 15 et est strictement positif.
\item Si aucun de ces cas n'est appliqué, alors la valeur renvoyée est $-2$
\end{enumerate}
Vous devez renvoyer 0 si un dépassement d'entier (integer overflow) intervient pendant l'un de ces calculs.
La fonction ne doit avoir qu'une seule instruction return.
%Cas 1: 5 7 => -1
%Cas 2: 196608 1 => 3
%Cas 3: 5 2 => 120
%Cas 4: 65540 10 => 65546
%Cas 5: -30 16 => -14
%Cas 6: 90 4 => 360
%Cas 7: 89 4 => -2
\begin{verbatim}
int exercice(int arg1, int arg2) {
int result;
if((arg1 ^ arg2) == 2) {
result = -1;
}
else if(arg2 == 1) {
result = arg1 >> 16;
}
else if(arg2 == 2 && arg1 > 0) {
result = 1;
for(int i = 2 ; i <= arg1 ; i++) {
result = safeMul(result, i);
if(g_iComputeError) {
result = 0;
break;
}
}
}
else if(arg1 % arg2 == 0) {
result = (arg1 & ~((1 << 16) - 1)) + (arg2 & ((1 << 16) - 1));
}
else if(arg1 < 10 && arg2 > 15) {
result = safeAdd(arg1, arg2);
if(g_iComputeError) {
result = 0;
}
}
else if(arg1 % 15 == 0 && arg1 > 0) {
result = safeMul(arg1, arg2);
if(g_iComputeError) {
result = 0;
}
}
else {
result = -2;
}
return result;
}
\end{verbatim}
\begin{acronym}
\acro{PGCD}{Plus Grand Commun Diviseur}
\end{acronym}
\end{document}

88
TP1-2011.tex Normal file
View file

@ -0,0 +1,88 @@
\documentclass[11pt]{article}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\addtolength{\hoffset}{-1in}
\addtolength{\voffset}{-1.5in}
\setlength{\oddsidemargin}{1cm}
\setlength{\textwidth}{19cm}
\setlength{\headheight}{0pt}
\setlength{\topmargin}{1cm}
\setlength{\textheight}{27cm}
\pagestyle{empty}
\title{TP 1}
\author{Florian Maury}
\begin{document}
\maketitle
\section{Démarrer avec Visual Studio 2010}
\begin{enumerate}
\item Démarrer Visual Studio C++ 2010
\item Choisir C++
\item Créer un projet par programme/exercice
\item Fichier -> Nouveau -> Projet -> Projet vide
\item Sur ``fichiers sources'', clic-droit -> ajouter -> fichier -> fichier .cpp
\end{enumerate}
\section{Exercice}
\'Ecrire un programme permettant de calculer le reste de la division d'un premier nombre par un second. \\
Vous devez coder cette fonctionnalité en utilisation ni / ni \%. \\
Tous les cas doivent être envisagés.
\par
Pour saisir les deux nombres, vous pouvez déclarer deux \verb|int|, et utiliser \verb|scanf()| de la façon suivante~:
\begin{verbatim}
int leftOperand, rightOperand, result, reminder;
scanf("%d", &leftOperand);
scanf("%d", &rightOperand);
\end{verbatim}
\par
L'affichage de la réponse peut être fait avec le code suivant~:
\begin{verbatim}
printf("%d divisé par %d donne %d et un reste de %d\n", leftOperand, rightOperand, result, reminder);
\end{verbatim}
Les fonctions \verb|printf()| et \verb|scanf()| nécessitent l'inclusion de la bibliothèque $<$stdio.h$>$.
\section{Exercice~: Jeu de la puce}
Une puce se déplace linéairement et toujours dans le même sens. Elle part de la position zéro. Sur son déplacement, des trous sont placés aux positions multiples de 7 et aux positions multiples de 3. Le joueur doit saisir la longueur du saut qui devra être comprise en 1 et 9 inclus. La partie sachève lorsque la puce tombe dans un trou (partie perdue) ou lorsquelle a réussi à faire 10 sauts sans tomber (partie gagnée). Ecrire lalgorithme de ce petit jeu en prenant soin de ne pas afficher la position courante de la puce, mais en inscrivant à chaque itération le nombre de saut. Veillez à ce que lutilisateur ne puisse saisir de valeurs incohérentes.
\section{Exercice}
Le programme suivant comporte une boucle infinie. Mais lors de lexécution celui-ci sarrête.
\begin{verbatim}
#include <stdio.h>
int main() { int i;
i=1;
do { i=2*i;
} while (i<2*i); printf("i=%d\t2*i=%d\n",i,2*i);
}
\end{verbatim}
\begin{enumerate}
\item Taper et exécuter ce programme.
\item Pourquoi lexécution se termine-t-elle ?
\item En déduire un programme pour déterminer la plus grande et la plus petite valeur que lon peut stocker dans le type int.
\item Quels sont ces valeurs ?
\item Quel est le temps dexécution de ce programme ? (utiliser la bibliothèque $<$windows.h$>$)
\item Proposer un second programme basé sur celui que vous venez de réaliser pour augmenter son efficacité.
\end{enumerate}
\section{Exercice~: Les montagnes russes}
Ecrire un programme qui génère laffichage suivant :
\begin{verbatim} * * *
*** *** ***
***** ***** ***** *********************
\end{verbatim} Proposer une version qui demande à lutilisateur le caractère à afficher, la hauteur des montagnes et le nombre de sommets.
\end{document}

286
TP2.tex Normal file
View file

@ -0,0 +1,286 @@
\documentclass[10pt]{article}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{acronym}
\addtolength{\hoffset}{-1in}
\addtolength{\voffset}{-1.5in}
\setlength{\oddsidemargin}{1cm}
\setlength{\textwidth}{19cm}
\setlength{\headheight}{0pt}
\setlength{\topmargin}{1cm}
\setlength{\textheight}{27cm}
\pagestyle{empty}
\title{TP 2}
\author{Florian Maury}
\begin{document}
\section{LFSR~: écriture d'un générateur de nombres pseudo-aléatoires}
\begin{verbatim}
bool getRandomBit(unsigned short seed);
\end{verbatim}
La fonction getRandomBit() peut être appelée de deux manières différentes~:
\begin{itemize}
\item Son paramètre est non nul~: dans ce cas, le ``registre'' du générateur est initialisé avec la valeur fournie en paramètre
\item Son paramètre est nul~: le générateur utilise la valeur contenue actuellement dans le ``registre''
\end{itemize}
Le registre est une variable statique locale à la fonction getRandomBit() car la valeur doit être préservée d'un appel sur l'autre de la fonction.
Cette fonction utilise l'implémentation de Fibonacci de LFSR.
A chaque appel, la fonction initialise le registre avec la valeur fournie en paramètre si elle est non nulle.
Elle sauve ensuite la valeur du bit de poids le plus faible du registre. C'est cette valeur qui sera renvoyée par la fonction à la fin du traitement.
Les bits aux rangs 0, 2, 3, et 5 (le bit de poids le plus fort est de rang 15 et celui de poids le plus faible 0) sont XORés ensembles.
Le registre est alors décalé (binairement) une fois à droite. Le bit généré par les XORs est OR avec le bit de poids le plus fort.
\subsection{Correction}
\begin{verbatim}
bool getRandomBit(unsigned short seed) {
static unsigned short s = 0;
bool bGeneratedBit;
// Seeding the generator
if(s == 0) {
if(seed == 0) {
s = (unsigned short) time(NULL);
}
else {
s = seed;
}
} else if (seed != 0) {
s = seed;
}
//bGeneratedBit = s >> 15 & 1;
//s = (s << 1) | ( ( ((s>>15) & 1) ^ ((s>>13) & 1) ^ ((s>>12) & 1) ^ ((s>>10) & 1)) & 1 );
bGeneratedBit = s & 1;
s = (s >> 1) | ( ((s & 1) ^ ((s >> 2) & 1) ^ ((s >> 3) & 1) ^ ((s >> 5) & 1)) << 15);
return bGeneratedBit;
}
\end{verbatim}
\section{Générer un int pseudo-aléatoire}
\'Ecrire un programme qui génère un entier 32 bits non signé pseudo-aléatoire à l'aide de la fonction getRandomBit précédemment écrite, initialisée avec le seed ``0x4242'' et l'affiche à l'écran à l'aide de la ligne suivante~:
\begin{verbatim}
printf("%d\n", entierAleatoire);
\end{verbatim}
\subsection{Correction}
\begin{verbatim}
int main() {
unsigned int iRandomValue = (unsigned int) getRandomBit(INIT_VALUE);
for(int i = 1 ; i < 32 ; i++) {
iRandomValue = (iRandomValue<<1) | (unsigned int) getRandomBit(0);
}
printf("%d\n", iRandomValue);
return 0;
}
\end{verbatim}
\section{Fonction getRandomInt}
\'Ecrire une fonction qui renvoie un entier 32 bits pseudo-aléatoire. Cette fonction doit être une généralisation de la fonction du premier exercice.
La solution doit être plus performante que générer 32 bits en faisant 32 appels à getRandomBit (en gros, faut utiliser une boucle\ldots).
\subsection{Correction}
\begin{verbatim}
unsigned int getRandomInt(unsigned short seed) {
static unsigned short s = 0;
unsigned int iGeneratedInt = 0;
// Seeding the generator
if(s == 0) {
if(seed == 0) {
s = (unsigned short) (time(NULL));
printf("init with time: %d\n", s);
}
else {
s = seed;
}
} else if (seed != 0) {
s = seed;
}
for(int i = 0 ; i < 32 ; i++) {
iGeneratedInt = (iGeneratedInt << 1) | (s & 1);
s = (s >> 1) | ( ((s & 1) ^ ((s >> 2) & 1) ^ ((s >> 3) & 1) ^ ((s >> 5) & 1)) << 15);
//iGeneratedInt = (iGeneratedInt << 1) | ((s >> 15) & 1);
//s = (s << 1) | ( ( ((s>>15) & 1) ^ ((s>>13) & 1) ^ ((s>>12) & 1) ^ ((s>>10) & 1)) & 1 );
}
return iGeneratedInt;
}
\end{verbatim}
\section{Jouer avec la génération pseudo-aléatoire}
\'Ecrire un programme qui génère un unsigned char aléatoire. Le programme vous propose ensuite de saisir au clavier une valeur entre 0 et 255 et vous indique si votre saisie est plus grande ou moins grande que le nombre pseudo-aléatoire. Si votre saisie est égale au nombre pseudo aléatoire, le programme vous affiche le message "Victoire" et quitte.
Pour rendre le jeu intéressant, initialiser le générateur pseudo-aléatoire avec le résultat de la fonction time() (casté en unsigned short) de la bibliothèque $<$time.h$>$
\par
La saisie au clavier se fait à l'aide de la ligne suivante. La variable ``input'' doit être de type short !
\begin{verbatim}
fflush(stdin);
scanf("%hd", &input);
\end{verbatim}
\subsection{Correction}
\begin{verbatim}
int main() {
unsigned char ucToFind = getRandomUChar(0);
short sGuess;
printf("Cheatcode: %d\n", ucToFind);
do {
do {
puts("Try to guess:");
fflush(stdin);
scanf("%hd", &sGuess);
} while(sGuess < 0 || sGuess > 255);
if(sGuess < ucToFind) {
puts("Too low");
}
else if(sGuess > ucToFind) {
puts("Too high");
}
} while(sGuess != ucToFind);
puts("Victoire !!");
return 0;
}
\end{verbatim}
%\section{Décoder le message secret}
%\'Ecrire un programme qui demande des entiers 32 bits pseudo-aléatoires (initialisation avec 0x4242) et les XOR avec des valeurs saisies au clavier. Ces valeurs sont des int, saisis avec la ligne de commande suivante :
%\begin{verbatim}
%fflush(stdin);
%scanf("%d", &input);
%\end{verbatim}
%
%Afficher le résultat du XOR avec la ligne de commande suivante~:
%\begin{verbatim}
%printf("%c%c%c%c\n", (input>>24), ((input >> 16) & ((1<<8) - 1)), ((input >> 8) & ((1<<8) - 1)), (input & ((1<<8) - 1)));
%\end{verbatim}
%
%Voici la liste des entiers à saisie au clavier~:
%\begin{itemize}
% \item 123
%\end{itemize}
%#ifndef __cplusplus
%#include <stdbool.h>
%#endif
%
%#include <stdio.h>
%#include <time.h>
%#include <stdlib.h>
%#define INIT_VALUE 0x4242
%
%bool getRandomBit(unsigned short seed) {
% static unsigned short s = 0;
% bool bGeneratedBit;
%
% // Seeding the generator
% if(s == 0) {
% if(seed == 0) {
% s = (unsigned short) time(NULL);
% }
% else {
% s = seed;
% }
% } else if (seed != 0) {
% s = seed;
% }
%
% bGeneratedBit = s >> 15 & 1;
% s = (s << 1) | ( ( ((s>>15) & 1) ^ ((s>>13) & 1) ^ ((s>>12) & 1) ^ ((s>>10) & 1)) & 1 );
% return bGeneratedBit;
%}
%
%int getRandomInt(unsigned short seed) {
% static unsigned short s = 0;
% int iGeneratedInt = 0;
%
% // Seeding the generator
% if(s == 0) {
% if(seed == 0) {
% printf("init with time");
% s = (unsigned short) time(NULL);
% }
% else {
% s = seed;
% }
% } else if (seed != 0) {
% s = seed;
% }
%
% for(int i = 0 ; i < 32 ; i++) {
% //iGeneratedInt = (iGeneratedInt << 1) | (s & 1);
% iGeneratedInt = (iGeneratedInt << 1) | ((s >> 15) & 1);
% s = (s << 1) | ( ( ((s>>15) & 1) ^ ((s>>13) & 1) ^ ((s>>12) & 1) ^ ((s>>10) & 1)) & 1 );
% // s = (s >> 1) | ( ( ((s>>15) & 1) ^ ((s>>13) & 1) ^ ((s>>12) & 1) ^ ((s>>10) & 1) ^ (s & 1) ) << 15 );
% }
% return iGeneratedInt;
%}
%
%unsigned char getRandomUChar(unsigned short seed) {
% static unsigned short s = 0;
% unsigned char ucGeneratedUChar = 0;
%
% // Seeding the generator
% if(s == 0) {
% if(seed == 0) {
% s = (unsigned short) (time(NULL));
% printf("init with time: %d\n", s);
% }
% else {
% s = seed;
% }
% } else if (seed != 0) {
% s = seed;
% }
%
% for(int i = 0 ; i < 32 ; i++) {
% ucGeneratedUChar = (ucGeneratedUChar << 1) | ((s >> 15) & 1);
% s = (s << 1) | ( ( ((s>>15) & 1) ^ ((s>>13) & 1) ^ ((s>>12) & 1) ^ ((s>>10) & 1)) & 1 );
% }
% return ucGeneratedUChar;
%}
%
%int main() {
% unsigned char ucToFind = getRandomUChar(0);
% short sGuess;
% unsigned int iRandomValue = (unsigned int) getRandomBit(INIT_VALUE);
% for(int i = 1 ; i < 32 ; i++) {
% iRandomValue = (iRandomValue<<1) | (unsigned int) getRandomBit(0);
% }
% printf("%d\n", iRandomValue);
% printf("%d\n", getRandomInt(INIT_VALUE));
% printf("%d\n", getRandomInt(0x1010));
% printf("%d\n", getRandomInt(0));
%
%
% printf("Cheatcode: %d\n", ucToFind);
% do {
% do {
% puts("Try to guess:");
% fflush(stdin);
% scanf("%hd", &sGuess);
% } while(sGuess < 0 || sGuess > 255);
% if(sGuess < ucToFind) {
% puts("Too low");
% }
% else if(sGuess > ucToFind) {
% puts("Too high");
% }
% } while(sGuess != ucToFind);
% puts("Victoire !!");
% return 0;
%}
\end{document}

21
branchements/01.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if~I}
Il est possible de diviser le flot d'exécution en branches distinctes suivant une condition~: une expression évaluée à vrai ou faux.
\begin{block}{Syntaxe générale d'un block if}
\begin{verbatim}
// instructions 1
if( expression ) {
// instructions 2
}
// instructions 3\end{verbatim}
\end{block}
\par
Une fois les instructions ``instructions 1'' exécutées, l'expression entre parenthèses est évaluée.
\par
Si elle s'avère vraie, alors les instructions ``instructions 2'' sont exécutées à leur tour, puis les instructions ``instructions 3'' le sont également.
\par
Si la condition s'avère fausse, alors les instructions ``instructions 2'' NE sont PAS exécutées puis les instructions ``instructions 3'' sont exécutées.
\end{frame}

17
branchements/02.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if~II}
\begin{exampleblock}{Exemple d'utilisation d'un if}
\begin{verbatim}
void exemple(int v) {
puts("Je suis une instruction toujours exécutées.");
if (v < 5) {
puts("Je suis exécutée si v est inférieur à 5);
}
puts("Je suis tjs exécutée, quelque soit la valeur de v");
}\end{verbatim}
\end{exampleblock}
\end{frame}

24
branchements/03.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if~III}
Si parmi les instructions du block \verb|if| se trouvent des instructions mettant fin à un flot d'instructions, alors le code ``instructions 3'' n'est
pas exécutés.
{\small\begin{exampleblock}{Exemple d'interruption de fonction dans un block if}
\begin{verbatim}
int fonctionDeTest(int v) {
puts("Toujours exécuté");
if( v < 5 ) {
puts("V est inférieur à 5");
return true; // sortie de fonction immédiate !
}
puts("Exécuté que si v n'est pas < à 5.");
return false; // sortie de fonction immédiate !
}\end{verbatim}
\end{exampleblock}}
\vspace{0.3cm}
\par
D'autres instructions telles que \verb|break|, \verb|continue|, ou des appels à des fonctions mettant fin au programme, tels que \verb|exit()| ou \verb|abort()|
peuvent interrompre une fonction lors de son exécution.
\end{frame}

17
branchements/04.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~: if~IV}
\begin{alertblock}{Importance de la cohérence dans les branchements}
Il est essentiel que les différentes branches logiques d'un programme restent cohérentes entre elles.
\vspace{0.3cm}
\par
Si une fonction doit retourner une valeur, toutes vos branches logiques doivent retourner une valeur.
\vspace{0.3cm}
\par
Si une variable est utilisée après des branchements logiques qui l'initialisent, vous devez vous assurer qu'il n'existe pas un cas de figure dans
lequel la variable parvient à être utilisée sans avoir été précédemment initialisée.
\end{alertblock}
\end{frame}

23
branchements/05.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if~V}
{\small\begin{exampleblock}{Deux utilisations incorrectes du branchement if}
\begin{verbatim}
int exemple(int v) {
if(v < 5) {
return -1;
}
puts("Branchement sans return !");
}
int exemple2(int v) {
int result;
if(v < 5) {
result = -1;
}
puts("result pas toujours initialisé !");
return result;
}\end{verbatim}
\end{exampleblock}}
\end{frame}

21
branchements/06.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if-else~I}
Une variante du block \verb|if| est le branchement conditionnel \verb|if-else|.
\vspace{0.3cm}
\par
Dans cette variante, si et seulement si l'expression/condition est évaluée à faux, les instructions contenues dans le block \verb|else| sont exécutées.
\begin{block}{Syntaxe générale du groupement if-else}
\begin{verbatim}
// instructions 1
if (expression) {
// instructions 2
}
else {
// instructions 3
}
// instruction 4\end{verbatim}
\end{block}
\end{frame}

19
branchements/07.tex Normal file
View file

@ -0,0 +1,19 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if-else~II}
\begin{exampleblock}{Exemple d'utilisation des branchements conditionnels if-else}
\begin{verbatim}
void exemple(int v) {
puts("Tjs exécutée");
if(v < 5) {
puts("Executée si v < 5");
}
else {
puts("Executée si v >= 5);
}
puts("Tjs exécutée");
}\end{verbatim}
\end{exampleblock}
\end{frame}

24
branchements/08.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Imbrications}
Les blocks \verb|if| et \verb|if-else| peuvent être imbriqués à volonté, autant de fois que nécessaire, sans restriction spécifique.
{\footnotesize\begin{exampleblock}{Imbrication de blocks if et ses variantes}
\begin{verbatim}
if(a < 5) {
//instructions
if(a > -50) {
//instructions
}
else {
//instructions
}
else {
if(b == 2) {
//instructions
}
//instructions
}\end{verbatim}
\end{exampleblock}}
\end{frame}

22
branchements/09.tex Normal file
View file

@ -0,0 +1,22 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: else if~I}
Si l'unique instruction d'un block \verb|else| est un block \verb|if| contenant un nombre arbitraire d'instructions alors il est possible de le formuler de
manière plus compacte avec \verb|else if|.
{\small\begin{exampleblock}{Exemple de block else contenant juste un if}
\begin{verbatim}
if(condition1) {
//instructions 1
}
else {
if{condition2) {
//instructions 2
}
else {
//instructions 3
}
}\end{verbatim}
\end{exampleblock}}
\end{frame}

21
branchements/10.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: else if~II}
L'exemple précédent peut être compacté en~:
\begin{exampleblock}{Compactage grâce au block else if}
\begin{verbatim}
if(condition1) {
//instructions 1
}
else if (condition 2) {
//instructions 2
}
else {
//instructions 3
}\end{verbatim}
\end{exampleblock}
\par
Il est possible de chainer autant de block \verb|else if| que nécessaire.
\end{frame}

21
branchements/11.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: if imbriqués}
Si la seule instruction d'un block if (sans else) est un if (sans else), alors ils peuvent être compactés en un seul if dont les deux conditions sont fusionnées à l'aide de l'opérateur \&\& (ET logique).
\begin{exampleblock}{Exemple de deux blocks if compactables}
\begin{verbatim}
if(condition1) {
if(condition2) {
//instructions
}
}\end{verbatim}
\end{exampleblock}
\begin{exampleblock}{Compactage des deux if}
\begin{verbatim}
if(condition1 && condition2) {
//instructions
}\end{verbatim}
\end{exampleblock}
\end{frame}

22
branchements/12.tex Normal file
View file

@ -0,0 +1,22 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Code mort}
\begin{alertblock}{Attention au code mort}
Les branchements conditionnels peuvent devenir vite complexes à force d'imbrication. Il faut alors veiller à ne pas créer du \textbf{code mort}.
\vspace{0.3cm}
\par
Du code mort est du code qui ne sera jamais exécuté, quoiqu'il arrive. Ce cas intervient notamment si la condition décidant si une série d'instructions est exécutée
ne peut jamais devenir vraie. La détection de ce code n'est pas toujours triviale comme dans l'exemple ci-dessous.
\end{alertblock}
{\footnotesize\begin{exampleblock}{Exemple de code mort}
\begin{verbatim}
if(a < 5) {
if(a > 50) {
//ce code ne sera jamais exécuté
}
// instructions
}\end{verbatim}
\end{exampleblock}}
\end{frame}

24
branchements/13.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~I}
Il arrive parfois qu'on teste une même variable contre plusieurs valeurs potentielles. Pour cela, on peut chainer un \verb|if| suivi d'un nombre arbitraire de
\verb|else if| pour finir optionnellement par un \verb|else| (le cas par défaut).
{\footnotesize\begin{exampleblock}{Test d'une même variable contre plusieurs valeurs}
\begin{verbatim}
void testVal(int a) {
if(a == 0) {
//instructions 1
} else if(a == 1) {
//instructions 2
} else if(a == 2) {
... // signifie une ellipse dans l'exemple
} else if(a == 19) {
//instructions 20
} else {
//instructions 21 (cas par défaut)
}
}\end{verbatim}
\end{exampleblock}}
\end{frame}

24
branchements/14.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~II}
Le code précédent est lourd et peu lisible.
\vspace{0.3cm}
\par
\verb|switch| est une construction conditionnelle permettant d'effectuer le même genre d'opérations avec une syntaxe plus simple.
{\footnotesize\begin{block}{Syntaxe générale du switch}
\begin{verbatim}
switch(expression) {
case UNE_CONSTANTE:
//instructions 1
break;
case UNE_AUTRE_CONSTANTE:
//instructions 2
break;
default:
//instructions par défaut
break;
}\end{verbatim}
\end{block}}
\end{frame}

26
branchements/15.tex Normal file
View file

@ -0,0 +1,26 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~III}
{\footnotesize\begin{exampleblock}{Conversion des if-else if-else en switch}
\begin{verbatim}
void testVal(int a) {
switch(a) {
case 0:
//instructions 1
break;
case 1:
//instructions 2
break;
... // signifie une ellipse dans l'exemple
case 19:
//instructions 20
break;
default:
//instructions 21
break;
}
}\end{verbatim}
\end{exampleblock}}
\end{frame}

20
branchements/16.tex Normal file
View file

@ -0,0 +1,20 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~IV}
L'expression en paramètre du \verb|switch| est testée contre les valeurs constantes de chaque \verb|case|.
\vspace{0.3cm}
\par
Lorsque la constante est égale à la variable testée, le code suivant le \verb|case| sélectionné est exécuté, jusqu'à rencontrer une instruction \verb|break|.
\par
\verb|break| signifie la sortie immédiate du block du \verb|switch|. La prochaine instruction exécutée est alors le code suivant immédiatement le block \verb|switch|.
\vspace{0.3cm}
\par
Si aucune constante n'est égale à l'expression testée, le cas \verb|default| est exécuté, s'il existe. Si aucun cas \verb|default| n'a été déclaré, alors aucun code du
block switch n'est exécuté.
\vspace{0.3cm}
\par
Seules des constantes entières peuvent suivre le mot-clé \verb|case|. Ces constantes peuvent être des variables déclarées constantes (y compris des membres d'énumérations),
des constantes littérales ou des macros se résolvant en constantes littérales.
\end{frame}

10
branchements/17.tex Normal file
View file

@ -0,0 +1,10 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~V}
\begin{alertblock}{Cohérence, code mort, \ldots}
Attention ! Les mêmes précautions que pour la famille des blocks if doivent être respectées, que ce soit en terme de code mort, ou de cohérence en cas d'initialisation
de variables, d'instructions \verb|return|\ldots
\end{alertblock}
\end{frame}

23
branchements/18.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~VI}
{\footnotesize\begin{exampleblock}{Exemple incorrect}
\begin{verbatim}
int exemple(int a) {
if(a < 0) {
return 0;
}
switch(a) {
case -1:
return 1; // code mort
break;
case 1:
return 2;
break;
}
}\end{verbatim}
\end{exampleblock}}
Si \verb|a| n'est pas négatif, ni égal à 1, la fonction n'exécute pas d'instruction \verb|return| (ce qui est une faute de programmation) !
\end{frame}

25
branchements/19.tex Normal file
View file

@ -0,0 +1,25 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~VII}
Si un \verb|case| ne se termine pas par un \verb|break|, le code n'en devient pas invalide. L'exécution continuera en exécutant le code dans le case suivant, jusqu'à
rencontrer un \verb|break|, ou la fin du block \verb|switch|.
\vspace{0.3cm}
\par
On dit que l'exécution \textit{déborde} dans le \verb|case| suivant.
{\footnotesize\begin{exampleblock}{Débordement d'un cas}
\begin{verbatim}
switch(a) {
case 1: // si a == 1, les instructions 1 et 2
//instructions 1 // sont exécutées
case 2: // si a == 2, seules les instructions 2
//instructions 2 // sont exécutées
break;
default: // si a n'est pas égal à 1, 2 ou 3, alors
//instructions 3 // les instructions 3 et 4 sont exécutées
case 3: // si a == 3, seules les instructions 4
//instructions 4 // sont exécutées
}\end{verbatim}
\end{exampleblock}}
\end{frame}

18
branchements/20.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~I}
La boucle \verb|while| permet de faire se répéter les instructions contenues dans son block jusqu'à ce que la condition devienne fausse.
\vspace{0.5cm}
\par
La condition est évaluée à l'entrée dans la boucle (si la condition est fausse à la première évaluation, le code du block est complètement ignoré), puis réévaluée
à chaque fois que toutes les instructions du block ont été exécutées.
\vspace{0.5cm}
\begin{block}{Syntaxe générale d'une boucle while}
\begin{verbatim}
while(condition) {
//instructions
}\end{verbatim}
\end{block}
\end{frame}

14
branchements/21.tex Normal file
View file

@ -0,0 +1,14 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~II}
\begin{exampleblock}{Exemple d'utilisation d'une boucle while}
\begin{verbatim}
char val = 0;
val = keyboardInput();
while(val < 1 || val > 5) {
val = keyboardInput();
}\end{verbatim}
\end{exampleblock}
\end{frame}

16
branchements/22.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~III}
\begin{exampleblock}{Exemple de boucle while dans laquelle on ne rentre pas}
\begin{verbatim}
void countDown(int val) {
// Si val <= 0, on ne rentre pas dans la boucle
while(val > 0) {
display(val);
val--;
}
}\end{verbatim}
\end{exampleblock}
\end{frame}

18
branchements/23.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~I}
La boucle \verb|do-while| est identique à la boucle \verb|while| à ceci près que l'évaluation de la condition est effectuée en fin de boucle. De fait, on entre
systématiquement dans la boucle et son block est exécuté au moins une fois.
\par
Tant que la condition reste vraie, le block est répété.
\begin{block}{Syntaxe générale de la boucle do-while}
\begin{verbatim}
do {
//instructions
} while(condition);\end{verbatim}
\end{block}
\par
Une subtilité~: alors que la boucle \verb|while| n'est par terminée par un point-virgule, la boucle \verb|do-while| l'est.
\end{frame}

14
branchements/24.tex Normal file
View file

@ -0,0 +1,14 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~II}
\begin{exampleblock}{Exemple d'utilisation d'une boucle do-while}
\begin{verbatim}
char val;
//saisie au clavier d'un nombre entre 1 et 5
do {
val = keyboardInput();
} while(val < 1 || val > 5);\end{verbatim}
\end{exampleblock}
\end{frame}

16
branchements/25.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~I}
La boucle \verb|for| est la boucle la plus versatile en C. Elle est composée de 3 parties : \textbf{l'initialisation}, qui est exécuté une seule fois, au début de
la boucle, \textbf{la condition}, qui est évaluée à chaque tour de boucle (y compris à l'entrée dans la boucle, juste après l'initialisation), et une troisième partie,
exécutée à chaque fin de tour de boucle, juste avant que la condition ne soit réévaluée.
\vspace{0.5cm}
\begin{block}{Syntaxe générale d'une boucle for}
\begin{verbatim}
for( initialisation ; condition ; incrémentation) {
//instructions
}\end{verbatim}
\end{block}
\end{frame}

17
branchements/26.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~II}
\begin{exampleblock}{Exemple d'utilisation simple de la boucle for}
\begin{verbatim}
int i;
for(i = 0 ; i < 5 ; i++) {
display(i);
}\end{verbatim}
\end{exampleblock}
\vspace{0.5cm}
\par
Le code précédent affiche 0, 1, 2, 3, 4. Au cinquième tour de boucle, i est incrémenté et passe à la valeur 5. La condition, évaluée juste après l'incrémentation,
devient fausse, et on sort de la boucle.
\end{frame}

16
branchements/27.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~III}
La boucle \verb|for| du slide précédent est équivalente à la boucle \verb|while| suivante, mais est plus lisible, car plus expressive (compacte).
\vspace{0.5cm}
\begin{exampleblock}{Boucle while équivalente}
\begin{verbatim}
int i = 0;
while(i < 5) {
display(i);
i++;
}\end{verbatim}
\end{exampleblock}
\end{frame}

16
branchements/28.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~IV}
Depuis C99, il est possible de déclarer le compteur i directement dans la partie initialisation de la boucle. Ce compteur a alors une durée de vie égale au corps de
la boucle.
\vspace{0.5cm}
\begin{exampleblock}{Déclaration du compteur dans l'initialisation~: C99}
\begin{verbatim}
for(int i = 0 ; i < 5 ; i++) {
display(i);
}
// i n'existe plus\end{verbatim}
\end{exampleblock}
\end{frame}

23
branchements/29.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~V}
Chaque partie du for peut être vide.
\par
Si la partie initialisation est vide, il n'y a pas d'initialisation avant l'exécution de la boucle.
\par
Si la partie incrémentation est vide, il n'y a pas d'incrémentation avant l'évaluation de la condition, à chaque tour de boucle.
\par
Si la partie condition est vide, la condition est évaluée à vraie. On obtient une boucle infinie.
{\small\begin{exampleblock}{Boucle infinie}
\begin{verbatim}
for(;;) {
// instructions exécutées à l'infini
}\end{verbatim}
\end{exampleblock}}
\begin{alertblock}{Boucles infinies}
Les boucles infinies sont à éviter absolument. Elles sont employées dans certains cas d'optimisation algorithmique avancée.
\end{alertblock}
\end{frame}

19
branchements/30.tex Normal file
View file

@ -0,0 +1,19 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~VI}
Il est possible d'effectuer plusieurs opérations d'initialisation et d'incrémentation en les séparant par des virgules. Ce genre de pratique est notamment vu lors
de l'entretien simultané de plusieurs compteurs.
\vspace{0.5cm}
\begin{exampleblock}{Deux compteurs dans une même boucle for}
\begin{verbatim}
int i, j;
for(i = 0, j = 5 ; i < 5 ; i++, j--) {
display(i, j);
}\end{verbatim}
\end{exampleblock}
\vspace{0.5cm}
\par
Cette boucle afficherait 0, 1, 2, 3, 4 pour les valeurs de \verb|i|, et 5, 4, 3, 2, 1 pour les valeurs de \verb|j|.
\end{frame}

23
branchements/31.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~VII}
La boucle \verb|for| ne se limite cependant pas à la gestion de compteurs. Il est parfaitement possible de détourner son utilisation avec des fonctions \ldots
{\small\begin{exampleblock}{Boucle for utilisant des fonctions}
\begin{verbatim}
for( ListElement t = getFirstElement(myList) ;
hasNext(t) ;
t = nextElement(t)) {
// traitement de la liste
}\end{verbatim}
\end{exampleblock}}
Ou des conditions complexes \ldots
{\small\begin{exampleblock}{Boucle for utilisant des fonctions}
\begin{verbatim}
bool mustStop = false;
for(int i = 0 ; i < 100 && !mustStop ; i++) {
// instructions qui peuvent mettre mustStop à vrai
}\end{verbatim}
\end{exampleblock}}
\end{frame}

12
branchements/32.tex Normal file
View file

@ -0,0 +1,12 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: break}
L'instruction \verb|break|, lorsqu'elle est rencontrée dans une boucle (while, do-while ou for) cause la sortie immédiate de la boucle, quelque soit l'évaluation
de la condition, et sans exécuter les instructions restantes du block de la boucle.
\vspace{0.5cm}
\par
Un cas d'utilisation possible est dans l'exemple précédent où nous avons utilisé un booléen \verb|mustStop| pour dire à la fonction de sortir, avant la fin de
son compteur. Nous aurions pu utiliser une instruction \verb|break| pour sortir immédiatement de la boucle.
\end{frame}

12
branchements/33.tex Normal file
View file

@ -0,0 +1,12 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: continue}
L'instruction \verb|continue|, lorsqu'elle est rencontrée dans une boucle (while, do-while ou for) cause le début immédiat d'une nouvelle itération de la boucle. Les
instructions restantes de la boucle sont ignorées. La condition est immédiatement évaluée, et dans le cas de la boucle for, le code de la partie incrémentation est
exécuté avant l'évaluation de la condition.
\vspace{0.5cm}
\par
Cette instruction est principalement utilisée dans le cadre de l'optimisation avancée des boucles, ou pour améliorer la lisibilité (encore que, cela reste discutable).
\end{frame}

17
branchements/34.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname}
Ce sujet n'est abordé que parce qu'il est malheureusement couramment rencontré \ldots
\vspace{0.5cm}
\par
Lors de l'utilisation des mot-clés if, else, while, et for, si les blocks de ces derniers ne contiennent qu'une seule instruction, il est possible d'omettre les
accolades.
\vspace{0.5cm}
\par
Cette notation est \textbf{vivement déconseillée}, car elle favorise les bugs.
\par
Aucun exemple ne sera fourni.
\par
Il est possible de l'utiliser correctement dans certains cas que nous n'aborderons pas dans ce cours.
\end{frame}

View file

@ -0,0 +1,83 @@
\subsection*{Branchements conditionnels~: Famille if}
\input{branchements/01}
\input{branchements/02}
\input{branchements/03}
\input{branchements/04}
\input{branchements/05}
\input{branchements/06}
\input{branchements/07}
\input{branchements/08}
\input{branchements/09}
\input{branchements/10}
\input{branchements/11}
\input{branchements/12}
\subsection*{Branchements conditionnels~: Switch}
\input{branchements/13}
\input{branchements/14}
\input{branchements/15}
\input{branchements/16}
\input{branchements/17}
\input{branchements/18}
\input{branchements/19}
%XXX: préciser quelque part que peu importe l'ordre des case, sauf en cas de débordement
\subsection*{Branchements conditionnels~: Boucle While}
\input{branchements/20}
\input{branchements/21}
\input{branchements/22}
\subsection*{Branchements conditionnels~: Boucle Do-While}
\input{branchements/23}
\input{branchements/24}
\subsection*{Branchements conditionnels~: Boucle For}
\input{branchements/25}
\input{branchements/26}
\input{branchements/27}
\input{branchements/28}
\input{branchements/29}
\input{branchements/30}
\input{branchements/31}
\subsection*{Branchements conditionnels~: Boucles~: Les instructions de contrôle}
\input{branchements/32}
\input{branchements/33}
\subsection*{Branchements conditionnels~: Raccourcis d'écriture~: une seule instruction}
\input{branchements/34}

7
generalites/01.tex Normal file
View file

@ -0,0 +1,7 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname}
Un langage de programmation est une méthode de communication pour transposer la volonté d'un développeur
en une séquence de commandes, souvent stockée dans un fichier appelé "source", "code source" ou "fichier source"
à destination d'une ou plusieurs machines afin qu'elle(s) effectue(nt) une tâche.
\end{frame}

14
generalites/02.tex Normal file
View file

@ -0,0 +1,14 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~I}
Une machine ne comprend qu'un seul langage~: le langage machine, qui est différent d'une architecture à l'autre.
\vspace{1cm}
\par
Ce langage machine est exprimé en binaire, un format très pratique pour elle, mais quasiment illisible pour nous.
\vspace{1cm}
\par
Ce langage machine est donc traduit sous la forme de mnémoniques, plus faciles à manipuler.
\par
L'ensemble des mnémoniques d'une machine forment son langage \textbf{assembleur}.
\end{frame}

19
generalites/03.tex Normal file
View file

@ -0,0 +1,19 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~II}
\begin{exampleblock}{Hello world en assembleur}
\begin{verbatim}
.global _start
HELLO: .ascii "Hello, World\n"
_start:
mov $4, %eax
mov $1, %ebx
mov $HELLO %ecx
mov $13, %edx
int $0x80
mov $1, %eax
mov $0, %ebx
int $0x80
\end{verbatim}
\end{exampleblock}
\end{frame}

16
generalites/04.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname}
Avantage de l'assembleur~:
\begin{itemize}
\item Contrôle total (contrôle fin de la machine et accès à tout le jeu d'instructions)
\item Disponible sur toutes les plateformes (puisque ``natif'')
\end{itemize}
Défauts de l'assembleur~:
\begin{itemize}
\item Trop précis~: un programme écrit sur une architecture risque d'utiliser des instructions non disponibles sur une autre, rendant le programme incompatible
\item Fastidieux~: l'expressivité du langage est faible (beaucoup de lignes de code pour faire des choses simples)
\item Augmentation du risque de bug à cause de l'augmentation du nombre de lignes de code et du manque de lisibilité
\end{itemize}
\end{frame}

17
generalites/05.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname}
\begin{block}{L'assembleur~: inutile ?!}
L'assembleur est utile notamment dans les cas suivants~:
\begin{itemize}
\item Travail proche de la machine (drivers, kernels\ldots)
\item Optimisation avancée
\item Reverse engineering \& debugging
\item Les shellcodes, les virus, les programmes se réécrivant\ldots
\item Dans les systèmes embarqués (ARM, consoles de jeu\ldots)
\item Quand il n'existe pas d'autres langages sur une architecture
\item Les demoparty \href{http://www.assembly.org}{http://www.assembly.org}
\end{itemize}
\end{block}
\end{frame}

18
generalites/06.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname}
Devant la difficulté de coder de grosses applications en assembleur, \textbf{les langages de haut niveau} ont été créés, selon différents paradigmes.
\begin{itemize}
\item Procéduraux : C, Pascal, PHP4\ldots
\item Fonctionnels : Ocaml, Lisp, Erlang\ldots
\item Orientés objets : C++, Java, PHP5+, Python, Ocaml\ldots
\item Déclaratifs : SGML, XML (xHTML, DocBook, SOAP\ldots)\ldots
\item Orientés prototypes : Javascript, Actionscript\ldots
\end{itemize}
\par
Le C est considéré par certains comme un langage de bas niveau.
\par
Les méchanismes de sécurité et d'abstraction y étant minimaux (par défaut), le C est principalement utilisé lorsque \textbf{la performance est un enjeu majeur} ou
lorsqu'un \textbf{contrôle fin de la machine} est nécessaire.
\end{frame}

16
generalites/07.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~: La compilation I}
La compilation est l'étape qui permet de \emph{convertir un code exprimé dans un langage en du code exprimé dans un autre}.
\vspace{1cm}
\par
Le C, par exemple, est ``compilé'' en assembleur, lui même ``compilé'' en langage machine.
\vspace{1cm}
\par
Les compilateurs C les plus répandus sont~:
\begin{itemize}
\item \textbf{Visual Studio C++} pour Windows
\item \textbf{GCC} pour les *nix
\end{itemize}
\end{frame}

15
generalites/08.tex Normal file
View file

@ -0,0 +1,15 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~: La compilation II}
La compilation du C inclut notamment les étapes suivantes~:
\begin{itemize}
\item une interprétation des \emph{directives de compilation}
\item La \emph{vérification syntaxique} du programme
\item Des \emph{optimisations} diverses (alignements de mémoire, réorganisation du code indépendant, précalculs\ldots)
\item La \emph{transcription} du programme en code machine
\item \emph{L'assemblage} des éléments du programme et \emph{reliage (“linking”)} entre eux (ainsi qu'à des bibliothèques externes)
\end{itemize}
\vspace{0.5cm}
A l'issu de la compilation, on dispose d'exécutables (fichiers PE sous Windows (les fameux .exe) ou fichiers ELF sous GNU/Linux).
\end{frame}

17
generalites/09.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~: L'interprétation}
\par
Un interpréteur lit le code source d'un programme en langage interprété et l'analyse.
\par
Les instructions du langage interprété déclenchent alors l'exécution de portions de code de l'interpréteur.
\par
Le processeur exécute donc du code de l'interpréteur, sur les directives du langage interprété.
\par
L'étape de lecture et d'analyse du code interprété est effectué à \textbf{chaque} exécution, causant un surcoût en temps de calcul,
et amoindrissant fortement les performances de ces applications.
\par
La contre-partie est que le code interprété est ``managé'' par l'interpréteur, permettant (du moins, plus facilement) des
fonctionnalités telles que le \emph{ramasse-miette (Garbage Collecting)} et souvent une plus grande expressivité.
\end{frame}

16
generalites/10.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~I}
\par
Le C++ est une surcouche au C, ajoutant principalement l'orientation objet,
les templates, et les flux. Réputé plus lourd, plus lent à compiler, et moins lisible
que le C, il reste un langage de choix pour le développement de gros projets.
\vspace{0.5cm}
\par
L'Objective C est une surcouche au C, développé par NeXTStep puis Apple,
et principalement utilisé pour le développement d'applications sous Mac OS
et iOS. La librairie GnuStep permet le développement sous l'OS GNU.
C'est un langage au typage plus faible que le C, et avec quelques améliorations
comme les messages.
\end{frame}

17
generalites/11.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~II}
\par
Les compilateurs C++ (globalement) et Objective C peuvent compiler du C standard.
\vspace{0.5cm}
\par\hrulefill\par
\vspace{0.5cm}
\par
C\# n'est pas à proprement parler un descendant de C, si ce n'est de manière
grossière par sa syntaxe à certains niveaux.
\par
C\# est un des langages compilés en code intermédiaire puis interprété par le CLR de Microsoft/Novell dans le cadre du
framework .NET/Mono.
\end{frame}

18
generalites/12.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname}
{\small Le langage C est~:}
\begin{itemize}
\item {\small compilé}
\item {\small fortement typé}
\item {\small proche de la machine (et donc parfois pas nécessairement portable)}
\item {\small performant}
\item {\small permettant l'intégration d'assembleur pour plus de performances}
\item {\small ayant un compilateur pour presque toutes les plateformes}
\item {\small versatile (applications de bureau, Web, réseaux\ldots)}
\item {\small très utilisé (et donc très bien documenté et éprouvé)}
\item {\small vieillisant (pas de OOP, gestion manuelle de la mémoire\ldots)}
\item {\small difficile (gestion manuelle de la mémoire, pas de sécurité intégrée\ldots)}
\end{itemize}
\end{frame}

View file

@ -0,0 +1,35 @@
\subsection*{Qu'est ce qu'un langage de programmation ?}
\input{generalites/01}
\subsection*{L'assembleur par rapport au C}
\input{generalites/02}
\input{generalites/03}
\input{generalites/04}
\input{generalites/05}
\subsection*{Les HLL~: High Level Languages (Langages de haut niveau)}
\input{generalites/06}
\subsection*{La compilation VS l'interprétation}
\input{generalites/07}
\input{generalites/08}
\input{generalites/09}
\subsection*{La famille du langage C}
\input{generalites/10}
\input{generalites/11}
\subsection*{Caractéristiques du C}
\input{generalites/12}

23
operateurs/01.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur ++}
Cet opérateur peut \textit{préfixer} ou \textit{suffixer} son opérande.
\vspace{0.3cm}
\par
Son effet est l'\textbf{incrémentation}~: il augmente la valeur de son opérande de 1.
\vspace{0.3cm}
\par
Si l'opérateur préfixe l'opérande, l'opérande est incrémenté, puis sa valeur est retournée, afin que l'expression qui les contient soit évaluée à son tour.
\vspace{0.3cm}
\par
Si l'opérateur suffixe l'opérande, la valeur est retournée, puis l'opérande voit sa valeur incrémentée.
\vspace{0.3cm}
\begin{exampleblock}{Exemples d'utilisation de ++}
\begin{verbatim}
int a = 3;
int b = a++ + 4; // b reçoit 7, et a vaut maintenant 4
int c = ++a + 4; // a vaut 5, et c vaut 9\end{verbatim}
\end{exampleblock}
\end{frame}

23
operateurs/02.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur -\relax-}
Cet opérateur peut \textit{préfixer} ou \textit{suffixer} son opérande.
\vspace{0.3cm}
\par
Son effet est la \textbf{décrémentation}~: il diminue la valeur de son opérande de 1.
\vspace{0.3cm}
\par
Si l'opérateur préfixe l'opérande, l'opérande est décrémenté, puis sa valeur est retournée, afin que l'expression qui les contient soit évaluée à son tour.
\vspace{0.3cm}
\par
Si l'opérateur suffixe l'opérande, la valeur est retournée, puis l'opérande voit sa valeur décrémentée.
\vspace{0.3cm}
\begin{exampleblock}{Exemples d'utilisation de -\relax-}
\begin{verbatim}
int a = 3;
int b = a-- + 4; // b reçoit 7, et a vaut maintenant 2
int c = --a + 4; // a vaut 1, et c vaut 5\end{verbatim}
\end{exampleblock}
\end{frame}

17
operateurs/03.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur -}
Cet opérateur préfixe son opérande.
\vspace{0.3cm}
\par
La valeur retournée par l'opérande est évaluée et multipliée par $-1$. La valeur de l'opérande n'est pas modifiée.
\begin{exampleblock}{Exemples d'utilisation de l'opérateur -}
\begin{verbatim}
int a = 3;
int b = -a; // a vaut toujours 3, et b -3
int c = -(a + 4); // a vaut 3, et c faut -7
\end{verbatim}
\end{exampleblock}
\end{frame}

23
operateurs/04.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $\sim$ (non binaire)}
Cet opérateur préfixe son opérande.
\vspace{0.3cm}
\par
La valeur retournée par l'opérande est transformée en son complément à 1. Autrement dit, tous ses bits à 0 passent à 1, et tous ses bits à 1 passent à 0.
{\small\begin{alertblock}{Attention à la taille de l'opérande !}
La \textbf{taille en mémoire} de l'opérande est \textbf{capitale} pour cet opérateur.
\par
Par exemple, un \verb|char| x (de taille 1 octet, soit 8 bits) de valeur 1 est représenté en mémoire par \texttt{00000001}.
\par
$\sim$x vaut alors \texttt{11111110}.
\par
Si x était un \verb|int|, alors sa représentation en mémoire serait 31 bits à 0, et 1 bit à 1. $\sim$x serait alors 31 bits à 1, et 1 bit à 0, ce qui
représente la même valeur d'un point de vue ``base 10'', mais est fondamentalement différent d'un point de vue arithmétique binaire.
\end{alertblock}
\begin{exampleblock}{Exemple d'utilisation du non binaire}
\verb|int a = |$\sim$\verb|1; // a vaut 31 bits à 1, et un bit à 0|
\end{exampleblock}}
\end{frame}

24
operateurs/05.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur ! (non logique)~I}
Cet opérateur a pour effet d'inverser un opérande logique, c'est à dire qu'il transforme une condition vraie en une condition fausse et inversement.
\vspace{0.3cm}
\par
En C, le type booléen n'existe pas, et même s'il est émulé avec la bibliothèque $<$stdbool.h$>$ en C99, la réalité est que :
\begin{itemize}
\item 0 vaut pour faux
\item 1 et toutes les autres valeurs non nulles valent pour vrai
\end{itemize}
{\small\begin{exampleblock}{Exemple d'inversion logique sur un retour de fonction}
\begin{verbatim}
#include <stdbool.h>
bool estEgal(int a, int b);
int result = ! estEgal(1, 2); // result vaut 1\end{verbatim}
\end{exampleblock}}
\par
Bien que l'utilisation précédente soit courante, on rencontre encore plus souvent cet opérateur lorsqu'on souhaite inverser une condition exprimée à l'aide de certains
opérateurs binaires tels que $<$, $>$, \verb|==| et assimilés que nous expliquerons avant longtemps.
\end{frame}

11
operateurs/06.tex Normal file
View file

@ -0,0 +1,11 @@
\begin{frame}
\frametitle{\secname}
\framesubtitle{\subsecname~: Les opérateurs * et \&}
L'opérateur * est l'opérateur de déréférencement.
\vspace{0.5cm}
\par
L'opérateur \& est l'opérateur permettant le renvoi de l'adresse d'une variable en mémoire. Ces deux opérateurs seront
étudiés lors du chapitre sur les pointeurs.
\end{frame}

14
operateurs/07.tex Normal file
View file

@ -0,0 +1,14 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur +}
Cet opérateur effectue la somme de son opérande gauche avec son opérande droit avant de retourner son résultat. Il ne modifie pas la valeur
des opérandes.
\vspace{0.5cm}
\begin{exampleblock}{Exemple d'addition}
\begin{verbatim}
int a = 3;
int b = 4 + a + 2; // b vaut 9, a vaut toujours 3\end{verbatim}
\end{exampleblock}
\end{frame}

14
operateurs/08.tex Normal file
View file

@ -0,0 +1,14 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur -}
Cet opérateur effectue la soustraction de son opérande droit à son opérande gauche avant de retourner son résultat. Il ne modifie pas la valeur
des opérandes.
\vspace{0.5cm}
\begin{exampleblock}{Exemple de soustraction}
\begin{verbatim}
int a = 3;
int b = 4 - a; // b vaut 1, a vaut toujours 3\end{verbatim}
\end{exampleblock}
\end{frame}

15
operateurs/09.tex Normal file
View file

@ -0,0 +1,15 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur *}
Cet opérateur effectue la multiplication de son opérande gauche avec son opérande droit avant de retourner son résultat. Il ne modifie pas la valeur
des opérandes.
\vspace{0.5cm}
\begin{exampleblock}{Exemple de multiplication}
\begin{verbatim}
int a = 3;
int b = 4 * a; // b vaut 12, a vaut toujours 3\end{verbatim}
\end{exampleblock}
\end{frame}

20
operateurs/10.tex Normal file
View file

@ -0,0 +1,20 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Un point sur les parenthèses}
En C, lorsque plusieurs opérateurs sont chainés dans une même expression, il existe des règles de priorité de résolution, tout comme en mathématiques.
\vspace{0.5cm}
\par
Nous verrons plus tard l'ordre de priorité des opérateurs, qui est parfois contre-intuitif. Les parenthèses peuvent être utilisées pour retirer
des ambiguïtés (simplifier une opération en la rendant plus lisible) ou pour forcer un changement de priorité\ldots comme en mathématiques.
\vspace{0.5cm}
\begin{exampleblock}{Exemple d'utilisation des parenthèses}
\par
La multiplication est prioritaire sur l'addition, en C. L'opération $5 * 3 + 2$ vaut 17 en mathématiques, comme en C.
\par
On peut modifier l'ordre à l'aide de parenthèse de manière classique~:
\begin{verbatim}
int a = 5 * (3 + 2); // a vaut 25 \end{verbatim}
\end{exampleblock}
\end{frame}

22
operateurs/11.tex Normal file
View file

@ -0,0 +1,22 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur = (affectation)~I}
Nous l'avons déjà abordé précédemment, mais cet opérateur est plus complexe qu'à premier abord.
\vspace{0.3cm}
\par
Cet opérateur effectue l'affectation de la valeur retournée par son opérande gauche à son opérande droit (parfois appelé \textit{LVALUE}), \textbf{puis retourne la valeur affectée}.
\vspace{0.3cm}
\par
Cela signifie que l'action de cet opérateur ne se résume pas à l'affectation de valeur, et génère elle-même une valeur, égale à la valeur affectée.
\vspace{0.3cm}
\par
Autrement dit, la ligne de code suivante génère la valeur 3~:
\begin{exampleblock}{L'affectation retourne une valeur}
\begin{verbatim}
char a;
a = 3; // cette expression retourne la valeur 3
// en plus d'affecter 3 à la variable a\end{verbatim}
\end{exampleblock}
\end{frame}

21
operateurs/12-1.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur = (affectation)~III}
Les variables de type structuré sont considérées comme des éléments atomiques pour l'opérateur d'affectation.
\vspace{0.3cm}
\par
S'il est possible d'affecter individuellement chaque membre d'une variable structurée, il est possible de recopier toutes les valeurs
des membres d'une structure dans les membres d'une autre variable structurée par simple affectation.
\begin{exampleblock}{Affectation d'une structure à une autre}
\begin{verbatim}
struct Exemple { int a; int b; } var1, var2;
var1.a = 5; var1.b = 3;
var2 = var1; // var2.a vaut 5, et var2.b vaut 3\end{verbatim}
\end{exampleblock}
{\small\begin{alertblock}{Attention aux pointeurs}
Attention, l'affectation ne duplique pas les pointeurs ! Il faudra les dédupliquer à la main. Nous reviendrons dessus lorsque nous verrons
les pointeurs.
\end{alertblock}}
\end{frame}

24
operateurs/12.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur = (affectation)~II}
Du fait que l'affectation retourne une valeur, il est possible de chainer les affectations ou d'effectuer des affectations au milieu d'autres
opérations.
\par
\vspace{0.3cm}
{\small\begin{exampleblock}{Chainage d'affectations}
\begin{verbatim}
int a, b;
a = b = 3;\end{verbatim}
\verb|a| reçoit le résultat de son opérande droit \verb|b = 3|, soit la valeur 3.
\par
\verb|b| reçoit 3.
\end{exampleblock}
\begin{exampleblock}{Affectation au milieu d'une opération}
\begin{verbatim}
int a, b;
b = (a = 4) + 2; //a vaut 4, et b vaut 6\end{verbatim}
\verb|a| reçoit 4, et l'affectation renvoie 4 qui est sommé à 2, formant 6 qui est affecté à \verb|b|.
\end{exampleblock}}
\end{frame}

16
operateurs/13.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur , (virgule)~I}
Cet opérateur est assez peu utilisé, en dehors des première et dernière clauses de la boucle \verb|for| (que nous verrons plus tard), en tant
que séparateur d'instructions.
\vspace{0.3cm}
\par
On voit le symbole virgule plus fréquemment dans les déclarations, et les initialisations en tant que séparateur, mais il s'agit juste d'une
réutilisation du symbole.
\vspace{0.3cm}
\par
Cet opérateur ne modifie pas ses opérandes et n'a pour seul effet que de renvoyer la valeur de son opérande de droite. En général, l'opérande
de gauche est un appel de fonction, une altération de variable, un affichage, ou tout autre effet de bord.
\end{frame}

20
operateurs/14.tex Normal file
View file

@ -0,0 +1,20 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur , (virgule)~II}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur ,}
\begin{verbatim}
void ajouterTVA(float *value);
float prixBase = 15.63, prixFinal, marge = 3;
// prixBase est modifié par la fonction,
// puis sa valeur + marge est affectée à prixFinal.
prixFinal = ajouterTVA(&prixBase), prixBase + marge;
//Equivalent :
ajouterTVA(&prixBase);
prixFinal = prixBase + marge;\end{verbatim}
\end{exampleblock}
\end{frame}

23
operateurs/15.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur /}
Cet opérateur effectue la division de son opérande gauche par son opérande droit.
\vspace{0.3cm}
\par
La valeur retournée est de type \verb|int| (éventuellement
arrondie à l'inférieur) si les deux opérandes sont des entiers, ou de type \verb|double| si au moins l'un des opérandes est de type flottant.
\vspace{0.3cm}
{\small\begin{exampleblock}{Exemples d'utilisations de l'opérateur /}
\begin{verbatim}
int a = 15, b = 7, result1;
float c = 2.5, result2;
result1 = 4 / 2; //result1 vaut 2
result1 = a / b; //result1 vaut 2
result1 = a / 8; //result1 vaut 1
result2 = ((float) a) / 2; //result2 vaut 7,5
result2 = a / 2.0; //result2 vaut 7,5
result2 = a / c; //result2 vaut 6,0\end{verbatim}
\end{exampleblock}}
\end{frame}

17
operateurs/16.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur \% (modulo)}
Cet opérateur retourne le reste de la division de son opérande gauche par son opérande droit.
\vspace{0.5cm}
\par
Cet opérateur ne modifie pas la valeur de
ses opérandes.
\vspace{0.5cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur \%}
\begin{verbatim}
int a = 15, b = 6, c;
c = a % b; // c vaut 3\end{verbatim}
\end{exampleblock}
\end{frame}

24
operateurs/17.tex Normal file
View file

@ -0,0 +1,24 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $<<$}
Cet opérateur retourne le décalage binaire à gauche de son opérande gauche de son opérande droit nombre de fois.
\par
Cet opérateur ne modifie pas la valeur de ses opérandes.
\par
Un décalage binaire à gauche signifie décaler tous les bits d'un rang vers la gauche, dans une représentation binaire de la variable. Le
bit le plus à gauche est perdu, et le bit le plus à droite est à 0.
\vspace{0.3cm}
\par
Par exemple, pour un \verb|unsigned char|, contenant 149, soit en binaire \texttt{10010101} (128 + 16 + 4 + 1), si on effectue 1 décalage
à gauche, le nombre obtenu est 42, soit en binaire \texttt{00101010}.
\vspace{0.3cm}
\par
\begin{exampleblock}{Example d'utilisation de l'opérateur $<<$}
\begin{verbatim}
int a = 149, b;
b = a << 2; // la valeur de a subit deux décalages à gauche
// b reçoit 84 (64 + 16 + 4)\end{verbatim}
\end{exampleblock}
\end{frame}

19
operateurs/18.tex Normal file
View file

@ -0,0 +1,19 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $>>$}
Cet opérateur retourne le décalage binaire à droite de son opérande gauche de son opérande droit nombre de fois.
\par
Cet opérateur ne modifie pas la valeur de ses opérandes.
\vspace{0.3cm}
\par
Lorsqu'un décalage binaire à droite est effectué, le bit le plus à droite dans la représentation binaire est perdu, les bits sont tous décalés
d'un rang à droite, et le bit le plus à gauche est à 0.
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur $>>$}
\begin{verbatim}
unsigned char a = 141, b; // 141 soit 10001101
b = a >> 2; // b reçoit 35 soit 00100011\end{verbatim}
\end{exampleblock}
\end{frame}

28
operateurs/19.tex Normal file
View file

@ -0,0 +1,28 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur \&}
Cet opérateur effectue un ``ET binaire'' (AND) de son opérateur gauche avec son opérateur droit. Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\par
Le AND binaire s'effectue bit à bit entre les deux opérandes.
\par
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\& & 0 & 1 \\
\hline
0 & 0 & 0 \\
\hline
1 & 0 & 1 \\
\hline
\end{tabular}
\end{center}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur \&}
\begin{verbatim}
int a = 42, b = 12, c;
c = a & b; // c reçoit 00101010 & 00001100,
// soit 00001000 => 8\end{verbatim}
\end{exampleblock}
\end{frame}

28
operateurs/20.tex Normal file
View file

@ -0,0 +1,28 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur |}
Cet opérateur effectue un ``OU binaire'' (OR) de son opérateur gauche avec son opérateur droit. Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\par
Le OR binaire s'effectue bit à bit entre les deux opérandes.
\par
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
| & 0 & 1 \\
\hline
0 & 0 & 1 \\
\hline
1 & 1 & 1 \\
\hline
\end{tabular}
\end{center}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur |}
\begin{verbatim}
int a = 42, b = 12, c;
c = a | b; // c reçoit 00101010 | 00001100,
// soit 00101110 => 46\end{verbatim}
\end{exampleblock}
\end{frame}

28
operateurs/21.tex Normal file
View file

@ -0,0 +1,28 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur \^{ }}
Cet opérateur effectue un ``OU exclusif binaire'' (XOR) de son opérateur gauche avec son opérateur droit. Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\par
Le XOR binaire s'effectue bit à bit entre les deux opérandes.
\par
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\^{ } & 0 & 1 \\
\hline
0 & 0 & 1 \\
\hline
1 & 1 & 0 \\
\hline
\end{tabular}
\end{center}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur \^{ }}
\begin{verbatim}
int a = 42, b = 12, c;
c = a ^ b; // c reçoit 00101010 & 00001100,
// soit 00100110 => 38\end{verbatim}
\end{exampleblock}
\end{frame}

21
operateurs/22.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur ==}
Cet opérateur retourne 1 (vrai) quand les deux opérandes sont égaux, 0 (faux) sinon. Cet opérande n'altère pas ses opérandes.
\par
\begin{alertblock}{L'erreur classique !}
Une erreur classique des débutants est de ne mettre qu'un seul symbole = pour effectuer le test d'égalité. Dans ce cas, c'est l'affectation qui
est faite, et qui renvoie, comme vu précédemment, l'opérande droit.
\end{alertblock}
\begin{exampleblock}{Utilisation de l'opérateur ==}
\begin{verbatim}
#include <stdbool.h>
int a = 5, b = 5;
char c = '5';
bool test;
test = a == b; // test vaut 1 (vrai)
test = a == c; // test vaut 0 (faux) car '5' = 53 \end{verbatim}
\end{exampleblock}
\end{frame}

20
operateurs/23.tex Normal file
View file

@ -0,0 +1,20 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur !=}
Cet opérateur retourne 0 (faux) quand les deux opérandes sont égaux, 1 (vrai) sinon. Cet opérande n'altère pas ses opérandes.
\vspace{0.3cm}
L'opérateur d'inégalité est équivalent à l'utilisation de l'opérateur d'égalité dont le résultat serait inversé à l'aide de l'opérateur
non logique~: !
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur !=}
\begin{verbatim}
#include <stdbool.h>
int a = 5, b = 7;
bool c;
c = a != b; // c vaut 1 (vrai)
c = !(a == b); // c vaut 1 (vrai)
c = !(a != b); // c vaut 0 (faux)\end{verbatim}
\end{exampleblock}
\end{frame}

17
operateurs/24.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $<$}
Cet opérateur renvoie 1 (vrai) lorsque l'opérande gauche est strictement inférieur à l'opérande droit, 0 (faux) sinon.
\par
Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur $<$}
\begin{verbatim}
#include <stdbool.h>
int a = 5;
bool c;
c = a < 7; // c vaut 1 (vrai)\end{verbatim}
\end{exampleblock}
\end{frame}

18
operateurs/25.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $>$}
Cet opérateur renvoie 1 (vrai) lorsque l'opérande gauche est strictement supérieur à l'opérande droit, 0 (faux) sinon.
\par
Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur $>$}
\begin{verbatim}
#include <stdbool.h>
int a = 5;
bool c;
c = a > 7; // c vaut 0 (faux)\end{verbatim}
\end{exampleblock}
\end{frame}

18
operateurs/26.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $<$=}
Cet opérateur renvoie 1 (vrai) lorsque l'opérande gauche est inférieur ou égal à l'opérande droit, 0 (faux) sinon.
\par
Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur $<=$}
\begin{verbatim}
#include <stdbool.h>
int a = 5;
bool c;
c = a <= 7; // c vaut 1 (vrai)
c = a <= 5; // c vaut 1 (vrai)\end{verbatim}
\end{exampleblock}
\end{frame}

18
operateurs/27.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur $>$=}
Cet opérateur renvoie 1 (vrai) lorsque l'opérande gauche est supérieur ou égal à l'opérande droit, 0 (faux) sinon.
\par
Cet opérateur n'altère pas ses opérandes.
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur $>=$}
\begin{verbatim}
#include <stdbool.h>
int a = 5;
bool c;
c = a >= 7; // c vaut 0 (faux)
c = a >= 5; // c vaut 1 (vrai)\end{verbatim}
\end{exampleblock}
\end{frame}

28
operateurs/28.tex Normal file
View file

@ -0,0 +1,28 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur \&\&}
Cet opérateur représente l'opérateur ``ET logique''. Il retourne 1 si ses deux opérandes valent vrai (valeur non nulle), sinon 0 (faux).
\par
Cet opérateur n'altère pas ses opérandes.
\vspace{0.5cm}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
\&\& & 0 & 1 \\
\hline
0 & 0 & 0 \\
\hline
1 & 0 & 1 \\
\hline
\end{tabular}
\end{center}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur \&\&}
\begin{verbatim}
#include <stdbool.h>
int a = 5, b = 8;
bool c = (a < 7) && (b > 10); // c vaut 0 (faux)
\end{verbatim}
\end{exampleblock}
\end{frame}

29
operateurs/29.tex Normal file
View file

@ -0,0 +1,29 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur ||}
Cet opérateur représente l'opérateur ``OU logique''. Il retourne 1 si au moins l'un de ses deux opérandes vaut vrai (valeur non nulle),
sinon 0 (faux).
\par
Cet opérateur n'altère pas ses opérandes.
\vspace{0.5cm}
\begin{center}
\begin{tabular}{|c|c|c|}
\hline
|| & 0 & 1 \\
\hline
0 & 0 & 1 \\
\hline
1 & 1 & 1 \\
\hline
\end{tabular}
\end{center}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur ||}
\begin{verbatim}
#include <stdbool.h>
int a = 5, b = 8;
bool c = (a < 7) || (b > 10); // c vaut 1 (vrai)
\end{verbatim}
\end{exampleblock}
\end{frame}

23
operateurs/30.tex Normal file
View file

@ -0,0 +1,23 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Les opérateur \&\& et ||~: Débranchement~I}
{\small\begin{alertblock}{Débranchement}
Les opérateurs logiques ET et OU sont débranchants.
\par
Cela signifie que pour des raisons de performances, il a été décidé que si le premier opérande permet de décider à lui seul du résultat d'une
opération impliquant l'un de ces deux opérateurs, alors le deuxième opérande n'est pas évalué !
\vspace{0.3cm}
\par
Ne pas être évalué signifie que l'expression n'est pas du tout exécutée, et si des opérations altérant des variables ou des appels de fonction
sont effectués dans le deuxième opérande, ces instructions n'ont pas lieu.
\vspace{0.3cm}
\par
Le cas se produit si le premier opérande d'un ET logique est faux~: quelque soit la valeur du second résultat, le résultat est nécessairement
faux.
\par
Le cas se produit également si le premier opérande d'un OU logique est faux~: quelque soit la valeur du second résultat, le résultat est
nécessairement vrai.
\end{alertblock}}
\end{frame}

21
operateurs/31.tex Normal file
View file

@ -0,0 +1,21 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Les opérateur \&\& et ||~: Débranchement~II}
\begin{exampleblock}{Exemples de débranchements}
\begin{verbatim}
#include <stdbool.h>
int a = 5, b = 6, c = 0;
bool t;
t = (a < 9) || ( (c = 5) < b);
// t vaut 1, a vaut 5, b vaut 6, c vaut 0
t = (a > 9) && ( (c = 5) < b);
// t vaut 0, a vaut 5, b vaut 6, c vaut 0
t = (a < 9) && ( (c = 5) < b);
// t vaut 1, a vaut 5, b vaut 6, c vaut 5\end{verbatim}
\end{exampleblock}
\end{frame}

26
operateurs/32.tex Normal file
View file

@ -0,0 +1,26 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Les opérateurs de calculs et d'affectations simultanés}
La plupart des opérateurs de calcul possèdent un raccourci quand le résultat de l'opération est affecté à une variable qui se trouve être son opérande gauche.
\vspace{0.3cm}
\par
Dans ce cas, on utilise également un opérateur d'arité 2, dont la syntaxe est le symbole de l'opération désirée suivi du symbole ``=''. L'opérande de gauche subit
l'opération avec l'opérande droit et reçoit le résultat de cette opération.
\begin{exampleblock}{Exemple de l'addition}
\begin{verbatim}
int a = 5;
a += 2; // équivalent à a = a + 2\end{verbatim}
\end{exampleblock}
Voici la liste des opérateurs permettant ce raccourci~:
\begin{center}
\begin{tabular}{|>{\centering\arraybackslash}m{1.5cm}|>{\centering\arraybackslash}m{1.5cm}|>{\centering\arraybackslash}m{1.5cm}|>{\centering\arraybackslash}m{1.5cm}|>{\centering\arraybackslash}m{1.5cm}|}
\hline
+= & -= & *= & /= & \%= \\
\hline
\&= & |= & \^{ }= & $<<$= & $>>$= \\
\hline
\end{tabular}
\end{center}
\end{frame}

38
operateurs/33.tex Normal file
View file

@ -0,0 +1,38 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Bibliothèque iso646.h}
La norme C95 a défini des alias pour certains opérateurs, notamment pour aider à la lisibilité et pour pouvoir saisir du code sur des claviers ne disposant pas de
certains caractères\ldots
\vspace{0.3cm}
\par
Le fichier entête \verb|<iso646.h>| définit ces macros.
\begin{center}
{\small\begin{tabular}{|c|c|}
\hline
\verb|and| & \&\& \\
\hline
\verb|and_eq| & \&= \\
\hline
\verb|or| & || \\
\hline
\verb|or_eq| & |= \\
\hline
\verb|bitand| & \& \\
\hline
\verb|bitor| & | \\
\hline
\verb|compl| & $\sim$ \\
\hline
\verb|not| & ! \\
\hline
\verb|not_eq| & != \\
\hline
\verb|xor| & \^{ } \\
\hline
\verb|xor_eq| & \^{ }= \\
\hline
\end{tabular}}
\end{center}
\end{frame}

17
operateurs/34.tex Normal file
View file

@ -0,0 +1,17 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur ?:}
Cet opérateur utilise 3 opérandes. Il renvoie le deuxième opérande si la valeur du premier est vrai (valeur non nulle), et sinon il renvoie le troisième.
\par
L'opérande qui n'est pas renvoyé n'est pas évalué (et son code n'est donc pas exécuté).
\vspace{0.3cm}
\begin{exampleblock}{Exemple d'utilisation de l'opérateur ternaire ?:}
\begin{verbatim}
int a = 2, b;
b = a < 5 ? 3 : 6; // b reçoit 3
b = (a < 1 || a > 5) ? 5: 9; // b reçoit 9
b = a ? a + 5 : 0; // si a non nul, b reçoit a + 5, sinon 0\end{verbatim}
\end{exampleblock}
\end{frame}

37
operateurs/35.tex Normal file
View file

@ -0,0 +1,37 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: Les opérateurs de calculs et d'affectations simultanés}
Comme en mathématique où l'on résout les multiplications avant les additions, excepté si des parenthèse modifient l'ordre de résolution, il existe un ordre de priorité
des opérateurs en C. Voici les priorités par ordre décroissant de priorité~:
\begin{center}
{\footnotesize\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|c|}
\hline
-- & ++ & ! & $\sim$val & -val & & & & & & \\
\hline
* & / & \% & & & & & & & & \\
\hline
+ & - & & & & & & & & & \\
\hline
$<<$ & $>>$ & & & & & & & & & \\
\hline
< & <= & >= & > & & & & & & & \\
\hline
== & != & & & & & & & & & \\
\hline
\& & & & & & & & & & & \\
\hline
\^{ } & & & & & & & & & & \\
\hline
| & & & & & & & & & & \\
\hline
\&\& & || & & & & & & & & & \\
\hline
?: & & & & & & & & & & \\
\hline
= & += & -= & *= & /= & \%= & \&= & |= & \^{ }= & $<<$= & $>>$= \\
\hline
\end{tabular}}
\end{center}
\end{frame}

79
operateurs/operateurs.tex Normal file
View file

@ -0,0 +1,79 @@
\subsection*{Les opérateurs d'arité 1}
\input{operateurs/01}
\input{operateurs/02}
\input{operateurs/03}
\input{operateurs/04}
\input{operateurs/05}
\input{operateurs/06}
\subsection*{Les opérateurs d'arité 2}
\input{operateurs/07}
\input{operateurs/08}
\input{operateurs/09}
\input{operateurs/10}
\input{operateurs/11}
\input{operateurs/12}
\input{operateurs/12-1}
\input{operateurs/13}
\input{operateurs/14}
\input{operateurs/15}
\input{operateurs/16}
\input{operateurs/17}
\input{operateurs/18}
\input{operateurs/19}
\input{operateurs/20}
\input{operateurs/21}
\input{operateurs/22}
\input{operateurs/23}
\input{operateurs/24}
\input{operateurs/25}
\input{operateurs/26}
\input{operateurs/27}
\input{operateurs/28}
\input{operateurs/29}
\input{operateurs/30}
\input{operateurs/31}
\input{operateurs/32}
\input{operateurs/33}
\subsection*{L'opérateur d'arité 3}
\input{operateurs/34}
\subsection*{Priorité des opérateurs}
\input{operateurs/35}

BIN
pointeurs/._pointeurs.tex Normal file

Binary file not shown.

19
pointeurs/01.tex Normal file
View file

@ -0,0 +1,19 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~I}
Les pointeurs sont un nouveau type de données. Ils se déclarent à peu près avec la même syntaxe que des variables standards.
\vspace{0.5cm}
\par
Il existe un type de pointeurs pour chaque type de données (primitifs ou non).
\vspace{0.5cm}
\par
On peut déclarer une variable de type ``pointeur d'un certain type'' en intercalant le symbole \texttt{*} entre le type de données et
l'identificateur de la variable.
\vspace{0.5cm}
\begin{block}{Syntaxe générale de la déclaration de pointeur}
\begin{verbatim}
type_variable * identificateurVariable;\end{verbatim}
\end{block}
\end{frame}

20
pointeurs/02.tex Normal file
View file

@ -0,0 +1,20 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~II}
\begin{exampleblock}{Déclaration d'un pointeur sur short}
\begin{verbatim}
short * pnMonPointeur;\end{verbatim}
\end{exampleblock}
\vspace{0.3cm}
\begin{exampleblock}{Déclaration d'un pointeur sur structure}
\begin{verbatim}
struct Date * pMaDate;\end{verbatim}
\end{exampleblock}
\vspace{0.3cm}
\begin{exampleblock}{Déclaration d'un pointeur sur un pointeur d'int}
\begin{verbatim}
int ** ppiFirstElement;\end{verbatim}
\end{exampleblock}
\end{frame}

16
pointeurs/03.tex Normal file
View file

@ -0,0 +1,16 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~III}
Il est possible de déclarer plusieurs pointeurs sur une même ligne, voire de mixer pointeurs et type normal.
\vspace{0.5cm}
\par
Dans ce cas, il faut faire précéder l'identificateur d'un astérisque à chaque fois qu'on veut un pointeur.
\begin{exampleblock}{Déclaration de plusieurs variables dont des pointeurs}
\begin{verbatim}
int *a, b, *c;\end{verbatim}
\end{exampleblock}
\par
Dans cet exemple, \texttt{a} et \texttt{c} sont des pointeurs sur int (type \texttt{int *}), et \texttt{b} est un int.
\end{frame}

18
pointeurs/04.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~IV}
Tout comme les variables, les pointeurs doivent être initialisés avant d'être utilisés~!
\vspace{0.5cm}
\par
Un pointeur peut être considéré comme vide, ou ne ``pointant'' sur rien si sa valeur est égale à la macro NULL (disponible dans
$<$stdlib.h$>$).
\begin{exampleblock}{Initialisation d'un pointeur à NULL}
\begin{verbatim}
int * p_i = NULL;
char * szMyName;
szMyName = NULL;\end{verbatim}
\end{exampleblock}
\end{frame}

18
pointeurs/05.tex Normal file
View file

@ -0,0 +1,18 @@
\begin{frame}%[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur \&~I}
L'opérateur \& permet de récupérer l'adresse mémoire à laquelle est stockée la valeur d'une variable.
\vspace{0.5cm}
\par
Lorsqu'on déclare une variable, on alloue plus ou moins d'octets en mémoire, en fonction du type de la variable.
Si l'on met l'opérateur \& devant le nom de cette variable, lors de l'évaluation d'une expression, ce n'est plus le contenu de la
variable qui est retourné, mais l'adresse mémoire à laquelle il est stocké.
\vspace{0.5cm}
\par
Si le type de données de la variable est stocké sur plusieurs octets, c'est l'adresse mémoire du premier octet qui est retourné.
\vspace{0.5cm}
\par
Le type de données renvoyé par une variable précédée de l'opérateur \& est un pointeur sur le type de données de la variable.
\end{frame}

15
pointeurs/06.tex Normal file
View file

@ -0,0 +1,15 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur \&~II}
\begin{block}{Syntaxe générale de l'opérateur \&}
\begin{verbatim}
&identificateur\end{verbatim}
\end{block}
\begin{exampleblock}{Exemple de récupération de l'adresse d'un int}
\begin{verbatim}
int * pointer, value = 5;
pointer = &value; // L'expression &value est de type int *\end{verbatim}
\end{exampleblock}
\end{frame}

19
pointeurs/07.tex Normal file
View file

@ -0,0 +1,19 @@
\begin{frame}[containsverbatim]
\frametitle{\secname}
\framesubtitle{\subsecname~: L'opérateur *~I}
L'opérateur unaire (d'arité 1 donc\ldots) * permet d'accéder à la valeur stockée à l'adresse pointée par un pointeur. On appelle cette
opération le \textbf{déréférencement}.
\begin{block}{Syntaxe générale de l'opérateur *}
\begin{verbatim}
*pointeur\end{verbatim}
\end{block}
\begin{alertblock}{NULL-pointer derefenrencing}
Vous NE DEVEZ PAS déréférencer un pointeur contenant NULL ! Ce peut constituer une faille de sécurité importante.
\par
Vous DEVEZ tester que la valeur est non-nulle avant de déréférencer un pointeur, s'il y a un doute possible.
\end{alertblock}
\end{frame}

Some files were not shown because too many files have changed in this diff Show more