Université de Provence Licence Math-Info Première Année V. Phan Luong Algorithmique et Programmation en Python Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application 1 Ordinateur Un ordinateur a des composants principaux suivants : – Mémoire centrale pour mémoriser les programmes et les données. – Unité de calculs arithmétiques et logiques (Processeur). – Unité de gestion des périphériques : Pour communiquer avec l’extérieur (utilisateurs, d’autres ordinateurs, senseurs, etc), l’ordinteur doit gérer les périphériques comme le clavier, l’écran, le souris, les disques (mémoires secodaires), les cartes réseaux, etc. La mémoire centrale est organisée en mots (octets, bytes). Un octet est l’unité de base de pour les mémoires des ordinateurs. Un octet est composé de huit bits. Un bit est un circuit électronique pour représenter une valeur binaire : 0 ou 1. Le Processeur peut exécuter directement les opérations arithmétiques et logiques sur les nombres binaires (codés sur 0/1) : les opérations ainsi que leurs opérands sont codés en nombre binaire. Ces opérations constituent ce que l’on appelle le langage machine. Ainsi, un programme exécutable directement par ordinateurs est une suite de 0 et 1. Un tel programme est difficile à écrire et à comprendre. 2 Langages de programmation Pour rendre ordinateur facilement accessible et compréhensible plusieurs langages de programmation sont progressivement inventés : de plus simple à plus sophistiqués. Le principe est le suivant : Chaque langage est inventé avec son compilateur (ou son interpréteur). Le langage et son compilateur font l’interfaçage entre ordinateurs et humains : humains s’expriment ce qu’ils veulent faire dans un langage de programmation 1 et le compilateur du langage traduit ce qu’ils s’expriment en programme exécutable directement sur l’ordinateur. Le compilateur est bien sûr un programme en langage machine de l’ordinateur. Un langage de haut niveau permet généralement une abstraction de l’organisation physique de l’ordinateur : les espaces de mémoire peuvent être structurées et référées par noms, les opérations arithmétiques peuvent être exprimées de manière plus proche aux expressions usuelles, ainsi que les contrôles logiques de données. C’est-à-dire, en écrivant un programme dans un langage de haut niveau, le programmeur peut oublier la machine physique et à cette place il condidère une machine virtuelle dont l’organisation générale est : – La mémoire centrale peut être organisée en données structurées (caractères, chaines de caractères, nombres entiers, réels, tableaux, enregistrements de différents champs, etc). – A la place du processeur et ses opérations de base codées en binaire, il peut ne penser qu’avec les opérateurs usuels comme addition, soustraction, multiplication, racine carré, logarithme etc, et les contrôles de calculs comme “si une condition est satisfaite alors faire une suite d’opérations, sinon faire autres choses” ou “tant qu’une condition est satisfaite répéter une suite d’opérations”. – A la place des unités de gestion de périphériques, il peut ne penser qu’avec les opérations offertes par le langage, comme la connexion, l’ecriture et lecture sur les périphériques. Ainsi, pour programmer une application dans un langage informatique de haut niveau, on doit connaı̂tre : 1. Les structures de données (types de données) que le langage permet d’utiliser et de définir. 2. Les opérations connues dans le langage ainsi que les moyens qui permettent de définir de nouvelles opérations. 3. Les structures de contrôles permise dans le langage pour contrôler les calculs. 4. Les moyens pour communiquer avec l’ordinateur : les fonctions pour entrer les données, appercevoir les résultats des calculs (clavier, souris, console de jeux, écran, 2 imprimante). De manière intuitive, pour résoudre un problème en utilisant un langage informatique (une machine virtuelle) on peut imaginer que – La mémoire centrale est comme une feuille de papier dans laquelle on se limite à dessiner les cadres pour les données dans les types prévus ou permis dans le langages. – On peut dessiner autant de cadres que l’on veut (en regardant à l’espace de mémoire physique de l’ordinateur). Chaque cadre dessiné correspond à ce qu’on appelle une variable. La notion de variable dans ce context correspond à une zone de mémoire dans laquelle on peut mettre une valeur, puis lire la valeur mise dedans. – Toute variable est nommée. L’affectation une valeur à une variable correspond au fait de mettre la valeur dans l’espace de mémoire référencée par la variable. Soient X1, X2, ..., Xk les noms de k variables, alors X1, X2, ..., Xk référencent respectivement k espaces de mémoire. L’affectation d’une valeur Vi à Xi (notée Xi = Vi ou Xi := Vi ou Xi <- Vi, dépendant de langages) correspond au fait de mettre la valeur Vi dans l’espace de mémoire référencée par Xi. Dans les notations Xi = Vi (ou Xi := Vi ou Xi <- Vi), l’expression à gauche du symbole = (ou := ou <-) appelée G-valeur (L-value), représente une espace de mémoire où l’on peut mettre à tout moment une nouvelle valeur en écrasant sa valeur courante. L’expression à droite, appelée D-valeur (R-value) représente une valeur qui doit être mis dans l’espace de mémoire représentée par la G-valeur. Considérer un exemple : X1 = X1 + X2 + 5 On lit l’expression comme suit : “X1 reçoit la somme de sa valeur courante et la valeur courante de X2, plus 5”. Cette l’affectation nécessite la lecture des valeurs courantes de X1 et X2, l’addition de ces valeurs avec 5, et la remise du résultat dans l’espace de référencée par X1 ; la valeur courante de X1 est ecrasée. Un nom ne peut être à gauche d’une affectation seulement si ce nom définit une espace de mémoire et que le contenu de cette espace peut être modifié. – La communication entre humain et ordinateur peut se fait via le clavier (entrée standard) et l’écran (sortie standard) de l’ordinateur. D’autres entrées sorties sont les fichiers ou les ports de communication de l’ordinateur (com1, com2, lpt, etc). Un lan- 3 gage de programmation fournit les fonctions pour saisir les données via le clavier et afficher les données sur l’écran. Il fournit aussi les fonctions pour écrire ou lire les données dans les fichiers. 3 Une petite illustration Problème : Etant données les valeurs des paramètres a et b, chercher la valeur de x qui satisfait l’équation a*x + b = 0. 3.1 Problème mathématique Un élève de la classe 5ième sait comment résoudre cette équation. il sait qu’il faut procéder les étapes suivantes. a*x = -b si a est différente de 0 alors x = -b / a sinon, si b = 0 alors l’équation a l’infini de solutions, sinon, pas de solution. 3.2 Problème de programmation Ecrire un programme dans un langage de programmation (une machine virtuelle) pour résoudre l’équation. Ce que la machine virtuelle (python) sait faire : l’affectation, les opérations arithmétiques et logiques, les contrôles d’exécution, la saisie de données des périphériques (clavier, disques, ...), écrire les donnéés sur l’écran, les disques (communication entre la mémoire centrale et les périphériques). Bien qu’elle sache faire chaque opération des étapes écrites précédemment, la machine virtuelle ne sait pas l’invention du procédé ci-dessus, c’est-à-dire, comment inventer le déroulement des opérations sous les contrôles de données : Ce qu’il ne sait pas est l’algorithme pour résoudre le problème. 4 Pour écrire le programme il faut d’abord savoir comment résoudre le problème (algorithme). Ensuite, en utilisant un langage de programmation (une machine virtuelle), on dite à la machine ce qu’elle doit faire pour nous rendre la solution. Pour programmer on peut se poser les questions suivantes. Comment saisir la valeur de a et de b et les garder en mémoire. Question de l’espace de mémoire et de types de données (entiers, réelles ?), Problème de calculs : Quelles sont les opérations connues (division entière, division réelle) dans le langage et les contrôles que le langage sait faire (quand est ce qu’on peut appliqiuer la division ?). Problème de communication homme/machine : problème de présentation afin qu’un utilisateur peut utiliser facilement ce programme. Une solution : 1) Fixer le type de données de a et b, et réserver les zones de mémoires correspondant. 2) Saisir les valeurs de a et de b via le clavier et les mettre dans la zone de mémoire réservées. – Afficher un message pour inciter la saisie la valeur de a. – Appeller une fonction pour accepter la donnée saisie et la mettre dans la zone réservée à a ; – Les mêmes actions pour b. 3) Contrôler les calculs : Si a est différente de 0 alors calculer la division -b / a et affecter le résultat dans la zone réservée à x ; présenter (afficher) la valeur de x comme solution unique de l’équation. Sinon (a = 0), Contrôler la valeur de b : Si b = 0, afficher un message indiquant qu’il y a un nombre infini de solutions. Sinon, afficher un message indiquant qu’il n’y a pas de solution. 3.3 Particularités de Python En Python, la déclaration d’une variable se fait par la première affection de valeur. Le type de données de la variable est déduite à partir de la valeur affectée. On ne doit pas explicitement déclarer de variables. Les affectations suivantes à la même variable 5 mettent à jour la valeur et le type de la variable. Donc, faire attention à la cohérence de type de données pendant l’utilisation d’une variable. Attentions : D’autres langages de programmation peuvent exiger la déclaration explicite de type de variables avant de les utiliser. En Python, l’indentation du text d’un programme est très importante. Les instructions qui sont décalées avec le même nombre de colonnes (compter à partir de la marge gauche de la page d’édition) se constituent un bloc. Ainsi, les instructions à être exécutées ensemble (en bloc) sous une condition de contrôle doivent être indentées de même niveau (décaler avec le même nombre de colonnes). Les premiers éléments de Python Entrée/Sortie : Pour saisir au clavier une valeur sans aucun message incitation : x = input() # déconseillé (le symbole # débute un commentaire dans un programme Python) Pour saisir au clavier une valeur avec un message incitation : x = input(“Entrer un entier : ”) # conseillé type(x) # afficher le type de la valeur courante de la variable x. Pour afficher un message : print “message à afficher sur l’écran” print “Valeur de x est “, x, “ et valeur de y est “, y, Le Programme Python de la résolution de l’équation a * x + b = 0 a = input(‘‘Entrer une valeur pour a : ‘‘) b = input(‘‘Entrer une valeur pour b : ‘‘) if a != 0 : x = -b / a print ‘‘L’equation a l’unique solution x = ‘‘, x elif b != 0 : else: print ‘‘L’equation n’a pas de solution.‘‘ print ‘‘L’équation a un nombre infini de solutions‘‘ 6