TP n°1.9: Introduction à Java

Introduction à un langage de programmation:Java

Nous avons vu que lorsqu'on écrit une page en html il y avait des mots significatifs et des règles d'écriture. Ceci est propre à tout langage de programmation et même à tout langage.

L'apprentissage d'un langage de programmation est lié à une époque. Apprendre à programmer en 2012 ne se fait pass de la même manière que dans les années 70. A cette époque les lycéens apprenaient à programmer sur des calculatrices ayant peu de mémoire et le langage utilisé était pauvre et peu lisible. Ce qui laissait croire que programmer était nécessairement une activité ésotérique et de mauvaises habitudes étaient ainsi prises.

Java est un langage abstrait peu facile au premier abord mais dont la philosophie aide à bien programmer.

Ecrire en Java: côté pratique

Nous allons utiliser 4 bureaux pour travailler: un pour lire le texte du TP avec le navigateur Web Firefox,un autre pour écrire les programmes en Java avec l'éditeur de texte gedit,un autre pour compiler le programme et l'exécuter avec le terminal (voir plus loin), enfin un dernier pour se repérer dans les répertoires et les fichiers.

Depuis une dixaine d'années, c'est devenu une tradition que le premier programme écrit consiste à afficher le message "Hello world! à l'écran. Ceci est d'ailleurs suivi dans le tutoriel d'initiation à Java fourni par la compagnie qui distribue maintenant Java, voir ici

Suivons la tradition:copier le petit programme suivant et coller le dans un fichier enregistré sous Hello.java avec gedit dans le répertoire Java de votre dossier personnel:


	class Hello{
		public static void main(String[] args){
			System.out.println("Hello world!");
		}
	}

Aller dans le terminal , à l'ouverture du terminal vous êtes dans votre répertoire personnel et vous voyez à l'écran par exemple ceci:


amoretti@poste2B30:~$
ce qui signifie que vous êtes dans le répertoire personnel (le ~) de l'utilisateur Amoretti sur le poste 2 de la salle B30. Le prompt $ signifie que le terminal attend une commande de votre part.

Dans votre répertoire personnel, il y a un répertoire nommé Sites où vous avez tous les fichiers .html, les icônes pour réaliser des pages Web. De même vous avez un répertoire Java où vous mettrez tous vos programmes Java.

Entrez dans le terminal la commande


cd java
cd comme change directory. Vous demandez à aller dans le répertoire Java. Vous allez obtenir à l'écran ceci.

amoretti@poste2B30:~/Java$
Dans le répertoire Java se trouve le fichier Hello.java. Vous aller faire compiler ce fichier par un compilateur en entrant la commande suivante:

amoretti@poste2B30:~/Java$javac Hello.java
Le compilateur va vérifier que le fichier est correctement écrit en Java, et s'il y a des erreurs, il va vous aider à les corriger, puis le compilateur va transformer ce fichier texte .java en un fichier .class c'est du bytecode, en gros "du binaire compréhensible par la machine" (on verra cela plus tard)

Aller voir dans votre répertoire java, vous devez avoir deux fichiers Hello.java et Hello.class

Essayer d'ouvrir Hello.class avec gedit Qu'observez vous ?.

Essayer d'ouvrir Hello.class avec Jeex Qu'observez vous ?.

S'il n' y a pas d'erreurs on peut passer à l'exécution du programme en entrant la commande suivante et vous voyez tout de suite le résultat à l'écran

  amoretti@poste2B30:~/Java$java Hello Hello World!

Beaucoup de charabia pour peu de choses! Mais on finira par (bien) parler !

Eh oui c'est le sentiment que l'on a la première fois que l'on rencontre ce genre d'univers. Pour bien assimiler et comprendre il faudra:
Refaire plusieurs fois le chemin et comprendre les étapes.

Commençons par découvrir ensemble un programme Java avec des tests , celui de la résolution d'une équation du second degré dans l'ensemble des nombres réels.

 
 
class Delta { 
public static void main (String[] args) {
		/*déclaration du type des variables a, b, c les coefficients de
		l'équation ax^2 +bx +c=0
		 ce sont des nombres à virgule, il y a un type pour cela
		 appelé double*/
		double a; 
		double b; 
		double c;
		// on lit au clavier les valeurs de a, b et c en utilisant la
		// classe Isn
		System.out.println("Entrez le coefficient de degré 2");
		a = Isn.readDouble(); 
		System.out.println("Entrez le coefficient de degré 1");
		b = Isn.readDouble(); 
		System.out.println("Entrez le nombre");
		c = Isn.readDouble();
		// on déclare le type du  delta, le discriminant de l'équation
		// et on le calcule
		double delta = b*b-4*a*c;
		//si delta est négatif pas de solutions réelles
		if (delta < 0.0){
				System.out.println("Pas de solutions dans R");
		}
		else{
				if (delta == 0.0){
						System.out.print("Une solution : ");
						System.out.println(-b/(2*a));
				}
				else{
						System.out.print("Deux solutions :");
						System.out.print((-b-Math.sqrt(delta))/(2*a));
						System.out.print("et");
						System.out.println((-b+Math.sqrt(delta))/(2*a));
				}
		}
	}
}

 

