A voir également:
- Cours algorithmique
- Panne tnt en cours aujourd'hui - Guide
- Association avec le serveur freebox en cours - Forum Freebox
- Arret en cours infini ✓ - Forum Windows 8 / 8.1
- Chronopost colis en cours d'acheminement depuis 1 semaine ✓ - Forum Consommation & Internet
- Association avec le server freebox en cours freeplug vert - Forum Freebox
58 réponses
Galsungen
Messages postés
6938
Date d'inscription
vendredi 5 mars 2004
Statut
Contributeur
Dernière intervention
18 novembre 2007
1 422
19 janv. 2005 à 16:50
19 janv. 2005 à 16:50
http://pascal.developpez.com/
Et un temps pour chaque chose sous le ciel ...
Bonjour,
shui en premiere année en reseau informatique svp aidez moi a comprendre l'algorithme
shui en premiere année en reseau informatique svp aidez moi a comprendre l'algorithme
coucou_hb21
Messages postés
33
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
21 janvier 2008
14 oct. 2007 à 19:33
14 oct. 2007 à 19:33
slt
cherche quoi en algorithme
cherche quoi en algorithme
sami
>
coucou_hb21
Messages postés
33
Date d'inscription
lundi 8 octobre 2007
Statut
Membre
Dernière intervention
21 janvier 2008
29 mars 2008 à 11:05
29 mars 2008 à 11:05
j'aiem un citer quand je donner un exercice faire ???
jamal028
Messages postés
17
Date d'inscription
dimanche 30 mars 2008
Statut
Membre
Dernière intervention
20 janvier 2010
2
4 mai 2008 à 02:07
4 mai 2008 à 02:07
je te consiel de laisses l'algorithme a part por le moument .car les coures de reseaux est térs important
salut lolita, tu sais pas k'il existe *la comlplexité* dans le langage pascal et dans l'algorithme en general et puit j'ai demander des programmes avec leurs calculs de complexité algorithmique pour ke je puisse comparer mon travaille avec la solution ...c'est bon comme sa ou je detaille encore.....merci c'est trés gentille de ta part coleg
Bonjour, je suis un etudiant en 3 éme année informatique de gestion j'ai besoin d'une aide dans le cours base de données c'est à dire etude cas avec leurs corrigés (conception + modéle relationnel)
merci
merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
- Algo : https://algo.developpez.com/cours/
- Orienté Objet : https://general.developpez.com/cours/#generalite
- Orienté Objet : https://general.developpez.com/cours/#generalite
salut à tous le monde . j'ai besoin d'aide àcomprendre la base de l'algorithme dans la classe de l'informatique ,.bisous à tous. Imane de maroc.
Salut
En ce qui concerne ta demande de cours d'algo sur les structures de données, voici un document qui devrait t'intéresser : http://www.bahunet.com/document/algorithmie-structures-de-donnees-avancees.
En espérant que cela t'aide toi ou d'autres...
@+
En ce qui concerne ta demande de cours d'algo sur les structures de données, voici un document qui devrait t'intéresser : http://www.bahunet.com/document/algorithmie-structures-de-donnees-avancees.
En espérant que cela t'aide toi ou d'autres...
@+
tu peux aller sur le site: www.chez.com/algor/cours/hist.htm
où j ai trouve ceci qui a mon avis peut t aider.
________________________________________
Algorithmique et langage Pascal.
________________________________________
• Bref historique de l'informatique.
• Introduction à l'algorithmique.
• La séquence.
• L'alternative.
• La répétitive.
________________________________________
Page d'accueil.
________________________________________
________________________________________
Historique.
________________________________________
1. INTRODUCTION.
1.1. Introduction.
Les ordinateurs n'existaient pas voici seulement 50 ans et déjà ils ont envahi tous les secteurs de la vie sociale: comme amélioration d'outils anciens rendus automatiques (caisses enregistreuses, machines à calculer, machines à laver, ...) ou sous la forme d'une machine mystérieuse capable de dialoguer avec l'homme et qui paraît douée d'intelligence (robots, jeux électroniques, ...).
En fait, un ordinateur n'est qu'une machine capable d'exécuter automatiquement une série d'opérations simples qu'on lui a demandé de faire. L'intérêt de l'ordinateur est sa capacité de manipuler rapidement et sans erreur un grand nombre d'informations: mémoriser des quantités numériques ou alphabétiques, rechercher une quantité mémorisée, comparer ou classer des informations, ....
Pour résoudre un problème à l'aide d'un ordinateur, il faut:
1. analyser ce problème: définir avec précision les résultats à obtenir, les informations dont on dispose, ...
2. déterminer les méthodes de résolution: il s'agit de déterminer la suite des opérations à effectuer pour obtenir à partir des données la solution au problème posé. Cette suite d'opérations constitue un algorithme. Parmi tous les algorithmes fournissant la solution, il faudra choisir le plus efficace.
3. formuler l'algorithme définitif: cette étape doit faciliter la résolution sur ordinateur par l'expression de l'algorithme dans un formalisme adéquat (langage de description d'algorithme: LDA, organigramme, arbre programmatique, ...).
4. traduire l'algorithme dans un langage de programmation adapté.
Comme nous nous limiterons à des problèmes posés d'une manière non ambigüe, la première étape pourra généralement être négligée et nous nous concentrerons sur la rédaction correcte d'algorithmes et sur l'écriture de programmes efficaces (dont il est facile de vérifier qu'ils sont corrects, qui peuvent être lus, compris, modifiés sans difficulté et qui reflètent la structure de l'algorithme de résolution). Une manière d'atteindre ce but est de décomposer un problème complexe en plusieurs problèmes plus simples.
1.2. Historique.
Il est difficile de faire commencer l'histoire des ordinateurs à une date bien précise. Comme l'ordinateur est un outil d'aide au traitement de l'information, nous citerons les principales innovations qui ont facilité ou automatisé le calcul (les nombres étant longtemps la principale source d'information).
L'idée d'utiliser des supports matériels pour manipuler les nombres d'une manière répétitive est très ancienne. Vers 2500 avant J-C, apparaissait déjà le boulier qui permettait d'effectuer des opérations arithmétiques élémentaires. Six siècles plus tard, une tablette babylonnienne en argile (1900-1600 avant J-C) permettra à partir de deux côtés d'un triangle rectangle, de trouver le troisième.
Les premiers dispositifs mécaniques d'aide au calcul apparaissent seulement à la Renaissance: en 1642, Blaise Pascal invente une machine permettant d'additionner et de soustraire, pour simplifier la tâche de son père, commissaire pour la levée des impôts. En 1671, le mathématicien allemand Gottfried Wilhem Leibniz conçoit une machine permettant les quatre opérations arithmétiques. Jusqu'au XIX ème siècle, ces machines seront copiées sans qu'on y apporte d'améliorations significatives.
Au cours du XIX ème siècle, quelques nouvelles machines capables d'effectuer les quatre opérations élémentaires apparaissent: l'arithmomètre (1820) de Thomas de Colmar conçu à partir des idées de Leibniz, la machine à curseur du suédois Odhner (1875), le comptomètre à clavier de l'américain Felt (1885). Le développement des techniques de réalisation d'automates (horloges astronomiques, canard de Vaucanson, capable de faire les mouvements du vol, de manger, de boire et ... de déféquer) allait être stimulé par celui des industries naissantes, en particulier de l'industrie textile pour laquelle Jacquard, perfectionnant en 1801 une invention de Vaucanson (1745) crée la carte perforée destinée à commander des métiers à tisser.
Avec plus d'un siècle d'avance, l'anglais Charles Babbage propose en 1822 sa "machine différentielle" permettant d'élever un nombre à la puissance n et en 1833, sa "machine analytique" où on retrouve les trois éléments essentiels de nos calculateurs: un organe d'introduction des données (cartes perforées ou cadrans), un organe de sortie des résultats (cartes perforées, cadrans ou papier) et un organe de contrôle et de calcul qui utilisait des dispositifs mécaniques. Une mémoire était réalisée par l'intermédiaire de roues dentées tandis que les opérations à effectuer étaient introduites à l'aide de cartes perforées. La machine de Babbage, limitée par les possibilités techniques de l'époque (elle aurait demandé plus de 50000 pièces mobiles), restera cependant à l'état de plans, et ses idées seront presque toutes "redécouvertes" indépendamment dans les années 40.
L'ingénieur américain Herman Hollerith développe pour le recensement de 1890 une machine électromécanique, plus élémentaire que celle de Babbage, capable de trier des cartes perforées et de les compter. Les opérations étaient toujours mécaniques mais les commandes étaient réalisées par l'intermédiaire de relais électromagnétiques, actionnés par des impulsions électriques obtenues par contact entre des aiguilles et un bac de mercure sur lequel reposaient les cartes perforées. Hollerith fonde en 1896 la "Tabulating Machine Company" reprise en 1911 par Thomas Watson qui crée en 1924 la firme IBM (International Business Machine).
La guerre 1940-1945, suite à l'effort de plusieurs pays, va donner l'impulsion décisive à la naissance des premiers ordinateurs dignes de ce nom:
- les Z2 et Z3 de l'allemand Zuse prêts en 1939 et 1941
- la série des "Automatic Sequence Controlled Computer Mark" conçus par Howard Aiken. Le Mark I fonctionnera en 1944. Les temps de calcul étaient de 1/3 de seconde pour une addition, de 6 secondes pour une multiplication et de 11 secondes pour une division. Les organes de commande et de calcul utilisaient des relais électromagnétiques.
- l'ENIAC (1943-1946), destiné initialement au calcul de tables d'artillerie, de Prosper Eckert et John Mauchly, utilisait des tubes à vide. Les temps de calcul sont divisés par 1000 mais cette machine qui comporte 18000 tubes à vide, 1500 relais, 10000 condensateurs et 70000 résistances, prend une place considérable (270 m3 - 30 tonnes) et consomme 150 kw. Il fallait changer le cablage et les switches pour modifier le programme. L'ENIAC était une machine décimale dont les entrées-sorties et la mémoire auxiliaire étaient réalisées par cartes perforées.
Dès 1944, des théoriciens de Princeton tels que J.Von Neumann, A.Buks et H.Goldstine se penchent sur les problèmes logiques posés par la réalisation des ordinateurs et établissent les bases des futurs développements, notamment l'utilisation du binaire, les notions de programmes stockés en mémoire, d'ordinateurs à usages multiples ...
L'EDSAC (Cambridge University 1949) et l'EDVAC (University of Pennsylvania 1950) utilisent des mémoires à ligne de retard à mercure (inventées par Eckert) qui permettent de stocker programmes et nombres sous forme digitale.
Vers 1951, apparaissent le premier UNIVAC (Eckert et Mauchly) utilisant des diodes à cristal et des bandes magnétiques comme mémoire de masse et l'IAS (Von Neumann) où une mémoire à tube de Williams (1947) permet l'accès parallèle à tous les bits. C'est une machine binaire où les instructions modifiables comportent une adresse.
Entre 1953 et 1960 apparaissent de nombreuses innovations (2ème génération d'ordinateurs): les tores de ferrite utilisés comme mémoire (d'après les travaux de J.W. Forrester en 1951 au MIT), les circuits imprimés, les disques magnétiques, les transistors (inventés en 1948),... Les vitesses de traitement et les capacités de mémoire augmentent considérablement. Les "ordinateurs" (mot inventé en 1953 par M. Perret pour traduire "computer") acquièrent une plus grande sécurité de fonctionnement et une facilité d'emploi permettant d'effectuer des tâches de plus en plus vastes pour un nombre plus important d'utilisateurs. La production en série commence et les coûts de production diminuent rapidement.
En 1963, les circuits imprimés sont remplacés par des circuits intégrés (3ème génération). Les équipements se miniaturisent et on voit apparaître les mini- et micro-ordinateurs. Les vitesses d'exécution diminuent: quelques dizaines de picosecondes (1 picos=.000000000001 s=10-12s).
L'ordinateur commence à se banaliser. En 1963, il n'est déjà plus un matériel extraordinairement coûteux, même s'il est encore très cher. Il n'est plus en la possession exclusive de quelques centres de recherche aux énormes budgets, déjà de nombreuses entreprises le possèdent. Il est devenu fiable, rapide et performant.
En prenant comme référence la multiplication de deux nombres tenant chacun dans un mot, on constate une division du temps de calcul par 100 tous les 7 ans. Cette amélioration des performances s'accompagne d'une diminution des prix, d'un facteur 100 tous les 10 ans environ. Cette diminution continue aujourd'hui où, pour quelques dizaines de milliers de francs, on trouve des ordinateurs, dits microordinateurs, qui, en dépit de leur petite taille, sont bien plus puissants que ne le fut,il n'y a guère plus de 30 ans, l'ENIAC, malgré son poids de plusieurs tonnes. C'est que la microélectronique a entraîné à son tour, au cours des ans, une diminution considérable de la taille des ordinateurs et, ce qui est bien plus curieux, selon une tendance voisine de celles que nous avons observées dans les autres domaines. Les unités centrales réalisées sous de très faibles volumes qui forment ce qu'on appelle les microprocesseurs ont en effet été largement diffusées, en 1976, lorsque fut mise au point la fabrication de masse des composants de très haute intégration (Very Large Scale Integration ou VLSI). Cette technologie, encore aujourd'hui en pleine évolution, a permis par exemple de construire les unités centrales des IBM 4300 avec des plaquettes de silicium de 20 millimètres carrés, ayant 704 circuits logiques.
Notons d'ailleurs qu'il ne faut pas confondre microprocesseur et microordinateur. Un microordinateur est construit autour d'un microprocesseur, mais les unités d'entrée et de sortie, écrans de visualisation, claviers, imprimantes, ..., ne pouvant être miniaturisés, le volume d'un microordinateur est essentiellement occupé par ces dispositifs qui en sont la partie la plus coûteuse.
L'amélioration du rapport prix/performance a permis aussi de trouver de nouveaux utilisateurs et de construire des ordinateurs mieux adaptés aux besoins des utilisateurs. C'est ainsi que la gestion (paye et facturation, applications administratives et bancaires, réservations, ...) devient le domaine principal d'utilisation des ordinateurs.
1.3. Les langages.
Parallèlement aux modifications techniques, les moyens de communiquer à l'ordinateur ce qui lui est demandé de faire ont fortement changé. On appelle langages de première génération les langages-machine ou "codes-machine" utilisés initialement (1945). Un programme en "code-machine" est une suite d'instructions élémentaires, composées uniquement de 0 et de 1, exprimant les opérations de base que la machine peut physiquement exécuter: instructions de calcul (addition, ...) ou de traitement ("et" logique, ...), instructions d'échanges entre la mémoire principale et l'unité de calcul ou entre la mémoire principale et une mémoire externe, des instructions de test qui permettent par exemple de décider de la prochaine instruction à effectuer.
Voici en code machine de l'IBM 370 l'ordre de charger 293 dans le registre "3":
01011000 0011 00000000000100100100
=charger =3 =293
Ce type de code binaire est le seul que la machine puisse directement comprendre et donc réellement exécuter. Tout programme écrit dans un langage évolué devra par conséquent être d'abord traduit en code-machine avant d'être exécuté.
La deuxième génération est caractérisée par l'apparition de langages d'assemblage (1950) où chaque instruction élémentaire est exprimée de façon symbolique. Un programme dit "assembleur" assure la traduction en code exécutable. L'instruction de l'exemple précédent s'écrira:
constante X = 293 charger X R3
La troisième génération débute en 1957 avec le 1er langage dit évolué: FORTRAN (acronyme de mathematical FORmula TRANslating system). Apparaissent ensuite ALGOL (ALGOrithmic Language en 1958), COBOL (COmmon Business Oriented Language en 1959), BASIC (Beginner's All-purpose Symbolic Instruction Code en 1965), Pascal (1968), ... Les concepts employés par ces langages sont beaucoup plus riches et puissants que ceux des générations précédentes et leur formulation se rapproche du langage mathématique. Il existe deux méthodes pour les rendre exécutables:
- la compilation: l'ensemble du programme est globalement traduit par un autre programme appelé compilateur et le code-machine produit est optimisé. Ce code-machine est ensuite exécuté autant de fois qu'on le veut.
- l'interprétation: un programme (interpréteur) décode et effectue une à une et au fur et à mesure les instructions du programme-source.
La quatrième génération qui commence au début des années 80 devait mettre l'outil informatique à la portée de tous, en supprimant la nécessité de l'apprentissage d'un langage évolué. Ses concepts fondamentaux sont "convivialité" et "non-procéduralité" (il suffit de "dire" à la machine ce qu'on veut obtenir sans avoir à préciser comment le faire). Cet aspect a été rencontré avec les langages du type Visual qui prennent en charge l'élaboration de l'interface graphique.
Page précédente.
________________________________________
Introduction.
________________________________________
1. ALGORITHMES.
1.1. Notion d'algorithme.
a-Définition.
Certains voient, à tort, dans l'ordinateur une machine pensante et intelligente, capable de résoudre bien des problèmes. En fait, celui-ci ne serait capable de rien si quelqu'un (le programmeur en l'occurence) ne lui avait fourni la liste des actions à exécuter. Cette description doit être faite de manière non ambigüe car il ne faut pas s'attendre à la moindre interprétation des ordres fournis. Ils seront exécutés de manière purement mécanique.
De plus, les opérations élémentaires que peut exécuter un ordinateur sont en nombre restreint et doivent être communiquées de façon précise dans un langage qu'il comprendra. Le problème principal de l'utilisateur est donc de lui décrire la suite des actions élémentaires permettant d'obtenir, à partir des données fournies, les résultats escomptés. Cette description doit être précise, envisager le moindre détail et prévoir les diverses possibilités de données.
Cette marche à suivre porte le nom d'algorithme dont l'Encyclopaedia Universalis donne la définition suivante:
" Un algorithme est une suite finie de règles à appliquer dans un ordre déterminé à un nombre fini de données pour arriver, en un nombre fini d'étapes, à un certain résultat, et cela indépendamment des données. "
Le mot algorithme provient du nom d'un célèbre mathématicien arabe de la première moitié du IXe siècle: Muhammad ibn Musa al Khwarizmi.
Le rôle de l'algorithme est fondamental. En effet, sans algorithme, il n'y aurait pas de programme (qui n'est jamais que sa traduction dans un langage compréhensible par l'ordinateur). De plus, les algorithmes sont fondamentaux en un autre sens: ils sont indépendants à la fois de l'ordinateur qui les exécute, des langages dans lequel ils sont énoncés et traduits.
b-Exemple.
Calcul de l'intérêt et de la valeur acquise par une somme placée pendant un an à intérêt simple.
L'énoncé du problème indique
les données fournies: deux nombres représentant les valeurs de la somme placée et du taux d'intérêt
les résultats désirés: deux nombres représentant l'intérêt fourni par la somme placée ainsi que la valeur obtenue après placement d'un an.
Il nous faut maintenant décrire les différentes étapes permettant de passer des donnés aux résultats. Nos connaissances générales nous permettent d'exprimer cette règle:
"Pour obtenir l'intérêt fourni par la somme, il suffit de multiplier la somme par le taux d'intérêt divisé par cent; la valeur acquise s'obtient en additionnant ce dernier montant et la somme initiale."
c-Méthodologie.
Dans cet exemple simple apparaissent les trois étapes qui caractérisent la résolution d'un problème sur ordinateur:
comprendre la nature du problème posé et préciser les données fournies ("entrées" ou "input" en anglais)
préciser les résultats que l'on désire obtenir ("sorties" ou "output" en anglais)
déterminer le processus de transformation des données en résultats.
Ces trois étapes ne sont pas indépendantes et leur ordre peut être modifié.
Si les résultats fournis par l'ordinateur ne sont pas corrects, c'est qu'une erreur s'est glissée soit dans l'analyse du problème, soit dans la mise au point de l'algorithme, soit dans sa traduction en langage de programmation car l'ordinateur ne fait qu'exécuter scrupuleusement les opérations demandées.
1.2. Formalisation de l'algorithme.
a- En français .
L'exemple décrit ci-dessus deviendrait:
(1) prendre connaissance de la somme initiale et du taux d'intérêt
(2) multiplier la somme par le taux; diviser ce produit par 100; le quotient obtenu est l'intérêt de la somme
(3) additionner ce montant et la somme initiale; cette somme est la valeur acquise
(4) afficher les valeurs de l'intérêt et de la valeur acquise.
Il est évident, même sur cet exemple simple, qu'une telle formalisation risque de produire un texte long, difficile à comprendre et ne mettant pas clairement en évidence les différentes étapes du traitement.
b-Langage de description.
Dans un langage de description, les actions sont généralement décrites par un symbole ou un verbe à l'infinitif choisi pour éviter les confusions. Ce langage est appelé soit pseudocode soit langage de description d'algorithme (LDA).
Notre exemple devient:
écrire " Introduisez la somme initiale (en francs): "
lire somme_initiale
écrire " Introduisez le taux d'intérêt (ex: 3 pour 3%): "
lire taux
intérêt <-- somme_initiale * taux / 100
valeur_acquise <-- somme_initiale + intérêt
écrire " L'intérêt fourni est de " , intérêt , "francs "
écrire " La somme après un an sera de " , valeur_acquise , "francs "
Nous pouvons remarquer deux verbes particuliers:
lire qui correspond à la saisie, à l'introduction des données;
écrire qui exécute l'affichage à l'écran ou l'impression des résultats.
Ces verbes sont soulignés pour indiquer qu'ils ont un sens particulier, qu'il est interdit de les utiliser dans un autre sens et qu'il seront traduits pour être rendus compréhensibles par la machine.
Les valeurs manipulées dans cet algorithme sont des constantes (100) et des variables (somme_initiale, taux, intérêt, valeur_acquise). Il est pratique de choisir le nom des variables de manière à rappeler la signification de la valeur qu'elles représentent. Ce nom est souvent appelé identificateur de la variable. Les variables jouent le rôle de "tiroirs" dans lesquels on place une valeur durant l'exécution de l'algorithme. Ainsi,
lire somme_initiale
signifie que l'on introduit dans le tiroir baptisé somme_initiale la valeur numérique entrée au clavier lors de l'exécution du programme.
Le contenu d'un de ces tiroirs peut être modifié en y plaçant le résultat d'un calcul. Cette instruction porte le nom d'assignation ou affectation et se représente par une flèche (<--).
Ainsi,
intérêt <-- somme_initiale * taux /100
signifie que l'on place dans le tiroir intérêt le résultat de l'opération figurant à droite de la flèche. Cette instruction se lit: assigner à la variable intérêt la valeur de l'expression de droite.
Les expressions symbolisant les calculs à effectuer sont représentées par des formules algébriques faisant intervenir les noms des variables, des symboles mathématiques ("+" pour l'addition, "-" pour la soustraction, "*" pour la multiplication, "/" pour la division, ...) et des constantes numériques.
La description d'une action et des objets qui y participent porte le nom d'instruction. L'ordre dans lequel les différentes opérations seront écrites indique l'ordre dans lequel elles seront exécutées: de haut en bas et de droite à gauche. Il s'agit d'une exécution séquentielle.
1.3. Qualités d'un algorithme, d'un programme.
Tout programme fourni à l'ordinateur n'est que la traduction dans un langage de programmation d'un algorithme mis au point pour résoudre un problème donné. Pour obtenir un bon programme, il faut partir d'un bon algorithme. Il doit, entre autres, posséder les qualités suivantes:
être clair, facile à comprendre par tous ceux qui le lisent (structure et documentation)
présenter la plus grande généralité possible pour répondre au plus grand nombre de cas possibles
être d'une utilisation aisée même par ceux qui ne l'ont pas écrit et ce grâce aux messages apparaissant à l'écran qui indiqueront quelles sont les données à fournir et sous quelle forme elles doivent être introduites ainsi que les différentes actions attendues de la part de l'utilisateur
être conçu de manière à limiter le nombre d'opérations à effectuer et la place occupée en mémoire.
Une des meilleures façons de rendre un algorithme clair et compréhensible est d'utiliser une programmation structurée n'utilisant qu'un petit nombre de structures indépendantes du langage de programmation utilisé. Une technique d'élaboration d'un bon algorithme est appelée méthode descendante (top down). Elle consiste à considérer un problème dans son ensemble, à préciser les données fournies et les résultats à obtenir puis à décomposer le problème en plusieurs sous-problèmes plus simples qui seront traités séparément et éventuellement décomposés eux-mêmes de manière plus fine.
Exemple: imaginons un robot domestique à qui nous devons fournir un algorithme lui permettant de préparer une tasse de café soluble. Une première version de l'algorithme pourrait être:
(1) faire bouillir de l'eau
(2) mettre le café dans la tasse
(3) ajouter l'eau dans la tasse
Les étapes de cet algorithme ne sont probablement pas assez détaillées pour que le robot puisse les interpréter. Chaque étape doit donc être affinée en une suite d'étapes plus élémentaires, chacune étant spécifiée d'une manière plus détaillée que dans la première version. Ainsi l'étape
(1) faire bouillir l'eau peut être affinée en
(1.1) remplir la bouilloire d'eau
(1.2) brancher la bouilloire sur le secteur
(1.3) attendre l'ébullition
(1.4) débrancher la bouilloire
De même,
(2) mettre le café dans la tasse pourrait être affiné en
(2.1) ouvrir le pot à café
(2.2) prendre une cuiller à café
(2.3) plonger la cuiller dans le pot
(2.4) verser le contenu de la cuiller dans la tasse
(2.5) fermer le pot à café
et (3) ajouter de l'eau dans la tasse pourrait être affinée en
(3.1) verser de l'eau dans la tasse jusqu'à ce que celle-ci soit pleine
Certaines étapes étant encore trop complexes et sans doute incompréhensibles pour notre robot, il faut les affiner davantage. Ainsi l'étape
(1.1) remplir la bouilloire d'eau
peut nécessiter les affinements suivants:
(1.1.1) mettre la bouilloire sous le robinet
(1.1.2) ouvrir le robinet
(1.1.3) attendre que la bouilloire soit pleine
(1.1.4) fermer le robinet
Quand il procède à des affinements des différentes étapes, le concepteur d'un algorithme doit naturellement savoir où s'arrêter. Autrement dit, il doit savoir quand une étape constitue une primitive adéquate au point de ne pas avoir besoin d'affinement supplémentaire. Cela signifie évidemment qu'il doit connaître quelle sorte d'étape le processeur peut interpréter. Par exemple, le concepteur de l'algorithme précédent doit savoir que le robot peut interpréter "brancher la bouilloire" ce qui de ce fait n'exige pas d'affinement, mais qu'en revanche, il ne peut pas interpréter "remplir la bouilloire" et que dès lors un affinement devient nécessaire.
Page précédente.
________________________________________
© 1996 JMy
________________________________________
LA SEQUENCE.
________________________________________
2. LA SEQUENCE.
2.1. Langage de description.
a- Instructions
Dans les algorithmes décrivant des calculs sur les quantités numériques, seront utilisées essentiellement les instructions que nous avons déjà étudiées.
1° les instructions de lecture (d'entrée) notées:
lire variables
indiquant la saisie des données
exemples:
lire somme_initiale
lire taux
2° les instructions d'écriture (de sortie) de la forme:
exemple:
écrire expression
indiquant l'affichage d'un message et/ou du contenu d'une variable (ou du résultat d'un calcul)
exemples:
écrire " Introduisez la somme initiale (en francs): "
écrire " L'intérêt fourni est de " , intérêt
écrire intérêt
écrire a, b, (a+b)/2
3° les instructions d'assignation (d'affectation) représentées par
variable <-- expression
exemple:
intérêt <-- somme-initiale * taux / 100
a <-- 0
i <-- i + 1
Les expressions sont des formules mathématiques symbolisant des opérations sur des variables et/ou des constantes numériques.
Les variables y sont représentées par un identificateur (un nom) comme en algèbre et les constantes sont des nombres écrits en chiffres. Nous utiliserons la convention anglo-saxonne utilisée par la plupart des ordinateurs (et des calculatrices) et qui consiste à employer le point (".") pour séparer la partie entière de la partie décimale d'un nombre.
Les opérations sur des nombres sont représentées par +, -, * (pour ne pas confondre le symbole de multiplication avec la lettre "x" ou avec le point décimal), /.
D'autres fonctions mathématiques usuelles sont couramment utilisées: ln x, sin x, arctg x, [x] (signifie prendre la partie entière de x), a mod b (fournit le reste de la division de a par b), xy, loga x , ...
Mais l'ordinateur peut également manipuler des variables contenant des chaînes de caractères alphanumériques (alphabétiques et/ou numériques et/ou spéciaux) pour les modifier, en extraire des sous-chaînes, ... Ces chaînes de caractères sont placées entre guillemets pour les distinguer des noms de variables. L'opération de concaténation (juxtaposition de 2 chaînes pour en former une nouvelle) est symbolisée par // séparant les 2 chaînes originelles. La fonction qui permet d'extraire une sous-chaîne est représentée par le nom de la variable avec en indice les positions des lettres à extraire. Ainsi la sous-chaîne formée des caractères occupant les positions 2, 3, 4 dans la variable prénom sera symbolisée par: prénom2<--4
Enfin, la fonction qui fournit la longueur (le nombre de caractères) de la chaîne contenue dans la variable prénom est symbolisée par |prénom|
b- Exemples
1- Exprimer un nombre de secondes sous forme d'heures, minutes, secondes. La seule donnée est le nombre total de secondes que nous appellerons nsec; les résultats consistent en 3 nombres h, m, s.
écrire " Introduisez le nombre de secondes"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heure(s) ", m, "minute(s) et", s, "seconde(s)"
2- Transformer un prénom et un nom en une chaîne contenant l'initiale du prénom séparée du nom par un point
écrire "Quel est votre prénom?"
lire prénom
écrire "et votre nom?"
lire nom
pr <-- prénom1
lpr <-- |prénom|
ident <-- pr // "." // nom
écrire "Votre prénom de", lpr, "lettres a été abrégé
et votre identification est : ", ident
c-Déclaratives
Il est aussi nécessaire de préciser ce que les variables utilisées contiendront comme type de données. Il peut s'agir de nombres entiers, de nombres réels, de chaînes de caractères, ... Il faut faire précéder la description de l'algorithme par une partie dite déclarative où l'on regroupe les caractéristiques des variables manipulées.
La partie déclarative est placée en tête de l'algorithme et regroupe une ou plusieurs indications de la forme:
entier variables
ou
réel variables
L'algorithme complété de l'exemple 1 devient:
entier nsec, h, m, s
écrire "Introduisez le nombre de secondes:"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heure(s)", m, "minute(s) et", s, "seconde(s)"
Et l'algorithme de l'exemple 2:
entier lpr
chaîne prénom, nom, ident
écrire "Quel est votre prénom?"
lire prénom
écrire "et votre nom?"
lire nom
pr <-- prénom1
lpr <-- |prénom|
ident <-- pr // "." // nom
écrire "Votre prénom de",lpr,"lettres a été abrégé
et votre identification est : ",ident
2.2. Exercices
Pour voir les exercices et les solutions, cliquez ici.
Résumé:
Pour l'échange de données entre le programme et l'utilisateur (ou le disque du PC), 2 mots sont utilisés:
(1) lire pour recevoir de l'info du monde extérieur:
lire N où N est le nom de la variable qui va recevoir l'information fournie par l'utilisateur
lire N sur Fichier où N est le nom de la variable qui va recevoir l'information récupérée dans le fichier Fichier
(2) écrire pour fournir de l'info au monde extérieur:
écrire "Bonjour tout le monde." où la partie entre guillemet est le message à afficher à l'écran
écrire N où N est le nom de la variable qui contient l'information à écrire
écrire N sur Fichier où N est le nom de la variable qui contient l'information à écrire sur le fichier Fichier
Lorsque le programme travaille dans sa tête, on utilise l'assignation <-- pour symboliser la mémorisation dans une variable.
N <-- N+2
x <-- 2*3+5/2
St <-- "Hello"
2.3. Traduction en Pascal.
Généralités
Examinons les programmes complets correspondant aux algorithmes décrits en LDA.
entier nsec, h, m, s
écrire "Introduisez le nombre de secondes:"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heures",m, "minutes et", s, "secondes"
deviendra en Pascal:
PROGRAM secondes;
VAR nsec, h, m, s : INTEGER;
BEGIN
WRITE('Introduisez le nombre de secondes: ');
READLN (nsec) ;
s:=nsec MOD 60 ;
m:=nsec DIV 60 MOD 60 ;
h:=nsec DIV 3600 ;
WRITELN (nsec, 'valent: ', h, 'heures', m, 'minutes et', s, 'secondes')
END.
Les règles de base.
Dans ces exemples, nous retrouvons déjà dix règles de base:
1° Un programme Pascal se compose de trois parties:
un en-tête, caractérisé par le mot PROGRAM
une section déclarative introduite ici par le mot VAR
une section instruction ou corps du programme, délimitée par les mots BEGIN et END.
Attention: Le programme se termine par un point.
2° L'en tête (facultative) sert à donner un nom au programme selon la forme:
PROGRAM identificateur;
3° Un identificateur en Pascal doit débuter par une lettre suivie par un nombre quelconque de lettres, chiffres ou de "_" (caractère souligné). Les identificateurs ne peuvent contenir d'espacement (caractère "blanc") ou de caractères tels que %, ?, *, ., - ,... mais peuvent être aussi longs que l'on veut.
4° Les variables doivent faire l'objet d'une déclaration de type de la forme:
VAR liste des variables : type;
5° Des points-virgules sont obligatoires pour séparer les trois parties et pour séparer les instructions
6° Les instructions de lecture et d'écriture se traduisent respectivement par READLN et WRITE (ou WRITELN) suivis d'une liste de variables ou d'expressions placées entre parenthèses et séparées par des virgules.
L'ajout de LN après WRITE (WRITELN) force le passage à la ligne lors de l'affichage suivant à l'écran.
7° L'assignation se représente par ":="
8° Les opérateurs arithmétiques sont identiques à ceux du langage de description d'algorithme (LDA). Toutefois, nsec\3600 est traduit par nsec DIV 3600. En effet, outre les quatres opérations + - * / , Pascal utilise deux opérateurs supplémentaires:
DIV fournissant la partie entière du quotient de deux nombres entiers
MOD fournissant le reste de la division de deux nombres entiers
Ainsi, 13 / 5 fournit la valeur 2.6
13 DIV 5 fournit 2
et 13 MOD 5 fournit 3.
9° Les mots PROGRAM, VAR, BEGIN, END, DIV, MOD, ... ont un sens précis dans le langage: ce sont des mots réservés qui ne peuvent être choisis comme identificateurs par le programmeur.
Dans un programme en LDA, les mots réservés sont soulignés.
Un certain nombre de mots tels que INTEGER, READLN, WRITE, ... ont une signification prédéfinie. Pour éviter toute erreur, on s'abstiendra de les choisir comme identificateur.
10° Les mots du langage et les identificateurs doivent être séparés les uns des autres par un ou plusieurs blancs.
Lecture.
Les lectures sont symbolisées par le mot READLN. C'est la procédure READLN qui transfère les nombres ou chaînes de caractères du clavier vers la mémoire centrale. Ceux-ci doivent respecter la forme des constantes de Pascal et doivent être séparés par un blanc au moins.
Le type de la constante donnée et celui de la variable d'accueil doivent correspondre selon la règle des assignations.
Pascal admet aussi la procédure READ (qui a le même effet que READLN sans passage à la ligne pour le prochain affichage) mais il s'est révélé à l'usage, que celle-ci était parfois source de problème et il est préférable de l'éviter.
Ecriture.
Les écritures se font de façon semblable aux lectures, à l'aide de la procédure WRITE. Les valeurs à afficher apparaîtront sur l'écran à la queue-leu-leu sur une seule ligne, parfois sans espacement entre elles.
Pour améliorer la lisibilité, on peut:
utiliser la procédure WRITELN qui force le passage à la ligne suivante pour le prochain affichage
faire usage des formats d'édition qui précisent le nombre de caractères à utiliser pour afficher chacun des résultats:
WRITE(valeur_entière : n) affiche la valeur entière sur n positions (insertion d'espacement à gauche du nombre si il y a trop peu de chiffres et ajustement automatique, si n est insuffisant)
WRITE(valeur_réelle) affiche le nombre en notation scientifique (x.xxxxxE+x précédé d'un espacement)
WRITE(valeur_réelle : n) affiche le nombre en notation scientifique sur n positions
WRITE(valeur_réelle : n1 : n2) affiche le nombre sur n1 positions avec n2 décimales (avec ajustement).
WRITE(chaîne : n) affiche la chaîne de caractère sur n positions (insertion d'espacement à gauche de la chaîne si il y a trop peu de caractères et ajustement automatique, si n est insuffisant)
Exemples:
Si la variable entière x contient 12345, (^ symbolise l'espacement)
WRITE(x) affiche 12345
WRITE(x:8) affiche ^^^12345
WRITE(x:2) affiche 12345
Si la variable réelle x contient 123.4567, (^ symbolise l'espacement)
WRITE(x) affiche ^1.23456E+2
WRITE(x:7) affiche ^1.2E+2
WRITE(x:8:2) affiche ^^123.46
WRITE(x:2) affiche 1.2E+2
Si la variable du type chaîne x contient 'AZERTY', (^ symbolise l'espacement)
WRITE(x) affiche AZERTY
WRITE(x:8) affiche ^^AZERTY
WRITE (x:3) affiche AZERTY
Manipulation de nombres.
Si la mathématique distingue plusieurs types de nombres directement manipulables par les langages informatiques, Pascal n'en reconnaît que deux: les types entier et réel.
Le type entier.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
entier age, note_de_français
Mais Pascal a subdivisé les entiers en 5 types pour mieux adapter le type aux valeurs que peuvent prendre une variable, et ce pour optimiser l'occupation de la mémoire.
Type Valeurs autorisées Occupation en mémoire
SHORTINT de -128 à +127 1 octet
BYTE de 0 à 255 1 octet
INTEGER de -32768 à +32767 2 octets
WORD de 0 à 65535 2 octets
LONGINT de -2147483648 à 2147483647 4 octets
Le type réel.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
réel taux_de_TVA, note_moyenne
Mais Pascal a subdivisé les réels en 4 types pour mieux adapter le type aux valeurs que peuvent prendre une variable, et ce pour optimiser l'occupation de la mémoire.
Type Valeurs autorisées Nombre de chiffres significatifs Occupation en mémoire
SINGLE de -1038 à 9,8 1038 7 chiffres 4 octets
REAL de -1038 à 9,8 1038 11 chiffres 6 octets
DOUBLE de -10308 à 10308 15 chiffres 8 octets
EXTENDED de -104932 à 9,8 104932 19 chiffres 10 octets
Il existe aussi le type COMP stocké sur 8 octets et offrant une gamme de nombres allant de -9,8 1018 à 9,8 1018 mais ne conservant que la partie entière du nombre.
Assignation.
Dans une assignation, le type de l'expression doit correspondre au type de variable de destination. Cette règle admet une seule exception: une variable réelle peut recevoir une valeur entière.
Evaluation des expressions arithmétiques.
Pascal respecte la même convention de priorité que l'arithmétique: les multiplications et les divisions (opérateurs * / DIV et MOD) sont effectuées en premier lieu, puis les additions et les soustractions (opérateurs + et -); lorsqu'une expression contient plusieurs opérateurs de même priorité, les opérations sont effectuées de gauche à droite. Pour modifier cet ordre, il suffit d'introduire des parenthèses.
Exemple: WRITELN(1/2*3) n'affichera pas la valeur de 1/6 mais bien de 3/2 car la division se fera avant la multiplication.
Type des opérandes et du résultat.
Les opérateurs +, - et * peuvent agir sur des opérandes réels ou entiers et le résultat est réel sauf si les deux opérandes sont entiers. L'opérateur / peut agir sur des entiers et des réels mais le résultat est toujours réel. Les opérateurs DIV et MOD ne peuvent être utilisés qu'avec des opérandes entiers et fournissent un résultat entier.
Constantes numériques.
Le type d'une variable est défini dans la partie déclarative du programme. C'est la forme d'écriture qui détermine le type d'une constante. Ainsi 50 est une constante entière, tandis que 3.1416 et 50.0 sont des constantes réelles car elles contiennent une partie fractionnaire.
Les constantes entières ne peuvent contenir que des chiffres décimaux (0 à 9) précédés éventuellement d'un signe + ou -.
Les constantes réelles doivent contenir en plus:
soit par une partie fractionnaire d'au moins un chiffre, séparée de la partie entière par un point:
+1.2 -56 0.01 0.0
soit une partie exposant sous forme d'une constante entière précédée par un E indiquant la puissance de 10 par laquelle il faut multiplier la valeur qui précède la lettre E :
1E4 vaut 1 * 104 = 10000.0 6E-2 vaut 6 * 10-2 = 0.06
soit les deux:
3.14E+4 vaut 3.14 * 104 = 31400.0
Dans ce cas et si il n'y a qu'un seul chiffre non nul dans la partie entière, on parle de notation scientifique.
Fonctions mathématiques.
Notation mathématique Fonction Pascal Type de x Type du résultat Signification
|x| ABS(x) Entier ou réel Type de x Valeur absolue de x
x2 SQR(x) Entier ou réel Type de x Carré de x
x1/2 SQRT(x) Entier ou réel Réel Racine carré de x
sin x SIN(x) Entier ou réel Réel sin de x (x en radians)
cos x COS(x) Entier ou réel Réel cos de x (x en radians)
arctg x ARCTAN(x) Entier ou réel Réel Angle (en radians) dont la tangente vaut x
ex EXP(x) Réel Réel Exponentielle de x
ln x LN(x) Réel Réel Logarithme népérien de x
[x] TRUNC(x) Réel Entier Partie entière de x
[x] INT(x) Réel Réel Partie entière de x
arrondi de x ROUND(x) Réel Entier Entier le plus proche de x
décimal de x FRAC(x) Réel Réel Partie décimale de x
On notera l'absence des fonctions tg x et xy qui se traduiront, en employant les formules de mathématique adéquates, respectivement par SIN(x)/COS(x) et EXP(y*LN(x)).
Manipulation de chaînes de caractères.
Nous avons déjà vu précédemment un exemple de ce type de problème et il est évidemment nécessaire dans la vie professionnelle de manipuler des données autres que numériques (noms de clients, d'articles vendus, ...). Celles-ci sont alors dites du type alphabétique. Lorsqu'elles contiennent en plus des chiffres, des symboles tels que (+, =, §, &, ...), nous parlerons de données alphanumériques.
Si la manière de coder en binaire des nombres entiers ou réels se fait d'une manière assez naturelle par un changement de base de numération, par contre la manière de stocker des caractères en binaire est totalement arbitraire. Ainsi, l'ANSI (American National Standard Institute) a défini un codage des caractères sur deux octets (ou bytes). Ce code porte le nom de code ASCII (American Standard Code for Information Interchange) et respecte, entre autres, l'ordre alphabétique. Comme deux octets permettent de stocker 256 valeurs différtentes, nous disposerons de 256 caractères différents.
Il existe deux types de variables alphanumériques: les caractère et chaîne.
Le type caractère.
Le type caractère est réservé aux variables contenant un seul caractère (lettre, symbole, ponctuation, ...) et il est possible d'en déterminer les successeur/prédécesseur/position dans la liste des codes ASCII. Ainsi le successeur de "B" est "C", son prédécesseur "A" et son code ASCII 66.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
caractère lettre, initiale
qui se traduira en Pascal par:
VAR lettre, initiale: CHAR;
Le type chaîne.
Les variables du type chaîne peuvent contenir
soit une suite de caractères (un mot, une phrase, ...),
soit un caractère (mais dont, par exemple, il est impossible de déterminer le suivant),
soit aucun caractère (on parle alors de chaîne vide).
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
chaîne nom, adresse
qui se traduira en Pascal par:
VAR nom, adresse: STRING;
Cependant, Pascal permet aussi de préciser la taille maximale (25 dans l'exemple ci-dessous) que pourra avoir la chaîne qui sera affectée à la variable:
VAR nom, adresse: STRING[25];
En l'absence de précision de longueur, Pascal réserve automatiquement la taille maximale, à savoir 255 caractères.
Assignation.
Dans une assignation, le type de l'expression doit correspondre au type de variable de destination. C'est ainsi que les assignations suivantes sont illégales:
initiale <-- "Einstein"
initiale <-- ""
avec la variable initiale déclarée du type caractère.
Par contre, si cette variable a été déclarée du type chaîne, celles-ci sont tout à fait légales.
Les fonctions alphanumériques.
Notation en LDA Fonction Pascal Type du résultat Signification
|Ch| LENGTH(Ch) Entier Nombre de caractères dans Ch
Ch1 // Ch2 CONCAT(Ch1,Ch2)
Ch1 + Ch2 Chaîne Concaténation (juxtaposition) de Ch1 et Ch2
Chi<--j COPY(Ch, i, j-i+1) Chaîne Extraction, dans Ch, des caractères de la postion i à la position j
Chi COPY(Ch, i, 1)
Ch[i] Chaîne
Caractère Extraction, dans Ch, du caractère à la postion i
Page précédente.
________________________________________
© 1996 JMy
________________________________________
L'ALTERNATIVE.
________________________________________
3. STRUCTURES DE CHOIX.
3.1. Introduction
Les algorithmes décrits dans le chapitre précédent étaient très simples et une calculatrice aurait suffi pour leur exécution. En effet, pour l'instant, nous sommes seulement en mesure de décrire une suite d'opérations, chacune devant être exécutée une et une seule fois. Nous ne pouvons par exemple utiliser notre algorithme de calcul d'intérêt avec différents taux d'intérêt. Pour faire cela, il nous faut introduire de nouvelles structures.
Il a été démontré que pour représenter n'importe quel algorithme, il faut disposer des trois possibilités suivantes:
• la structure de séquence qui indique que les opérations doivent être exécutées les unes après les autres
• la structure de choix qui indique quel ensemble d'instructions doit être exécuté suivant les circonstances
• la structure de répétition qui indique qu'un ensemble d'instructions doit être exécuté plusieurs fois.
Jusqu'à présent, nous avons décrit la structure de séquence. Nous décrirons dans ce chapitre les structures de choix: l'alternative et le choix multiple.
3.2. La structure alternative.
Voici les règles d'un jeu très simple: deux joueurs A et B se cachent la main droite derrière le dos. Chacun choisit de tendre un certain nombre de doigts (de 0 à 5), toujours derrière le dos. Les deux joueurs se montrent la main droite en même temps. Si la somme des nombres de doigts montrés est paire, le premier joueur a gagné, sinon c'est le second. Le problème est de faire prendre la décision par l'ordinateur.
Exprimé en français, l'algorithme se présente comme suit:
- prendre connaissance du nombre de doigts de A
- prendre connaissance du nombre de doigts de B
- calculer la somme de ces deux nombres
- si la somme est paire, A est le gagnant
- si la somme est impaire, B est le gagnant.
Pour déterminer si un nombre est pair ou impair, il suffit de calculer le reste de la division par 2 (.. modulo 2): il vaut 0 dans le premier cas et 1 dans le second.
En langage de description d'algorithme, l'algorithme s'écrira:
entier na,nb,reste
lire na,nb
reste <-- (na + nb) mod 2
si reste = 0 alors écrire "Le joueur A a gagné."
sinon écrire "Le joueur B a gagné."
fsi
écrire "Bravo pour le gagnant!"
REMARQUES
(1) La structure alternative se présente en général sous la forme
si expression alors première séquence d'instructions
sinon deuxième séquence d'instructions
fsi
où expression conditionne le choix d'un des deux ensembles d'instructions. Cette expression peut être soit vraie soit fausse. Si l'expression est vraie, la première séquence d'instruction sera exécutée et la seconde sera ignorée; si l'expression est fausse, seule la seconde séquence d'instructions sera effectuée.
Le mot sinon indique où se termine la première séquence d'instructions et où commence la seconde. Le mot fsi (abrégé de "fin de si") indique où se termine la seconde séquence d'instructions.
(2) Dans certains cas, lorsque l'expression est fausse, aucune instruction ne doit être exécutée. La condition s'exprime alors plus simplement sous la forme:
si expression alors séquence d'instructions
fsi
(3) Quelle que soit la séquence choisie et exécutée, les instructions qui suivent fsi seront exécutées.
(4) Chacune des séquences d'instructions d'un si ... fsi peut contenir des si...fsi. On dit alors que les structures sont imbriquées.
(5) Pour faire apparaître plus clairement la structure, on écrit les séquences d'instructions légèrement en retrait des mots-clefs (si, alors, sinon, fsi). On dit qu'on indente le texte de l'algorithme.
Considérons l'exemple suivant écrit sans indentation et où les fins de si (fsi) ne sont pas indiquées:
si a > 0 alors
si b > 0 alors
c <-- a+b
sinon
c <-- a-b
Cet algorithme peut aussi bien être une mauvaise écriture de:
(2.1)
si a > 0 alors si b > 0 alors c <-- a+b
sinon c <-- a-b
fsi
fsi
que de:
(2.2)
si a > 0 alors si b > 0 alors c <-- a+b
fsi
sinon c <-- a-b
fsi
Dans (2.1), si a est négatif, aucun traitement n'est effectué et dans (2.2) si a est négatif, c vaut a-b.
3.3.Expressions logiques et variables booléennes.
Expressions logiques.
Les expresssions logiques se construisent à partir d'affirmations qui sont soit vraies soit fausses. Une condition telle que "reste=0" n'impose pas à la variable reste d'être nulle. Il ne s'agit en effet pas d'une assignation mais de l'expression d'une condition qui ne sera réalisée (et n'aura donc la valeur "vrai") que si la variable reste a été assignée à 0. Dans les autres cas, cette condition prendra la valeur "faux".
On peut combiner des affirmations à l'aide d'opérateurs logiques ,à savoir: ou, et et non, les deux premiers portent sur deux opérandes et le dernier sur un seul. Il est évident que ces opérandes ne peuvent prendre que deux valeurs: vrai ou faux.
Par définition:
op1ou op2 n'a la valeur faux que si les deux opérandes ont la valeur faux, sinon l'expression a la valeur vrai.
op1et op2 n'a la valeur vrai que si les deux opérandes ont la valeur vrai, sinon l'expression a la valeur faux.
non opérande a la valeur vrai si l'opérande a la valeur faux et inversement.
Supposons par exemple qu'on exécute les assignations suivantes:
a <-- 1
a <-- 1
b <-- 2
c <-- 3
alors
(b > 8) ou (c < 1) a la valeur faux
(b > 0) ou (c > 1) a la valeur vrai
(b > 9) ou (c > 1) a la valeur vrai
(b > a) et (c > b) a la valeur vrai
(b > a) et (c < 0) a la valeur faux
non (c < a) a la valeur vrai
non ((b > a) et (c > b)) a la valeur faux
((b > a) et (c > b)) ou (a < 0) a la valeur vrai
Les relations d'égalité ou d'inégalité ci-dessus font comparer des nombres ou des variables à valeur numérique.
On peut également comparer des lettres: l'affirmation "b" précède "x" dans l'ordre alphabétique a pour valeur vrai. De même, si la variable car contient le caractère "v", l'affirmation car suit "w" dans l'ordre alphabétique a pour valeur faux.
Comme nous l'avons déjà vu, pour ramener des nombres à la seule représentation que connaissent les ordinateurs (le binaire), il suffit de faire un changement de base et passer de la base 10 à la base 2. Par contre, il n'existe pas de manière naturelle pour représenter un caractère sous forme binaire. On associe donc arbitrairement un code à chaque caractère connu par l'ordinateur, à savoir les signes du clavier (lettres, chiffres décimaux, signes de ponctuation et caractères spéciaux) et les caractères de contrôle. Le code importe peu mais l'ordre de classement (collating sequence) qu'il définit est par contre très important. Le code ASCII, le plus fréquemment utilisé sur les micro-ordinateurs, respecte l'ordre croissant des caractères "0", "1", ..., "9" et l'ordre alphabétique des 26 lettres de l'alphabet, et ceci sans mêler aucun autre caractère dans ces séquences. Afin de simplifier les notations, on convient d'utiliser les symboles "<" pour signifier "précède dans la collating sequence", "" pour "suit dans la collating sequence ou est égal",...
Variables booléennes.
Il est possible de stocker la valeur d'une expression logique dans une variable (comme le résultat d'une opération arithmétique est stocké dans une variable numérique). Cette variable ne peut prendre que les valeurs vrai et faux. Ces variables sont appelées variables logiques ou booléennes.
En LDA, elles se déclarent comme ceci:
booléen: OK, pair
et en Pascal par:
VAR BOOLEAN: OK, pair;
El l'assignation d'une variable booléenne se fait de la manière suivante:
OK <-- Vrai
3.4. Exercices.
Pour voir les exercices et les solutions, cliquez ici.
3.5. L'alternative en Pascal.
En Pascal, l'exemple du jeu décrit en 2 se traduit par:
PROGRAM Jeu;
VAR NA, NB, Reste:INTEGER;
BEGIN
WRITE('Introduisez le nombre de doigts montrés par le joueur A');
READLN(NA);
WRITE('Introduisez le nombre de doigts montrés par le joueur B);
READLN(NB);
RESTE := (NA + NB) MOD 2;
IF RESTE=0 THEN WRITELN('Le joueur A a gagné.')
ELSE WRITELN('Le joueur B a gagné.');
WRITELN('Bravo pour le gagnant!')
END.
La structure alternative se traduit presque mot à mot de LDA en Pascal: si se traduit par IF, alors par THEN et sinon par ELSE. Les séquences d'instructions à exécuter dans le cas où la condition est vraie (cette séquence suit le mot alors) et dans le cas où la condition est fausse (cette séquence suit le mot sinon) doivent être encadrées par le mots BEGIN et END qui en indiquent le début et la fin. Dans le cas où ces séquences se réduisent à une seule instruction, les mots BEGIN et END peuvent être omis (comme dans l'exemple ci-dessus).
Ainsi, en ajoutant le message WRITELN('Bravo pour le gagnant!') juste après avoir indiqué le nom du vainqueur, nous serions obligés d'utiliser les BEGIN et END:
PROGRAM Jeu;
VAR NA, NB, Reste:INTEGER;
BEGIN
WRITE('Introduisez le nombre de doigts montrés par le joueur A');
READLN(NA);
WRITE('Introduisez le nombre de doigts montrés par le joueur B);
READLN(NB);
RESTE := (NA + NB) MOD 2;
IF RESTE=0 THEN BEGIN
WRITELN('Le joueur A a gagné.');
WRITELN('Bravo pour le gagnant!')
END
ELSE BEGIN
WRITELN('Le joueur B a gagné.');
WRITELN('Bravo pour le gagnant!')
END
END.
La forme:
si expression alors séquence d'instructions
sinon séquence d'instructions
fsi
se traduit en Pascal par:
IF expression THEN BEGIN
séquence d'instructions
END
ELSE BEGIN
séquence d'instructions
END;
Il est interdit de mettre un ; après le END indiquant la fin de la séquence d'instructions qui suit le THEN.
Et la forme:
si expression alors séquence d'instructions
fsi
se traduit en Pascal par:
IF expression THEN BEGIN
séquence d'instructions
END;
Remarques:
(1) La traduction en Pascal de (2.1) est:
IF A>0 THEN IF B>0 THEN C:=A+B
ELSE C:=A-B;
En effet, en Pascal, le ELSE se rapporte toujours au IF ... THEN le plus proche.
Pour traduire (2.2), il faut soit modifier les alternatives pour que le sinon se rapporte au alors le plus proche:
si NOT (a=0) alors c <-- a - b
sinon si b > 0 alors c <-- a + b
fsi
fsi
ou faire apparaître que le sinon de la première condition est absent:
IF A>0 THEN IF B>0 THEN C:=A+B
ELSE
ELSE C:=A-B;
(2) Le programme de jeu listé ci-dessus a un gros défaut: lorsque le premier joueur tape au clavier son nombre stocké dans NA, celui-ci reste affiché et le deuxième joueur peut choisir NB de façon à être certain de gagner.
Il existe deux remèdes à ce problème. La première consiste à effacer l'écran après que A ait tapé son nombre. Ceci se fait en Pascal par l'instruction CLRSCR qui nécessite le chargement d'une librairie. Celui-ci est activé par la ligne: USES Crt; écrite juste en-dessous de PROGRAM Jeu;
La deuxième solution est de saisir le caractère (le chiffre dans ce cas) tapé au clavier sans l'afficher. Cela se fait grâce à la fonction READKEY qui scrute en permanence le clavier et qui capte la touche qui vient d'être enfoncée. Cependant cette fonction ne peut être employée que pour l'affectation à une variable de type caractère.
Dans ce cas notre programme deviendrait:
PROGRAM Jeu;
USES Crt;
VAR NA, NB, Reste, Err : INTEGER;
A, B : CHAR;
BEGIN
CLRSCR;
WRITE('Introduisez le nombre de doigts montrés par le joueur A');
A:=READKEY;
VAL(A, NA, Err);
IF Err<>0 THEN WRITELN('Erreur de format numérique!')
ELSE BEGIN
WRITE('Introduisez le nombre de doigts montrés par le joueur B);
B:=READKEY;
VAL(B, NB, Err);
IF Err<>0 THEN WRITELN('Erreur de format numérique!')
ELSE BEGIN
RESTE := (NA+NB) MOD 2;
IF RESTE=0 THEN WRITELN('Le joueur A a gagné.')
ELSE WRITELN('Le joueur B a gagné.');
WRITELN('Bravo pour le gagnant!')
END
END.
La procédure VAL(Chaine, Nombre, Erreur) permet de convertir Chaine en sa valeur numérique.qui sera stockée dans Nombre. La variable Erreur contiendra la valeur 0 si la conversion s'est faite sans problème ou la position du premier caractère inadéquat. Erreur doit être du type INTEGER, Chaine du type STRING ou CHAR et Nombre d'un type numérique (entier ou réel).
3.6. Le choix multiple.
Supposons que l'on veuille demander à l'utilisateur de choisir dans un menu une des 3 possibilités offertes. Le choix présenté ne se limite pas à une alternative (soit - soit).
Nous nous trouvons en présence d'un choix multiple qui s'écrit en LDA:
entier i
lire i
selon que
i=1 faire bloc1
oq i=2 faire bloc2
oq i=3 faire bloc3
autrement écrire "Mauvais choix"
fselon
Le mot oq est l'abréviation de "ou que".
La structure de choix multiple peut, comme l'alternative, prendre deux formes:
selon que
première expression logique faire première séquence d'instructions
oq deuxième expression logique faire deuxième séquence d'instructions
...
oq n ème expression logique faire n ème séquence d'instructions
autrement (n+1) ème séquence d'instructions
fselon
et
selon que
première expression logique faire première séquence d'instructions
oq ...
oq n ème expression logique faire n ème séquence d'instructions
fselon
La première forme généralise le si ... alors ... sinon ... fsi, la seconde le si ... alors ... fsi.
Si la i ème expression logique a la valeur vrai, la i ème séquence d'instructions est exécutée puis il y a passage aux instructions qui suivent le mot fselon. Si toutes les expressions logiques ont la valeur faux, on exécute dans le premier cas la séquence d'instructions qui suit le mot autrement , dans le deuxième cas on passe directement à ce qui suit fselon.
Afin d'éviter toute ambiguïté, on exige que les différentes expressions logiques soient mutuellement exclusives.
3.7. Le choix multiple en Pascal.
La traduction de selon que ...fselon en Pascal n'est pas très commode parce que la structure du choix multiple y est très restrictive: Il est seulement possible de traduire un selon que ... fselon pour lequel l'expression prend les valeurs prises par une variable de type énuméré (dont les valeurs appartiennent à un ensemble; par exemple entier, caractère).
La forme générale du choix multiple est:
CASE <expression> OF
valeur1: première séquence d'instructions;
valeur2: deuxième séquence d'instructions;
...
valeurN: Nème séquence d'instructions;
ELSE (N+1) ème séquence d'instructions;
END;
Il est à noter que les différentes séquences d'instructions sont délimitées par BEGIN et END qui peuvent seulement être omis si une séquence se résume à une seule instruction.
Pour traduire en Pascal un selon que plus général, il faut utiliser des IF imbriqués. Par exemple,
...
lire x
selon que
x<0 faire écrire x,"est négatif"
oq x=0 faire écrire x,"est nul"
autrement écrire x,"est positif"
fselon
...
se traduit par:
...
READLN(x);
IF x<0 THEN WRITELN(x, ' est négatif.')
ELSE IF x=0 THEN WRITELN(x, ' est nul.')
ELSE WRITELN(x, ' est positif.');
3.8. Exercices.
1) Lire 3 nombres a, b et c. Déterminer si l'équation ax+by+c=0 représente l'équation d'une droite parallèle à l'un des axes (et si oui, lequel) ou une droite oblique par rapport aux axes. Tenir compte du fait qu'on pourrait avoir a=b=0.
2) Lire 3 nombres a, b et c où a est différent de 0. Déterminer si la parabole d'équation y=ax²+bx+c coupe l'axe des x en 0, 1 ou 2 points.
3) Demander et lire les valeurs de R en Ohm, I en Ampère et t en seconde. Déterminer un algorithme qui proposerait de calculer la différence de potentiel, la puissance et l'énergie.
Page précédente.
________________________________________
© 1996 JMy
________________________________________
LES STRUCTURES REPETITIVES.
________________________________________
4. STRUCTURES REPETITIVES.
4.1. Introduction.
L'intérêt d'utiliser un ordinateur n'apparaît clairement que lors de la manipulation de données nombreuses ou traitées de manière répétitive.
Exemple 1: Chercher dans une liste de noms et d'adresses, l'adresse d'une personne à partir de son nom. Le nombre de fois qu'il faudra comparer le nom donné aux noms de la liste est dans ce cas inconnu.
Exemple 2 : Calculer la N ème puissance entière d'un nombre x par multiplications successives du nombre par lui-même. Ici, le nombre de répét
où j ai trouve ceci qui a mon avis peut t aider.
________________________________________
Algorithmique et langage Pascal.
________________________________________
• Bref historique de l'informatique.
• Introduction à l'algorithmique.
• La séquence.
• L'alternative.
• La répétitive.
________________________________________
Page d'accueil.
________________________________________
________________________________________
Historique.
________________________________________
1. INTRODUCTION.
1.1. Introduction.
Les ordinateurs n'existaient pas voici seulement 50 ans et déjà ils ont envahi tous les secteurs de la vie sociale: comme amélioration d'outils anciens rendus automatiques (caisses enregistreuses, machines à calculer, machines à laver, ...) ou sous la forme d'une machine mystérieuse capable de dialoguer avec l'homme et qui paraît douée d'intelligence (robots, jeux électroniques, ...).
En fait, un ordinateur n'est qu'une machine capable d'exécuter automatiquement une série d'opérations simples qu'on lui a demandé de faire. L'intérêt de l'ordinateur est sa capacité de manipuler rapidement et sans erreur un grand nombre d'informations: mémoriser des quantités numériques ou alphabétiques, rechercher une quantité mémorisée, comparer ou classer des informations, ....
Pour résoudre un problème à l'aide d'un ordinateur, il faut:
1. analyser ce problème: définir avec précision les résultats à obtenir, les informations dont on dispose, ...
2. déterminer les méthodes de résolution: il s'agit de déterminer la suite des opérations à effectuer pour obtenir à partir des données la solution au problème posé. Cette suite d'opérations constitue un algorithme. Parmi tous les algorithmes fournissant la solution, il faudra choisir le plus efficace.
3. formuler l'algorithme définitif: cette étape doit faciliter la résolution sur ordinateur par l'expression de l'algorithme dans un formalisme adéquat (langage de description d'algorithme: LDA, organigramme, arbre programmatique, ...).
4. traduire l'algorithme dans un langage de programmation adapté.
Comme nous nous limiterons à des problèmes posés d'une manière non ambigüe, la première étape pourra généralement être négligée et nous nous concentrerons sur la rédaction correcte d'algorithmes et sur l'écriture de programmes efficaces (dont il est facile de vérifier qu'ils sont corrects, qui peuvent être lus, compris, modifiés sans difficulté et qui reflètent la structure de l'algorithme de résolution). Une manière d'atteindre ce but est de décomposer un problème complexe en plusieurs problèmes plus simples.
1.2. Historique.
Il est difficile de faire commencer l'histoire des ordinateurs à une date bien précise. Comme l'ordinateur est un outil d'aide au traitement de l'information, nous citerons les principales innovations qui ont facilité ou automatisé le calcul (les nombres étant longtemps la principale source d'information).
L'idée d'utiliser des supports matériels pour manipuler les nombres d'une manière répétitive est très ancienne. Vers 2500 avant J-C, apparaissait déjà le boulier qui permettait d'effectuer des opérations arithmétiques élémentaires. Six siècles plus tard, une tablette babylonnienne en argile (1900-1600 avant J-C) permettra à partir de deux côtés d'un triangle rectangle, de trouver le troisième.
Les premiers dispositifs mécaniques d'aide au calcul apparaissent seulement à la Renaissance: en 1642, Blaise Pascal invente une machine permettant d'additionner et de soustraire, pour simplifier la tâche de son père, commissaire pour la levée des impôts. En 1671, le mathématicien allemand Gottfried Wilhem Leibniz conçoit une machine permettant les quatre opérations arithmétiques. Jusqu'au XIX ème siècle, ces machines seront copiées sans qu'on y apporte d'améliorations significatives.
Au cours du XIX ème siècle, quelques nouvelles machines capables d'effectuer les quatre opérations élémentaires apparaissent: l'arithmomètre (1820) de Thomas de Colmar conçu à partir des idées de Leibniz, la machine à curseur du suédois Odhner (1875), le comptomètre à clavier de l'américain Felt (1885). Le développement des techniques de réalisation d'automates (horloges astronomiques, canard de Vaucanson, capable de faire les mouvements du vol, de manger, de boire et ... de déféquer) allait être stimulé par celui des industries naissantes, en particulier de l'industrie textile pour laquelle Jacquard, perfectionnant en 1801 une invention de Vaucanson (1745) crée la carte perforée destinée à commander des métiers à tisser.
Avec plus d'un siècle d'avance, l'anglais Charles Babbage propose en 1822 sa "machine différentielle" permettant d'élever un nombre à la puissance n et en 1833, sa "machine analytique" où on retrouve les trois éléments essentiels de nos calculateurs: un organe d'introduction des données (cartes perforées ou cadrans), un organe de sortie des résultats (cartes perforées, cadrans ou papier) et un organe de contrôle et de calcul qui utilisait des dispositifs mécaniques. Une mémoire était réalisée par l'intermédiaire de roues dentées tandis que les opérations à effectuer étaient introduites à l'aide de cartes perforées. La machine de Babbage, limitée par les possibilités techniques de l'époque (elle aurait demandé plus de 50000 pièces mobiles), restera cependant à l'état de plans, et ses idées seront presque toutes "redécouvertes" indépendamment dans les années 40.
L'ingénieur américain Herman Hollerith développe pour le recensement de 1890 une machine électromécanique, plus élémentaire que celle de Babbage, capable de trier des cartes perforées et de les compter. Les opérations étaient toujours mécaniques mais les commandes étaient réalisées par l'intermédiaire de relais électromagnétiques, actionnés par des impulsions électriques obtenues par contact entre des aiguilles et un bac de mercure sur lequel reposaient les cartes perforées. Hollerith fonde en 1896 la "Tabulating Machine Company" reprise en 1911 par Thomas Watson qui crée en 1924 la firme IBM (International Business Machine).
La guerre 1940-1945, suite à l'effort de plusieurs pays, va donner l'impulsion décisive à la naissance des premiers ordinateurs dignes de ce nom:
- les Z2 et Z3 de l'allemand Zuse prêts en 1939 et 1941
- la série des "Automatic Sequence Controlled Computer Mark" conçus par Howard Aiken. Le Mark I fonctionnera en 1944. Les temps de calcul étaient de 1/3 de seconde pour une addition, de 6 secondes pour une multiplication et de 11 secondes pour une division. Les organes de commande et de calcul utilisaient des relais électromagnétiques.
- l'ENIAC (1943-1946), destiné initialement au calcul de tables d'artillerie, de Prosper Eckert et John Mauchly, utilisait des tubes à vide. Les temps de calcul sont divisés par 1000 mais cette machine qui comporte 18000 tubes à vide, 1500 relais, 10000 condensateurs et 70000 résistances, prend une place considérable (270 m3 - 30 tonnes) et consomme 150 kw. Il fallait changer le cablage et les switches pour modifier le programme. L'ENIAC était une machine décimale dont les entrées-sorties et la mémoire auxiliaire étaient réalisées par cartes perforées.
Dès 1944, des théoriciens de Princeton tels que J.Von Neumann, A.Buks et H.Goldstine se penchent sur les problèmes logiques posés par la réalisation des ordinateurs et établissent les bases des futurs développements, notamment l'utilisation du binaire, les notions de programmes stockés en mémoire, d'ordinateurs à usages multiples ...
L'EDSAC (Cambridge University 1949) et l'EDVAC (University of Pennsylvania 1950) utilisent des mémoires à ligne de retard à mercure (inventées par Eckert) qui permettent de stocker programmes et nombres sous forme digitale.
Vers 1951, apparaissent le premier UNIVAC (Eckert et Mauchly) utilisant des diodes à cristal et des bandes magnétiques comme mémoire de masse et l'IAS (Von Neumann) où une mémoire à tube de Williams (1947) permet l'accès parallèle à tous les bits. C'est une machine binaire où les instructions modifiables comportent une adresse.
Entre 1953 et 1960 apparaissent de nombreuses innovations (2ème génération d'ordinateurs): les tores de ferrite utilisés comme mémoire (d'après les travaux de J.W. Forrester en 1951 au MIT), les circuits imprimés, les disques magnétiques, les transistors (inventés en 1948),... Les vitesses de traitement et les capacités de mémoire augmentent considérablement. Les "ordinateurs" (mot inventé en 1953 par M. Perret pour traduire "computer") acquièrent une plus grande sécurité de fonctionnement et une facilité d'emploi permettant d'effectuer des tâches de plus en plus vastes pour un nombre plus important d'utilisateurs. La production en série commence et les coûts de production diminuent rapidement.
En 1963, les circuits imprimés sont remplacés par des circuits intégrés (3ème génération). Les équipements se miniaturisent et on voit apparaître les mini- et micro-ordinateurs. Les vitesses d'exécution diminuent: quelques dizaines de picosecondes (1 picos=.000000000001 s=10-12s).
L'ordinateur commence à se banaliser. En 1963, il n'est déjà plus un matériel extraordinairement coûteux, même s'il est encore très cher. Il n'est plus en la possession exclusive de quelques centres de recherche aux énormes budgets, déjà de nombreuses entreprises le possèdent. Il est devenu fiable, rapide et performant.
En prenant comme référence la multiplication de deux nombres tenant chacun dans un mot, on constate une division du temps de calcul par 100 tous les 7 ans. Cette amélioration des performances s'accompagne d'une diminution des prix, d'un facteur 100 tous les 10 ans environ. Cette diminution continue aujourd'hui où, pour quelques dizaines de milliers de francs, on trouve des ordinateurs, dits microordinateurs, qui, en dépit de leur petite taille, sont bien plus puissants que ne le fut,il n'y a guère plus de 30 ans, l'ENIAC, malgré son poids de plusieurs tonnes. C'est que la microélectronique a entraîné à son tour, au cours des ans, une diminution considérable de la taille des ordinateurs et, ce qui est bien plus curieux, selon une tendance voisine de celles que nous avons observées dans les autres domaines. Les unités centrales réalisées sous de très faibles volumes qui forment ce qu'on appelle les microprocesseurs ont en effet été largement diffusées, en 1976, lorsque fut mise au point la fabrication de masse des composants de très haute intégration (Very Large Scale Integration ou VLSI). Cette technologie, encore aujourd'hui en pleine évolution, a permis par exemple de construire les unités centrales des IBM 4300 avec des plaquettes de silicium de 20 millimètres carrés, ayant 704 circuits logiques.
Notons d'ailleurs qu'il ne faut pas confondre microprocesseur et microordinateur. Un microordinateur est construit autour d'un microprocesseur, mais les unités d'entrée et de sortie, écrans de visualisation, claviers, imprimantes, ..., ne pouvant être miniaturisés, le volume d'un microordinateur est essentiellement occupé par ces dispositifs qui en sont la partie la plus coûteuse.
L'amélioration du rapport prix/performance a permis aussi de trouver de nouveaux utilisateurs et de construire des ordinateurs mieux adaptés aux besoins des utilisateurs. C'est ainsi que la gestion (paye et facturation, applications administratives et bancaires, réservations, ...) devient le domaine principal d'utilisation des ordinateurs.
1.3. Les langages.
Parallèlement aux modifications techniques, les moyens de communiquer à l'ordinateur ce qui lui est demandé de faire ont fortement changé. On appelle langages de première génération les langages-machine ou "codes-machine" utilisés initialement (1945). Un programme en "code-machine" est une suite d'instructions élémentaires, composées uniquement de 0 et de 1, exprimant les opérations de base que la machine peut physiquement exécuter: instructions de calcul (addition, ...) ou de traitement ("et" logique, ...), instructions d'échanges entre la mémoire principale et l'unité de calcul ou entre la mémoire principale et une mémoire externe, des instructions de test qui permettent par exemple de décider de la prochaine instruction à effectuer.
Voici en code machine de l'IBM 370 l'ordre de charger 293 dans le registre "3":
01011000 0011 00000000000100100100
=charger =3 =293
Ce type de code binaire est le seul que la machine puisse directement comprendre et donc réellement exécuter. Tout programme écrit dans un langage évolué devra par conséquent être d'abord traduit en code-machine avant d'être exécuté.
La deuxième génération est caractérisée par l'apparition de langages d'assemblage (1950) où chaque instruction élémentaire est exprimée de façon symbolique. Un programme dit "assembleur" assure la traduction en code exécutable. L'instruction de l'exemple précédent s'écrira:
constante X = 293 charger X R3
La troisième génération débute en 1957 avec le 1er langage dit évolué: FORTRAN (acronyme de mathematical FORmula TRANslating system). Apparaissent ensuite ALGOL (ALGOrithmic Language en 1958), COBOL (COmmon Business Oriented Language en 1959), BASIC (Beginner's All-purpose Symbolic Instruction Code en 1965), Pascal (1968), ... Les concepts employés par ces langages sont beaucoup plus riches et puissants que ceux des générations précédentes et leur formulation se rapproche du langage mathématique. Il existe deux méthodes pour les rendre exécutables:
- la compilation: l'ensemble du programme est globalement traduit par un autre programme appelé compilateur et le code-machine produit est optimisé. Ce code-machine est ensuite exécuté autant de fois qu'on le veut.
- l'interprétation: un programme (interpréteur) décode et effectue une à une et au fur et à mesure les instructions du programme-source.
La quatrième génération qui commence au début des années 80 devait mettre l'outil informatique à la portée de tous, en supprimant la nécessité de l'apprentissage d'un langage évolué. Ses concepts fondamentaux sont "convivialité" et "non-procéduralité" (il suffit de "dire" à la machine ce qu'on veut obtenir sans avoir à préciser comment le faire). Cet aspect a été rencontré avec les langages du type Visual qui prennent en charge l'élaboration de l'interface graphique.
Page précédente.
________________________________________
Introduction.
________________________________________
1. ALGORITHMES.
1.1. Notion d'algorithme.
a-Définition.
Certains voient, à tort, dans l'ordinateur une machine pensante et intelligente, capable de résoudre bien des problèmes. En fait, celui-ci ne serait capable de rien si quelqu'un (le programmeur en l'occurence) ne lui avait fourni la liste des actions à exécuter. Cette description doit être faite de manière non ambigüe car il ne faut pas s'attendre à la moindre interprétation des ordres fournis. Ils seront exécutés de manière purement mécanique.
De plus, les opérations élémentaires que peut exécuter un ordinateur sont en nombre restreint et doivent être communiquées de façon précise dans un langage qu'il comprendra. Le problème principal de l'utilisateur est donc de lui décrire la suite des actions élémentaires permettant d'obtenir, à partir des données fournies, les résultats escomptés. Cette description doit être précise, envisager le moindre détail et prévoir les diverses possibilités de données.
Cette marche à suivre porte le nom d'algorithme dont l'Encyclopaedia Universalis donne la définition suivante:
" Un algorithme est une suite finie de règles à appliquer dans un ordre déterminé à un nombre fini de données pour arriver, en un nombre fini d'étapes, à un certain résultat, et cela indépendamment des données. "
Le mot algorithme provient du nom d'un célèbre mathématicien arabe de la première moitié du IXe siècle: Muhammad ibn Musa al Khwarizmi.
Le rôle de l'algorithme est fondamental. En effet, sans algorithme, il n'y aurait pas de programme (qui n'est jamais que sa traduction dans un langage compréhensible par l'ordinateur). De plus, les algorithmes sont fondamentaux en un autre sens: ils sont indépendants à la fois de l'ordinateur qui les exécute, des langages dans lequel ils sont énoncés et traduits.
b-Exemple.
Calcul de l'intérêt et de la valeur acquise par une somme placée pendant un an à intérêt simple.
L'énoncé du problème indique
les données fournies: deux nombres représentant les valeurs de la somme placée et du taux d'intérêt
les résultats désirés: deux nombres représentant l'intérêt fourni par la somme placée ainsi que la valeur obtenue après placement d'un an.
Il nous faut maintenant décrire les différentes étapes permettant de passer des donnés aux résultats. Nos connaissances générales nous permettent d'exprimer cette règle:
"Pour obtenir l'intérêt fourni par la somme, il suffit de multiplier la somme par le taux d'intérêt divisé par cent; la valeur acquise s'obtient en additionnant ce dernier montant et la somme initiale."
c-Méthodologie.
Dans cet exemple simple apparaissent les trois étapes qui caractérisent la résolution d'un problème sur ordinateur:
comprendre la nature du problème posé et préciser les données fournies ("entrées" ou "input" en anglais)
préciser les résultats que l'on désire obtenir ("sorties" ou "output" en anglais)
déterminer le processus de transformation des données en résultats.
Ces trois étapes ne sont pas indépendantes et leur ordre peut être modifié.
Si les résultats fournis par l'ordinateur ne sont pas corrects, c'est qu'une erreur s'est glissée soit dans l'analyse du problème, soit dans la mise au point de l'algorithme, soit dans sa traduction en langage de programmation car l'ordinateur ne fait qu'exécuter scrupuleusement les opérations demandées.
1.2. Formalisation de l'algorithme.
a- En français .
L'exemple décrit ci-dessus deviendrait:
(1) prendre connaissance de la somme initiale et du taux d'intérêt
(2) multiplier la somme par le taux; diviser ce produit par 100; le quotient obtenu est l'intérêt de la somme
(3) additionner ce montant et la somme initiale; cette somme est la valeur acquise
(4) afficher les valeurs de l'intérêt et de la valeur acquise.
Il est évident, même sur cet exemple simple, qu'une telle formalisation risque de produire un texte long, difficile à comprendre et ne mettant pas clairement en évidence les différentes étapes du traitement.
b-Langage de description.
Dans un langage de description, les actions sont généralement décrites par un symbole ou un verbe à l'infinitif choisi pour éviter les confusions. Ce langage est appelé soit pseudocode soit langage de description d'algorithme (LDA).
Notre exemple devient:
écrire " Introduisez la somme initiale (en francs): "
lire somme_initiale
écrire " Introduisez le taux d'intérêt (ex: 3 pour 3%): "
lire taux
intérêt <-- somme_initiale * taux / 100
valeur_acquise <-- somme_initiale + intérêt
écrire " L'intérêt fourni est de " , intérêt , "francs "
écrire " La somme après un an sera de " , valeur_acquise , "francs "
Nous pouvons remarquer deux verbes particuliers:
lire qui correspond à la saisie, à l'introduction des données;
écrire qui exécute l'affichage à l'écran ou l'impression des résultats.
Ces verbes sont soulignés pour indiquer qu'ils ont un sens particulier, qu'il est interdit de les utiliser dans un autre sens et qu'il seront traduits pour être rendus compréhensibles par la machine.
Les valeurs manipulées dans cet algorithme sont des constantes (100) et des variables (somme_initiale, taux, intérêt, valeur_acquise). Il est pratique de choisir le nom des variables de manière à rappeler la signification de la valeur qu'elles représentent. Ce nom est souvent appelé identificateur de la variable. Les variables jouent le rôle de "tiroirs" dans lesquels on place une valeur durant l'exécution de l'algorithme. Ainsi,
lire somme_initiale
signifie que l'on introduit dans le tiroir baptisé somme_initiale la valeur numérique entrée au clavier lors de l'exécution du programme.
Le contenu d'un de ces tiroirs peut être modifié en y plaçant le résultat d'un calcul. Cette instruction porte le nom d'assignation ou affectation et se représente par une flèche (<--).
Ainsi,
intérêt <-- somme_initiale * taux /100
signifie que l'on place dans le tiroir intérêt le résultat de l'opération figurant à droite de la flèche. Cette instruction se lit: assigner à la variable intérêt la valeur de l'expression de droite.
Les expressions symbolisant les calculs à effectuer sont représentées par des formules algébriques faisant intervenir les noms des variables, des symboles mathématiques ("+" pour l'addition, "-" pour la soustraction, "*" pour la multiplication, "/" pour la division, ...) et des constantes numériques.
La description d'une action et des objets qui y participent porte le nom d'instruction. L'ordre dans lequel les différentes opérations seront écrites indique l'ordre dans lequel elles seront exécutées: de haut en bas et de droite à gauche. Il s'agit d'une exécution séquentielle.
1.3. Qualités d'un algorithme, d'un programme.
Tout programme fourni à l'ordinateur n'est que la traduction dans un langage de programmation d'un algorithme mis au point pour résoudre un problème donné. Pour obtenir un bon programme, il faut partir d'un bon algorithme. Il doit, entre autres, posséder les qualités suivantes:
être clair, facile à comprendre par tous ceux qui le lisent (structure et documentation)
présenter la plus grande généralité possible pour répondre au plus grand nombre de cas possibles
être d'une utilisation aisée même par ceux qui ne l'ont pas écrit et ce grâce aux messages apparaissant à l'écran qui indiqueront quelles sont les données à fournir et sous quelle forme elles doivent être introduites ainsi que les différentes actions attendues de la part de l'utilisateur
être conçu de manière à limiter le nombre d'opérations à effectuer et la place occupée en mémoire.
Une des meilleures façons de rendre un algorithme clair et compréhensible est d'utiliser une programmation structurée n'utilisant qu'un petit nombre de structures indépendantes du langage de programmation utilisé. Une technique d'élaboration d'un bon algorithme est appelée méthode descendante (top down). Elle consiste à considérer un problème dans son ensemble, à préciser les données fournies et les résultats à obtenir puis à décomposer le problème en plusieurs sous-problèmes plus simples qui seront traités séparément et éventuellement décomposés eux-mêmes de manière plus fine.
Exemple: imaginons un robot domestique à qui nous devons fournir un algorithme lui permettant de préparer une tasse de café soluble. Une première version de l'algorithme pourrait être:
(1) faire bouillir de l'eau
(2) mettre le café dans la tasse
(3) ajouter l'eau dans la tasse
Les étapes de cet algorithme ne sont probablement pas assez détaillées pour que le robot puisse les interpréter. Chaque étape doit donc être affinée en une suite d'étapes plus élémentaires, chacune étant spécifiée d'une manière plus détaillée que dans la première version. Ainsi l'étape
(1) faire bouillir l'eau peut être affinée en
(1.1) remplir la bouilloire d'eau
(1.2) brancher la bouilloire sur le secteur
(1.3) attendre l'ébullition
(1.4) débrancher la bouilloire
De même,
(2) mettre le café dans la tasse pourrait être affiné en
(2.1) ouvrir le pot à café
(2.2) prendre une cuiller à café
(2.3) plonger la cuiller dans le pot
(2.4) verser le contenu de la cuiller dans la tasse
(2.5) fermer le pot à café
et (3) ajouter de l'eau dans la tasse pourrait être affinée en
(3.1) verser de l'eau dans la tasse jusqu'à ce que celle-ci soit pleine
Certaines étapes étant encore trop complexes et sans doute incompréhensibles pour notre robot, il faut les affiner davantage. Ainsi l'étape
(1.1) remplir la bouilloire d'eau
peut nécessiter les affinements suivants:
(1.1.1) mettre la bouilloire sous le robinet
(1.1.2) ouvrir le robinet
(1.1.3) attendre que la bouilloire soit pleine
(1.1.4) fermer le robinet
Quand il procède à des affinements des différentes étapes, le concepteur d'un algorithme doit naturellement savoir où s'arrêter. Autrement dit, il doit savoir quand une étape constitue une primitive adéquate au point de ne pas avoir besoin d'affinement supplémentaire. Cela signifie évidemment qu'il doit connaître quelle sorte d'étape le processeur peut interpréter. Par exemple, le concepteur de l'algorithme précédent doit savoir que le robot peut interpréter "brancher la bouilloire" ce qui de ce fait n'exige pas d'affinement, mais qu'en revanche, il ne peut pas interpréter "remplir la bouilloire" et que dès lors un affinement devient nécessaire.
Page précédente.
________________________________________
© 1996 JMy
________________________________________
LA SEQUENCE.
________________________________________
2. LA SEQUENCE.
2.1. Langage de description.
a- Instructions
Dans les algorithmes décrivant des calculs sur les quantités numériques, seront utilisées essentiellement les instructions que nous avons déjà étudiées.
1° les instructions de lecture (d'entrée) notées:
lire variables
indiquant la saisie des données
exemples:
lire somme_initiale
lire taux
2° les instructions d'écriture (de sortie) de la forme:
exemple:
écrire expression
indiquant l'affichage d'un message et/ou du contenu d'une variable (ou du résultat d'un calcul)
exemples:
écrire " Introduisez la somme initiale (en francs): "
écrire " L'intérêt fourni est de " , intérêt
écrire intérêt
écrire a, b, (a+b)/2
3° les instructions d'assignation (d'affectation) représentées par
variable <-- expression
exemple:
intérêt <-- somme-initiale * taux / 100
a <-- 0
i <-- i + 1
Les expressions sont des formules mathématiques symbolisant des opérations sur des variables et/ou des constantes numériques.
Les variables y sont représentées par un identificateur (un nom) comme en algèbre et les constantes sont des nombres écrits en chiffres. Nous utiliserons la convention anglo-saxonne utilisée par la plupart des ordinateurs (et des calculatrices) et qui consiste à employer le point (".") pour séparer la partie entière de la partie décimale d'un nombre.
Les opérations sur des nombres sont représentées par +, -, * (pour ne pas confondre le symbole de multiplication avec la lettre "x" ou avec le point décimal), /.
D'autres fonctions mathématiques usuelles sont couramment utilisées: ln x, sin x, arctg x, [x] (signifie prendre la partie entière de x), a mod b (fournit le reste de la division de a par b), xy, loga x , ...
Mais l'ordinateur peut également manipuler des variables contenant des chaînes de caractères alphanumériques (alphabétiques et/ou numériques et/ou spéciaux) pour les modifier, en extraire des sous-chaînes, ... Ces chaînes de caractères sont placées entre guillemets pour les distinguer des noms de variables. L'opération de concaténation (juxtaposition de 2 chaînes pour en former une nouvelle) est symbolisée par // séparant les 2 chaînes originelles. La fonction qui permet d'extraire une sous-chaîne est représentée par le nom de la variable avec en indice les positions des lettres à extraire. Ainsi la sous-chaîne formée des caractères occupant les positions 2, 3, 4 dans la variable prénom sera symbolisée par: prénom2<--4
Enfin, la fonction qui fournit la longueur (le nombre de caractères) de la chaîne contenue dans la variable prénom est symbolisée par |prénom|
b- Exemples
1- Exprimer un nombre de secondes sous forme d'heures, minutes, secondes. La seule donnée est le nombre total de secondes que nous appellerons nsec; les résultats consistent en 3 nombres h, m, s.
écrire " Introduisez le nombre de secondes"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heure(s) ", m, "minute(s) et", s, "seconde(s)"
2- Transformer un prénom et un nom en une chaîne contenant l'initiale du prénom séparée du nom par un point
écrire "Quel est votre prénom?"
lire prénom
écrire "et votre nom?"
lire nom
pr <-- prénom1
lpr <-- |prénom|
ident <-- pr // "." // nom
écrire "Votre prénom de", lpr, "lettres a été abrégé
et votre identification est : ", ident
c-Déclaratives
Il est aussi nécessaire de préciser ce que les variables utilisées contiendront comme type de données. Il peut s'agir de nombres entiers, de nombres réels, de chaînes de caractères, ... Il faut faire précéder la description de l'algorithme par une partie dite déclarative où l'on regroupe les caractéristiques des variables manipulées.
La partie déclarative est placée en tête de l'algorithme et regroupe une ou plusieurs indications de la forme:
entier variables
ou
réel variables
L'algorithme complété de l'exemple 1 devient:
entier nsec, h, m, s
écrire "Introduisez le nombre de secondes:"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heure(s)", m, "minute(s) et", s, "seconde(s)"
Et l'algorithme de l'exemple 2:
entier lpr
chaîne prénom, nom, ident
écrire "Quel est votre prénom?"
lire prénom
écrire "et votre nom?"
lire nom
pr <-- prénom1
lpr <-- |prénom|
ident <-- pr // "." // nom
écrire "Votre prénom de",lpr,"lettres a été abrégé
et votre identification est : ",ident
2.2. Exercices
Pour voir les exercices et les solutions, cliquez ici.
Résumé:
Pour l'échange de données entre le programme et l'utilisateur (ou le disque du PC), 2 mots sont utilisés:
(1) lire pour recevoir de l'info du monde extérieur:
lire N où N est le nom de la variable qui va recevoir l'information fournie par l'utilisateur
lire N sur Fichier où N est le nom de la variable qui va recevoir l'information récupérée dans le fichier Fichier
(2) écrire pour fournir de l'info au monde extérieur:
écrire "Bonjour tout le monde." où la partie entre guillemet est le message à afficher à l'écran
écrire N où N est le nom de la variable qui contient l'information à écrire
écrire N sur Fichier où N est le nom de la variable qui contient l'information à écrire sur le fichier Fichier
Lorsque le programme travaille dans sa tête, on utilise l'assignation <-- pour symboliser la mémorisation dans une variable.
N <-- N+2
x <-- 2*3+5/2
St <-- "Hello"
2.3. Traduction en Pascal.
Généralités
Examinons les programmes complets correspondant aux algorithmes décrits en LDA.
entier nsec, h, m, s
écrire "Introduisez le nombre de secondes:"
lire nsec
s <-- nsec mod 60
m <-- (nsec \ 60) mod 60
h <-- nsec \ 3600
écrire nsec, "valent: ", h, "heures",m, "minutes et", s, "secondes"
deviendra en Pascal:
PROGRAM secondes;
VAR nsec, h, m, s : INTEGER;
BEGIN
WRITE('Introduisez le nombre de secondes: ');
READLN (nsec) ;
s:=nsec MOD 60 ;
m:=nsec DIV 60 MOD 60 ;
h:=nsec DIV 3600 ;
WRITELN (nsec, 'valent: ', h, 'heures', m, 'minutes et', s, 'secondes')
END.
Les règles de base.
Dans ces exemples, nous retrouvons déjà dix règles de base:
1° Un programme Pascal se compose de trois parties:
un en-tête, caractérisé par le mot PROGRAM
une section déclarative introduite ici par le mot VAR
une section instruction ou corps du programme, délimitée par les mots BEGIN et END.
Attention: Le programme se termine par un point.
2° L'en tête (facultative) sert à donner un nom au programme selon la forme:
PROGRAM identificateur;
3° Un identificateur en Pascal doit débuter par une lettre suivie par un nombre quelconque de lettres, chiffres ou de "_" (caractère souligné). Les identificateurs ne peuvent contenir d'espacement (caractère "blanc") ou de caractères tels que %, ?, *, ., - ,... mais peuvent être aussi longs que l'on veut.
4° Les variables doivent faire l'objet d'une déclaration de type de la forme:
VAR liste des variables : type;
5° Des points-virgules sont obligatoires pour séparer les trois parties et pour séparer les instructions
6° Les instructions de lecture et d'écriture se traduisent respectivement par READLN et WRITE (ou WRITELN) suivis d'une liste de variables ou d'expressions placées entre parenthèses et séparées par des virgules.
L'ajout de LN après WRITE (WRITELN) force le passage à la ligne lors de l'affichage suivant à l'écran.
7° L'assignation se représente par ":="
8° Les opérateurs arithmétiques sont identiques à ceux du langage de description d'algorithme (LDA). Toutefois, nsec\3600 est traduit par nsec DIV 3600. En effet, outre les quatres opérations + - * / , Pascal utilise deux opérateurs supplémentaires:
DIV fournissant la partie entière du quotient de deux nombres entiers
MOD fournissant le reste de la division de deux nombres entiers
Ainsi, 13 / 5 fournit la valeur 2.6
13 DIV 5 fournit 2
et 13 MOD 5 fournit 3.
9° Les mots PROGRAM, VAR, BEGIN, END, DIV, MOD, ... ont un sens précis dans le langage: ce sont des mots réservés qui ne peuvent être choisis comme identificateurs par le programmeur.
Dans un programme en LDA, les mots réservés sont soulignés.
Un certain nombre de mots tels que INTEGER, READLN, WRITE, ... ont une signification prédéfinie. Pour éviter toute erreur, on s'abstiendra de les choisir comme identificateur.
10° Les mots du langage et les identificateurs doivent être séparés les uns des autres par un ou plusieurs blancs.
Lecture.
Les lectures sont symbolisées par le mot READLN. C'est la procédure READLN qui transfère les nombres ou chaînes de caractères du clavier vers la mémoire centrale. Ceux-ci doivent respecter la forme des constantes de Pascal et doivent être séparés par un blanc au moins.
Le type de la constante donnée et celui de la variable d'accueil doivent correspondre selon la règle des assignations.
Pascal admet aussi la procédure READ (qui a le même effet que READLN sans passage à la ligne pour le prochain affichage) mais il s'est révélé à l'usage, que celle-ci était parfois source de problème et il est préférable de l'éviter.
Ecriture.
Les écritures se font de façon semblable aux lectures, à l'aide de la procédure WRITE. Les valeurs à afficher apparaîtront sur l'écran à la queue-leu-leu sur une seule ligne, parfois sans espacement entre elles.
Pour améliorer la lisibilité, on peut:
utiliser la procédure WRITELN qui force le passage à la ligne suivante pour le prochain affichage
faire usage des formats d'édition qui précisent le nombre de caractères à utiliser pour afficher chacun des résultats:
WRITE(valeur_entière : n) affiche la valeur entière sur n positions (insertion d'espacement à gauche du nombre si il y a trop peu de chiffres et ajustement automatique, si n est insuffisant)
WRITE(valeur_réelle) affiche le nombre en notation scientifique (x.xxxxxE+x précédé d'un espacement)
WRITE(valeur_réelle : n) affiche le nombre en notation scientifique sur n positions
WRITE(valeur_réelle : n1 : n2) affiche le nombre sur n1 positions avec n2 décimales (avec ajustement).
WRITE(chaîne : n) affiche la chaîne de caractère sur n positions (insertion d'espacement à gauche de la chaîne si il y a trop peu de caractères et ajustement automatique, si n est insuffisant)
Exemples:
Si la variable entière x contient 12345, (^ symbolise l'espacement)
WRITE(x) affiche 12345
WRITE(x:8) affiche ^^^12345
WRITE(x:2) affiche 12345
Si la variable réelle x contient 123.4567, (^ symbolise l'espacement)
WRITE(x) affiche ^1.23456E+2
WRITE(x:7) affiche ^1.2E+2
WRITE(x:8:2) affiche ^^123.46
WRITE(x:2) affiche 1.2E+2
Si la variable du type chaîne x contient 'AZERTY', (^ symbolise l'espacement)
WRITE(x) affiche AZERTY
WRITE(x:8) affiche ^^AZERTY
WRITE (x:3) affiche AZERTY
Manipulation de nombres.
Si la mathématique distingue plusieurs types de nombres directement manipulables par les langages informatiques, Pascal n'en reconnaît que deux: les types entier et réel.
Le type entier.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
entier age, note_de_français
Mais Pascal a subdivisé les entiers en 5 types pour mieux adapter le type aux valeurs que peuvent prendre une variable, et ce pour optimiser l'occupation de la mémoire.
Type Valeurs autorisées Occupation en mémoire
SHORTINT de -128 à +127 1 octet
BYTE de 0 à 255 1 octet
INTEGER de -32768 à +32767 2 octets
WORD de 0 à 65535 2 octets
LONGINT de -2147483648 à 2147483647 4 octets
Le type réel.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
réel taux_de_TVA, note_moyenne
Mais Pascal a subdivisé les réels en 4 types pour mieux adapter le type aux valeurs que peuvent prendre une variable, et ce pour optimiser l'occupation de la mémoire.
Type Valeurs autorisées Nombre de chiffres significatifs Occupation en mémoire
SINGLE de -1038 à 9,8 1038 7 chiffres 4 octets
REAL de -1038 à 9,8 1038 11 chiffres 6 octets
DOUBLE de -10308 à 10308 15 chiffres 8 octets
EXTENDED de -104932 à 9,8 104932 19 chiffres 10 octets
Il existe aussi le type COMP stocké sur 8 octets et offrant une gamme de nombres allant de -9,8 1018 à 9,8 1018 mais ne conservant que la partie entière du nombre.
Assignation.
Dans une assignation, le type de l'expression doit correspondre au type de variable de destination. Cette règle admet une seule exception: une variable réelle peut recevoir une valeur entière.
Evaluation des expressions arithmétiques.
Pascal respecte la même convention de priorité que l'arithmétique: les multiplications et les divisions (opérateurs * / DIV et MOD) sont effectuées en premier lieu, puis les additions et les soustractions (opérateurs + et -); lorsqu'une expression contient plusieurs opérateurs de même priorité, les opérations sont effectuées de gauche à droite. Pour modifier cet ordre, il suffit d'introduire des parenthèses.
Exemple: WRITELN(1/2*3) n'affichera pas la valeur de 1/6 mais bien de 3/2 car la division se fera avant la multiplication.
Type des opérandes et du résultat.
Les opérateurs +, - et * peuvent agir sur des opérandes réels ou entiers et le résultat est réel sauf si les deux opérandes sont entiers. L'opérateur / peut agir sur des entiers et des réels mais le résultat est toujours réel. Les opérateurs DIV et MOD ne peuvent être utilisés qu'avec des opérandes entiers et fournissent un résultat entier.
Constantes numériques.
Le type d'une variable est défini dans la partie déclarative du programme. C'est la forme d'écriture qui détermine le type d'une constante. Ainsi 50 est une constante entière, tandis que 3.1416 et 50.0 sont des constantes réelles car elles contiennent une partie fractionnaire.
Les constantes entières ne peuvent contenir que des chiffres décimaux (0 à 9) précédés éventuellement d'un signe + ou -.
Les constantes réelles doivent contenir en plus:
soit par une partie fractionnaire d'au moins un chiffre, séparée de la partie entière par un point:
+1.2 -56 0.01 0.0
soit une partie exposant sous forme d'une constante entière précédée par un E indiquant la puissance de 10 par laquelle il faut multiplier la valeur qui précède la lettre E :
1E4 vaut 1 * 104 = 10000.0 6E-2 vaut 6 * 10-2 = 0.06
soit les deux:
3.14E+4 vaut 3.14 * 104 = 31400.0
Dans ce cas et si il n'y a qu'un seul chiffre non nul dans la partie entière, on parle de notation scientifique.
Fonctions mathématiques.
Notation mathématique Fonction Pascal Type de x Type du résultat Signification
|x| ABS(x) Entier ou réel Type de x Valeur absolue de x
x2 SQR(x) Entier ou réel Type de x Carré de x
x1/2 SQRT(x) Entier ou réel Réel Racine carré de x
sin x SIN(x) Entier ou réel Réel sin de x (x en radians)
cos x COS(x) Entier ou réel Réel cos de x (x en radians)
arctg x ARCTAN(x) Entier ou réel Réel Angle (en radians) dont la tangente vaut x
ex EXP(x) Réel Réel Exponentielle de x
ln x LN(x) Réel Réel Logarithme népérien de x
[x] TRUNC(x) Réel Entier Partie entière de x
[x] INT(x) Réel Réel Partie entière de x
arrondi de x ROUND(x) Réel Entier Entier le plus proche de x
décimal de x FRAC(x) Réel Réel Partie décimale de x
On notera l'absence des fonctions tg x et xy qui se traduiront, en employant les formules de mathématique adéquates, respectivement par SIN(x)/COS(x) et EXP(y*LN(x)).
Manipulation de chaînes de caractères.
Nous avons déjà vu précédemment un exemple de ce type de problème et il est évidemment nécessaire dans la vie professionnelle de manipuler des données autres que numériques (noms de clients, d'articles vendus, ...). Celles-ci sont alors dites du type alphabétique. Lorsqu'elles contiennent en plus des chiffres, des symboles tels que (+, =, §, &, ...), nous parlerons de données alphanumériques.
Si la manière de coder en binaire des nombres entiers ou réels se fait d'une manière assez naturelle par un changement de base de numération, par contre la manière de stocker des caractères en binaire est totalement arbitraire. Ainsi, l'ANSI (American National Standard Institute) a défini un codage des caractères sur deux octets (ou bytes). Ce code porte le nom de code ASCII (American Standard Code for Information Interchange) et respecte, entre autres, l'ordre alphabétique. Comme deux octets permettent de stocker 256 valeurs différtentes, nous disposerons de 256 caractères différents.
Il existe deux types de variables alphanumériques: les caractère et chaîne.
Le type caractère.
Le type caractère est réservé aux variables contenant un seul caractère (lettre, symbole, ponctuation, ...) et il est possible d'en déterminer les successeur/prédécesseur/position dans la liste des codes ASCII. Ainsi le successeur de "B" est "C", son prédécesseur "A" et son code ASCII 66.
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
caractère lettre, initiale
qui se traduira en Pascal par:
VAR lettre, initiale: CHAR;
Le type chaîne.
Les variables du type chaîne peuvent contenir
soit une suite de caractères (un mot, une phrase, ...),
soit un caractère (mais dont, par exemple, il est impossible de déterminer le suivant),
soit aucun caractère (on parle alors de chaîne vide).
En LDA, nous placerons dans la déclaration des variables une ligne telle que:
chaîne nom, adresse
qui se traduira en Pascal par:
VAR nom, adresse: STRING;
Cependant, Pascal permet aussi de préciser la taille maximale (25 dans l'exemple ci-dessous) que pourra avoir la chaîne qui sera affectée à la variable:
VAR nom, adresse: STRING[25];
En l'absence de précision de longueur, Pascal réserve automatiquement la taille maximale, à savoir 255 caractères.
Assignation.
Dans une assignation, le type de l'expression doit correspondre au type de variable de destination. C'est ainsi que les assignations suivantes sont illégales:
initiale <-- "Einstein"
initiale <-- ""
avec la variable initiale déclarée du type caractère.
Par contre, si cette variable a été déclarée du type chaîne, celles-ci sont tout à fait légales.
Les fonctions alphanumériques.
Notation en LDA Fonction Pascal Type du résultat Signification
|Ch| LENGTH(Ch) Entier Nombre de caractères dans Ch
Ch1 // Ch2 CONCAT(Ch1,Ch2)
Ch1 + Ch2 Chaîne Concaténation (juxtaposition) de Ch1 et Ch2
Chi<--j COPY(Ch, i, j-i+1) Chaîne Extraction, dans Ch, des caractères de la postion i à la position j
Chi COPY(Ch, i, 1)
Ch[i] Chaîne
Caractère Extraction, dans Ch, du caractère à la postion i
Page précédente.
________________________________________
© 1996 JMy
________________________________________
L'ALTERNATIVE.
________________________________________
3. STRUCTURES DE CHOIX.
3.1. Introduction
Les algorithmes décrits dans le chapitre précédent étaient très simples et une calculatrice aurait suffi pour leur exécution. En effet, pour l'instant, nous sommes seulement en mesure de décrire une suite d'opérations, chacune devant être exécutée une et une seule fois. Nous ne pouvons par exemple utiliser notre algorithme de calcul d'intérêt avec différents taux d'intérêt. Pour faire cela, il nous faut introduire de nouvelles structures.
Il a été démontré que pour représenter n'importe quel algorithme, il faut disposer des trois possibilités suivantes:
• la structure de séquence qui indique que les opérations doivent être exécutées les unes après les autres
• la structure de choix qui indique quel ensemble d'instructions doit être exécuté suivant les circonstances
• la structure de répétition qui indique qu'un ensemble d'instructions doit être exécuté plusieurs fois.
Jusqu'à présent, nous avons décrit la structure de séquence. Nous décrirons dans ce chapitre les structures de choix: l'alternative et le choix multiple.
3.2. La structure alternative.
Voici les règles d'un jeu très simple: deux joueurs A et B se cachent la main droite derrière le dos. Chacun choisit de tendre un certain nombre de doigts (de 0 à 5), toujours derrière le dos. Les deux joueurs se montrent la main droite en même temps. Si la somme des nombres de doigts montrés est paire, le premier joueur a gagné, sinon c'est le second. Le problème est de faire prendre la décision par l'ordinateur.
Exprimé en français, l'algorithme se présente comme suit:
- prendre connaissance du nombre de doigts de A
- prendre connaissance du nombre de doigts de B
- calculer la somme de ces deux nombres
- si la somme est paire, A est le gagnant
- si la somme est impaire, B est le gagnant.
Pour déterminer si un nombre est pair ou impair, il suffit de calculer le reste de la division par 2 (.. modulo 2): il vaut 0 dans le premier cas et 1 dans le second.
En langage de description d'algorithme, l'algorithme s'écrira:
entier na,nb,reste
lire na,nb
reste <-- (na + nb) mod 2
si reste = 0 alors écrire "Le joueur A a gagné."
sinon écrire "Le joueur B a gagné."
fsi
écrire "Bravo pour le gagnant!"
REMARQUES
(1) La structure alternative se présente en général sous la forme
si expression alors première séquence d'instructions
sinon deuxième séquence d'instructions
fsi
où expression conditionne le choix d'un des deux ensembles d'instructions. Cette expression peut être soit vraie soit fausse. Si l'expression est vraie, la première séquence d'instruction sera exécutée et la seconde sera ignorée; si l'expression est fausse, seule la seconde séquence d'instructions sera effectuée.
Le mot sinon indique où se termine la première séquence d'instructions et où commence la seconde. Le mot fsi (abrégé de "fin de si") indique où se termine la seconde séquence d'instructions.
(2) Dans certains cas, lorsque l'expression est fausse, aucune instruction ne doit être exécutée. La condition s'exprime alors plus simplement sous la forme:
si expression alors séquence d'instructions
fsi
(3) Quelle que soit la séquence choisie et exécutée, les instructions qui suivent fsi seront exécutées.
(4) Chacune des séquences d'instructions d'un si ... fsi peut contenir des si...fsi. On dit alors que les structures sont imbriquées.
(5) Pour faire apparaître plus clairement la structure, on écrit les séquences d'instructions légèrement en retrait des mots-clefs (si, alors, sinon, fsi). On dit qu'on indente le texte de l'algorithme.
Considérons l'exemple suivant écrit sans indentation et où les fins de si (fsi) ne sont pas indiquées:
si a > 0 alors
si b > 0 alors
c <-- a+b
sinon
c <-- a-b
Cet algorithme peut aussi bien être une mauvaise écriture de:
(2.1)
si a > 0 alors si b > 0 alors c <-- a+b
sinon c <-- a-b
fsi
fsi
que de:
(2.2)
si a > 0 alors si b > 0 alors c <-- a+b
fsi
sinon c <-- a-b
fsi
Dans (2.1), si a est négatif, aucun traitement n'est effectué et dans (2.2) si a est négatif, c vaut a-b.
3.3.Expressions logiques et variables booléennes.
Expressions logiques.
Les expresssions logiques se construisent à partir d'affirmations qui sont soit vraies soit fausses. Une condition telle que "reste=0" n'impose pas à la variable reste d'être nulle. Il ne s'agit en effet pas d'une assignation mais de l'expression d'une condition qui ne sera réalisée (et n'aura donc la valeur "vrai") que si la variable reste a été assignée à 0. Dans les autres cas, cette condition prendra la valeur "faux".
On peut combiner des affirmations à l'aide d'opérateurs logiques ,à savoir: ou, et et non, les deux premiers portent sur deux opérandes et le dernier sur un seul. Il est évident que ces opérandes ne peuvent prendre que deux valeurs: vrai ou faux.
Par définition:
op1ou op2 n'a la valeur faux que si les deux opérandes ont la valeur faux, sinon l'expression a la valeur vrai.
op1et op2 n'a la valeur vrai que si les deux opérandes ont la valeur vrai, sinon l'expression a la valeur faux.
non opérande a la valeur vrai si l'opérande a la valeur faux et inversement.
Supposons par exemple qu'on exécute les assignations suivantes:
a <-- 1
a <-- 1
b <-- 2
c <-- 3
alors
(b > 8) ou (c < 1) a la valeur faux
(b > 0) ou (c > 1) a la valeur vrai
(b > 9) ou (c > 1) a la valeur vrai
(b > a) et (c > b) a la valeur vrai
(b > a) et (c < 0) a la valeur faux
non (c < a) a la valeur vrai
non ((b > a) et (c > b)) a la valeur faux
((b > a) et (c > b)) ou (a < 0) a la valeur vrai
Les relations d'égalité ou d'inégalité ci-dessus font comparer des nombres ou des variables à valeur numérique.
On peut également comparer des lettres: l'affirmation "b" précède "x" dans l'ordre alphabétique a pour valeur vrai. De même, si la variable car contient le caractère "v", l'affirmation car suit "w" dans l'ordre alphabétique a pour valeur faux.
Comme nous l'avons déjà vu, pour ramener des nombres à la seule représentation que connaissent les ordinateurs (le binaire), il suffit de faire un changement de base et passer de la base 10 à la base 2. Par contre, il n'existe pas de manière naturelle pour représenter un caractère sous forme binaire. On associe donc arbitrairement un code à chaque caractère connu par l'ordinateur, à savoir les signes du clavier (lettres, chiffres décimaux, signes de ponctuation et caractères spéciaux) et les caractères de contrôle. Le code importe peu mais l'ordre de classement (collating sequence) qu'il définit est par contre très important. Le code ASCII, le plus fréquemment utilisé sur les micro-ordinateurs, respecte l'ordre croissant des caractères "0", "1", ..., "9" et l'ordre alphabétique des 26 lettres de l'alphabet, et ceci sans mêler aucun autre caractère dans ces séquences. Afin de simplifier les notations, on convient d'utiliser les symboles "<" pour signifier "précède dans la collating sequence", "" pour "suit dans la collating sequence ou est égal",...
Variables booléennes.
Il est possible de stocker la valeur d'une expression logique dans une variable (comme le résultat d'une opération arithmétique est stocké dans une variable numérique). Cette variable ne peut prendre que les valeurs vrai et faux. Ces variables sont appelées variables logiques ou booléennes.
En LDA, elles se déclarent comme ceci:
booléen: OK, pair
et en Pascal par:
VAR BOOLEAN: OK, pair;
El l'assignation d'une variable booléenne se fait de la manière suivante:
OK <-- Vrai
3.4. Exercices.
Pour voir les exercices et les solutions, cliquez ici.
3.5. L'alternative en Pascal.
En Pascal, l'exemple du jeu décrit en 2 se traduit par:
PROGRAM Jeu;
VAR NA, NB, Reste:INTEGER;
BEGIN
WRITE('Introduisez le nombre de doigts montrés par le joueur A');
READLN(NA);
WRITE('Introduisez le nombre de doigts montrés par le joueur B);
READLN(NB);
RESTE := (NA + NB) MOD 2;
IF RESTE=0 THEN WRITELN('Le joueur A a gagné.')
ELSE WRITELN('Le joueur B a gagné.');
WRITELN('Bravo pour le gagnant!')
END.
La structure alternative se traduit presque mot à mot de LDA en Pascal: si se traduit par IF, alors par THEN et sinon par ELSE. Les séquences d'instructions à exécuter dans le cas où la condition est vraie (cette séquence suit le mot alors) et dans le cas où la condition est fausse (cette séquence suit le mot sinon) doivent être encadrées par le mots BEGIN et END qui en indiquent le début et la fin. Dans le cas où ces séquences se réduisent à une seule instruction, les mots BEGIN et END peuvent être omis (comme dans l'exemple ci-dessus).
Ainsi, en ajoutant le message WRITELN('Bravo pour le gagnant!') juste après avoir indiqué le nom du vainqueur, nous serions obligés d'utiliser les BEGIN et END:
PROGRAM Jeu;
VAR NA, NB, Reste:INTEGER;
BEGIN
WRITE('Introduisez le nombre de doigts montrés par le joueur A');
READLN(NA);
WRITE('Introduisez le nombre de doigts montrés par le joueur B);
READLN(NB);
RESTE := (NA + NB) MOD 2;
IF RESTE=0 THEN BEGIN
WRITELN('Le joueur A a gagné.');
WRITELN('Bravo pour le gagnant!')
END
ELSE BEGIN
WRITELN('Le joueur B a gagné.');
WRITELN('Bravo pour le gagnant!')
END
END.
La forme:
si expression alors séquence d'instructions
sinon séquence d'instructions
fsi
se traduit en Pascal par:
IF expression THEN BEGIN
séquence d'instructions
END
ELSE BEGIN
séquence d'instructions
END;
Il est interdit de mettre un ; après le END indiquant la fin de la séquence d'instructions qui suit le THEN.
Et la forme:
si expression alors séquence d'instructions
fsi
se traduit en Pascal par:
IF expression THEN BEGIN
séquence d'instructions
END;
Remarques:
(1) La traduction en Pascal de (2.1) est:
IF A>0 THEN IF B>0 THEN C:=A+B
ELSE C:=A-B;
En effet, en Pascal, le ELSE se rapporte toujours au IF ... THEN le plus proche.
Pour traduire (2.2), il faut soit modifier les alternatives pour que le sinon se rapporte au alors le plus proche:
si NOT (a=0) alors c <-- a - b
sinon si b > 0 alors c <-- a + b
fsi
fsi
ou faire apparaître que le sinon de la première condition est absent:
IF A>0 THEN IF B>0 THEN C:=A+B
ELSE
ELSE C:=A-B;
(2) Le programme de jeu listé ci-dessus a un gros défaut: lorsque le premier joueur tape au clavier son nombre stocké dans NA, celui-ci reste affiché et le deuxième joueur peut choisir NB de façon à être certain de gagner.
Il existe deux remèdes à ce problème. La première consiste à effacer l'écran après que A ait tapé son nombre. Ceci se fait en Pascal par l'instruction CLRSCR qui nécessite le chargement d'une librairie. Celui-ci est activé par la ligne: USES Crt; écrite juste en-dessous de PROGRAM Jeu;
La deuxième solution est de saisir le caractère (le chiffre dans ce cas) tapé au clavier sans l'afficher. Cela se fait grâce à la fonction READKEY qui scrute en permanence le clavier et qui capte la touche qui vient d'être enfoncée. Cependant cette fonction ne peut être employée que pour l'affectation à une variable de type caractère.
Dans ce cas notre programme deviendrait:
PROGRAM Jeu;
USES Crt;
VAR NA, NB, Reste, Err : INTEGER;
A, B : CHAR;
BEGIN
CLRSCR;
WRITE('Introduisez le nombre de doigts montrés par le joueur A');
A:=READKEY;
VAL(A, NA, Err);
IF Err<>0 THEN WRITELN('Erreur de format numérique!')
ELSE BEGIN
WRITE('Introduisez le nombre de doigts montrés par le joueur B);
B:=READKEY;
VAL(B, NB, Err);
IF Err<>0 THEN WRITELN('Erreur de format numérique!')
ELSE BEGIN
RESTE := (NA+NB) MOD 2;
IF RESTE=0 THEN WRITELN('Le joueur A a gagné.')
ELSE WRITELN('Le joueur B a gagné.');
WRITELN('Bravo pour le gagnant!')
END
END.
La procédure VAL(Chaine, Nombre, Erreur) permet de convertir Chaine en sa valeur numérique.qui sera stockée dans Nombre. La variable Erreur contiendra la valeur 0 si la conversion s'est faite sans problème ou la position du premier caractère inadéquat. Erreur doit être du type INTEGER, Chaine du type STRING ou CHAR et Nombre d'un type numérique (entier ou réel).
3.6. Le choix multiple.
Supposons que l'on veuille demander à l'utilisateur de choisir dans un menu une des 3 possibilités offertes. Le choix présenté ne se limite pas à une alternative (soit - soit).
Nous nous trouvons en présence d'un choix multiple qui s'écrit en LDA:
entier i
lire i
selon que
i=1 faire bloc1
oq i=2 faire bloc2
oq i=3 faire bloc3
autrement écrire "Mauvais choix"
fselon
Le mot oq est l'abréviation de "ou que".
La structure de choix multiple peut, comme l'alternative, prendre deux formes:
selon que
première expression logique faire première séquence d'instructions
oq deuxième expression logique faire deuxième séquence d'instructions
...
oq n ème expression logique faire n ème séquence d'instructions
autrement (n+1) ème séquence d'instructions
fselon
et
selon que
première expression logique faire première séquence d'instructions
oq ...
oq n ème expression logique faire n ème séquence d'instructions
fselon
La première forme généralise le si ... alors ... sinon ... fsi, la seconde le si ... alors ... fsi.
Si la i ème expression logique a la valeur vrai, la i ème séquence d'instructions est exécutée puis il y a passage aux instructions qui suivent le mot fselon. Si toutes les expressions logiques ont la valeur faux, on exécute dans le premier cas la séquence d'instructions qui suit le mot autrement , dans le deuxième cas on passe directement à ce qui suit fselon.
Afin d'éviter toute ambiguïté, on exige que les différentes expressions logiques soient mutuellement exclusives.
3.7. Le choix multiple en Pascal.
La traduction de selon que ...fselon en Pascal n'est pas très commode parce que la structure du choix multiple y est très restrictive: Il est seulement possible de traduire un selon que ... fselon pour lequel l'expression prend les valeurs prises par une variable de type énuméré (dont les valeurs appartiennent à un ensemble; par exemple entier, caractère).
La forme générale du choix multiple est:
CASE <expression> OF
valeur1: première séquence d'instructions;
valeur2: deuxième séquence d'instructions;
...
valeurN: Nème séquence d'instructions;
ELSE (N+1) ème séquence d'instructions;
END;
Il est à noter que les différentes séquences d'instructions sont délimitées par BEGIN et END qui peuvent seulement être omis si une séquence se résume à une seule instruction.
Pour traduire en Pascal un selon que plus général, il faut utiliser des IF imbriqués. Par exemple,
...
lire x
selon que
x<0 faire écrire x,"est négatif"
oq x=0 faire écrire x,"est nul"
autrement écrire x,"est positif"
fselon
...
se traduit par:
...
READLN(x);
IF x<0 THEN WRITELN(x, ' est négatif.')
ELSE IF x=0 THEN WRITELN(x, ' est nul.')
ELSE WRITELN(x, ' est positif.');
3.8. Exercices.
1) Lire 3 nombres a, b et c. Déterminer si l'équation ax+by+c=0 représente l'équation d'une droite parallèle à l'un des axes (et si oui, lequel) ou une droite oblique par rapport aux axes. Tenir compte du fait qu'on pourrait avoir a=b=0.
2) Lire 3 nombres a, b et c où a est différent de 0. Déterminer si la parabole d'équation y=ax²+bx+c coupe l'axe des x en 0, 1 ou 2 points.
3) Demander et lire les valeurs de R en Ohm, I en Ampère et t en seconde. Déterminer un algorithme qui proposerait de calculer la différence de potentiel, la puissance et l'énergie.
Page précédente.
________________________________________
© 1996 JMy
________________________________________
LES STRUCTURES REPETITIVES.
________________________________________
4. STRUCTURES REPETITIVES.
4.1. Introduction.
L'intérêt d'utiliser un ordinateur n'apparaît clairement que lors de la manipulation de données nombreuses ou traitées de manière répétitive.
Exemple 1: Chercher dans une liste de noms et d'adresses, l'adresse d'une personne à partir de son nom. Le nombre de fois qu'il faudra comparer le nom donné aux noms de la liste est dans ce cas inconnu.
Exemple 2 : Calculer la N ème puissance entière d'un nombre x par multiplications successives du nombre par lui-même. Ici, le nombre de répét
black_heart
Messages postés
352
Date d'inscription
dimanche 3 août 2008
Statut
Membre
Dernière intervention
31 janvier 2016
20
4 mars 2009 à 23:02
4 mars 2009 à 23:02
trés belle la technique copier----coller lol
maarouf31000
Messages postés
46
Date d'inscription
mercredi 14 octobre 2009
Statut
Membre
Dernière intervention
14 mai 2011
1 mai 2010 à 21:39
1 mai 2010 à 21:39
Vous avez raison !!!!!!!!
salut je cherches des cours d'algorithme (pascal)...surtout les cours sur la compexité ...merci d'avance
je veut un personne de m'aidé
je veut des cour et d'exercice de fichier et fichier texte
section bac informatique
merci
je veut des cour et d'exercice de fichier et fichier texte
section bac informatique
merci
salut yazid mais j'ai pas de bac en informatique je suis un univercitaire en informatique merci bien et bon courage
salut à tout le monde je cherche les exercice sur le langage assembleur
kekeasm
Messages postés
54
Date d'inscription
mardi 21 août 2007
Statut
Membre
Dernière intervention
11 mars 2009
7
22 avril 2008 à 22:14
22 avril 2008 à 22:14
Salut, une seul réponse :
Google
Ecrire une procédure permettant de déterminer si un nombre est premier. elle comportera deux arguments le nombre à examiner, un indicateur booléen précisant si ce nombre est premier ou non.
Ecrire la procédure précédente sous forme de fonction.
Ecrire une fonction calculant la norme d’un vecteur à 3 composantes réelles.
Ecrire la fonction précédente sous formes d’une procédure.
Ecrire une fonction calculant de produit vectoriel de deux vecteurs à 3 composantes réelles.
Fonction puissance en utilisant la fonction suivantes :
0**b=0,ҰbЄR
a**b=e**(b*LN(a)),ҰbЄR*+
ECRIRE LA FONCTION PUISSANCE DEUX Réels quelconques a et b et retournant a**b pour a>=o seulement. Ecrire un programme d’affichage de a**b qui vérifie la validité des argument.
0b=0, ҰbЄR.
a b=ebLN(a), ҰbЄR*+.
Ecrire la procédure précédente sous forme de fonction.
Ecrire une fonction calculant la norme d’un vecteur à 3 composantes réelles.
Ecrire la fonction précédente sous formes d’une procédure.
Ecrire une fonction calculant de produit vectoriel de deux vecteurs à 3 composantes réelles.
Fonction puissance en utilisant la fonction suivantes :
0**b=0,ҰbЄR
a**b=e**(b*LN(a)),ҰbЄR*+
ECRIRE LA FONCTION PUISSANCE DEUX Réels quelconques a et b et retournant a**b pour a>=o seulement. Ecrire un programme d’affichage de a**b qui vérifie la validité des argument.
0b=0, ҰbЄR.
a b=ebLN(a), ҰbЄR*+.
slt j'ai un probleme sur la fonction et procedure donne moi les excercice pour comprendre
salut j'ai besoin d"aide pour comprendre le cour d'algo je suis en 1ére anné en informatique.
mon adresse est
avissou_genereux2007@yahoo.fr
mon adresse est
avissou_genereux2007@yahoo.fr
nikles007
Messages postés
26
Date d'inscription
jeudi 14 juin 2007
Statut
Membre
Dernière intervention
7 octobre 2009
4
27 mars 2008 à 18:11
27 mars 2008 à 18:11
Ce qsue tu demande, en fait, c'est un cours de programmation..
Les meilleurs cours de programmation gratuits et en Français : https://general.developpez.com/cours/
je suis élève en premiere année d'informatique de gestion. j'aimerai avoir quelques cours sur l'algorithme.et si possible Mérise.merci de bien vouloir m'aider
Salut, les meilleurs cours gratuits en Français pour l'algorithmique sont ici : https://algo.developpez.com/cours/
Pour MERISE il y à des cours ici : https://merise.developpez.com/
Pour MERISE il y à des cours ici : https://merise.developpez.com/
je veux tou savoire sur le langage php (modification insertion supression
12 févr. 2005 à 18:21
merci infinnimentpour l'aide et bonne chance
joyeux saint valentin
27 avril 2008 à 20:57
25 janv. 2009 à 21:19
25 févr. 2009 à 00:45
18 févr. 2011 à 21:23