introduction à la programmation - ataraxy.info · 1. introduction malgré les fantasmes les plus...

51
Introduction à la programmation 2017 www.ataraxy.info David Hébert [email protected]

Upload: lytruc

Post on 10-Sep-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Introduction à la programmation

2017www.ataraxy.info

David Hé[email protected]

1

Table des matières

Table des matières 2

1 Introduction 3

2 Fonctionnement du cours 5

3 Premier pas 7

4 Variables 10

5 Détail d’un premier exemple & déroulés 22

6 Tests et conditions 24

7 Boucles 30

8 Tableaux 33

9 Caractères et chaines de caractères 35

10Second exemple 41

11Fonctions 43

2

1. Introduction

Malgré les fantasmes les plus profond des réalisateurs d’Hollywood nous vivons (encore) dans unmonde ou l’ordinateur 1 reste soumis à une règle plutôt élémentaire : il fait ce qu’on lui dit de faire !La question naturelle que l’on est alors amené à se poser est de savoir comment demander quelque

chose à l’ordinateur ? Avant d’arriver à entrevoir une réponse il faut comprendre son alphabet, sonlangage, sa grammaire etc.L’alphabet de l’ordinateur est le binaire. Il est en effet conçu sur un système simple : l’électricité.

Soit le courant passe, soit il ne passe pas. Comme cela est un peu long à écrire, nous simplifierons lanotation en convenant que lorsque le courant passe on écrira 1 et lorsqu’il ne passe pas on notera 0.Ainsi les deux lettres de l’alphabet de l’ordinateur sont le 0 et le 1 et pour lui dire "déplace ma souris enhaut à gauche de l’écran", il faudrait s’exprimer dans son langage et dire quelque chose qui ressembleà

1011101011110111000101011010100010010010....

et ça continue longtemps... très longtemps... trop longtemps pour nous autres (humain, pour la majoritédes lecteurs).Bien heureusement il existe des traducteurs très compétent que nous appellerons langage de

programmation 2. Malgré leur grande diversité, tous ces langages de programmation ont une racinecommune : l’algorithmique.Le langage de programmation n’est que l’outil de l’algorithmique. Il faut voir l’algorithmique comme

un "langage" entre le binaire et tous les langages de programmation.Ce cours a donc pour objectif principal de nous familiariser avec la notion d’algorithmique. Nous

illustrerons ses concepts à travers deux langages de programmation : le Python et le C++ . Le choix deces langages viens qu’ils sont tous les deux à la fois complet (c’est à dire qu’ils permettent de faire destaches assez variées) mais aussi complémentaire (dans le sens ou ils ne fonctionnent pas de la mêmemanière).

Une petite histoire d’ordinateur

Le premier ordinateur contemporain est l’ENIAC(Electronic Numerical Integrator Analyser andComputer).Un jour une sauterelle alla se coincer dans la

mécanique de la machine et grilla (en grillant)quelques composants provoquant un dysfonction-nement. On appela ce dysfonctionnement un bug(qui signifie insecte en anglais) ; l’expression restaet aujourd’hui on parle de bug à chaque dysfonc-

tionnement de la machine.Notre petite sauterelle aurait cependant bien

du mal à s’insérer dans les derniers modèled’ordinateur, comme le montre cette image com-parant une version de l’ENIAC avec un raspberrypi (les deux appareils font approximativement lamême chose avec 60 ans d’écart).

1. Dans le sens le plus large que comprend ce terme ; calculette, PC, smartphone...2. Pour une liste plutôt exhaustive : http://fr.wikipedia.org/wiki/Liste_des_langages_de_programmation

3

Une petite histoire du C++

A la fin des année 50 les premiers ordinateursfaisaient leur apparition accompagner du premierlangage de programmation : l’ALGOL (acronyme de

"ALGorithmic Oriented Language"). Puis, peu satis-fait de ses capacités, le laboratoire de mathé-matiques de l’université de Cambridge et l’unitéd’informatique de l’université de Londres créèrentdans le courant des années 60 le CPL (acro-nyme de Combined Programming Language) quiétait certes plus complet mais beaucoup plus com-plexe, beaucoup trop exigeant pour les compi-lateurs de l’époque. Dans un soucis d’accessibi-lité Kenneth Lane Thompson (4 fevrier 1943 - ) letransforme et aboutit à la création du BCPL (BasicCPL ou Bootstrap CPL) que l’on appela simplementle langage B. Cherchant encore a rendre la pro-grammation plus accessible le langage B évolua,dans les années 70, en un langage simplementnommé le Langage C dont le principale contribu-taire fut Dennis Macalistair Ritchie 3 (9 septembre1941 - 8 octobre 2011). Enfin en 1983 de nom-breuses nouveautés (et simplifications) sont appor-tés au langage C. Il prend alors une autre forme etun autre nom : le C++ .

Une petite histoire du Python

Fan de la série télévisé des Monty python, Guidovan Rossum, crée à la fin des années 80 un lan-gage de programmation alors qu’il travaillait surun autre. Il s’inspire de ce que les langages offrentde mieux à son époque et parvint à faire adopterce langage à ses collègue de travail. Deux annéeaprès sa création, Python est rendu publique enopen source. Ce langage a bénéficier de nom-breuse avancée par de nombreux collaborateur(comme la DARPA pour n’en cité qu’un) et a étéentre autre pensé pour l’enseignement de l’infor-matique 4

3. Sa contribution dans le monde informatique fut d’autant plus grande qu’il a également inventé le système d’exploitationUNIX : en 1967, il intègre les laboratoires Bell et travaille avec Kenneth Lane Thompson sur le système d’exploitation multi-utilisateurs MULTICS (acronyme de MULTiplexed Information and Computing Service). Assez vite, jugeant MULTICS trop complexeet volumineux, le duo décide de tout reprendre à zéro et d’inventer un autre système, avec une nouvelle philosophie : UNIX(initialement appelé UNICS).4. C’est pour cette raison qu’on l’enseigne dès le lycée dans certaines matières liées au numérique.

4

2. Fonctionnement du cours

Algorithmie

Les données dans un encadré jaune seront associé à des éléments de l’algorithmie. Commenous l’avons précisé dans l’introduction, l’algorithmie est à la base de tout langagede programmation. Les langages de programmation étant soumis à des règles sémantiquestricts, on se permettra avec l’algorithmie, à des "raccourcis" et une "légèreté" dansla rigueur.

En C++

Les informations données dans un encadré vert concerneront le C++ .Contrairement à l’algorithmie on apportera un grand soin à la syntaxe et a certainecontrainte sémantique.

En Python

Les informations données dans un encadré bleu concerneront le Python . Tout comme leC++ on prendra garde à la syntaxe.

Exécution C++

Les encadrés verts foncés représenteront les exécutions de code en C++ .Nous en reparlerons dans la suite.Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyLes encadrés bleus foncés représenteront les exécutions de code en Python .C:\Users\David\Desktop\IntroProg>

Quelque soit le langage de programmation que l’on choisi, il est nécessaire de disposer d’untraducteur, qui va transformer le langage de programmation en binaire (pour faire simple).Mais les deux langages que nous avons choisi de vous introduire ont des méthodes différentes de

traduction.

En C++

Le C++ est un langage compilé. Cela signifie vulgairement, qu’avant de traduire votrecode en binaire il va s’assurer qu’il est capable de lire du début à la fin sans problème ;c’est ce qu’on appel la compilation. Une fois que le programme est compilé, il peut êtreexécuté (cela n’empêchera pas les erreurs algorithmiques).

Ainsi pour "parler en C++ " nous auront besoin d’un compilateur. Dans ce cours noustravaillerons avec Code::blocks.

Ce logiciel se télécharge gratuitement sur

www.codeblocks.org/download

et est multi-support (windows, linux, mac). En plus d’offrir un compilateur, Code::blocksdispose d’un environnement de travail adapté (colorant les mots clefs du langage) et

5

d’un très confortable debuggeur permettant d’identifier les erreurs de syntaxe (au momentde la compilation ; encore une fois cela n’empêchera pas les erreurs d’algorithmie).

En Python

Le Python est un langage interprété, c’est à dire que les instructions sont traduitesau fur et à mesure de la lecture.

Ainsi pour "parler en Python " nous allons avoir besoin d’un interpréteur. Il existedifférente version de l’interpréteur de python. Dans ce cours, nous travaillerons avecla version 3 (attention, les différences entre la version 3 et la version 2 sontsignificatives). Vous pourrez télécharger la version 3 de python quelque soit votresupport sur

www.python.org/downloads

Cet interpréteur ne fait qu’interpréter (#intéligence), nous aurons donc besoin d’uneinterface pour spécifier ce qui doit être interprété. N’importe quel éditeur de textefera l’affaire (BlocNote, NotePad++, Gedit ...).

L’exécution du python se fera directement en ligne de commande.

Ce cours est réalisé sous windows, les exécutions et résultats peuvent différer très légèrement avecd’autre OS.

6

3. Premier pas

La notion la plus difficile à comprendre et à mettre en œuvre lorsqu’on pratique la programmationest la séquentialité. Il s’agit d’exprimer une tache compliquée en une suite de tache élémentaire et trèsfacile.Faire un gâteau ne se résume pas à mettre les ingrédients dans un plat, tout mélanger et placer au

four. Il faut diviser les taches en une suite de petites taches très simple :

– ouvrir le frigo– prendre quatre œufs– fermer le frigo– ouvrir le placard– prendre un plat

– fermer le placard– prendre un œuf– le casser dans le plat– mettre la coquille vide dans la poubelle– répéter les trois dernières opérations trois fois.

C’est ainsi que l’on peut définir l’algorithmie : c’est la division d’un problème en une suite de problèmeélémentaire séquentiel.Un langage de programmation c’est une méthode de réalisation de l’algorithmie. Par exemple la

séquence casser l’œuf peut être faite soit automatiquement par une machine à casser les œufs soit àla main contre le rebord du plat. Peu importe la manière, il faut casser les œufs.La plus grande difficulté réside donc dans la divisions des problèmes en problèmes élémentaires.

Ce qui nous amène à définir ce qui est élémentaire.Les différentes parties de ce cours nous amènerons à définir ces séquences élémentaires : Écrire, Lire

(enregistrer de l’information), Faire des calcul, Faire des tests, Faire des boucles, Faire des fonctions...Commençons notre exploration par écrire BONJOUR.

Installation de base

Pour commencer, nous allons créer un espace de travail.– Placez-vous sur votre lieu de travail préféré (le bureau, une clef USB, un disque dure externe...).– Créer un répertoire appelé IntroProg.

En Python

– Dans ce répertoire créer un ficher Test.py (l’extension py permet d’identifierdes documents python). Pour ce faire ouvrez votre éditeur de texte préféré et créezun document vierge que vous enregistrerez sous le nom Test.py.

– ATTENTION ! Ouvrez ce document avec votre éditeur de texte ; il se peut qu’en cliquantdessus, votre système cherche à exécuter le programme.

– ATTENTION ! Assurez vous d’avoir les droits de lecture et d’écriture sur ce document.

Dans Test.py saisissez les lignes suivantes :

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 print("BONJOUR")

Nous allons directement exécuter ce programme en ligne de commande.

En Python

1. Ouvrir un invite de commande (un terminal)

2. Placez vous dans le répertoire IntroProg. Utiliser la commande cd pour vous déplacerdans l’arborescence de votre machine. Sous windows nous avons :

7

3. Dans l’invite de commande saisir Test.py

Vous pourrez alors admirer le résultat de votre code :

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyBONJOURC:\Users\David\Desktop\IntroProg>

En C++

– Ouvrir Code::blocks– Créer un nouveau document vierge que vous enregistrerez sous le nom Test.cpp(l’extension cpp permet d’identifier les documents C++ ).

1.

2.

3.

4.

Saisissez alors les lignes de code suivantes ; on prendra garde à la ponctuation.

8

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 cout<<"BONJOUR";6 return(0);7 }

Il faut ensuite compiler puis exécuter le programme ce que fait Code::blocks

En exécutant le programme nous aurons le résultat suivant :

Exécution C++

BONJOURProcess returned 0 (0x0) execution time : X.xxx sPress any key to continue.

9

4. Variables

Le but est à présent de répondre à ce problème.

Demander l’année de naissance à l’utilisateur et donner son âge (son âge sera simplementla différence entre 2017 et son année de naissance).

Si nous réfléchissons au problème, une solution apparait naturellement et l’algorithme de résolutionprend la forme suivante :

Algorithmie

1 Demander à l’utilisateur son année de naissance2 Ranger cette donnée dans une variable x3 Faire 2017-x et ranger le résultat dans une variable y4 Afficher y

La première ligne de cet algorithme se traduit sans peine dans nos deux langages comme nousl’avons vus au chapitre précédent.

En Python

print("Quelle est votre année de naissance ? ")

En C++

cout « "Quelle est votre année de naissance ? ";

Viens ensuite des éléments inconnues.

variablerangerfaire 2017-xafficher la variable y

Éclaircissons ces points.

Qu’est-ce qu’une variable ?

Pour définir une variable au sens numérique du terme nous avons besoin de quatre informations.

Un type c’est à dire le type d’information qu’elle va enregistrer.

Une valeur c’est à dire l’information qu’elle enregistre.

Un nom qui permet de l’identifier.

Une adresse ou référence qui est "l’endroit" ou l’information est enregistrée dans la mémoire.

Un ordinateur dispose de plusieurs mémoire : registres 5, mémoire cache, mémoire vive 6, disque dure(et tous les périphériques dit externe). Toutes ces mémoires sauf le disque dur, s’effacent dès que l’onéteint l’ordinateur.Les variables que nous manipulerons seront référencées dans la mémoire vive et aurons donc une

"existence éphémère".Le langage de la machine est le binaire : une suite de 0 et de 1. Pour la mémoire un de ces nombres

est un bit (binary digit), mais compte tenu de la nature de l’information on les regroupe par 8(= 23) eton appel cela un octet. Dans ces mémoires vives on peut stocker des octets et l’endroit de la mémoireoù sont stocké ces octets est l’adresse.

5. Les registres sont des mémoires très petite mais directement placées sur le processeur ce qui permet un accès extrême-ment rapide (le plus rapide) ; mémoire exclusivement réservée pour sa majesté le processeur6. Communément appelé RAM

10

En C++

Le langage C++ gère lui même le nombre d’octet à attribuer à une variable en fonctiondu type de la variable : la variable est-elle un entier positif ou négatif, une lettrede l’alphabet, un nombre à virgule etc... Voici une liste (non-exhaustive) de type devariable proposé par le langage C++ :

Type Signification octet Plage de valeur

char Caractère 1 −128 à 127

unsigned char Caractère non signé 1 0 à 255

short int Entier court 2 −32768 à 32767

unsigned short int Entier court non signé 2 0 à 65535

int Entier 4 −2147483648 à 2147483647

unsigned int Entier non signé 4 0 à 4294967295

long int Entier long 4 −2147483648 à 2147483647

unsigned long int Entier long non signé 4 0 à 4294967295

float Nombre décimal 4 −3.4 ∗ 10−38 à 3.4 ∗ 1038

double Nombre décimal long 8 −1.7 ∗ 10−308 à 1.7 ∗ 10308

long double Nombre décimal très long 10 −3.4 ∗ 10−4932 à 3.4 ∗ 104932

Pour utiliser une variable on doit donc demander à la machine de nous libérer et de nous réserverun certain nombre d’octet dans la mémoire vive.

En C++

Pour réserver de la mémoire en fonction du type de la variable il faut déclarerla variable. Pour ce faire on précise son type et son nom.

• Pour déclarer une variable entière nommé n on écrira

int n;

• Pour déclarer une variable flottante nommé x on écrira

float x;

• Pour déclarer une variable de type caractère nommé c on écrira

char c;

En Python

Tout comme le C++ le Python gère l’allocation de la mémoire. Bien plus puissant encore,le typage est dynamique ! Une variable peut être un temps un entier et l’instant suivantun caractère. Nous prendront soin à ne pas s’aventurer à ces facilités (pour le moment).Il n’est même pas nécessaire de déclarer la variable. Il suffit de lui donner une valeurpour la faire exister.

Dans ce cours nous travaillerons avec les types suivants :

Le type int pour les entiers.

Le type float pour les nombres réels.

Le type char pour les caractères.

Le type string ou str pour les chaines de caractères.

Nous travaillerons également avec les booléens pour les exécutions conditionnelles et boucles.

11

Allocation

Pour donner une valeur à une variable on utilise le symbole =.

En Python

n=0

En C++

int n;n=0;

Quelque soit la nature du problème que nous cherchons à résoudre, nous prendrons soin d’initialiserles variables utilisées même si elles sont condamnées à prendre rapidement de nouvelles valeurs. Celaévitera des erreurs d’inattention classique lorsque l’on commence à programmer 7.

En Python

Ainsi on écrira

• Pour préciser que n est un entier,n=0

• Pour préciser que n est un nombre réel,n=0.0

• Pour préciser que n est un caractère.n=’a’

En C++

• Pour préciser que n et un entier,int n;n=0;

• Pour préciser que n et un nombre réel,float n;n=0.0;

