Support Algo POO
Support Algo POO
fr
Algorithmique et
Programmation Orientée
Objet
Paul-Antoine Bisgambiglia
2018
Cours 2009-2010
bisgambiglia@[Link] GEN -
@pabisgambiglia
bisgambiglia@[Link] 2
Objectifs
bisgambiglia@[Link] 3
Sommaire
bisgambiglia@[Link] 4
Le Codage de l’information
Pour parler à une machine, mieux vaut connaître son vocabulaire…
! bisgambiglia@[Link] 5
Le Codage de l’information
Circuit et Logique (1/4)
bisgambiglia@[Link] 7
Le Codage de l’information
Circuit et Logique (3/4)
bisgambiglia@[Link] 8
Le Codage de l’information
Circuit et Logique (4/4)
bisgambiglia@[Link] 9
Le Codage de l’information
Code binaire (1/3)
Exemple :
11010011
1 1 0 1 0 0 1 1
1 * 27 + 1 * 26 + 0*25 + 1 * 24 + 0*23 + 0*22 + 1 * 21 + 1 * 20 =
1 * 128 + 1 * 64 + 1 * 16 + 1 * 2 + 1 * 1 =
128 + 64 + 16 + 2 + 1 =
=> 211
bisgambiglia@[Link] 11
Le Codage de l’information
Code binaire (3/3)
Exemple :
186.
Dans 186, on trouve 1 x 128, soit 1 * 27. Je retranche 128 de 186 et j’obtiens
58.
186 = 128 + 58 ou 128 = 186 – 58
186 = 1 x 128, soit 1 * 27
58 = 0 * 64, soit 0 * 26
58 = 1 * 32, soit 1 * 25 Je retranche 32 de 58 et j’obtiens 26.
26 = 1 * 16, soit 1 * 24 Je retranche 16 de 26 et j’obtiens 10.
10 = 1 * 8, soit 1 * 23 Je retranche 8 de 10 et j’obtiens 2.
2 = 0 * 4, soit 0 * 22
2 = 1 * 2, soit 0 * 21 Je retranche 2 de 2 et j’obtiens 0.
0 = 0 * 1, soit 0 * 20
Il ne me reste plus qu’à reporter ces différents résultats (dans l’ordre !) pour
reconstituer l’octet. J’écris alors qu’en binaire, 186 est représenté par :
10111010
bisgambiglia@[Link] 12
Le Codage de l’information
Exercices
Convertir en base
binaire
10
2
11111111
10
11101001
355
00110011
1087
11001100
255
00011100
8000
00111100
L’alphabet !
00001000
bisgambiglia@[Link] 13
Sources
[Link]
bisgambiglia@[Link] 14
Sommaire
bisgambiglia@[Link] 15
Sommaire
bisgambiglia@[Link] 16
Algorithmique
La raison d’être d’un algorithme est de résoudre un problème !
NON
« moi, de toute façon, je suis mauvais(e) en algo, j’ai
jamais rien pigé aux maths ».
! bisgambiglia@[Link] 18
Algorithmique
Astuce
bisgambiglia@[Link] 19
Sommaire
bisgambiglia@[Link] 20
Algorithmique
Introduction (1/4)
Définitions :
bisgambiglia@[Link] 21
Algorithmique
Introduction (2/4)
! bisgambiglia@[Link] 23
Algorithmique
Introduction (4/4)
Algorithme
Variable - ne : réel, note d'écrit (coefficient 2)
Variable - no : réel, note d'oral (coefficient 1)
Variable - moy : réel, moyenne du module
Début
ne ← lire()
no ← lire()
moy ← (2 * ne + no)/3
si moy >= 10 alors
écrire ("reçu")
sinon
écrire ("refusé")
Fin si
Fin
! bisgambiglia@[Link] 25
Sommaire
bisgambiglia@[Link] 26
Algorithmique
Les variables (1/8)
Définitions :
! bisgambiglia@[Link] 30
Algorithmique
Type numérique Plage
Byte (octet) 0 à 255
Entier Simple -32768 à 32767
Entier Long -2 147 483 648 à 2 147 483 647
-3,40x1038 à -1,40x10-45 pour les valeurs négatives
Réel simple
1,40x10-45 à 3,40x1038 pour les valeurs positives
1,79x10308 à -4,94x10-324 pour les valeurs négatives
Réel double
4,94x10-324 à 1,79x10308 pour les valeurs positives
Type Texte Exemple
Caractère ‘a’, ‘b’, ‘c’, ‘!’, ‘5’, ‘$’, etc.
Chaîne de Caractères
En pseudo-code, une chaîne de caractères‘aaa’, ‘bonjour’,notée
est toujours ‘tutu’,entre
‘123’,guillemets
etc.
Autres type Exemple
Booléen VRAI ou FAUX
Tableau [1,2,3,4,5]
Liste (1,2,3,4,5)
! bisgambiglia@[Link] 31
Algorithmique
Astuce (1/2)
bisgambiglia@[Link] 32
Algorithmique
Astuce (2/2)
Le type booléen est très souvent négligé par les programmeurs, à tort.
bisgambiglia@[Link] 33
Algorithmique
Les variables (5/8)
Variable g en Numérique
ou encore
Variables PrixHT, TauxTVA, PrixTTC en Numérique
bisgambiglia@[Link] 34
Algorithmique
Les variables (6/8)
bisgambiglia@[Link] 36
Algorithmique
Exercices (1/3)
Variables A, B en Entier
Exercice 1.7 : Une variante du
Début
A←5 précédent : on dispose de trois
B←2 variables A, B et C. Ecrivez un
A←B algorithme transférant à B la valeur
B←A de A, à C la valeur de B et à A la
Fin valeur de C (toujours quels que
soient les contenus préalables de ces
bisgambiglia@[Link] 40
Algorithmique
Variables (7/8)
Expressions et opérateurs
Pour qu’une instruction d’affectation soit valide, on
doit trouver :
Expressions et opérateurs
Un opérateur est un signe qui relie deux valeurs,
pour produire un résultat.
Opérateurs numériques : Ce sont les opérations
arithmétiques tout ce qu’il y a de classique.
+ : addition
- : soustraction
* : multiplication
/ : division
^ : puissance (45 au carré s’écrira donc 45 ^ 2).
Opérateur alphanumérique ou de concaténation (&)
Opérateurs logiques (ou booléens) (et, ou, non, xor)
bisgambiglia@[Link] 42
Algorithmique
Exercices
Variables A, B, C en Variables A, B, C en
Caractères
Caractères
Début
Début
A ← "423"
B ← "12" A ← "423"
C←A+B B ← "12"
Fin C←A&B
Fin
bisgambiglia@[Link] 43
Algorithmique
Remarques
bisgambiglia@[Link] 45
// En C
#include <stdio.h>
Algorithmique #include <stdlib.h>
int main(int argc, char *argv[])
{
Exemple
int ne; // note d'écrit (coefficient 2)
Algorithme int no; // note oral (coefficient 1)
Variable - ne : réel, note d'écrit int moy; // note moyenne
(coefficient 2) printf("Saisir la note écrit \t");
Variable - no : réel, note d'oral scanf("%d",&ne);
(coefficient 1) printf("Saisir la note oral \t");
Variable - moy : réel, moyenne du scanf("%d",&no);
module
moy = (ne*2+no)/3;
Début
if (moy >= 10)
ne ← lire()
{
no ← lire()
printf("reçu \n");
moy ← (2 * ne + no)/3
}
si moy >= 10 alors
else
écrire ("reçu")
{
sinon
printf("refusé \n");
écrire ("refusé")
}
Fin si
system("PAUSE");
Fin
return 0;
}
bisgambiglia@[Link] 46
Algorithmique
Lecture et Ecriture (1/2)
! bisgambiglia@[Link] 47
Algorithmique
Lecture et Ecriture (2/2)
bisgambiglia@[Link] 49
Sommaire
bisgambiglia@[Link] 50
Algorithmique
Exemple
bisgambiglia@[Link] 51
Algorithmique
Structures conditionnelles (1/15)
Définitions :
On appelle structure conditionnelle les
instructions qui permettent de tester si une
condition est vraie ou non ;
On entend par structure conditionnelle, la
possibilité d'orienter un algorithme en fonction de
choix particuliers ;
Une structure conditionnelle permet d'influer sur
le déroulement du programme, suivant certains
conditions.
! bisgambiglia@[Link] 52
Algorithmique
Structures conditionnelles (2/15)
Structure de tests
Si condition alors
Instruction
FinSi
Exemples :
si moy >= 10 alors
écrire ("reçu")
sinon
écrire ("refusé")
Fin si
bisgambiglia@[Link] 54
Algorithmique
Structures conditionnelles (4/15)
bisgambiglia@[Link] 55
Algorithmique
Remarques
bisgambiglia@[Link] 56
Algorithmique
Structures conditionnelles (5/15)
Conditions composées
Association de conditions grâce à des opérateurs logique :
(ET, OU, NON, XOR)
’’’ EXEMPLE
si maSommedArgent >= prixDuCafé OU qu’un copain m’invite alors
je bois le café
Fin si
Conditions composées
A et B deux variables
Opérateur ET
bisgambiglia@[Link] 58
Algorithmique
Structures conditionnelles (7/15)
Conditions composées
A et B deux variables
Opérateur OU
bisgambiglia@[Link] 59
Algorithmique
Structures conditionnelles (8/15)
Conditions composées
A et B deux variables
Opérateur XOR
bisgambiglia@[Link] 60
Algorithmique
Structures conditionnelles (9/15)
Conditions composées
A une variable
Opérateur NON
Faux Vrai
bisgambiglia@[Link] 61
Algorithmique
Exercices
bisgambiglia@[Link] 62
Algorithmique
Structures conditionnelles (10/15)
! bisgambiglia@[Link] 63
Algorithmique
Structures conditionnelles (11/15)
bisgambiglia@[Link] 64
Algorithmique
Structures conditionnelles (12/15)
bisgambiglia@[Link] 65
Algorithmique
Exercices
Exercice 3.4 : Ecrire un algorithme qui demande un nombre à l’utilisateur,
et l’informe ensuite si ce nombre est positif ou négatif (on inclut cette fois
le traitement du cas où le nombre vaut zéro).
bisgambiglia@[Link] 66
Algorithmique
Structures conditionnelles (13/15)
Représentation graphique :
Instruction 1
si
Instruction 3 Fin si
si
Instruction 2
bisgambiglia@[Link] 68
Algorithmique
Structures conditionnelles (15/15)
Variables booléennes :
type de variables susceptibles Variable Temp en Entier
de stocker les valeurs VRAI Variables A, B en Booléen
ou FAUX; Début
Ecrire "Entrez la t°c de l’eau :"
une variable booléenne n’a
Lire Temp
besoin que d’un seul bit pour
A ← Temp =< 0
être stockée;
B ← Temp < 100
dans certains cas, notamment Si A Alors
celui de conditions composées Ecrire "C’est de la glace"
très lourdes (avec plein de ET SinonSi B Alors
et de OU) cette technique peut Ecrire "C’est du liquide"
faciliter le travail du Sinon
programmeur, en améliorant Ecrire "C’est de la vapeur"
nettement la lisibilité de Finsi
l’algorithme. Fin
bisgambiglia@[Link] 69
Algorithmique
Exercice
Algorithme
Exercice : Améliorer cet algorithme pour prendre en compte
Variable - ne : réel,de
les moyennes note d'écrit (coefficient
rattrapage : 2)
Variable - no : réel, note d'oral (coefficient 1)
Variable - moy : réel, moyenne du module
Moyenne >= 10
Début
« reçu »
ne ← lire()
← Moyenne
no lire() entre 8 et 10
moy ← (2« rattrapage »
* ne + no)/3
si moy >= 10 alors
Moyenne <8
écrire ("reçu")»
« refusé
sinon
écrire ("refusé")
Fin si
Fin
bisgambiglia@[Link] 70
Sommaire
bisgambiglia@[Link] 71
Algorithmique
Exemple
// En C++
Algorithme #include <cstdlib>
Variable - ne : réel, note d'écrit #include <iostream>
(coefficient 2) using namespace std;
Variable - no : réel, note d'oral int main(int argc, char *argv[]){
(coefficient 1) int ne, no, moy;
Variable - moy : réel, moyenne du cout << "Saisir la note écrit" << endl;
module
cin >> ne;
Début
cout << "Saisir la note oral" << endl;
ne ← lire()
cin >> no;
no ← lire()
moy = (ne*2+no)/3;
moy ← (2 * ne + no)/3
if (moy >=10) {
si moy >= 10 alors
cout << "reçu" << endl;
écrire ("reçu")
}else{
sinonSi moy >= 8 ET moy<10
if(moy>8 && moy<10){
écrire ("rattrapage")
cout << "rattrapage" << endl;
sinon
}else
écrire ("refusé")
cout << "redoublement" << endl;
Finsi
}
Fin
system("PAUSE");
return EXIT_SUCCESS; }
bisgambiglia@[Link] 72
Algorithmique
Logique (ET et/ou OU) (1/3)
Test :
Variables A, B, C, D, E en Booléen
Variable X en Entier
Que renvoie cet algo. ?
Début Quelles sont les valeurs de A,
Lire X B, C, D et E pour X ← 3, X
A ← X > 12
B←X>2
← 14 ?
C←X<6
D ← (A ET B) OU C
E ← Dans
A ET (B
uneOU C)
condition composée employant à la fois des opérateurs ET et
Ecrire D, E des opérateurs OU,
Fin la présence de parenthèses possède une influence sur le résultat,
tout comme dans le cas d’une expression numérique
comportant des multiplications et des additions.
! bisgambiglia@[Link] 73
Algorithmique
Logique (ET et/ou OU) (2/3)
Test :
Si il fait trop chaud ET il ne pleut pas Alors
Ouvrir la fenêtre
Sinon Toute structure de test requérant une condition composée
Fermer lafaisant
fenêtreintervenir l’opérateur ET peut être exprimée
Finside manière équivalente avec un opérateur OU, et réciproquement.
Règle de transformation de Morgan :
Quelle estSi la différence entre ces deux algo. ?
A ET B Alors I1 Sinon I2 FinSi
Ces deux formulations sont strictement équivalentes
Si NON A OU NON B Alors I2 Sinon I1 FinSi
Si il ne fait pas trop chaud OU il pleut Alors
Fermer la fenêtre
Sinon
Ouvrir la fenêtre
Finsi
! bisgambiglia@[Link] 74
Algorithmique
Exercices (1/5)
Exercice 4.1 : Formulez un algorithme équivalent à l’algorithme suivant :
Exercice 4.2 : Cet algorithme est destiné à prédire l'avenir, et il doit être
infaillible !
Il lira au clavier l’heure et les minutes, et il affichera l’heure qu’il sera une
minute plus tard. Par exemple, si l'utilisateur tape 21 puis 32, l'algorithme
doit répondre :
"Dans une minute, il sera 21 heure(s) 33".
NB : on suppose que l'utilisateur entre une heure valide. Pas besoin donc de la
vérifier.
bisgambiglia@[Link] 75
Algorithmique
Exercices (2/5)
Exercice 4.3 : De même que le précédent, cet algorithme doit demander une heure
et en afficher une autre. Mais cette fois, il doit gérer également les secondes, et
afficher l'heure qu'il sera une seconde plus tard.
Par exemple, si l'utilisateur tape 21, puis 32, puis 8, l'algorithme doit répondre : "Dans
une seconde, il sera 21 heure(s), 32 minute(s) et 9 seconde(s)".
NB : là encore, on suppose que l'utilisateur entre une date valide.
Exercice 4.5 : Les habitants de Zorglub paient l’impôt selon les règles suivantes :
les hommes de plus de 20 ans paient l’impôt
les femmes paient l’impôt si elles ont entre 18 et 35 ans
les autres ne paient pas d’impôt
Le programme demandera donc l’âge et le sexe du Zorglubien, et se prononcera donc
ensuite sur le fait que l’habitant est imposable.
bisgambiglia@[Link] 76
Algorithmique
Logique (ET et/ou OU) (3/3)
bisgambiglia@[Link] 78
Algorithmique
Exercices (3/5)
Correction 4.6 :
Variables A, B, C, D en Numérique
Début
Ecrire "Entrez les scores des quatre prétendants :«
Lire A, B, C, D
C1 ← A > 50
C2 ← B > 50 ou C > 50 ou D > 50
C3 ← A >= B et A >= C et A >= D
C4 ← A >= 12,5
Si C1 Alors
Ecrire “Elu au premier tour«
Sinonsi C2 ou Non(C4) Alors
Ecrire “Battu, éliminé, sorti !!!”
SinonSi C3 Alors
Ecrire "Ballotage favorable«
Sinon
Ecrire "Ballotage défavorable«
FinSi
Fin
bisgambiglia@[Link] 79
Algorithmique
Exercices (4/5)
Exercice 4.7 : Une compagnie d'assurance automobile propose à ses clients quatre
familles de tarifs identifiables par une couleur, du moins au plus onéreux : tarifs
bleu, vert, orange et rouge. Le tarif dépend de la situation du conducteur :
un conducteur de moins de 25 ans et titulaire du permis depuis moins de deux
ans, se voit attribuer le tarif rouge, si toutefois il n'a jamais été responsable
d'accident. Sinon, la compagnie refuse de l'assurer.
un conducteur de moins de 25 ans et titulaire du permis depuis plus de deux
ans, ou de plus de 25 ans mais titulaire du permis depuis moins de deux ans a
le droit au tarif orange s'il n'a jamais provoqué d'accident, au tarif rouge pour
un accident, sinon il est refusé.
un conducteur de plus de 25 ans titulaire du permis depuis plus de deux ans
bénéficie du tarif vert s'il n'est à l'origine d'aucun accident et du tarif orange
pour un accident, du tarif rouge pour deux accidents, et refusé au-delà
De plus, pour encourager la fidélité des clients acceptés, la compagnie propose
un contrat de la couleur immédiatement la plus avantageuse s'il est entré dans
la maison depuis plus d'un an.
Ecrire l'algorithme permettant de saisir les données nécessaires (sans contrôle de
saisie) et de traiter ce problème. Avant de se lancer à corps perdu dans cet exercice,
on pourra réfléchir un peu et s'apercevoir qu'il est plus simple qu'il n'en a l'air (cela
s'appelle faire une analyse !)
bisgambiglia@[Link] 80
Algorithmique
Exercices (5/5)
Exercice 4.8 : Ecrivez un algorithme qui a près avoir demandé un numéro
de jour, de mois et d'année à l'utilisateur, renvoie s'il s'agit ou non d'une
date valide.
Cet exercice est certes d’un manque d’originalité affligeant, mais après
tout, en algorithmique comme ailleurs, il faut connaître ses classiques ! Et
quand on a fait cela une fois dans sa vie, on apprécie pleinement
l’existence d’un type numérique « date » dans certains langages…).
Il n'est sans doute pas inutile de rappeler rapidement que le mois de février
compte 28 jours, sauf si l’année est bissextile, auquel cas il en compte 29.
L’année est bissextile si elle est divisible par quatre. Toutefois, les années
divisibles par 100 ne sont pas bissextiles, mais les années divisibles par
400 le sont. Ouf !
Un dernier petit détail : vous ne savez pas, pour l’instant, exprimer
correctement en pseudo-code l’idée qu’un nombre A est divisible par un
nombre B. Aussi, vous vous contenterez d’écrire en bons télégraphistes
que A divisible par B se dit « A dp B ».
bisgambiglia@[Link] 81
Sommaire
bisgambiglia@[Link] 82
// En C#
using System;
Algorithmique
using [Link];
using [Link];
namespace ConsoleApplication1
{
Exemple
class Program
{
Algorithme static void Main(string[] args)
Variable - ne : réel, note d'écrit {
int ne, no, moy;
(coefficient 2) string userEntry = "";
Variable - no : réel, note d'oral bool IsOk = false;
(coefficient 1) do
Variable - moy : réel, moyenne du {
module [Link]("Saisir la note écrit.");
userEntry = [Link]();
Début IsOk = [Link](userEntry, out ne);
ne ← lire() [Link]("Saisir la note oral.");
no ← lire() userEntry = [Link]();
IsOk = [Link](userEntry, out no);
moy ← (2 * ne + no)/3 } while (!IsOk);
si moy >= 10 alors moy = (ne * 2 + no) / 3;
écrire ("reçu") if (moy >= 10){
[Link]("reçu");
sinonSi moy >= 8 ET moy<10 }else{
écrire ("rattrapage") if (moy > 8 & moy < 10){
sinon [Link]("rattrapage");
}else
écrire ("refusé") [Link]("redoublement");
Finsi }
Fin }
}
}
bisgambiglia@[Link] 83
Algorithmique
Les Boucles (1/8)
Algorithme
Exercice : Améliorer cet algorithme pour prendre en compte
Variable - ne : réel, note d'écrit (coefficient 2)
une -erreur
Variable no : réel,de
notel’utilisateur (contrôle
d'oral (coefficient 1) de saisie ), il ne doit
pouvoir
Variable - moysaisir
: réel, que desdu
moyenne notes
module comprises entre 0 et 20.
Début
Si il commet une erreur, à l’aide :
ne ← lire()
d’un test, redemandez lui de saisir la note erronée.
no ← lire()
moy←d’une
(2 * neboucle,
+ no)/3redemandez lui de saisir la note erronée.
si moy >= 10 alors
écrire ("reçu")
sinon si moy > 8 et moy < 10
écrire ("rattrapage")
sinon
écrire ("refusé")
Fin si
Fin
! bisgambiglia@[Link] 84
Algorithmique
Les Boucles (2/8)
! bisgambiglia@[Link] 85
Algorithmique
Les Boucles (3/8)
Application :
Variable ne en numérique Que retourne / fait cet algo ?
Debut
Ecrire “Entrer une note“ Variable ne en numérique
TantQue ne < 0 OU ne >20 Debut
Lire ne Ecrire “Entrer une note“
FinTantQue Lire ne
Fin TantQue ne < 0 OU ne >20
Que retourne / fait cet algo ? Lire ne
Variable ne en numérique FinTantQue
Debut Fin
ne ← 22
Ecrire “Entrer une note“
TantQue ne < 0 OU ne >20 Que retourne / fait cet algo ?
Lire ne
FinTantQue
Fin
! bisgambiglia@[Link] 86
Algorithmique
Les Boucles (4/8)
Dangers :
Ecrire une boucle TantQue dans laquelle la
condition n’est jamais VRAI
On ne rentre jamais dans la boucle
Ecrire une boucle TantQue dans laquelle le test
n’est jamais FAUX
On ne sort jamais de la boucle
Attention lorsqu’on manipule (modifie) une
variable du test dans les instructions de la boucle
bisgambiglia@[Link] 87
Algorithmique
Exercices
bisgambiglia@[Link] 88
Algorithmique
Les Boucles (5/8)
La boucle Pour :
la structure « Pour … Suivant » n’est pas du tout
indispensable ; on pourrait utiliser uniquement un « Tant
Que ». Le seul intérêt du « Pour » est d’épargner un peu de
fatigue au programmeur, en lui évitant de gérer lui-même la
progression de la variable qui lui sert de compteur, on parle
d’incrémentation.
Variable i en Entier Variable i en Entier
Début Début
i←0 Pour i ← 0 à 15 Pas 1
TantQue i < 15 Ecrire "Passage numéro : ", i
i←i+1 i Suivant
Ecrire "Passage numéro : ", i Fin
Incrémentation fixée à 1 par défaut et
FinTantQue
modifiable par l’utilisateur (2, -1, etc.)
Fin
! bisgambiglia@[Link] 89
Algorithmique
Les Boucles (6/8)
bisgambiglia@[Link] 91
Algorithmique
Les Boucles (8/8)
bisgambiglia@[Link] 93
Algorithmique
Exercices (2/4)
Exercice 5.6 : Ecrire un algorithme qui demande un nombre de départ, et
qui calcule sa factorielle.
NB : la factorielle de 8, notée 8 !, vaut : 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8
bisgambiglia@[Link] 94
Algorithmique
Exercices (3/4)
bisgambiglia@[Link] 95
Algorithmique
Exercices (4/4)
Exercice 5.10 : Écrire un algorithme qui permette de connaître ses chances
de gagner au tiercé, quarté, quinté et autres impôts volontaires.
On demande à l’utilisateur le nombre de chevaux partants, et le nombre de
chevaux joués. Les deux messages affichés devront être :
Dans l’ordre : une chance sur X de gagner
Dans le désordre : une chance sur Y de gagner
X et Y nous sont donnés par la formule suivante, si n est le nombre de
chevaux partants et p le nombre de chevaux joués (on rappelle que le signe
! signifie "factorielle", comme dans l'exercice 5.6 ci-dessus) :
X = n ! / (n - p) !
Y = n ! / (p ! * (n – p) !)
NB : cet algorithme peut être écrit d’une manière simple, mais relativement
peu performante. Ses performances peuvent être singulièrement
augmentées par une petite astuce. Vous commencerez par écrire la manière
la plus simple, puis vous identifierez le problème, et écrirez une deuxième
version permettant de le résoudre.
bisgambiglia@[Link] 96
Sommaire
bisgambiglia@[Link] 97
Algorithmique
Tableau (1/7) ‘Exemple’
Algorithme
Variable - ne : réel, note d'écrit
Exercice : Améliorer cet
Variable - moy : réel, moyenne du module algorithme pour lire 10
Début
Ecrire “Saisir une note“
notes et en faire la moyenne.
ne ← lire() 3 solutions !
TantQue (ne < 0 OU ne >20)
Ecrire “Erreur : Saisir à nouveau la note“
Déclarer 10 variables n1, n2,
ne ← lire() etc.
FinTantQue Lire dans une boucle Pour
…
moy ← (2 * ne + no)/3
Utiliser un tableau
si moy >= 10 alors
écrire ("reçu")
sinon si moy > 8 et moy < 10
écrire ("rattrapage")
sinon
écrire ("refusé")
Fin si
Fin
! bisgambiglia@[Link] 98
Algorithmique
Tableau (2/7)
Définition :
Ensemble de valeurs portant le même nom de variable et
repérées par un nombre, ou une variable indicée. Nombre
ou indice qui sert à repérer chaque valeur. Chaque fois que
l’on doit désigner un élément du tableau, on fait figurer le
nom du tableau, suivi de l’indice de l’élément, entre
parenthèses.
Notation / Déclaration :
Tableau NonDuTableau(Taille) Type
Tableau tab(10) en Entier
Intérêts :
Regrouper un ensemble de valeurs
Simplifier leurs traitements (utilisation des boucles)
bisgambiglia@[Link] 99
Algorithmique
Tableau (3/7)
Représentation :
Indice 0 1 2 3 4 5 6 7 8 9
Notes 12 10 8 18 5 11 15 7 14 16
bisgambiglia@[Link] 100
Algorithmique
Tableau (4/7)
Exemple :
Tableau Note(12) en Numérique → Déclaration du tableau
Variables Moy, Som en Numérique
Variables i en Entier
→ Déclaration de l’indice
Début
Pour i ← 0 à 11
Ecrire "Entrez la note n°", i → Boucle pour remplir le tableau
Lire Note(i)
i Suivant
Som ← 0 → Initialisation de la variable
Pour i ← 0 à 11 Som
Som ← Som + Note(i) → Boucle qui parcourt le tableau
i Suivant et calcule la somme Som
Moy ← Som / 12
Ecrire “ La moyenne est : “, Moy
Fin
→ Calcul de la moyenne
→ Affichage de la moyenne
bisgambiglia@[Link] 101
Algorithmique
Tableau (5/7)
Exécution :
Tableau Note(10) en Numérique i 0 1 2 3 4 5 6 7 8 9
Variables Moy, Som en Numérique
Variables i en Entier Note
Début
Pour i ← 0 à 9
i 0 1 2 3 4 5 6 7 8 9
Ecrire "Entrez la note n°", i
Lire Note(i) Note 12 10 8 18 5 11 15 7 14 16
i Suivant
Som ← 0
Pour i ← 0 à 9 Pour i = 0, Som = 0 + 12
Som ← Som + Note(i) Pour i = 1, Som = 12 + 10
i Suivant Pour i = 2, Som = 22 + 8
Moy ← Som / 10 Pour i = 3, Som = 30 + 18
Ecrire “ La moyenne est : “, Moy …
Fin Pour i = 9, Som = 100+16
! bisgambiglia@[Link] 102
Algorithmique
Tableau (6/7)
bisgambiglia@[Link] 104
Exercice
6.5.1
Tableau de N notes
L’utilisateur rentre ses notes
bisgambiglia@[Link] 105
Algorithmique
Exercices (2/2)
Exercice 6.6 : Que produit Exercice 6.7 : Que produit
l’algorithme suivant ? l’algorithme suivant ?
Peut-on simplifier cet algorithme
avec le même résultat ?
Tableau Suite(7+1) en Entier
Tableau N(6+1) en Entier Variable i en Entier
Variables i, k en Entier Début
Début Suite(0) ← 1
N(0) ← 1 Suite(1) ← 1
Pour k ← 1 à 6 Pour i ← 2 à 7
N(k) ← N(k-1) + 2 Suite(i) ← Suite(i-1) + Suite(i-2)
k Suivant i suivant
Pour i ← 0 à 6 Pour i ← 0 à 7
Ecrire N(i) Ecrire Suite(i)
i suivant i suivant
Fin Fin
bisgambiglia@[Link] 106
Algorithmique
Tableau (7/7) ‘info en +’
Indice de lignes i 0 6 8 4
Indice de colonnes j 1 3 5 7
tab(i)(j) => tab(1)(1) renvoie 5 2 9 6 3
Les tableaux sont fréquemment utilisés avec les
algorithmes de tri
bisgambiglia@[Link] 107
Algorithmique
Exercices (1/2)
Exercice 6.8 : Ecrivez un algorithme permettant à l’utilisateur de saisir un
nombre quelconque de valeurs, qui devront être stockées dans un tableau.
L’utilisateur doit donc commencer par entrer le nombre de valeurs qu’il
compte saisir. Il effectuera ensuite cette saisie. Enfin, une fois la saisie
terminée, le programme affichera le nombre de valeurs négatives et le
nombre de valeurs positives.
Tableau 2 : 7 6 5 2 1 3 7 4
Tableau à constituer : 11 14 12 11 2 8 11 10
bisgambiglia@[Link] 108
Algorithmique
Exercices (2/2)
Exercice 6.11 : Toujours à partir de deux tableaux précédemment saisis,
écrivez un algorithme qui effectue le calcule suivant : il multiplier chaque
élément du tableau 1 par chaque élément du tableau 2, et additionner le
tout. Par exemple si l'on a :
Tableau 1 : | 4 | 8 | 7 | 1 | 2 |
Tableau 2 : | 3 | 6 |
Résultat : 3 * 4 + 3 * 8 + 3 * 7 + 3 * 12 + 6 * 4 + 6 * 8 + 6 * 7 + 6 * 12 = 279
3. Tri à bulles
Permutation d’éléments qui ce suivent
bisgambiglia@[Link] 110
Algorithmique
Tableau et Tri (2/4)
Exercice 7.3 : Ecrivez un algorithme qui inverse l’ordre des éléments d’un
tableau dont on suppose qu'il a été préalablement saisi (« les premiers
seront les derniers… »)
bisgambiglia@[Link] 115
Algorithmique
Exemple
Définitions :
Une fonction est une portion de code représentant un sous
programme, qui effectue une tâche ou un calcul
relativement indépendant du reste du programme.
Une procédure, aussi appelée routine ou sous-routine, est
une fonction qui ne renvoie pas de résultat.
Rôle :
Simplifier le programme en transformant une partie de
code redondant en fonction qui peut alors être appelée
plusieurs fois.
bisgambiglia@[Link] 117
Algorithmique
Procédures et Fonctions (2/15)
Prototype et déclaration :
Fonction NonDeLaFct(paramètres Type du paramètre)
Type du résultat retourné
Procédure NonDeLaPdr(paramètres Type du paramètre)
Exemple et Utilisation :
Fonction carre(x en Entier) en Entier
Fonction carre(x en Entier) en Variable a, b en Entier
Entier a← 4
Début b ← carre(a)
Variable résultat en Entier Ecrire “le carré de“+a+“est“+b
résultat ← x*x // renvoie => le carré de 4 est 16
Renvoyer résultat
FinFonction
bisgambiglia@[Link] 118
Algorithmique
Procédures et Fonctions (3/15)
bisgambiglia@[Link] 119
Algorithmique
Procédures et Fonctions (4/15)
Fonctions prédéfinies :
Fonctions classiques :
Lire()
Ecrire(“Texte")
Fonctions de texte :
Len(“texte") => renvoie la taille du texte passé en paramètre (ici
5)
Trouve(“texte“,“mot") => renvoie l’indice de la première lettre
du nom dans le texte
Fonctions numériques :
Ent(3.14) => renvoie le paramètre arrondit (ici 3)
Mod(10,3) => renvoie le reste de la division euclidienne (ici 1)
Alea(0,10) => renvoie un nombre aléatoire (ici entre 0 et 10)
Fonctions mathématiques :
Sin(PI), Cos(PI), Tan(PI)
bisgambiglia@[Link] 120
Algorithmique
Procédures et Fonctions (5/15)
Ent(13,228)
Mod(12,2)
Mod(44,8)
bisgambiglia@[Link] 121
Algorithmique
Exercices
Exercice 9.2 : Ecrivez un algorithme qui demande un mot à l’utilisateur et
qui affiche à l’écran le nombre de lettres de ce mot.
bisgambiglia@[Link] 122
Algorithmique
Procédures et Fonctions (6/15)
Fonctions personnalisées :
But : la modularité et la lisibilité du code
Séparation entre le corps du programme (procédure
principale - main) et des bouts de code (module) qu’on
peut rappeler a volonté (fonctions ou sous-procédures)
Principe : isoler les instructions à répéter et créer
un fonction dans le rôle sera de traiter un cas précis
et renvoyer le résultat correspondant.
On remarque l’apparition d’un nouveau mot-clé :
Renvoyer, qui indique quelle valeur ‘résultat’ sera
renvoyer lorsque la fonction est utilisée par le
!
programme.
bisgambiglia@[Link] 123
Algorithmique
Procédures et Fonctions (7/15)
! bisgambiglia@[Link] 125
Algorithmique
Exercices
Procédures :
C’est une fonction qui ne renvoie pas de résultat à l’aide
du mot clé ‘renvoyer’.
Attention : par contre elle peut afficher un résultat à l’écran
à l’aide du mot clé ‘écrire’. Cette instruction, n’est pas
considéré comme un renvoi de valeurs.
Fonction Procédure
Fonction a() en Entier Procedure a()
… …
Renvoyer res Ecrire “le résultat est“+res
… …
FinFonction FinProcedure
Utilisation Utilisation
x en Entier a()
x ← a()
! bisgambiglia@[Link] 127
Algorithmique
Procédures et Fonctions (10/15)
Procédures :
Rôle : permettent de renvoyer des informations multiples,
la ou une fonction ne renvoie qu’une valeur unique.
Exemple : L’affichage des éléments d’un tableau
Procédure
Procedure affiche(tab(3)(3) en Entier)
Debut
Tab(0)(0) Tab(0)(1) Tab(0)(2)
Pour i de 0 à 2 Faire //Colonne
Pour j de 0 à 2 Faire //Ligne Tab(1)(0) Tab(1)(1) Tab(1)(2)
Ecrire “|“+tab(i)(j)+“|“ Tab(2)(0) Tab(2)(1) Tab(2)(2)
FinPour
Ecrire “\n“ //Saut de Ligne
FinPour
FinProcedure
bisgambiglia@[Link] 128
Algorithmique
Procédures et Fonctions (11/15)
Bilan I :
Une fonction se caractérisait par les mots-clés Fonction ... Fin
Fonction, une procédure est identifiée par les mots-clés
Procédure ... Fin Procédure.
Lorsqu'une fonction était appelée, sa valeur (retournée) était toujours
affectée à une variable (ou intégrée dans le calcul d'une expression).
L'appel à une procédure, lui, est au contraire toujours une instruction
autonome.
Toute fonction doit, pour cette raison, comporter l'instruction
"Renvoyer". Pour la même raison, l'instruction "Renvoyer" n'est
jamais utilisée dans une procédure. La fonction est une valeur
calculée, qui renvoie son résultat vers le programme principale. La
procédure, elle, est un traitement ; elle ne "vaut" rien.
Toute procédure possédant un et un seul paramètre en sortie
peut également être écrite sous forme d'une fonction.
bisgambiglia@[Link] 129
Algorithmique
Exercice
Algorithme Fonction moyenne() en Entier
Variable - moy : réel, moyenne du Debut
module som ← 0
Début Pour i de 0 à 9
moy ← moyenne() Ecrire(“Entrer une note")
si moy >= 10 alors ne(i) ← lire()
écrire ("reçu") TantQue ne(i)<0 OU ne(i)>20
sinonSi moy > 8 et moy < 10 Ecrire(“La note n’est pas correcte,
écrire ("rattrapage") Entrer une note")
sinon ne (i) ← lire()
écrire ("refusé") FinTantQue
FinSi som ← som + ne(i)
Fin i Suivant
FinPour
moy ← som / 10
renvoyer(moy)
Modifier ces programmes, pour que la Fin
fonction moyenne prennent en paramètre
un tableau de note. Puis transformer la
fonction moyenne en procédure, et
adapter le programme principal.
bisgambiglia@[Link] 130
Algorithmique
Procédures et Fonctions (12/15)
bisgambiglia@[Link] 131
Algorithmique
Procédures et Fonctions (13/15)
// Procédure // Fonction
Procedure test(a en Entier) Fonction test(a en Entier) res en Entier
Debut Debut
a ← a+10 a ← a+10
Ecrire(“Le résultat est : “,a) Renvoyer a
FinProc FinFct
// Prog. Principal // Prog. Principal
Variable a et b en Entier Variable a et b en Entier
Debut Debut
a←5 a←5
b←a b←a
test(a) a ← test(a)
Ecrire (“a vaut : “,a) Ecrire (“a vaut : “,a)
Ecrire (“b vaut : “,b ) Ecrire (“b vaut : “ ,b)
Fin Fin
bisgambiglia@[Link] 132
Algorithmique
Procédures et Fonctions (14/15)
Bilan II
Une application bien programmée est une application à
l'architecture claire, dont les différents modules font ce qu'ils
disent, disent ce qu'il font, et peuvent être testés (ou modifiés)
un par un sans perturber le reste de la construction.
Il convient donc :
de limiter l'utilisation des variables globales.
de regrouper sous forme de modules distincts tous les morceaux de
code qui possèdent une certaine unité fonctionnelle (programmation
par "blocs"). C'est-à-dire de faire la chasse aux lignes de codes
redondantes, ou quasi-redondantes.
de faire de ces modules des fonctions lorsqu'ils renvoient un résultat
unique, et des procédures dans tous les autres cas.
bisgambiglia@[Link] 134
Sommaire
bisgambiglia@[Link] 135
Algorithmique
Récursivité (1/5)
Définitions :
La récursivité est une démarche qui consiste à faire
référence à ce qui fait l'objet de la démarche, ainsi c'est le
fait de décrire un processus dépendant de données en
faisant appel à ce même processus sur d'autres données;
Propriété d'un programme de faire appel à lui même en
cours d'exécution.
Un programme qui pour fournir son résultat, va s’appeler
lui-même un certain nombre de fois.
La programmation récursive est une technique
algorithmique applicable dans n'importe quel langage de
programmation (si l'on peut faire des fonctions). Elle
permet d'effectuer des traitements, souvent programmables
aussi avec des boucles mais de façon beaucoup plus légère
à l'exécution.
bisgambiglia@[Link] 136
Algorithmique
Récursivité (2/5)
Principe :
La programmation récursive est une méthode
permettant de répéter un nombre indéterminé de
fois une action (comme une boucle). On crée une
fonction qui va effectuer une action.
Dans cette fonction nous plaçons une condition. Si
cette condition est vraie on appelle la fonction à
nouveau en son sein même, si c'est faux on sort
avec un Renvoyer. On va ainsi répéter la fonction
tant que la condition est vraie.
bisgambiglia@[Link] 137
Algorithmique
Récursivité (3/5)
Exemple d’application :
Fonction factorielle : A chaque appel , la fonction Fact est
appelée avec un argument différent Fact(4) : 4, 3, 2 et 1.
Tout se passe comme si on a plusieurs copies du code de la
fct. Ainsi pour chaque exécution, les variables locales
ainsi que les paramètres en entrée sont réalloués. A un
moment donné, seules les dernières allocations sont
référencées. Quand un retour est fait, les plus récentes
allocations sont libérées et une copie de la fct. est
réactivée. C'est donc le mécanisme de pile. A chaque appel,
une zone pour les variables locales et les paramètres est
allouée. A chaque retour, il y a un dépilement.
bisgambiglia@[Link] 138
Algorithmique
Récursivité (4/5)
bisgambiglia@[Link] 139
Algorithmique
Récursivité (5/5)
bisgambiglia@[Link] 141
Algorithmique
Exercices (2/4)
Supposons que nous avons une solution pour n-1 disques. Nous pourrons
alors définir une solution pour n disques au moyen de la solution de n-1
disques.
n=1 constitue le cas trivial : transférer le disque unique de A vers C.
Pour transférer n disques de A vers C, en utilisant B comme auxiliaire, on
procède comme suit:
1. Si n=1, alors transférer l'unique disque de A vers C.
2. Transférer les n-1 disques au sommet de A vers B avec C comme
auxiliaire.
3. Transférer le disque restant de A vers C.
4. Transférer les n-1 disques de B vers C avec A comme auxiliaire.
Nous remarquons que c'est simple car nous venons de développer une
solution pour le cas trivial (n=1) et une solution pour le cas n en terme de
solution pour le cas plus simple n-1.
bisgambiglia@[Link] 143
Algorithmique
Exercices (4/4)
[Link]
[Link]
[Link]
[Link]
html
bisgambiglia@[Link] 145
Sommaire
bisgambiglia@[Link] 146
Sommaire
1. Rappels : Le Codage de l’information (2h)
2. Algorithmique (13h)
3. Introduction à la programmation (6h)
1. Compilation
2. Introduction
3. Le langage C
1. 1er programme
2. Affichage
3. Lecture
4. Commentaires
5. Types et variables
6. Instructions conditionnelles
7. Boucles
8. Caractères
9. Fonctions et procédures
10. Structures de données et pointeurs
4. Programmation Orientée Objet (6h)
bisgambiglia@[Link] 147
Programmation
Interprétation et compilation (1/2)
Du problème au code :
Etape 1 : traduction
Etape 2 :
Etape 3 :
C’est à cela que sert un langage : à Pour le programmeur :
vous épargner la programmation en Phase de test et de correction
binaire et vous permettre de vous Pour l’ordinateur :
Transformation du programme
faire comprendre de l’ordinateur en langage binaire
d’une manière (relativement) lisible.
bisgambiglia@[Link] 148
Programmation
Interprétation et compilation (2/2)
bisgambiglia@[Link] 150
Programmation
Compiler en programme en C (2/2)
bisgambiglia@[Link] 151
Sommaire
1. Rappels : Le Codage de l’information (2h)
2. Algorithmique (13h)
3. Introduction à la programmation (6h)
1. Compilation
2. Introduction
3. Le langage C
1. 1er programme
2. Affichage
3. Lecture
4. Commentaires
5. Types et variables
6. Instructions conditionnelles
7. Boucles
8. Caractères
9. Fonctions et procédures
10. Structures de données et pointeurs
4. Programmation Orientée Objet (6h)
bisgambiglia@[Link] 152
Programmation
Introduction langage (1/2)
bisgambiglia@[Link] 154
Sommaire
1. Rappels : Le Codage de l’information (2h)
2. Algorithmique (13h)
3. Introduction à la programmation (6h)
1. Compilation
2. Introduction
3. Le langage C
1. 1er programme
2. Affichage
3. Lecture
4. Commentaires
5. Types et variables
6. Instructions conditionnelles
7. Boucles
8. Caractères
9. Fonctions et procédures
10. Structures de données et pointeurs
4. Programmation Orientée Objet (6h)
bisgambiglia@[Link] 155
Programmation
Le langage C
bisgambiglia@[Link] 157
Programmation
Le langage C
Affichage
bisgambiglia@[Link] 158
Programmation
Le langage C
Lecture au clavier :
/********** En C *********
L’instruction scanf() * Programme de Nom, Date *
* Objet du programme : ____ *
scanf("%d", ********************************/
&un_nombre), //Ajout de librairie
Attention de ne pas #include <stdio.h>
// Programme principal
oublier le signe & void main ()
devant le nom des {
variables numériques int un_nombre;
printf("Donnez un nombre: \t");
passées en argument. scanf("%d", &un_nombre);
}
bisgambiglia@[Link] 159
Programmation
Le langage C
Lecture au clavier :
bisgambiglia@[Link] 160
Programmation
Le langage C
Les commentaires :
Sur une ligne // text
Sur plusieurs lignes /* test */
/* Commentaire
qui s’étend sur
plusieurs lignes */
bisgambiglia@[Link] 161
Programmation
Le langage C
Type de données :
Type de donnée Signification Taille (en octets) Plage de valeurs acceptée
char Caractère 1 -128 à 127
unsigned char Caractère non signé 1 0 à 255
short int Entier court 2 -32 768 à 32 767
unsigned short int Entier court non signé 2 0 à 65 535
2 (proc.16 bits) -32 768 à 32 767
int Entier
4 (proc. 32 bits) -2 147 483 648 à 2 147 483 647
2 (proc. 16 bits) 0 à 65 535
unsigned int Entier non signé
4 (proc. 32 bits) 0 à 4 294 967 295
long int Entier long 4 -2 147 483 648 à 2 147 483 647
unsigned long int Entier long non signé 4 0 à 4 294 967 295
float Flottant (réel) 4 3.4*10-38 à 3.4*1038
double Flottant double 8 1.7*10-308 à 1.7*10308
long double Flottant double long 10 3.4*10-4932 à 3.4*104932
bisgambiglia@[Link] 162
Programmation
Le langage C
Autre fonctions de la
librairie math.h
bisgambiglia@[Link] 164
Programmation
Le langage C
En Algo En C
Variable un_nombre en Entier #include <stdio.h>
un_nombre ← 5 void main()
{
int un_nombre;
un_nombre = 5;
}
Toute variable utilisée dans un programme doit avoir été déclarée auparavant.
! bisgambiglia@[Link] 165
Programmation
Le langage C
Constantes en
/********** En C *********
C: * Programme de Nom, Date *
Les constantes ont * Objet du programme : ____ *
une ‘porté’ plus ********************************/
//Ajout de librairie
importante que les
#include <stdio.h>
variables locales, // Déclaration de constante
elles sont connues #define PI 3.1415
dans tout le // Programme principal
programme. De plus void main()
comme leur nom {
l’indique elles ne double rayon, diametre;
peuvent pas varier rayon = 15.0;
diametre = 2*PI*rayon;
}
bisgambiglia@[Link] 166
Programmation
Le langage C
Le type enum :
/********** En C *********
Une * Programme de Nom, Date *
* Objet du programme : ____ *
énumération est ********************************/
une suite de //Ajout de librairie
#include <stdio.h>
valeurs entières // Déclaration d’un constante enum
constantes enum mois { jan=1, fev, mar, avr,
mai, jun, jul, aou,sep, oct, nov,dec};
auxquelles on /* Dans cet exemple fev vaut 2, mar
vaut 3 et ainsi de suite. */
donne des
noms
symboliques.
bisgambiglia@[Link] 167
Programmation
Le langage C
bisgambiglia@[Link] 168
Programmation
Le langage C
Instructions
conditionnelles
Si Sinon
if else
Opérateurs
logiques
bisgambiglia@[Link] 169
Programmation
Le langage C
bisgambiglia@[Link] 170
Programmation
Le langage C
bisgambiglia@[Link] 173
Programmation
Le langage C
bisgambiglia@[Link] 174
Programmation
Le langage C
Les boucles :
TantQue
while
Faire TantQue
do while
Pour
for
for (i=D; i<=F; i++)
{ inst. }
Rappels II
! bisgambiglia@[Link] 175
Programmation
Le langage C
#include <stdio.h>
Les boucles : #include <stdlib.h>
TantQue int main(int argc, char *argv[])
{ int a = 0, b=0;
while b = a++;
printf("a=%d b=%d\n",a,b);
b = ++a;
printf("a=%d b=%d\n",a,b);
Faire TantQue a -= 2; b += 4;
do while printf("a=%d b=%d\n",a,b);
a += 1; b *= 2;
printf("a=%d b=%d\n",a,b);
a--; b /= 2;
Pour printf("a=%d b=%d\n",a,b);
system("PAUSE");
for return 0; }
for (i=D; i<=F; i++)
{ inst. }
Rappels III
bisgambiglia@[Link] 176
Programmation
Le langage C
int main(int argc, char *argv[]) {
Indentation char phrase[64];
Lecture de int i, len, diff;
printf("Entrez une phrase (+ de 12 caracteres): ");
phrase fgets(phrase,64,stdin);
len = strlen(phrase);
diff = 'a' - 'A';
Transforme if (len >= 12){
les for (i = 0; i <= len; i++) {
minuscules en if ('a' <= phrase[i] && phrase[i] <= 'z')
majuscules et phrase[i] = phrase[i] - diff;
else if ('A' <= phrase[i] && phrase[i] <= 'Z')
inversement phrase[i] = phrase[i] + diff;
}
}
Tableau printf("%s\n", phrase);
system("PAUSE");
int tab[TAILLE] return 0; }
! char tab[TAILLE]
bisgambiglia@[Link] 177
Programmation
Le langage C
bisgambiglia@[Link] 179
Programmation
Le langage C
Manipulation
des caractères : Attention: en dehors de l'initialisation,
il n'est pas permis d'écrire prenom=”Olivier”
Code ASCII de Pour remplir un tableau il faut utiliser une boucle
b = 98
Lecture
scanf(“%31s”,m)
fgets(p,64,stdin) /********** En C *********
* Programme de Nom, Date *
Initialisation * Objet du programme : ____ *
********************************/
char votre_nom[32]=“Paul";
bisgambiglia@[Link] 181
Programmation
Le langage C
Manipulation
des caractères :
/********** En C *********
Code ASCII de * Programme de Nom, Date *
b = 98 * Objet du programme : ____ *
********************************/
Lecture #include <stdio.h>
/!\ chaine2 = chaine 1
scanf(“%31s”,m) #include <string.h>
=> ERREUR
fgets(p,64,stdin) void main ()
{
Initialisation char chaine1[32], chaine2[32];
printf(“Tapez un mot: “);
scanf(“%31s”,chaine1);
Copier strcpy(chaine2, chaine1);
printf(“Vous avez tape: %s\n”,chaine2
}
bisgambiglia@[Link] 182
Programmation
Le langage C
Copie de char *strcpy (char *dest, copie de la chaîne src dans la chaîne dest, y
chaîne const char *src) ; compris le caractère nul de fin de chaîne.
Longueur size_t strlen(const char strlen permet de calculer la longueur de str. size_t
d'une chaîne *str) ; et de type entier.
Comparaison int strcmp(const char *s1, strcmp effectue une comparaison des deux
de chaînes const char *s2) ; chaînes s1 et s2, et retourne une valeur négative
si s1 < s2, 0 si s1 = s2, et une valeur positive si
s1 > s2.
bisgambiglia@[Link] 184
Programmation
Traitement des chaînes de caractères
int strlen(chaîne) donne la longueur de la chaîne (\0 non compris)
int strcmp(char *str1,char*str2) rend 0 si str1= =str2, <0 si str1<str2, >0 si str1>str2
(classé alphabétiquement, donc test du premier caractère, si différents test du second,
etc...) Les majuscules sont différentes des minuscules (inférieures). Idem pour
strncmp, qui lui vérifie la dimension.
bisgambiglia@[Link] 185
Programmation
Manipulation des chaînes de caractères
int isdigit(int c) rend un entier non nul si c'est un chiffre ('0' à '9'), 0 sinon. de
même : isalpha (A à Z et a à z, mais pas les accents), isalnum (isalpha||isdigit),
isascii (0 à 127), iscntrl (0 à 31), islower (minuscule), isupper, isspace (blanc,
tab, return...), isxdigit (0 à 9,A à F,a à f)...
bisgambiglia@[Link] 186
Programmation
Manipulation des chaînes de caractères
#include <stdio.h>
Les fonctions : #include <math.h>
En algo int FahrToCelsius(int fahr);
int tempc;
Fonction nom(para type) type
Déclaration de la fonction
Renvoyer resultat void main(){
En C int tempf = 35;
tempc = FahrToCelsius(tempf);
type function nom(type para)
printf("%d F -> %d
return resultat C\n",tempf,tempc);
printf("%d F->%d C\n",12,
Appels de la fonction
FahrToCelsius(12));
}
int FahrToCelsius(int fahr)
{ return 5*(fahr-32)/9;}
Définition de la fonction
! bisgambiglia@[Link] 189
Programmation
Le langage C
#include <stdio.h>
Les procédures : #include <stdlib.h>
En algo void affiche(int a);
Procedure nom(para type) int main(int argc, char *argv[])
{int x;
En C
Déclaration
printf("Entrer une valeur de la
positive");
void function nom(type para)scanf("%d",&x); proc.
affiche(x);
system("PAUSE");
return 0; Appels de la proc.
}
void affiche(int a){
int i;
for(i=0;i<=a;i++) printf("%d\n",i);}
Définition de la proc.
bisgambiglia@[Link] 190
Programmation
Le langage C
Récursivité :
Tout objet est dit récursif s'il se définit à partir de lui-même. Ainsi,
une fonction est dite récursive si elle comporte, dans son corps, au
moins un appel à elle-même.
factoriel :
(i) 0! = 1
(ii) Pour N entier naturel (N > 0), N! = N×(N - 1)!
Algo factoriel :
fact(N)
si N = 0
retourner 1
retourner (N x fact(N-1))
bisgambiglia@[Link] 191
Programmation
Le langage C
bisgambiglia@[Link] 193
Programmation
Le langage C
Exercices I
bisgambiglia@[Link] 194
Programmation
Calcul du PGCD
A=136, B=48
Algo: div euclide Le pgcd est le dernier reste non nul de la
A = B * quo + rst division euclidien de A par B
136 = 48 * 2 + 40
48 = 40 * 1 + 8
Algo: soustraction
40 = 8 * 5 + 0
136 – 48 = 88
88 – 48 = 40
Le pgcd est le dernier résultat des 48 – 40 = 8
soustractions successives de A par B 40 – 8 = 32
32 – 8 = 24
24 – 8 = 16
Algo : 16 – 8 = 8
1. Vérifier que A >= B, sinon permuter 8–8=0
2. Si A=B le pgcd est A, fin
3. Sinon faire soustraction A-B
4. Revenir à l’étape 1.
bisgambiglia@[Link] 195
Programmation
Calcul du PGCD
Algo :
1. Vérifier que A >= B, sinon permuter
2. Si A=B le pgcd est A, fin
3. Sinon faire soustraction A-B
4. Revenir à l’étape 1.
Programme :
Etape 1: Etape 2:
if (A<B) if (A==B)
{ {
C=A, A=B, B=C; printf(‘’pgdc(%d,%d)=%d’’,A,B,A);
} exit(0);
}
Etape 3:
A=A-B;
bisgambiglia@[Link] 196
Programmation
Calcul du PGCD
bisgambiglia@[Link] 200
Programmation
Le langage C / Exercices I
bisgambiglia@[Link] 201
Programmation
Le langage C / Exercices I
bisgambiglia@[Link] 202
Programmation
Le langage C / Exercices I
bisgambiglia@[Link] 203
Exo : 1 Programmation
Le langage C / Correction Exercices I
void fct_exo1(){
printf("\t EXO 1 diviseur d un nombre \n") ;
/*Déclaration des variables locales */
int i, N ;
puts("Entrez le nombre N") ;
scanf("%d",&N) ;
for (i=2; i<=N/2; i++)
if ((N%i)==0) printf(" %d est un diviseur de %d \n", i, N) ;
int i=2, N ;
puts("Entrez le nombre N") ;
scanf("%d",&N) ;
while (i<N/2)
{ if ((N%i)==0) printf(" %d est un diviseur de %d \n", i, N) ;
i++;
}
bisgambiglia@[Link] 204
Exo : 2 Programmation
Le langage C / Correction Exercices I
void fct_exo2(){
printf("\t EXO 2.1 nombre premier \n") ;
/*Déclaration des variables locales */
int i=2, N, continuer=1 ;
puts("Entrez le nombre N") ;
scanf("%d",&N) ;
while ((i<N) && (continuer==1))
if ((N%i)==0) continuer=0 ;
else i++ ;
if (i<N) printf (" %d n'est pas un nombre premier %d le divise\n",
N, i) ;
else printf (" %d est un nombre premier\n",N) ;
}
bisgambiglia@[Link] 205
Exo : 2 Programmation
Le langage C / Correction Exercices I
void fct_exo2_2(){
printf("\t EXO 2.2 nombre premier diviseur de N \n") ;
int i=2, N, val, continuer=1, affiche=0 ;
puts("Entrez le nombre N") ;
scanf("%d",&N) ;
val=N ;
while (i<=val){ if ((val%i)==0){
if (affiche==0) {
printf(" %d est un nombre premier diviseur de
%d\n", i, N) ;
affiche=1 ;
}
val/=i ;
}
else{ affiche=0 ; i++ ; }
}
}
bisgambiglia@[Link] 206
Exo : 2 Programmation
Le langage C / Correction Exercices I
void fct_exo2_3(){
printf("\t EXO 2.3 nombre premier inferieur a N \n") ;
int nombre, borne, i ;
/* Les deux premiers nombres premiers sont affichés */
puts("Entrez le nombre limite inferieure a 1000 : ") ;
scanf("%d",&borne) ;
while ((borne<1) || (borne>1000))
{ puts(" -- La borne doit etre comprise en 1 et 1000 : ");
scanf("%d",&borne) ; }
printf("1, 2");
for (nombre = 3; nombre <= borne ; nombre+=2)
{ for (i = 2; i*i <= nombre; i++) if (!(nombre%i)) break;
if (i*i > nombre) printf(", %d", nombre);
}
printf("\n");
}
bisgambiglia@[Link] 207
Exo : 3 Programmation
Le langage C / Correction Exercices I
#include <stdio.h>
void main(void)
{ int nb1, nb2, PPCM=2 ;
printf("Entrez le premier nombre : ");
scanf("%d", &nb1) ; PGCD1=nb1 ;
printf("Entrez le second nombre : ") ;
scanf("%d", &nb2) ; PGCD2=nb2 ;
/* calcul du pgcd */
while (PGCD1 != PGCD2)
(PGCD1 > PGCD2) ? (PGCD1 -= PGCD2) : (nb2 -= nb1)) ;
if (PGCD1==1) printf("Il n’y a pas de PGCD ") ;
else printf("Le PGCD est : %d\n", PGCD1) ;
/* calcul du ppcm */
while (((nb1%PPCM)!=0) && ((nb2%PPCM)!=0))
if (++PPCM>((nb1>nb2) ? nb2 : nb1)) break ;
if (PPCM>nb1 || PPCM>nb2) printf("Il n’y a pas de PPCM ") ;
printf("Le PPCM est : %d\n", PPCM) ;
}
bisgambiglia@[Link] 208
Pgcd et ppcm sous forme de
fonctions
int ppcm(int nbr1, int nbr2) {
int lePpcm;
if ((0 == nbr1) || (0 == nbr2)) return 0;
/*-----fonction pgcd -------*/ for (lePpcm = (nbr1 < nbr2) ? nbr2 :
int pgcd(int A, int B){ nbr1; lePpcm < (nbr1 * nbr2);
int C; lePpcm++)
//for ( ; ;) autre solution {
while (A!=B) if ((0 == (lePpcm % nbr1)) && (0 ==
{ (lePpcm % nbr2))) break;
if (A<B) }
{ return lePpcm;
C=A ; A=B ; B=C ; }
}
if (A==B)
/*-----fonction ppcm avec pgcd -------*/
{
int ppcm(int nbr1, int nbr2) {
return A;
if ((0 == nbr1) || (0 == nbr2)) return 0;
}
return (nbr1 * nbr2) / pgcd(nbr1, nbr2);
A=A-B ;
}
}
}
bisgambiglia@[Link] 209
Exo : 3 Programmation
Le langage C / Correction Exercices I
bisgambiglia@[Link] 210
Exo : 4 Programmation
Le langage C / Correction Exercices I
void fct_exo4(){
printf("\t EXO 4 Quel nombre ? \n") ;
int solution, reponse, nb_essais=0 ;
time_t t;
srand ((unsigned) time(&t)) ; /* initialisation du générateur */
solution=rand()%1000 ;
do
{
puts("Proposez un nombre compris entre 0 et 1000 ");
scanf("%d",&reponse) ;
if (reponse>solution) puts(" Le nombre est trop grand \n") ;
else if (reponse!=solution) puts(" Le nombre est trop petit \n") ;
nb_essais++ ;
}
while (reponse!=solution) ;
printf("Vous avez trouve la solution en %d essais ", nb_essais) ;
}
bisgambiglia@[Link] 211
Programmation
Le langage C / Correction Exercices I
#include <stdio.h>
void main(void)
{ int nombre=0 ;
char car, continue='O' ;
puts("Proposez nombre en binaire ") ;
while (((car=getchar()) != EOF) && (continue=='O'))
if (car =='0' || car=='1')
nombre=(car - '0') + nombre*2 ;
else
continue='N' ;
printf("%d\n", nombre) ;
}
bisgambiglia@[Link] 212
Exo : 5 Programmation
void fct_exo5()
{
int tab[10];
int k,j,i,val;
int puissance=0,resultat=0;
// TABLEAU DE 10 ENTIER 0 OU 1
puts("tapez un binaire a 10 chiffres en tapant ENTREE a chaque chiffre.");
for(k=0;k<=9;k++){
do{
scanf("%d",&val);
tab[k]=val;
}while((val != 0) || (vak !=1))
}
//on calcul le chiffre en décimal
for(j=9;j>=0;j--){
if(tab[j]==0){
puissance++;
}else{
resultat+=pow(2,puissance);//(2**puissance);
puissance++;
}
}
printf("le nombre donne %d en decimal\n",resultat);
}
bisgambiglia@[Link] 213
Exo : 5 Programmation
void fct_exo5_2(){
printf("\t EXO 5 conversion 10 en 2 \n") ;
int nombre, div=2 ;
puts("Proposez nombre en decimal \n") ;
scanf("%d",&nombre) ;
while ((div*div) < nombre) div=div*div ;
while (div>=2)
{ if (nombre>=div)
{ printf("%c", '1') ;
nombre-=div ;
}
else
printf ("%c", '0') ;
div/=2 ;
}
if (nombre==1) printf("%c", '1') ;
else printf("%c", '0') ;
}
bisgambiglia@[Link] 214
Exo : 6 Programmation
Le langage C / Correction Exercices I
void fct_exo6(){
printf("\t EXO 6 X puissance N\n") ;
int i, X, N, resultat=1 ;
puts("Proposez une valeur pour N inferieure a 10 : ") ;
scanf("%d",&N) ;
while ((N<1) || (N>10))
{ puts(" -- N doit etre compris en 1 et 10 : ") ;
scanf("%d",&N) ;
}
puts("Donnez la valeur de X : ") ;
scanf("%d",&X) ;
for (i=1; i<=N; i++) resultat*=X ;
printf("Le resultat est %d\n ", resultat) ;
}
bisgambiglia@[Link] 215
void fct_exo7(){
printf("\t EXO 7 polynome N\n") ;
Exo : 7 int Nmax, i, j ;
float An, X, Terme, Resultat=0 ;
puts("Quel est l'ordre du polynome (inferieure a 10) : ");
scanf("%d",&Nmax);
while ((Nmax <1) || (Nmax >10))
{
puts(" -- N doit être compris en 1 et 10 : ");
scanf("%f",& Nmax);
}
puts("Donnez la valeur de X : ") ;
scanf("%f",&X);
for (i=1; i<=Nmax; i++)
{
printf("Donnez la valeur de A[%d] : ",i) ;
scanf("%f",&An) ;
Terme=1 ;
for (j=1; j<=i; j++) Terme*=X ;
Resultat+=Terme*An ;
}
printf("Le resultat est %f\n ", Resultat) ;
}
bisgambiglia@[Link] 216
Exo : 8 Programmation
void fct_exo8(){
printf("\t EXO 8 calculatrice \n");
float val1, val2, resultat ;
char op ;
int fin=0;
do
{ puts("Entrez l operation sous cette forme (ex: 3*5) ");
scanf("%f%c%f",&val1,&op,&val2) ;
switch (op) {
case '*' : resultat=val1*val2 ; break ;
case '+' : resultat=val1+val2 ; break ;
case '-' : resultat=val1-val2 ; break ;
case '/' : resultat=val1/val2 ; break ;
case '=' : fin++ ; break ;
}
if (!fin) printf ("%f%c%f=%f\n",val1,op,val2,resultat) ;
}
while (!fin) ;
}
bisgambiglia@[Link] 217
Exo : 9 Programmation
void fct_exo9(){
printf("\t EXO 9 longeur d'un type \n");
char un_char ; short un_short ; int un_int ; long un_long ;
int cptr ; /* compteur de bits */
bisgambiglia@[Link] 218
Programmation
Tableau
Notion de pointeurs
Structure de données
bisgambiglia@[Link] 219
Programmation
Le langage C
Déclaration:
int MAX = 20; Tableaux
int tab[ MAX]; //tableau d’entier de taille 20
Initialisation:
tab={1,2,3,4,5,6,7,8,9} /* fct qui retourne la somme des éléments
d’un tableau de taille n */
Manipulation int pruc(int titi[ ], int n)
tab[0]=>1 {
tab[5]=>6 int i ;
int somme=0 ;
for (i=0 ; i<n ; i++)
somme = somme+titi[ i ];
//somme+=titi[ i ]
return somme ;
}
bisgambiglia@[Link] 220
Programmation
Le langage C
Variables et adresses
Pointeurs
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 1, j = 2;
printf("i=%d, adresse(i)=%p\n",i,&i);
printf("j=%d, adresse(j)=%p\n",j,&j);
return 0;
}
donne à l’exécution :
i=1, adresse(i)=7fff2ee0
j=2, adresse(j)=7fff2ee4
bisgambiglia@[Link] 221
Programmation
Pointeurs
bisgambiglia@[Link] 222
Programmation
int i = 2 ; // déclaration d’1 entier
int *j; // déclaration d’1 adresse en mémoire pointant sur un int
int i 2i 4 Mémoire
&1 &2 &3 &4 &5 &… &… &.. &n Adresse
i=2 @
.
int *j j=&i
exemple :
int *max(int tableau[], int taille)
{
int i, *grand;
for(grand=tableau,i=1;i<taille;i++)
if(tableau[i] > *grand)
grand = tableau+i;
return(grand);
}
bisgambiglia@[Link] 224
Programmation
Pointeurs
TAB est une "constante pointeur", alors que ptr est une variable (donc
TAB++ est impossible).
bisgambiglia@[Link] 225
Programmation
Structure de données
bisgambiglia@[Link] 226
Programmation
Le langage C
Exercices II
bisgambiglia@[Link] 227
Programmation
Le langage C / Exercices II
….
void main(void)
{ int *ptr ;
……
for (ptr=Tab; ptr<Tab+Taille; ptr++) *ptr=value ; }
bisgambiglia@[Link] 231
Exo : 2 Programmation
#include <stdio.h>
#include <stdlib.h> /* permet d'utiliser le random */
#include <time.h> /* permet de trouver l'heure, afin dinit. random
*/
#define Max 10
void main(void)
{ int Tab[Max], Taille, somme=0, i ;
time t;
srand ((unsigned) time(&t)) ;
do
printf("Entrez la taille réelle du tableau (< %d) : ", Max) ;
scanf("%d",&Taille) ;
while (Taille>Max) ;
for (i=0; i<Taille; i++) Tab[i]=rand()%100 ;
/* calcul de la moyenne */
for (i=0; i<Taille; i++) somme+=Tab[i] ;
printf( "La somme des nombre du tableau est : %d ",somme) ;
printf( "La moyenne est : %d ",somme/Taille) ;
}
bisgambiglia@[Link] 232
Exo : 3 Programmation
#include <stdio.h>
…… /* Utilisation des bibliothèques pour rand() */
#define Max 10
void main(void)
{ int Tab[Max], Taille, val ;
int i, j ;
……. /* initialisation de Taille et du générateur automatique */
for (i=0; i<Taille; i++)
{ val= rand()%100 ;
j=0 ;
while (j<i)
{ if (val==Tab[j])
{ val= rand()%100 ;
j=0 ; }
else j++ ; }
Tab[i]=val ;
}
}
bisgambiglia@[Link] 233
Exo : 4 Programmation
…… /* Des directives du pré-processeur */
void main(void)
{ int Tab[Max], Taille, val, i=0 ;
char Trouve, Continuer ;
……. /* initialisation de Taille et du générateur automatique */
for (i=0; i<Taille; i++) Tab[i]=rand()%100 ;
do
printf("Entrez valeur à rechercher : ") ;
scanf("%d",&val) ;
while ((Trouve=='F') && (i<Taille))
if (val==Tab[i]) Trouve='V' ;
else i++ ;
if (Trouve=='V')
printf(" %d se trouve à la place %d\n", val, i) ;
else
printf(" %d n'est pas dans le tableau \n", val) ;
printf(" Voulez-vous chercher une autre valeur (O/N) ") ;
scanf("%d",&Continuer) ;
while (Continuer=='O') ; }
bisgambiglia@[Link] 234
Exo : 5 Programmation
bisgambiglia@[Link] 235
Exo : 6 Programmation
char affiche='F' ;
printf("Le minimum est : %d \n", Tab[IndMin]) ;
for (i=IndMin+1; i<Taille; i++)
if (Tab[i]==Tab[IndMin])
if (affiche== 'F')
{ printf ("Aux adresses : %d\t%d ", IndMin, i) ;
affiche== 'V' ; }
else printf ("\t %d ", i) ;
if (affiche== 'F') printf ("A l’adresse : %d", IndMin) ;
affiche='F' ; printf ("\n") ;
printf("Le maximum est : %d \n", Tab[IndMax]) ;
for (i=IndMax+1; i<Taille; i++)
if (Tab[i]==Tab[IndMax])
if (affiche== 'F')
{ printf ("Aux adresses : %d\t%d ", IndMin, i) ;
affiche== 'V' ; }
else printf ("\t %d ", i) ;
if (affiche== 'F') printf ("A l’adresse : %d", IndMin) ;
printf ("\n") ;
bisgambiglia@[Link] 236
Exo : 7 Programmation
…… /* Des directives du pré-processeur */
void main(void)
{ int Tab[Max], Taille, tmp ;
int i , j , IndMin ;
……. /* initialisation de Taille et du générateur automatique */
for (i=0; i<Taille; i++) Tab[i]=rand()%100 ;
for (i=0; i<Taille-1; i++)
{ IndMin=i ;
for (j=i+1; j<Taille ; j++)
if (Tab[j]<Tab[IndMin]) IndMin=j ;
if (IndMin!=i)
{ tmp=Tab[i] ; Tab[i]=Tab[IndMin] ; Tab[IndMin]=tmp ; }
}
for (i=0; i<Taille; i++)
{ if ((i%5)==0) printf("\n") ;
printf("\t%d", Tab[i]) ;
}
}
bisgambiglia@[Link] 237
Exo : 8 Programmation
bisgambiglia@[Link] 238
Exo : 9 Programmation
…… /* Des directives du pré-processeur et fonction main */
{ int Tab[Max], Taille, val, place ;
char continuer='O' ;
……. /* initialisation du tableau et trie */
while ((Taille<Max) && (continuer=='O'))
{ place=0 ;
printf("Entrez la valeur à insérer : ") ;
scanf("%d",&val) ;
while ((place<Taille) && (Tab[place]<val)) place++ ;
for (i=Taille; i>place; i--) Tab[i]=Tab[i-1] ;
Tab[place]=val ;
Taille++ ;
printf(" Voulez-vous insérer une autre valeur (O/N) : ") ;
scanf("%c",&continuer) ;
}
if (Taille==Max) printf("Le tableau es plein \n") ;
}
bisgambiglia@[Link] 239
Exo : 10 Programmation
…… /* Des directives du pré-processeur et fonction main */
{ char car ;
int space, lower, upper, letter[26];
for (i = 0; i < 26; i++) letter[i] = 0 ;
space = upper = lower = 0 ;
while ((car = getchar()) != EOF)
{ if (isspace(car)) nspace++;
else if (isalpha(car))
{ if (isupper(car)) { upper++ ; car = tolower(car) ; }
else if (islower(car)) lower++ ;
letter[car - 'a']++ ;
}
}
printf("uppercase: %d, lowercase: %d, spaces: %d\n", upper,
lower, space) ;
for (car = 'a'; car <= 'z'; car++)
if (letter[car - 'a']) { printf("%c: %d\n",car,letter[car - 'a']); }
}
bisgambiglia@[Link] 240
void recherche(char *ch,char *sch)
Exo : 11 {
int pos=0;
while (*ch)
{
if (debut_egal(ch,sch))
printf("trouve en position
int debut_egal(char *ch,char *sch) %d\n",pos);
/* répond si sch est exactement le ch++;pos++;
début de ch */ }
{ }
while (*sch && *ch)
{
void test(void)
if (*sch!=*ch) return(0); else {ch+
+;sch++;} {
} char ch[TAILLE], sch[TAILLE] ;
return(!(*sch)); puts("chaine a tester ? ");
} scanf("%s",ch);
//gets(ch);
puts("sous-chaine a trouver ?");
//gets(sch);
scanf("%s",sch);
recherche(ch,sch);
}
bisgambiglia@[Link] 241
Programmation
Le langage C
Exercices III
Chaînes de caractères
bisgambiglia@[Link] 242
Programmation
Exercices
Exercice 2
Manipulation de chaîne de caractères.
Exercice 3
Chaîne de caractères : On dispose de deux tableaux (Ligne et Mot) contenant des
caractères.
Exercice 4
On souhaite créer un programme pour gérer N places. Pour cela on dispose d’un
tableau de booléen (table des places). Si une place est réservée la valeur dans le
tableau est à vrai (et est à faux dans le cas contraire). Définir les fonctions
suivantes :
initialiser() qui permet de créer un tableau de booléen à faux ;
réserver() qui permet de réserver m places consécutives dans le tableau ;
placeLibre() qui affiche la liste des places libres ou occupées ;
libérer() qui permet de libérer m places consécutives dans le tableau.
Exercice 5
Un carre magique est une matrice (N,N) contenant des chiffres compris entre 1 et
N*N, de tel sorte que les sommes de chaque ligne de chaque colonne et de
chaque diagonale soient égales.
bisgambiglia@[Link] 243
Programmation
Exercices
1. Faire un programme qui lit un mot au clavier et qui affiche ses caractères
dans l’ordre inverse, en commençant par le dernier.
2. Lire un nom au clavier puis l’afficher en mettant un signe « - » entre chaque
lettre.
3. Lire un mot au clavier. Afficher ensuite combien il y a de ’a’ dans le mot.
4. Lire une phrase dans une variable et compter combien il y a de mots
(compter les espaces). Utiliser une boucle for, de 1 jusqu’à la fin de la phrase
(strlen). Si l’on trouve la constante espace, ’ ’, on incrémente la variable qui
compte les espaces.
5. Lire une chaîne au clavier (ou déposer une chaîne constante dans une
variable) et l’imprimer sans qu’apparaissent les lettres ’a’ qui seraient
contenues dans cette chaîne.
bisgambiglia@[Link] 244
Programmation
Exercices
bisgambiglia@[Link] 245
void f2_1_inversChar()
{ #define MAX_SIZE 128
StringT str1, str2; // type pré défini
int longueur, i; typedef char StringT[MAX_SIZE];
/* Entree du mot */
printf("Entrez un mot : ");
fgets(str1, MAX_SIZE, stdin);
/* INITIALISATION !!! */
longueur = strlen(str1);
longueur--;
/* Boucle pricipale pour copier un par un les caracteres de
str1
dans str2 a l'envers */
for (i = 0; i < longueur; i++) {
str2[i] = str1[longueur - 1 - i]; //autre solution
}
/* ATTENTION !!! NE PAS OUBLIER LE '\0' FINAL */
for(i=longeur ; i<=0 ; i--)
str2[longueur] = '\0'; {
str2[longeur - i] = str1[i];
/* Affichage du resultat */ }
printf("A l'envers : %s\n", str2);
}
bisgambiglia@[Link] 246
/* Boucle pricipale : pour chaque caractere
/ de str1 examiné, du premier (indice 0)
******************************* jusqu'à l'avant-dernier (indice
***************** longueur-2) on le copie dans str2 et on
Lire un nom au clavier puis l’afficher en met un caractère '-' comme caractère
mettant un signe « - » entre chaque lettre. suivant dans str2 */
********************************** j = 0;
***********/ for (i = 0; i <= longueur-2 ; i++)
void f2_2_afficheSign() {
{ str2[j] = str1[i];
StringT str1, str2; j++;
int longueur, i, j; str2[j] = '-';
j++;
/* Entree d'un mot */ }
printf("Entrez un mot : "); /* On copie le dernier caractère de
fgets(str1, MAX_SIZE, stdin); str1 dans str2 sans mettre de
caractère '-' après */
/* INITIALISATION !!! */
str2[j] = str1[longueur-1];
longueur = strlen(str1);
j++;
longueur--;
str2[j] = '\0';
/* On ignore le RETURN final */
/* ATTENTION !!! NE PAS OUBLIER LE
'\0' FINAL*/
/* Affichage du résultat */
printf("Avec des '-' entre chaque
lettre : %s\n", str2);
}
bisgambiglia@[Link] 247
Sources
[Link]
bisgambiglia@[Link] 248
Sommaire
1. Rappels : Le Codage de l’information (2h)
2. Algorithmique (13h)
3. Introduction à la programmation (6h)
4. Programmation Orientée Objet (6h)
1. Introduction
2. UML
3. Objet
4. Classe
5. Encapsulation
6. Héritage
7. Polymorphisme
8. Constructeur
9. Conclusion
10. Exemples en C#
bisgambiglia@[Link] 249
POO
Exemple en C#
using System;
using [Link];
using [Link];
namespace ConsoleApplication1
{
public class Taxi
{
public bool isInitialized;
public Taxi()
{
isInitialized = true;
}
}
class TestTaxi
{
static void Main()
{
Taxi t = new Taxi();
[Link]([Link]);
}
}
}
bisgambiglia@[Link] 250
POO
Introduction
Vocabulaire objet :
Encapsulation : c’est le fait de réunir à l'intérieur d'une
même entité (objet) le code (méthodes) + données
(attributs). Deux niveaux d’encapsulation sont définis :
Privé les champs et les méthodes masqués sont dans la partie
privée de l’objet.
Public les champs et les méthodes visibles sont dans la partie
interface de l’objet.
Une classe est une sorte de container à partir duquel sont
engendrés les objets réels qui s’appellent des instances de
la classe considérée. Elle contient :
Des attributs (ou champs, ou variables d’instances). Les attributs
Membres de la classe décrivent la structure de ses instances (les objets).
Des méthodes (ou opérations de la classe). Les méthodes décrivent
les opérations qui sont applicables aux instances de la classe.
bisgambiglia@[Link] 253
POO
Introduction
Vocabulaire objet :
Héritage : C’est un mécanisme très puissant qui permet de décrire des
structures génériques en transmettant depuis l’intérieur d’une même
classe toutes les propriétés communes à toutes les "sous-classes" de
cette classe. Par construction toutes les sous-classes d’une même classe
possèdent toutes les attributs et les méthodes de leur classe parent.
Propriétés de l'héritage :
Les attributs et les méthodes peuvent être modifiés au niveau de la sous-
classe qui hérite.
Il peut y avoir des attributs et/ou des méthodes supplémentaires dans une
sous-classe.
Une classe A qui hérite d’une classe B dispose implicitement de tous les
attributs et de toutes les méthodes définis dans la classe B.
Les attributs et les méthodes définis dans A sont prioritaires par rapport
aux attributs et aux méthodes de même nom définis dans
bisgambiglia@[Link] 254
POO
UML
Notion d’objet :
Attributs : Il s'agit des données caractérisant l'objet. Ce sont des
variables stockant des informations d'état de l'objet
Méthodes (appelées parfois fonctions membres): Les méthodes d'un
objet caractérisent son comportement, c'est-à-dire l'ensemble des
actions (appelées opérations) que l'objet est à même de réaliser. Ces
opérations permettent de faire réagir l'objet aux sollicitations
extérieures (ou d'agir sur les autres objets). De plus, les opérations sont
étroitement liées aux attributs, car leurs actions peuvent dépendre des
valeurs des attributs, ou bien les modifier
Nom : L'objet possède une identité, qui permet de le distinguer des
autres objets, indépendamment de son état. On construit généralement
cette identité grâce à un identifiant découlant naturellement du
problème (par exemple un produit pourra être repéré par un code, une
voiture par un numéro de série, ...)
bisgambiglia@[Link] 256
POO
Objet
Un objet est un groupe de données structurées caractérisé par un
identifiant unique (nom) représentant le monde réel.
Exemple : un article en stock est un objet
Un objet est manipulé par des procédures appelées méthodes qui sont
caractérisées par une entête définissant leur nom, les paramètres d'appel et
de retour pour chacune d'elle
Exemple : Nous pouvons définir comme méthodes de l'objet ARTICLE
PrixTtc : Méthode permettant de calculer le prix TTC d'un article
SortieArticle : Méthode permettant de diminuer la quantité en stock
EntreeArticle : Méthode permettant d'augmenter la quantité en stock
bisgambiglia@[Link] 257
POO
Objet
bisgambiglia@[Link] 258
POO
Classe
Notion de classe :
On appelle classe la structure d'un objet, c'est-à-dire la
déclaration de l'ensemble des entités qui composeront un
objet. Un objet est donc "issu" d'une classe, c'est le produit
qui sort d'un moule. En réalité on dit qu'un objet est une
instanciation d'une classe, c'est la raison pour laquelle on
pourra parler indifféremment d'objet ou d'instance
(éventuellement d'occurrence).
Une classe est composée de deux parties:
Les attributs (parfois appelés données membres): il s'agit
des données représentant l'état de l'objet
Les méthodes (parfois appelées fonctions membres): il
s'agit des opérations applicables aux objets
bisgambiglia@[Link] 259
POO
Classe
Classe en C# :
Les fonctions ont une
class EtreHumain { influence sur les
// Attributs attributs, par exemple la
string nom; fonction manger() peut
int age; augmenter la valeur de
int taille; l’attributs poids
int poids;
enum sexe{homme,femme};
// Fonctions
void dormir(int temps);
void manger(); // instanciation :
void travailler(); // type nom = new constructeur()
… …
} EtreHumain aaa = new EtreHumain();
EtreHumain aab = new EtreHumain();
…
bisgambiglia@[Link] 261
POO
Encapsulation
Définitions :
L'encapsulation en général est la notion de mettre une chose dans une
autre.
En programmation orientée objet, l’encapsulation est l'idée de protéger
l'information contenue dans un objet et de ne proposer que des
méthodes de manipulation de cet objet.
La fusion d'un bloc de code et d'un bloc de données est un concept
nouveau, celui d'encapsulation.
Principe :
L'encapsulation est basée sur la notion de services rendus. Une classe
fournit un certain nombre de services et les utilisateurs de cette classe
n'ont pas à connaître la façon dont ces services sont rendus.
Il faut donc distinguer dans la description de la classe deux parties :
La partie publique, accessible par les autres classes,
La partie privée, accessible uniquement par les méthodes de la classe.
bisgambiglia@[Link] 262
POO
Encapsulation
bisgambiglia@[Link] 263
LOO C#
Encapsulation
bisgambiglia@[Link] 264
POO
Héritage
Définitions :
L’héritage est un principe de la programmation orientée
objet, permettant entre autres la réutilisabilité et
l'adaptabilité des objets. Elle se nomme ainsi car le principe
est en quelque sorte le même que celui d’un arbre
généalogique.
Concepts de l’héritage :
L’héritage permet de créer de nouvelles classes à partir de
classes existantes.
Les classes dérivées obtenues sont des « classes filles », «
classes dérivées » ou « sous classes ».
Les classes d’origine sont dites des « super classes », «
classes de base » ou « classes parentes ».
Les sous classes peuvent hériter des attributs de la super
classe dont elles sont issues.
Les sous classes peuvent avoir des attributs et des
méthodes qui leur sont propres.
Certaines méthodes d’une super classe peuvent être
redéfinies dans les sous classes issues de celle-ci.
bisgambiglia@[Link] 266
POO
Héritage
Notation :
ClasseDeBase : CLASSE
Privé:
// membres privés ne sont accessibles que par les membres de la
classe
Public :
// membres publics sont accessibles par tous les membres de
l’application qui utilisent la classe
EtreHumain
Enfant
Représentation : int taille
int poids int taille
enum sexe int poids
int age enum sexe
void dormir() int age
void manger() string ecole
void dormir()
void manger()
void jouer()
bisgambiglia@[Link] 267
POO
Héritage
Classe en C# :
Héritage
bisgambiglia@[Link] 269
POO
Polymorphisme
Définitions :
En informatique, le polymorphisme est l'idée d'autoriser le
même code à être utilisé avec différentes classes, ce qui
permet des implémentations plus abstraites et générales.
Le polymorphisme est lié à l'héritage. Il permet aux
utilisateurs d'accéder à des objets différents comme s'ils
étaient identiques sans se préoccuper du comportement
interne qui lui peut différer. Le polymorphisme permet à
des objets dérivant d'une même racine d'avoir la même
interface avec le monde tout en ayant une structure interne
différente (attributs et méthodes). C'est aussi un des
éléments majeur dans la réutilisation du code.
bisgambiglia@[Link] 270
POO
Polymorphisme
Principe :
Plusieurs classes peuvent posséder une méthode de même
nom. Suivant la nature de l'objet auquel elle doit
s'appliquer, on appliquera telle ou telle méthode. Le
polymorphisme consiste à appeler la bonne méthode
d'après le type de l'objet implémenté.
Exemple :
public class A {
public void affiche() {
[Link]("type A"); } A v1 = new A();
} [Link]();
public class B : A { B v2 = new B();
public void affiche() { [Link]();
[Link]("type B"); }
}
bisgambiglia@[Link] 271
POO
Constructeur et Destructeur
class EtreHumain {
// Attributs
public string nom;
private int age;
EtreHumain a = new EtreHumain(Dus,22,1.78,77,0)
private int taille;
private int poids;
EtreHumain b = new EtreHumain(Smith,42,1.64,52,1)
public enum sexe{homme,femme};
// Constructeur
public EtreHumain(string nom; int age, int taille, int poids, int sexe)
{
nom = nom;
age = age;
taille = taille;
poids = poids;
sexe = sexe;
}
// Fonctions
public void dormir(int temps);
…
}
bisgambiglia@[Link] 273
POO
Conclusion
bisgambiglia@[Link] 275
LOO
C#
bisgambiglia@[Link] 276
using System; Résultats d'exécution de ce programme :
using [Link]; x * y - z + t = 36
using [Link]; x * y - (z + t) = 22
namespace CsAlgorithmique x*y%z+t=9
{ (( x * y) % z ) + t = 9
class AppliOperat_Arithme x*y%(z+t)=2
{ x *( y % ( z + t)) = 32
static void Main(string[] args)
{
int x = 4, y = 8, z = 3, t = 7, calcul;
calcul = x * y - z + t;
[Link](" x * y - z + t = " + calcul);
calcul = x * y - (z + t);
[Link](" x * y - (z + t) = " + calcul);
calcul = x * y % z + t;
[Link](" x * y % z + t = " + calcul);
calcul = ((x * y) % z) + t;
[Link]("(( x * y) % z ) + t = " + calcul);
calcul = x * y % (z + t);
[Link](" x * y % ( z + t ) = " + calcul);
calcul = x * (y % (z + t));
[Link](" x *( y % ( z + t)) = " + calcul);
}
}
}
bisgambiglia@[Link] 277
namespace CsAlgorithmique
{
class Application1
{
static void Main(string[] args)
{ /* inverse d'une suite de caractère dans un tableau
par permutation des deux extrêmes */
char[] Tablecar ={ 'a', 'b', 'c', 'd', 'e', 'f' };
int i, j;
[Link]("tableau avant : "
+ new string(Tablecar));
for (i = 0, j = 5; i < j; i++, j--)
{
char car;
car = Tablecar[i];
Tablecar[i] = Tablecar[j];
Tablecar[j] = car;
}
[Link]("tableau après : "
+ new string(Tablecar));
}
}
}
bisgambiglia@[Link] 278
namespace CsAlgorithmique
{
class Application2
{
static void Main(string[] args)
{ // recherche séquentielle dans un tableau
int [ ] table= {12,-5,7,8,-6,6,4,78};
int elt = 4, i;
for ( i = 0 ; i<8 ; i++ )
if (elt==table[i]) break ;
if (i == 8)
[Link]("valeur : "
+elt+" pas trouvée.");
else
[Link] ("valeur : "
+elt+" trouvée au rang :"+i);
}
}
}
bisgambiglia@[Link] 279
POO en PHP
[Link]
[Link]
[Link]
rs-complet/[Link]
[Link]
6-programmez-en-oriente-objet-en-php
bisgambiglia@[Link] 280
POO en PHP
<?php
class SimpleClass
{
// déclaration d'une propriété
public $var = 'une valeur par défaut';
// déclaration des méthodes
public function displayVar() {
echo $this->var;
}
}
?>
bisgambiglia@[Link] 281
POO en PHP
<?php
declare(strict_types=1);
class SimpleClass
{
// déclaration d'une propriété
public $var = 'une valeur par défaut';
// déclaration des méthodes
public function displayVar() {
echo $this->var;
}
}
?> bisgambiglia@[Link] 282
Sources
1. [Link]
2. [Link]/docs/net3d/[Link]
3. [Link]
html
4. [Link]
n_informatique%29
5. [Link]
%[Link]
6. [Link]
-[Link]
7. [Link]
8. [Link]
9. Le langage C# dans bisgambiglia@[Link]
.Net [Link] 283
A Savoir !!!
Notions complémentaires
bisgambiglia@[Link] 284