Вы находитесь на странице: 1из 95

Programmation orientée objet:

langage JAVA

L.M.D
2019-2020

1
Plan
 Introduction
 Notions d’objet et de classe
 Héritage et polymorphisme
 Les collections
 Les exceptions

2
Introduction

3
Approche structurelle vs approche objet

 Il n'y a aucun comportement ou service


associé aux structures

4
Constats

 Il y a beaucoup de manières à écrire un


programme qui effectue une tâche spécifiée.
 La manière de programmation dépend du
langage utilisé.
 Le langage utilisé dépend de la manière de
programmation.
Paradigmes de programmation

 programmation structurélle : P.P.


(C, etc.)
 programmation orientée objet : P.O.O.
(C++, Java, Delphi)
 Programmation par composant (JEE…)
 Programmation par service( web service …)
 Etc
Programmation structurelle
(rappel de C)

 le programme est composé des fonctions


 les données (variables) sont créées à
l’intérieure des fonction ou bien passées
comme paramètres
 il y a un programme principal (main)
Un programme en C
Limitations

 Il n’y a pas de méthode ou de cadre pour


bien organiser les fonctions.
 Les modifications d’une fonction entraînent
d’autres modifications dans autre fonctions,
etc.
 La portée d’une modification est trop grand et
difficile à gérer.
 Redondance dans le code (la même chose
est codé plusieurs fois)
 Propagation des erreurs – déboggage difficile
Limitations

11
Avantage POO

12
Est-ce qu’il faut oublier le C?

NON!
Vous allez avoir le
choix parmi
plusieurs
méthodes de
programmation!
Paradigme orienté objet
Comment peut on y arriver?

 Introduction des nouvelles (?) notions


 objet
 classe
 instanciation
 hiérarchie des classes
 héritage
 …
 On va utiliser ces notions pour introduire le
paradigme de programmation orientée objet.
Un peu d’histoire

 Java est né en 1995 chez Sun Microsystems


 En 2009 SUN est racheté par ORACLE
 est orienté objet
 est fortement typé
 Java est compilé
 En bytecode, i.e., code intermédiaire indépendant de la
machine
 Java est interprété
 Le bytecode est interprété par une machine virtuelle Java
15
Java est une plateforme
 Plateforme=Environnement matériel et/ou logiciel dans
lequel un programme s'exécute
 Java est une plateforme logicielle

 Java SE (Java Platform, Standard Edition): Java SE pour

applications classiques, desktop


 Java EE (Java Platform, Enterprise Edition): Java EE

pour développer et déployer des applications serveur,


Web services, etc.
 Java ME (Java Platform, Micro Edition): J2ME pour les

applications embarquées, PDA, téléphones, etc


 Java CA (Java Card Edition): pour developper les

applications qui vont s’executer dans les cartes à puces.16