• Pour préciser que n et un caractère,char n;n=’a’;

Le C++ permet de déclarer et d’initialiseren même temps de la manière respectivesuivante.

• int n=0;

• float n=0.0;

• char n=’a’;

A propos des noms des variables

Les noms des variables sont libres mais soumis à trois règles.

1. Le nom d’une variable doit commencer par une lettre majuscule ou une lettre minuscule ou un-derscore (_) ; pas par un chiffre.

2. Le nom d’une variable peut être aussi long que l’on souhaite mais ne doit contenir que des lettresmajuscules, minuscules ou des chiffres ou le symbole underscore ; pas d’autre symboles (comme \,%, é, à, & ...)

3. Certains mots sont réservés au langage. Il s’agit de ne pas nommé une variable par un de cesmots réservés (comme int etc).

Afficher la valeur d’une variable

On utilise les fonctions d’affichage déjà introduite.

7. On pourra s’affranchir de cette règle bien plus tard, ou pas...

12

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int n=0;6 cout << n;7 return(0);8 }

Exécution C++

0Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En Python

1 n=02 print(n)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.py0C:\Users\David\Desktop\IntroProg>

On fera attention.

En Python

1 print("n")affichera le caractère n.Tandis que

1 print(n)

affichera la valeur de la variable n.

Il est possible de mélanger des chaines de caractères et des valeurs de variables

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int n=0;6 n=-89;7 cout << "La valeur de n est" << n;8 return(0);9 }

13

Exécution C++

La valeur de n est-89Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 n=0.05 n=99.996 print("La valeur de n est", n)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyLa valeur de n est 99.99C:\Users\David\Desktop\IntroProg>

Saisir une valeur

En Python

Pour saisir on utilise

n=input()

En C++

Pour saisir on utilise

cin >> n

Ces commandes attendent que l’utilisateur entre une valeur. Une fois saisie (par validation par latouche Entrée) la donnée est enregistrée dans la variable n.

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int n=0;5 cout << "Saisissez une valeur";6 cin >> n;7 cout << "La valeur saisie est" << n;8 return(0);9 }

Exécution C++

Saisissez une valeur154La valeur saisie est154Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

14

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 n=05 print("Saisir une valeur")6 n=input()7 print("La valeur saisie est", n)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pySaisir une valeur154La valeur saisie est 154C:\Users\David\Desktop\IntroProg>

En Python

On peut comprimer un peu le code :

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 n=05 n=input("Saisir une valeur")6 print("La valeur saisie est", n)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pySaisir une valeur154La valeur saisie est 154C:\Users\David\Desktop\IntroProg>

Opération arithmétiques sur les variables entières ou flottantes

En Python comme en C++ les opérations arithmétiques élémentaires sont acceptés.

x+ y Addition

x− y Soustraction

x ∗ y multiplication

x/y division

x%y modulo

On rappel que x%y renvoie le reste de la division euclidienne de x par y. Par exemple 18%7 donne 4

car 18 = 7× 2+ 4.

15

En C++

Il faut prendre garde que les variables aient le même type. Si l’opération met en jeudes variables de type différents, c’est le type à la plus grande taille octale qui"absorbe" les autres.

Observons cet exemple.

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int a=0,b=0,c=0;6 float d=0.0;78 a=5;9 b=2;10 c=a/b;11 d=a/b;12 cout << "c = " << c << "\n" << "d = " << d;13 return(0);14 }

(Le caractère \n permet de sauter une ligne)Le résultat est

Exécution C++

c = 2d = 2Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En C++

La variable a vaut 5 et la variable b vaut 2. L’opération a/b fait intervenir deuxentiers, le programme réalisera alors cette opération en tant que nombre entier. Lerésultat de cette opération étant mathématiquement égale à 2.5, le programme donnerala valeur 2 puisque ce résultat est un nombre entier. Ainsi 2 est la valeur del’opération a/b. C’est pourquoi les variables c et d valent 2 qu’elles soient entièresou flottantes.

Observons à présent les lignes de code suivantes.

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int a=0, c=0;6 float b=0.0, d=0.0;78 a=5;

16

9 b=2;10 c=a/b;11 d=a/b;12 cout << "c = " << c << "\n" << "d = " << d;13 return(0);14 }

Le résultat est

Exécution C++

c = 2d = 2.5Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En C++

Puisque cette fois la variable b est une variables de type float, l’opération a/b estaussi de type float. Ainsi la résultat mathématique et informatique de l’opération a/bsont les même à savoir 2.5. La variable c étant entière, l’information enregistrée nepourra être que de type int et sera donc 2. Par contre, puisque la variable d estflottante, le nombre flottant 2.5 sera enregistré et donc affiché.

En Python

En Python les calculs se font plus simplement. Le type de retour d’un calcul est le typedu résultat.

Observons le code suivant.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 a=55 b=26 c=a/b78 print("c =", c)

L’exécution donnera le résultat :

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyc = 2.5C:\Users\David\Desktop\IntroProg>

Casting

En C++ comme en Python il existe également une opération permettant de gérer les types. Il s’agitde l’opération de casting.

17

En C++

x = (type) y

En Python

x = type(y)

Détaillons l’exemple suivant.

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int a=0, b=0;6 float c=0.0, d=0.0;78 a=5;9 b=2;10 c=(float)(a/b);11 d=(float)a/b;12 cout << "c = " << c << "\n" << "d = " << d;13 return(0);14 }

Le résultat est

Exécution C++

c = 2d = 2.5Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En C++

Les variables a et b sont entières. Ainsi le calcul de a/b donne toujours 2. Ce résultatest ensuite converti en nombre flottant mais est toujours 2 donc la variable c vaut 2.Par contre pour la variable d, l’absence de parenthèse contraint à imposer les prioritésde calcul dans l’ordre de lecture. C’est comme si la ligne 11 était d=((float)a)/b. Doncle numérateur n’est plus vu en tant qu’entier mais en tant que flottant forçant ainsile calcul a être flottant. Ceci explique pourquoi la variable d donne 2.5.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 a=55 b=26 c=int(a/b)78 print("c =", c)

18

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyc = 2C:\Users\David\Desktop\IntroProg>

Résolution du problème

L’objectif de ce chapitre est de résoudre le problème dont l’analyse avait fait naitre l’algorithmesuivant :

Algorithmie

1 Demander à l’utilisateur son année de naissance2 Ranger cette donnée dans une variable x3 Faire 2017-x et ranger le résultat dans une variable y4 Afficher y

Voici une solution

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int x=0, y=0;5 cout << "Saisissez votre année de naissance :";6 cin >> x;7 y=2017-x;8 cout << "Vous avez" << y << "ans";9 return(0);10 }

Exécution C++

Saisissez votre annùe de naissance :1983Vous avez34ansProcess returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En C++

Malheureusement il ne s’agit pas d’une faute de frappe. Les caractères accentués ne sontpas correctement reconnus par le C++ . Nous reparlerons des caractères plus en détailsdans la suite.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 x=05 y=0

19

6 x=input("Saisissez votre année de naissance :")7 y=2017-x8 print("Vous avez", y, "ans")

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pySaisissez votre année de naissance :1983Traceback (most recent call last):

File "C:\Users\David\Desktop\IntroProg\Test.py", line 7, in <module>y=2017-x

TypeError: unsupported operand type(s) for -: ’int’ and ’str’C:\Users\David\Desktop\IntroProg>

En Python

Comme nous l’avons signalé en introduction, le Python est un langage interprété. Le codeprécédent présente une erreur qui n’est pas relevé tant que la lecture du code n’y arrivepas. Comme on peut l’observer le Python gère très bien les caractères spéciaux mais aune toute petite faiblesse : le input lit des données de type chaine de caractère notéstr. La saisie de 1983 n’enregistre pas l’entier 1983 dans la variable x mais la chainede caractère "1983". Arrivé à la ligne 7, le programme nous signale qu’il ne sait pasfaire la soustraction entre l’entier 2017 et la chaine de caractère "1983". Il va êtrenécessaire de faire un cast (nous reviendrons plus tard sur les caractères et chainede caractère).

Voici le corrigé.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 x=05 y=06 x=int(input("Saisissez votre année de naissance :"))7 y=2017-x8 print("Vous avez", y, "ans")

Ce code donne le même résultat que celui en C++ . On peut optimiser un peu le code en limitant lenombre de variable

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int x=0;5 cout << "Saisissez votre année de naissance: ";6 cin >> x;7 cout << "Vous avez" << 2017-x << "ans";8 return(0);9 }

Le Python permet un travail bien plus impressionnant (dans la pratique on s’abstiendra à ce travailcertes élégant mais plutôt obscur).

