CINI – Li115 1 Semaine 2 Bibliothèque graphique, opérateurs et instructions de base ● Bibliothèque graphique ● Instruction composée ● Instructions conditionnelles ● Boucle for ● Directive #define
CINI – Li115 2 Les fonctions graphiques ● Fenêtre graphique ● Coordonnées d'un point ● Problème de la mise en attente ● Primitives de dessin ● Point ● Ligne ● Texte
CINI – Li115 3 Fenêtre et coordonnées ● Une fenêtre graphique est composée d'un ensemble de points dont les coordonnées sont des entiers positifs ou nuls ; ● Une fenêtre de largeur L et de hauteur H représente l'ensemble des points de coordonnées entières x et y telles que : – 0 ≤ x ≤ (L - 1) – 0 ≤ y ≤ (H - 1) ● Le point de coordonnées (0, 0) est situé en haut à gauche de la fenêtre.
CINI – Li115 4 Notion de pixel ● Un pixel est un élément de la fenêtre défini par : – - sa coordonnée x – - sa coordonnée y – - sa couleur : dans les fonctions de la bibliothèque graphique, c'est une chaîne de caractères en anglais : ''red'', ''white'', ''green'', ''black'',... (0, 0) x=15 y=10 ''red' '
CINI – Li115 5 Création d'une fenêtre ● void CINI_open_window(int width, int height, string title); ● → Crée une fenêtre de largeur width, de hauteur height et de nom title ● void CINI_open_fullscreen(); ● → Crée un espace graphique à la taille de l'écran Attention : ● Votre programme doit appeler l'une de ces deux fonctions avant toute opération d'affichage graphique ● Vous ne pouvez avoir qu'une fenêtre d'ouverte à la fois ● → En ouvrir une deuxième détruit la première...
CINI – Li115 6 La mise en attente ● Lorsque la dernière instruction (graphique ou non) a été exécutée, le programme se termine et ferme la fenêtre graphique. ● La durée totale d'exécution est inférieure à 1s : l'utilisateur n'a pas le temps de voir son dessin s'afficher ! ● Il faut ajouter une instruction qui bloque l'exécution jusqu'à ce qu'un événement se produise : ● - clic souris ● - enfoncement d'une touche ●
CINI – Li115 7 Les fonctions de mise en attente ● void CINI_loop(void) ; ● Met le programme en pause jusqu'à la fermeture de la fenêtre : – - par un clic dans le coin en haut à gauche (si on n'est pas – en plein écran) – - par la touche d'échappement (esc) ● int CINI_loop_until_keyup(void) ; ● Met le programme en pause jusqu'au relâchement d'une touche ● int CINI_loop_until_keydown(void) ; ● Met le programme en pause jusqu'à l'enfoncement d'une touche
CINI – Li115 8 Un programme graphique minimal #include int main() { /* Creation de la fenetre */ ● CINI_open_window(300, 400, "fenetre"); ● /* Pause jusqu'à fermeture par l'utilisateur */ ● CINI_loop(); return 0; }
CINI – Li115 9 Manipuler des pixels ● void CINI_draw_pixel(int x, int y, string color); ● Affecte la couleur color au point de coordonnées (x, y) dans la fenêtre ● void CINI_fill_window(string color); ● Affecte la couleur color à tous les points de la fenêtre ● bool CINI_check_pixel_color(int x, int y, string color); ● Retourne true si le pixel de coordonnées (x, y) dans la fenêtre est de couleur color, retourne false sinon
CINI – Li Tracer des lignes ● void CINI_draw_line(int ax, int ay, int bx, int by, string color); ● Trace une ligne de couleur color entre le point A de coordonnées (ax, ay) et le point B de coordonnées (bx, by) (0, 0) ax ayay A B byby bx
CINI – Li Insérer du texte dans l'image ● void CINI_draw_string(int x, int y, string color, string str); ● Affiche la chaîne de caractères str à la position (x, y) dans la fenêtre graphique. ● Le texte est affiché en blanc. (0, 0) x y Hello world ! H Note : le caractère peut occuper moins de 15x25 pixels. 'M' est plus large et plus haut que 'e'.
CINI – Li Un programme plus complet #include int main() { CINI_open_window(500, 200, "fenetre"); CINI_draw_string(200, 50, "white", "Hello world !"); CINI_draw_line(180, 40, 360, 40, "lime green"); CINI_draw_line(180, 85, 360, 85, "fuchsia"); CINI_draw_line(180, 40, 180, 85, "yellow"); CINI_draw_line(360, 40, 360, 85, "aqua"); CINI_loop(); return 0; }
CINI – Li115 13
CINI – Li Instructions ● Une instruction peut être : ● Une expression, elle se termine alors par un point virgule. – Par exemple : une déclaration de variable, une affectation, un appel de fonction. ● Une structure de contrôle : boucle ou alternative. – Par exemple : ● if(...){ ●... ● } ● else{ ●... ● } ● Un bloc d'instructions. ● for(...){ ●... ● } ● while(...){ ●... ● }
CINI – Li Instruction composée (ou bloc d'instructions) ● Regroupe plusieurs instructions entre accolades ● { ● instruction_1; ● instruction_2; ● … ● instruction_n; ● } ● Doit contenir au moins une instruction (pour Li115)
CINI – Li Instruction conditionnelle ● Exécution séquentielle des instructions ● → soumettre l'exécution d'un bloc d'instructions à une condition ● Exemple: – Demander à l'utilisateur son numéro d'étudiant – Si ce numéro est plus grand que – → calculer son année d'inscription – → afficher l'année d'inscription – Demander à l'utilisateur son age –... –
CINI – Li Instruction conditionnelle simple : syntaxe Permet de conditionner l'exécution d'une suite d'instructions if (expression_booléenne) instruction; if (expression_booléenne) { instruction_1; … instruction_n; } Les instructions du bloc ne sont exécutées que si l'expression booléenne est vraie
CINI – Li Test de division par 0 CINI_print_string("apres if"); CINI_newline(); return 0; } #include int main(){ CINI_print_string("saisie du denominateur : "); CINI_print_string("saisie du numerateur : "); num = CINI_read_int(); /* Saisie d'un entier num et d'un entier den. Si den est non nul */ /* affiche le quotient et le reste de la division entiere de den */ /* par num */ if (den != 0) { quotient = num / den; } int num,den,quotient; CINI_print_string("quotient de la division entiere : "); CINI_print_int(quotient); CINI_newline(); CINI_print_string("reste de la division entiere : "); CINI_print_int(num % den); CINI_newline(); den = CINI_read_int();
CINI – Li saisie du numerateur : 8 saisie du denominateur : 4 quotient de la division entiere : 2 reste de la division entiere : 0 apres if saisie du numerateur : 5 saisie du denominateur : 4 resultat de la division : 1 reste de la division entiere : 1 apres if saisie du numerateur : 8 saisie du denominateur : 0 apres if
CINI – Li Instruction conditionnelle avec alternative : syntaxe Permet de définir des instructions à exécuter si l'expression booléenne est fausse if (expression_booléenne) { instruction_1; … instruction_n; } else { instruction_alt_1; … instruction_alt_m; } Chaque bloc peut contenir une ou plusieurs instructions
CINI – Li Traitement de la division par 0 #include int main(){ /* déclarations des variables num, den et quotient*/... /* initialisation de num et den */... if (den != 0) { quotient = num / den; /* affichage des résultats */... } else { CINI_print_string("erreur : division par 0"); CINI_newline(); } CINI_print_string("apres if"); CINI_newline(); return 0; }
CINI – Li Pas de changement lors d'une division par un entier ≠ 0 saisie du numerateur : 0 saisie du denominateur : 3 resultat de la division : 0 reste de la division entiere : 3 apres if saisie du numerateur : 8 saisie du denominateur : 0 erreur : division par 0 apres if
CINI – Li Instruction conditionnelle : règles de bonne conduite Toujours utiliser des instructions composées (même pour une seule instruction) pas de ralentissement du programme permet facilement l'ajout d'instructions
CINI – Li Boucle ● Exécution séquentielle des instructions ● Avec des conditions ● → pouvoir répéter un bloc d'instructions ● Exemple: – Afficher tous les nombres entre 1 et 10 – CINI_print_int(1); CINI_print_int(2); … – VS – i=0; – Répéter jusqu'à 10: – → i=i+1; – → CINI_print_int(i);
CINI – Li Boucle for : syntaxe Permet de répéter plusieurs fois un bloc d'instructions associé à une variable de boucle for (init ; condition_cont ; modification) { instruction_for_1; … instruction_for_n; } init initialise la variable de boucle (qui a été déclarée avant) condition_cont (test de la valeur de la variable de boucle) condition d'entrée (de continuation) de la boucle détermine si la valeur de fin de boucle est atteinte ou non modification modifie la valeur de la variable de boucle attribue une valeur pour le prochain tour de boucle intervient dans le bloc après : instruction_for_n;
CINI – Li Affichage des 4 premiers entiers naturels non nuls int i; CINI_print_string("Valeur de i : "); CINI_print_int(i); CINI_newline(); Valeur de i : 1 Valeur de i : 2 Valeur de i : 3 Valeur de i : 4 Boucle finie for ( ; ; ) { } CINI_print_string("Boucle finie"); CINI_newline(); i=1i < 5i=i+1
CINI – Li Boucle for : méthodologie ● Déclaration de la variable de boucle ● i = la valeur à afficher ● Écriture du traitement à répéter en utilisant la variable de boucle (instructions qui vont être dans la boucle) ● Affichage de la valeur de i ● Identification de la valeur initiale de la variable de boucle (init) ● i commence à 1 ● Identification de la valeur finale de la variable de boucle (condition_cont) ● i s'arrête à 4 ● Calcul de la valeur suivante de la variable de boucle (modification) ● i augmente de 1
CINI – Li Affichage des lettres entre 'a' et 'd' for ( ; ; ) { } Valeur de c : a Valeur de c : b Valeur de c : c Valeur de c : d Boucle finie CINI_print_string("Boucle finie"); CINI_newline(); char c; CINI_print_string("Valeur de c : "); CINI_print_char(c); CINI_newline(); c='a'c <= 'd'c=c+1
CINI – Li Notation Incrémentation et décrémentation d'une variable ● var = var+1 peut s'écrire var++ ● var = var-1 peut s'écrire var int i; for (i=1; i < 5; i++) { CINI_print_string("Valeur de i : "); CINI_print_int(i); CINI_newline(); } CINI_print_string("Boucle finie"); CINI_newline();
CINI – Li Affichage des multiples de 3 inférieurs à 10 int i; Multiples de Boucle finie CINI_print_string("Boucle finie"); CINI_newline(); CINI_print_int(i); CINI_newline(); for ( ; ; ) { } i=3i < 10i=i+3 CINI_print_string("Multiples de 3"); CINI_newline();
CINI – Li Boucle for : règles de bonne conduite for (init ; condition_cont ; modification) { instruction_for_1; … instruction_for_n; } Toujours utiliser une instruction composée init : initialise une variable déjà déclarée condition_cont : teste la valeur de la variable de init modification : modifie la valeur de la variable de init instruction_for_i : ne doit pas modifier la valeur de la variable de init pas d'instruction d'interruption de la boucle
CINI – Li Directive #define Nommer des valeurs (sans déclarer de variables) Abstraction : utiliser le nom plutôt que la valeur AVANTAGES ● Facilite la modification et la mise au point du programme ● réutilisation simple de la valeur ● modification de la valeur à un seul endroit ● Meilleur style de programmation #define NOM valeur Le préprocesseur (avant compilation) remplace toutes les apparitions de NOM par valeur Par tradition les noms seront en majuscules
CINI – Li Affichage des N premiers entiers naturels non nuls Même algorithme que l'on affiche les entiers de 1 à 4, de 1 à 10 ou … Ecriture d'un algorithme général, indépendant du nombre d'entiers à afficher
CINI – Li Directive #define : fichier source #include #define N 7 int main() { int i; for (i=1 ; i < N ; i++) { CINI_print_string("Valeur de i : "); CINI_print_int(i); CINI_newline(); } return 0; } Le fichier source
CINI – Li Préprocesseur (avant compilation) int main() { int i; for (i=1 ; i < 7 ; i++) { CINI_print_string("Valeur de i : "); CINI_print_int(i); CINI_newline(); } return 0; } Le fichier qui sera compilé
CINI – Li Exécution (après compilation) Valeur de i : 1 Valeur de i : 2 Valeur de i : 3 Valeur de i : 4 Valeur de i : 5 Valeur de i : 6 Pour afficher plus (ou moins) d'entiers il suffit de - changer la valeur associée à N - recompiler - exécuter le programme obtenu
CINI – Li Attention : valeur ≠ variable #include #define N 3 int main() { N = N-1; return 0; } int main() { 3 = 3-1; return 0; } Fichier qui sera compilé Fichier source error : invalid lvalue in assignment #define NOM val NOM n'est pas une variable, c'est une valeur (val ici)