Cours langage C Tableau conversion de algorithme vers C++
...
L’algorithmique est un terme d’origine arabe, comme algèbre.
Dans la vie sans le savoir, vous avez déjà exécuté des algorithmes.
- Pour préparer un gâteaux on suit une recettes de cuisine
- Pour installer et faire fonctionner un magnétoscope (imprimante) on suit à la lettre le mode d’emploi
- en indiquant le chemin à un touriste ou à une personne égarée.
2- Définition 1
Un algorithme, c’est une suite d’instructions, qui une fois exécutée correctement, conduit à un résultat donné.
Si l’algorithme est juste, le résultat est le résultat voulu,
- le touriste se retrouve là où il voulait aller.
- Le magnétoscope (imprimante) fonctionnera correctement.
- Le gâteau sera réussi
Si l’algorithme est faux, le résultat sera aléatoire et faux :
- Le touriste ne trouvera pas ce qu’il veut
- Le magnétoscope (imprimante) ne fonctionnera pas.
- Et le gâteau sera raté ou pas réussi
La finalité d’un algorithme est de résoudre un problème.
L'utilisateur d'un algorithme n'aura qu'à suivre toutes les instructions, dans l'ordre pour arriver au résultat que doit donner l'algorithme
3- Définition 2
Un algorithme est un ensemble d’instructions qui permet de résoudre un problème indépendamment des particularités de tel ou tel langage.
Pour résoudre un problème par une machine, (donc la conception d’un programme informatique) il faut suivre des étapes suivantes :
1- 1 La spécification (ou analyse)
2- 2 La conception préliminaire (ou conception générale)
3- 3 La conception détaillée
4- 4 Le codage
5- D
1- La spécification :
Est l’ensemble des activités consistant à définir de manière précise, complète et cohérente ce dont l’utilisateur a besoin
Dans la spécification, le problème est décomposé et le problème ou l’énoncé est définie :
A savoir :
- l’entrée (données du problème)
- La sortie (le résultat recherché)
- Les relations éventuelles entre les données et le résultat.
Exemple :
Problème : Résolution d’une équation de second degré dans R.
Ax²+bx + c = 0
Analyse : Données en entrée - les coefficients a, b, c
Données en sortie ou recherché : les racines de l’équation.
La solution :
- calcul de Delta = B²-2AC
- Calcul des racines selon Delta
Si Delta est =0 alors racine double x = -b/2a
Si Delta est 0 alors deux racines x1= et x2=
Si Delta est 0 alors pas de racine dans R.
2- Conception préliminaire (Traduction du résultat de l’analyse)
Une fois le problème spécifié et analysé, le résultat est traduit en un langage descriptif le résultat de la traduction est appelé Algorithme.
3- Conception détaillée (programmation) : est la traduction de l’algorithme en un programme dans un langage de programmation spécifique.
4- Codage : Le programme est ensuite transformé en langage machine lors d'une étape appelée compilation. La compilation est une phase réalisée par l'ordinateur lui-même grâce à un autre programme appelé compilateur.
5- La phase suivante s'appelle l'édition de liens, elle consiste à lier le programme avec tous les éléments externes (généralement des librairies auxquelles il fait référence).
4- Avec qu’elle langage ou convention en écrit un algorithme ?
Un algorithme peut être représenté par généralement deux type de présentations :
a- L’organigramme une représentation graphique, avec des carrés, des losanges, etc. qu’on appelait des organigrammes. Aujourd’hui, cette représentation est quasiment abandonnée.
b- Pseudo-code : qui est un ensemble de mot clés et de structure permettant de décrire dans un langage naturel l’ensemble des opérations à effectuer sur les données pour obtenir des résultats.
6- Caractéristiques d'un algorithme
Un algorithme est l'énoncé dans un langage bien défini d'une suite d'opérations permettant de répondre au problème.
Un algorithme doit donc être :
- lisible: l'algorithme doit être compréhensible même par un non-informaticien
- de haut niveau: l'algorithme doit pouvoir être traduit en n'importe quel langage de programmation, il ne doit donc pas faire appel à des notions techniques relatives à un programme particulier ou bien à un système d'exploitation donné
- précis: chaque élément de l'algorithme ne doit pas porter à confusion, il est donc important de lever toute ambiguïté
- concis: un algorithme ne doit pas dépasser une page. Si c'est le cas, il faut décomposer le problème en plusieurs sous-problèmes
- structuré: un algorithme doit être composé de différentes parties facilement identifiables
La maîtrise de l’algorithmique requiert deux qualités, très complémentaires d’ailleurs:
il faut avoir une certaine intuition, car aucune recette ne permet de savoir a priori quelles instructions permettront d’obtenir le résultat voulu. C’est là, si l’on y tient, qu’intervient la forme « d’intelligence » requise pour l’algorithmique. Alors, c’est certain, il y a des gens qui possèdent au départ davantage cette intuition que les autres. Cependant, et j’insiste sur ce point, les réflexes, cela s’acquiert. Et ce qu’on appelle l’intuition n’est finalement que de l’expérience tellement répétée que le raisonnement, au départ laborieux, finit par devenir « spontané ».
il faut être méthodique et rigoureux. En effet, chaque fois qu’on écrit une série d’instructions qu’on croit justes, il faut systématiquement se mettre mentalement à la place de la machine qui va les exécuter, armé d'un papier et d'un crayon, afin de vérifier si le résultat obtenu est bien celui que l’on voulait. Cette opération ne requiert pas la moindre once d’intelligence. Mais elle reste néanmoins indispensable, si l’on ne veut pas écrire à l’aveuglette.
Et petit à petit, à force de pratique, vous verrez que vous pourrez faire de plus en plus souvent l’économie de cette dernière étape : l’expérience fera que vous « verrez » le résultat produit par vos instructions, au fur et à mesure que vous les écrirez. Naturellement, cet apprentissage est long, et demande des heures de travail patient. Aussi, dans un premier temps, évitez de sauter les étapes : la vérification méthodique, pas à pas, de chacun de vos algorithmes représente plus de la moitié du travail à accomplir.
7-Structure d’un algorithme
L'en-tête
algorithme nom de l'algorithme ;
const
var
Les déclarations de constantes, variables, structures
liste des constantes ;
liste des variables ;
fonc
liste des fonctions ;
Les déclarations de fonctions et procédures
proc
liste des procédures ;
début
Le corps de l'algorithme
action 1 ;
action2 ;
action n ;
fin
Tous les mots clés sont écrits en minuscule.
Une marque de terminaison ( ;) est utilisée entre chaque action.
- L'en-tête
Il permet d'identifier un algorithme.
- Les déclarations
C'est une liste exhaustive des objets, grandeurs utilisés et manipulés dans le
corps de l ' algorithme ; cette liste est placée en début d'algorithme.
- Le corps
Dans cette partie de l'algorithme, sont placées les tâches (instructions, opérations) à exécuter.
- Les commentaires :
Les commentaires sont utilisés juste pour une explication. Il ne seront pas pris en compte.
Un commentaire est encadré par deux { }
Exemple :
Algorithme somme ;
{cet algorithme calcule la somme deux de entier}
Var a,b, lasomme: entiers {déclarations: réservation éspace-mémoire}
Début
Lire (a,b) ;
Lesomme A+b ;
Afficher (lasomme) ;
Fin.
8* Déclaration de constante et de variables :
- a) Les constantes :
Elles représentent des chiffres, des nombres, des caractères, des chaînes de caractères, dont la valeur ne peut pas être modifiée au cours de l'exécution de l'algorithme.
Si je veux calculer la surface d'un cercle, je demanderai à l'ordinateur de calculer la formule :
A = PI * r ^ 2
PI est une constante. PI = 3.14
Mot clé est : const
- b) Les variables :
Elles peuvent stocker des chiffres des nombres, des caractères, des chaînes de caractères, dont la valeur peut être modifiée au cours de l'exécution de l'algorithme.
Mot clé : var
Les constantes et les variables sont définies dans la partie déclarative par deux caractéristiques essentielles, à savoir :
L' identificateur : c'est le nom de la variable ou de la constante. Il est composé de lettres et de chiffres
Le type : il détermine la nature de la variable ou de la constante (entier, réel, booléen, chaîne de caractères)
b-1) L’identificateur :
Un symbole est un nom qui étiquette une variable, une constante.
Dans le problème précédent, "r" et "A" sont les noms des variables. "r" et "A" sont des cases mémoire qui contiendront les valeurs du rayon et le résultat du calcul.
Physiquement, cela peut s’expliquer comme suit :
Le programme s'exécute dans le microprocesseur. Les données sont rangées dans la mémoire.
"r" et "A" désignent donc les emplacements dans la mémoire où les données attendent pour le calcul. On peut décomposer l'instruction de calcul A = PI * r ^ 2 comme suit :
- Je vais chercher ce que vaut PI
- Je vais chercher la donnée contenue dans la variable/mémoire "r"
- Je calcule le carré (r * r)
- Je multiplie par PI
- Je range le résultat dans la variable/mémoire "A"
Caractéristique d’un identificateur :
Un identificateur de variable ou de constante doit être :
Significatif : exemple : pour identifier la variable représentant une quantité on utilise les identificateurs :
Quantite, quant, qt, q
Ne doit pas comporter un espace
Prix unitaire est un identificateur faux
Somme des entiers est un identificateur faux
Ne commence pas par un chiffre :
1som est un identificateur faux
Annee2009 est un identificateur correct
b-2) les types de base
L'algorithmique manipule des données selon un type. Le type définit plusieurs choses :
- La nature de la donnée ou l’ensemble dans lequel l’objet prend ses valeurs.
- Le format que la machine utilise pour stocker cette information. (par exemple, on peut choisir de stocker un entier sur plus ou moins d'octets).
Nous considérerons cinq types de base :
- Entier les entiers naturel ………..-2 -1 0 1 2 ………………
- Reel les entiers réels : 1.5 2.03
- Booleen Il ne peut prendre que deux états : VRAI ou FAUX
- Le caractère
'a', 'A','*','7','z',' !'.
Un caractère est encadré par deux cotes ‘ ‘.
Mot clé : car
'électronique', 'cd ROM de 80mn'
Une chaîne de caratère est encadrée par deux cotes ‘ ‘.
Mot clé : chaîne
Déclaration des variables :
Une variable est déclarée au début du programme en associant un identificateur à un type donné.
Var identificateur : type ;
Exemple :
Var a, b : entier ;
Réserver deux boites ou case mémoire une va être identifiée par l’étiquette a et l’autre b .
le contenu des deux case doit être des entiers.
Déclaration de constantes:
Une constante est déclarée en spécifiant son identificateur et sa valeur
Const identificateur = valeur ;
Exemple : const PI = 3.14 ;
Remarques :
- Dans un algorithme, on ne peut pas déclarer deux variables ayant le même nom ou identificateur.
- la déclaration a : entier ;
b :entier ;
peut être remplacée par a,b : entier ;
- toutes les variables et constantes utilisées dans un algorithme doivent êtres déclarées dans la partie déclaration.
… … …
2.2.1. Types prédéfinis en C++
Les types prédéfinis en C++ permettent de représenter :
- des nombres entiers ou réels
- des caractères ou des textes
- des valeurs de vérité (ou booléens)
- la notion de rien, i.e. aucun résultat
2.2.2. Les types entiers
Le langage C++ possède plusieurs types entiers, adaptés aux informations manipulées au niveau du processeur. Le tableau suivant résume ces types, et indique pour chaque type le nombre d’octets nécessaires au codage d’une valeur, ainsi que le domaine de définition du type (les bornes inférieure et supérieure des entiers représentables) :
...
Il existe 2 variantes du type int standard, une variante courte (short) et une variante longue (long). Pour chacune de ces trois variantes, il en existe une version signée (signed) ou non signée (unsigned).
Le mot clé signed peut être omis. Dans le cas d’une variante courte ou longue, le mot clé int peut être omis. Autrement dit, sur quelques exemples :
- signed long int peut être abrégé en long
- signed int peut être abrégé en int
- unsigned short int peut être abrégé en unsigned short
De façon générale, l’obtention des bornes du domaine de définition d’un type entier suit le schéma suivant : si n est le nombre de bits nécessaire au codage (1 octet = 8 bits), alors :
- si le type entier est signé, les bornes sont –2n-1 .. 2n-1-1 ; en effet, 1 bit est consommé pour coder le signe (0 si positif, 1 si négatif) ; il reste donc n-1 bits pour coder le nombre.
- si le type est non signé, ces bornes deviennent 0 .. 2n -1
L’occupation mémoire de ces types est caractéristique des technologies 16 ou 32 bits de ces dernières années. Le passage à des processeurs 64 bits devrait provoquer un doublement des tailles indiquées (2 octets pour les entiers courts, 4 pour les standard et 8 pour les longs).
Les littéraux
Un littéral entier est l’écriture d’une valeur entière. En C++, il existe plusieurs manières de désigner un entier :
- s’il s’agit d’une écriture décimale d’un nombre, un littéral entier est une simple séquence de chiffres (0 à 9), éventuellement précédée d’un signe (+ ou -)
Exemple : 10 +10 -100
- s’il s’agit d’une écriture octale d’un nombre, un littéral entier est une simple séquence de chiffres (0 à 7) commençant nécessairement par le chiffre 0, éventuellement précédée d’un signe (+ ou -) ; techniquement, le premier 0 est appelé préfixe du littéral.
Exemple : 010 (8 en décimal) +010 (idem) -010 (-8 en décimal)
- s’il s’agit d’une écriture hexadécimale d’un nombre, un littéral entier est une simple séquence de chiffres (0 à 9) ou de lettres (A à F, majuscules ou minuscules) commençant nécessairement par 0x, éventuellement précédée d’un signe (+ ou -)
Exemple : 0x1F (31 en décimal) +0x10 (16 en décimal) -0x10 (-16 en décimal)
Par défaut, de tels littéraux sont de type int s’ils sont dans les bornes du type, de type long sinon.
Il est possible de forcer un littéral entier à être considéré comme d’un type non signé en le faisant suivre d’un U (majuscule ou minuscule) ; techniquement, U est appelé suffixe du littéral.
Exemple : 0x1FU +10U -010U
Il est possible de forcer un littéral entier à être considéré comme d’un type long en ajoutant le suffixe L (majuscule ou minuscule).
Exemple : 0x1FL +10L -010L
Les deux suffixes U et L sont combinables (ordre sans importance).
Exemple : 0x1FUL représente le nombre 31 codé comme un entier long non signé
Opérateurs prédéfinis
Si a et b sont deux entiers d’un même type entier T, alors chacune des opérations ci-après retourne un résultat de type T, quand il existe :
+a retourne a (identité)
-a retourne l’opposé de a
a+b retourne la somme de a et b
a-b retourne la différence de a par b
a*b retourne le produit de a par b
a<
b
a/b retourne le quotient de la division entière de a par b
a>>b retourne le résultat de a/2 b
(quotient de la division entière)
a%b retourne le reste de la division entière de a par b
Exemple : 17/3 vaut 5, alors que 17%3 vaut 2. De même, 3<>3 vaut 3 (25/2 3)
Lorsque ces opérateurs sont combinés les uns avec les autres, des règles de priorité et d’associativité permettent de lever toute ambiguïté sur l’ordre des calculs à effectuer (voir la section 3.2).
Règles de transformation de type
Le compilateur C++ peut automatiquement transformer une valeur entière d’un type donné T en une valeur équivalente d’un autre type entier T’, si le contexte l’exige.
Exemple : 1 peut être transformé en 1L, sans perte de précision ; l’inverse est également vrai.
Mais 1 000 000 001L ne peut être converti en une valeur équivalente du type short int.
Si la conversion de type est impossible, soit la conversion opère, avec à la clef un résultat incohérent, soit votre programme s’arrête avec une levée d’exception : une erreur est générée, qu’il est possible de traiter pour éventuellement poursuivre le programme. Le comportement dépend des options du compilateur C++ utilisé.
… … …
Les littéraux
Un littéral flottant est l’écriture d’une valeur flottante. Un tel littéral se construit ainsi :
- écrire un nombre entier, éventuellement signé
- faire suivre impérativement du caractère ‘.’ (point)
- faire suivre éventuellement d’un entier non signé
- faire suivre éventuellement de la lettre E (ou e) suivie d’un entier signé ou non
Les points 1 à 3 permettent d’écrire la mantisse, le dernier l’exposant. La mantisse peut avoir n’importe quelle valeur.
Exemples : 1.0 +1.0 -10.0 1. -1.0E4 31415.927E-4
Par défaut, de tels littéraux sont de type double.
Il est possible de forcer un littéral flottant à être considéré comme un float en le suffixant par un F (majuscule ou minuscule).
Exemple : 1.0F +1.0E-20F
Il est possible de forcer un littéral flottant à être considéré comme long double en ajoutant le suffixe L (majuscule ou minuscule).
Exemple : 1.0L +1.0E-20L
Opérateurs prédéfinis
Si a et b sont deux flottants d’un même type T, alors chacune des opérations cidessous retourne un résultat de type T, quand il existe :
+a retourne a (identité)
-a retourne l’opposé de a
a+b retourne la somme de a et b
a-b retourne la différence de a par b
a*b retourne le produit de a par b
a/b retourne la division de a par b
Exemple : 17.0/3.0 retourne 5.666667