20

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 print("Vous avez", 2017-int(input("Saisissez votre année de naissance :")), "ans")

Un dernier commentaire

Lorsque l’on est amené à résoudre des problème compliqué dont la séquentialisation est elle aussicomplexe, il est d’accoutumé de commenter code, c’est à dire lui ajouter des annotations qui n’impac-terons pas l’exécution et n’ont que des vertus de commentaire.

En C++

// Sur une ligne/* Ou surplusieursligne */

En Python

# Sur une ligne""" Ou surplusieursligne """

21

5. Détail d’un premier exemple & déroulés

Voici le problème que nous allons cherché à résoudre

Écrire un programme qui demande à l’utilisateur 5 entiers et calcul leur moyenne.

Analysons le problème : nous avons besoin de cinq entiers donc de 5 variables associées ainsi qued’une variable pour calculer la moyenne qui est donc à priori flottante. L’algorithme ressemble donc àceci :

Algorithmie

1 Saisir l’entier e12 Saisir l’entier e23 Saisir l’entier e34 Saisir l’entier e45 Saisir l’entier e56 Calculer y = (e1+e2+e3+e4+e5)/57 afficher y

Les solutions dans nos langages donnent :

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int e1=0, e2=0, e3=0, e4=0, e5=0;5 float y=0.0;6 cout << "Saisir e1: ";7 cin >> e1;8 cout << "Saisir e2: ";9 cin >> e2;10 cout << "Saisir e3: ";11 cin >> e3;12 cout << "Saisir e4: ";13 cin >> e4;14 cout << "Saisir e5: ";15 cin >> e5;16 y=(e1+e2+e3+e4+e5)/5.0;17 cout << "La moyenne de ces18 entiers est " << y;19 return(0);20 }

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 e1=int(input("Saisir e1 :"))5 e2=int(input("Saisir e2 :"))6 e3=int(input("Saisir e3 :"))7 e4=int(input("Saisir e4 :"))8 e5=int(input("Saisir e5 :"))9 y=(e1+e2+e3+e4+e5)/510 print("La moyenne de ces11 entiers est", y)

En C++

Pour des raisons de typage évoquéesau précédent chapitre, la divisionsera entière si elle ne fait intervenirque des nombres entiers. Pour "forcer"l’opération à être flottante on pourraitfaire un cast ou alors "tricher"avec le système en divisant par 5.0au lieu de 5. C’est la même choseexcepté que 5.0 est un flottant alorsque 5 est un entier.

Considérons à présent le problème suivant.

Écrire un programme qui demande à l’utilisateur 5 entiers et calcul leur moyenne. Le pro-gramme ne devra pas utiliser plus de deux variables.

Ce problème est un plus compliqué. Pour nous aider dans notre réfléxion observons en détail letravail précédent. On observe qu’avec nos variables nous avons fait deux choses : saisir et un calcul.La valeur de chaque entier n’est pas importante, seul leur somme compte. On conclut que nous

pouvont utiliser la variable y pour stocker la somme au fur et à mesure de la saisie.

22

Algorithmie

1 Mettre le flottant y à 02 Saisir l’entier e1 et ajouter cette saisie à y (y=y+e1, donc y=e1)3 Saisir l’entier e2 et ajouter cette saisie à y (y=y+e2, donc y=e1+e2)4 Saisir l’entier e3 et ajouter cette saisie à y (y=y+e3, donc y=e1+e2+e3)5 Saisir l’entier e4 et ajouter cette saisie à y (y=y+e4, donc y=e1+e2+e3+e4)6 Saisir l’entier e5 et ajouter cette saisie à y (y=y+e5, donc y=e1+e2+e3+e4+e5)7 Diviser y par 5 et mettre le résultat dans y.8 Afficher y

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int e=0;5 float y=0.0;6 cout << "Saisir e1: ";7 cin >> e;8 y=y+e;9 cout << "Saisir e2: ";10 cin >> e;11 y=y+e;12 cout << "Saisir e3: ";13 cin >> e;14 y=y+e;15 cout << "Saisir e4: ";16 cin >> e;17 y=y+e;18 cout << "Saisir e5: ";19 cin >> e;20 y=y+e;21 cout << "La moyenne de ces22 entiers est " << y/5;23 return(0);24 }

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 y=0.05 e=int(input("Saisir e1 :"))6 y=y+e7 e=int(input("Saisir e2 :"))8 y=y+e9 e=int(input("Saisir e3 :"))10 y=y+e11 e=int(input("Saisir e4 :"))12 y=y+e13 e=int(input("Saisir e5 :"))14 y=y+e15 print("La moyenne de ces16 entiers est", y/5)

Les déroulés

Pour bien comprendre ce qui se passe réalisonsle déroulé du programme. Il s’agit d’un tableau oules colonnes représentent les variables et les lignesles différentes séquences du code que l’on iden-tifie à la ligne d’observation. Dans notre exemple,notre programme utilise 2 variables e et y (on re-garde le code C++ , on raisonne exactement de lamême manière avec le code en Python ). Le dé-roulé est alors (on ne s’attarde pas sur les lignesn’impliquant pas de variable) :

Ligne e y

5 0 0

7 1 0

8 1 1

10 1 1

11 1 2

13 2 2

14 2 4

16 2 4

17 2 6

19 3 6

20 3 9

23

6. Tests et conditions

Voici le problème que nous cherchons à résoudre dans ce chapitre

Demander à l’utilisateur de saisir un entier et afficher s’il est positif ou négatif.

L’algorithme est le suivant.

Algorithmie

1 Saisir un entier et stocker sa valeur dans une variable x2 Si x est positif alors afficher "x est positif"3 Sinon afficher "x est négatif"

Pour indenter cet algorithme en C++ ou Python , nous allons introduire la notion d’exécution condi-tionnelle. Nous allons réaliser un test et en fonction du résultat nous allons exécuter différentes instruc-tions. Pour arriver à cette fin nous allons travailler en deux temps. Tout d’abord nous allons détailler lanotion de test. En second temps nous introduirons l’exécution conditionnelle.

Tests et booléens

Nous avons besoin de réaliser un test et savoir s’il est vrai ou faux.En informatique on convient que

0 = FAUX 1 = VRAI

En fait 0 représente le faux et tout ce qui n’est pas 0 est vrai. Pour distinguer les entiers du vrai et dufaux on introduit le type booléen.

En C++

1 bool x, y;2 x=true;3 y=false;

En Python

1 x=True2 y=False

On prendra garde aux majuscules.

La mathématique discrète 8 met à notre disposition des connecteurs dont les tables de vérités sontles suivantes

OU 0 1

0 0 1

1 1 1

ET 0 1

0 0 0

1 0 1

0 1

NON 1 0

Ces connecteurs se retrouvent dans nos langages.

En C++

x OU y = x or yx ET y = x and yNON x = not x

En Python

x OU y = x or yx ET y = x and yNON x = not x

Les outils de tests sont également les même pour les deux langages que nous étudions.

8. Appelé également la logique.

24

Symbole Signification

== Est égal à

> Est supérieur à

< Est inférieur à

>= Est supérieur ou égal à

<= Est inférieur ou égal à

!= Est différent de

On fera bien attention. Le symbole = est associé à l’affectation tandis que == est le test d’égalité.

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 cout << not((1<1) or (1==1));5 return 0;6 }

Exécution C++

0Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 print(1>0 and 0!=0)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyFalseC:\Users\David\Desktop\IntroProg>

L’exécution conditionnelle

En C++

Un bloc d’instruction{Se situe entre incolladesLa tabulation permet de clarifierle code. Ce n’est pas nécessairemais très confortable.

}

En Python

Un bloc d’instructionSe situe par une tabulationAttention ! La tabulation n’estpas trois (ou cinq) espaces maisbien le caractère de tabulation.

L’exécution conditionnelle, comme son nom l’indique va exécuter un bloc d’instruction si une conditionest vérifiée ou plutôt si un test est vrai.

25

En C++

if( true ){bloc d’instruction

}

En Python

if( True ):bloc d’insctruction

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int age=0;5 cout << "Quel est votre age : ";6 cin >> age;7 if(age>=18){8 cout << "Vous etes majeur.";9 }10 return(0);11 }

Exécution C++

Quel est votre age : 34Vous etes majeur.Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

Exécution C++

Quel est votre age : 17

Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 n=int(input("Quelle est votre taille en centimètre : "))4 if(n>200) :5 print("Vous êtes immense !!!")

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyQuelle est votre taille en centimètre : 200

C:\Users\David\Desktop\IntroProg>

26

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyQuelle est votre taille en centimètre : 201Vous êtes immense !!!C:\Users\David\Desktop\IntroProg>