Recopier le programme ci-dessus et sauvegarder le avec gedit dans un fichier nommé Delta.java dans le répertoire Java. Les auteurs du manuel ont créé une classe nommée Isn.java pour faciliter la gestion des entrées sorties dans les programmes Java que vous aurez à écrire cette année ainsi que la gestion des graphiques. Télécharger ici la classe Isn.java.

Compiler les deux fichiers .java et exécuter uniquement le fichier Delta .

Faire l'exercice 1.10 du manuel

Savoir modifier un programme existant

Modifier le programme pour avoir éventuellement des solutions dans l'ensemble des nombres complexes

Voir la correction que si vous avez suffisamment cherché
 
 
class DeltaC { 
public static void main (String[] args) {
		/*déclaration du type des variables a, b, c les coefficients de
		l'équation ax^2 +bx +c=0
		 ce sont des nombres à virgule réels, il y a un type pour cela
		 appelé double*/
		double a; 
		double b; 
		double c;
		// on lit au clavier les valeurs de a, b et c en utilisant la
		// classe Isn
		System.out.println("Entrez le coefficient de degré 2");
		a = Isn.readDouble(); 
		System.out.println("Entrez le coefficient de degré 1");
		b = Isn.readDouble(); 
		System.out.println("Entrez le nombre");
		c = Isn.readDouble();
		// on déclare le type du  delta, le discriminant de l'équation
		// et on le calcule
		double delta = b*b-4*a*c;
		
		if (delta < 0.0){
				System.out.println("Deux solutions complexes conjuguées");
				System.out.println("z1 = "+ -b/(2*a) + " "+-Math.sqrt(-delta)/(2*a)+"i");
				System.out.println("z2 = "+ -b/(2*a) + " "+Math.sqrt(-delta)/(2*a)+"i");
		}
		else{
				if (delta == 0.0){
						System.out.print("Une solution : ");
						System.out.println(-b/(2*a));
				}
				else{
						System.out.print("Deux solutions :");
						System.out.print((-b-Math.sqrt(delta))/(2*a));
						System.out.print("et");
						System.out.println((-b+Math.sqrt(delta))/(2*a));
				}
		}
	}
}

 

Apprendre par analogie

Créer un programme pour savoir si deux vecteurs du plan de coordonnées (a;b) et (c;d) sont colinéaires. On calculera le déterminant ad-bc.

Voir la correction que si vous avez suffisamment cherché
 
 
class Colineaire { 
public static void main (String[] args) {

		// coordonnées du premier vecteur
		double a; 
		double b; 
		
		// coordonnées du deuxième vecteur
		double c;
		double d;
		
		// on lit au clavier les valeurs de a, b, c et d en utilisant la
		// classe Isn
		
		System.out.println("Entrez les coordonnées du premier vecteur du plan");
		System.out.println("Entrez l'abscisse:");
		a = Isn.readDouble(); 
		System.out.println("Entrez l'ordonnée:");
		b = Isn.readDouble(); 
		
		System.out.println("Entrez les coordonnées du deuxième vecteur du plan");
		System.out.println("Entrez l'abscisse:");
		c = Isn.readDouble(); 
		System.out.println("Entrez l'ordonnée:");
		d = Isn.readDouble(); 
		
		// on déclare le type du  determinant, le déterminant des deux vecteurs
		// et on le calcule
		double det = a*d-b*c;
		
		//si det est nul les vecteurs sont colinéaires 
		
		if (delta == 0.0){
				System.out.println("Les vecteurs sont colinéaires");
		}
		else{
				System.out.println("Les vecteurs ne sont pas colinéaires");
		}
	}
}

 

Opérations sur les booléens:& et && , | et ||

Dans certains programmes le booléen qui se trouve après le if est composé de deux booléens soit par un et écrit en Java & ou un ou écrit en Java |

Ainsi on va traduire "n plus grand que 100 et paire " par (n >= 100 & n % 2 == 0)

Un booléen a deux valeurs soit true (vrai) soit false (faux)

a & b est vrai si et seulement si les deux booléens a et b le sont

a | b est faux si et seulement si les deux booléens a et b le sont

Parfois on n'a pas forcément envie de tester l'un des deux booléens pour gagner du temps ou éviter des problèmes de définition d'où les connecteurs && et ||

a && b faux si a est faux même si b n'est pas défini

a || b vrai si a est vrai même si b n'est pas défini

Télécharger ici le programme Bataille Navale du manuel et constater la présence des connecteurs && et ||

Que se passerait -il si on les remplaçait par & et | ?

Faire les exercices 1.1 puis 1.2 du manuel

Bien comprendre les deux cas de l'exercice 1.5 du manuel et les coder

Voir la correction ici

Comprendre un peu mieux la philosophie Java

Pour comprendre un peu mieux tout le charabia lire le tuto suivant ici

Avec gedit ouvrir le fichier Isn.java et chercher la méthode readInt() de la classe Isn, utilisée dans le programme BatailleNavale