Série 4:
Types avancés

Buts

Le but de cette série est de vous faire travailler avec quelques types prédéfinis de Java: les caractères, les tableaux et les chaînes de caractères. Référez-vous aux transparents et, éventuellement, aux vidéos du MOOC pour résoudre les exercices.


Exercice 1: Manipulation d'un tableau (-, Niveau 0)

Nous allons dans cet exemple écrire un programme permettant à l'utilisateur de calculer la moyenne de classe ainsi que les écarts à la moyenne du futur test du cours d'informatique.

Vu le nombre d'étudiants suivant le cours, il est impossible de stocker la note de chaque étudiant dans une variable distincte. Nous avons donc besoin d'un tableau. L'ébauche du programme est la suivante :

import java.util.Scanner;
class Moyenne {
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {
        
        // Demande le nombre d'étudiants à l'utilisateur
        int nombreEtudiants;
        System.out.print("Donnez le nombre d'etudiants : ");
        nombreEtudiants = scanner.nextInt();

        double moyenne = 0.0;
        // Initialise un tableau pouvant contenir autant
        // de notes que d'étudiants

        double [] notes = new double[nombreEtudiants];

    }
}

Maintenant que notre tableau est déclaré, nous pouvons le remplir en demandant à l'utilisateur la note de chaque étudiant. Puisque le nombre d'itérations est connu, nous allons utiliser une boucle for. Ainsi, à chaque itération, nous pouvons demander une note et la stocker dans une case du tableau. On en profite aussi pour calculer la somme des notes au fur et à mesure qu'on les reçoit.

import java.util.Scanner;
class Moyenne {
    private static Scanner scanner = new Scanner(System.in);
    public static void main(String[] args) {

        // Demande le nombre d'étudiants à l'utilisateur
        int nombreEtudiants;
        System.out.print("Donnez le nombre d'etudiants : ");
        nombreEtudiants = scanner.nextInt();

        double moyenne = 0.0;
        // Initialise un tableau pouvant contenir autant
        // de notes que d'étudiants

        double[] notes = new double[nombreEtudiants];


        // Lecture des notes
        for (int i=0; i < nombreEtudiants; i++) {
            System.out.print(" Note etudiant " + i + " : " );

            // Stocke la note du ième étudiant

            // dans la ième case du tableau
            notes[i] = scanner.nextDouble();
            moyenne = moyenne + notes[i];
        }
    }
}

Il est maintenant possible de calculer la moyenne de classe et d'afficher l'écart à la moyenne pour chaque étudiant.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import java.util.Scanner;

class Moyenne {

    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        // Demande le nombre d'étudiants à l'utilisateur
        int nombreEtudiants = 0;
        System.out.print("Donnez le nombre d'etudiants : ");
        nombreEtudiants = scanner.nextInt();

        double somme = 0.0;
        // Initialise un tableau pouvant contenir autant
        // de notes que d'étudiants
        double[] notes = new double[nombreEtudiants];
        // Lecture des notes
        for (int i=0; i < nombreEtudiants; i++) {
            System.out.print(" Note etudiant " + (i + 1) + " : " );
            // Stocke la note du ième étudiant
            // dans la ième case du tableau
            notes[i] = scanner.nextDouble();
            somme = somme + notes[i];
        }
        
        double moyenne = somme / nombreEtudiants;

        // Affichage des résultats
        System.out.println("Moyenne de classe : " + moyenne);
        System.out.println(" Etudiant : note (ecart a la moyenne)"); 
        for (int i = 0; i < nombreEtudiants; i++) {
            System.out.println( "  " + i + " : " + notes[i] + " ("
                + (notes[i] - moyenne) + ")");
        }
    }
}

Exemple d'exécution du programme :

Donnez le nombre d'etudiants : 4
 Note etudiant 0 : 4.0
 Note etudiant 1 : 4.0
 Note etudiant 2 : 5.0
 Note etudiant 3 : 6.0
