Vous êtes sur la page 1sur 5

SRC1 TP algorithmique Java

TP d'algorithmique.

Objectif :Maîtriser les bases de l'algorithmique (boucles, conditionnelles, fonctions, tableau, ...)

1 Structure générale d'une classe java. Le main.


1.1 Les bases

En java, tout le code doit être placé dans des classes. Ainsi, nous pouvons placer le code de notre premier exemple
entre lse accolades, dans le code suivant :

class MaPremiereClasse{

}
En pratique, cela ne sura pas, car lorsque l'on voudra exécuter le code produit, le compilateur nous dira qu'il faut
une méthode main(). Nous plaçons donc dans notre classe une fonction main(), qu'il faudra écrire exactement ainsi :

class MaPremiereClasse{
public static void main(String args[]){

}
}
Le programme commencera par chercher le main, et exécutera les instructions qu'il y voit. Une instruction
est une ligne de code, qui doit respecter rigoureusement une certaine grammaire : en particulier, elle se termine par un
point-virgule. Pour demander d'acher bonjour (et passer à la ligne ensuite) par exemple, il faut écrire l'instruction

System.out.println("bonjour");

1.2 Remarques

• Le nom d'une classe doit commencer par une majuscule ; s'il est composé de plusieurs mots, les mots sont collés,
et tous en majuscule. Cela n'est pas obligatoire, mais c'est une convention de nommage que tout le monde suit !
• Quand on rentre dans un nouveau bloc de code, délimité par des accolades, on indente le code, ce qui signie
que l'on décale légèrement les lignes à l'intérieur des accolades par rapport à celles à l'extérieur. Sans cela, le
code devient très vite illisible.
• Retenez que le point de départ d'un programme java est le main. La signication des diérents mots (static,
public, String, ..) sera expliquée plus tard.

1.3 Exécution d'un code java

Déplacez l'instruction qui permet d'acher bonjour au bon endroit (dans le main). Pour exécuter ce code il faudra
faire dans une fenêtre de commande

javac MaPremiereClasse.java
puis
java MaPremiereClasse
La première instruction compile le code : elle vérie d'abord que la syntaxe et la grammaire sont correctes, puis elle
produit du code (MaPremiereClasse.class) qui sera compréhensible et exécutable par la machine virtuelle java installée
sur l'ordinateur sur lequel vous travaillez. La deuxième instruction exécute le code machine produit.

2 Les variables ; l'aectation


Une variable correspond à un certain espace mémoire où l'on peut stocker une valeur. En java, une variable doit
être d'un certain type (entier, chaîne de caractères,...), selon ce type, plus ou moins de mémoire est réservée. Exemple :

int a = 10;
a=a-2;
a++;
SRC1 TP algorithmique Java

Ces trois instructions touchent à la déclaration et à l'utilisation d'une variable. La première est une contraction de deux
instructions : déclaration de la variable (a sera un entier) et initialisation à 10. La deuxième est une aectation. Le
signe égal ne fonctionne pas comme en maths. L'ordinateur évalue d'abord l'expression à droite du égal, qui doit avoir
une valeur concrète au moment où l'instruction est traitée. Ici c'est le cas, a vaut 10, donc a−2 vaut 8. Ensuite, cette
valeur est stockée dans la variable qui est à gauche (donc à gauche du =, il faut une variable). La dernière instruction
est l'incrémentation, qui est identique à l'instruction a=a+1 : augmente a de 1.

1. Faites en sorte, en utilisant une variable de type chaîne de caractères (String), de stocker dans une variable
votre nom, puis de l'acher, puis de changer cette variable en y stockant cette fois le nom de votre voisin, puis
de l'acher.

2. concaténation : transformer la dernière instruction pour qu'avant le nom, il y ait écrit bonjour, monsieur ou
bonjour madame. Pour coller deux chaînes de caractères (ici, bonjour monsieur ou bonjour madame avec le
contenu de la variable de type chaîne de caractères)

3 Les conditionnelles
En informatique, lorsque l'on code, on ne connaît pas encore toutes les valeurs qu'auront nos variables, loin de là.
Quel produit aura choisi le client de notre magasin en ligne ? Quelles photos l'utilisateur de notre galerie va-t-il vouloir
acher ? On est alors amené à utiliser des conditionnelles : si tel choix a été fait, on fera telle série d'instructions,
sinon, on fera telle autre. En java, la conditionnelle se fait sur le modèle :

if (i==0){
// Code à faire si i vaut 0
}
else if (i==1){
// Code si i vaut 1
}
else{
// code dans les autres cas
}
On peut mettre autant de else if que l'on veut (ou ne pas en mettre s'il n'y a que deux possibilités), mais notez que :
 Le égal de comparaison est diérent du égal d'aectation : on compare en utilisant == et non =
 else signie sinon et comprend tous les autres cas, donc else (i>=2) n'a absolument aucun sens !