On peut également enrichir le si par un sinon. C’est la commande else.

En C++

if(true){bloc d’instruction

}else{

//c’est à dire falsebloc d’instruction 2

}

En Python

if(true) :bloc d’instruction

else :#c’est à dire Falsebloc d’instruction 2

}

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int age=0;5 cout << "Quel est votre age : ";6 cin >> age;7 if(age>=18){8 cout << "Vous etes majeur.";9 }10 else{11 cout << "Vous etes mineur";12 }13 return(0);14 }

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 n=int(input("Quelle est votre taille en centimètre : "))4 if(n>200) :5 print("Vous êtes immense !!!")6 else :7 print("C’est normal.")

Résolution du problème

Le problème introduit au début du chapitre trouve alors une solution facilement

En C++

1 #include<iostream>2 using namespace std;

27

3 int main(){4 int n=0;5 cout << "Saisir un entier : ";6 cin >> n;7 if(n>=0){8 cout << "L’entier est positif.";9 }10 else {11 cout << "L’entier est negatif.";12 }13 return(0);14 }

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 n=int(input("Saisir un entier : "))4 if(n>0) :5 print("L’entier est positif.")6 else :7 print("L’entier est négatif.")

Un peu plus de condition

On peut imbriquer les exécutions conditionnelles.

En C++

if(Test1){Bloc1

}else if(Test2){

Bloc2}...else if(TestN){

BlocN}else{

Bloc}

En Python

if(Test1) :Bloc1

elif(Test2) :Bloc2

...elif(TestN) :

BlocNelse :

Bloc

Le else final est facultatif.Nous pouvons alors perfectionner la solution proposée au problème de ce chapitre.

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int n=0;5 cout << "Saisir un entier : ";6 cin >> n;7 if(n>0){

28

8 cout << "L’entier " << n << " est postif.";9 }10 else if(n<0) {11 cout << "L’entier " << n << " est negatif.";12 }13 else{14 cout << "L’entier 0 est nul !";15 }16 return(0);17 }

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 n=int(input("Saisir un entier : "))4 if(n>0) :5 print("L’entier", n, "est positif.")6 elif(n<0):7 print("L’entier", n, "est négatif.")8 else :9 print("L’entier 0 est nul !")

29

7. Boucles

Jusqu’à présent nous pouvons remarquer que ce que nous faisons avec les programme ne relèvepas de l’impossible. A vrai dire tous les problèmes que nous résolvons, se font très facilement avecdu papier et un crayon (le support numérique en moins). La vrai force d’un ordinateur réside dans lefait qu’on peut lui demander de faire des taches répétitives et relativement complexe sans qu’il ne seplaigne trop 9.Imaginons le problème suivant.

Écrire 4000 fois "Je ne tricherai pas à mes examens".

Avec du papier et un crayon, il s’agit plus d’une torture que d’une punition. Si l’on prend le problèmeà la lettre, avec l’ordinateur, cela peut s’avérer aussi éprouvant. On pourrait en effet taper 4000fois

En C++

cout « "Je ne tricherai pas à mes examens";

et jouer avec des copier-coller. Même si c’est moins long, ça n’en reste pas moins barbare 10.Il existe un moyen de faire ce travail passionnant par l’ordinateur. C’est le principe des boucles.Une boucle doit impérativement répondre à trois questions :

Quelle est la condition d’entrée ? C’est à dire qu’est-ce qui provoquera l’entrée dans la boucle.

Quelle est la condition de sortie ? C’est à dire quelle condition provoquera la fin de la boucle.

Quelle est la condition d’itération ? C’est à dire, la condition qui fera que l’on restera "à tourner"dans la boucle.

Pour satisfaire ces trois questions, nous allons introduire la boucle while 11. Ce prédicat prend unparamètre qui est un test. Tant que ce test est vrai alors on fera un tour de boucle.

En C++

while(Test){Bloc d’instruction

}

En Python

while(Test) :Bloc d’instruction

Avant de répondre au problème, détaillons deux exemples à travers leur déroulés.

Exemple 1

En Python

2 #!/usr/bin/python3 # -*- coding: utf-8 -*-4 i=05 while(i<15) :6 print("La valeur de i est ", i)7 i=i+68 i=2*i9 print("La valeur de i est ", i)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyLa valeur de i est 0La valeur de i est 6La valeur de i est 12La valeur de i est 16La valeur de i est 32C:\Users\David\Desktop\IntroProg>

9. Pour le moment10. Le problème redeviendrait éprouvant si l’on changeait le 4000 par un 999999999999911. tant que en français

30

Ligne i Commentaire

4 0 C’est l’initialisation

5 0 Le test est vrai, on entre dans la boucle

7 6 C’est la fin de la boucle on retourne à la ligne 5

5 6 Le test est vrai, on entre dans la boucle

7 12 C’est la fin de la boucle on retourne à la ligne 5

5 12 Le test est vrai, on entre dans la boucle

7 16 C’est la fin de la boucle on retourne à la ligne 5

5 16 Le test est faux, on ne rentre pas dans la boucle. On se rend à la ligne 8

8 32

Exemple 2

En C++

2 #include<iostream>3 using namespace std;4 int main(){5 int x=15;6 while(x>0){7 cout << "x = " << x << "\n";8 x=x/2;9 }10 return(0);11 }

Exécution C++

x = 15x = 7x = 3x = 1Process returned 0 (0x0) executiontime : X.xxx sPress any key to continue.

Ligne x Commentaire

5 15 C’est l’initialisation

6 15 Le test est vrai, on entre dans la boucle

8 7 C’est la fin de la boucle on retourne à la ligne 6

6 7 Le test est vrai, on entre dans la boucle

8 3 C’est la fin de la boucle on retourne à la ligne 6

6 3 Le test est vrai, on entre dans la boucle

8 1 C’est la fin de la boucle on retourne à la ligne 6

6 1 Le test est vrai, on entre dans la boucle

8 0 C’est la fin de la boucle on retourne à la ligne 6

6 0 Le test est faux, on se rend à la ligne 10 qui est la fin du programme

Résolution du problème

Algorithmie

1 Mettre une variable entière i à 12 Tant que i est inférieur ou égale à 4000 faire :3 écrire "Je ne tricherai pas à mes examens"4 incrémenter i de 1 (i=i+1)

31

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int i=1;5 while(i<=4000){6 cout << "Je ne tricherai pas a7 mes examens\n";8 i=i+1;9 }10 return(0);11 }

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 i=14 while(i<=4000) :5 print("Je ne tricherai pas à6 mes examens")7 i=i+1

32

8. Tableaux

Dans ce chapitre le problème est le suivant.

Demander à l’utilisateur de saisir 15 entiers et afficher ces entiers classés dans l’ordre crois-sant.

De prime abord le problème est divisé en deux parties : une partie de saisie et une partie de tri.Pour la saisie nous avons besoin de 15 variables et ce seront ces variables qu’il faudra trier en

fonction de leur valeur. Une première solutions sera de définir ces 15 variables "à la main" : x1, x2 ...,x15. Cela peut sembler raisonnable sauf si le problème demande la saisie de 150 entiers. Un moyen derégler le problème du nombre de variable est de les déclarer "en même temps". Cela se fait par le biaisde tableau.

En C++

Pour définir un tableau en C++ il faut préciser le type de donnée de comprendra le tableau.Dans notre exemple nous voulons définir un tableau de 15 entiers. Cela se fait de lamanière suivante

int x[15];

Cela crée (déclare) 15 variables de type int nommé respectivement x[0], x[1], ..., x[14].ATTENTION ! Un tableau ’x’ de 15 entiers est indexée de 0 à 14. La variable x[15] n’existepas, tout comme x[16], x[17] etc.

En Python

Il existe différente manière de définir des tableaux en Python . Une manière simple etassez similaire au C++ est d’utiliser ce qui est appelé des dictionnaire mais que nousappellerons simplement tableau. Pour ce faire, il suffit de déclarer la variable avecle mot clef dict.

x=dict()

La puissance du Python fait qu’une fois la variable x ainsi déclarée on peut mettre àpeu près n’importe quoi dans les cases du tableau de manière dynamique (des caractères,des chaines de caractères, des flottants, des entiers, d’autre tableau) ; tableau pouvantêtre de taille infini (et non limité à 5 cases comme le C++ ). Nous garderons tout demême les bons réflexes de gestion des tableau que nous allons adopter avec le C++ .

Procédons à présent à la saisie. Pour ce faire, au lieu de faire 15 saisies à la suite, on va réaliserune boucle.

Algorithmie

Déclarer un tableau de 15 entier xMettre une variable i à 0Tant que i est strictement plus petit que 15 fairedemander de saisir un entierRanger le résultat de la saisie dans la variable x[i]Incrémenter le i