JSE
 (http://docs.oracle.com/javase/7/docs/)

17
JSE

 JDK (Java Developement Kit) fournit les outils


de développement des applications Java
 JRE (Java Runtime Execution) fournit
l’environnement d’exécution
 API (Application Programming Interfaces)
fournit un ensemble des classes et d’ interfaces
standards ,organisés en packages

18
Modes de compilation (1)
 Java est un langage interprété, ce qui signifie que:
 un programme compilé n’est pas directement exécutable
par le système d’exploitation . Il doit être interprété par
un autre programme, qu’on appelle interpréteur
Trois modes de compilation:

19
Modes de compilation : le bytecode (2)

 Le langage source Java est défini par la JLS (Java


Language Specification)
 Le code source d'une classe contenue dans un fichier est
compilé avec la commande javac
 Cela produit un code intermédiaire, appelé bytecode, qui
est le « langage machine » de la machine virtuelle Java
 Le bytecode d'une classe est destiné à être chargé par une
machine virtuelle qui doit l'exécuter avec la comande java
 Une JVM traduit le bytecode dans le langage
machine de la plateforme d'accueil
20
Versions de Java

 Java 6 -2006
 Java 7 –2011
 améliorations du langage : switch avec des chaînes,
gestion des exceptions,
 amélioration des API
 Java 8 –2014
 améliorations du langage : lambda expressions
(programmation fonctionnelle), collections, streams…
 Java 9 – 2017
 Java 10 – Mars 2018 21
Installation de JDK (1/2)

 Installer JDK , ceci entraine l’installation du


JDK et du JRE

22
Installation du JDK (2/2)
 javac.exe : Compilateur java.
 java.exe : Interpréteur du bytecode java.
 appletviewer.exe : Pour tester les applets java.
 Jdb.exe : Débogueur java.
 Javap.exe : désassembleur du bytecode.
 Javadoc.exe : Générer la documentation de vos programmes java.
 Javah.exe : Permet de lier des programmes Java avec des méthodes
natives, écrites dans un autre langage et dépendant du système.
 jar.exe : Permet de compresser les classes Java ainsi que tous les
fichiers nécessaires à l'exécution d'un programme (graphiques, sons,
etc.). Il permet en particulier d'optimiser le chargement des applets sur
Internet.
 jarsigner.exe : Un utilitaire permettant de signer les fichiers archives
produits par jar.exe.

23
Configuration de l’environnement (1/2)

2
3

24
Configuration de l’environnement (2/2)

 Définir la variable d’environnement Path qui doit


contenir le chemin d’accès à JDK:
 JAVA_HOME=C:\Program Files (x86)\Java\jdk1.6.0_03
 Path=%JAVA_HOME%\bin

 ClassPath =C:\Program
Files (x86)\Java\jdk1.7.0\lib\tools.jar

25
Outils de développement

 Editeur de texte ASCII : éditeur windows


comme NotPad++ ou un éditeur spécifique
pour les développeurs JAVA comme Jcreator
 IDE (Integrated Developement
Environment): NetBeans, Eclipse …

26
Identificateurs
 Un identificateur JAVA peut contenir:
 [a..z, A..Z, $, _]{a..z, A..Z, $, _, 0..9, Unicode}
 Les noms de classes commencent par une
majuscule : Etudiant
 Les mots contenus dans un identificateur
commencent par une miniscule: ageEtudiant au lieu
de mettre âge étudiant
 Les constantes sont en majuscules et les mots sont
séparés par le caractère souligné « _ » :
 UNE_CONSTANTE
27
Concernant le fichier source JAVA
Dans un fichier source, il faut respecter les contraintes
suivantes :
 un fichier source possède l'extension .java
 un fichier source peut contenir plusieurs classes mais une
seule doit être publique
 si un fichier contient une classe publique, celle-ci doit
porter le même nom que le fichier.
 la classe contenant la méthode main doit être publique,
afin que la machine virtuelle y ait accès
 une classe non publique reste accessible à toutes les
classes du même package.
28
Commentaires

 Sur une seule ligne : //


 Sur plusieurs lignes : */**..*../*

29
Types de données: types primitifs (1/2)
Primitive Valeurs Taille
char 0 à 65 535 16 bits
byte -128 à +127 8 bits
short -32 768 à +32 767 16 bits
int -2 147 483 648 à
+ 2 147 483 647 32 bits
long 64 bits
float de ± 1.4E-45 à ± 3.40282347E38 32 bits
double 64 bits
boolean true ou false 1 bit
void - 0 bit 30
Types primitifs (2/2)

 Ils sont déclarés de la manière suivante:


 int age;
 Char a;
 Float salaire ;
 Ils peuvent aussi être initialisé lors de la
déclaration
 int age=20;

31
Casting des primitifs (1/4)

 Le casting ou le transtypage signifie la


conversion d’un type vers un autre
 Vers un type plus général. On parle alors de sur-
casting ou de sur-typage.
 Vers un type plus particulier. On parle alors de sous-
casting ou de sous-typage.
 Exemple :
 int i = 10 ;
 char c = (char)i;

32
33
Casting de primitifs (2/4)

 Le sur-casting peut se faire:


 Implicitement: int a=6; long b; b=a;
 ou explicitement : b=(long)a;
 Sous-Casting ne peut se faire qu’explicitement :
 1: double a = (doucle)5.5;
 2 : float c = (float)a;
 4 : int d = 8;
 5 : byte f = (byte)d;

34
Casting de primitifs

 Un cast entre types primitifs peut entraîner une


perte de données
 La conversion d'un int vers un short peut donner
un nombre différent du nombre de départ:
int i = 32768;
short s = (short) i;
System.out.println(s); -32767;

35
Casting de primitifs (3/4)

 Exemple: il peut aussi entraîner un manque


de précision
 long 11 = 928999999L;
 float f = (float) 11;
 System.out.println(f); 9.29E8
 long 12 = (long) f;
 System.out.println(l2); 929000000

36
Casting des primitifs (4/4)

 char → int, long /cast implicite


 char c = '@',
 int i = c;
 System.out.println (i) → 64 le rang du caractère '@'dans
le codage
 (char → short, byte) et (long, int, short ou
byte)→ char /cast explicite
 char c = '@';
 short s = (short) c;

37
Les wearpers de primitifs(1/3)

38
Les wearpers de primitifs (2/3)
Classe
 Primitive
Character char
Byte byte
Short short
Integer int
Long long
Float float
Double double
Boolean boolean
Void -
BigInteger - -
BigDecimal -
39
Utilisation des primitives et wearpers
Exemple:
 double v1=5.5; // v1 est une primitive
 Double v2=new Double(5.6); // v2 est un objet
 long a=5; // a est une primitive
 Long b=new Long(5); // b est un objet
 Long c= 5L; // c est un objet
 System.out.println("a="+a);
System.out.println("b="+b.longValue());
System.out.println("c="+c.byteValue());
 System.out.println("V1="+v1);
 System.out.println("V2="+v2.intValue()); 
Résultat:
 a=5
 b=5
 c=5
 V1=5.5
 V2=5

40
Wearpers de primitifs (3/3)

 long a=5; // a est une primitive


 Long b=new Long(5); // b est un objet
 System.out.println("a="+a);
 System.out.println("b="+b.longValue());
 System.out.println("c="+c.byteValue());

41
Opérateurs

 Arithmétiques
 + -* /
 % (modulo)
 ++ --(pré ou post décrémentation)
 Logiques
 && (et) ||(ou) !(négation)
 Relationnels
 == != < > <= >=
 Affectations
 = += -= *= … 42
Structures de contrôle conditionnelle (1/2)
 L'instruction conditionnelle if
if (expression) instruction;
ou :
if (expression) {
instruction1;
instruction2;
}
 L'instruction conditionnelle else
if (expression) {
instruction1;
}
else {
instruction2;
} 43
Structures de contrôle conditionnelle (2/2)
 Les instructions conditionnelles imbriquées
if (expression1) {
bloc1;
}
else if (expression2) {
bloc2;
}
else if (expression3) {
bloc3;
}
else {
bloc5; }
44
Structure de contrôle Switch (1/2)
switch( variable) {
case valeurN: instrN;break;
default: instr;break;
}
 Exemple:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.print("Donner un nombre:");
Scanner clavier=new Scanner(System.in);
int nb=clavier.nextInt();
switch(nb){
case 1 : System.out.println("Lundi");break;
45
case 2 : System.out.println("Mardi");break;}}}
Structure de contrôle Switch (2/2)

 (Nouveauté des énumérations dans JAVA 8….) An enumeration is like a


fixed set of constants (a finite values).
Season summer = Season.SUMMER)
switch (summer) {
case WINTER:
System.out.println("Get out the sled!");
break;
case SUMMER:
System.out.println("Time for the pool!");
break;
default:
System.out.println("Is it summer yet?");
} 46
Structure de contrôle for
for
(initialisation;test;incrémentation)
{
instructions;
}
Exemple :
for (int i = 2; i < 10;i++) {
System.out.println("I="+i);
}
47
Structure de contrôle While
 Exemple : While.. do
 int s=0;int i=0;
 while (i<10){
 s+=i;
 i++;
 }
 System.out.println("Somme="+s);
 Exemple :do.. while
 int s=0;int i=0;
 do{
 s+=i;
 i++;
 }while (i<10);
 System.out.println("Somme="+s);

48
Exercice 1

 Ecrivez un programme Java qui lit un nombre


et indique s'il est positif, négatif ou s'il vaut
zéro et s'il est pair ou impair.

49
Correction

50
Exercice 2

51
Notions d’objet et de classes

Objet
Classe
Attribut
Méthode

52
Objet

 L’objet se caractérise par des attributs , ce qui


permet de définir l’état de l’objet lors de l’attribution
des valeurs à chacun des attributs . Il possède
également des opérations décrivant son
comportement.
 Objet = état + comportement et une identité unique
 L’état rassemble les valeurs instantanées de tous les
attributs de l’objet.
 Le comportement est défini par les opérations que l’objet
peut effectuer
 L’identité signifie l’adresse ou la référence ou encore le
handle d’un objet 53
Objet

une Voiture
un Compte

Attributs (état):
couleur = bleue Attributs :
poids = 979 kg débit
puissance = 12 CV crédit
capacité carburant = 50 l Opérations :
conducteur = Dupont déposer (somme)
vitesse instantanée = 50 km/h retirer (somme)
Opérations : avoirSolde ()

démarrer ()
déplacer ()
mettreEssence ()
54
Classe

 Une classe permet de représenter un ensemble


d’objet ayant les mêmes caractéristiques et le
même comportement
 Comme son nom l’indique, permet d’en bâtir une
classification
 Une classe est également un modèle de définition
des objets
 Afin de créer des objet, il faut instancier la classe
qui les représente
55
Classe

 Une classe est défini par des attributs et des


méthodes (UML)
 Une méthode représente une procédure, un
programme exécutant des instructions.
 Il existe deux méthodes particulières concernant
une classe :
 Une méthode de création d’un objet
« CONSTRUCTEUR »
 Une méthode de destruction « DESTRUCTEUR »

56
Classe : Déclaration des attributs

 type nomAttribut; ou
 type nomAttribut = expressionInitialisation;

Import java.awt.color;
class Point {
Type double x = 0;
primitif
double y = 0;
Type Color c;
objet
...
} 57
Classe : déclaration d’une méthode
 Signature d’une méthode:
 <typeRetour>nomMethode(<liste
de paramètres>) {<corps de la méthode>}
 float Calculer(float prix,int quantité)

 si la méthode a un type de retour elle doit contenir au


moins une instruction : return expression
double max (double a, double b) {
double valMax;
if (a < b) valMax = b;
Else valMax = a; return valMax; }
58
Classe : déclaration d’une méthode

 Les variables locale d’une méthode ne sont


accessibles que dans le bloc d’instruction de cette
méthode. Lorsque la méthode se termine elles sont
perdues.
 C’est pour cette raison que deux méthodes peuvent
avoir même identificateurs de variables locales
 Deux classes différentes peuvent avoir des
membres de nom identique car l’accès à ces
membres se fait via des objets
59
Classe : visibilité des membres

 L’accessibilité d’une classe et des membres d’une


classe, appelée encore visibilité permet de mettre en
évidence le concept d’encapsulation (UML)
 Ainsi il existe quatre types:
 private (-) : accessibilité à l’intérieur de cette classe
 protected (#) : accessibilité à l’intérieur de cette classe, aux
classes dérivées de cette classe.
 public (+) : accessibilité à partir de toute entité interne
ou externe à la classe autorisation par défaut

60
Classe: visibilité des classes

 public: la classe peut être utilisée par n’importe


quelle autre classe
 package : la classe ne peut être utilisée que par
les classes appartenant au même package
 Exemple
package A; package A; package B;
public class Public classeB import A.ClasseA;
ClasseA extend classeA public class
{ClasseA a;} {ClasseB b;} ClasseC {
ClasseA a;
ClasseB b; Non
}
61
Exemple (1)

 Création d’une classe Personne:


 Une personne est décrite par deux informations:
 son nom, enregistré en majuscules
 la société où elle travaille.
 Une personne est capable de s'identifier, en affichant
les informations qui la caractérisent.

62
Exemple (2)


 et une classe PersonneTest afin de tester la classe Personne

63
Exemple (4)

 L’accès aux informations doit être contrôlé


 Si la classe Personne définit deux variables
d’instance nom et société, le programmeur qui
utilise un objet Personne ne doit pas pouvoir
affecter sans contrôle une nouvelle valeur à l’une
ou l’autre de ces variables.
 Accès public ou privé ?

64
Exemple (5) : contrôler l’accès aux
données

 Maintenant, si on écrit : (dans Main.java)

65
Exemple

 Le compilateur refuse la seconde instruction :


 p.nom, privée, est inaccessible pour l’utilisateur de la
classe Personne.

 Ainsi il n'est plus possible de venir changer les


données de la classe (ou propriétés) directement.
 On pourra changer la valeur de ces propriétés à
travers des méthodes qui vérifieront la justesse des
informations entrées 66
Exemple: Contrôler l’instanciation
 Si on écrit dans la classe Main le code
suivant:

 L’exécution affichera :

67
Exemple
 Quand le concepteur de la classe n’a pas spécifié
de mécanisme d’instanciation, Java en fournit un
par défaut, appelé constructeur par défaut.
 Le constructeur par défaut initialise chaque
variable d’instance avec une valeur par défaut :null
 Règles de gestion :
 Une personne a toujours un nom. Ce nom ne peut pas
changer. C'est une chaîne de caractères, dans laquelle
les lettres sont en majuscules.
 Une personne est capable de s'identifier en affichant les
informations qui la caractérisent.
68
Exemple : Définir un constructeur

 Un constructeur public Personne (String


leNom){…}

69
Exemple : Définir constructeur

 On ne peut plus donc créer d’objet Personne sans


nom

70
Exemple : Ajouter d’autres règles

 Une personne n'est pas forcément associée à une


société.
 Une personne doit pouvoir indiquer si elle est ou non
salariée (c'est-à-dire si sa société est identifiée).
 Lorsqu'une personne est associée à une société, cette
société est identifiée par une chaîne ne comportant pas
plus de 32 caractères, dans laquelle les lettres sont en
majuscules.

71
Exemple : Ajouter d’autres règles

72
Exemple : les accesseurs
 Comment changer de société ?
 Aucun moyen d’associer une société à une personne
 la variable d’instance sociéte est privée: il faut donc accéder via
une méthode: String taSocieté()…

73
Exemple:

74
Création des objets: la notion de
constructeur

 La création d’un objet à partir d’une classe est


appelée instanciation
 1 : obtention de l’espace mémoire
 2 : appel de méthodes particulières, les constructeurs,
définies dans la classe.
 3 : renvoi d’une référence sur l’objet (son identité)

75
Création d’un objet : la notion du
constructeur
 On utilise la commande new suivie du
constructeur de la classe.
 La commande new Crée un objet dans
l’espace mémoire et retourne l’adresse
mémoire de celui-ci
 Cette adresse mémoire devrait être affectée à
une variable qui représente l’identité de
l’objet.
 Cette référence est appelée handle.

76
Bilan

 Le constructeur par défaut est encore appelé constructeur


sans paramètres ou constructeur implicite.
 Un constructeur est une méthode particulière, en général
publique
 l’identificateur est le même que celui de la classe.

 Dès qu’un constructeur explicite (Constructeur paramétré)


est défini, le constructeur par défaut n’est plus disponible,
sauf si le programmeur le rétablit en définissant
explicitement un constructeur sans paramètres.

77
Notion d’envoi de message
 pour "demander" à un objet d'effectuer une
opération , il faut lui envoyer un message
 Un message est composé de trois parties
 Une référence désigne l'objet à qui le message est
envoyé
 Le nom de la méthode à exécuter
 Les paramètres de la méthode
 Exemple: il s’agit de demande à l’objet personne
« p » de réaliser les opérations suivantes:
 p.taSociete()
 p.vaTaSociete(« FST ») 78
Sécurité

Problème : Comment empêcher l'accès à


certains attributs tout en donnant la
possibilité de les modifier/consulter ?

⇒ Solution : Définir des accesseurs


Accesseur en lecture

Un accesseur en lecture est une fonction de la


classe permettant de récupérer le contenu
d'un de ses attributs.

int GetMois()
{
return Mois;
}
Accesseur en écriture

Un accesseur en écriture est une procédure de


la classe permettant de modifier le contenu
d'un de ses attributs.

void SetMois(int mois)


{
Mois = mois;
}
Protéger les attributs de la classe CDate
class CDate void SetMois(int mois)
{ {
private: if( mois < 1 || mois >= 12 )
int Jour; mois=1;
int Mois; Mois=mois;
int Année; }
public:
int GetMois() int GetJour(){ … }
{ void SetJour(int jour ) { … }
return Mois;
} int GetAnnee() { … }
void SetAnnee(int annee){ … }
};
Notion d’accesseurs
 Il existe deux types de méthodes d’accès aux attributs privés d’une classe:
 accesseurs ou Getters : lire la variables privés
 mutateurs ou Setters : modifier les variables privés
 Les getters sont des méthodes qui commencent toujours par le mot get et
finissent par le nom de l’attribut
 Les getters retourne toujours le même type que l’attribut correspondant.
 Par exemple, dans la classe Personne, nous avons défini un attribut privé :
private String nom;
 Le getter de cette variable est :
public String getNom( ){
return nom;
}
 Les setters sont des méthodes qui commencent toujours par le mot set et
finissent par le nom de l’attribut. Les setters sont toujours de type void et
reçoivent un paramètre qui est de même type que la variable:
 Exemple:
public void setNom( String n ){
this.nom=n; 83
}
L’utilisation de « this »

 Dans un constructeur, le mot-clef this désigne


l'objet qui est construit.
 Dans une méthode, ce mot-clef désigne l’objet qui
traite le message

84
Notion d’accesseurs
public class Application {
public static void main(String[] args)
{
Personne p=new Personne();
p.setNom("Meunier");
System.out.println(p.getNom());
}
}

85
Référence et égalité des objets

86
Notion avancée: Overloading (surcharge)
 Appliquée aux constructeurs et méthodes
 définir des méthodes ou constructeurs possédant
le même nom mais dont les arguments diffèrent


87
Notions avancées: Modificateur « Static »

 Lorsqu’on veut déclarer une information


correspondant à l’ensemble du domaine d’une
classe et pas uniquement une instance particulière
d’une classe
 Autrement dit, lorsque les instances d’une classe
donnée ne peuvent pas disposer d’une valeur
propre de cette information, alors :
 Il s’agit d’une variable de classe et non pas une
variable d’instance ou encore une variable dont la
valeur est la même pour toute les instances
88
Notions avancées: Modificateur « Static »

89
Notions avancées: Modificateur « Static »

 En conclusion:
 L’accès à une variable de classe dans le corps d’une
méthode : NomClasse.variable (ne pas mettre
(this.variable)
 L’appel d’une méthode statique : NomCLasse.méthode
(ne pas mettre objet.méthode)
 à l’intérieur du corps d’une méthode statique il n’est
possible d’accéder qu’aux membres statiques de 90 la
classe
Notions avancées: Modificateur « Static »

 directement par leur nom dans le code de la


classe où ils sont définis
 en les préfixant du nom de la classe en
dehors du code de la classe
 NomDeLaClasse.nomDeLaVariable
 NomDeLaClasse.nomDeLaMéthode(liste de
paramètres)
 n'est pas conditionné par l'existence d'instances
de la classe
 Math.PIMath.cos(x) Math.toRadians(90)...
91
Notions avancées : Modificateur « final »

 Le modificateur final est utilisé pour indiquer que


la valeur d'une variable ne peut jamais être
changée c’est-à-dire une constante
 Il peut être utilisé pour une variable d’instance ou
de classe
 Déclarer une variable constante statique :
 private static final float PI=3,14;

92
Signification de « system.out.println() »

 System: Classe System du package java.lang


 Out : Variable de classe :(référence un objet
de type PrintStream)
 Println: Méthode d’instance de la classe
PrintStream du package java.io

93
Quelques mots sur la méthode main()

 String arg[] ???


 Chaque classe dispose d’une méthode main()
 arg : tableau d’objets String (chaînes de
caractères) contenant les arguments de la ligne de
commande

94
Exercice d’application
 On souhaite créer une application qui permet de manipuler des segments.
 Un segment est défini par la valeur de ses deux extrémités extr1 et extr2.
 Pour créer un segment, il faut préciser les valeurs de extr1 et extr2.
 Les opérations que l’on souhaite exécuter sur le segment sont :
 ordonne() : méthode qui permet d’ordonner extr1 et extr2 si extr1 est supérieur à
extr2
 getLongueur() : méthode qui retourne la longueur du segment.
 appartient(int x) : retourne si x appartient au segment ou non.
 toString() : retourne une chaîne de caractères de type SEGMENT[extr1,extr2]
 Faire une représentation UML de la classe Segment.
 Implémenter en java la classe Segment
 Créer une application TestSegment qui permet de :
 Créer objet de la classe Segment avec les valeurs extr1=24 et extr2=12.
 Afficher l’état de cet objet en utilisant la méthode toString().
 Afficher la longueur de ce segment.
 Afficher si le point x=15, appartient à ce segment.
 Changer les valeurs des deux extrémités de ce segment. 95
 Afficher à nouveau la longueur du segment.

Вам также может понравиться