810 likes | 1.02k Views
Introduction à l’informatique. Chapitre 1: Algorithmes et Programmes. Algorithmes et Programmes. Vie d'un programme Algorithme Programmation : le langage Exécution et test des programmes. Cycle de vie d'un programme (d'un logiciel). Conception - Modélisation Analyse du problème
E N D
Introduction à l’informatique Chapitre 1: Algorithmes et Programmes
Algorithmes et Programmes • Vie d'un programme • Algorithme • Programmation : le langage • Exécution et test des programmes
Cycle de vie d'un programme (d'un logiciel) • Conception - Modélisation • Analyse du problème • Solution algorithmique • langage d'algorithmes • Programmation • Programme • langage de « haut niveau » • Compilation – Interprétation • Exécution sur machine • langage machine de « bas niveau » • assembleur et code machine • Mise au point • Vérification par test pour corriger • Evaluation du coût pour optimiser
Cycle de vie d'un programme (d'un logiciel) • Conception - Modélisation • Langage de description d'algorithme • simplicité , précision • indépendant de la programmation et de la machine • Exemple : diagramme , pseudo C, ... • Programmation • Exécution
Cycle de vie d'un programme (d'un logiciel) • Conception - Modélisation • Programmation • Langage de programmation (langages « évolués ») • syntaxe contraignante, différents styles d'abstraction • indépendant de la machine • Types de langages • impératifs : Fortran, Cobol, Pascal, C • fonctionnels : Lisp, ML, Caml • logiques : Prolog • objets : C++, Java • Exécution
Cycle de vie d'un programme (d'un logiciel) • Conception - Modélisation • Programmation • Exécution • Langage assembleur • dépendant de la machine, du processeur • Exemples : Assembleur pour PC (IA-32), PowerPC, MIPS, SPARC, etc.
L'entier N est-il pair ? • Conception - Modélisation • Analyse du problème • Un nombre N est pair si le reste de la division de N par 2 est nul • Solution algorithmique • 1. calculer le reste R de la division de N par 2 • 2. si R est égal à 0 alors N est pair • 3. sinon N n'est pas pair
L'entier N est-il pair ? • Programmation • Programme C main () {// début du programme principal int n ; printf("Donner un nombre n:") ; scanf("%d", &n) ; if ((n % 2) == 0) printf("%d est pair \n", n); else printf("%d n'est pas pair \n", n); } // fin du programme principal
L'entier N est-il pair ? Compilation - Codage load N modi 2 jzer P ... halt Assembleur Code machine
Algorithme • () Recette, règle, mécanisme, procédé, procédure, méthode, • (=) Description d'une procédure de calcul par une suite d'étapes de calcul, d'actions (plus ou moins) élémentaires. • Un algorithme n'est pas forcément destiné à décrire la solution d'un problème pour la programmation et l'informatique ... • Un algorithme en cuisine s'appelle une recette • Un algorithme en musique s'appelle une partition • Un algorithme en tissage s'appelle un point
Algorithme (historique) • Les premières formulations de règles précises pour la résolution de certains types d'équations remontent aux Babyloniens (époque d'Hammurabi, (1800 avant J.C.). • Depuis l'antiquité : algorithmes sur les nombres. • Exemple : l'algorithme d'Euclide qui permet de calculer le p.g.c.d. de deux nombres entiers. • Le mot algorithme est plus récent, il vient du nom d'un mathématicien perse du IXe siècle: Muhammad ibn Musa al-Khowârizmî. • La signification du mot évolue au cours des temps : • pratique de l'algèbre (d'Alembert, XVIIIe siècle) • méthode et notation de toute espèce de calcul • tout procédé de calcul systématique, voire automatique
Algorithme de la mousse au chocolat (6 p) • Ingrédients : • 250g de chocolat, 125g de beurre, 6 œufs, 50 g de sucre, café • Etapes : • faire fondre le chocolat avec 2 cuillères d'eau • ajouter le beurre • laisser refroidir avant d'ajouter les jaunes d’œufs • ajouter le sucre et comme parfum un peu de café • battre les blancs en neige et les ajouter au mélange. • A partir des ingrédients (données en entrée), appliquer la recette (les étapes) va produire une mousse au chocolat (le résultat). L’abus de mousse au chocolat est déconseillé
Algorithme : un peu de méthodologie • identifier les données fournies / nécessaires (données en entrée) • identifier le résultat (données en sortie) • déterminer les actions ou opérations élémentaires • spécifier l'enchaînement des actions • langage d'algorithmes = langage de description des données, des actions et des enchaînements
Langage de description d'algorithmes • Algorithme titre • % commentaire • Lexique : variables // entrée • : variables // sortie • : variables // auxiliaire • action : noms des opérations • début • liste d'instructions • fin
Calculer le carré de N avec l'addition seule • Analyse • N2 = N + N + ... + N N fois • Algorithme • Algorithme Calcul-Carré-par-Add • Calcul du carré d'un entier • Lexique : • N entier // Entrée • Carré entier // Sortie • Action : + • Initialiser Carré à 0 • Faire N fois : • Carré ← Carré + N
Variable • Une variable est le nom d'un «récipient» destiné à contenir une valeur. Lorsque nous nous intéresserons un peu plus à l'ordinateur, le récipient sera une «zone» mémoire. • Le type d'une variable sert à préciser la nature des valeurs acceptables par le récipient. Un type est un nom pour un ensemble de valeurs. • Exemple : Carré est une variable de type entier. La valeur de (dans) Carré est un entier. La valeur de Carré ne peut être un caractère ou un réel
Affectation par une valeur • L'affectation variable ← valeur est une instruction qui permet de changer la valeur d'une variable. L'affectation modifie le contenu du récipient désigné par la variable. • La valeur de la variable à gauche de ← est remplacée par la valeur à droite de ←. • Exemple : Carré ← 0 « se lit » le récipient Carré reçoit la valeur 0. • Avertissement • L'affectation est une instruction qui est dite «destructrice». • L'ancienne valeur de la variable est détruite, écrasée, effacée par la nouvelle valeur ! • Carré ← N Copie de la valeur de N. La valeur de N (par exemple 7) existe en double
Affectation par une expression • L'affectation variable ← expression est effectuée par : • 1. évaluation de l'expression • 2. placement du résultat dans le récipient désigné par la variable à gauche. • Attention • A droite de ←, dans l'expression, les variables sont abusivement utilisées pour désigner les valeurs qu'elles contiennent. Ceci est une convention. • Exemple : Carré ← Carré + N a pour effet de mettre le résultat de la somme de la valeur de Carré avec la valeur de N dans le récipient Carré.
Tester si N est un carré parfait • Analyse • N est un carré parfait si il existe un entier J dont le carré vaut N. (16 en est un, 23 non !) • Algorithme • Algorithme Test-Carré-Parfait • Lexique : • N entier • Réponse booléen • Action : + , * , , = • Auxiliaire : I, J entier • (* voir page suivante *)
Tester si N est un carré parfait Début 1. I←0 Répéter 2. J←I*I 3. I←I+1 4. jusqu’à J N 5a. Si J = N 5b alors Reponse ← Vrai 5c sinon Reponse ← Faux Finsi Fin
Algorithme = Abstraction de séquences de calcul Calcul-Carré-par-Add pour N=0 Calcul-Carré-par-Add pour N=3
Algorithme = Abstraction de séquences de calcul Test du carré parfait (N=7)
Instruction conditionnelle • Si « condition » alors faire liste d'instructions sinon faire liste d'instructions • Exemple : l'instruction 5 de l'algorithme Test-Carré-Parfait est une conditionnelle. • Condition est une expression booléenne • Exemple : Reprenons l'exécution de Test-Carré-Parfait pour N=7. • La première évaluation de la condition J 7 produit la valeur booléenne «faux» donc les instructions 2. et 3. sont exécutées.
Algèbre de Boole • Un ensemble = {0, 1} muni de l'ordre total (0 < 1) et des opérations suivantes : • Addition : x + y = max(x,y) • Multiplication : x.y = min(x,y) • Complémentation : • propriétés • l'addition et la multiplication sont commutatives • 0 est élément neutre de l'addition • 1 est élément neutre de la multiplication • l'addition est distributive sur la multiplication et vice versa. • Propriété des compléments :
Fonctions booléennes – tables de vérité Une fonction booléenne f est une application de 2 dans • cas n=1. • Il existe 4 fonctions booléennes de { 0, 1 } dans { 0, 1 } : • l'identité, la complémentation et ... • cas n=2. • Il existe 24 fonctions booléennes de { 0, 1 }2 dans { 0, 1}
Algèbre de Boole et Logique • Utiliser faux et vrai (ou F et V) à la place de 0 et 1 • Renommer l'addition, la multiplication et la complémentation par ou, et et non respectivement appelée disjonction, conjonction et négation.
Condition et Expression booléenne • Expression booléenne élémentaire par l'exemple • (J < 7) est une expression booléenne élémentaire. • J est de type entier, 7 est un entier et la comparaison < est un opérateur de N x N dans { F, V }. • (Réponse) est une expression booléenne élémentaire. • Réponse est de type booléen. • (Lettre = `a`) est une expression booléenne élémentaire si la variable Lettre est de type caractère. • Remarque • Les mêmes symboles (=, <, etc.) sont utilisés pour la comparaison d'entiers, de caractères, de booléens.
Condition et Expression booléenne • Expression booléenne élémentaire par l'exemple • (J < 7 et J > 4) est une expression booléenne. • C'est la conjonction de deux expressions booléennes élémentaires. • Elle est évaluée à vraie si la valeur de la variable J appartient à ]4,7[. • Considérons les variables cv pour la couleur de ma voiture, mv pour la marque et div pour l'immatriculation (département). • Que signifie l'expression ci-dessous ? • (cv = blanc et mv = peugeot) ou • (cv = gris ou cv = blanc) et div = 75 )
Langage de programmation C #include <stdio.h> //bibliothèque main() { //entête const type nom = valeur ; // bloc déclaration type1 nom1, nom2 ; type2 nom3 ; instruction; ... //bloc d'instructions instruction; }
Syntaxe : symboles, mots, règles • symboles spéciaux • [ ] \{ } . , ; : # =< > - * / ( ) ! • mots réservés • if else int char float double while for switch case, const etc. • règles syntaxiques • point virgule après chaque instruction • accolade ouvrante au début { et fermante } à la fin de chaque fonction (y compris « main »), de chaque bloc d’instructions • La syntaxe d'un programme est définie par une grammaire.
Autres règles • Contraintes imposées par le langage • Toute variable apparaissant dans le bloc d'instructions doit être déclarée. • Contraintes imposées par l'usage • Tout programme doit être commenté ! • Un commentaire est du texte encadré par des symboles de début /* et de fin */ ou une ligne commençant par // • Ignoré lors des traitements du programme /* Tout l’algo repose sur la recherche du plus grand nombre premier après le carré parfait */ int i = 0; // sert d’indice dans la boucle
Bloc déclaration type nom-variable ; • Syntaxe • nom-variable est un identificateur : • les caractères sont les lettres (A..Z,a..z) et les chiffres 0..9 et le soulignement (pas de caractères spéciaux, pas de blancs) mais ne commencent pas par un chiffre • ne commence pas par un chiffre • minuscules et majuscules sont différentes fred≠Fred • longueur maximum = 31 (plus de caractères sont tolérés, mais ils sont ignorés) • Déclarer une variable sert à • désigner un récipient par son nom • spécifier le domaine des valeurs que peut «contenir » cette variable
Types • Généralités • Un type est un nom pour un ensemble de valeurs. Un type est muni d'opérateurs. Donc : • Déclarer une variable sert aussi à connaître les opérateurs applicables à (la valeur de) la variable • Avertissement Les compilateurs C ne peuvent détecter certaines erreurs de typage. • Exemple • un caractère (lettre de l’alphabet, chiffres) sera représenté par un entier de type char (8 bits) : la lettre ‘a’ sera représentée par l’entier 97 ! • Une erreur flagrante de typage ( 4 * ‘a’) ne sera pas détectée !
Les types entiers • Pour manipuler les entiers, C propose 6 types (Table ci-dessous). D’autres existent. • Les opérations sur les entiers sont l’addition +, la soustraction -, la multiplication *, la division / et les comparaisons (=, !=, >; >=, etc.)
Les types réels • Pour manipuler les réels, C propose 2 types (d’autres existent) présentés dans la table ci-dessous • Les opérateurs sur les réels sont l’addition +, la soustraction -, la multiplication *, la division /, les comparaisons (=, !=, >, >=, etc.)
Type booléen • Le type booléen n’existe pas en C. • Le booléen faux est représenté par l’entier 0, et le booléen vrai par tout entier différent de 0. • Les opérations de comparaison produisent 0 quand la condition est fausse et 1 quand la condition est vraie. • Les opérateurs sur les expressions booléennes sont le ET : &&, le OU : || et le NON : !
Type caractère • Le type caractère n’existe pas de manière indépendante en C • Les caractères sont représentés par des « char » correspondant au codage ASCII des caractères alphanumériques (lettres et chiffres), typographiques (ponctuation), etc. • Les caractères sont entrés entre quotes ‘a’, ‘b’, …’0’…’9’, etc.
Déclarations de constantes • const type nom-constante valeur • nom-constante est un identificateur qui sert à nommer une valeur. • Une constante sert souvent à simplifier la lisibilité d'un programme. • Le nom donné à la valeur correspondant à l'utilisation de cette valeur dans un contexte particulier (ici le programme). • Exemples • const float PI = 3.14159; // PI est la valeur 3.14159 • const float euro 6.56; // euro est le réel 6.56 • const int duo = 2; // duo est synonyme de 2 • Avertissement • Il est impossible de changer la valeur 2 : • De la même manière il est impossible de toucher à la constante duo dans le programme !
Affectation nom-variable = expression ; • sémantique • seule la notation change par rapport au langage algorithmique i←i+1 le type de l'expression à droite de = doit être identique au type de la variable à gauche • Exemples I = 0 ; I = I + 1 ; res = (J = =I*I) ; // res = 1 ou res = 0 • Attention : le compilateur C fait des conversions pour que la valeur affectée corresponde au type de la variable à gauche. • Exemple : • int n; float x=15.4; • n=x; // Les deux types sont différents • printf("n=%d :\n", n); // résultat affiché : n=15
Instructions d’entrée-sortie scanf("FORMAT", &nom-variable); • Permet de saisir (lire) des données tapées au clavier • FORMAT permet de spécifier le type de la variable lue. Par exemple, "%d" pour un entier, "%f" pour un réel… ( d = décimal, f = floating point ) L'exécution de l'instruction ci-dessus • Attend que l'utilisateur tape une valeur au clavier • Cette valeur est affectée à la variable (idem au pluriel) • La variable doit avoir été declarée (avec le bon type) (const) Exemple int I= 234 ; scanf ("%d",&I) ; • Si l'utilisateur tape 33, la valeur de la variable I est 33 après exécution des deux instructions.
Instructions d’entrée-sortie scanf ("FORMATS", liste de variables); Exemple scanf ("%d %d %d", &I, &J, &N) si l'utilisateur tape 33 44 22, la valeur de la variable I est 33, celle de J est 44 et celle de N est 22 après exécution. Avertissement Si la valeur saisie n'est pas du type de la variable alors une erreur d'exécution se produit. Si la valeur n'est pas saisie, alors l'exécution du programme attend !
Instructions d’entrée-sortie printf ("FORMAT", expression) printf ("FORMATS", liste d'expressions) • permet d'afficher des valeurs (résultats de calcul)à l'écran. Exemple I =1 ; //la valeur de I est 1 printf("%d", I) ; //affichage de 1 à l'écran printf("%d", 5+7) ; //affichage de 12 à l'écran printf("valeur de I= %d", I) ; //affichage de valeur de I= 1 printf ("FORMAT \n", expression) affiche le résultat de l'évaluation de l'expression puis effectue un retour à la ligne (voir console)
Programmation en C du Test-Carré-Parfait main() { ... printf ("Donnez l'entier a tester : \n"); scanf("%d", &N); // saisie de la valeur de N au clavier I = 1; // initialisation de I ... printf( "Oui la valeur que vous avez entré…"); } • Avertissement • Toute instruction est suivie d’un point virgule ;
Conditionnelle if (condition) instruction1 ; Erreur a eviter : if (condition); instruction1 ; condition est une expression booléenne L'exécution de l'instruction globale • évalue la condition • si la condition est vraie, exécute l'instruction 1. Attention : si la condition est fausse, il ne se passe rien dans ce cas. • Exemple N = 4 ; I=2; if (N==I*I) printf ("L'entier %d est un carré parfait", N); Affichage à l'écran de :L'entier 4 est un carré parfait
Conditionnelle if (condition) instruction1; if (condition) instruction1; else instruction2; if (…); instruction1; EST TOUJOURS EXECUTE A CAUSE DU ; • Permet d'introduire des branchements d'instructions. • L'exécution de l'instruction globale • évalue la condition • si la condition est vraie, exécute l'instruction 1 • sinon exécute l'instruction 2. • Exemple N = 5; I=2; if (N==I*I) printf ("L'entier %d est un carre parfait", N); elseprintf("L'entier %d n'est pas un carre parfait", N); Affichage à l'écran de L'entier 5 n'est pas un carre parfait
Conditionnelle if (condition) bloc-instruction1 else bloc-instruction2 Un bloc d'instructions est une liste d'instructions encadrée par les mots clé { et } • Exemple N = 5 ; if (N % 2 = =0) printf("%d est pair", N); else { N = N-1 ; printf ("%d est pair", N); } Affichage à l'écran : 4 est pair % est le reste de la division entière
Conditionnelle switch (expression) { case expression-constante : bloc-instruction 1; break; case expression-constante : bloc-instruction 2; break; ... case expression-constante : bloc-instruction n; break; default : bloc-instruction; break; } • le cas default est facultatif. • Pas de break signifie que les 2 cas sont traités ensemble • L'instruction break provoque une sortie immédiate du switch
Conditionnelle • Exemple N=5 switch (N%2==0) { case 1 : printf ("%d est impair", N) ; break; case 0 : printf ("%d est pair", N) ; break; } • Exemple switch (C) { case ‘0’ : case ‘2’ : case ‘4’ : case ‘6’ : case ‘8’ : printf("%d est un chiffre pair" , C); break; case ‘1’ : case ‘3’ : case ‘5’ : case ‘7’ : case ‘9’ : printf("%d est un chiffre impair", C); break; default : printf ("%d n’est pas un chiffre", C); }
Itération • Une itération correspond à la répétition d'une séquence de calcul. • Exemple : l'instruction 3. est itérée N fois dans l'algorithme du Calcul-Carré-par-Add • Le nombre d'exécutions répétées de l'instruction 3 ne dépend pas des calculs effectués par l'instruction 3. • Exemple : la séquence d'instructions [ 2. 3. 4.] est itérée dans l'algorithme Test-Carré-Parfait}. • Le nombre d'exécutions répétées de [ 2. 3. 4.] dépend des calculs effectués par la séquence elle-même.
Itération : tant que Tant que (expression) Instructions fin tant que • Attention • Initialiser les variables testées dans l’expression • Modifier les variables dans la boucle pour qu’elle s’arrête. • Exemple : calcul de factorielle entree : N entier ; sortie : Res entier ; ecrire (entrez N) ; lire (N); Res=1; Tant que (N>0) Res=Res*N; N=N-1; Fin tant que • Exécution pour N=3, N=0.