Algorithmique et langage Pascal
Transcription
Algorithmique et langage Pascal
COURS Lycée Dominique Villars ECE 1 ALGORITHMIQUE et LANGAGE PASCAL 1 Notion d’algorthme Certains voient à tort, dans l’ordinateur une machine ”pensante”, capable de résoudre bien des problèmes. En réalité, celui-ci ne serait capable de rien si quelqu’un (le programmeur) ne lui avait fourni la liste des actions à exécuter. Cette desciption doit être faite de manière non ambigüe et dans un ordre bien choisi. Il ne faut s’attendre à aucune interprétation des ordres fournis. L’ordinateur exécutera ces actions de manière purement mécanique. Le problème principal du programmeur est donc de décrire la suite des actions élémentaires permettant d’obtenir à partir des données fournies, les résultats escomptés. Cette description doit à la fois la plus simple (niveau de complexité d’un programme) et précise possible. Cette marche à suivre porte le nom d’algorithme. Cette notion est totalement indépendante de l’informatique. En effet, une recette de cuisine est un algorithme, tout comme une notice de montage de meubles suédois. . . Dans le contexte informatique, un algorithme doit être traduit dans un langage qui permettra à l’ordinateur de comprendre chacune des instructions élémentaires. Cette année nous traduirons chacun des algorithmes étudiés dans le langage Turbo-Pascal. Exemple principal : Calcul d’une puissance : (1, 7)64 La valeur (1, 7)64 peut être obtenue par la mise en oeuvre d’un algorithme 1 dont on peut proposer la description suivante : ① Calcul du produit 1, 7 × 1, 7 dont la valeur est stocké comme résultat intermédiaire, noté A1 . ② Calcul de 1, 7 × A1 dont la valeur est stocké comme résultat intermédiaire, noté A2 . ③ Répéter 61 fois cette dernière opération ; ④ La valeur cherchée est le dernier résultat intermédiaire. Pour un même ”travail”, il est possible de faire appel à d’autres algorithmes. Par exemple, on peut décrire l’algorithme 2 par : ① Calculer le produit 1, 7 × 1, 7 dont la valeur est stocké comme résultat intermédiaire,B1 . ② Calculer le produit B1 × B1 dont la valeur est un nouveau résultat intermédiaire B2 . (B2 = (1, 7)4 ) ③ Répéter 4 fois cette opération. ④ La valeur cherchée est B6 dernier résultat intermédiaire calculé. Structure générale d’un algorithme : A l’image d’une recette de cuisine, l’algorithme de décompose en trois parties : 1. On énumère tous les ingrédients =⇒ on liste toutes les donnés nécessaires, les entrées . 2. On décrit les étapes successives =⇒ on énumère les instructions que l’ordinateur doit exécuter. 3. Si les étapes 1 et 2. sont cohérentes, le résultat de l’algorithme est la sortie (oh le beau gâteau!!) 2 2.1 Bases du language de programmation pascal Objets de bases Un programme Turbo Pascal décrit un enchainement d’instruction portant sur des objets. Ces objets sont des données constantes ou des variables : ① CONSTANTE = une donnée constante est une donnée dont la valeur est fixée par le programmeur et qui reste inchangée au cours de l’exécution du programme. Un exemple important est la constante ”chaı̂ne de caractères” (ou string) : ’bonjour’ ou ’rerevgeetr’ . . . Pour définir une chaı̂ne de caractères, il suffit de mettre une suite de caractères à l’intérieur de ’ ’. ② VARIABLE = une donnée variable est une donnée dont la valeur est initialisée par le programmeur ; cette valeur peut être modifiée au cours de l’exécution du programme. Exemple : Dans la première algorithme de calcul de (1, 7)64 , les objets sont : 1, 7 (constante), 64 (constante) ainsi que ”le résultat intermédiaire” (variable). Tous ces objets vont avoir des noms définis par le programmeur : ces noms s’appellent des identificateurs. Ces identificateurs ne peuvent pas être des mots réservés c.a.d. des mots dont la signification est prédéfinie par le logiciel, tels que ’REAL’ ; ’BEGIN etc . . . . De plus il ne peut y avoir ni espace ni lettres accentuées dans un identificateur, et le premier caractère ne doit pas être un chiffre. 2.2 Structure d’un programme en language Turbo Pascal Structure d’un programme Turbo Pascal. • L’en-tête du programme : • • • • PROGRAM nom du progamme ; Les déclarations (variables, constantes, types des variables, procedures, fonctions..) begin le programme end. 2.3 Types des variables Les variables correspondent à divers type, correspondant à la nature des valeurs qui peuvent leur être affectées. En effet, déclarer un type pour une variable permet de réserver une case mémoire adaptée aux valeurs que va prendre cette variable tout au long de l’éxecution de programme. Les principaux types d’objet sont : ⋆ type entier : integer =⇒ Ils doivent être compris entre -32768 et +32767. ⋆ type réel : real ⇐⇒ Ils doivent être compris entre 2, 910−39 et 1, 71038 avec 11 décimales ⋆ type booléen : boolean =⇒ Il définit deux valeurs logiques : TRUE (vrai) ou FALSE (faux). Par exemple, si x est connu la variable (x > 0) est de type booléen. ⋆ type charactère ; char =⇒ Ces variables contiennent un caractère. ⋆ type chaı̂ne de charactère ; string =⇒ Ces variables contiennent une chaı̂ne de caractères. =⇒ Il faut alors préciser le type des éléments du tableau qu’il doit prendre en ⋆ type tableau : array compte. On verra ce type plus en détail dans une prochaine partie. ☞ Nous allons voir par la suite qu’il est possible de définir des types de variables à l’aide de l’instruction TYPE. 2.4 Déclaration des types(variables)/valeurs(constantes) des objets Il faut déclarer le type des variables ainsi que les valeurs des constantes dans la première partie du programme. ❶ Les valeurs des différentes constantes sont déclarées à l’aide de l’instruction CONST de la manière suivante : Exemple 1 : CONST tauxtva = 17; Exemple 2 : CONST message = ’Salut ca va?’; ❷ Les types des variables sont déclarées à l’aide de l’instruction VAR de la manière suivante : Exemple 1 : VAR variable1, variable2, ..., variableN : REAL; Exemple 2 : VAR i,k,n : INTEGER ; ☛ Lors de la phase de déclaration, regrouper les variables ayant même type. 2.5 Variables En informatique, une variable est une ”case” mémoire, réservée pour stocker la future valer de cette variable (valeur pouvant être modifiée au cours de l’exécution du programme). Pour être utilisée une variable doit être : • déclarée : une variable doit avoir un nom (identificateur) ainsi qu’un type (entier, réel, etc. . . ) qui va définir la taille de la case mémoire à réserver. VAR x,a,b : REAL; • initialisée : on doit donner une valeur initiale à la variable. Deux moyens sont possibles : a) par affectation directe : on attribue une valeur à la variable x préalablement déclarée par l’instruction x : = 1 b) affectation intéractive par écriture/lecture : i/ on demande à l’utilisateur du programme de rentrer à l’écran les valeurs initiales pour une ou plusieurs variables writeln (’écrire les valeurs de a et b’); ii/ la ou les valeurs écrites par l’utilisateur sont affectées aux variables en questions. readln (a,b); Remarque : Supposons avoir déjà initialisé la variable a. Si l’on a veut affecté à la variable b, la même valeur qu’à a il est possible d’utiliser l’instruction b : = a ; à condition que ces deux variables soient déclarées de même type!!! ATTENTION : Ne pas confondre l’instruction d’affectation directe ”:=” avec le ”=” réservé aux données constantes et au symbole de comparaison!!! 2.6 Opérateurs élémentaires Ces opérations dépendent du type des objets (variables ou constantes). Attention, les opérations doivent être effectuées entre objets de même type. ❶ Opérations arithmétiques opérateurs entrées sortie + ; - ; * ; / réel ou entier réel ou entier div ; mod entier entier quotient ou reste de la division euclidienne exp ; ln ; sqrt réel réel sqrt est la racine carrée sqr réel/entier réel/entier carré trunc réel entier partie entière abs réel/entier réel/entier valeur absolue ❷ Opérateurs relationnels = ; <> pour traduire 6= ; < ; < ; <= pour 6 et >= pour >. ❸ Opérateurs logiques Ils sont au nombre de quatre : not ; or ; and ; xor (OU exclusif). Ces opérateurs servent généralement à définir des variables booléennes c’est à dire des propositions mathématiques prennant les valeurs V RAIE ou F AU SSE selon si celles-ci sont vérifiées ou pas. On verra que ces variables de type booléen et donc les opérateurs ci-dessous, sont souvent utilisé dans les instructions conditionnelles selon les modèles : if variable booléenne then instructions 1 else instructions 2 while variable booléenne do instructions repeat instructions until variable booléenne Exemples : if while 2.7 x>2 then (x<-1) and a:=-3 (x>1) do Les variables de type tableau Les tableaux peuvent être à une ou plusieurs dimensions. Ils se prêtent principalement : i) à la représentations de n-uplets ou de matrices. ii) au stockage des données (on verra qu’il est possible de générer des expériences aléatoires et d’en stocker les différents résultats). 2.7.1 Déclarer une variabe de type ”tableau” VAR M : ARRAY[ taille ] OF type des nombres du tableau Exemples : 1) tableau à une entrée (un vecteur) VAR M : ARRAY[1..4] OF REAL Cette ligne, déclare la variable M comme un élément de R4 . 2) tableau à double entrées (une matrice) VAR M : ARRAY[1..4,1..3] OF REAL Cette ligne, déclare la variable M comme un élément de M4,3 (R) (4 lignes et 3 colonnes). 2.7.2 Accéder aux éléments du tableau Chacune des cases du tableau ainsi déclaré est un variable du type ”type des nombres du tableau” et identifiée par : M[i] (le ’[i]’ représente le numéro de la case dans le tableau à une entrée) M[i,j] ( le couple ’[i,j]’ représente le numéro de la ligne et de la colonne de l’emplacement de la variable) ATTENTION : Au départ, le tableau est vide !! Il faut penser à l’initialiser toutes les cases du tableau avant de l’utiliser!! 2.7.3 Créer un type ”tableaux” Pour pouvoir appliquer des fonctions ou des procédures (voir plus loin) à un tableau, il faut donc déclarer le type de ce tableau en amont. De même, par commodité, si l’on souhaite travailler avec plusieurs matrice de M3 (R) il est préférable de créer un type ”matrice de taille 3×3”... ☛ La déclaration d’un nouveau type se fait juste avant la déclaration des variables!! TYPE matrice = ARRAY[1..3,1..3] OF REAL ; Ainsi dans la suite du programme, il est possible de déclarer (par exemple) 4 variables A, B, C et D en tant que matrice de taille 3 × 3 par : VAR A, B, C, D : matrice ; 2.7.4 Opérations sur les tableaux La seule opération globale que Turbo-Pascal sait réaliser sur les tableaux est l’affectation en bloc des valeurs d’un tableau dans un tableau identique (même dimensions et même type de contenu) Ainsi si R et A sont des tableaux identiques alors R:= A remplace le contenu du tableau R par celui du tableau A. 2.7.5 Initialiser un tableau Plusieurs possibilités pour initialiser efficacement le contenu d’un tableau : i) utiliser une boucle itérative FOR pour initaliser tout les éléments du tableau à 0. VAR k : VAR M : ARRAY[1..12] FOR k:=1 INTEGER ; TO 12 OF REAL ; DO M[k]:=0 ; ii) utiliser une boucle FOR pour initaliser les éléments du tableau à des valeurs entrées par l’utilisateur. Exemple 1 : initialiser un tableau à une entrée par saisie de l’utilisateur. VAR k : VAR M : ARRAY[1..12] FOR k:=1 INTEGER ; TO 12 OF REAL ; DO BEGIN WRITELN (’Entrer la valeur de la case’,k) ; READLN (M[k]) ; END ; Exemple 2 : initialiser un tableau double entrées par saisie de l’utilisateur. VAR i, j : VAR M : ARRAY[1..4,1..5] FOR i:=1 FOR TO j:=1 INTEGER ; 4 TO OF REAL ; DO 5 DO BEGIN WRITELN (’Entrer la valeur de la ligne’,i,’colonne’,j) ; READLN (M[i,j]) ; END ; 3 Instructions conditionnelles Une instruction conditionnelle est une instruction dont l’action dépend de la valeur d’une proposition : • si la condition est vraie alors on effectue une instruction 1 • sinon on effectue une instruction 2. instruction A IF condition THEN BEGIN instructions 1 ; END ELSE BEGIN instructions 2 ; END ; instruction C Définition - Instructions simples/composées Une instruction est dite simple si elle se réduit à une seule commande : writeln(’bonjour’) ou s:= 0. Sinon l’instruction est dite composée. Une instruction composée est donc une suite d’instructions terminées par un ”; ” : l’ensemble de ces instructions doit alors commencer par un BEGIN et finir par un END ; . Pour des raisons de lisibilité, on utilise très souvent une présentation décalée : BEGIN instruction 1 ; instruction 2 ; instruction 3 END ; où instruction1, instruction2, et instruction3 peuvent être des instructions simples ou composées. Le point virgule ”; ” est en fait un séparateur d’instructions : c’est pourquoi il n’est pas nécessaire d’en insérer un à la fin de l’ instruction3. Remarques : ① Si les instructions 1 ou 2 sont simples le BEGIN ...END n’est pas utile!! ② Le ELSE est facultatif, mais ne doit pas être précédé immédiatement d’un ”;”. 4 Boucles itératives 4.1 Boucle FOR L’idée de la boucle FOR : on répète une suite d’instructions un certain nombre de fois. L’utilisation d’une telle boucle nécéssite la déclaration du variable (indice de décompte). La syntaxe est la suivante : VAR i : INTEGER ; ... instruction A FOR i:= n1 TO n2 DO BEGIN instructions B ; END ; instruction C ATTENTION : Le groupe d’instructions B est effectué une première fois avec i = n1 , la deuxième fois avec i = n1 + 1,. . . , la dernière fois avec i = n2 . 4.2 4.2.1 Boucles conditionnelles Boucles WHILE L’idée de la boucle WHILE : on répète une suite d’instructions tant qu’une certaine condition reste vraie. La syntaxe est la suivante : instruction A WHILE condition DO BEGIN instruction B ; END ; instruction C ATTENTION : Ce type de boucle peut ne jamais s’achever si la condition reste toujours vraie. Assurez vous bien que celle-ci devient donc fausse au bout d’un certain temps!!! 4.2.2 Boucles REPEAT L’idée de la boucle REPEAT : on répète une suite d’instructions jusqu’à ce qu’une certaine condition soit vraie. La syntaxe est la suivante : instruction A REPEAT instruction B ; UNTIL condition; instruction C ATTENTION : Le REPEAT ...UNTIL permet de délimiter l’instruction B! Nul besoin donc de BEGIN ...END! Attention également de bien vous assurer que la condition devient vraie au bout d’un certain temps : sinon le programme ne s’arrete jamais. 5 Fonctions et procédures La notion de sous-programme représente toute la puissance du langage Turbo Pascal. En fait c’est la possibilité de structurer encore davantage le programme en créant de nouveaux ordres utilisables dans le corps du programme mais non définis dans celui-ci. Celà permet d’avoir un programme beaucoup plus lisible puisque l’on décompose ainsi le programme en actions simples ou blocs d’instructions. 5.1 Fonctions Définition - Fonction sous TPascal Une fonction est un sous-programme qui fournit un résultat à partir des données qu’on lui apporte : la notion de fonction en Turbo-Pascal est assez proche de la notion de fonction en mathématiques. Une fonction se déclare comme suit : FUNCTION Nom de la fonction ( Nom du paramètre : Type du paramètre ) : Type de sortie VAR déclaration des éventuelles variables ou constantes (utile à la fonction) BEGIN Corps de la fonction (listes des instructions séparées par des ”; ”) Nom de la fonction := Valeur de sortie ; END ; Remarques : ① Une fonction ne peut avoir en sortie qu’un réel ou un entier!! ② Il peut y avoir plusieurs paramètre d’entrées dans une fonction. Ils seront alors séparés par un ”; ” dans la déclaration mais lors de l’appel de la fonction dans le corps du programme, ils seront séparés par une ”, ” . √ Exemple 1 : Fonction donnant l’image d’un nombre √ par la fonction mathématiques x → 3 x + 2 Après voir définit la fonction, l’utiliser afin de calculer 3 3 + 2. PROGRAM Exemple1 ; FUNCTION f (x : REAL ) : REAL BEGIN f := 3*sqrt(x)+2 END ; BEGIN WRITE(f(3)) END . Exemple 2 : Fonction associant à un entier positif n sa factorielle n!. PROGRAM Exemple2 ; FUNCTION factorielle VAR i , F : (N : INTEGER ) : INTEGER ; INTEGER ; BEGIN F:=1 ; FOR i:=1 TO N DO F:=F*i ; factorielle:=F ; END . Compléter le programme ci-dessus de l’exemple 2 afin d’utiliser la fonction factorielle dans le calcul de du coefficient binomial (nk ). On demandera à l’utilisateur d’entrer les valeurs de n et k. 5.2 Procédures Définition - Procédures sous TPascal CONTRAIREMENT aux fonctions, la procédure ne fournit pas un résultat mais crée une action ou une suite d’actions (instructions) : on utilisera les procédures principalement lorsqu’on manipulera des tableaux (matrices ou autres). En effet, une fonction ne permet pas de modifier un tableau puisque en sortie elle renvoie un réel. La syntaxe d’une procédure est double : SYNTAXE 1 PROCEDURE Nom de la fonction ( Nom du paramètre : Type du paramètre ) ; VAR déclaration des éventuelles variables ou constantes (via CONST) BEGIN Corps de la fonction (listes des instructions séparées par des ”; ”) END ; SYNTAXE 2 PROCEDURE Nom de la fonction ( VAR Nom du paramètre : Type du paramètre ) ; VAR déclaration des éventuelles variables ou constantes (via CONST) BEGIN Corps de la fonction (listes des instructions séparées par des ”; ”) END ; Essayons de comprendre la différence entre ces deux syntaxes sur l’exemple suivant. Exemple PROGRAM VAR PROGRAM proc ; VAR A : REAL ; PROCEDURE P (x : REAL ) ; proc ; A : REAL ; PROCEDURE P1 (VAR x : BEGIN BEGIN write(x) ; write(x) ; x:=x+1 x:=x+1 writeln(x) ; writeln(x) ; END ; END ; BEGIN BEGIN A;=5 ; A;=5 ; P(A) ; P1(A) ; write(A) ; write(A) ; END . L’affichage de la syntaxe 1 est : 56 5 END . L’affichage de la syntaxe 2 est : 56 6 REAL ) ;