Moyenne de classe : 4.75
 Etudiant : note (ecart a la moyenne)
  0 : 4.0 (-0.75)
  1 : 4.0 (-0.75)
  2 : 5.0 (0.25)
  3 : 6.0 (1.25)
  


Exercice 2: Quiz du MOOC (MOOC, Niveau 1)

Pour préparer le cours du mercredi 11.10.2023, vous pouvez, après avoir visionné les vidéos en lignes de la semaine 4 et de la semaine 5 de MOOC, répondre aux quiz des mêmes semaines : quiz de la semaine 4 et quiz de la semaine 5.


Exercice 3: Norme Unicode (type char, Niveau 1)

Vérifiez que vous savez convertir entre les codes et les caractères de la norme Unicode en écrivant un petit programme, par exemple intitulé Codes.java, avec le fonctionnement suivant:

Exemple d'exécution :
Unicode de * : 42
Unicode de 9 : 57
Unicode de W : 87
Caractere correspondant a l'Unicode 34 : "
Caractere correspondant a l'Unicode 65 : A
Caractere correspondant a l'Unicode 123 : {



Exercice 4: Conversion majuscules/minuscules (type char, Niveau 1)

Selon la norme Unicode, les lettres majuscules A..Z ont les codes 65 à 90 et les lettres minuscules a..z ont les codes 97 à 122:

                   LA NORME UNICODE
------------------------------------------------------------------
65 = A   79 = O       97  = a    111 = o
66 = B   80 = P       98  = b    112 = p
67 = C   81 = Q       99  = c    113 = q
68 = D   82 = R       100 = d    114 = r
69 = E   83 = S       101 = e    115 = s
70 = F   84 = T       102 = f    116 = t
71 = G   85 = U       103 = g    117 = u
72 = H   86 = V       104 = h    118 = v
73 = I   87 = W       105 = i    119 = w
74 = J   88 = X       106 = j    120 = x
75 = K   89 = Y       107 = k    121 = y
76 = L   90 = Z       108 = l    122 = z
77 = M                109 = m
78 = N                110 = n 
-------------------------------------------------------------------
Ecrivez un programme Conversion.java qui demande à l'utilisateur d'entrer une seule lettre A..Z ou a..z au clavier (utilisez par exemple l'instruction scanner.next().charAt(0)).
Le programme affiche un message d'erreur si le caractère entré ne fait pas partie des lettres demandées. Sinon, s'il s'agit d'une lettre minuscule, la version majuscule de la lettre est affichée. Si au contraire il s'agit d'une lettre majuscule, la version minuscule de la lettre est affichée.

Exemples d'exécution:

Entrez une seule lettre A..Z ou a..z : A
Version minuscule : a

Entrez une seule lettre A..Z ou a..z : b
Version majuscule : B

Entrez une seule lettre A..Z ou a..z : *
Caractere non valable


Exercice 5: Produit scalaire (Tableaux, Niveau 1)

Écrivez un programme Scalaire.java qui calcule le produit scalaire de deux vecteurs, implémentés au moyen de tableaux unidimensionnels. Votre programme devra utiliser (entre autre) les éléments suivants :

Rappel :
Le produit scalaire de a par b est: a·b = a1*b1 + a2*b2 + ... + an*bn

Exemple: a = (5, 3, -1)   b = (2, 1, 2)   a·b = 11



Exercice 6: Triangle de Pascal (Tableaux, Niveau 2)

Le nombre de combinaisons de p objets parmi n est donné par le triangle de [Blaise] Pascal ci-dessous:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 ...... ... ... ...... 1
1 ...... ... ...... 1
1 ...... ... ... ......... 1

Les relations suivantes y sont définies :





Écrire un programme qui demande à l'utilisateur d'entrer un nombre n>=1, qui stocke le triangle de Pascal de taille n dans un tableau de tableaux et qui l'affiche. Le tableau de tableaux devra avoir la structure triangulaire ci-dessus, ce qui signifie qu'on ne réservera pas de place mémoire inutile pour des éléments indéfinis du triangle.

Méthode :
Le programme doit afficher le triangle de Pascal ligne par ligne. Notez que pour calculer la ième ligne, il suffit de connaître la ligne i-1.



Exercice 7: Comment s'appelait Napoléon? (String, Niveau 1)

Dans cet exercice, vous devez écrire un programme Napoleon.java permettant de retrouver le nom d'une personne dont on connaît le prénom.
L'information d'association entre les noms et les prénoms connus sera représentée sous la forme d'une variable noms de type String contenant une série de prénoms suivis des noms qui leur sont associés:

String noms = "Napoleon Bonaparte Bill Gates Claudia Schiffer Martina Hingis ";
Méthode :

Indication : pensez à rechercher les espaces séparant les mots de la chaine à partir de la position index, ce qui vous permet d'isoler le nom recherché. Vous pourrez utiliser les méthodes prédéfinies suivantes de la classe String :

Dans un premier temps vous pourrez supposer que la chaîne introduite par l'uilisateur correspond toujours effectivement à un prénom. Vous pourrez ensuite réfléchir à une solution plus complexe (qui, par exemple, signale à l'utilisateur qu'il s'est trompé s'il a introduit un nom au lieu d'un prénom).



Exercice 8: Palindrôme (String, Niveau 2)

Un palindrome est un mot que l'on peut lire dans les deux sens. La distinction entre majuscules/minuscules n'a aucune importance pour la lecture d'un palindrome. Si on ne tient pas compte des caractères non alphabétique (i.e. ' ', ',', '-' et '\''), une phrase complète peut aussi être considérée comme un palindrome.

Exemples de palindromes:

Otto
Elu par cette crapule
Esope reste ici et se repose
Tu l'as trop ecrase, Cesar, ce Port-Salut
A man, a plan, a canal, Panama
Exemples de non-palindromes:
Cours de Java
Le pont de la rivière Kwai
Ecrivez un programme Palindrome.java qui :
  1. lit une chaine de caractères du clavier;
  2. l'épure (ou plutôt en épure une copie) des caractères non alphabétiques;
  3. et teste si la chaîne ainsi épurée est un palindrome.

Exemple d'exécution:

Entrez un mot ou une phrase : Otto                                     
C'est un palindrome !
Pour ce programme, il convient d'utiliser plusieurs méthodes prédéfinies de la classe String, comme par exemple charAt(), toLowerCase() et length().

Indication : l'appel Character.isLetter(c), où c est un caractère, permet de tester si c est alphabétique (Character.isLetter(c) est à écrire tel quel. nous verrons un peu plus tard ce que sont les méthodes statiques qui s'utilisent de cette façon).


Exercice 9: Échauffement avec les tableaux dynamique (Tableaux dynamiques, Niveau 1)

Rappel : Pour utiliser le type ArrayList, il faut importer les classes ie définissant ce type, au moyen de la directive :

import java.util.ArrayList

En vous aidant si nécessaire d'un programme, répondez aux questions suivantes :

A : Quelles valeurs contient le tableau tab après l'exécution du programme suivant? Expliquez.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import java.util.ArrayList;

class DynamicArray1 {

    public static void main(String[] args) {
        final int TAILLE = 10;
        ArrayList<Integer> tab = new ArrayList<Integer>();
        for (int i = 0; i < TAILLE; ++i) {
            tab.add(tab.size());
        }
    }
}

B : Quelles valeurs contient le tableau tab2 après l'exécution du programme suivant? Expliquez.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import java.util.ArrayList;

class DynamicArray2 {
    public static void main(String[] args) {
        ArrayList<Integer> tab1 = new ArrayList<Integer>();
        tab1.add(99);
        tab1.add(1);
        tab1.add(0);

        ArrayList<Integer> tab2 = new ArrayList<Integer>();
        for(int i=0; i < tab1.size(); ++i) {
            tab2.add(tab1.get(0));
        }
    }
}



Exercice 10: Nombres premiers (Tableaux dynamiques, Niveau 2)

Ecrivez le programme Premiers.java qui stocke dans un tableau dynamique l'ensemble des nombres premiers compris entre 2 et 100 et affiche le contenu de ce tableau.

Test de la primalité d'un nombre n (algorithme) :

  1. Vérifier si le nombre n est pair (si oui, il n'est pas premier sauf si c'est 2).

  2. Pour tous les nombres impairs (plus grand que 1) inférieurs ou égaux à la racine carrée de n, vérifier s'ils divisent n. Si ce n'est pas le cas, alors n est premier.

Votre programme devrait produire un affichage ressemblan à ceci :
Les nombres premiers compris entre 2 et 100 sont les suivants : 
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97


Exercice 11: Devoir du MOOC (MOOC, Niveau 2)

Les devoirs du MOOC, même s'ils ne sont pas notés pour vous, sont un bon moyen de vous entraîner aussi. Depuis cette semaine, vous disposez de suffisamment d'outils pour aborder le devoir de la semaine 4 (notez qu'il n'y a pas de devoir en semaine 5 du MOOC mais que le devoir qui apparaît en semaine 4 teste aussi des notions de la semaine 5).


Exercice 12: Tutorial IntelliJ 6 : Modification du modèle de fichiers (IntelliJ, Niveau 0)

Il est d'usage courant, en pratique, que les fichiers sources commencent par un commentaire donnant diverses informations sur le fichier, telles que : l'auteur du programme, sa date de création, des notes sur les droits d'auteurs etc. Ce tutoriel vous montre comment configurer IntelliJ de sorte à ce que ce genre de commentaires soient automatiquement inclus, à chaque création de nouveaux fichiers.

Commencez par cliquer sur "Window->Preferences" dans le menu principal :

Dans le dialogue "Preferences", ouvrez ensuite "Editor->Code Style->File and Code Templates". Vous devriez voir apparaître le menu suivant :

Sélectionnez " Class " (Vous pouvez aussi procéder comme suit pour "Enum" et "Interface" que vous retrouverez souvent dans le futur) dans la liste et ajoutez le texte suivant comme affiché sur l'image ci-dessous.

/*
 *	Author:      John Doe
 *	Date:        ${date}
 */

N'oubliez pas de remplacer le nom existant par le votre !

Confirmez ensuite en cliquant sur OK et fermez le dialogue "Preferences". Créez enfin une nouvelle classe pour tester votre nouvel environnement. Le début du fichier contenant cette classe devrait alors ressembler à ceci :



Exercice 13: Tutorial Eclipse 7 (inutile si vous travaillez avec IntelliJ) : Modification du modèle de fichiers (Eclipse, Niveau 0)

Il est d'usage courant, en pratique, que les fichiers sources commencent par un commentaire donnant diverses informations sur le fichier, telles que : l'auteur du programme, sa date de création, des notes sur les droits d'auteurs etc. Ce tutoriel vous montre comment configurer Eclipse de sorte à ce que ce genre de commentaires soient automatiquement inclus, à chaque création de nouveaux fichiers.

Commencez par cliquer sur "Window->Preferences" dans le menu principal :

Dans le dialogue "Preferences", ouvrez ensuite "Java->Code Style->Code Templates". Vous devriez voir apparaître le menu suivant :

Sélectionnez "Code->New Java Files" dans la liste et cliquez sur "Edit ...". Introduisez alors le texte suivant au début du chablon (Pattern) :

/*
 *	Author:      John Doe
 *	Date:        ${date}
 */

N'oubliez pas de remplacer le nom existant par le votre !

Confirmez ensuite en cliquant sur OK et fermez le dialogue "Preferences". Créez enfin une nouvelle classe pour tester votre nouvel environnement. Le début du fichier contenant cette classe devrait alors ressembler à ceci :



Dernière mise à jour: 13/10/2023  (Revision: 1.2)