L2 année 2015-2016 TD 1 -POO et langage JAVA CORRIGE Exercice 1 : Somme Écrire un programme qui permet de calculer la somme de deux entiers donnés au clavier et d'afficher le résultat de cette somme. import java.util.*; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner un entier x :"); int x=in.nextInt(); System.out.println("Donner un entier y :"); int y=in.nextInt(); int s=x+y; System.out.println("La somme des 2 nombres est "+s); } } Exercice 2 : Écrire un programme qui permet d’échanger les valeurs de 3 entiers (valeur de B en A, valeur de C en B, valeur de A en C). import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner un entier a :"); int a=in.nextInt(); System.out.println("Donner un entier b :"); int b=in.nextInt(); System.out.println("Donner un entier c :"); int c=in.nextInt(); int t=a; a=b; b=c; c=t; System.out.println("La permutation donne "); System.out.println("a = "+a+" b = "+b+" c = "+c); } } 1/16 Exercice 3 : Un ouvrier est payé 3,39 € pour les heures de base et 4,32 € pour les heures supplémentaires. Il subit une retenue de base de 2,2% sur son salaire brut (le salaire final est le salaire obtenu en tenant compte des heures de base, des heures supplémentaires et de la retenue de base). Écrire un programme qui connaissant le nombre d’heures de base et le nombre d’heures supplémentaires permet de calculer le salaire final de l’ouvrier. import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner le nombre d'heures de base :"); int nb_heures_base=in.nextInt(); System.out.println("Donner le nombre d'heures supplémentaires :"); int nb_heures_sup=in.nextInt(); final double tarif_heures_base = 3.39; final double tarif_heures_sup=4.32; final double taux_ret=0.022; double Sal_brut, Sal_final, Retenue; Sal_brut =nb_heures_base*tarif_heures_base+nb_heures_sup*tarif_heures_sup ; Retenue = Sal_brut*taux_ret; Sal_final =Sal_brut - Retenue ; System.out.println("le salaire de l'ouvrier est : " + Sal_final); } } Exercice 4 : Écrire un programme qui accepte un caractère du clavier et affiche sa nature. La nature d’un caractère est supposée être : Alphabétique majuscule Alphabétique minuscule Chiffre Ou autre(caractères spéciaux) import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner un caractère :"); String str=in.nextLine(); char c= str.charAt(0); System.out.println("c'est "+c); if ((c>='A') && (c<='Z')) System.out.println("c'est une lettre majuscule"); else if ((c>='a') && (c<='z')) System.out.println("c'est une lettre minuscule"); else if ((c>='0') && (c<='9')) System.out.println("c'est un chiffre"); else System.out.println("c'est un caractère autre (spécial) "); } } 2/16 Exercice 5 : Écrire un programme qui permet de saisir un réel et d’afficher sa valeur absolue import java.util.*; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner un réel x :"); double x =in.nextDouble(); double Abs_x; if (x<0) Abs_x=-x; else Abs_x=x; System.out.println("La valeur absolue de "+x+" est " +Abs_x); } } Exercice 6 : - Écrire un programme qui calcule le min et le max de deux entiers saisis au clavier. import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner un entier x :"); int x =in.nextInt(); System.out.println("Donner un entier y :"); int y =in.nextInt(); int min,max; if (x<y) { min=x; max=y; } else { min=y; max=x; } System.out.println("Le min est "+min+" et le max est " +max); } } 3/16 - Écrire un programme qui calcule le min et le max de trois entiers saisis au clavier. import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner un entier x :"); int x =in.nextInt(); System.out.println("Donner un entier y :"); int y =in.nextInt(); System.out.println("Donner un entier z :"); int z =in.nextInt(); int min=0; int max=0; if ((x<=y) && (x<=z)) { min =x; if (y<z) max= z; else max =y; } else { if (y<z) { min=y; if (x<z) max= z; else max = x; } else { min=z; if (x<y) max= y; else max= x; } } System.out.println("Le min est "+min+" et le max est " +max); } } 4/16 Exercice 7 : Écrire un programme qui permet lire la couleur d’un feu de croisement (rouge ou vert) et d’afficher le message au piéton qui arrive. import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner la couleur du feu :"); String str=in.nextLine(); char feu= str.charAt(0); if ((feu=='V') || (feu=='v') ) System.out.println("c'est vert PASSEZ "); else if ((feu=='R') || (feu=='r') ) System.out.println("c'est rouge STOP "); else System.out.println("ERREUR "); } } Exercice 8 : Écrire un programme qui permet lire la couleur d’un feu de croisement (rouge, orange ou vert) et d’afficher le message au véhicule qui arrive. VERSION 1 import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner la couleur du feu :"); String str=in.nextLine(); char feu= str.charAt(0); if ((feu=='V') || (feu=='v') ) System.out.println("PASSEZ "); else if ((feu=='R') || (feu=='r') ) System.out.println(" STOP "); else if ((feu=='O') || (feu=='o') ) System.out.println("c'est orange RALENTIR "); else System.out.println("ERREUR "); } } 5/16 VERSION 2 public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner la couleur du feu :"); String str=in.nextLine(); char feu= str.charAt(0); switch (feu) { case 'V': case 'v' : System.out.println("PASSEZ "); break; case 'R' : case 'r' : System.out.println(" STOP "); break; case 'O' : case 'o' : System.out.println("c'est orange RALENTIR "); break; default : System.out.println("ERREUR "); } } } Exercice 9 : Date du lendemain Écrire un programme qui permet de saisir une date sous forme de jour, mois, année et d’afficher la date du lendemain. ATTENTION une année est bissextile si elle est divisible par 4 ou par 100 mais pas par 400. 6/16 import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner le jour :"); int j=in.nextInt(); System.out.println("Donner le mois :"); int m=in.nextInt(); System.out.println("Donner l'année :"); int a=in.nextInt(); int jl,ml,al; Boolean bissextile=((a%4==0) ||(a%100==0)) && (a%400!=0); Boolean fin_mois=false; Boolean fin_annee=false; Boolean erreur=false; switch(m) { case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : if (j==31) fin_mois=true; break; case 4 : case 6 : case 9 : case 11 : if (j==30) fin_mois=true; break; case 12 : if (j==31) fin_annee=true; break; case 2 : if ((j==29) || (j==28) && (!bissextile))fin_mois=true; break; default : erreur=true; } if(fin_mois) { jl=1; ml=m+1; al=a; } else if(fin_annee) { jl=1; ml=1; al=a+1; } else { jl=j+1; ml=m; al=a; } System.out.println("La date du lendemain sera "+ jl+"/"+ml+"/"+al); } } 7/16 Exercice 10 : Rendre la monnaie On se propose d’écrire un programme permettant d’obtenir la suite des billets totalisant une somme donnée (dont on suppose qu’elle est un multiple de 5). Les espèces disponibles sont des billets de 50, 20, 10 et 5 euros. Le principe est de donner le billet de valeur la plus grande possible inférieure ou égale à la somme à rendre et de poursuivre la même stratégie avec la somme restante jusqu’à ce que la somme restante soit nulle. Écrire cet algorithme en utilisant les structures de contrôle suivantes : while, if et else if . On suppose que la somme donnée est un multiple de 5, cette somme sera notée s dans l’algorithme, les nombres de billets à rendre seront calculés à l’aide de 4 variables nb50,nb20, nb10 et nb5 que l’on incrémentera à chaque tour de boucle en même temps que la somme sera diminuée de la valeur du billet trouvée import java.util.Scanner; public class main { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Donner la somme à rendre int s =in.nextInt(); int nb_50=0; int nb_20=0; int nb_10 =0; int nb_5=0; while (montant multiple de 5) :"); (s != 0) { if (s >= 50) { s = s - 50; nb_50++; } else if (s >= 20 ) { s = s -20; nb_20++; } else if (s >= 10 ) { s = s -10; nb_10++; } else { s = s - 5; nb_5++; } } System.out.println(nb_50+ "billets de 50 euros" ); System.out.println(nb_20+ "billets de 20 euros" ); System.out.println(nb_10+ "billets de 10 euros" ); System.out.println(nb_5+ "billets de 5 euros" ); } } 8/16 Exercice 11 : Calcul de la moyenne et du minimum des éléments d'un tableau. import java.util.Scanner; public class main { public static void main(String[] args) { final int N =10; int []T = new int[N]; int i,min,somme; double moyenne ; Scanner in = new Scanner(System.in); somme=0; for(i=0;i<N;i++){ System.out.println ("donner la valeur de T["+ i+"] : T[i]=in.nextInt(); } min =T[1]; for(i=0;i<N;i++){ somme =somme+T[i]; if (T[i] < min) min= T[i]; } moyenne=somme/N; System.out.println("La moyenne est " +moyenne); System.out.println("Le minimum est " +min); in.close(); } "); } Exercice 12 : Calcul du nombre d'occurrences d'un élément donné dans un tableau. import java.util.Scanner; public class main { public static void main(String[] args) { final int N =10; int []T = new int[N]; int i,Nb_Occ, val; Scanner in = new Scanner(System.in); for(i=0;i<N;i++){ System.out.println ("donner la valeur de T["+ i+"] : "); T[i]=in.nextInt(); } System.out.println ("donner la valeur recherchée : "); val=in.nextInt(); Nb_Occ=0; for(i=0;i<N;i++){ if (T[i] == val) Nb_Occ++;; } System.out.println("Le nombre d'occurences de la valeur " +val+" est " +Nb_Occ); in.close(); } } 9/16 Exercice 13 : Palindrome Une chaîne de caractère est dite Palindrome si elle peut être lue de gauche à droite ou de droite à gauche tel que été, laval, AZZA, AZIZA, la mariée ira mal, élu par cette crapule, esope reste ici et se repose. a) Écrire la fonction palindrome1 (T,N) qui renvoie 1 si le mot contenu dans T et de longueur n est un palindrome 0 sinon. import java.util.Scanner; public class main { public static void main(String[] args) { int i_deb,i_fin; boolean palindrome=true; Scanner in = new Scanner(System.in); System.out.println ("donner un mot : "); String mot =in.nextLine(); i_deb=0; i_fin=mot.length()-1; while (palindrome && (i_deb<i_fin)){ if (mot.charAt(i_deb)== mot.charAt(i_fin)) { i_deb++; i_fin--; } else palindrome=false; } if (palindrome) else System.out.println("C'est un palindrome "); System.out.println("Ce n'est pas un palindrome "); in.close(); } } 10/16 b) Écrire la fonction palindrome2 (T,N) qui renvoie 1 si la phrase formée de plusieurs mots séparés par des séparateurs et contenue dans T et de longueur n est un palindrome 0 sinon. import java.util.Scanner; public class main { public static void main(String[] args) { int i_deb,i_fin; boolean palindrome=true; Scanner in = new Scanner(System.in); System.out.println ("donner une phrase : "); String mot =in.nextLine(); i_deb=0; i_fin=mot.length()-1; while (palindrome && (i_deb<i_fin)){ while ((mot.charAt(i_deb)==' ' ) && (i_deb<i_fin)) { i_deb++; } while ((mot.charAt(i_fin)==' ' ) && (i_deb<i_fin)) { i_fin--; } if (mot.charAt(i_deb)== mot.charAt(i_fin)) { i_deb++; i_fin--; else } if (palindrome) else } palindrome=false; System.out.println("C'est un palindrome "); System.out.println("Ce n'est pas un palindrome "); in.close(); } } Exercice 14 : Drapeau Hollandais de Dijkstra (1dimension) Les éléments d’un tableau sont soit bleus, blancs ou rouges. Il s’agit de construire un tableau ayant les mêmes éléments mais rangés par couleur : (bleus puis blancs puis rouges) On utilisera uniquement les opérations suivantes : T[i] : accès à un élément Ech(i,j) échange de deux éléments t[i] et t[j]. 11/16 import java.util.Scanner; public class main { public static void main(String[] args) { int i_r,i_b,i; char temp; Scanner in = new Scanner(System.in); System.out.println ("Entrer le drapeau dans le désordre String Drapeau =in.nextLine(); final int N =Drapeau.length(); char [] T_Drap= new char[N]; B b R : "); for (i=0;i<N;i++) // Copier la chaîne Drapeau dans le tableau T_Drap T_Drap[i]=Drapeau.charAt(i); System.out.println("Voici votre drapeau initial : "); for (i=0;i<N;i++){ // Afficher le tableau T_Drap if (T_Drap[i]=='B') System.out.print(T_Drap[i]); else if (T_Drap[i]=='b') else System.out.print(' '); if (T_Drap[i]=='R') System.out.print(T_Drap[i]); } i=0; i_b=-1; i_r=N; while ((i<i_r)){ switch (T_Drap[i]) { case 'b' : i++; break; case 'B' : i_b++; temp=T_Drap[i]; T_Drap[i]=T_Drap[i_b]; T_Drap[i_b]= temp; //permutation des cases N° i et N°i_b i++; break; case 'R' : i_r--; temp=T_Drap[i]; //permutation des cases N° i et N°i_r T_Drap[i]= T_Drap[i_r]; T_Drap[i_r]= temp; break; } } System.out.println(); System.out.println("Voici votre drapeau final : "); for (i=0;i<N;i++){ // Afficher le tableau T_Drap if (T_Drap[i]=='B') System.out.print(T_Drap[i]); else if (T_Drap[i]=='b') else System.out.print(' '); if (T_Drap[i]=='R') System.out.print(T_Drap[i]); } in.close(); } 12/16 Exercice 15 On souhaite représenter les notes d’un ensemble d’étudiants par deux tableaux de même taille, l’un contenant leurs noms et l’autre contenant leurs notes. Le tableau des noms s’appellera tNoms et celui des notes tNotes. Exemple : Tableau de noms : Bernard Dupont Zidane Henry Barthez Tableau de notes 12.5 5 10.6 7 4.5 Les noms et les notes sont dans le même ordre. On sait ainsi que Zidane et sa note ont le même indice dans les tableaux respectifs et on peut déduire que la note de Zidane est 10,6 de même, la note de Barthez est 4,5 etc. Écrire un programme avec les méthodes et actions suivantes : 1. Une fonction trouveIndice qui étant donné un nom et un tableau de noms retourne l’indice de ce nom dans le tableau. Si le nom ne figure pas dans le tableau, la fonction doit renvoyer -1. Afin de comparer les chaînes de caractères, vous utiliserez la fonction prédéfinie equals qui renvoie un boolean, et qui étant donnés 2 chaînes s1 et s2, permet de les comparer par s1.equals(s2). 2. Écrire une fonction trouveNote qui étant donnés un nom, un tableau de noms et un tableau de notes, retourne la note correspondant au nom donné. Cette fonction doit obligatoirement utiliser la fonction trouveIndice. Si le nom n’est pas trouvé, on doit renvoyer -1 (qui n’est pas une valeur possible de note). 3. Écrire un programme principal qui déclare et initialise les tableaux tNotes et tNoms comme dans l’exemple. Ensuite le programme demande à l’utilisateur le nom d’un étudiant et lui fournit sa note. Utiliser obligatoirement la fonction trouveNote. Ce programme principal doit traiter le cas d’un nom d’étudiant ne figurant pas sur la liste en affichant un message à l’écran. Vous utiliserez obligatoirement le fait que la fonction trouveNote renvoie -1 dans ce cas là. 13/16 import java.util.Scanner; public class Main { // ******************************************************************************** static public int trouve_indice(String[]T,String nom) { int indice_nom=-1; int i=0; while ((indice_nom==-1) && (i<T.length)){ if (T[i].equals(nom)) indice_nom=i; else i++; } return indice_nom; }; // *********************************************************************************** static public double trouve_note(String [] T1,double [] T2,String nom) { int indice_nom=-1; int i=0; while ((indice_nom==-1) && (i<T1.length)){ if (T1[i].equals(nom)) indice_nom=i; else i++; } return T2[indice_nom]; }; // ************************************************************************ public static void main(String[] args) { int [] T_Not = new int[5]; double [] T_Note =new double[5]; String [] T_Nom = new String[5]; Scanner in = new Scanner(System.in); for ( int i = 0 ; i <T_Nom.length ; i ++) { System.out.println("Un nom ? ") ; T_Nom [ i ] = in.nextLine(); } for ( int i = 0 ; i <T_Note.length ; i ++) { System.out.println("Une note ? ") ; T_Note [ i ] = in.nextDouble(); } String nom = in.nextLine(); for(int j=0;j<T_Note.length;j++) System.out.println(T_Nom[j] + " "+ T_Note[j]); System.out.println("Un nom à chercher? ") ; String nom1 = in.nextLine(); int indice_nom=trouve_indice(T_Nom,nom1); System.out.println("Le nom cherché est à l'indice "+indice_nom) ; double note; if (indice_nom!=-1){ note=trouve_note(T_Nom,T_Note,nom1); System.out.println("La note relative à ce nom cherché est } else System.out.println("Le nom n'existe pas ") ; } "+note) ; } 14/16 Les fichiers : Lecture et écriture en mode texte EXERCICE 16 Ecrire un programme qui écrit dans le fichier example.txt le texte: Hello world! Voici un programme illustrant l'écriture dans un fichier CORRIGE PROGRAMME EN JAVA import import import public java.io.File; java.io.FileWriter; java.io.IOException; class main { public static void main(String[] args) { // Hello world! //Voici un programme illustrant l'écriture dans un fichier System.out.println("Bonjour EXO4 Ecriture dans un fichier "); String Chaine1="Hello world!"; String Chaine2="Voici un programme illustrant l'écriture dans un fichier"; File f = new File ("C:\\Users\\Cours Java\\MonFichier.txt"); try { FileWriter fw = new FileWriter (f); fw.write fw.write fw.write fw.write (String.valueOf (Chaine1)); ("\r\n"); (String.valueOf (Chaine2)); ("\r\n"); System.out.println("Ecriture effectuée dans le fichier Monfichier "); fw.close(); } catch (IOException exception) { System.out.println ("Erreur lors de la lecture : " + exception.getMessage()); } } } 15/16 EXERCICE 17 Ecrire un programme qui lit le fichier exemple.txt défini dans l'exemple précédent et affiche son contenu : Vous devriez obtenir : Hello world! Voici un programme illustrant l'écriture dans un fichier CORRIGE PROGRAMME EN JAVA import java.io.BufferedReader; import java.io.FileReader; import java.io.FileNotFoundException; import java.io.IOException; public class main { public static void main(String[] argv) throws IOException { BufferedReader lecteurAvecBuffer = null; String ligne; try { lecteurAvecBuffer = new BufferedReader(new FileReader("C:\\ Cours Java\\MonFichier.txt")); } catch(FileNotFoundException exc) { System.out.println("Erreur d'ouverture"); } System.out.println("Voici le contenu de Mon Fichier "); while ((ligne = lecteurAvecBuffer.readLine()) != null) System.out.println(ligne); lecteurAvecBuffer.close(); } } 16/16