JAVA année 2017 CP 2 – série n°2 Exercices sur les méthodes statiques et les tableaux En JAVA une fonction est une méthode STATIC. La signature d'une méthode static en java est la suivante : public static typeDuRésultat NomDeLaMéthode (liste des paramètres) { déclarations de variables (locales à cette méthode) instructions de résolution du probléme retourne valeurRésultat; //au moins 1 fois } La méthode est dite « static » car elle ne s'applique pas sur des objets. Les méthodes static ne sont pas les méthodes les plus utilisées en Java. Les méthodes static sont souvent utilisées comme des fonctions outils. Lorsqu'elles sont déclarées dans un autre fichier que le fichier qui l'utilise, on utilise le nom du fichier qui contient la méthode comme préfixe. Par exemple, la méthode Math.sqrt indique que la fonction static sqrt est dans le fichier Math. Exercice 1 La méthode des rectangles permet d’approximer l’intégrale d’une fonction f continue. Cette méthode consiste à découper en n intervalles [ai, ai+1], de longueur identique m, l’intervalle [a,b] sur lequel on veut intégrer la fonction f, puis à additionner l’aire des rectangles de hauteur a+a f ( i i + 1 ) et de largeur m. L’aire A, approximation de l’intégrale f sur l’intervalle [a,b] aura 2 pour valeur : n A=∑ m× f ( i=1 Illustration : a i+ ai+ 1 ) 2 Programmez en Java une fonction (méthode static) qui calcule l’intégrale de la fonction cosinus sur un intervalle [a,b]. Testez votre méthode, par exemple, sur l’intervalle [0,/2]. Exercice 2 Écrire une classe DateEntiere qui comprend un ensemble de méthodes statiques permettant la manipulation de dates au format entier (jour sur 2 chiffres 01 à 31, mois sur deux chiffres 01 à 12 et année sur 4 chiffres). • DateValide qui retourne vrai si la chaîne passée en paramètre est valide. Il faudra prendre en compte le problème du maximum des jours de mois à 30,3= 31, 28 ou 29 jours). Vous pouvez consulter la classe String https://docs.oracle.com/javase/8/docs/api/java/lang/String.html pour apprendre comment récupérer une sous-chaîne de caractère. La classe Integer https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html comporte des méthodes statiques permettant de transformer un String en entier ; • public static int getJour(String s) qui retourne le numéro entier de la date si elle au format entier de date, sinon retourne -1 ; • public static int getMois(String s) et static int getAnnée(String s) même chose pour le mois et l'année ; • public static String enLettres(String s) retourne la date sous forme textuelle jour mois en toute lettre et année en chiffre, retourne la chaîne vide si la date n'est pas au format ; • écrire une classe MainDate qui demande à l'utilisateur d'entrer une date et affiche cette date en toute lettre si elle est valide ou affiche date invalide dans le cas contraire (cf ci-dessous) java MainDate Entrez une date 14022017 14 février 2017 Entrez une date 34012017 La date 34012017 est invalide public class DateEntiere { public static boolean dateValide(String s){ if (s.length() != 8) return false; int jour; jour = Integer.parseInt(s.substring(0,2)); if ((jour < 1) || (jour > 31)) return false; int mois = Integer.parseInt(s.substring(2,4)); if ((mois < 1) || (mois > 12)) return false; int année; année = Integer.parseInt(s.substring(4,s.length())); if ((année < 1000) || (année > 9999)) return false; return true; } public static int getJour(String s){ if (dateValide(s)){ int jour; jour = Integer.parseInt(s.substring(0,2)); return jour; } } return -1; public static int getMois(String s){ if (dateValide(s)){ int mois = Integer.parseInt(s.substring(2,4)); return mois; } return -1; } public static int getAnnée(String s){ if (dateValide(s)){ int année; année = Integer.parseInt(s.substring(4,s.length())); return année; } } return -1; public static String entouteLettre(String s){ String res=""; if (dateValide(s)){ int jour = getJour(s); int mois = getMois(s); int année = getAnnée(s); res = jour + " "; switch(mois){ case 1: res = res + "janvier "; break; case 2: res = res + "février "; break; case 3: res = res + "mars "; break; } res = res + année; return res; } } return ""; } import java.util.Scanner; public class MainDate { public static void main(String [] args){ String date; Scanner sc = new Scanner(System.in); System.out.print("Entrez une date "); date = sc.next(); if (DateEntiere.dateValide(date)) System.out.println(DateEntiere.entouteLettre(date)); else System.out.println("La date " + date + " est invalide"); } } Exercice 3 - Classe java.util.Arrays Écrivez une classe TestArrays dont la méthode main 1.crée un tableau de 150 nombres entiers et le remplit avec des nombres tirés au hasard entre 1 et 200 (pensez à utiliser la classe Random) ; 2.affiche les valeurs du tableau en utilisant la classe Arrays ; 3.trie ce tableau par ordre croissant en utilisant la classe Arrays ; 4.affiche à nouveau les valeurs du tableau (pour vérifier le tri) ; 5.tire 20 nombres au hasard et indique s'ils appartiennent au tableau (et en ce cas, donne la position dans le tableau) en utilisant la recherche dichotomique (voir classe Arrays). import java.util.Random; import java.util.Arrays; public class Ex0211 { public static final int MAX = 150; public static void main(String [] args){ Random r = new Random(); int [] tab = new int[MAX]; // génération de nombres aléatoires for(int i = 0; i < tab.length; i++) tab[i] = r.nextInt(200) + 1; // affichage System.out.println(Arrays.toString(tab)); // trie du tableau Arrays.sort(tab); // affichage System.out.println("\n tableau trié " + Arrays.toString(tab)); // recherche de 20 valeurs for(int i = 0; i < 20; i++){ int val = r.nextInt(200) + 1; System.out.print("recherche de " + val); if (Arrays.binarySearch(tab,val) > 0) System.out.println(" trouvé à la position " + Arrays.binarySearch(tab,val)); else System.out.println(" non trouvé"); } } } Exercice 4 Écrire une classe TestTableau dont la méthode main : • crée un tableau de 100 nombres entiers et le remplit avec des valeurs aléatoires entre 100 et 200 ; • affiche les valeurs du tableau (classe Arrays) • affiche la plus petite valeur du tableau, la plus grande et la moyenne des éléments du tableau • affiche l’élément le plus fréquent dans le tableau et affiche sa fréquence d’apparition. Pour ce dernier point vos écrirez une fonction de signature public static int frequence(int [] t, val) qui retourne la fréquence de val dans le tableau t import java.util.Random; import java.util.Arrays; public class Ex0212 { public static final int MAX = 100; public static void main(String [] args){ Random r = new Random(); int [] tab = new int[MAX]; // génération de nombres aléatoires for(int i = 0; i < tab.length; i++) tab[i] = r.nextInt(100) + 101; // affichage System.out.println(Arrays.toString(tab)); System.out.println("plus petite valeur " + min(tab)); System.out.println("plus grande valeur " + max(tab)); System.out.println("moyenne " + moyenne(tab)); // calcul de la fréquence pour tout le tableau int maxFrequence = frequence(tab,tab[0]); int val = tab[0]; int f; for(int i = 1; i < tab.length; i++){ f = frequence(tab,tab[i]); if (f > maxFrequence){ maxFrequence = f; val = tab[i]; } } System.out.println("le nombre le plus fréquent est " + val + " présent " + maxFrequence + " fois"); } public static int min(int [] t){ int valMin = t[0]; for(int i = 0; i < t.length; i++) if (t[i] < valMin) valMin = t[i]; } return valMin; public static int max(int [] t){ int valMax = t[0]; for(int i = 0; i < t.length; i++) if (t[i] > valMax) valMax = t[i]; } return valMax; public static double moyenne(int [] t){ double m = 0.0; for(int i = 0; i < t.length; i++) m += (double) t[i]; } return m / (double) t.length; /* retourne la fréquence de val dans le tableau t */ public static int frequence(int [] t, int val){ int f = 0; for(int i = 0; i < t.length; i++) if (t[i] == val) f++; return f; } } Exercice 5 Écrire un programme permettant de représenter un histogramme sur un écran (cf. la figure cidessous) à partir d'un tableau H de 10 entiers. Vous commencerez par générer un tableau de 10 entiers dont chaque élément prend une valeur comprise entre -6 et +6. * * * * * + + + + + * * * * * * * * * * * * * + + + + * * * Chaque colonne i contient un nombre d'étoiles égal à la valeur de H[i]. L'axe des abscisses sera représenté comme une ligne de '+' mais si H[i] = 0, on affichera une '*'. H -1 -3 2 -2 3 0 4 2 -2 -1 Remarque : on fait l'hypothèse que le tableau H est compatible avec la taille de l'écran. import java.util.Random; import java.util.Arrays; public class Ex0213 { public static void main(String [] args){ final int TAILLE_TABLEAU = 10; Random r = new Random(); int [] h = new int[TAILLE_TABLEAU]; /*--- création de valeurs aléatoires entre -6 et + 6 pour le tableau ---*/ int val; for(int i = 0; i < h.length; i++){ val = r.nextInt(7); if (r.nextBoolean()) h[i] = val; else h[i] = -val; } /*--- affichage des valeurs du tableau ---*/ System.out.println(Arrays.toString(h)); /*--- création de l'histogramme ---*/ /*--- partie positive ---*/ for(int i = 6; i > 0; i--){ for(int j = 0; j < h.length; j++) if (h[j] >= i) System.out.print("* "); else System.out.print(" "); System.out.println(""); } /*--- axe des abscisses ---*/ for(int i = 0; i < h.length; i++) System.out.print("++"); System.out.println(""); /*--- partie négative ---*/ for(int i = -1; i > -7; i--){ for(int j = 0; j < h.length; j++) if (h[j] <= i) System.out.print("* "); else System.out.print(" "); System.out.println(""); } } }