LANGAGE DE
PROGRAMMATION
C++
• Le langage C++ est un langage évolué et structuré. C’est en ce sens une évolution du langage
C.
• Il possède en outre les fonctionnalités de la programmation orienté objet.
• Le langage C++ se trouve à la frontière entre le langage C, non objet, et le langage JAVA conçu
d’emblée en orienté objet.
• On trouve sur le marché un grand nombre de compilateurs C++ destinés à différents
microprocesseurs ou microcontrôleurs.
• Le langage C++ possède assez peu d'instructions, il fait par contre appel à des bibliothèques,
fournies en plus ou moins grand nombre avec le compilateur.
• exemples :
• Math.h bibliothèque de fonctions mathématiques .
• Iostream.h bibliothèque d ’entrées sortie standard
• complex.h : bibliothèque contenant la classe des nombres complexes.
ETAPES PERMETTANT L'EDITION, LA MISE AU
POINT, L'EXECUTION D'UN PROGRAMME
• 1- Edition du programme source, à l'aide d'un éditeur (traitement de textes). Le nom du fichier
contient l'extension .CPP, exemple: EXI_1.CPP (menu « edit »).
• 2- Compilation du programme source, c'est à dire création des codes machine destinés au
microprocesseur utilisé. Le compilateur indique les erreurs de syntaxe mais ignore les fonctions-
bibliothèque appelées par le programme.
• Le compilateur génère un fichier binaire, non éditable en mode « texte », appelé fichier objet:
EXI_1.OBJ (commande « compile »).
• 3- Editions de liens: Le code machine des fonctions-bibliothèque est chargé, création d'un fichier
binaire, non éditable en mode texte, appelé fichier exécutable: EXI_1.EXE (commande « build all »).
• 4- Exécution du programme (commande « Run » ou « flèche jaune »).
• Les compilateurs permettent en général de construire des programmes composés de plusieurs fichiers
sources, d'ajouter à un programme des unités déjà compilées. On dit alors que l’on travaille par
gestion de projet
EXERCICE I-1: EDITER (EXI_1.CPP), COMPILER ET
EXÉCUTER LE PROGRAMME SUIVANT:
• Le langage C++ distingue les minuscules, des majuscules. Les mots réservés du
langage C++ doivent être écrits en minuscules.
• On a introduit dans ce programme la notion d’interface homme/machine (IHM).
• - L’utilisateur visualise une information sur l’écran,
• - L’utilisateur, par une action sur le clavier, fournit une information au programme.
• Les instructions sont exécutées séquentiellement, c’est à dire les unes après les
autres. L’ordre dans lequel elles sont écrites a donc une grande importance.
• Echanger les 2 premières instructions, puis exécuter le programme. Modifier
maintenant le programme comme ci-dessous, puis le tester :
• Dans ce programme, on introduit 3 nouveaux concepts :
• - La notion de déclaration de variables : les variables sont les données que manipulera le
• programme lors de son exécution. Ces variables sont rangées dans la mémoire vive de
• l’ordinateur. Elles peuvent être déclarées au moment où on en a besoin dans le programme.
• Pour une meilleure lisibilité, il est conseillé de les déclarer au début (sauf peut-être pour des
• variables créées par commodité et qui ne servent que très localement dans le programme).
• - La notion d’affectation, symbolisée par le signe =. La source de l’information est à droite du
• signe =, la destination à gauche.
• - La notion d’opération. Un programme informatique est exécuté séquentiellement,
c’est à
• dire une instruction après l’autre. Lorsque l’instruction s = a + b est exécutée, a
possède la
• valeur 10, et b possède la valeur 50.
• Echanger les 2 premières instructions, puis exécuter le programme. Modifier
maintenant le programme comme ci-dessous, puis le tester :
• Dans ce programme, on introduit 3 nouveaux concepts :
• - La notion de déclaration de variables : les variables sont les données que manipulera le
• programme lors de son exécution. Ces variables sont rangées dans la mémoire vive de
• l’ordinateur. Elles peuvent être déclarées au moment où on en a besoin dans le programme.
• Pour une meilleure lisibilité, il est conseillé de les déclarer au début (sauf peut-être pour
des
• variables créées par commodité et qui ne servent que très localement dans le programme).
• - La notion d’affectation, symbolisée par le signe =. La source de l’information est à droite
du
• signe =, la destination à gauche.
• La notion d’opération. Un programme informatique est exécuté séquentiellement,
c’est à
• dire une instruction après l’autre. Lorsque l’instruction s = a + b est exécutée, a
possède la
• valeur 10, et b possède la valeur 50.
LES DIFFERENTS TYPES DE VARIABLES
• 1- Les entiers
• Le langage C++ distingue plusieurs types d'entiers:
• Numération:
• - En décimal les nombres s'écrivent tels que,
• - En hexadécimal ils sont précédés de 0x.
• exemple: 127 en décimal s'écrit 0x7f en hexadécimal.
• Remarque: En langage C++, le type char possède une fonction de changement de type
vers un entier:
• - Un caractère peut voir son type automatiquement transformé vers un entier de 8 bits
• - Il est interprété comme un caractère alphanumérique du clavier.
• Exemples:
• Les caractères alphanumériques s'écrivent entre ‘ ‘ Le caractère 'b' a pour valeur 98.
• Le caractère 22 a pour valeur 22. Le caractère 127 a pour valeur 127.
• Le caractère 257 a pour valeur 1 (ce nombre s'écrit sur 9 bits, le bit de poids fort est
perdu).
QUELQUES CONSTANTES CARACTÈRES:
MODIFIER AINSI LE PROGRAMME ET LE TESTER :
• 2- Les réels
• Un réel est composé :
• - d'un signe,
• - d'une mantisse,
• - d'un exposant,
• Un nombre de bits est réservé en mémoire pour chaque élément.
• Le langage C++ distingue 2 types de réels:
EXERCICE I-3: AFFICHAGE D'UNE VARIABLE DE
TYPE INT OU FLOAT: TESTER LE PROGRAMME
SUIVANT ET CONCLURE.
• Exercice I-4:
• a et b sont des entiers, a = -21430 b = 4782, calculer et afficher a+b, a-b, a*b, a/b,
• a%b en soignant l’interface homme/machine.
• Indication: a/b donne le quotient de la division, a%b donne le reste de la division.
• Exercice I-5: Affichage d'une variable de type char : tester le programme ci-dessous
et conclure.
• Exercice I-6:
• Pour votre compilateur C++, la taille des entiers est de 32 bits;
• Que va-t-il se passer, à l'affichage, lors de l'exécution du programme suivant ?
• Exercice I-7:
• a et b sont des réels, a = -21,43 b = 4,782, calculer et afficher a+b, a-b, a*b, a/b, en
• soignant l’interface homme/machine.
LES OPERATEURS
• Opérateurs arithmétiques sur les réels: + - * / avec la hiérarchie habituelle.
• Opérateurs arithmétiques sur les entiers: + - * / (quotient de la division) % (reste de
la division) avec la hiérarchie habituelle.
• Exemple particulier: char c, d; c = 'G'; d = c+'a'-'A';
• Les caractères sont des entiers sur 8 bits, on peut donc effectuer des opérations. Sur
cet exemple, on transforme la lettre majuscule G en la lettre minuscule g.
• Exercice I-8: n est un entier (n = 0x1234567a), p est un entier (p = 4). Ecrire un
programme qui met à 0 les p bits de poids faibles de n.
• Exercice I-9: quels nombres va renvoyer le programme suivant ?
INCREMENTATION - DECREMENTATION
• Le langage C++ autorise des écritures simplifiées pour l'incrémentation et la
décrémentation de variables de type entier (int, char, long)
• i = i+1; est équivalent à i++; i = i-1; est équivalent à i--;
OPERATEURS COMBINES
• Le langage C++ autorise des écritures simplifiées lorsqu'une même variable est utilisée de
chaque côté du signe = d'une affectation. Ces écritures sont à éviter lorsque l'on débute
l'étude du langage C++ car elles nuisent à la lisibilité du programme.
•
LES DECLARATIONS DE CONSTANTES
• Le langage C++ autorise 2 méthodes pour définir des constantes.
1ere méthode: déclaration d'une variable, dont la valeur sera constante pour toute la
portée de la fonction main.
• Dans ce cas, le compilateur réserve de la place en mémoire (ici 4 octets), pour la
variable pi, on ne peut changer la valeur. On peut associer un modificateur« const »
à tous les types.
• 2eme méthode: définition d'un symbole à l'aide de la directive de compilation #define.
• Le compilateur ne réserve pas de place en mémoire, on définit ainsi une équivalence
« lexicale ».
• Les constantes déclarées par #define s'écrivent traditionnellement en majuscules,
mais ce n'est pas une obligation.
LES CONVERSIONS DE TYPES
• Le langage C++ permet d'effectuer automatiquement des conversions de type sur les
scalaires:
• Exemple et exercice I-11:
• Une conversion de type float --> int ou char peut-être dégradante. Une conversion de
type int ou char --> float est dite non dégradante.
CHAPITRE 2
SAISIE DE NOMBRES ET DE CARACTERES AU
CLAVIER
Les parenthèses vides de getch() signifient qu'aucun paramètre n'est
passé à cette fonction par le programme appelant.
L’OPERATEUR CIN
• L’opérateur cin, spécifique à C++, appartient à la bibliothèque iostream.h, et permet
la saisie à partir du clavier de n'importe quel type de variable (l’affichage prend en
compte le type de la variable).
• La saisie s'arrête avec "RETURN" (c'est à dire LF), les éléments saisis s'affichent à
l'écran (saisie avec écho écran).
• Tous les éléments saisis après un caractère d'espacement (espace, tabulation) sont
ignorés.
CORRIGE DES EXERCICES
CHAPITRE 3
LES TESTS ET LES BOUCLES
3.3.2. LES ENTRÉES
• Dès le premier code C++ que vous avez étudié, il y avait la notion de
sortie standard. Il est temps de voir le concept inverse en manipulant
l’entrée standard. Maintenant que nous connaissons le concept des
variables, demander des informations à l’utilisateur est à notre portée.
Il faut en effet pouvoir stocker quelque part la valeur qu’a tapée
l’utilisateur, ce que permettent justement les variables.
• Avez-vous remarqué à quel point cin est semblable à cout? Déjà, pour
l’utiliser, il faut le préfixer par std::, car cin est un objet appartement
à la bibliothèque standard. Et on utilise les chevrons dans le sens
inverse de cout.
4.4.1. GESTION DES ERREURS
• Et si vous rentrez une valeur qui n’a rien à voir? Que se passe-t-il si je décide de taper Maurice au lieu de 5?
Essayez donc.
1 Entre ton age :
• 2 Maurice
• 3 Tu as 0 ans.
• 4 Appuyez sur une touche pour continuer...
• Comme on veut récupérer un entier et qu’on a écrit une chaîne de caractères,
notre variable age n’est pas modifiée et vaut donc toujours 0, sa valeur par
défaut.
bien nous allons voir que si. Essayons donc de demander deux informations à
l’utilisateur: son âge et son nom.
LANCEZ CE CODE EN FAISANT EXPRÈS DE TAPER UNE CHAÎNE DE CARACTÈRES PLUTÔT
QU’UN ENTIER. VOUS DEVRIEZ OBTENIR LE MÊME RÉSULTAT QUE SI DESSOUS.
• 1 Entre ton age : Mishka
• 2 Tu as 0 ans.
• 3 Entre ton nom : Tu t'appelle .
• 4 Appuyez sur une touche pour continuer...
• Vous n’avez rien eu le temps de taper que le programme avait fini.
C’est parce que, lorsque std::cin rencontre une erreur (comme le fait
de rentrer du texte alors qu’on attend un entier), il passe dans un état
invalide, tous les caractères invalides restent mémorisés et toutes les
utilisations suivantes de std::cin sont foireuses.
• Comment allons-nous gérer ça? Comment nettoyer std::cin s’il a
échoué? Le chapitre suivant vous apprendra un mécanisme basique
mais puissant, qu’on trouve tout le temps en programmation et qui
nous aidera à régler nos problèmes.
4.4.2. EN RÉSUMÉ
• C++ nous permet de manipuler des caractères simples, des chaînes de caractères, des nombres entiers
et des nombres réels.
• — Il existe des caractères spéciaux, comme le retour à la ligne ('n') ou le caractère nul ('0').
• — Les variables nous permettent d’associer un nom à une valeur, mais il faut respecter certaines
règles.
• — On peut utiliser auto pour laisser le compilateur déduire tout seul le type d’une expression.
• — Nous pouvons demander des informations à l’utilisateur grâce à std::cin. — Nous n’avons aucun
mécanisme de protection s’il rentre n’importe quoi.
CONTENU MASQUÉ
EXP 1
• #include <iostream>
• int main()
{
• std::cout << "Bonne journée à toi lecteur." << std::endl;
• 6return 0;
• }
EXP2
• Vous remarquerez qu’on répète quand même plusieurs fois les mêmes
instructions. Ce n’est pas grave. Nous verrons très bientôt comment
remédier à ce problème. L’essentiel est que vous ayez pu voir
l’avantage d’utiliser des variables.
5. LE CONDITIONNEL CONJUGUÉ EN C++
• «Le conditionnel est un mode employé pour exprimer un état soumis à une
condition.» Telle est la définition qu’en donne Wikipédia . Cela vous rappelle-t-il
vos cours de français? Mais quel peut bien être le rapport avec la
programmation? C’est que C++ permet aussi d’exprimer des conditions et
donc de modifier le comportement de notre programme.
• Ce chapitre va donc introduire les conditions à notre palette d’outils et permettra
de résoudre la problématique soulevée en conclusion du chapitre précédent.
5.1. LES BOOLÉENS
• Les conditions en C++ sont régies par un principe simple, qui est qu’une condition est
soit vraie, soit fausse. Finalement, c’est un peu comme dans la réalité. Si je vous pose
la question «Êtes-vous majeurs?», la réponse est soit oui, soit non. De même, «Faîtes-
vous 1m80 ou plus?» entraînera soit une réponse positive, soit négative.
• C++ nous offre un type conçu exprès pour ça, bool. Ce type peut prendre deux valeurs:
soit true, signifiant vrai, soit false qui veut dire faux. Voyez par vous-mêmes l’exemple
on ne peut plus bête ci-dessous.
• int main()
• {
• bool const vrai { true };
• bool const faux { false };
• return 0;
• }
• L’intérêt semble en effet très faible si l’on se contente du code
précédent. Sachez que les booléens sont partout, utilisables grâce à ce
que l’on appelle les opérateurs de comparaisons. En voici la liste
juste ci-dessous.
• Opérateur d’égalité
• Non, == n’est pas une erreur. Il faut bien deux signes =, pour différencier avec
l’opération consistant à modifier la valeur d’une variable.
Le rapport avec les booléens? Chacune des expressions suivantes renvoie true ou
false. Faisons donc un petit test.
• Lancez donc ce code, analysez les résultats. Sont-ils
logiques? Maintenant, changez la valeur des variables et
observez de nouveau. Est-ce que c’est toujours logique?
Voyez-vous maintenant un peu plus l’utilité des booléens?
5.2. IF— SI, ET SEULEMENT SI…
• Maintenant, examinons la façon de poser une question en C++, si
l’on peut dire. Nous allons en effet découvrir la première structure de
contrôle: if. Ce mot-clef est un mot anglais signifiant «si», et exécute
des instructions si, et seulement si la condition donnée est vraie.
Voyez donc ce schéma.
• En C++, voici à quoi ressemble cette instruction. Toutes les instructions entre accolades seront exécutées si
condition est vraie.
if (/* condition */)
• {
• // Code à exécuter si la condition est vraie.
• }
PRENONS UN EXEMPLE. AFFICHONS LA NOTE À UN EXAMEN, RENTRÉE PAR L’UTILISATEUR. SI CELLE-CI
EST SUPÉRIEURE OU ÉGALE À 16, NOUS AFFICHERONS UN MESSAGE DE FÉLICITATIONS.
5.2.1. À PORTÉE
• Nous pouvons également déclarer des variables au sein du bloc d’accolades. Cependant, celles-ci ne sont
utilisables que jusqu’à l’accolade fermante correspondante. Ainsi, le code ci-dessous n’est pas correct.
• Ce sont les règles de C++ qui veulent ça. Quand on écrit un nouveau bloc à base
d’accolades, on dit qu’on crée une nouvelle portée. Et une variable n’est
utilisable que dans la portée, ou le bloc d’accolade, où elle a été déclarée.
• C’est une bonne pratique de déclarer ses variables dans la plus petite portée
possible. Il y a plusieurs raisons à ça.
• — Dans le cas d’un code long et complexe, déclarer une variable au plus près
possible de son utilisation permet de ne pas avoir à parcourir de longues lignes
pour en obtenir des détails (quel est son type, sa valeur de base, etc). Cela aide à
la lecture et la compréhension du code.
• — Lorsqu’on atteint la fin du bloc correspondant, le programme libère dans la
mémoire les emplacements qu’il avait réservés pour les variables qui s’y
trouvaient. Dans le cas d’un int comme ici, ça ne change rien. Mais dans le cas
de variables plus complexes que nous verrons plus tard, cela peut avoir une
grande incidence sur les performances du programme.
• Ainsi, je vous encourage fortement à déclarer vos variables à l’intérieur de vos
blocs de condition si elles ne sont pas destinées à être utilisées ailleurs.
5.3. ELSE— SINON…
• Maintenant que nous avons vu comment changer le code si une
condition est vérifiée, voyons comment faire l’opposé, c’est-à-dire
comment agir si celle-ci est fausse. Imaginons un programme
demandant si l’utilisateur est majeur ou mineur. On peut imaginer
quelque chose comme ce qui suit.
• Ce programme est fonctionnel mais un peu lourd, puisqu’on répète
deux fois une condition quasiment identique. Heureusement, C++
nous offre un autre mot-clef, else, qui exécute des instructions si la
condition du if est fausse. Voyez-vous mêmes le code ci-dessous.
• Le code se lit ainsi en français: «Si l’âge rentré par l’utilisateur est
supérieur ou égal à 18 ans, alors afficher “Tu es majeur”, sinon
afficher “Tu es mineur”.» Le mot-clef else est en effet un mot
d’anglais qui existe et qui signifie, comme vous l’avez compris,
«sinon».
• Notez bien que, contrairement au if, else n’a pas de parenthèse pour
préciser une condition. En effet, rappelons que else signifie «tout le
reste». Y’a t-il donc un moyen de tester plusieurs conditions
différentes avant de faire «tout le reste»? Sommes-nous condamnés à
utiliser une suite de if et de else?
5.4. ELSE IF— LA COMBINAISON DES DEUX PRÉCÉDENTS
• Comme vous l’avez vu en lisant le titre de cette section, C++ est un
langage bien conçu qui répond à la problématique de la section
précédente. La combinaison else if s’utilise en effet entre un if et un
else pour dire «ou si cette condition est vraie.» Voyons déjà à quoi
ressemble la syntaxe pour vous donner une idée.
• Vous voyez le principe? Bien, passons donc à un exercice concret.
Imaginons un programme qui affiche des messages différents en
fonction de l’âge de l’utilisateur. Mettez le texte et choisissez les âges
que vous souhaitez. Une solution parmi d’autre se trouve ci-dessous.
5.5. CONDITIONS IMBRIQUÉES
• Il est tout à fait possible de tester des conditions au sein d’autres
conditions. Si l’on prend l’exemple d’un menu de restaurant, on peut
imaginer demander au client s’il veut de la viande ou un plat
végétarien. Dans le premier cas, il faut lui demander la cuisson
souhaitée; dans le deuxième, on lui laisse le choix du légume. Cela
est tout à fait possible en C++.
INSTRUCTION CONDENSÉE
L’INSTRUCTION ELSE IF, VUE PLUS HAUT, CORRESPOND EN FAIT À UN IF DANS UN ELSE.
• II.5.7. La logique booléenne
• Nous avons vu les différents moyens de tester des conditions, ainsi que différents opérateurs
de comparaisons qui retournent des booléens. Mais ce ne sont pas les seuls. Cette section va
introduire l’algèbre booléenne , et rassurez-vous, c’est simple à comprendre, puissant et bien
utile.
• II.5.7.1. AND— Tester si deux conditions sont vraies
• Imaginons un instant que vous souhaitiez faire l’acquisition d’une voiture. Pour cela, il vous
faut remplir deux conditions: avoir le permis et suffisamment d’argent. Si l’une des deux
conditions n’est pas remplie, ou les deux, vous continuerez à prendre le bus. Le seul moyen
de faire hurler le moteur sur l’autoroute, c’est d’avoir assez d’argent ET d’avoir le permis.
• C++ nous fournit deux moyens d’exprimer cet opérateur logique «ET»: && et and. Les
deux sont parfaitement valables et interchangeables. Le deuxième était notamment prévu à
l’époque où tous les claviers ne possédaient pas le symbole & .
• Testez donc ce programme en modifiant le prix de la voiture, l’argent
disponible ou la possession ou non du permis. Comme écrit plus haut,
il n’y a que si a_le_permis est à true et qu’il y a plus d’argent que le
prix de la voiture que vous serez en mesure d’avoir les clés.
• Voici ce qu’on appelle la table de vérité de l’opérateur AND, qui
formalise les entrées et les sorties de cet opérateur. N’hésitez pas à en
lire plus sur le sujet s’il vous intéresse.
5.7.2. OR— TESTER SI AU MOINS UNE CONDITION EST VRAIE
• Encore une fois, faites vôtre ce programme et modifiez-le. Voyez
dans quelles circonstances l’entrée est gratuite et à quels moments il
faut payer. Vous allez obtenir des résultats identiques à la table de
vérité ci-dessous.
5.7.3. NOT— TESTER LA NÉGATION
• vous jetez un œil au règlement et vous voyez qu’il est interdit de nager si
l’on a un short de bain et non un maillot de bain. Vous raisonnez donc
ainsi: «Si j’ai un maillot de bain, alors tout va bien, l’entrée m’est
autorisée, je peux nager. Si j’ai un short de bain, alors l’entrée m’est
interdite et je dois en acheter un avant de nager.» Comment exprimeriez-
vous ça en C++? Peut-être avec le code ci-dessous?
NOTRE CODE DEVIENT PLUS COURT, PLUS CONCIS ET PLUS AGRÉABLE À LIRE, IL GAGNE EN
QUALITÉ. JE VOUS METS EN DESSOUS LA TABLE DE VÉRITÉ, BIEN PLUS COURTE CETTE FOIS.
• C’est une très bonne question. Dans un exemple aussi simpliste que celui-ci, monté de toute
pièce, on aurait pu, c’est vrai. Mais d’autres fois nous n’avons pas le choix, car nous utilisons du
code qui a été programmé d’une certaine façon.
5.8. Tester plusieurs expressions
Nous ne sommes absolument pas limités à tester deux expressions en même temps. On peut le
faire avec trois, quatre, dix, soixante (bien que soixante soit un exemple extrême et vraiment trop
peu lisible). Le code suivant le prouve.
• Dans le cas du même opérateur, ils sont évalués de gauche à droite. C’est le cas du
code précédent. Mais que se passe t-il si l’on mélange plusieurs opérateurs
différents dans la même expression? Sauriez-vous dire ce que quelque chose comme
expression1 && expression 2 || expression3 va donner? En effet, les opérateurs
logiques sont comme les opérateurs mathématiques que nous avons vus dans les
chapitres précédents: ils ont une priorité.
• 1. Le plus prioritaire, c’est la négation !.
• 2. Ensuite vient le «ET» &&.
• 3. Enfin, le «OU» || est le moins prioritaire.
• Ainsi, dans l’exemple !a && b, c’est d’abord !a qui est évalué, puis la nouvelle
valeur et b sont
• testées avec l’opérateur ET &&. Avec le code a && b || c && d, dans l’ordre, on
évalue a && b,
• c && d et enfin a && b || c && d.
• Bien que la priorité des opérateurs soit clairement définie par C++, une bonne
pratique consiste à ajouter des parenthèses autour des expressions pour rendre
le code plus lisible et plus clair. Si l’on reprend nos exemples, cela donne (!a)
&& b pour le premier et (a && b) || (c && d) pour le deuxième. C’est clair?
Prouvez-le-moi en mettant les parenthèses au bon endroit dans ces codes (piqués
à @gbdivers).
5.8.1. ÉVALUATION EN COURT-CIRCUIT
• imaginez un formulaire à remplir, avec de multiples questions, pour demander une place
de parking dans votre immeuble. Pour ça, il faut déjà habiter l’immeuble en question et
avoir une voiture. Si vous habitez ailleurs, pas la peine de réfléchir à la possession ou
non d’une voiture, vous êtes inéligible pour cette place de parking.
• Eh bien le compilateur mène le même raisonnement quand il évalue une expression
constituée de «AND». S’il détecte qu’une condition est fausse, alors il ne sert à rien
d’évaluer le reste de l’expression puisque le résultat est forcément faux.
• Avec l’opérateur «OR», le même principe s’applique: si l’une des expressions est
évaluée à true, alors, selon la table de vérité de l’opérateur «OR», le résultat sera true,
donc pas la peine d’évaluer le reste.
• Ce principe d’optimisation par le compilateur s’appelle l’évaluation en court-circuit. Il
permet d’optimiser l’exécution du code en ne perdant pas de temps sur des instructions
qui seront forcément évaluées à false ou à true. Quand nous avancerons dans notre
apprentissage du C++, nous verrons des cas où l’évaluation en court-circuit est bien
utile.
5.9.1. UNE PSEUDO-HORLOGE
• Demandons à l’utilisateur de rentrer un nombre et nous lui
afficherons la période de la journée correspondante: nuit, matin,
après-midi, soir. Ainsi, entre 8h et 12h, nous sommes le matin. Mais
attention, nous voulons aussi gérer les cas un peu spéciaux que sont
midi, minuit et un nombre qui n’est pas entre 0 et 24.
CORRECTION
5.9.2. SCORE
• Imaginez que vous avez un score de jeu vidéo sous la main.
• — Si le score est strictement inférieur à deux mille, affichez «C’est la catastrophe!»
• — Si le score est supérieur ou égal à deux mille et que le score est strictement inférieur à cinq
mille, affichez: «Tu peux mieux faire!»
• — Si le score est supérieur ou égal à cinq mille et que le score est strictement inférieur à neuf
mille, affichez: «Tu es sur la bonne voie!»
• — Sinon, affichez: «Tu es le meilleur!»
CORRECTION
SI VOUS BLOQUEZ, VOICI DÉJÀ LA TABLE DE VÉRITÉ DE L’OPÉRATEUR.
CONTENU MASQUÉ N°12 : CORRECTION XOR
LA SOLUTION S’ÉCRIT AINSI: (A && !B) || (B && !A). VOUS POUVEZ VÉRIFIER AVEC LE PROGRAMME
CI-DESSOUS.
II.6. DES BOUCLES QUI SE RÉPÈTENT, RÉPÈTENT, RÉPÈTENT…
• Nous sommes maintenant capables d’exécuter des codes différents en
fonction de conditions. Mais notre programme reste très linéaire: nous
exécutons les instructions l’une après l’autre, du début à la fin, de haut en
bas. Dans la droite ligne du chapitre précédent, nous allons donc voir un
mécanisme offert par C++ pour répéter autant de fois que l’on souhaite
une série d’instructions.
• Ce chapitre introduira les boucles et permettra d’améliorer encore notre
gestion des erreurs, vue dans le chapitre précédent.
• LES OPERATEURS LOGIQUES
• condition d'égalité: if (a==b) " si a est égal à b "
• condition de non égalité: if (a!=b) " si a est différent de b "
• conditions de relation d'ordre: if (a<b) if (a<=b) if (a>b) if (a>=b)
• plusieurs conditions devant être vraies simultanément, ET LOGIQUE:
• if ((expression1) && (expression2)) " si l'expression1 ET l'expression2 sont vraies "
• une condition devant être vraie parmi plusieurs, OU LOGIQUE
• if ((expression1) || (expression2)) " si l'expression1 OU l'expression2 est vraie "
• condition fausse if (!(expression1)) " si l'expression1 est fausse "
• Toutes les combinaisons sont possibles entre ces tests.
L'INSTRUCTION REPETER ... TANT QUE ...
LA BOUCLE TANT QUE ... FAIRE ...
L'INSTRUCTION POUR ...
• Il s'agit de l'instruction:
• pour (instruction1; condition; instruction2) {BLOC D'INSTRUCTIONS}
• Remarques:
• Il s’agit d’une version enrichie du « while ».
• Les {} ne sont pas nécessaires lorsque le bloc ne comporte
qu'une seule instruction. Les 3 instructions du for ne portent
pas forcément sur la même variable.
• Une instruction peut être omise, mais pas les ;
for(int i = 0 ; resultat<30 ; i++) {
............; // bloc d'instructions
............;
............;
resultat = resultat + 2*i; }
• default; cout<<"nCE CHOIX N'EST PAS PREVU "; // pas de break ici
}
• COMPLEMENT SUR LES TESTS
• En langage C++, une expression nulle de type entier (int) est fausse,
une expression non nulle de type entier (int) est vraie.
UTILISATION D'UNE BIBLIOTHEQUE
• NOTION DE PROTOTYPE
• Les fichiers de type ".h" (conio.h, dos.h iostream.h etc...), appelés fichiers d'en
tête contiennent la définition des prototypes des fonctions utilisées dans le
programme. Le prototype précise la syntaxe de la fonction: son nom, le type des
paramètres éventuels à passer, le type de l’expression - la valeur retournée au
programme (void si aucun paramètre retourné).
• Grâce aux lignes "#include", le compilateur lit les fichiers de type ".h" et vérifie
que la syntaxe de l'appel à la fonction est correcte.
FONCTIONS NE RENVOYANT RIEN AU PROGRAMME
• Ce sont les fonctions de type void. Exemple: clrscr
• fonction Efface l'écran de la fenêtre dos.
• prototype void clrscr();
• prototype dans conio.h et donc bibliothèque à charger.
• Une fonction ne renvoyant rien (de type void) s'écrit telle que. C’est une
action représentée par une instruction. Ici pas de passage d'arguments.
FONCTIONS RENVOYANT UNE VALEUR AU
PROGRAMME
FONCTIONS AVEC PASSAGE DE PARAMETRE
LES POINTEURS
• Que ce soit dans la conduite de process, ou bien dans la programmation orientée objet, l’usage
des pointeurs est extrêmement fréquent en C++.
• LES POINTEURS
• Définition: Un pointeur est une adresse. On dit que le pointeur pointe sur une variable dont le type est
défini dans la déclaration du pointeur. Il contient l’adresse de la variable.
• ARITHMETIQUE DES POINTEURS
• On peut essentiellement déplacer un pointeur dans un plan mémoire à l'aide des
opérateurs d'addition, de soustraction, d'incrémentation, de décrémentation. On ne peut
le déplacer que
• d'un nombre de cases mémoire multiple du nombre de cases réservées en
mémoire pour la variable sur laquelle il pointe.
• Lorsque l'on déclare une variable char, int, float .... un nombre de cases mémoire bien
défini est réservé pour cette variable. En ce qui concerne les pointeurs, l’allocation de la
case mémoire pointée obéit à des règles particulières :
Exemple:
• char *pc;
• Si on se contente de cette déclaration, le pointeur pointe « n’importe où ». Son usage,
tel que, dans un programme peut conduire à un « plantage » du programme ou du
système d’exploitation si les mécanismes de protection ne sont pas assez robustes.
• L’initialisation du pointeur n’ayant pas été faite, on risque d’utiliser des adresses non
autorisées ou de modifier d’autres variables.
• Exercice V_2 : Tester le programme ci-dessous et conclure
• char *pc; // normalement, il faudrait réserver !
• *pc = 'a'; // le code ASCII de a est rangé dans la case mémoire pointée par pc
• *(pc+1) = 'b'; // le code ASCII de b est rangé une case mémoire plus loin *(pc+2) = 'c'; // le
code ASCII de c est rangé une case mémoire plus loin *(pc+3) = 'd'; // le code ASCII de d est
rangé une case mémoire plus loin cout<<"Valeurs :"<<*pc<<" "<<*(pc+1)<<" "<<*(pc+2)<<"
"<<*(pc+3);
• 1ère méthode : utilisation de l’opérateur adresse :
• C’est la méthode qui a été utilisée dans l’exercice V_1. Dans ce cas,
l’utilisation de pointeurs n’apporte pas grand-chose par rapport à l’utilisation
classique de variables.
2ème méthode : affectation directe d’une adresse :
• Cette méthode est réservée au contrôle de processus, quand on connaît effectivement la
valeur de l’adresse physique d’un composant périphérique.
• Elle ne fonctionne pas sur un PC, pour lequel les adresses physiques ne sont pas dans le
même espace d’adressage que les adresses mémoires.
• Il faut utiliser l'opérateur de "cast", jeu de deux parenthèses.
• char *pc;
• pc = (char*)0x1000; // p pointe sur l'adresse 0x1000
• 3ème méthode : allocation dynamique de mémoire :
• C’est la méthode la plus utilisée et qui donne pleinement leur intérêt aux pointeurs par
rapport aux variables classiques.
• Via l’opérateur new, natif dans le C++, on réserve, pendant l’exécution du programme,
de la place dans la mémoire pour l’objet (ou la variable) pointé. L’adresse de base est
choisie par le système lors de l’exécution, en fonction du système d’exploitation.
• Le programmeur n’a à se soucier que de la quantité de cases mémoire dont il a besoin.
• Exercice V_2 : Modifier l’exercice V_2 comme ci-dessous :
• char *pc;
• pc = new char[4]; // réservation de place dans la mémoire pour 4 char
• *pc = 'a'; // le code ASCII de a est rangé dans la case mémoire pointée par pc
• *(pc+1) = 'b'; // le code ASCII de b est rangé une case mémoire suivante *(pc+2) = 'c'; //
le code ASCII de c est rangé une case mémoire suivante *(pc+3) = 'd'; // le code ASCII
de d est rangé une case mémoire suivante
• cout<<"Valeurs :"<<*pc<<" "<<*(pc+1)<<" "<<*(pc+2)<<" "<<*(pc+3); delete pc; //
libération de la place
• Remarques :
• - L’allocation dynamique peut se faire n’importe quand dans le programme (avant d’utiliser le
• pointeur !).
• - L’opérateur delete libère la place réservée quand elle devient inutile.
• - L’allocation dynamique devrait se faire dès la déclaration du pointeur avec la syntaxe
• suivante :
• char *pc = new char[4];
• - Si on a besoin d’une seule case mémoire, on écrira :
• Exercice V_3:
• adr1 et adr2 sont des pointeurs pointant sur des réels. La variable pointée par adr1 vaut
- 45,78; la variable pointée par adr2 vaut 678,89. Ecrire un programme qui affiche les
valeurs de adr1, adr2 et de leur contenu.
• L'opérateur de "cast", permet d'autre part, à des pointeurs de types différents de pointer
sur la même adresse.
• Exercice V_4:
• adr_i est un pointeur de type entier; la variable pointée i vaut 0x41424344. A
l'aide d'une conversion de type de pointeur, écrire un programme montrant le
rangement des 4 octets en mémoire.
• Exercice V_5:
• Saisir un texte de 10 caractères. Ranger les caractères en mémoire. Lire le
contenu de la mémoire et compter le nombre de lettres e.
• Exercice V_6:
• Saisir 6 entiers et les ranger à partir de l'adresse adr_deb. Rechercher le maximum,
l'afficher ainsi que sa position. La place nécessaire dans la mémoire peut-être le résultat
d’un calcul :
• int taille; char *image; cout<<"nQuelle est la taille de l’image ? (en octets)";
• cin>>taille; image = new char[taille];
• Exercice V_7:
• Reprendre l’exercice V_6 mais en demandant à l’utilisateur combien de nombres il
souhaite traiter, et en réservant en mémoire la place nécessaire.
CORRIGE DES EXERCICES
• Exercice V 4:
• L'analyse de l'exécution de ce programme, montre que les microprocesseurs INTEL rangent en mémoire
d'abord les poids faibles d'une variable.
LES TABLEAUX ET LES CHAÎNES DE CARACTÈRES
• LES TABLEAUX DE NOMBRES (INT ou FLOAT)
• Les tableaux correspondent aux vecteurs et matrices en mathématiques. Un tableau est
caractérisé par sa taille et par le type de ses éléments.
• cette déclaration signifie que le compilateur réserve dim places en mémoire pour ranger les
éléments du tableau.
• Exemples:
• int compteur[10]; le compilateur réserve des places en mémoire pour 10 entiers, soit 40
• octets.
• float nombre[20]; le compilateur réserve des places en mémoire pour 20 réels, soit 80
• octets.
Remarque: dim est nécessairement une EXPRESSION CONSTANTE (expression qui peut
contenir des valeurs ou des variables constantes – c.f. modificateur const).
• Ce ne peut être en aucun cas une combinaison des variables du programme1.
• Utilisation: Un élément du tableau est repéré par son indice. En langage C et C++ les tableaux
commencent à l'indice 0. L'indice maximum est donc dim-1.
• Exercice VI_1: Saisir 10 réels, les ranger dans un tableau. Calculer et afficher leur moyenne et leur écart-
type.
INITIALISATION DES TABLEAUX
• On peut initialiser les tableaux au moment de leur déclaration: Exemples:
• int liste[10] = {1,2,4,8,16,32,64,128,256,528}; float nombre[4] = {2.67,5.98,-8.0,0.09};
• int x[2][3] = {{1,5,7},{8,4,3}}; // 2 lignes et 3 colonnes
TABLEAUX ET POINTEURS
• En déclarant un tableau, on dispose d’un pointeur (adresse du premier élément du tableau). Le nom d’un
tableau est un pointeur sur le premier élément.
Les tableaux à une dimension:
• Les écritures suivantes sont équivalentes:
• Il en va de même avec un tableau de réels (float).
REMARQUES:
• - La déclaration d'un tableau entraîne automatiquement la réservation de places en
mémoire.
• C’est aussi le cas si on utilise un pointeur et l’allocation dynamique en exploitant
l’opérateur
• new.
• - On ne peut pas libérer la place réservée en mémoire pour un tableau créé en
allocation
• automatique (la réservation étant réalisée dans la phase de compilation – en
dehors de
• l’exécution). Par contre, en exploitant l’allocation dynamique via un pointeur, la
• Les tableaux à plusieurs dimensions:
• Un tableau à plusieurs dimensions est un pointeur de pointeur.
• Exemple: int t[3][4]; t est un pointeur de 3 tableaux de 4 éléments ou
bien de 3 lignes à 4 éléments.
• Les écritures suivantes sont équivalentes:
• t[0] &t[0][0] t adresse du 1er élément
• t[1] &t[1][0] adresse du 1er élément de la 2e ligne
• t[i] &t[i][0] adresse du 1er élément de la ième ligne
• t[i]+1 &(t[i][0])+1 adresse du 1er élément de la ième +1 ligne
• Exercice VI_3:
• Un programme contient la déclaration suivante:
• int tab[10] = {4,12,53,19,11,60,24,12,89,19};
• Compléter ce programme de sorte d'afficher les adresses des éléments du tableau.
• Exercice VI_4:
• Un programme contient la déclaration suivante:
• int tab[20] = {4,-2,-23,4,34,-67,8,9,-10,11, 4,12,-53,19,11,-60,24,12,89,19};
• Compléter ce programme de sorte d'afficher les éléments du tableau avec la présentation
suivante:
LES CHAINES DE CARACTERES
• En langage C++, les chaînes de caractères sont des tableaux de caractères. Leur manipulation est donc analogue
à celle d'un tableau à une dimension:
• Déclaration: char nom[dim]; ou bien char *nom=new char[dim];
• Exemple: char texte[20]; ou bien char *texte=new char[20];
• Il faut toujours prévoir une place de plus pour une chaîne de caractères. En effet, en C ou en C++, une chaîne de
caractère se termine toujours par le caractère NUL ('0'). Ce caractère permet de détecter la fin de la chaîne lorsque
l’on écrit des programmes de traitement.
Affichage à l'écran:
• On utilise l’opérateur cout :
• char texte[10] = « BONJOUR »; cout<<"VOICI LE TEXTE:"<<texte;
• Saisie:
• On utilise l’opérateur cin : char texte[10];
• cout<<"ENTRER UN TEXTE: ";
• cin>> texte;
• Remarque: cin ne permet pas la saisie d'une chaîne comportant des espaces : les
caractères saisis à partir de l'espace ne sont pas pris en compte.
• A l'issue de la saisie d'une chaîne de caractères, le compilateur ajoute '0' en mémoire
après le dernier caractère.
• Exercice VI_5:
• Saisir une chaîne de caractères, afficher les éléments de la chaîne caractère par caractère.
• Exercice VI_6:
• Saisir une chaîne de caractères. Afficher le nombre de lettres e de cette chaîne.
GÉNÉRALES (STRING.H):
• Nom : strcat
• Prototype : void *strcat(char *chaine1, char *chaine2);
• Fonctionnement : concatène les 2 chaînes, résultat dans chaine1, renvoie l'adresse de chaine1. Exemple
d’utilisation :
• Nom : strlen
• Prototype : int strlen(char *chaine);
• Fonctionnement : envoie la longueur de la chaîne ('0' non comptabilisé). Exemple d’utilisation :
• Nom: strrev
• Prototype : void *strrev(char *chaine);
• Fonctionnement : inverse la chaîne et, renvoie l'adresse de la chaîne inversée. Exemple d’utilisation :
• Comparaison (string.h):
• Nom : strcmp
• Prototype : int strcmp(char *chaine1, char *chaine2); Fonctionnement :
renvoie un nombre:
• - positif si chaine1 est supérieure à chaine2 (au sens de l'ordre alphabétique)
• - négatif si chaîne1 est inférieure à chaine2
• - nul si les chaînes sont identiques.
• Cette fonction est utilisée pour classer des chaînes de caractères par ordre
alphabétique.
COPIE (STRING.H):
NOM : STRCPY
PROTOTYPE : VOID *STRCPY(CHAR *CHAINE1,CHAR *CHAINE2);
FONCTIONNEMENT : RECOPIE CHAINE2 DANS CHAINE1 ET RENVOIE L'ADRESSE DE
CHAÎNE1. EXEMPLE D’UTILISATION :
• Recopie (string.h):
• Ces fonctions renvoient l'adresse de l'information recherchée en cas de succès,
sinon le pointeur NULL (c'est à dire le pointeur dont la valeur n’a jamais été
initialisée).
• void *strchr(chaine, caractere); recherche le caractère dans la chaîne. void
*strrchr(chaine, caractere); idem en commençant par la fin.
• void *strstr(chaine, sous-chaine); recherche la sous-chaîne dans la chaîne.
• Conversions (stdlib.h):
• int atoi(char *chaine); convertit la chaîne en entier
• float atof(char *chaine); convertit la chaîne en réel
• Pour tous ces exemples, la notation void* signifie que la fonction renvoie un pointeur
(l'adresse de l'information recherchée), mais que ce pointeur n'est pas typé. On peut
ensuite le typer à l'aide de l'opérateur cast.
LES FONCTIONS
• En langage C++ les sous-programmes s'appellent des fonctions.
• Une fonction possède un et un seul point d'entrée, mais éventuellement
plusieurs points de sortie (à l'aide du mot réservé return – retourner dans
le programme appelant).
• Le programme principal (void main()), est une fonction parmi les autres.
C’est le point d’entrée du programme obligatoire et unique.
• Une variable connue uniquement d'une fonction ou est une variable
locale. Une variable connue de tous les programmes est une variable
globale.
• FONCTIONS SANS PASSAGE D'ARGUMENTS ET NE RENVOYANT RIEN AU PROGRAMME.
Elle est exécutée, mais le programme appelant ne reçoit aucune valeur de retour. Exemple à
expérimenter:
• Conclusion :
• Il ne faut pas confondre déclaration avec exécution.
• Les fonctions sont déclarées au début du fichier source. Mais elles ne sont
exécutées que si elles sont appelées par le programme principal ou le sous-
programme.
• Une fonction peut donc être décrite en début de programme mais ne jamais
être exécutée.
• L’expression void bonjour() est appelé le prototype de la fonction “ bonjour ”
Exemple à expérimenter:
• Conclusion :
• Un programme peut contenir autant de fonctions que nécessaire.
• Une fonction peut appeler une autre fonction. Cette dernière doit
être déclarée avant celle qui l'appelle.
• Par contre, l'imbrication de fonctions n'est pas autorisée en C++,
une fonction ne peut pas être déclarée à l'intérieur d'une autre
fonction.
• L’expression void coucou() est appelé le prototype de la fonction
“ coucou ”
• Exemple à expérimenter:
• Conclusion:
• Les variables n et n2 ne sont connues que de la fonction
carre. Elles sont appelées variables locales à carre. Aucune
donnée n’est échangée entre main() et la fonction.
• L’expression void carre() est le prototype de la fonction “ carre
”
• Exemple à expérimenter:
• Conclusion:
• Les 2 variables locales n sont indépendantes l'une de l'autre.
La variable locale choix n'est connue que de main().
• Aucune donnée n’est échangée entre les fonctions et le
programme principal.
• L’expression void cube() est le prototype de la fonction “ cube
”
EXEMPLE À EXPÉRIMENTER :
• Conclusion:
• La variable globale n est connue de tous les programmes
(fonctions et programme principal) La variable locale choix n'est
connue que du programme principal main.
• L’échange d’information entre la fonction et le programme
principal se fait via cette variable globale.
• Un programme bien construit (lisible, organisé par fonctions, et
donc maintenable) doit posséder un minimum de variables
globales.
FONCTION RENVOYANT UNE VALEUR AU
PROGRAMME ET SANS PASSAGE D'ARGUMENTS
• Dans ce cas, la fonction, après exécution, renvoie une
valeur. Le type de cette valeur est déclaré avec la fonction.
La valeur retournée est spécifiée à l'aide du mot réservé
return. Cette valeur peut alors être exploitée par le sous-
programme appelant.
• Le transfert d’information a donc lieu de la fonction vers le
sous-programme appelant.
• Exemple à expérimenter.:
FONCTIONS AVEC PASSAGE D'ARGUMENTS
• Ces fonctions utilisent les valeurs de certaines variables du sous-
programme les ayant appelé: on passe ces valeurs au moyen d'arguments
déclarés avec la fonction.
• Le transfert d’information a donc lieu du programme appelant vers la
fonction.
• Ces fonctions peuvent aussi, si nécessaire, retourner une valeur au sous-
programme appelant via le mot réservé return.
• Exemple à expérimenter:
• Conclusion:
• x est un paramètre formel, ou argument. Ce n'est pas une variable
effective du programme. Sa valeur est donnée via n1 puis n2 par le
programme principal.
• On dit que l’on a passé le paramètre PAR VALEUR.
• On peut ainsi appeler la fonction carre autant de fois que l'on veut avec
des variables différentes.
• Il peut y avoir autant de paramètre que nécessaire. Ils sont alors
séparés par des virgules. S'il y a plusieurs arguments à passer, il faut
respecter la syntaxe suivante:
• void fonction1(int x, int y) void fonction2(int a, float b, char c)
PASSAGE DES TABLEAUX ET DES POINTEURS EN
ARGUMENT
• Exemple à expérimenter: Exercice VII_10:
présentation introduction langage c++.pptx

présentation introduction langage c++.pptx

  • 1.
  • 2.
    • Le langageC++ est un langage évolué et structuré. C’est en ce sens une évolution du langage C. • Il possède en outre les fonctionnalités de la programmation orienté objet. • Le langage C++ se trouve à la frontière entre le langage C, non objet, et le langage JAVA conçu d’emblée en orienté objet. • On trouve sur le marché un grand nombre de compilateurs C++ destinés à différents microprocesseurs ou microcontrôleurs. • Le langage C++ possède assez peu d'instructions, il fait par contre appel à des bibliothèques, fournies en plus ou moins grand nombre avec le compilateur.
  • 3.
    • exemples : •Math.h bibliothèque de fonctions mathématiques . • Iostream.h bibliothèque d ’entrées sortie standard • complex.h : bibliothèque contenant la classe des nombres complexes.
  • 4.
    ETAPES PERMETTANT L'EDITION,LA MISE AU POINT, L'EXECUTION D'UN PROGRAMME • 1- Edition du programme source, à l'aide d'un éditeur (traitement de textes). Le nom du fichier contient l'extension .CPP, exemple: EXI_1.CPP (menu « edit »). • 2- Compilation du programme source, c'est à dire création des codes machine destinés au microprocesseur utilisé. Le compilateur indique les erreurs de syntaxe mais ignore les fonctions- bibliothèque appelées par le programme. • Le compilateur génère un fichier binaire, non éditable en mode « texte », appelé fichier objet: EXI_1.OBJ (commande « compile »). • 3- Editions de liens: Le code machine des fonctions-bibliothèque est chargé, création d'un fichier binaire, non éditable en mode texte, appelé fichier exécutable: EXI_1.EXE (commande « build all »). • 4- Exécution du programme (commande « Run » ou « flèche jaune »). • Les compilateurs permettent en général de construire des programmes composés de plusieurs fichiers sources, d'ajouter à un programme des unités déjà compilées. On dit alors que l’on travaille par gestion de projet
  • 5.
    EXERCICE I-1: EDITER(EXI_1.CPP), COMPILER ET EXÉCUTER LE PROGRAMME SUIVANT:
  • 6.
    • Le langageC++ distingue les minuscules, des majuscules. Les mots réservés du langage C++ doivent être écrits en minuscules. • On a introduit dans ce programme la notion d’interface homme/machine (IHM). • - L’utilisateur visualise une information sur l’écran, • - L’utilisateur, par une action sur le clavier, fournit une information au programme. • Les instructions sont exécutées séquentiellement, c’est à dire les unes après les autres. L’ordre dans lequel elles sont écrites a donc une grande importance.
  • 7.
    • Echanger les2 premières instructions, puis exécuter le programme. Modifier maintenant le programme comme ci-dessous, puis le tester :
  • 9.
    • Dans ceprogramme, on introduit 3 nouveaux concepts : • - La notion de déclaration de variables : les variables sont les données que manipulera le • programme lors de son exécution. Ces variables sont rangées dans la mémoire vive de • l’ordinateur. Elles peuvent être déclarées au moment où on en a besoin dans le programme. • Pour une meilleure lisibilité, il est conseillé de les déclarer au début (sauf peut-être pour des • variables créées par commodité et qui ne servent que très localement dans le programme). • - La notion d’affectation, symbolisée par le signe =. La source de l’information est à droite du • signe =, la destination à gauche.
  • 11.
    • - Lanotion d’opération. Un programme informatique est exécuté séquentiellement, c’est à • dire une instruction après l’autre. Lorsque l’instruction s = a + b est exécutée, a possède la • valeur 10, et b possède la valeur 50.
  • 12.
    • Echanger les2 premières instructions, puis exécuter le programme. Modifier maintenant le programme comme ci-dessous, puis le tester :
  • 14.
    • Dans ceprogramme, on introduit 3 nouveaux concepts : • - La notion de déclaration de variables : les variables sont les données que manipulera le • programme lors de son exécution. Ces variables sont rangées dans la mémoire vive de • l’ordinateur. Elles peuvent être déclarées au moment où on en a besoin dans le programme. • Pour une meilleure lisibilité, il est conseillé de les déclarer au début (sauf peut-être pour des • variables créées par commodité et qui ne servent que très localement dans le programme). • - La notion d’affectation, symbolisée par le signe =. La source de l’information est à droite du • signe =, la destination à gauche.
  • 16.
    • La notiond’opération. Un programme informatique est exécuté séquentiellement, c’est à • dire une instruction après l’autre. Lorsque l’instruction s = a + b est exécutée, a possède la • valeur 10, et b possède la valeur 50.
  • 17.
    LES DIFFERENTS TYPESDE VARIABLES • 1- Les entiers • Le langage C++ distingue plusieurs types d'entiers:
  • 18.
    • Numération: • -En décimal les nombres s'écrivent tels que, • - En hexadécimal ils sont précédés de 0x. • exemple: 127 en décimal s'écrit 0x7f en hexadécimal. • Remarque: En langage C++, le type char possède une fonction de changement de type vers un entier: • - Un caractère peut voir son type automatiquement transformé vers un entier de 8 bits • - Il est interprété comme un caractère alphanumérique du clavier.
  • 19.
    • Exemples: • Lescaractères alphanumériques s'écrivent entre ‘ ‘ Le caractère 'b' a pour valeur 98. • Le caractère 22 a pour valeur 22. Le caractère 127 a pour valeur 127. • Le caractère 257 a pour valeur 1 (ce nombre s'écrit sur 9 bits, le bit de poids fort est perdu).
  • 20.
  • 21.
    MODIFIER AINSI LEPROGRAMME ET LE TESTER :
  • 22.
    • 2- Lesréels • Un réel est composé : • - d'un signe, • - d'une mantisse, • - d'un exposant, • Un nombre de bits est réservé en mémoire pour chaque élément. • Le langage C++ distingue 2 types de réels:
  • 27.
    EXERCICE I-3: AFFICHAGED'UNE VARIABLE DE TYPE INT OU FLOAT: TESTER LE PROGRAMME SUIVANT ET CONCLURE.
  • 29.
    • Exercice I-4: •a et b sont des entiers, a = -21430 b = 4782, calculer et afficher a+b, a-b, a*b, a/b, • a%b en soignant l’interface homme/machine. • Indication: a/b donne le quotient de la division, a%b donne le reste de la division. • Exercice I-5: Affichage d'une variable de type char : tester le programme ci-dessous et conclure.
  • 31.
    • Exercice I-6: •Pour votre compilateur C++, la taille des entiers est de 32 bits; • Que va-t-il se passer, à l'affichage, lors de l'exécution du programme suivant ?
  • 33.
    • Exercice I-7: •a et b sont des réels, a = -21,43 b = 4,782, calculer et afficher a+b, a-b, a*b, a/b, en • soignant l’interface homme/machine.
  • 34.
    LES OPERATEURS • Opérateursarithmétiques sur les réels: + - * / avec la hiérarchie habituelle. • Opérateurs arithmétiques sur les entiers: + - * / (quotient de la division) % (reste de la division) avec la hiérarchie habituelle. • Exemple particulier: char c, d; c = 'G'; d = c+'a'-'A'; • Les caractères sont des entiers sur 8 bits, on peut donc effectuer des opérations. Sur cet exemple, on transforme la lettre majuscule G en la lettre minuscule g.
  • 36.
    • Exercice I-8:n est un entier (n = 0x1234567a), p est un entier (p = 4). Ecrire un programme qui met à 0 les p bits de poids faibles de n. • Exercice I-9: quels nombres va renvoyer le programme suivant ?
  • 38.
    INCREMENTATION - DECREMENTATION •Le langage C++ autorise des écritures simplifiées pour l'incrémentation et la décrémentation de variables de type entier (int, char, long) • i = i+1; est équivalent à i++; i = i-1; est équivalent à i--;
  • 39.
    OPERATEURS COMBINES • Lelangage C++ autorise des écritures simplifiées lorsqu'une même variable est utilisée de chaque côté du signe = d'une affectation. Ces écritures sont à éviter lorsque l'on débute l'étude du langage C++ car elles nuisent à la lisibilité du programme. •
  • 40.
    LES DECLARATIONS DECONSTANTES • Le langage C++ autorise 2 méthodes pour définir des constantes. 1ere méthode: déclaration d'une variable, dont la valeur sera constante pour toute la portée de la fonction main.
  • 41.
    • Dans cecas, le compilateur réserve de la place en mémoire (ici 4 octets), pour la variable pi, on ne peut changer la valeur. On peut associer un modificateur« const » à tous les types.
  • 42.
    • 2eme méthode:définition d'un symbole à l'aide de la directive de compilation #define.
  • 43.
    • Le compilateurne réserve pas de place en mémoire, on définit ainsi une équivalence « lexicale ». • Les constantes déclarées par #define s'écrivent traditionnellement en majuscules, mais ce n'est pas une obligation.
  • 44.
    LES CONVERSIONS DETYPES • Le langage C++ permet d'effectuer automatiquement des conversions de type sur les scalaires: • Exemple et exercice I-11:
  • 45.
    • Une conversionde type float --> int ou char peut-être dégradante. Une conversion de type int ou char --> float est dite non dégradante.
  • 46.
    CHAPITRE 2 SAISIE DENOMBRES ET DE CARACTERES AU CLAVIER
  • 47.
    Les parenthèses videsde getch() signifient qu'aucun paramètre n'est passé à cette fonction par le programme appelant.
  • 48.
    L’OPERATEUR CIN • L’opérateurcin, spécifique à C++, appartient à la bibliothèque iostream.h, et permet la saisie à partir du clavier de n'importe quel type de variable (l’affichage prend en compte le type de la variable). • La saisie s'arrête avec "RETURN" (c'est à dire LF), les éléments saisis s'affichent à l'écran (saisie avec écho écran). • Tous les éléments saisis après un caractère d'espacement (espace, tabulation) sont ignorés.
  • 52.
  • 55.
    CHAPITRE 3 LES TESTSET LES BOUCLES
  • 56.
    3.3.2. LES ENTRÉES •Dès le premier code C++ que vous avez étudié, il y avait la notion de sortie standard. Il est temps de voir le concept inverse en manipulant l’entrée standard. Maintenant que nous connaissons le concept des variables, demander des informations à l’utilisateur est à notre portée. Il faut en effet pouvoir stocker quelque part la valeur qu’a tapée l’utilisateur, ce que permettent justement les variables.
  • 58.
    • Avez-vous remarquéà quel point cin est semblable à cout? Déjà, pour l’utiliser, il faut le préfixer par std::, car cin est un objet appartement à la bibliothèque standard. Et on utilise les chevrons dans le sens inverse de cout.
  • 59.
    4.4.1. GESTION DESERREURS • Et si vous rentrez une valeur qui n’a rien à voir? Que se passe-t-il si je décide de taper Maurice au lieu de 5? Essayez donc. 1 Entre ton age : • 2 Maurice • 3 Tu as 0 ans. • 4 Appuyez sur une touche pour continuer...
  • 60.
    • Comme onveut récupérer un entier et qu’on a écrit une chaîne de caractères, notre variable age n’est pas modifiée et vaut donc toujours 0, sa valeur par défaut. bien nous allons voir que si. Essayons donc de demander deux informations à l’utilisateur: son âge et son nom.
  • 62.
    LANCEZ CE CODEEN FAISANT EXPRÈS DE TAPER UNE CHAÎNE DE CARACTÈRES PLUTÔT QU’UN ENTIER. VOUS DEVRIEZ OBTENIR LE MÊME RÉSULTAT QUE SI DESSOUS. • 1 Entre ton age : Mishka • 2 Tu as 0 ans. • 3 Entre ton nom : Tu t'appelle . • 4 Appuyez sur une touche pour continuer...
  • 63.
    • Vous n’avezrien eu le temps de taper que le programme avait fini. C’est parce que, lorsque std::cin rencontre une erreur (comme le fait de rentrer du texte alors qu’on attend un entier), il passe dans un état invalide, tous les caractères invalides restent mémorisés et toutes les utilisations suivantes de std::cin sont foireuses. • Comment allons-nous gérer ça? Comment nettoyer std::cin s’il a échoué? Le chapitre suivant vous apprendra un mécanisme basique mais puissant, qu’on trouve tout le temps en programmation et qui nous aidera à régler nos problèmes.
  • 64.
    4.4.2. EN RÉSUMÉ •C++ nous permet de manipuler des caractères simples, des chaînes de caractères, des nombres entiers et des nombres réels. • — Il existe des caractères spéciaux, comme le retour à la ligne ('n') ou le caractère nul ('0'). • — Les variables nous permettent d’associer un nom à une valeur, mais il faut respecter certaines règles. • — On peut utiliser auto pour laisser le compilateur déduire tout seul le type d’une expression. • — Nous pouvons demander des informations à l’utilisateur grâce à std::cin. — Nous n’avons aucun mécanisme de protection s’il rentre n’importe quoi.
  • 65.
    CONTENU MASQUÉ EXP 1 •#include <iostream> • int main() { • std::cout << "Bonne journée à toi lecteur." << std::endl; • 6return 0; • }
  • 66.
  • 67.
    • Vous remarquerezqu’on répète quand même plusieurs fois les mêmes instructions. Ce n’est pas grave. Nous verrons très bientôt comment remédier à ce problème. L’essentiel est que vous ayez pu voir l’avantage d’utiliser des variables.
  • 68.
    5. LE CONDITIONNELCONJUGUÉ EN C++ • «Le conditionnel est un mode employé pour exprimer un état soumis à une condition.» Telle est la définition qu’en donne Wikipédia . Cela vous rappelle-t-il vos cours de français? Mais quel peut bien être le rapport avec la programmation? C’est que C++ permet aussi d’exprimer des conditions et donc de modifier le comportement de notre programme. • Ce chapitre va donc introduire les conditions à notre palette d’outils et permettra de résoudre la problématique soulevée en conclusion du chapitre précédent.
  • 69.
    5.1. LES BOOLÉENS •Les conditions en C++ sont régies par un principe simple, qui est qu’une condition est soit vraie, soit fausse. Finalement, c’est un peu comme dans la réalité. Si je vous pose la question «Êtes-vous majeurs?», la réponse est soit oui, soit non. De même, «Faîtes- vous 1m80 ou plus?» entraînera soit une réponse positive, soit négative. • C++ nous offre un type conçu exprès pour ça, bool. Ce type peut prendre deux valeurs: soit true, signifiant vrai, soit false qui veut dire faux. Voyez par vous-mêmes l’exemple on ne peut plus bête ci-dessous.
  • 70.
    • int main() •{ • bool const vrai { true }; • bool const faux { false }; • return 0; • }
  • 71.
    • L’intérêt sembleen effet très faible si l’on se contente du code précédent. Sachez que les booléens sont partout, utilisables grâce à ce que l’on appelle les opérateurs de comparaisons. En voici la liste juste ci-dessous.
  • 73.
    • Opérateur d’égalité •Non, == n’est pas une erreur. Il faut bien deux signes =, pour différencier avec l’opération consistant à modifier la valeur d’une variable. Le rapport avec les booléens? Chacune des expressions suivantes renvoie true ou false. Faisons donc un petit test.
  • 75.
    • Lancez doncce code, analysez les résultats. Sont-ils logiques? Maintenant, changez la valeur des variables et observez de nouveau. Est-ce que c’est toujours logique? Voyez-vous maintenant un peu plus l’utilité des booléens?
  • 76.
    5.2. IF— SI,ET SEULEMENT SI… • Maintenant, examinons la façon de poser une question en C++, si l’on peut dire. Nous allons en effet découvrir la première structure de contrôle: if. Ce mot-clef est un mot anglais signifiant «si», et exécute des instructions si, et seulement si la condition donnée est vraie. Voyez donc ce schéma.
  • 78.
    • En C++,voici à quoi ressemble cette instruction. Toutes les instructions entre accolades seront exécutées si condition est vraie. if (/* condition */) • { • // Code à exécuter si la condition est vraie. • }
  • 79.
    PRENONS UN EXEMPLE.AFFICHONS LA NOTE À UN EXAMEN, RENTRÉE PAR L’UTILISATEUR. SI CELLE-CI EST SUPÉRIEURE OU ÉGALE À 16, NOUS AFFICHERONS UN MESSAGE DE FÉLICITATIONS.
  • 80.
    5.2.1. À PORTÉE •Nous pouvons également déclarer des variables au sein du bloc d’accolades. Cependant, celles-ci ne sont utilisables que jusqu’à l’accolade fermante correspondante. Ainsi, le code ci-dessous n’est pas correct.
  • 81.
    • Ce sontles règles de C++ qui veulent ça. Quand on écrit un nouveau bloc à base d’accolades, on dit qu’on crée une nouvelle portée. Et une variable n’est utilisable que dans la portée, ou le bloc d’accolade, où elle a été déclarée. • C’est une bonne pratique de déclarer ses variables dans la plus petite portée possible. Il y a plusieurs raisons à ça. • — Dans le cas d’un code long et complexe, déclarer une variable au plus près possible de son utilisation permet de ne pas avoir à parcourir de longues lignes pour en obtenir des détails (quel est son type, sa valeur de base, etc). Cela aide à la lecture et la compréhension du code.
  • 82.
    • — Lorsqu’onatteint la fin du bloc correspondant, le programme libère dans la mémoire les emplacements qu’il avait réservés pour les variables qui s’y trouvaient. Dans le cas d’un int comme ici, ça ne change rien. Mais dans le cas de variables plus complexes que nous verrons plus tard, cela peut avoir une grande incidence sur les performances du programme. • Ainsi, je vous encourage fortement à déclarer vos variables à l’intérieur de vos blocs de condition si elles ne sont pas destinées à être utilisées ailleurs.
  • 83.
    5.3. ELSE— SINON… •Maintenant que nous avons vu comment changer le code si une condition est vérifiée, voyons comment faire l’opposé, c’est-à-dire comment agir si celle-ci est fausse. Imaginons un programme demandant si l’utilisateur est majeur ou mineur. On peut imaginer quelque chose comme ce qui suit.
  • 85.
    • Ce programmeest fonctionnel mais un peu lourd, puisqu’on répète deux fois une condition quasiment identique. Heureusement, C++ nous offre un autre mot-clef, else, qui exécute des instructions si la condition du if est fausse. Voyez-vous mêmes le code ci-dessous.
  • 87.
    • Le codese lit ainsi en français: «Si l’âge rentré par l’utilisateur est supérieur ou égal à 18 ans, alors afficher “Tu es majeur”, sinon afficher “Tu es mineur”.» Le mot-clef else est en effet un mot d’anglais qui existe et qui signifie, comme vous l’avez compris, «sinon».
  • 89.
    • Notez bienque, contrairement au if, else n’a pas de parenthèse pour préciser une condition. En effet, rappelons que else signifie «tout le reste». Y’a t-il donc un moyen de tester plusieurs conditions différentes avant de faire «tout le reste»? Sommes-nous condamnés à utiliser une suite de if et de else?
  • 90.
    5.4. ELSE IF—LA COMBINAISON DES DEUX PRÉCÉDENTS • Comme vous l’avez vu en lisant le titre de cette section, C++ est un langage bien conçu qui répond à la problématique de la section précédente. La combinaison else if s’utilise en effet entre un if et un else pour dire «ou si cette condition est vraie.» Voyons déjà à quoi ressemble la syntaxe pour vous donner une idée.
  • 92.
    • Vous voyezle principe? Bien, passons donc à un exercice concret. Imaginons un programme qui affiche des messages différents en fonction de l’âge de l’utilisateur. Mettez le texte et choisissez les âges que vous souhaitez. Une solution parmi d’autre se trouve ci-dessous.
  • 93.
    5.5. CONDITIONS IMBRIQUÉES •Il est tout à fait possible de tester des conditions au sein d’autres conditions. Si l’on prend l’exemple d’un menu de restaurant, on peut imaginer demander au client s’il veut de la viande ou un plat végétarien. Dans le premier cas, il faut lui demander la cuisson souhaitée; dans le deuxième, on lui laisse le choix du légume. Cela est tout à fait possible en C++.
  • 96.
    INSTRUCTION CONDENSÉE L’INSTRUCTION ELSEIF, VUE PLUS HAUT, CORRESPOND EN FAIT À UN IF DANS UN ELSE.
  • 97.
    • II.5.7. Lalogique booléenne • Nous avons vu les différents moyens de tester des conditions, ainsi que différents opérateurs de comparaisons qui retournent des booléens. Mais ce ne sont pas les seuls. Cette section va introduire l’algèbre booléenne , et rassurez-vous, c’est simple à comprendre, puissant et bien utile. • II.5.7.1. AND— Tester si deux conditions sont vraies • Imaginons un instant que vous souhaitiez faire l’acquisition d’une voiture. Pour cela, il vous faut remplir deux conditions: avoir le permis et suffisamment d’argent. Si l’une des deux conditions n’est pas remplie, ou les deux, vous continuerez à prendre le bus. Le seul moyen de faire hurler le moteur sur l’autoroute, c’est d’avoir assez d’argent ET d’avoir le permis. • C++ nous fournit deux moyens d’exprimer cet opérateur logique «ET»: && et and. Les deux sont parfaitement valables et interchangeables. Le deuxième était notamment prévu à l’époque où tous les claviers ne possédaient pas le symbole & .
  • 99.
    • Testez doncce programme en modifiant le prix de la voiture, l’argent disponible ou la possession ou non du permis. Comme écrit plus haut, il n’y a que si a_le_permis est à true et qu’il y a plus d’argent que le prix de la voiture que vous serez en mesure d’avoir les clés. • Voici ce qu’on appelle la table de vérité de l’opérateur AND, qui formalise les entrées et les sorties de cet opérateur. N’hésitez pas à en lire plus sur le sujet s’il vous intéresse.
  • 101.
    5.7.2. OR— TESTERSI AU MOINS UNE CONDITION EST VRAIE
  • 102.
    • Encore unefois, faites vôtre ce programme et modifiez-le. Voyez dans quelles circonstances l’entrée est gratuite et à quels moments il faut payer. Vous allez obtenir des résultats identiques à la table de vérité ci-dessous.
  • 104.
    5.7.3. NOT— TESTERLA NÉGATION • vous jetez un œil au règlement et vous voyez qu’il est interdit de nager si l’on a un short de bain et non un maillot de bain. Vous raisonnez donc ainsi: «Si j’ai un maillot de bain, alors tout va bien, l’entrée m’est autorisée, je peux nager. Si j’ai un short de bain, alors l’entrée m’est interdite et je dois en acheter un avant de nager.» Comment exprimeriez- vous ça en C++? Peut-être avec le code ci-dessous?
  • 106.
    NOTRE CODE DEVIENTPLUS COURT, PLUS CONCIS ET PLUS AGRÉABLE À LIRE, IL GAGNE EN QUALITÉ. JE VOUS METS EN DESSOUS LA TABLE DE VÉRITÉ, BIEN PLUS COURTE CETTE FOIS.
  • 107.
    • C’est unetrès bonne question. Dans un exemple aussi simpliste que celui-ci, monté de toute pièce, on aurait pu, c’est vrai. Mais d’autres fois nous n’avons pas le choix, car nous utilisons du code qui a été programmé d’une certaine façon. 5.8. Tester plusieurs expressions Nous ne sommes absolument pas limités à tester deux expressions en même temps. On peut le faire avec trois, quatre, dix, soixante (bien que soixante soit un exemple extrême et vraiment trop peu lisible). Le code suivant le prouve.
  • 109.
    • Dans lecas du même opérateur, ils sont évalués de gauche à droite. C’est le cas du code précédent. Mais que se passe t-il si l’on mélange plusieurs opérateurs différents dans la même expression? Sauriez-vous dire ce que quelque chose comme expression1 && expression 2 || expression3 va donner? En effet, les opérateurs logiques sont comme les opérateurs mathématiques que nous avons vus dans les chapitres précédents: ils ont une priorité. • 1. Le plus prioritaire, c’est la négation !. • 2. Ensuite vient le «ET» &&. • 3. Enfin, le «OU» || est le moins prioritaire.
  • 110.
    • Ainsi, dansl’exemple !a && b, c’est d’abord !a qui est évalué, puis la nouvelle valeur et b sont • testées avec l’opérateur ET &&. Avec le code a && b || c && d, dans l’ordre, on évalue a && b, • c && d et enfin a && b || c && d. • Bien que la priorité des opérateurs soit clairement définie par C++, une bonne pratique consiste à ajouter des parenthèses autour des expressions pour rendre le code plus lisible et plus clair. Si l’on reprend nos exemples, cela donne (!a) && b pour le premier et (a && b) || (c && d) pour le deuxième. C’est clair? Prouvez-le-moi en mettant les parenthèses au bon endroit dans ces codes (piqués à @gbdivers).
  • 111.
    5.8.1. ÉVALUATION ENCOURT-CIRCUIT • imaginez un formulaire à remplir, avec de multiples questions, pour demander une place de parking dans votre immeuble. Pour ça, il faut déjà habiter l’immeuble en question et avoir une voiture. Si vous habitez ailleurs, pas la peine de réfléchir à la possession ou non d’une voiture, vous êtes inéligible pour cette place de parking. • Eh bien le compilateur mène le même raisonnement quand il évalue une expression constituée de «AND». S’il détecte qu’une condition est fausse, alors il ne sert à rien d’évaluer le reste de l’expression puisque le résultat est forcément faux.
  • 113.
    • Avec l’opérateur«OR», le même principe s’applique: si l’une des expressions est évaluée à true, alors, selon la table de vérité de l’opérateur «OR», le résultat sera true, donc pas la peine d’évaluer le reste. • Ce principe d’optimisation par le compilateur s’appelle l’évaluation en court-circuit. Il permet d’optimiser l’exécution du code en ne perdant pas de temps sur des instructions qui seront forcément évaluées à false ou à true. Quand nous avancerons dans notre apprentissage du C++, nous verrons des cas où l’évaluation en court-circuit est bien utile.
  • 114.
    5.9.1. UNE PSEUDO-HORLOGE •Demandons à l’utilisateur de rentrer un nombre et nous lui afficherons la période de la journée correspondante: nuit, matin, après-midi, soir. Ainsi, entre 8h et 12h, nous sommes le matin. Mais attention, nous voulons aussi gérer les cas un peu spéciaux que sont midi, minuit et un nombre qui n’est pas entre 0 et 24.
  • 115.
  • 117.
    5.9.2. SCORE • Imaginezque vous avez un score de jeu vidéo sous la main. • — Si le score est strictement inférieur à deux mille, affichez «C’est la catastrophe!» • — Si le score est supérieur ou égal à deux mille et que le score est strictement inférieur à cinq mille, affichez: «Tu peux mieux faire!» • — Si le score est supérieur ou égal à cinq mille et que le score est strictement inférieur à neuf mille, affichez: «Tu es sur la bonne voie!» • — Sinon, affichez: «Tu es le meilleur!»
  • 118.
  • 119.
    SI VOUS BLOQUEZ,VOICI DÉJÀ LA TABLE DE VÉRITÉ DE L’OPÉRATEUR.
  • 120.
    CONTENU MASQUÉ N°12: CORRECTION XOR LA SOLUTION S’ÉCRIT AINSI: (A && !B) || (B && !A). VOUS POUVEZ VÉRIFIER AVEC LE PROGRAMME CI-DESSOUS.
  • 121.
    II.6. DES BOUCLESQUI SE RÉPÈTENT, RÉPÈTENT, RÉPÈTENT… • Nous sommes maintenant capables d’exécuter des codes différents en fonction de conditions. Mais notre programme reste très linéaire: nous exécutons les instructions l’une après l’autre, du début à la fin, de haut en bas. Dans la droite ligne du chapitre précédent, nous allons donc voir un mécanisme offert par C++ pour répéter autant de fois que l’on souhaite une série d’instructions. • Ce chapitre introduira les boucles et permettra d’améliorer encore notre gestion des erreurs, vue dans le chapitre précédent.
  • 122.
    • LES OPERATEURSLOGIQUES • condition d'égalité: if (a==b) " si a est égal à b " • condition de non égalité: if (a!=b) " si a est différent de b " • conditions de relation d'ordre: if (a<b) if (a<=b) if (a>b) if (a>=b) • plusieurs conditions devant être vraies simultanément, ET LOGIQUE: • if ((expression1) && (expression2)) " si l'expression1 ET l'expression2 sont vraies " • une condition devant être vraie parmi plusieurs, OU LOGIQUE • if ((expression1) || (expression2)) " si l'expression1 OU l'expression2 est vraie " • condition fausse if (!(expression1)) " si l'expression1 est fausse " • Toutes les combinaisons sont possibles entre ces tests.
  • 123.
  • 125.
    LA BOUCLE TANTQUE ... FAIRE ...
  • 127.
    L'INSTRUCTION POUR ... •Il s'agit de l'instruction: • pour (instruction1; condition; instruction2) {BLOC D'INSTRUCTIONS}
  • 129.
    • Remarques: • Ils’agit d’une version enrichie du « while ». • Les {} ne sont pas nécessaires lorsque le bloc ne comporte qu'une seule instruction. Les 3 instructions du for ne portent pas forcément sur la même variable. • Une instruction peut être omise, mais pas les ;
  • 132.
    for(int i =0 ; resultat<30 ; i++) { ............; // bloc d'instructions ............; ............; resultat = resultat + 2*i; }
  • 135.
    • default; cout<<"nCECHOIX N'EST PAS PREVU "; // pas de break ici } • COMPLEMENT SUR LES TESTS • En langage C++, une expression nulle de type entier (int) est fausse, une expression non nulle de type entier (int) est vraie.
  • 137.
    UTILISATION D'UNE BIBLIOTHEQUE •NOTION DE PROTOTYPE • Les fichiers de type ".h" (conio.h, dos.h iostream.h etc...), appelés fichiers d'en tête contiennent la définition des prototypes des fonctions utilisées dans le programme. Le prototype précise la syntaxe de la fonction: son nom, le type des paramètres éventuels à passer, le type de l’expression - la valeur retournée au programme (void si aucun paramètre retourné). • Grâce aux lignes "#include", le compilateur lit les fichiers de type ".h" et vérifie que la syntaxe de l'appel à la fonction est correcte.
  • 138.
    FONCTIONS NE RENVOYANTRIEN AU PROGRAMME • Ce sont les fonctions de type void. Exemple: clrscr • fonction Efface l'écran de la fenêtre dos. • prototype void clrscr(); • prototype dans conio.h et donc bibliothèque à charger. • Une fonction ne renvoyant rien (de type void) s'écrit telle que. C’est une action représentée par une instruction. Ici pas de passage d'arguments.
  • 139.
    FONCTIONS RENVOYANT UNEVALEUR AU PROGRAMME
  • 141.
  • 143.
    LES POINTEURS • Quece soit dans la conduite de process, ou bien dans la programmation orientée objet, l’usage des pointeurs est extrêmement fréquent en C++.
  • 144.
    • LES POINTEURS •Définition: Un pointeur est une adresse. On dit que le pointeur pointe sur une variable dont le type est défini dans la déclaration du pointeur. Il contient l’adresse de la variable.
  • 145.
    • ARITHMETIQUE DESPOINTEURS • On peut essentiellement déplacer un pointeur dans un plan mémoire à l'aide des opérateurs d'addition, de soustraction, d'incrémentation, de décrémentation. On ne peut le déplacer que • d'un nombre de cases mémoire multiple du nombre de cases réservées en mémoire pour la variable sur laquelle il pointe.
  • 147.
    • Lorsque l'ondéclare une variable char, int, float .... un nombre de cases mémoire bien défini est réservé pour cette variable. En ce qui concerne les pointeurs, l’allocation de la case mémoire pointée obéit à des règles particulières : Exemple: • char *pc; • Si on se contente de cette déclaration, le pointeur pointe « n’importe où ». Son usage, tel que, dans un programme peut conduire à un « plantage » du programme ou du système d’exploitation si les mécanismes de protection ne sont pas assez robustes. • L’initialisation du pointeur n’ayant pas été faite, on risque d’utiliser des adresses non autorisées ou de modifier d’autres variables.
  • 148.
    • Exercice V_2: Tester le programme ci-dessous et conclure • char *pc; // normalement, il faudrait réserver ! • *pc = 'a'; // le code ASCII de a est rangé dans la case mémoire pointée par pc • *(pc+1) = 'b'; // le code ASCII de b est rangé une case mémoire plus loin *(pc+2) = 'c'; // le code ASCII de c est rangé une case mémoire plus loin *(pc+3) = 'd'; // le code ASCII de d est rangé une case mémoire plus loin cout<<"Valeurs :"<<*pc<<" "<<*(pc+1)<<" "<<*(pc+2)<<" "<<*(pc+3);
  • 149.
    • 1ère méthode: utilisation de l’opérateur adresse : • C’est la méthode qui a été utilisée dans l’exercice V_1. Dans ce cas, l’utilisation de pointeurs n’apporte pas grand-chose par rapport à l’utilisation classique de variables. 2ème méthode : affectation directe d’une adresse : • Cette méthode est réservée au contrôle de processus, quand on connaît effectivement la valeur de l’adresse physique d’un composant périphérique. • Elle ne fonctionne pas sur un PC, pour lequel les adresses physiques ne sont pas dans le même espace d’adressage que les adresses mémoires. • Il faut utiliser l'opérateur de "cast", jeu de deux parenthèses. • char *pc; • pc = (char*)0x1000; // p pointe sur l'adresse 0x1000
  • 150.
    • 3ème méthode: allocation dynamique de mémoire : • C’est la méthode la plus utilisée et qui donne pleinement leur intérêt aux pointeurs par rapport aux variables classiques. • Via l’opérateur new, natif dans le C++, on réserve, pendant l’exécution du programme, de la place dans la mémoire pour l’objet (ou la variable) pointé. L’adresse de base est choisie par le système lors de l’exécution, en fonction du système d’exploitation. • Le programmeur n’a à se soucier que de la quantité de cases mémoire dont il a besoin.
  • 151.
    • Exercice V_2: Modifier l’exercice V_2 comme ci-dessous : • char *pc; • pc = new char[4]; // réservation de place dans la mémoire pour 4 char • *pc = 'a'; // le code ASCII de a est rangé dans la case mémoire pointée par pc • *(pc+1) = 'b'; // le code ASCII de b est rangé une case mémoire suivante *(pc+2) = 'c'; // le code ASCII de c est rangé une case mémoire suivante *(pc+3) = 'd'; // le code ASCII de d est rangé une case mémoire suivante • cout<<"Valeurs :"<<*pc<<" "<<*(pc+1)<<" "<<*(pc+2)<<" "<<*(pc+3); delete pc; // libération de la place
  • 152.
    • Remarques : •- L’allocation dynamique peut se faire n’importe quand dans le programme (avant d’utiliser le • pointeur !). • - L’opérateur delete libère la place réservée quand elle devient inutile. • - L’allocation dynamique devrait se faire dès la déclaration du pointeur avec la syntaxe • suivante : • char *pc = new char[4]; • - Si on a besoin d’une seule case mémoire, on écrira :
  • 154.
    • Exercice V_3: •adr1 et adr2 sont des pointeurs pointant sur des réels. La variable pointée par adr1 vaut - 45,78; la variable pointée par adr2 vaut 678,89. Ecrire un programme qui affiche les valeurs de adr1, adr2 et de leur contenu. • L'opérateur de "cast", permet d'autre part, à des pointeurs de types différents de pointer sur la même adresse.
  • 156.
    • Exercice V_4: •adr_i est un pointeur de type entier; la variable pointée i vaut 0x41424344. A l'aide d'une conversion de type de pointeur, écrire un programme montrant le rangement des 4 octets en mémoire. • Exercice V_5: • Saisir un texte de 10 caractères. Ranger les caractères en mémoire. Lire le contenu de la mémoire et compter le nombre de lettres e.
  • 157.
    • Exercice V_6: •Saisir 6 entiers et les ranger à partir de l'adresse adr_deb. Rechercher le maximum, l'afficher ainsi que sa position. La place nécessaire dans la mémoire peut-être le résultat d’un calcul : • int taille; char *image; cout<<"nQuelle est la taille de l’image ? (en octets)"; • cin>>taille; image = new char[taille];
  • 158.
    • Exercice V_7: •Reprendre l’exercice V_6 mais en demandant à l’utilisateur combien de nombres il souhaite traiter, et en réservant en mémoire la place nécessaire.
  • 159.
  • 160.
  • 161.
    • L'analyse del'exécution de ce programme, montre que les microprocesseurs INTEL rangent en mémoire d'abord les poids faibles d'une variable.
  • 166.
    LES TABLEAUX ETLES CHAÎNES DE CARACTÈRES • LES TABLEAUX DE NOMBRES (INT ou FLOAT) • Les tableaux correspondent aux vecteurs et matrices en mathématiques. Un tableau est caractérisé par sa taille et par le type de ses éléments.
  • 167.
    • cette déclarationsignifie que le compilateur réserve dim places en mémoire pour ranger les éléments du tableau. • Exemples: • int compteur[10]; le compilateur réserve des places en mémoire pour 10 entiers, soit 40 • octets. • float nombre[20]; le compilateur réserve des places en mémoire pour 20 réels, soit 80 • octets. Remarque: dim est nécessairement une EXPRESSION CONSTANTE (expression qui peut contenir des valeurs ou des variables constantes – c.f. modificateur const). • Ce ne peut être en aucun cas une combinaison des variables du programme1.
  • 168.
    • Utilisation: Unélément du tableau est repéré par son indice. En langage C et C++ les tableaux commencent à l'indice 0. L'indice maximum est donc dim-1. • Exercice VI_1: Saisir 10 réels, les ranger dans un tableau. Calculer et afficher leur moyenne et leur écart- type.
  • 170.
    INITIALISATION DES TABLEAUX •On peut initialiser les tableaux au moment de leur déclaration: Exemples: • int liste[10] = {1,2,4,8,16,32,64,128,256,528}; float nombre[4] = {2.67,5.98,-8.0,0.09}; • int x[2][3] = {{1,5,7},{8,4,3}}; // 2 lignes et 3 colonnes
  • 171.
    TABLEAUX ET POINTEURS •En déclarant un tableau, on dispose d’un pointeur (adresse du premier élément du tableau). Le nom d’un tableau est un pointeur sur le premier élément. Les tableaux à une dimension: • Les écritures suivantes sont équivalentes: • Il en va de même avec un tableau de réels (float).
  • 172.
    REMARQUES: • - Ladéclaration d'un tableau entraîne automatiquement la réservation de places en mémoire. • C’est aussi le cas si on utilise un pointeur et l’allocation dynamique en exploitant l’opérateur • new. • - On ne peut pas libérer la place réservée en mémoire pour un tableau créé en allocation • automatique (la réservation étant réalisée dans la phase de compilation – en dehors de • l’exécution). Par contre, en exploitant l’allocation dynamique via un pointeur, la
  • 173.
    • Les tableauxà plusieurs dimensions: • Un tableau à plusieurs dimensions est un pointeur de pointeur. • Exemple: int t[3][4]; t est un pointeur de 3 tableaux de 4 éléments ou bien de 3 lignes à 4 éléments.
  • 174.
    • Les écrituressuivantes sont équivalentes: • t[0] &t[0][0] t adresse du 1er élément • t[1] &t[1][0] adresse du 1er élément de la 2e ligne • t[i] &t[i][0] adresse du 1er élément de la ième ligne • t[i]+1 &(t[i][0])+1 adresse du 1er élément de la ième +1 ligne
  • 175.
    • Exercice VI_3: •Un programme contient la déclaration suivante: • int tab[10] = {4,12,53,19,11,60,24,12,89,19}; • Compléter ce programme de sorte d'afficher les adresses des éléments du tableau. • Exercice VI_4: • Un programme contient la déclaration suivante: • int tab[20] = {4,-2,-23,4,34,-67,8,9,-10,11, 4,12,-53,19,11,-60,24,12,89,19}; • Compléter ce programme de sorte d'afficher les éléments du tableau avec la présentation suivante:
  • 176.
    LES CHAINES DECARACTERES • En langage C++, les chaînes de caractères sont des tableaux de caractères. Leur manipulation est donc analogue à celle d'un tableau à une dimension: • Déclaration: char nom[dim]; ou bien char *nom=new char[dim]; • Exemple: char texte[20]; ou bien char *texte=new char[20]; • Il faut toujours prévoir une place de plus pour une chaîne de caractères. En effet, en C ou en C++, une chaîne de caractère se termine toujours par le caractère NUL ('0'). Ce caractère permet de détecter la fin de la chaîne lorsque l’on écrit des programmes de traitement. Affichage à l'écran: • On utilise l’opérateur cout : • char texte[10] = « BONJOUR »; cout<<"VOICI LE TEXTE:"<<texte; • Saisie: • On utilise l’opérateur cin : char texte[10]; • cout<<"ENTRER UN TEXTE: "; • cin>> texte;
  • 177.
    • Remarque: cinne permet pas la saisie d'une chaîne comportant des espaces : les caractères saisis à partir de l'espace ne sont pas pris en compte. • A l'issue de la saisie d'une chaîne de caractères, le compilateur ajoute '0' en mémoire après le dernier caractère. • Exercice VI_5: • Saisir une chaîne de caractères, afficher les éléments de la chaîne caractère par caractère. • Exercice VI_6: • Saisir une chaîne de caractères. Afficher le nombre de lettres e de cette chaîne.
  • 178.
    GÉNÉRALES (STRING.H): • Nom: strcat • Prototype : void *strcat(char *chaine1, char *chaine2); • Fonctionnement : concatène les 2 chaînes, résultat dans chaine1, renvoie l'adresse de chaine1. Exemple d’utilisation :
  • 179.
    • Nom :strlen • Prototype : int strlen(char *chaine); • Fonctionnement : envoie la longueur de la chaîne ('0' non comptabilisé). Exemple d’utilisation :
  • 180.
    • Nom: strrev •Prototype : void *strrev(char *chaine); • Fonctionnement : inverse la chaîne et, renvoie l'adresse de la chaîne inversée. Exemple d’utilisation :
  • 181.
    • Comparaison (string.h): •Nom : strcmp • Prototype : int strcmp(char *chaine1, char *chaine2); Fonctionnement : renvoie un nombre: • - positif si chaine1 est supérieure à chaine2 (au sens de l'ordre alphabétique) • - négatif si chaîne1 est inférieure à chaine2 • - nul si les chaînes sont identiques. • Cette fonction est utilisée pour classer des chaînes de caractères par ordre alphabétique.
  • 182.
    COPIE (STRING.H): NOM :STRCPY PROTOTYPE : VOID *STRCPY(CHAR *CHAINE1,CHAR *CHAINE2); FONCTIONNEMENT : RECOPIE CHAINE2 DANS CHAINE1 ET RENVOIE L'ADRESSE DE CHAÎNE1. EXEMPLE D’UTILISATION :
  • 183.
    • Recopie (string.h): •Ces fonctions renvoient l'adresse de l'information recherchée en cas de succès, sinon le pointeur NULL (c'est à dire le pointeur dont la valeur n’a jamais été initialisée). • void *strchr(chaine, caractere); recherche le caractère dans la chaîne. void *strrchr(chaine, caractere); idem en commençant par la fin. • void *strstr(chaine, sous-chaine); recherche la sous-chaîne dans la chaîne.
  • 184.
    • Conversions (stdlib.h): •int atoi(char *chaine); convertit la chaîne en entier • float atof(char *chaine); convertit la chaîne en réel
  • 186.
    • Pour tousces exemples, la notation void* signifie que la fonction renvoie un pointeur (l'adresse de l'information recherchée), mais que ce pointeur n'est pas typé. On peut ensuite le typer à l'aide de l'opérateur cast.
  • 194.
    LES FONCTIONS • Enlangage C++ les sous-programmes s'appellent des fonctions. • Une fonction possède un et un seul point d'entrée, mais éventuellement plusieurs points de sortie (à l'aide du mot réservé return – retourner dans le programme appelant). • Le programme principal (void main()), est une fonction parmi les autres. C’est le point d’entrée du programme obligatoire et unique. • Une variable connue uniquement d'une fonction ou est une variable locale. Une variable connue de tous les programmes est une variable globale.
  • 195.
    • FONCTIONS SANSPASSAGE D'ARGUMENTS ET NE RENVOYANT RIEN AU PROGRAMME. Elle est exécutée, mais le programme appelant ne reçoit aucune valeur de retour. Exemple à expérimenter:
  • 196.
    • Conclusion : •Il ne faut pas confondre déclaration avec exécution. • Les fonctions sont déclarées au début du fichier source. Mais elles ne sont exécutées que si elles sont appelées par le programme principal ou le sous- programme. • Une fonction peut donc être décrite en début de programme mais ne jamais être exécutée. • L’expression void bonjour() est appelé le prototype de la fonction “ bonjour ” Exemple à expérimenter:
  • 198.
    • Conclusion : •Un programme peut contenir autant de fonctions que nécessaire. • Une fonction peut appeler une autre fonction. Cette dernière doit être déclarée avant celle qui l'appelle. • Par contre, l'imbrication de fonctions n'est pas autorisée en C++, une fonction ne peut pas être déclarée à l'intérieur d'une autre fonction. • L’expression void coucou() est appelé le prototype de la fonction “ coucou ”
  • 199.
    • Exemple àexpérimenter:
  • 200.
    • Conclusion: • Lesvariables n et n2 ne sont connues que de la fonction carre. Elles sont appelées variables locales à carre. Aucune donnée n’est échangée entre main() et la fonction. • L’expression void carre() est le prototype de la fonction “ carre ”
  • 201.
    • Exemple àexpérimenter:
  • 203.
    • Conclusion: • Les2 variables locales n sont indépendantes l'une de l'autre. La variable locale choix n'est connue que de main(). • Aucune donnée n’est échangée entre les fonctions et le programme principal. • L’expression void cube() est le prototype de la fonction “ cube ”
  • 204.
  • 206.
    • Conclusion: • Lavariable globale n est connue de tous les programmes (fonctions et programme principal) La variable locale choix n'est connue que du programme principal main. • L’échange d’information entre la fonction et le programme principal se fait via cette variable globale. • Un programme bien construit (lisible, organisé par fonctions, et donc maintenable) doit posséder un minimum de variables globales.
  • 207.
    FONCTION RENVOYANT UNEVALEUR AU PROGRAMME ET SANS PASSAGE D'ARGUMENTS • Dans ce cas, la fonction, après exécution, renvoie une valeur. Le type de cette valeur est déclaré avec la fonction. La valeur retournée est spécifiée à l'aide du mot réservé return. Cette valeur peut alors être exploitée par le sous- programme appelant. • Le transfert d’information a donc lieu de la fonction vers le sous-programme appelant. • Exemple à expérimenter.:
  • 209.
    FONCTIONS AVEC PASSAGED'ARGUMENTS • Ces fonctions utilisent les valeurs de certaines variables du sous- programme les ayant appelé: on passe ces valeurs au moyen d'arguments déclarés avec la fonction. • Le transfert d’information a donc lieu du programme appelant vers la fonction. • Ces fonctions peuvent aussi, si nécessaire, retourner une valeur au sous- programme appelant via le mot réservé return. • Exemple à expérimenter:
  • 211.
    • Conclusion: • xest un paramètre formel, ou argument. Ce n'est pas une variable effective du programme. Sa valeur est donnée via n1 puis n2 par le programme principal. • On dit que l’on a passé le paramètre PAR VALEUR. • On peut ainsi appeler la fonction carre autant de fois que l'on veut avec des variables différentes. • Il peut y avoir autant de paramètre que nécessaire. Ils sont alors séparés par des virgules. S'il y a plusieurs arguments à passer, il faut respecter la syntaxe suivante: • void fonction1(int x, int y) void fonction2(int a, float b, char c)
  • 212.
    PASSAGE DES TABLEAUXET DES POINTEURS EN ARGUMENT • Exemple à expérimenter: Exercice VII_10: