50
1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres hexadécimaux. Conversion d’un nombre d’une base à une autre. Jeux de caractères. Table ASCII. Déclaration de variables simples. Initialisation de variables simples. Opérateur d’affectation. Utilisation des opérateurs arithmétiques unaires et binaires. Opérateurs d’incrémentation et de décrémentation. Expressions et instructions. Données constantes. Conversions de type automatiques ou forcées. Priorité des opérateurs.

1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

Embed Size (px)

Citation preview

Page 1: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

1

Types de données fondamentaux

Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres hexadécimaux. Conversion d’un nombre d’une base à une autre. Jeux de caractères. Table ASCII. Déclaration de variables simples. Initialisation de variables simples. Opérateur d’affectation. Utilisation des opérateurs arithmétiques unaires et binaires. Opérateurs d’incrémentation et de décrémentation. Expressions et instructions. Données constantes. Conversions de type automatiques ou forcées. Priorité des opérateurs.

Page 2: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

2

Qu’est-ce qu’une variable ? Les programmes doivent mémoriser les données qu’ils utilisent.

Pour cela, les variables et les constantes fournissent plusieurs représentationset méthodes de stockage des informations.

Déclarer et définir des variables et des constantes.

Affecter des valeurs aux variables et gérer ces valeurs.

Écrire le contenu d’une variable à l’écran.

Une variable est un emplacement en mémoire principale destiné à recevoir unedonnée. Cette zone reçoit une valeur qui peut ensuite être réutilisée.

La mémoire de votre ordinateur est comparable à des cases alignées une à une.Ces emplacements sont numérotés séquentiellement; il s’agit d’adresses enmémoire.

Étapes :

. . .253 254 255 256

Une variable peut occuper une ou plusieurs cases. Ex. : la case d’adresse 256.

Page 3: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

3

Identificateur de variable Pour identifier une variable, on utilise un identificateur pour désigner le nom

de cette variable.

Cela vous épargnera de devoir connaître l’adresse réelle en mémoire de celle-ci.

Un identificateur est composé de lettres (en minuscule ou en majuscule) et dechiffres. Le premier caractère doit être une lettre. Le symbole _ est considérécomme une lettre.

Note : C distingue les majuscules et les minuscules :Nom_de_variable est différent de nom_de_variable.

La longueur des identificateurs n’est pas limitée mais C distingueseulement les 31 premiers caractères (1) .

(1) Cette limite peut changer d’un compilateur à l’autre.

Il est déconseillé d’utiliser le symbole _ comme premier caractère caril est souvent utilisé pour définir des variables de l’environnement C.

Exemple : Variable_entiere, entier1, mot_en_francais sont valides mais 1er_entier,nom.2, nom de variable, deuxième_entier et a-b ne le sont pas.

L’identificateur doit indiquer le rôle joué par cette variable; il faut éviter d’utiliserdes noms qui n’évoquent rien. Ex. : Rayon_du_cercle au lieu de x.

Ne pas utiliser des mots clés comme identificateur de variable : int.

Page 4: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

4

Déclaration de variables Les variables utiles dans un programme doivent être déclarées.

Vous devez spécifier le nom de la variable (identificateur) ainsi que son type etparfois aussi leur valeur de départ.

Syntaxe : type_de_la_variable nom_d_une_variable;

ou encore

type_de_la_variable nom_d_une_variable = valeur_initiale;

Exemple : int entier1; // entier1 est une variable entière.

int entier2 = 25; // entier2 est une variable entière initialisée à 25.

Grâce à ces informations, le compilateur détermine l’espace mémoire (nombrede cases) à attribuer à la variable ainsi que le type des données contenues.Par ex., l’espace mémoire pour entier1 est réservé, celui prévu pour un entier.

Le compilateur en déduit aussi les opérateurs qui sont définis pour chaquevariable.

Ex. : L’opérateur d’addition + est défini pour des variables entières.

Page 5: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

5

Principaux types de variables

1 caractère

Exemple : char caractere;float nombre_decimal;long int entier = 175;

Note : On peut déterminer la taille d’un type de variable sur un ordinateur ainsi :cout << "La taille d’un entier est de : "  << sizeof(int) << " octets." ;

Page 6: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

6

Taille des variables Chaque emplacement en mémoire a la taille d’un octet, i.e. 8 chiffres binaires

0 ou 1 (8 bits ou BInary digiTS). La taille d’une variable dépend de son type.

L’intérêt de la base 2 est qu’elle représente exactement ce que l’ordinateurreconnaît car les ordinateurs ne connaissent pas les lettres, les chiffres, lesinstructions ou les programmes.

Note : Conversion d’un nombre binaire en base 10.

1010011 en base 2 (i.e. 10100112) équivaut en base 10 au nombre suivant :

1 x 20 + 1 x 21 + 0 x 22 + 0 x 23 + 1 x 24 + 0 x 25 + 1 x 26

ou encore1 + 2 + 0 + 0 + 16 + 0 + 64

ce qui donne 83 en base 10 (i.e. 8310).

Par conséquent, un octet peut prendre les valeurs comprises entre 0 et 255car 111111112 25510 = 28 - 1.

Une variable de type char contient 1 caractère parmi 256 caractères admissibles.

Une variable de type unsigned short int contient un entier entre 0 et 216 -1= 65535.

Page 7: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

7

Conversion d’un nombre décimal en base 2

Exemple : Convertir 99 en base 2.

Puissance de 2 : 27 26 25 24 23 22 21 20

Valeur : 128 64 32 16 8 4 2 1

Calculer la plus grande puissance de 2 plus petit ou égal à 99 i.e. 26.

99 ≥ 26 = 64 écrire 1 et soustraire 64 de 99 ce qui donne 35.35 ≥ 25 = 32 écrire 1 et soustraire 32 de 35 ce qui donne 3.3 < 24 = 16 écrire 0. 3 < 23 = 8 écrire 0. 3 < 22 = 4 écrire 0. 3 ≥ 21 = 2 écrire 1 et soustraire 2 de 3 ce qui donne 1.1 ≥ 20 = 1 écrire 1 et soustraire 1 de 1 ce qui donne 0.

Résultat : 11000112.

Page 8: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

8

Algorithme de conversion d’un nombre décimal en base 2

1. Lire un nombre entier n.

3. { Calcul de la plus grande puissance de 2 inférieur ou égale à n conservéedans PUISSANCE. }

4. Tant et aussi longtemps que PUISSANCE est différent de 0Si n est plus grand ou égale à PUISSANCE

alors écrire le chiffre binaire 1soustrait PUISSANCE de n

sinon écrire le chiffre binaire 0.Diviser PUISSANCE par 2.

4.1

4.2

3.1 Conserver la valeur 1 dans PUISSANCE.

3.2 Tant et aussi longtemps que PUISSANCE est plus petit ou égale à nMultiplier PUISSANCE par 2.

3.3 Diviser PUISSANCE par 2.

2. Si n est égale à 0 alors écrire le chiffre binaire 0, terminé.

5. Terminé.

Page 9: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

9

Variable signée ou non signée

Une variable entière peut être signée ou non.Cela permet de connaître le signe de la valeur utilisée.

Lorsqu’on travaille uniquement avec des valeurs positives ou nulles, les variablesentières peuvent être non signées; elles sont alors toujours positives.

Note :

Puisque le # d’octets est le même pour les entiers signés et les entiers nonsignés et puisque le signe est rangé dans le 1e bit du premier octet réservépour la variable entière, la valeur la plus élevée que vous pouvez stocker dansune variable non signée correspond au double du nombre positif le plus élevécontenu dans une variable entière signée.

Exemple :

long int -2 147 483 648 à 2 147 483 647

unsigned long int 0 à 4 294 967 295.

Page 10: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

10

Création de plusieurs noms de variables

Vous pouvez créer plusieurs variables de même type dans une même instruction enséparant les noms par des virgules, chaque variable recevant facultativement unevaleur initiale.

Syntaxe :

type_de_la_variable nom_d_une_variable, nom_d_une_variable, …, nom_d_une_variable;

ou encore

type_de_la_variable nom_d_une_variable = valeur_initiale,

nom_d_une_variable = valeur_initiale,

…,

nom_d_une_variable = valeur_initiale;

ou une combinaison des deux.

Exemple : long surface, longueur, largeur;

unsigned int nombre_d_etudiants_dans_la_classe, annee;

int Ton_age = 21, Mon_age, Son_age = 19;

// La variable Mon_age n’est pas initialisée.

Page 11: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

11

Propriétés des variables entières

short ou long ou unsigned : que choisir ?Cela dépend du contexte : l’entier le plus grand considéré,

des entiers positifs seulement ou non.

Les variables entières non signées possèdent une valeur limite; quand la valeurmaximale est dépassée, le contenu de la variable est remis à zéro.

#include <iostream.h>void main(){

unsigned short int Limite = 65535;cout << "Limite : " << Limite << endl;Limite = Limite + 1; // On ajoute 1 au contenu de la variable Limite.cout << "Limite + 1 : " << Limite << endl;

}

Ex. : une variable de type int : 65535 + 1 devient 0.11111111111111112 + 1 devient 100000000000000002.x

Page 12: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

12

Propriétés des variables entières

Les variables entières signées possèdent aussi une valeur limite; quand la valeurmaximale est dépassée, le contenu de la variable devient sa limite inférieure.

Ex. : une variable de type int : 32767 + 1 devient -32768.01111111111111112 + 1 devient 10000000000000002.

#include <iostream.h>void main(){

short int Limite = 32767;cout << "Limite : " << Limite << endl;Limite = Limite + 1; // On ajoute 1 au contenu de la variable Limite.cout << "Limite + 1 : " << Limite << endl;

}

Si vous devez manipuler des valeurs entières d’importance en valeur absolue,vous pouvez utiliser des variables de type long (4 octets).

Ex. : long Gros_nombre = 100L;Gros_nombre = Gros_nombre + 2L;

Page 13: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

13

Propriétés des variables caractère

La taille des variables caractère (de type char) est de 1 octet.

Chaque variable caractère peut renfermer un caractère parmi un jeu de 256caractères ASCII (« American Standard Code for Information Interchange »).

Page 14: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

14

Propriétés des variables caractère

On retrouve ici les 128 premiers caractères qui renferment notamment lesmajuscules, les minuscules, les chiffres et les signes de ponctuation.Des codes étendus sont disponibles.

Page 15: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

15

Caractères et nombres

Tout caractère affecté à une variable char (comme un ‘a’) correspond à un nombreentre 0 et 255.

#include <iostream.h>

// Conversion d’un code ASCII en caractère.

void main(){

int i;cout << "Entrez une valeur entiere entre 0 et 127" << endl;cin >> i;cout << (char) i << endl;

}

Ex. : char c = 'a';

Note : La valeur numérique 5 et le caractère ASCII '5' (valeur décimale 53) nesont pas égaux.

Conversion explicite de int à char.

Page 16: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

Propriétés des variables réelles

Des variables de type float permettent de ranger des nombres réels comme parexemple, 1.6

0.000087655.899

avec une précision de 6 chiffres décimaux après le point.

Les nombres réels peuvent aussi être exprimés comme une valeur décimale suivied’une puissance de 10.

Cela s’avère pertinent surtout pour de petits ou grands nombres.

0.16E10.8E-40.7655899E+4

La lettre E peut être remplacée par la minuscule e indifféremment.Il existe 3 types de variables réelles :

Mot clé Nombre d’octets Domainefloat 4 3.4E38 (6 chiffres après le point)double 8 1.7E308 (15 chiffres après le point)long double 10 1.2E4932 (19 chiffres après le point)

Page 17: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

17

Déclaration et initialisation des variables réelles

Ex. : float x, y, z;float rayon = 3.2f;double Gros_nombre = 1.23E25;long double Le_plus_gros_nombre = 123.7890123L;

Page 18: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

18

Définition d’un type

C++ permet de créer un alias (synonyme) à un type de donnée, en utilisant le motclé typedef.

Syntaxe :

typedef nom_du_type_existant alias_du_type_existant;

Exemple :

#include <iostream.h>

typedef unsigned short int ushort;void main(){

ushort Limite = 65535;cout << "Limite : " << Limite << endl;Limite = Limite + 1; // On ajoute 1 au contenu de la variable Limite.cout << "Limite + 1 : " << Limite << endl;

}

Page 19: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

19

Les constantes

Comme les variables, les constantes sont des zones de stockage d’informationsmais elles ne sont pas modifiables.

Une fois créée, une constante reçoit une seule valeur durant l’exécution duprogramme.

Deux types de constantes :

1. Les constantes littérales

Une valeur définie au moment voulu dans le programme.

Ex. : int Age = 18; // Age est une variable entière alors que// 18 est une constante littérale.

2. Les constantes symboliques

Comme une variable, une constante symbolique est représentée par un nom.

Ex. : Supposons que dans votre programme, vous avez à calculer la moyennedes résultats obtenus par les élèves de votre classe. L’une des donnéesdu problème est le nombre d’élèves de votre classe.Vous pourriez la définir comme étant une constante symbolique.

Page 20: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

Création d’une constante symbolique : #define

Utilisation de #define Méthode ancienne, désormais obsolète.

Syntaxe :

#define nom_de_la_constante_symbolique valeur_de_la_constante_symbolique

Ex. : #define nombre_d_eleves 15

Ce n’est pas une instruction en C ou C++ mais une commande dupréprocesseur(1) qui effectue une substitution de texte : chaque fois que le motnombre_d_eleves est rencontré, il est remplacé par la constante littérale 15.

La constante nombre_d_eleves n’a pas de type particulier.

La constante symbolique n’est pas créée puisque la substitution se fait avantla compilation.

(1) Le préprocesseur est lancé avant la compilation pour traduire toutes lescommandes commençant par le signe # en commandes spéciales quientraînent une modification dans le code source du programme.

#include <iostream.h> permet d’inclure dans votre programme ce fichier en-tête.

Page 21: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

Création d’une constante symbolique : const

Utilisation de const

Le mot clé const permet de créer des constantes C++ :const unsigned short int nombre_d_eleves = 15;

Cela permet au compilateur de connaître et de répertorier le type de la constante.

Cela permet de mettre à jour le code du programme avec aisance.

Syntaxe :

const type_de_la_constante_symbolique identificateur_de_la_constante_symbolique;

Page 22: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

Création d’un type énumération

Syntaxe :

enum nom_du_nouveau_type { constante_symbolique, constante_symbolique,

…, constante_symbolique };

ou encore enum nom_du_nouveau_type { constante_symbolique = valeur_de_la_constante,

constante_symbolique = valeur_de_la_constante,…,

constante_symbolique = valeur_de_la_constante };ou une combinaison des deux.

Création de nouveaux types permettant de définir des variables dont les valeursadmissibles sont des constantes symboliques. À chaque constante correspond unevaleur entière.

Certains compilateurs exigent que les valeurs soient indiquées en ordre croissantdans une énumération.

Pour déclarer une variable de type enum, le mot clé enum doit précéder ladéclaration.

Page 23: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

23

Exemples d’un type énumération

Exemple II :

enum Jours { dimanche = 1, lundi, mardi, mercredi, jeudi, vendredi, samedi };enum Jours Congé = dimanche;

Cela signifie que lundi vaut 2, mardi 3 et ainsi de suite.

Exemple III :

enum Unite_de_temps { seconde = 1, minute = 60, heure = 3600 };

Exemple IV :

enum booleen { faux = 0, vrai = 1 };

En C, il n’existe pas de type booléen mais on peut le définir.

En C++, le type bool existe et correspond à la définition suivante :

enum bool { false = 0, true = 1 };

Exemple I : enum RVB { rouge, vert, bleu };enum RVB couleur_primaire = vert;

rouge, vert et bleu sont des constantes symboliques égales à 0, 1 et 2 resp.couleur_primaire est une variable de type enum RVB.

Page 24: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

24

Opérateur d’affectation

Syntaxe : identificateur_de_variable = expression;Exemple : int entier1 = 5, total;

total = entier1 – 2;But : stocker la valeur d’une expression dans une variable et

retourner cette valeur. La valeur retournée peut ne pas être utilisée par la suite.

Note : L’opérande de gauche ne peut être une constante.Les constantes et les variables sont des expressions lesquellespeuvent être combinées entre elles par des opérateurs et former des expressions de plus en plus complexes.

int entier1 = 5, entier2, total; // revient à réaliser les étapes suivantes :total = entier2 = entier1 – 2; /* - calculer la soustraction de entier1 avec 2,

- ranger le résultat 3 dans la variable entier2, - ranger le résultat 3 dans la variable total, - retourner la valeur 3. */

Ex. :

5

entier1 entier2 total

avant 5 3 3

entier1 entier2 total

après

Note : On pourrait écrire : cout << total = entier2 = entier1 – 2;

Page 25: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

25

Opérateurs arithmétiques

L’opérateur d’addition : +

Il est défini pour des variables entières, réelles et caractères.

Cela retourne le résultat de la somme. Ex. : cout << a + b;

Dans le cas des variables caractères, ce sont les codes numériques de celles-ciqui sont additionnés et cela retourne le code numérique résultant.

Ex. : char c = 'a'; char d = 'b';

cout << c + d << endl<< c + 1 << endl<< 1 + c << endl;

1959898

Page 26: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

26

Débordement de capacité : opérateur d’addition

#include <iostream.h>

void main(){

short int i = 32767; // valeur limite = 32767.i = i + 1;cout << i << endl

<< i+1 << endl;

unsigned short int j = 65535; // valeur limite = 65535.j = j + 1;cout << j << endl

<< j+1 << endl;

float x = 3.4E38f, y; // valeur limite = 3.4E38.y = x * 10.0f;cout << x * 10.0f << endl

<< y << endl;}

-32768-32767011.#INF1.#INF

Page 27: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

27

Opérateurs arithmétiques

L’opérateur de soustraction : -

Il est défini pour des variables entières, réelles et caractères.

Cela retourne le résultat de la soustraction. Ex. : cout << a - b;

Dans le cas des variables caractères, ce sont les codes numériques de celles-ciqui sont soustraits et cela retourne le code numérique résultant.

Ex. : char c = 'a'; char d = 'b';

cout << d - c << endl;

1

Note : Si le code résultant est négatif, quelle interprétation pouvons-nous en faire ?

Page 28: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

28

Débordement de capacité : opérateur de soustraction

#include <iostream.h>

void main(){

short int i = 50, j = 100, k;k = i – j;cout << k << endl;

unsigned short int u = 50, v = 100, w;w = u - v;cout << w << endl;

}

-5065486

Page 29: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

29

Multiplication et division

L’opérateur de multiplication : *

Il est défini pour des variables entières, réelles et caractères.

Cela retourne le résultat de la multiplication. Ex. : cout << a * b;

Dans le cas des variables caractères, ce sont les codes numériques de celles-ciqui sont multipliés et cela retourne le code numérique résultant.

L’opérateur de division : /

Il est défini pour des variables entières, réelles et caractères.

Cela retourne le résultat de la division. Ex. : cout << a / b;

Dans le cas des variables caractères, ce sont les codes numériques de celles-ciqui sont divisés (division entière) et cela retourne le code numérique résultant.

Ex. : char a = 'a', b = 'b';cout << a / b; // Affichage de 0.

Page 30: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

30

Division entière et modulo

La division d’entiers est quelque peu différente de la division décimale.

La division d’entiers ne tient pas compte du reste de la division.

Pour obtenir le reste de la division entière, on utilise l’opérateur modulo %.

#include <iostream.h>

void main(){

int i = 12, j = 7;cout << i % j << endl;

int u = -12, v = 7;cout << u % v << endl;

int x = 12, y = -7;cout << x % y << endl;

int s = -12, t = -7;cout << s % t << endl;

}

5-55-5

Page 31: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

31

Combinaison des opérateurs arithmétiques et d’affectation

Il est courant d’ajouter une valeur à une variable, puis de renvoyer le résultatdans cette dernière.

int somme = 15;int temp;temp = somme + 5;somme = temp;

Plutôt lourd comme approche.

On peut retrouver la même variable de chaque côté de l’opérateur d’affectation.

int somme = 15;somme = somme + 5;

Plus facile à gérer mais non conformeà la notation algébrique.

C++ renferme aussi les opérateurs suivants : +=, -=, *=, %= et /=.

Syntaxe : identificateur_de_variable += expression;Ex. : int somme = 15;

somme += 5; // Le résultat est identique quoique plus difficile à lire.But : additionner la valeur d’une expression à une variable, ranger dans cette

variable le résultat de la somme et retourner cette valeur. La valeur retournée peut ne pas être utilisée par la suite.

Page 32: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

32

Opérateurs d’incrémentation ++ et de décrémentation --

Cela permet d’ajouter ou de soustraire 1 à une variable.

int a = 5;a++; revient à écrire a = a + 1; ou encore a += 1;

Ces opérateurs sont utilisés comme préfixe (l’opérateur précède la variable) ousuffixe (l’opérateur suit la variable).

Mode préfixe : On incrémente la variable avant de l’utiliser.

int b = ++a; // a prend d’abord la valeur 7 puis, b est initialisée à 7.

Mode suffixe : On utilise la variable avant de l’incrémenter.

int c = b++; // c prend d’abord la valeur de b(7) puis, b est incrémentée(8).

Note : à éviter à l’intérieur d’instructions « simples ».

int i = 12, j = 0, k = 0;cout << ++(++i = ++i + i++); ?!|#&?!

Page 33: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

33

Priorité des opérateurs

Dans l’instruction x = y - z * 5; quelle partie sera traitée en premier ? En fait, lamultiplication vient avant l’addition.

Tout opérateur a un niveau de priorité par rapport aux autres.

La priorité est l’ordre dans lequel un programme réalise les opérations dans uneformule. Si un opérateur a priorité sur un autre, il est évalué le premier.Plus le rang est bas, plus la priorité est grande (voir le tableau suivant).

Pour modifier l’ordre de priorité des opérateurs, utilisez les parenthèses.

x = (y – z) * 5;

Exemple :La valeur de la forme algébrique (x – y)2 (x + 2) - 5 à conserver dans la variable z s’écrit : z = ((x – y) * (x - y)) * (x + 2) - 5; ou encore,

z = -5 + (x + 2) * (z *= z = x - y);

On peut utiliser plusieurs niveaux d’imbrication des parenthèses.

Si nous avons une suite d’opérateurs binaires de même priorité, l’évaluation sefait de la gauche vers la droite. Ex. : x = y * z / w;

Pour les opérateurs unaires (!, ++, --) et pour les opérateurs d’affectation (=, +=,-=, *=, /=, %=), l’évaluation se fait de droite à gauche dans l’expression.

Page 34: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

34

Priorité des principaux opérateurs

Rang Opérateurs 1 ()2 ! ++ --3 * / %4 + -5 < <= > >=6 == !=7 &&8 ||9 = += -= *= /= %=

Ex. : A = 5, B = 10, C = 1.

X = 2 * A + 3 * B + 4 * C;

10 30 4

44

Ex. : A = 5, B = 10, C = 1.

X = 2 * (A + 3) * B + 4 * C;

8

160 4

164

Page 35: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

35

Priorité des opérateurs

Page 36: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

36

Conversions de type automatiques

On peut retrouver dans une même expression des données de types différents.Pour évaluer cette expression, elles doivent être converties dans un même typede données.

float x = 3.45f;int y = x + 2;

La plupart du temps, les conversions de type se font automatiquement et leprogrammeur n’a pas à intervenir. Celui-ci doit quand même en prévoir lesconséquences.

Ex. :

Dans l’exemple précédent, y contient la valeur 5 (une valeur tronquée).

Lors d’une affectation, la donnée à droite du signe d’égalité est convertie dans letype à gauche. Il peut y avoir perte de précision dans ce cas.

Par contre, ces conversions automatiques permettent de passer d’un type deplus petite taille en un type plus grand.

int i = 8; float x = 12.5f; double y;cout << (y = i * x);

Ex. : 100

conversion en floatconversion en double

Page 37: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

37

Conversions de type automatiques

Règles de conversion :

Une opération avec un entier et un nombre décimal entraîne la conversionde l’entier en décimal.

Dans le cas d’une opération avec 2 nombres décimaux, le type de plusgrande taille est choisi selon l’ordre suivant :

long double, double, float.

Dans le cas d’une opération avec 2 entiers, les types char et short sontconvertis en int et le type de plus grande taille est choisi selon l’ordresuivant :

unsigned long, long, unsigned int, int.

int x; float a = 12.48f; char b = 4;cout << (x = a / b);

Ex. : 3

conversion en floatconversion en int

char a=3, f; int b = 4; float c = 4.0f, d, e;cout << (d = a / c) << endl << (e = a / b) << endl << (f = a / c);

Ex. : 0.750

conversion en float conversion en int conversion en char (0)

Page 38: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

38

Conversions de type forcées

Parfois, il est nécessaire de convertir une donnée dans un type différent de celuique choisirait la conversion automatique.

Nous devons alors forcer la conversion.

Syntaxe :

( type_de_donnée)

char a=3; int b = 4; float c;cout << (c = (float) a / b);

Ex. : 0.75

conversion forcée en float

conversion automatique en float

Note : Les contenus de a et de b demeurent inchangés;seulement les valeurs utilisées dans les calculs sont converties.

Page 39: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

39

Circonférence et aire d’un cercle

#include <iostream.h>

void main(){

const float Pi = 3.14159f; // Valeur approximative de Pi.float rayon; // Rayon du cercle.

// Lecture du rayon du cercle.

cout << "Entrez le rayon du cercle :" << endl;cin >> rayon;

// Affichage de la circonférence du cercle.

cout << "Circonference du cercle : " << 2.0f * Pi * rayon << endl;

// Affichage de l'aire du cercle.

cout << "Aire du cercle : " << Pi * rayon * rayon << endl;}

Page 40: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

40

Distance entre un point et un plan dans l’espace à 3 dimensions

Calculer la distance d d’un point P = (p1, p2, p3) à un plan défini par un pointQ = (q1, q2, q3) et un vecteur normale unitaire n = (n1, n2, n3).

nP

Q

|P-Q|d

d = || P – Q || cos

d = || P – Q || || n || cos = (P - Q) n = (P - Q) n || n || || n ||

Qu’arrive-t-il si P fait partie du plan ?

n est unitaire

Page 41: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

41

Distance entre un point et un plan dans l’espace à 3 dimensions

#include <iostream.h>void main(){

float Px, Py, Pz; // Coordonnées du point P.float Qx, Qy, Qz; // Coordonnées d'un point Q du plan.float nx, ny, nz; // Coordonnées de la normale n au plan.

// Lecture des coordonnées du point P.cout << "Coordonnées du point P : "; cin >> Px >> Py >> Pz;

// Lecture des coordonnées du point Q.cout << "Coordonnées du point Q : "; cin >> Qx >> Qy >> Qz;

// Lecture des coordonnées de la normale n au plan.cout << "Coordonnées du vecteur n : "; cin >> nx >> ny >> nz;

// Calcul de la distance d.float d = (Px - Qx) * nx + (Py - Qy) * ny + (Pz - Qz) * nz;

// Affichage du résultat.cout << "Affichage de la distance d : " << d << endl;

}

Page 42: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

42

Encryptage et décryptage d’un message

DECRYPTAGE : Action de rendre lisible des données cryptées grâce à la clé decryptage.

CRYPTAGE : Action de rendre illisible des informations pour quiconque qui nepossède pas la clé de décryptage.

Luc veut transmettre un message à Pierre sans que personne d’autres n’y ait accès.Luc veut transmettre à Pierre le caractère c codé; pour y arriver, il lui transmetplutôt les 2 caractères correspondants aux codes entiers d et e suivants :

d = (a * s + b) / 256 (division entière)e = (a * s + b) % 256 (opération modulo)

où a et b sont 2 constantes entières non nulles plus petites que 256.

Les valeurs a et b sont connues de Luc et de Pierre. Fixons-les à a = 251, b = 247.

Nous allons d’abord aider Luc et lui construire un programme qui détermine les 2caractères obtenus après l’opération de cryptage.

Nous allons ensuite aider Pierre et lui construire un programme qui détermine lecaractère obtenu après l’opération de décryptage.

Page 43: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

43

Programme de cryptage

#include <iostream.h>void main(){

const int a = 251; // Constante de cryptage.const int b = 247; // Constante de cryptage.char c; // Caractère à transmettre.char d, e; // Caractères cryptés.

// Lecture du caractère que Luc veut transmettre à Pierre.

cout << "Caractere a transmettre : "; cin >> c;

// Déterminer les 2 caractères obtenus après l'opération de cryptage.

d = (char) ((a * c + b) / 256);e = (char) ((a * c + b) % 256);

// Affichage des 2 caractères obtenus après l'opération de cryptage.

cout << d << " " << e << endl;}

Page 44: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

44

Programme de décryptage

#include <iostream.h>void main(){

const int a = 251; // Constante de cryptage.const int b = 247; // Constante de cryptage.

char c; // Caractère à recevoir.char d, e; // Caractères cryptés.

// Lecture des 2 caractères cryptés que Pierre a reçus.

cout << "Caracteres cryptes : "; cin >> d >> e;

// Déterminer le caractère obtenu après l'opération de décryptage.// a * c + b = 256 * d + e.c = (char) ((256 * d + e - b) / a);

// Affichage des 2 caractères obtenus après l'opération de cryptage.cout << c << endl;

}

Page 45: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

45

Produit de deux grands entiers

Habituellement, il est impossible de multiplier directement deux entiers p et q de 6chiffres et obtenir un résultat exact : le résultat pq a 12 chiffres.

Stratégie :

Exprimons p et q comme suit : p = a x 103 + b

q = c x 103 + d où a, b, c et d ont 3 chiffres.

On obtient alors : pq = (a x 103 + b) (c x 103 + d)= ac x 106 + (ad + bc) x 103 + bd.

Nous allons alors placer la valeur de pq dans 2 entiers de 6 chiffres :

entier1 entier2Ex. : 999 999999 999x

998 001

998

998

001 000

001 000

998 001

Page 46: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

46

Programme qui calcule le produit de 2 grands entiers

#include <iostream.h>#include <iomanip.h>void main(){

long int p, q, a, b, c, d, entier1, entier2;

// Lecture des 2 nombres p, q.

cout << "Entrez les 2 nombres : "; cin >> p >> q;

// Détermination des coefficients a, b, c, d.

b = p % 1000; d = q % 1000;a = p / 1000; c = q / 1000;

// Détermination de entier1 et entier2.

entier1 = a * c + (a * d + b * c) / 1000;entier2 = b * d + ((a * d + b * c) % 1000) * 1000;entier1 = entier1 + entier2 / 1000000;entier2 = entier2 % 1000000;

Page 47: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

47

Programme qui calcule le produit de 2 grands entiers

// affichage du résultat.

cout << "Produit : "<< setw(6) // largeur du champ d'impression.<< setfill('0') // caractère de remplissage.<< entier1<< setw(6) // largeur du champ d'impression.<< setfill('0') // caractère de remplissage.<< entier2 << endl;

}

Page 48: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

48

Calcul de la racine carrée d’un entier positif

8, 23, 45, 67

Exemple : Racine carrée de 8234567 à 2 décimales près.

2 8 6 9. 5 9

4-

4234

384-

3945

56

3396-

54967

572

51561-

340600

5738

286925-

5367500

5 7 3 9 0

5165181-

202319

Solution : 2869.59

Page 49: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

49

Algorithme qui calcule la racine carrée d’un entier positif n

1. Lire l’entier n à évaluer et m le nombre de décimales après le point.

3. { Calcul dans P de la puissance de 100 la plus élevée inférieure ou égale à n. }

4. Placer dans la variable entière BLOC la valeur de n / P où la division est entière.n devient n – (n / P) * P.

5. { Placer dans la variable entière RESULTAT le plus grand chiffre qui, élevé au carré est inférieur ou égale à BLOC. }

7. Placer dans la variable entière DOUBLER la valeur de RESULTAT * 2.

2. Initialiser la variable entière DECIMALE à 0 et la variable entière P à 1.

6. Soustraire à BLOC la valeur de RESULTAT * RESULTAT.

8. P devient P / 100.

Pour chaque valeur de RESULTAT allant de 9 à 0 en ordre décroissant,si RESULTAT * RESULTAT BLOC aller à l’étape 6.

Tant et aussi longtemps que 100 * P n alors P est multiplié par 100.

9. Si P est différent de 0alors placer dans BLOC la valeur de l’expression BLOC*100 + n / P

n devient n – (n / P) * Psinon placer dans BLOC la valeur de l’expression BLOC*100

Page 50: 1 Types de données fondamentaux Les types simples (entier, réel, caractère). Représentation des données. Nombres décimaux, nombres binaires et nombres

50

Algorithme qui calcule la racine carrée d’un entier positif n

13. Si P est égale à 0 alors ajouter 1 à la variable Decimale.

14. Si Decimale est inférieure à m alors aller à l’étape 7.

15. { Affichage du résultat. }

Affecter la valeur 1 à P.Pour chaque i allant de 1 à DECIMALE, multiplier P par 10.Placer dans R la valeur de RESULTAT / P + (RESULTAT % P) * (1.0 / P).Afficher la valeur réelle R.

11. Soustraire à BLOC la valeur de l’expressionCHIFFRE * CHIFFRE + CHIFFRE * DOUBLER * 10.

12. Multipliez par 10 la valeur de RESULTAT et ajouter la valeur de CHIFFRE.Conserver le résultat dans la variable RESULTAT.

10. { Placer dans la variable CHIFFRE le plus grand chiffre entre 0 et 9 dontl’expression CHIFFRE * CHIFFRE + CHIFFRE * DOUBLER * 10 est inférieur ouégale à BLOC. }