Faites un code qui permet de dénir une variable i, de lui aecter une valeur entre 1 et 7, et qui ache si i vaut 1
nous sommes lundi, si i vaut 2, nous sommes mardi, etc...

4 Les boucles
A partir de là, vos réponses doivent gurer dans un rapport que vous rendrez à la n des 2 premiers
TP. Ce rapport sera noté. L'un des grands avantages qu'il y a à utiliser un langage de programmation est que l'on peut
automatiser les tâches répétitives, et gagner beaucoup de temps. Le premier pas à connaître dans cette direction est
l'utilisation des boucles, qui permettent de faire un certain nombre de fois des instructions. En utilisant des variables,
on peut changer légèrement ce qui est fait d'un pas à l'autre de la boucle. En java, les boucles se construisent sur cette
exemple :

for (int i=0; i<10; i++){


// Ici les instructions à faire 10 fois
// Elles peuvent dépendre de i, qui est déclarée dans ce bloc et n'est donc connu qu'ici.
}

while ( assertion ) {
// Ici les instructions à faire tant que assertion est vraie. assertion doit être vraie ou fausse
// et doit devenir fausse à un moment, sinon on peut rester infiniment dans la boucle!
}
Exemples :

int a=3;
int res=1;
for (int i=0; i<10; i++){
res=3*i;
System.out.println("3 fois "+i+" égal " + res);
}

int i=2;
SRC1 TP algorithmique Java

while (i<12){
System.out.println("non, i n'est pas encore plus grand ou égal à 12");
i+=2;
}
Les questions qui suivent s'appuient sur les exemples précédents.

1. A quoi est équivalent l'instruction i+ = 2 ? Cherchez la réponse en testant, ou bien sur internet.

2. Combien de fois passe-t-on dans la boucle while ? Que se passe-t-il s l'on supprime l'instruction i+ = 2 ?
3. Essayez de reformuler le for de sorte à ce qu'il n'y ait qu'une seule instruction et non deux. Essayez d'enlever les
accolades du for. Est-ce possible ? Si l'on rajoute alors une instruction derrière le for, sans remettre les accolades,
sera-t-elle considérée comme dans le for, ou comme étant en dehors ?

5 Les fonctions
5.1 Les bases

Les algorithmes produits dans le monde de l'entreprise font très rapidement plusieurs milliers de lignes. Si tout
était écrit directement dans le main, le projet deviendrait vite illisible et ingérable. On peut donc séparer le code en
plusieurs chiers, et chaque chiers en plusieurs fonctions, chargées chacune d'exécuter une tâche précise. Imaginons
une application qui permet de gérer un club de sport : on veut pouvoir inscrire un nouveau membre, le suppri-
mer lorsqu'il quitte le club, consulter la liste des membres, la trier, etc.. Chacune des tâches citées peut être prise
en charge par une fonction. Par exemple, on dénit une fonction affiche_menu() qui permet d'acher le menu
des diérentes possibilités de l'application à l'utilisateur (insérer un membre, consulter les membres, etc...). Dans le
main, on appelleaffiche_menu(), on analyse sur quelle touche appuie l'utilisateur, et selon, on appelle une fonction
insererUtilisateur(), ou une fonction consulter(), etc... Il nous faut voir comment, en java, déclarer une fonc-
tion et comment l'appeler.

La déclaration d'une fonction se fait sur ce modèle :


public static void f1(){
// Ici le code de la fonction f1(), différentes instructions qui seront exécutées seulement lorsque f1()
// est appelée.
}
Cette déclaration se place dans la classe, mais en-dehors du main. Le main() est lui-même une fonction, spéciale
en ce sens que c'est le point d'entrée du programme.

L'appel d'une fonction se fait ainsi : f1(); lorsque cette instruction est lue, le programme va chercher les
instructions contenues dans f1() et les exécuter. On peut appeler une fonction depuis une autre fonction, mais on ne
peut pas déclarer une fonction dans une autre fonction.

1. Faites une fonction, que l'on appellera premiereFonction(), qui est chargée d'acher "bonjour, je suis " suivi de
votre nom, suivi de "et j'ai ", suivi de votre age.

2. Appelez cette fonction deux fois dans le main, de sorte que la phrase dénie plus haut s'ache deux fois, et
entre les deux appels, faites autre chose (un autre achage par exemple). Dans le rapport, montrez l'ensemble
de votre main.

5.2 Les paramètres d'entrée

Les fonctions sont très utiles, car elles évitent les redondances. Ce n'est pas encore forcément évident, car pour
l'instant nos applications sont très peu complexes et comportent peu de lignes, donc pas de redondance, pas de nécessité
d'organiser son code. Mais dans un code plus long et complexe, lorsqu'on est amené à utiliser plusieurs fois le même
code, il vaut mieux utiliser des fonctions pour que ce code soit contenu dans une fonction, appelée autant de fois que
nécessaire. Si par exemple on est amené à créer plusieurs fois dans une application un formulaire d'authentication, on
va le faire dans une fonction authentification(), fonction qui sera appelée dès que nécessaire. Toutefois, on aimerait
pouvoir faire varier légèrement le comportement de la fonction en fonction de tel ou tel paramètre. Par exemple, notre
formulaire d'authentication peut s'acher avec un champ en rouge indiquant que le login ou le mot de passe est faux,
ou non. Dans ce cas, on utilise des paramètres d'entrée :

public static void authentification(boolean messageErreur){


// Ici le code permettant d'afficher le formulaire d'authentification, avec un message d'erreur
// si messageErreur est à true, et sans si le paramètre d'entrée messageErreur est à false.
}
messageErreur est un paramètre d'entrée : il faut le déclarer entre les parenthèses qui suivent le nom de la fonction.
Cette variable est connue dans la fonction seulement, mais on ne sait pas encore quelle sera sa valeur quand on écrit la
SRC1 TP algorithmique Java

fonction authentication. On appelle ensuite la fonction ainsi : authentification(true); . Au moment de cet appel,
le code contenu dans la fonction authentication() est exécutée, en remplaçant chaque occurrence de messageErreur
par la valeur true. On peut utiliser plusieurs paramètres d'entrée, en les séparant par une virgule. Exemple :

public static void authentification(boolean messageErreur, String message){


// Ici le code, on peut utiliser les variables messageErreur et message,
// dont la valeur sera définie à l'appel
}
On peut alors utiliser cette fonction par exemple ainsi : authentication(true, "erreur de mot de passe") ;

Les paramètres d'entrée rendent nos fonctions lpus puissantes, puisque la fonction authentication() à deux pa-
ramètres d'entrée peut faire plus de choses, dans des cas plus généraux (dénir un formulaire d'authentication avec
ou sans message d'erreur, et on l'on peut personnaliser le message d'erreur) que la fonction authentication() sans
paramètres.

1. Faites une fonction qui permet d'acher la table de multiplication des 10 premiers chires par 3. Appelez cette
fonction dans le main. Mettez le code dans le rapport.

2. (un paramètre d'entrée) Perfectionnez cette fonction de façon à ce qu'elle puisse acher la table de multiplication
des 10 premiers chires par n'importe quel chire, qui sera décidé à l'appel. Appelez cette fonction dans le main().
Mettrez le code dans le rapport.

3. (deux paramètres d'entrée) Perfectionnez-la encore de façon à ce qu'on puisse acher la table de multiplication
des n premiers chires par n'importe quel chire m, où la valeur de n et m ne sera décidée qu'à l'appel de la
fonction.

5.3 Le paramètre de sortie

Une fonction peut produire quelque chose qui peut être à son tour réutilisé pour un autre calcul, une autre
instruction, ou une autre fonction. Exemple :
public static double log(double x) double res ; //La variable où l'on stockera le résultat // Ici le code qui permet
de calculer log(x) et le stocker dans res return res ; // c'est ce que produit la fonction qui est retourné ; cela doit être
un double ici
On peut l'appeler ainsi, par exemple dans le main() : double c; c=log(10);. Lorsque la deuxième instruction est
exécutée, on appelle d'abord la fonction log() en attribuant 10 comme valeur à son paramètre d'entrée. Ce que log
retourne peut être imprimé, ou stocké dans une variable pour être réutilisé.

1. Faites une fonction doubler() qui prend en entrée un réel x et qui ressort son double. Appelez cette fonction dans
le main() de sorte à acher le double de 3.
x
2. Faites une autre fonction, f1(), qui prend en entrée un réel x et qui en sortie retourne
2 −3. Utilisez cette fonction
en l'appelant.

3. Sans reprogrammer une autre fonction, calculer, en utilisant les deux fonctions précédentes, 2 × ( 25 − 3) et 2×5
2 −3
, et achez les résultats.

6 Exercices divers
class Exo1{
public static void main(String args[]){
int a=3;
int b=4;
int c;
c=f1(b++);
f2(c,b);
}

public static int f1(int x){


x=x*2+1;
x=x*x;
return x-5;
}

public static void f2(int a, int b){


for (int i=0;i<=3;i++){
if (a>i){
res=res+b+a;
}
else{
SRC1 TP algorithmique Java

res=res+b+i;
}
} // Fin du for
}
}

1. Recopiez dans le rapport le code précédent, en numérotant les lignes, puis dites dans quel ordre sont exécutées
les instructions.

2. Décrivez, dans l'ordre d'exécution, les diérentes opérations qui sont faites lorsque le compilateur rencontre les
lignes c = f 1(b + +); et f 2(c, b).
3. Comment décririez-vous à un ami au téléphone, le plus brièvement et le plus clairement possible, ce que fait la
fonction f1() ?

Vous aimerez peut-être aussi