Ce qui donne

33

En C++

1 int x[15], i=0;2 while(i<15){3 cout << "Saisir un entier : ";4 cin >> x[i];5 i=i+1;6 }

En Python

1 x=dict()2 i=03 while(i<15):4 x[i]=int(input("Saisir un entier:"))5 i=i+1

Passons à présent au tri. Il existe différent algorithme de tri. Détaillons-en un.L’idée est de placer le plus petit élément dans la première case du tableau et de recommencer en

"oubliant" la première case et ainsi de suite.

Algorithmie

Déclarer les entiers i, j et mini=0Tant que i est strictement plus petit que 15 faire

j=iTant que j est strictement plus petit que 15 faire

Si x[j]<x[i] alors utiliser min pour inverser ces casesj=j+1

i=i+1

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 x=dict()4 i=05 j=06 xmin=07 while(i<15):8 x[i]=int(input("Saisir un entier:"))9 i=i+110 i=011 while(i<15):12 j=i13 while(j<15):14 if(x[j]<x[i]):15 xmin=x[j]16 x[j]=x[i]17 x[i]=xmin18 j=j+119 i=i+120 i=021 while(i<15):22 print(x[i])23 i=i+1

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int x[15], i, j, xmin;5 i=0;6 while(i<15){7 cout << "Saisir un entier : ";8 cin >> x[i];9 i=i+1;10 }11 i=0;12 while(i<15){13 j=i;14 while(j<15){15 if(x[j]<x[i]){16 xmin=x[j];17 x[j]=x[i];18 x[i]=xmin;19 }20 j=j+1;21 }22 i=i+1;23 }24 i=0;25 while(i<15){26 cout << x[i] << "\n";27 i=i+1;28 }29 return(0);30 }

34

9. Caractères et chaines de caractères

Nous avons beaucoup manipulé les nombres entiers ou décimaux mais, comme nous l’avons signalédans le chapitre sur les variables, il est également possible de manipuler des caractères et chaines decaractère.

En C++

// Pour définir un caractère :char c;

// Pour définir une chaine de caractère :string s;

En Python

#Pour définir un caractère :c =’’

#Pour définir une chaine de caractère :s=""

On prend bien soin à distinguer les symboles utiliser. Une simple apostrophe pour un caractère etdes doubles apostrophes pour des chaines de caractères 12.

En Python

Le python ne distingue pas un caractère d’une chaine de caractères ; il n’y a pas de type’char’ mais qu’un type string noté

str

Il n’y a pas d’erreur en écrivant c=’Bonjour’. Cependant pour bien distinguer uncaractère et un chaine, nous prendrons soin à ne pas mélanger les notations.

D’un point de vue de l’informatique, tout est nombre 13 (binaire). Ainsi un caractère est un nombre etune chaine de caractère est une suite de caractère c’est à dire un tableau de nombre.La correspondance entre nombre et caractère est résumé dans une table nommé table ASCII 14

que l’on peut faire apparaitre pas le code suivant.

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 int i=0;5 while(i<256){/*Les caractères ASCII sont6 numérotés de 0 à 255*/78 cout << i << " : " << (char) i; /* L’opération de cast ici force9 l’entier i à être vu comme le10 caractère ASCII numéro i*/11 cout << "\t"; /*Le caractère \t permet de réaliser une tabulation12 pemettant une lecture plus légère de l’affichage*/13 i=i+1;14 }15 return 0;16 }

Ce qui donne :

12. Il n’est pas interdit d’avoir une chaine de caractère qui ne comporte un seul caractère de sorte que s="x" est possible.Mais il est strictement impossible d’avoir un caractère composé de plusieurs caractère de sorte que c=’xyz’ est impossible.Cependant certain caractère appelés caractères d’échappement peuvent, pour s’écrire, nécessiter plusieurs caractère. Parexemple le caractère de saut de ligne c=’\n’ est valide.13. Dixit Pythagore14. American standard code for information interchange

35

Certain caractère n’apparaissent pas, ce la ne signifie pas qu’ils ne sont rien. Il existe en effet uncaractère de fin de chaine, de fin de fichier etc... qui simplifie le travail du programmeur (les caractèresnotés 7, 8 etc...).Il y a aussi des caractères spéciaux comme le 13 que l’on ne vois pas apparaitre et qui a le

mauvais gout de faire disparaitre les caractères 11 et 12 puisqu’il s’agit en fait du retour chariot (cecaractère va placer le curseur au début de la ligne ce qui provoque un écrasement par les donnéesqui suivent ; c’est pour cette raison que la ligne 2 commence avec le caractère 14). Voici une liste nonexhaustive des caractères d’échappement (autrement que par leur numéro ASCII).

\n Saut de ligne

\t Tabulation

\r Retour chariot

\a ’Bip’

\0 Fin de chaine

En Python

Du fait que le Python ne distingue pas les caractères et les chaines, les opérationsde cast usuelles provoqueront des erreurs comme par exemple x=int(’a’). L’alternativeconsiste à utiliser deux fonctions (nous parlerons de la notion de fonction eninformatique au prochain chapitre).

1 #Pour récupérer le numéro ASCII d’un caractère :2 n=ord(’a’) #Cette ligne donnera le nombre 973 n=ord(’Bonjour’) #Cela provoquera une erreur45 #Pour récupérer le caractère ASCII associé à un entier6 c=chr(97) #Cette ligne donnera le caractère ’a’7 c=chr(970) #Cela provoquera une erreur

on peut réécrire le programme précédent en Python :

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 i=04 while(i<255) :5 print(i, " : ", chr(i))6 i=i+1

36

Saisie d’une chaine de caractère

En Python

Le Python gère très bien les (chaines de) caractères. Ainsi il suffit de faire un inputpour saisir tous les caractères entrés au clavier (sans problème d’encodage qui plusest). De plus comme nous l’avons déjà signalé input lit des caractère. Ainsi dans lecas d’une saisie de caractère (ou chaine de caractères) il n’est pas nécessaire de fairede cast.

En C++

Le C++ a un défaut pour la gestion des chaines de caractère : la lecture d’une chaines’intérompt soit à la touche entrée, soit au caractère d’espace ou de tabulation. Prenonsl’exemple suivant

1 #include<iostream>2 using namespace std;3 int main(){4 string s;5 //On utilise le caractère ASCII de ’é’ pour régler le problème d’affichage6 cout << "Saisissez une chaine de caract" << (char)(138) << "re : ";7 cin >> s;8 cout << s;9 return 0;10 }

Exécution C++

Saisissez un chaine de caractères : Bonjour tout le mondeBonjourProcess returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En C++

Pour saisir les 4 mots il faut 4 variables.

1 #include<iostream>2 using namespace std;3 int main(){4 string s1, s2, s3, s4;5 //On utilise le caractère ASCII de ’é’ pour régler le problème d’affichage6 cout << "Saisissez une chaine de caract" << (char)(138) << "re : ";7 cin >> s1 >> s2 >> s3 >> s4;8 cout << s1 << s2 << s3 << s4;9 return 0;10 }

Exécution C++

Saisissez un chaine de caractère : Bonjour tout le mondeBonjourtoutlemondeProcess returned 0 (0x0) execution time : X.xxx s

37

Press any key to continue.

En C++

Le problème de ce code est qu’il est nécessaire de saisir 4 mots. S’il y en a moins leprogramme attendra d’avoir fait ses 4 saisies pour continuer, s’il y en a plus il"oubliera" les autres.

Il existe un moyen de saisir la ligne entière jusqu’à ’Entrée’ :

1 #include<iostream>2 using namespace std;3 int main(){4 string s;5 //On utilise le caractère ASCII de ’é’ pour régler le problème d’affichage6 cout << "Saisissez une chaine de caract" << (char)(138) << "re : ";7 getline(cin, s)8 cout << s;9 return 0;10 }

Voyons à présent quelques opération sur les caractères et chaines de caractères.

Concaténation

En Python comme en C++ , la concaténation des chaines de caractères se fait par l’opération +.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 s1=input("Chaine 1 : ")4 s2=input("Chaine 2 : ")56 s="Concaténation :" + s1 + ’ ’ + s27 print(s)

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyChaine 1 : HelloChaine 2 : WorldConcaténation : Hello WorldC:\Users\David\Desktop\IntroProg>

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 string s1, s2;5 cout << "Chaine 1 : ";6 getline(cin,s1);7 cout << "Chaine 2 : ";8 getline(cin,s2);9 cout << "Concatenation :"+s1+’ ’+s2;10 return(0);11 }

Exécution C++

Chaine 1 : Encore un exempleChaine 2 : Encore unConcaténation : Encore un exempleEncore unProcess returned 0 (0x0) executiontime : X.xxx sPress any key to continue.

Parcours d’une chaine

Une chaine de caractère est un tableau de caractère. En particulier les opérations associées auxtableaux s’appliquent aux chaines. Ainsi, si s est une chaine de caractère, s[0] est le premier caractère

38

de cette chaine et de manière générale s[n] est le (n+1)-ième caractère de la chaine.Bien sur, il faut que ce caractère existe sinon cela provoquera une erreur.

En C++

1 #include<iostream>2 using namespace std;3 int main(){4 string s;5 cout << "Chaine : ";6 getline(cin,s);7 cout << "Le premier caractere8 est:" << s[0];9 return(0);10 }

Exécution C++

Chaine : PikachuLe premier caractere est:PProcess returned 0 (0x0) executiontime : X.xxx sPress any key to continue.

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 s=input("Chaine : ")4 print("Le premier caractère est:", s[0])

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyChaine : PikachuLe premier caractere est: PC:\Users\David\Desktop\IntroProg>

La question qui se pose naturellement est de savoir comment parcours une chaine du début à lafin.

En Python

On dispose en python d’une fonction

len

qui retourne la longueur de la chaine de caractère.

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 s=input("Chaine : ")4 i=05 while(i<len(s)) :6 print("Caractère ", i+1, " : ", s[i])7 i=i+1

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.pyChaine : BonjourCaractère 1 : BCaractère 2 : oCaractère 3 : nCaractère 4 : jCaractère 5 : oCaractère 6 : u

39

Caractère 7 : rC:\Users\David\Desktop\IntroProg>

En C++

En C++ , on peut parcourir la chaine jusqu’à rencontrer le caractère de fin de chaine.

1 #include<iostream>2 using namespace std;3 int main(){4 string s;5 int i;6 cout << "Chaine : ";7 getline(cin,s);8 i=0;9 while(s[i]!=’\0’){10 cout << "Caractere " << i+1 << " : " << s[i] << "\n";11 i=i+1;12 }13 return(0);14 }

Exécution C++

Chaine : Ha ha haCaractere 1 : HCaractere 2 : aCaractere 3 :Caractere 4 : hCaractere 5 : aCaractere 6 :Caractere 7 : hCaractere 8 : aProcess returned 0 (0x0) execution time : X.xxx sPress any key to continue.

A propos de l’écrasement

En C++

En C++ , il est possible d’écraser un caractère dans une chaine par un autre caractère.Si la variable s est une chaine de caractère initialisé à "Bonjour" et que nous faisonss[0]=’A’ alors la chaine s est "Aonjour".

En Python

En Python le type caractère n’existe pas. Il n’y a que des chaines de caractères. Desorte que si l’on se place dans le contexte précédent avec une variable s="Bonjour" etque nous saisissons s[0]=’A’ cela provoquera une erreur. En effet, ce code cherche àremplacer le caractère ’B’ par la chaine de caractère "A".

40

10. Second exemple

Voici le problème que nous allons cherché à résoudre

Écrire un programme qui demande à l’utilisateur de saisir une chaine de caractère et mettoutes les minuscules en majuscule (on laissera de coté les caractères accentués)

ce problème est clairement divisé en deux parties. Une première partie concernant la saisie de laphrase. La seconde sur la transformation de la chaine. Il apparait alors que nous allons avoir besoinde deux variables : une variable pour la saisie et une variable pour la transformation (on pourrait fairele travail avec une seul variable mais, les variables sont gratuites et dans ce cas non négligeables).Intéressons nous à la seconde partie. Il va falloir parcourir la chaine de caractère et dès que nous

allons rencontrer un caractère minuscule nous allons le transformer en majuscule.Lorsqu’on observe la table ASCII, on voit que les caractère minuscules sont tous (accents en moins)

compris entre 97 et 122 et les lettres majuscules entre 65 et 90. Ceci fait naitre la solution

Algorithmie

Saisir la chaine dans une variable sPour chaque caractère de la chaine s

Si le caractère ASCII est entre 97 et 122 soustraire 32 et ajouter (=concaténer)le caractère associé à la chaine solution (qu’il faut donc initialiseravec la chaine vide).

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 s=input("Chaine : ")5 i=06 res=""7 while(i<len(s)) :8 if(ord(s[i])>=97 and ord(s[i])<=122) :9 res=res+chr(ord(s[i])-32)10 else :11 res=res+s[i]12 i=i+113 print(res)

Il est également possible de résoudre ce problème sans "compter" les caractères.

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 string s, res;6 int i;7 cout << "Chaine : ";8 getline(cin,s);9 i=0;10 while(s[i]!=’\0’){11 if(s[i]>=’a’ and s[i]<=’z’){12 res=res+(char)(s[i]-’a’+’A’);13 }

41

14 else {15 res=res+s[i];16 }1718 i=i+1;19 }20 cout << res;21 return(0);22 }

42

11. Fonctions

L’une des difficultés majeure de la résolution d’un problème informatique est de séquentialiser larésolution. Comme nous l’avons signalé en introduction, l’informatique (à travers l’algorithmie) permet derésoudre des problèmes "faciles". Pour les problèmes plus compliqués, on doit les subdiviser en tacheélémentaire.Les fonctions sont un outil puissant de la séquentialité. Elles font cependant naitre un petit tour de

l’esprit : la portabilité. Illustrons ces concepts à travers le problème suivant.

Écrire une "calculatrice élémentaire". Il s’agit d’un programme qui propose un menu : ad-ditionner, soustraire, multiplier et diviser deux nombres. Dans un premier temps, on affiche lemenu des opérations. Puis une fois l’opération sélectionnée, on invite l’utilisateur à saisir deuxnombres et on affiche le résultat. On redirige ensuite l’utilisateur vers le menu.

Algorithmie

Pour résoudre ce problème on va introduire des fonctions.– Une fonction pour additionner– Une fonction pour soustraire– Une fonction pour multiplier– Une fonction pour diviser– Une fonction d’affichage du menu

Une fois ces fonctions créées, on les assembles pour obtenir le résultat souhaitée...algo to be continued !

Les fonctions sont identifiées, comme pour les variables, par un nom. Le choix de ce nom est soumisaux même règles que pour les variables. Dans ce cours, pour distinguer les fonctions des variables, nousallons convenir que les noms de fonction commencent par une majuscule.Comme en mathématiques, les fonctions prennent un ou des paramètres et renvoie une valeur

(également une variable). L’informatique type les données, ainsi une valeur de retour de fonction peutêtre une chaine de caractère ou un nombre etc.

En C++

Les fonctions se rédigent avant la fonction principal (main) et on la forme suivante :

type_de_retour Nom_de_fonction(type1 x1, type2 x2, ..., typen xn){bloc d’instruction

}

En Python

Les fonctions en Python sont assez similaire à celle du C++ à ceci près que le Pythonn’est pas typé. On ne déclare donc pas le type. On déclare une fonction à l’aide du motclef def.

def Nom_de_fonction(x1, x2, ..., xn) :Bloc d’instruction

Pour indiquer la variable (valeur) que l’on souhaite retourner, on l’indique par la commande return.La fonction suivante calcul le carré d’un nombre réel.

En C++

1 float Fonction(float x){2 float y=0.0;3 y=x*x;4 return(y);

43

5 }Il est possible de faire cette fonction sans déclarer de variable.

1 float Fonction(float x){2 return(x*x);3 }

L’utilisation de cette fonction se fait comme pour une fonction mathématique : enl’appelant par son nom et en lui indiquant la valeur à prendre ! Nous obtenons le codesuivant

1 #include<iostream>2 using namespace std;34 float Fonction(float x){5 return(x*x);6 }78 int main(){9 float a=0.0, b=0.0;10 cout << "Saisir un nombre reel : ";11 cin >> a;12 b=Fonction(a);13 cout << "Le carre de " << a << " est " << b;14 return 0;15 }

Illustrons cet exemple à travers son déroulé.

Ligne a b x Commentaires

9 0.0 0.0

11 4 0.0

12 Appel de fonction. Aller ligne 4

4 4 0.0 4 Fin de la fonction par le return. Aller fin de ligne 12

12 4 16 Dans la fonction principal, la variable x n’existe pas.

Dans l’exemple que nous avons traiter ici, la variable x est local. Elle n’existe que localement dans lafonction Fonction. Dès la fonction achevée, la variable est détruite 15. En fait même si la variable avaitété nommé a cela n’aurait rien changé au programme. En effet, même si la variable porte le même nom,elle aura un autre référence (ou adresse, c’est à dire l’endroit physique ou est stockée l’information dansla mémoire). C’est ce qu’on appel la portabilité de la variable. Elle n’"existe" que dans la fonction.Il en va de même ne Python

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 def Fonction(x) :5 return x*x;6 a=0.07 b=0.08 a=float(input("Saisir un nombre réel : "))

