Introduction à l`algorithmique Application au langage Pascal
Transcription
Introduction à l`algorithmique Application au langage Pascal
Introduction à l'algorithmique ... ... Application au langage Pascal (c) F. Bonnardot, Février 2005 Qu'est ce qu'un algorithme ? Définition : Ensemble d'instructions qui permettent à une personne ou à une machine d'obtenir à partir de données la solution d'un problème en un nombre fini d'étapes. Exemple : Calcul des racines x1 et x2 d'un polynôme du second ordre : ax2+bx+c dans R. Algorithme : Racines Coefficients Calcul des racines d'un x et x a, b et c 1 2 polynôme du 2nd ordre Comment obtenir les données ? Indiquer les résultats ? Algorithme : Racines Coefficients Calcul des racines d'un x et x a, b et c 1 2 polynôme du 2nd ordre Entrées : Clavier, Micro, Scanner, Webcam, Fichier sur disque, Variable en mémoire, ... Ecran, clavier, souris Unités de stockage Scanner Unité centrale Imprimante Sorties : Écran, Haut-parleur, Fichier sur disque, Imprimante, Variable en mémoire, ... Comment décrire l'algorithme ? (1/2) Langage machine : Suite de nombres directement compréhensibles par l'ordinateur. Assembleur : Suite de commandes qui seront directement traduites en langage machine. program_init: pushl %ebp movl %esp,%ebp subl $4,%esp movb $1,U_SYSWIN32_ISCONSOLE call FPC_INITIALIZEUNITS .L4: leal U_SYSWIN32_OUTPUT,%edi movl %edi,-4(%ebp) pushl .L9 pushl -4(%ebp) pushl $0 call FPC_WRITE_TEXT_ANSISTR pushl -4(%ebp) call FPC_WRITE_END pushl $.L4 call FPC_IOCHECK Problèmes : Jeu d'instruction de l'ordinateur limité (beaucoup de texte à écrire) Instructions différentes d'un µP à l'autre (re-écrire pour chaque µP) Code difficile à lire Avantage : rapidité, ... Comment décrire l'algorithme ? (2/2) Langages de haut niveau : Langage proche du langage parlé (par les anglophones). Program Chiffre; { Demande de saisir un chiffre et recopie ce chiffre } Var Avantages : Indépendant de l'ordinateur (+ ou -) (fonctionne sur PC, Mac, Unix, ...) a : integer; { Chiffre lu } Begin { Demande du chiffre } write ('Entrez un chiffre : '); readln (a); { Recopie le chiffre } writeln ('Vous avez tapé ',a); End. Lisibilité accrue Instructions « assez performantes » écriture sur l'écran, lecture de texte, ... On utilise un compilateur pour traduire le programme en langage machine. Langage de haut niveau Compilateur Langage machine Exécutable Quel langage ? Beaucoup de langages de programmation (Grafcet, Calculatrice, C++, ...) On étudiera ici le Pascal N.B. : Delphi permet de programmer windows en Pascal Méthode : 1°) On écrit d'abord l'algorithme en Français (pseudo-langage) => On réfléchit (étape d'analyse) 2°) On le traduit ensuite en Pascal => On adapte pour un ordinateur et un langage L'étape 1 est la plus difficile... => livres d'algorithmie L'étape 2 est la plus facile => Livres d'apprentissage de Pascal, C++, ... Exemple : Racines d'un polynôme du second ordre dans R (1/4) Algorithme : Racines Coefficients Calcul des racines d'un x et x a, b et c 1 2 polynôme du 2nd ordre Analyse : D'après le cours de maths de 1ère On calcule ∆=b²-4ac Si ∆<0 alors pas de racine dans R Si ∆=0 alors racine double x=-b/(2a) Si ∆>0 alors deux racines : x1=-[b-sqrt(delta)]/(2a) x2=-[b+sqrt(delta)]/(2a) Étape 1 : Demander à l'utilisateur de saisir a, b et c Étape 2 : Calcul de ∆ Étape 3 : Selon ∆ calcul et affichage des racines Forme simplifiée d'un programme Remplacer les < > Programme <nom du programme> Variables utilisées : <nom de la variable 1> : <type>; <nom de la variable 2>,<nom de la variable 3> : <type> <etc...> Début du programme <Instruction 1> <Instruction 2> <etc ...> Fin du programme En Pascal, Pas d'accent ni d'espace pour les noms et les instructions. Chiffres utilisables à partir du 2nd caractère. Program <nom_programme>; Var <nom 1> : <type>; <nom 2>,<nom 3> : <type>; <etc...>; Begin <Instruction 1>; <Instruction 2>; <etc ...> End. Exemple : Racines d'un polynôme du second ordre dans R (2/4) Écriture en pseudo-langage : Utilisation de 4 variables identifiées a, b, c et delta Étape 1 : Demander à l'utilisateur de saisir a, b et c Instruction : Écrire Instruction : Lire Écrire « Bonjour » Lire a, b, c Étape 2 : Calcul de ∆ Affectation : delta <- b*b-4*a*c Étape 3 : Selon ∆ calcul et affichage des racines Instruction : Écrire Écrire « Delta= »,delta Texte à écrire entre guillemets Valeur de la variable delta : pas de guillemet Exemple : Racines d'un polynôme du second ordre dans R (3/4) Nom des variables Programme Racines Polynôme ordre 2 Nom du programme Variables utilisées : a,b,c,delta : nombres réels Type des variables Début du programme Écrire « Entrez les coefficients a, b, c » Lire a, b, c delta <- b*b-4*a*c Test Décalage pour plus de lisibilité Si delta<0 Alors Écrire « delta<0, pas de solution dans R » Sinon Si delta=0 Alors Écrire « Racine double : x1= »,-b/2/a Sinon Début Écrire « delta>0, deux racines » Écrire « x1= »,-(b-sqrt(delta))/2/a Écrire « x2= »,-(b+sqrt(delta))/2/a Fin Fin du programme Toute variable utilisée doit être déclarée (permet de détecter les fautes de frappe) Exemple : Racines d'un polynôme du second ordre dans R (4/4) Programme Racines Polynôme ordre 2 Program RacPoly; Variables utilisées : a,b,c,delta : nombres réels Var Début du programme Écrire « Entrez les coefficients a, b, c » Lire a, b, c Begin Write('Entrez les coefficients a, b, c'); Read (a, b, c); delta <- b*b-4*a*c delta := b*b-4*a*c; Si delta<0 Alors Écrire « delta<0, pas de solution dans R » Sinon Si delta=0 Alors Écrire « Racine double : x1= »,-b/2/a Sinon Début Écrire « delta>0, deux racines » Écrire « x1= »,-(b-sqrt(delta))/2/a Écrire « x2= »,-(b+sqrt(delta))/2/a Fin Fin du programme If delta<0 Then WriteLn ('delta<0, pas de solution dans R') Else If delta=0 Then WriteLn ('Racine double : x1= ',-b/2/a) Else Begin WriteLn ('delta>0, deux racines'); WriteLn ('x1= ',-(b-sqrt(delta))/2/a); WriteLn ('x2= ',-(b+sqrt(delta))/2/a); End; End. a,b,c,delta : real; Démonstration Quelques types de données Nombres Entiers relatifs (-1, 54, ...) : Integer en Pascal Étendue : -231 à 231-1 (µP 32 bits) ; -215 à 215-1 (16 bits) 231=2 147 483 648 (231-1)+1=-231 215=32 768 Logique Réels (-1.6e-4, 3.1415926...) : Real en Pascal Étendue : 5.0E-324 à 1.7E308 sur µP 32 bits intel Principe : -1.6e-4 => 2 entiers : -0.16 et -3 Booléen (True ou False) : Boolean en Pascal Texte 1 seul Caractère ('B') : Char en Pascal Vecteurs Chaîne de caractères ('Bonjour') : String en Pascal Tableau 1D ([5 8 2 5]) : Array [1..4] of Real Matrices Tableau 2D ([[ 86 5 1 ]) : Array [1..2,1..3] of Real 8 ] 0 Exemple d'utilisation : voir page suivante ... Utilisation de différents types de données en Pascal Program Donnees; { Programme de démonstration des types de données } {Variables utilisées } Var punit,ptot:real; quantite :integer; tva :real=0.206; reference :string; (* (* (* (* prix unitaire, prix total *) quantité commandée *) tva *) référence produit *) b:array [1..3] of real; (* vecteur à 3 éléments*) c:array [1..3] of real=(1,5,9); (* vecteur à 3 éléments*) A:array [1..2,1..3] of real; (* matrice 2x3 *) Begin punit:=1.30; quantite:=3; reference:='Stylo'; { Calcul du prix total } ptot:=quantite*punit; { Affiche le prix total } writeln ('Prix total de ',reference,': ',ptot); b [1]:=23; A [2,1]:=9.9e3; End. Comment commenter un programme en Pascal Program ResistanceCu; { Ce programme calcul la résistance d'un fil de cuivre à partir de sa longueur et de la section } { Auteur : Frédéric Bonnardot } Uses WinCrt; { Uniquement pour Turbo Pascal Windows de Borland } Var section, longueur : real; { nombres saisis par l'utilisateur } resistance : real; { resistance du fil } begin { Lecture de la section et de la longueur du fil } write ('Section du fil de cuivre en mm2 : '); readln (section); write ('Longueur du fil de cuivre en m : '); readln (longueur); { Calcul } resistance:=1.7e-8*longueur/section/1e-6*1e3; { Affichage du résultat } write ('La résistance du fil est : ',resistance:6:1,' mohms'); end. Instructions Les tests (si ... alors ...) 2 variantes : Si <condition> alors <instruction(s)> Si <condition> alors <instruction(s)> sinon <instruction(s)> En Pascal : If <condition> Then <instruction(s)> En Pascal : If <condition> Then <instruction(s)> Else <instruction(s)> <condition> : (a=1 ou b≥2) et c≠1 s'écrit en Pascal (a=1 or b>=2) and c<>1 1 seule instruction <instruction> plusieurs instructions Début <instruction> <instruction> <...> Fin <instruction(s)> Begin <instruction>; <instruction>; <...> End Exemple de test On demande un nombre et on indique si il est positif ou négatif Etapes : 1) Demander le nombre 2) Selon le signe écrire positif ou négatif Besoins : une variable pour ranger le nombre Si on considère que 0 est positif : Sinon : Programme Signe nombre v2 Programme Signe nombre Variables utilisées : nombre : nombre entier Début du programme Écrire « Entrez un nombre : » Lire nombre Si nombre<0 alors Écrire « Nombre négatif » Sinon Écrire « nombre positif ou nul» Fin du programme Variables utilisées : nombre : nombre entier Début du programme Écrire « Entrez un nombre : » Si nombre<0 alors Écrire « Nombre négatif » Sinon Si nombre>0 alors Écrire « nombre positif » Sinon Écrire « nombre nul » Fin du programme Instructions La sélection (selon ... faire) Selon <variable de type entier ou caractère> cas <valeur 1> faire <instruction(s)> cas <valeur 2>,<valeur 3> faire <instruction(s)> autres cas faire <instruction(s)> Facultatif Fin selon En Pascal : Case <variable de type entier ou caractère> Of <valeur 1> : <instruction(s)>; <valeur 2>,<valeur 3> : <instruction(s)>; Else <instruction(s)> End Exemple : Case touche Of '+' : WriteLn ('Somme : ',a+b); '*' : WriteLn ('Produit : ',a*b); Else WriteLn ('Touche inconnue.') End Exemple d'utilisation de selon On lit deux nombres et on affiche un menu pour demander à l'utilisateur si il veut calculer la somme, le produit, le quotient de ces deux nombres. Programme Opérations Variables utilisées : a,b : nombres réels touche : caractère Début du programme { Lecture des données} Écrire « Saisir 2 nombres a et b » Lire a,b { Affichage du menu } Écrire « Pour calculer la somme, tapez + » Écrire « Pour calculer le produit, tapez * » Écrire « Pour calculer le quotient, tapez / » touche <- touche enfoncée au clavier { Réaction selon cette touche } Selon touche cas '+' faire Écrire « La somme est »,a+b cas '*' faire Écrire « Le produit est »,a*b cas '/' faire Écrire « Le quotient est »,a/b autres cas faire Écrire « Je n'ai pas compris ce que vous voulez faire » Fin Selon Fin du programme Instructions Répétition (faire ... jusqu'à) 2 variantes : Faire <instruction> <instruction> <...> Jusqu'à <condition> En Pascal : Tant que <condition> faire <instruction(s)> Repeat <instruction>; <instruction>; <...> Until <condition> While <condition> do <instruction(s)> En haut : on passe au moins une fois dans la boucle En bas : si la condition n'est pas vérifiée au début, on n'exécute aucune instruction Exemple : Repeat WriteLn ('Entrer un nombre supérieur à 7 : '); ReadLn (nombre) Until nombre>7 Exemples de répétitions On demande un nombre supérieur à 7. Si l'utilisateur fait une erreur on redemande ce nombre. 2ème cas : on indique à l'utilisateur qu'il s'est trompé 1er cas : Programme lire un nombre Variables utilisées : nombre : réel Début du programme Répéter Écrire « Entrez un nombre >7 : » Lire nombre Jusqu'à ce que nombre>7 Écrire nombre Fin du programme Exécuté au moins 1 fois Programme lire un nombre v2 Variables utilisées : nombre : réel Début du programme Écrire « Entrez un nombre >7 : » Lire nombre Tant que nombre<=7 faire Début Écrire nombre,« n'est pas>7, entrez un nombre >7 : » Lire nombre Fin Écrire nombre Fin du programme Peut ne pas être éxécuté Instructions Répétition n fois (pour . variant ...) Pour <variable> variant de <début> à <fin> faire <instruction(s)> En Pascal : For <variable>:=<début> to <fin> do <instruction(s)> Exemple : moyenne:=0.; For etudiant:=1 to 50 do moyenne:=moyenne+note[etudiant]; moyenne:=moyenne/50; Si fin<début, on utilisera downto au lieu de to Exemple de Boucle On désire calculer la norme d'un vecteur à 20 dimensions Programme norme vecteur Variables utilisées : vecteur : tableau de 20 réels =(5,64.5,58,4,578,54,6.54,245,564,54,6.5,6,4,46,46,46,46.8,4.86,4,4.8) position: entier norme : réel Début du programme { Initialise la norme } norme <- 0 { Pour chaque élément du vecteur } Pour position variant de 1 à 20 faire norme <- norme + vecteur [position]*vecteur [position] norme <- racine carrée de norme Écrire norme Fin du programme Application au tri de données On sait faire un tri à la main (trier un jeu de carte) Mais on ne connait pas l'algorithme (cas général avec 1 million de cartes)... 1ère étape : On prend des cartes et on regarde comment on fait à la main. 2ème étape : On essaie d'écrire l'algorithme. Règle du jeu : On a dix cartes face cachées. 0.1€ pour retourner une carte. Seules 2 cartes peuvent être retournées. Il existe plusieurs méthodes de tri. Evaluation Document autorisé : cours Pascal Rendre la feuille à 8h15 1. A quoi servent les instructions writeln et readln. 2. Écrire en pseudo-langage (en français) un programme qui demande de saisir à l'utilisateur 2 nombres a et b et qui indique le plus grand des deux ainsi que l'écart entre ces deux nombres.