Programmation Impérative 2006-2007 Licence Physique Université Jean Monnet Ruggero G. PENSA Eléments d’algorithmique Introduction Variables Opérateurs et expressions Actions Entrée/Sortie Définitions Algorithme description d’un ensemble d’étapes (instructions) à effectuer dans un ordre donné pour parvenir à un résultat Langage de programmation langage dans lequel un algorithme peut être traduit pour être compris par l’ordinateur Programme description d’un algorithme dans un langage de programmation Exemples Guide de montage d’un meuble IKEA/Conforama… Recette de cuisine Types de langage Pour vos algorithmes Pour vos programmes Langages évolués : C, Pascal, Visual Basic, Delphi, Java… Utile à savoir Langage naturel : français, anglais, italien… Langages formels : pseudo-code Langages assembleurs : mnémoniques Langages machines : ensemble de bits Langages interprétés : Visual Basic, Matlab, Pearl… Langages compilés : C, Pascal, Cobol, ADA Langage de programmation Un langage de programmation est un langage formel avec une syntaxe bien définie, qui sert à coder des algorithmes et des structures de données dans une forme compréhensible par l’ordinateur Un programme informatique est constitué d’une suite d’instructions (ou ordres) exécutées par l’ordinateur pour accomplir une tâche particulière Dans un langage il est important à la fois Le contenu (le sens) La forme (la syntaxe, la grammaire) Méthodologie de programmation Problème TD Analyse Algorithme Conception Programme (langage évolué) Révision Débogage Traduction (Compilation) Programme (langage machine) Débogage Exécution Résultats TP Qualités d’un algorithme Correct bien faire ce qui est prévu Complet faire tout ce qui est prévu Efficace exécution rapide avec peu d’occupation mémoire Clair doit être facilement lisible et évolutif Introduction au formalisme Un algorithme doit être compréhensible par plusieurs personnes Exemple Entête Nom : addDeuxEntiers Rôle : Additionner deux entiers Entrée : a, b : entier Sortie : entier Déclaration : début retourner (a + b) fin Corps Variable Entité qui contient une information Possède un nom (identifiant) Possède une valeur Possède un type (qui caractérise l’ensemble des valeurs que peut prendre la variable) Est stockée dans la mémoire centrale de l’ordinateur Variable Analogie avec une armoire d’archive qui contiendrait des tiroirs étiquetés Armoire Mémoire de l’ordinateur Tiroirs Variables Etiquettes Identifiants Contenu Valeur Couleur Type Exemple : bleu pour les factures, rouge pour les bons de commande… Type d’une variable Caractérise L’ensemble des valeurs que peut prendre la variable L’ensemble des actions que l’on peut effectuer sur une variable Toute variable doit être déclarée avant son utilisation (partie Déclaration) en lui associant un Type Identifiant : Type Exemples age : Naturel nom : Chaîne de Caractères sexe : Caractère moyenne : Réel Une fois qu’un type est associé à une variable, on peut pas le changer Une fois qu’un type est associé à une variable le contenu de cette variable doit être obligatoirement du même type Types de données Types simples Dénombrables (nombre d’éléments fini) Indénombrables (nombre d’éléments infini) Types complexes Exemples - nombre complexe (partie réelle + partie imaginaire) - etudiant (nom + prénom + moyenne) Types de données simples Dénombrables Booléen : { VRAI, FAUX } les variables ne peuvent prendre que ces deux valeurs Intervalle, ex, : [1..10] les variables ne peuvent prendre que les valeurs entières définies dans cet intervalle Énuméré, ex : {rouge, vert, jaune} les variables ne peuvent prendre que les valeurs explicitées Caractères : table ASCII Dénombrables Exemples célibataire : booléen mois : 1..12 minuscules : ‘a’..‘z’ jour : JoursDeLaSemaine Déclaration : type JourDeLaSemaine = énuméré {lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche} Types de données simples Indénombrables Entier (positifs et négatifs) Naturel (entiers positifs) Réel Chaîne de caractéres Exemple ’’cours’’ ou ’’TD d’algorithmique’’ Indénombrables Exemples age : naturel taille : réel nom : chaîne de caractères Constante Variable dont la valeur est fixée tout au début de l’algorithme et ne change pas lors de l’exécution de l’algorithme Possède Un nom Un type Une valeur (fixe) Exemples Pi : Réel 3.14159 Euro : Réel 6.55957 Répétitions : Entier 10 Opérateurs, opérande et expression Opérateur : symbole d’opération qui permet d’agir sur des variables ou de faire des calculs Opérande : entité (variable, constante ou expression) utilisée par un opérateur Expression : combinaisons d’opérateur(s) et d’opérande(s), evaluée durant l’exécution de l’algorithme. Possède une valeur (son interprétation) un type Opérateur, opérande et expression Exemple : a + b a : opérande gauche + : opérateur b : opérande droite a + b : expression Si a vaut 2 et b vaut 3, l’expression a + b vaut 5 Si a et b sont des entiers, l’expression a + b est de type entier Type d’opérateurs Unaire : un seul opérande (Exemple : non) Binaire : deux opérandes (Exemple : +) L’expression possède un seul type dans une expression chaque opérateur doit être associé au type de l’expression (Exemple : "J’ai" + 2 + "chats") Seule exception tolérée : types arithmétiques (Exemple : 2 + 3.5) Signification des opérateurs Peut changer en fonction du type des opérandes Par exemple opérateur + avec des entiers aura pour sens l'addition 2 + 3 vaut 5 Opérateur + avec des chaînes de caractères aura pour sens la concaténation "bonjour" + " tout le monde" vaut "bonjour tout le monde" Opérateurs sur les booléens Quatre opérateurs a non a vrai faux faux vrai a b a et b vrai vrai vrai faux vrai faux vrai faux faux faux faux faux a b a ou b a b a ouExclusif b vrai vrai vrai vrai vrai faux faux vrai vrai faux vrai vrai vrai faux vrai vrai faux vrai faux faux faux faux faux faux Opérateurs sur les énumérés Trois opérateurs succ : permet d'obtenir le successeur pred : permet d'obtenir le prédecesseur ord : permet d'obtenir le naturel de correspondant à la position de l'élément dans la liste de l'énuméré Exemples type JoursDeLaSemaine succ Lundi vaut Mardi succ Dimanche vaut Lundi pred Mardi vaut Lundi pred Lundi vaut Dimanche ord Lundi vaut 0 ord Dimanche vaut 6 Opérateurs sur les caractères Quatre opérateurs (les trois des énumérés + car) On considère la position dans la table ASCII Exemples ord 'A' vaut 65 car 65 vaut 'A' pred 'A' vaut '@' succ 'b' vaut 'c' Cf. man ascii Opérateurs arithmetiques Pour les entiers : +, -, *, / Pour les réels : +, -, *, / Pour les naturels et les entières : div : division entière mod : reste de la division Exemples 11 div 2 vaut 5 11 mod 2 vaut 1 Opérateurs sur les chaînes de caractères Concatenation : + Exemple : "bonjour" + " tout le monde" vaut "bonjour tout le monde" Opérateurs de comparaison = : opérateur d'égalité on le retrouve chez tous les types simples et permet de savoir si deux opérandes sont égales ≠ : opérateur d'inégalité <, >, ≤, ≥ : opérateurs de comparaisons pour les types possédant un ordre Une expression de comparaison contenant un opérateur de comparaisons est de type booléen Exemples 12 < 14 vaut VRAI "marco" = "zizou" vaut FAUX Priorité des opérateurs Tout comme en arithmétique, les opérateurs ont des priorités Exemple : * / + - (du plus prioritaire au moins prioritaire) Pour les booléen : non, et, ouExclusif, ou En cas de doute : utiliser les parenthèses Actions sur les variables Lecture d'une variable obtenir son contenu Il suffit de nommer la variable Exemple : écrire(a) Écriture d'une variable affecter un (nouveau) contenu à la variable en utilisant la procédure lire (a) en utilisant l'opérateur d'affectation "" Syntaxe : identifiant expression l'expression ne contient pas d'opérateur d'affectation Opérateur d'affectation Qu'est-ce que ça veut dire c a + b ? On prend la valeur contenue dans la variable a On prend la valeur contenue dans la variable b On additionne ces deux valeurs On met ce résultat dans la variable c Si c avait auparavant une valeur, cette dernière est perdue Exemple : -x 1 -x x + 1 (on affecte la valeur 1 à la variable x) (on ajoute 1 à la valeur contenue dans x, on stocke le résultat dans x) - Résultat : incrémentation de la variable x d'une unité (x vaut 2) Les entrées/sorties Un algorithme a souvent des interactions avec l'utilisateur. Il peut Affichage Afficher un résultat (texte ou contenu d'une variable) Demander à l'utilisateur de saisir une information afin de la stocker dans une variable Commande écrire suivie entre parenthèses de la chaîne de caractères entre guillemets et/ou des variables de type simple à afficher (séparées par des virgules) Exemple : écrire("La valeur de la variable prix est ", prix, " Euros") Saisie Commande lire suivie entre parenthèses de la variable de type simple qui va recevoir la valeur saisie par l'utilisateur Exemple : lire(b) Exemple d'algorithme Nom : euroVersFranc Rôle : Convertisseur des sommes en euros vers le franc, avec sisie de la somme en euro et affichage de la somme en franc. Entrée : Sortie : Déclaration : constante tauxConversion : Réel 6.55957 variable valeurEnEuro, valeurEnFranc : Réel début écrire("Entrer votre valeur en euro : ") lire(valeurEnEuro) valeurEnFranc valeurEnEuro * tauxConversion écrire(valeurEnEuro, "euros = ", valeurEnFranc, " Fra") fin Langage C Introduction Variables Opérateurs et expressions Instructions Entrée/Sortie Histoire Développé en 1971 par Dennis Ritchie au sein des laboratoires Bell pour écrire le système UNIX Spécifications publiées en 1978 dans l'ouvrage de Kerninghan et Ritchie : "The C Programming Language" (K&R C) Norme AINSI C publiée en 1989 (ANSI C) Compilation compilateur éditeur de liens .c .s fichier.c .h .o fichier.o assembleur fichier exécutable gcc –o exécutable source.c Compilation 2 compilateur vert.c vert.o .c .s éditeur de liens .o common.h .h assembleur .s .o bleu.c bleu.o .c fichier exécutable Séparateurs et commentaires Espace, tab et retour à la ligne sont ignorées (mais utiles pour la mise en forme du fichier .c) /* */ : commentaires (ignorés) /* ceci est un commentaire sur plusieurs lignes */ ; termine une déclaration ou une instruction simple , sépare deux éléments dans une liste (…) liste d'arguments {…} bloc ou liste d'initialisations […] dimension/sélection d'élements de tableaux Structure d'un programme C #include <stdio.h> prépocesseur … ; variables … ; fonctions int main(int argc, char*argv[]) fonction principale { début du bloc … ; variables … ; corps du programme } fin du bloc Directives du procésseur Commencent toujours par # Exemples : #include #define Quatre utilisations principales 1. 2. 3. 4. Inclusion de fichiers Constantes symboliques Macros Compilation conditionnelle #ifdef Variables En C les variables sont caractérisées par un identifiant une portée un type une valeur Identifiants L'identifiant d'une variable est son nom En C il est composé d'une suite de caractères parmi les lettres minuscules les lettres majuscules les chiffres "_" (underscore) Le premier caractère est toujours "_" ou une lettre Exemples (nom corrects) x x2 _x LePoint Exemples (non incorrects) 2x non' le.point c_est_bon hara-kiri Identifiants 2 Distinction entre majuscules et minuscules toto ≠ Toto ≠ TOTO Les mots réservés du langage C ne sont pas redéfinissables par le programmeur int char float double asm void long short signed default unsigned enum struct union typedef sizeof const auto extern register static volatile goto return break continue if else for do while switch case Déclaration On prévient le compilateur en début de bloc que l'on va utiliser une variable et le type d'éléments qui y seront stockés Forme : <type> <identifiant> Exemple : int ma_variable Affectation On stocke une valeur dans la variable Forme : <identifiant> = <contenu> ; Exemple : a = 3 ; (si a est une variable entière) Initialisation Déclaration + Affectation Forme : <type> <identifiant> = <contenu> ; Exemple : int a = 3 ; (si a est une variable èntiere) Utilisation On récupère la valeur qui est stockée dans la variable Forme : <identifiant> Exemple : a + 2.5 (si a est une variable réelle) Portée La portée d'une variable définit où la variable peut être utilisée En C une variable peut être utilisée à partir du moment où elle a été définie et jusqu'à la fin du bloc de déclaration Portée Exemple Variable a #include… int a ; … ; void test(int b) { if (a > b) { int c = b ; b = a ; a = b ; } ecrire(b) ; } void test2… Portée Exemple Variable b #include… int a ; … ; void test(int b) { if (a > b) { int c = b ; b = a ; a = b ; } ecrire(b) ; } void test2… Portée Exemple Variable c #include… int a ; … ; void test(int b) { if (a > b) { int c = b ; b = a ; a = b ; } ecrire(b) ; } void test2… Types de base void : type vide char : 'a' … 'b' … 'B' … '\n' … '\t' … '\014' int : 120 … -10 … 0123 … 0xfc … 0xFC float : 1.23 … -1.23 … 1.2345e+12 … 1. double : 1.23 … -1.23 … 1.23456789012345e+12 pas de type booléen en C Utiliser les entier FAUX : 0, VRAI : tous les autres valeurs pas de type intervalle Le type int possède 3 sous-types short, long et unsigned Constantes Les constantes sont des variables dont la valeur ne peut pas changer Elles se déclarent comme des variables et sont affectées définitivement à ce moment là Elles sont précédées du mot-clef const Exemples const double Pi = 3.141592654 ; const int BufSize = 1024 ; const int VRAI = 1, FAUX = 0 ; Elles ne peuvent pas être modifiées Expressions Une expression est un ensemble d'une ou de plusieurs opérations Une expression a une valeur Types d'opérations : arithmétiques logiques affectation et in/de-crémentation relations conversion de type L'ordre d'évaluation dans une expression est déterminé par des règles de priorité et d'associativité Le type de donné du résultat est déterminé par le type des opérandes Opérateurs arithmétiques Pour les entiers et les réels Opérateur Fonction Usage + addition (binaire) expr + expr + … - soustraction (unaire) -expr - soustraction (binaire) expr – expr * multiplication (binaire) expr * expr / division (binaire) expr / expr % modulo (binaire) expr % expr Opérateur d'affectation Permettent de donner une valeur à une variable int i, j ; i = 0 ; j=1; Attention : retourne la valeur affectée int x, y ; x = y = -1 ; /* se lit : x = (y = -1) ; */ Combinaison possible avec un opérateur arithmétique a = a + 2 ; a += 2 ; y = y / 4 ; y /= 4 ; x = x * (y + z) x *= y + z ; Opérateurs d'in/de-crémentation L'opérateur ++ et l'opérateur – fournissent un moyen efficace pour compacter les écritures x++ ; x-- ; ++x ; --x ; post-incrémentation post-décrémentation pré-incrémentation pré-décrémentation Signification x++ ; équivaut à x = x + 1 ; x-- ; équivaut à x = x – 1 ; Opérateurs relationnels Opérateur Fonction Usage == égalité expr == expr != inégalité expr != expr > supérieur expr > expr >= supérieur ou égal expr >= expr < inférieur expr < expr <= inférieur ou égal expr <= expr ! non logique !expr && et logique expr && expr || ou logique expr || expr Le résultat est une expression booléenne vraie ou fausse Lors de l'évaluation : arrêt de l'évaluation dès que la première opérande est fausse, dans le cas de &&, ou vraie, dans le cas de || Instruction Il existe deux types d'instruction Instructions simples terminées par un ';' Exemple : a = 4 ; b++ ; Instructions composées utilisant un bloc {…} Instructions conditionnelles Instructions d'itération Instruction conditionnelle (exemple) if (a < b) { c = b – a ; ecrire("Négatif") ; } else { c = a – b ; ecrire("Positif ou zéro") ; } Instructions d'itération while (a < b) { a++ ; b-- ; } for (i=1 ; i <= 10 ; i++) { somme += i ; produit *= i; } Entrées !!! Entrées : scanf() Variable instruction int i ; scanf("%i", &i) ; double d ; scanf("%lf", &d) ; float f ; scanf("%f", &f) ; char c ; scanf("%c", &c) ; Sorties Entrées : printf() Variable instruction int i ; printf("%i", i) ; printf("%d", i) ; printf("%x", i) ; héxadecimal double d ; float f ; printf("%lf", d) ; printf("%f", f) ; printf("%e", f) ; exponentielle char c ; printf("%c", c) ; Exemple d'algorithme Nom : euroVersFranc Rôle : Convertisseur des sommes en euros vers le franc, avec sisie de la somme en euro et affichage de la somme en franc. Entrée : Sortie : Déclaration : constante tauxConversion : Réel 6.55957 variable valeurEnEuro, valeurEnFranc : Réel début écrire("Entrer votre valeur en euro : ") lire(valeurEnEuro) valeurEnFranc valeurEnEuro * tauxConversion écrire(valeurEnEuro, "euros = ", valeurEnFranc, " Fra") fin Traduction en Langage C #include <stdio.h> const float tauxDeConversion = 6.55957 ; int main(int argc, char *argv[]) { float valeurEnEuro, valeurEnFranc; printf("Entrer votre valeur en euros :") ; scanf("%f", &valeurEnEuros) ; valeurEnFranc = valeurEnEuro * tauxDeConversion ; printf("%f euros = %f Fra\n", valeurEnEuros, valeurEnFranc) ; return 0 ; } Récapitulatif Langage algorithmique Pseudo-code Langage de programmation Langage C vide booléen intervalle entier réel caractère Booléen [1..10] Entier Réel Caractère void int float / double char Variables Opérateurs déclaration affectation utilisation portée a : Entier a 3 a int a ; a = 3 ; a incrémentation décrémentation arithmétique logique relation a a + 1 a a – 1 + - / * mod et +. -. *. /. non et ou = ≠ < > ≤ ≥ a++ ; a-- ; + - / * % ! && || == != < > <= >= E/S Entrée Sortie lire écrire scanf printf Types Instruction Depuis la déclaration jusqu'à la fin du bloc de déclaration