15. Il faut par là comprendre que l’espace qu’elle occupait dans la mémoire est libérée et l’information perdue.

44

9 b=Fonction(a)10 print("Le carré de ", a, "est", b)

Procédures

Il est possible qu’une fonction ne retourne pas de valeur. Dans ce cas, on ne parle pas de fonctionmais de procédure.

En C++

Pour une procédure, il n’y a pas de valeur de retour, donc pas de type de retour. Pourrespecter la syntaxe, on introduit le type vide noté

void

Voici un exemple.

En C++

1 #include<iostream>2 using namespace std;34 void Procedure(int i){5 cout << "On affiche la variable i=" << i;6 }78 int main(){9 Procedure(123);10 return 0;11 }

Exécution C++

123On affiche la variable i=123Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En Python

Le python n’étant pas typé, la seule différence entre les fonctions et les procéduresportent sur la présence éventuelle d’un return.

Portabilité - IGL

L’acronyme IGL fait référence au niveau possible pour les variables/fonctions(/constantes) :– I pour interne qui fait appel aux noms prédéfini par le langage comme par exemple return, if,int...

– G pour global qui fait appel aux noms définis globalement.– L pour local qui fait appel aux noms définis localement dans les fonctions.Ces niveaux s’imbriquent les un dans les autres. Une commande(/constante) interne peut-être utilisée

à n’importe qu’elle endroit du code sans avoir besoin de la déclarer ou de l’initialiser. Une variableglobale peut être utilisée dans toutes les fonctions dès qu’elle est déclarée et les variables internesn’existent que dans le bloc d’instruction où elles sont déclarées.

45

En C++

Pour utiliser une variable globale en C++ , il suffit de la déclarer avant la fonctionprincipale (main).

En Python

Par défaut, toutes les variables/fonctions sont globales. On peut de plus forcer unevariable locale à être globale en la précédent par le mot clef

global

Réalisons le déroulé du programme suivant.

En C++

1 #include<iostream>2 using namespace std;34 int k=1;56 int F1(int x){7 return(2*x+k);8 }910 int F2(int x){11 if(k%2==0) return x/2;12 else return 3x+1;13 }1415 int main(){16 int a=1;17 k=k+1;18 cout << k << endl << F1(k) << endl << F2(a);19 return 0;20 }

Ligne a k x1 x2 Commentaires

4 1

16 1 1

17 1 2

18 On appel F1, on va à la ligne 6

4 1 2 2 La variable x1 est initialisée à 2 et retourne donc 2 ∗ 2+ 2.

18 1 2 Le nombre 6 s’affiche. On appel la fonction F2 et on va à la ligne 10

10 1 2 1 La variable x2 est initialisée à 1 et retourne donc 1/2.

18 1 Le nombre 0 s’affiche.

Passage par référence

Il est possible de modifier la valeur d’une variable passée en paramètre d’une fonction. Pour celalorsque l’on passe la variable en paramètre on indique non pas son nom mais son adresse (ou réfé-rence).

46

En C++

En C++ l’adresse d’une variable se signale en précédent le nom de la variable par unet commerciale. Ainsi

&n

correspond à l’adresse de la variable n. On peut d’ailleurs la faire apparaitre.

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int n=123;67 cout << "La variable n vaut "<< n << " et son adresse est " << &n;8 return 0;9 }

Exécution C++

La variable n vaut 123 et son adresse est 0x28fefcProcess returned 0 (0x0) execution time : X.xxx sPress any key to continue.

L’adresse est précédé de 0x pour signifier que le nombre 28fefc est en hexadécimale.

En C++

Il faut aussi spécifier à la fonction que le(s) paramètre(s) passé(s) correspondent àdes adresses et non des valeurs. Pour ce faire on succède le type par une étoile, commepar exemple

1 void Fonction(float *x)

Il faut alors faire attention. La variable x est une adresse, c’est à dire que lavaleur qu’elle contient est de la forme 0x28fefc. Dans ce cas on ne peut pas utiliserles opérations arithmétiques classique (par exemple l’addition ou la division n’ont pasde sens pour des adresses). Pour récupérer la valeur contenu à l’adresse contenu dansla variable x, on met une étoile devant la variable

*x

Voici un exemple

En C++

1 #include<iostream>2 using namespace std;34 float Procedure(float *x){5 *x=*x+1;6 *x=2*(*x);7 }8

47

9 int main(){10 float a=0.0;11 cout << "Saisir un reel : ";12 cin >> a;13 Procedure(&a);14 cout << a ;15 return 0;16 }

Voici le déroulé de ce programme.

Ligne a x Commentaires

10 0.0

12 4

13 4 Appel à la Procedure. Ligne 4

4 4 0x28fefc

5 5 0x28fefc

6 10 0x28fefc

6 10

En Python

Manipuler la mémoire et les adresses des variables est beaucoup plus subtile en PythonIl est possible de faire du passage par référence mais en utilisant une autre dimensiondu Python qu’est celle de l’objet.

Le bagage conceptuel permettant d’arriver à ces manipulations n’étant pas l’objectifde ce cours nous considérons que le Python n’est pas favorable à ces manipulations.

Le cas particulier des tableaux

Les tableaux ont un statut particulier dans chacun des deux langages que nous étudions.Observons l’exemple suivant

En C++

1 #include<iostream>2 using namespace std;34 int main(){5 int T[3];6 cout << T << endl << &(T[0]) << endl << &(T[1]);7 return 0;8 }

Exécution C++

0x28fef4 0x28fef4 0x28fef8Process returned 0 (0x0) execution time : X.xxx sPress any key to continue.

En fait T est une adresse et T[0] est la valeur contenu à cette adresse. En d’autre terme on a

48

T=&(T[0])T[0]=&*T

L’adresse de T[1] quand à elle est 4 octets après celle de T[0] puisqu’un int prend 4 octets demémoire.Puisque qu’un tableau est en fait une adresse, le passage de tel variable est donc un passage par

référence. Modifier un tableau passé en paramètre dans une fonction reviens donc à modifier le vraitableau.Il en va de même en Python .

En Python

1 #!/usr/bin/python2 # -*- coding: utf-8 -*-34 def Fonction(t, taille) :5 i=06 while(i<taille) :7 if(t[i]<0) :8 t[i]=-t[i]9 i=i+11011 t=dict()12 t[0]=-113 t[1]=1214 t[2]=-12315 Fonction(t, 3)16 i=017 while(i<3) :18 print(t[i])19 i=i+1

Exécution Python

C:\Users\David\Desktop\IntroProg>Test.py112123C:\Users\David\Desktop\IntroProg>

Résolution du problème

En C++

1 #include<iostream>2 using namespace std;34 #include<stdlib.h>/* Cette bibliothèque va permettre5 la gestion de la fenêtre console.6 */78 int Menu(void){9 int choix=0;10 while(choix <=0 or choix >5){

49

11 system("cls");//Efface l’écran12 cout << "\t\t.:Menu des operations:.\n\n";13 cout << "\t1. Additionner\n";14 cout << "\t2. Soustraire\n";15 cout << "\t3. Multiplier\n";16 cout << "\t4. Diviser\n";17 cout << "\t5. FIN\n\n";18 cout << "\t\tChoix : ";19 cin >> choix;20 }2122 return choix;23 }2425 void Saisie(int *a, int *b){26 cout << "\n\tSaisissez le premier entier : ";27 cin >> *a;28 cout << "\tSaisissez le second entier : ";29 cin >> *b;30 }3132 int Additionner(int a, int b){33 return (a+b);34 }35 int Soustraire(int a, int b){36 return (a-b);37 }38 int Multiplier(int a, int b){39 return (a*b);40 }41 float Diviser(int a, int b){42 return (a+0.0)/b;43 }4445 int main(){46 int x=0,y=0,choix=Menu();47 while(choix!=5){48 Saisie(&x,&y);49 if(choix==1)50 cout << "\n\tLe resultat de l’addition est " << Additionner(x,y) << "\n\t";51 if(choix==2)52 cout << "\n\tLe resultat de la soustraction est " << Soustraire(x,y) << "\n\t";53 if(choix==3)54 cout << "\n\tLe resultat de la multiplication est " << Multiplier(x,y) << "\n\t";55 if(choix==4)56 cout << "\n\tLe resultat de la division est " << Diviser(x,y) << "\n\t";57 system("pause");//Permet de faire une pause dans l’exécution du programme58 choix=Menu();59 }6061 return 0;62 }

50