Exercices sur les classes, les variables, les types et les opérateurs

Exercices sur les classes, les variables, les types et les opérateurs #

Prenez en note chaque question. Tentez par vos propres moyens, mais avec l'aide de tout le matériel et de l'Internet, de résoudre le problème. Prévoyez jusqu'à 15 minutes de travail par question. Après avoir bien travaillé la question, consultez la réponse.

N'allez pas trop vite. Il ne sert à rien de lire la question et d'immédiatement lire la réponse. Le but des exercices est de vous amener à travailler la matière. Si vous ne faites que regarder les solutions, vous n'apprenez pas grand chose. Oui, ça va plus vite, mais votre but ici n'est pas la rapidité.

Prenez note qu'il est permis d'utiliser le robot conversationnel du cours lors des exercises. Cependant vous devriez vous entraîner à produire vos propres réponses.

Réponses uniques? #

Les exercices comportent une solution vous permettant de comparer votre approche avec la nôtre. Il n'y a pas de solution unique aux problèmes en général. Vous pouvez arriver avec une solution qui est préférable ou moins bonne que celle que nous offrons. Pour faire ces questions, vous devez avoir fait toutes les lectures préalables. Vous disposez alors toujours des fondements nécessaires pour faire les exercices. Nous vous encourageons tout de même à faire vos propres recherches en complément de vos lectures. Dans certains cas, au sein de la solution que nous offrons, nous pouvons utiliser des notions techniques qui n'ont pas été vues directement dans le cours, mais qui devraient vous être facilement accessibles.

Questions/Réponses #

Question 1 #

En programmation orientée objet (comme le langage Java), quelle est la différence entre une classe et une instance?

RéponseUne classe est la description abstraite d'un concept. Une instance est la matérialisation en mémoire d'un concept. Par exemple, la classe Client et l'instance Client 11 Alice Bob.

Question 2 #

Vrai ou Faux : Le langage Java est un langage compilé en langage machine?

RéponseVrai et Faux: c'est un langage interprété par une machine virtuelle, la JVM. La code est pré-compilé dans un langage intermédiaire, le bytecode. Par la suite, lors de l'exécution, le bytecode peut être compilé en langage machine.

Question 3 #

Comment est représenté -1 en Java ?

Réponse

En Java, les entiers sont représentés en binaire selon le format « complément à deux ». Ainsi, -1 est représenté par une suite de bits où tous les bits sont à 1. Par exemple, pour un int (32 bits), -1 correspond à 0xFFFFFFFF en hexadécimal, soit 32 bits à 1.

Question 4 #

Est-ce que -0.0 est égal à 0.0 en Java ?

Réponse

En Java, -0.0 == 0.0 retourne true car la comparaison d’égalité (==) considère ces deux valeurs comme égales selon la norme IEEE 754. Cependant, il existe une différence binaire entre -0.0 et 0.0 (le signe du zéro), ce qui peut être détecté avec certaines méthodes comme Double.doubleToRawLongBits() ou en utilisant 1.0 / -0.0 (qui donne -Infinity), alors que 1.0 / 0.0 donne Infinity.

Question 5 #

À l'aide d'une classe Java et en utilisant l'arithmétique entière, vous devez calculer la moyenne des tailles de 5 enfants, puis imprimer la moyenne à la console et l'écart à la moyenne pour chaque enfant:

  • Alice : 104 cm
  • Bob : 80 cm
  • Chuck : 76 cm
  • Danielle : 110 cm
  • Éloi : 102 cm
Réponse
CalculMoyenne.java

Question 6 #

Quelle est la différence entre un int et un long ?

RéponseUn entier de type int sera alloué en mémoire à une taille de 32 bits. Sa valeur maximale absolue est donc de 2 147 483 647. L'entier de type long permet des valeurs plus grandes car il est alloué sur un espace de 64 bits (9 223 372 036 854 775 807).

Question 7 #

Que fait le code suivant ? Calculer sur papier pour s'assurer de la compréhension, puis voir la réponse ci-dessous et exécuter le code.

public class Exercice {
    public static void main(String[] args) {
        int i = 33;
        int j = 44;
        int k = 55;
        i++;
        j--;
        i = -(k + i - j);
        i = i%2;
        System.out.println("Résultat:"+ i);  
    }
}
RéponseLe résultat est 0. 1: i++ => i = 34; 2: j-- => j = 43; 3 : k + i - j = 46; 4: -46; 5: -46 % 2 = 0 (le reste de la division par 2. Comme 46 / 2 = 23. Il n'y a pas de reste);

Question 8 #

Quelle sera la valeur de x dans le code suivant?

public class Exercice {
    public static void main(String[] args) {
        int i = 11;
        int j = 22;
        long x = (i>=1) ? ++i : j++;
        System.out.println("x : " + x);
    }
}
RéponseLa réponse est 12 car l'opérateur à 3 opérandes "?:" vérifie si i est plus grand ou égal à 1 (c'est le cas), alors la valeur retournée est i pré-incrémenté de 1 : 12.

Question 9 #

Quelle est la valeur de l’expression 0xA + 10 en Java ? Expliquez pourquoi.

Réponse

0xA représente 10 en décimal, donc 0xA + 10 vaut 20.

Question 36 #

Expliquez ce qu’est un débordement (overflow) lors d’un calcul avec des entiers en Java. Donnez un exemple de code qui provoque un débordement.

Réponse

Un débordement se produit lorsqu’une opération arithmétique dépasse la valeur maximale ou minimale qu’un type peut représenter. Par exemple, un int en Java varie de -2 147 483 648 à 2 147 483 647. Si on additionne 1 à la valeur maximale, on « retourne » à la valeur minimale.

int max = Integer.MAX_VALUE;
System.out.println(max);         // 2147483647
System.out.println(max + 1);     // -2147483648 (débordement)

Question 11 #

Parmi les noms suivants, quels sont les noms de variable corrects en java (qui ne seront pas rejetés à la compilation)?

Lesquels sont conseillés ?

1) _176

2) $za21

3) 5var

4) A1234_

5) var

6) monEntier

7) &var

Réponse

Nom corrects : 1, 2, 4, 5, 6.

Noms conseillés : 5, 6. En effet à moins d’avoir de sérieuses raisons de faire autrement, il faut utiliser les minuscules pour les noms de variables simples en java, et les majuscules pour articuler les noms de variables composés comme monEntier.

Question 12 #

Comment écrit-on un nombre en notation hexadécimale en Java ? Donnez un exemple et expliquez à quoi cela sert.

Réponse

On utilise le préfixe 0x pour écrire un nombre en hexadécimal. Exemple :

int x = 0xFF; // 255 en décimal
System.out.println(x); // Affiche 255

La notation hexadécimale est utile pour manipuler des valeurs binaires, des couleurs, des adresses mémoire, etc.

Question 13 #

Soit le code suivant :

public class Main {
  public static void main(String[] args) {
    int k, i;
    int myInt = k = (i = 5) * 2;
    System.out.println(myInt);
  }    
}

Quel résultat est affiché à la console lors de l’exécution ? Pourquoi ?

  1. Une erreur
  2. 10
  3. 5
Réponse

Bonne réponse : 2.

Explication : (i=5) est une expression dont la résultat est la valeur affectée à i, c’est-à-dire 5. Ce résultat est multiplié par deux et affecté à k, puis affecté à myInt.

Question 14 #

Que fait le code suivant?

int f(int x, int y) {
    x ^= y;
    y ^= x;
    x ^= y;
    return y;    
}
Réponse

La fonction retourne la valeur qui était contenue dans la variable x au début de la fonction. Voir l'article wikipédia sur les techniques de permutation en informatique.

Question 15 #

Que va afficher ce code à l’écran?

class Main {
  public static void main(String[] args) {
    System.out.println(-1 >>> 4);
    System.out.println(-1 >>>> 4);
  }
}
Réponse

-1 et 268435455.

Question 16 #

Que calcule cette fonction?

public static boolean f(int x, int y) {
    return (x^y) < 0;
}
Réponse

La fonction retourne la valeur vraie si et seulement si un seul des deux paramètres est négatif. Par exemple, f(-1,1) est vrai, f(2,2) et f(-1,-3) sont faux.

shit

Question 18 #

Vrai ou faux... si x est un entier (int) négatif, alors -x sera un entier positif.

Réponse

Faux. Définissez int x = -2147483648. Vous trouvez alors que -x == x.

Question 19 #

Quelle est la valeur de l'expression 2083697005*101 en Java?

Réponse

L'expression 2083697005*101 est égale à 1. Cela s'explique par le fait que les entiers sont stockés avec 32 bits seulement et que la véritable valeur (210453397505) ne peut pas être représentée. Java tronque le résultat.

Question 20 #

Soit deux entiers positifs (int) x et y. Sachant que la moyenne des deux valeurs est aussi un entier, donnez une expression qui calcule cette moyenne.

Réponse

On peut la calculer avec l'expression y+(x - y)/2. Il pourrait être tentant d'utiliser l'expression (x + y)/2, mais cette dernière est incorrecte comme vous pouvez le vérifier avec ce programme:

class Main {
  public static void main(String[] args) {
    int x = 2147483647;
    int y = 2147483645;

    System.out.println((x+y)/2);
    System.out.println(y+(x - y)/2);
  }
}

Question 21 #

Soit une chaîne de caractère en Java: String s = "123";. Comment puis-je modifier la valeur de cette chaîne de caractères?

Réponse

En Java, les chaînes de caractères sont immutables, elles ne peuvent être modifiées. On ne peut donc pas modifier la valeur assigné à s. Par contre, on peut créer une nouvelle chaîne de caractères et réassigner la variable à cette nouvelle valeur (s = "1234";).

Question 22 #

Expliquez la différence entre l'ensemble des nombres non négatifs, et l'ensemble des nombres positifs.

Réponse

En informatique, on définit l’ensemble des nombres positifs comme étant les nombres plus grands que zéro. Les nombres négatifs sont les nombres plus petits que zéro. Les nombres non négatifs sont donc les nombres positifs ou nuls.

Question 23 #

Expliquez pourquoi 0.8825149536132812 est égal à 0.8825149536132813 en Java.

Réponse

Dans le cas qui nous concerne, il n'est pas possible de distinguer 0.8825149536132812 et 0.8825149536132813, des nombres à 16 chiffres significatifs. En général, il est possible de représenter l'ensemble des nombres entre -10 à la puissance 308 et 10 à la puissance 308 avec 15 chiffres de précision, mais pas 16 chiffres de précision. Les nombres 0.8825149536132812 et 0.8825149536132813 sont représentés en nombre à virgule flottante comme étant 115673 fois 2 à la puissance -17 ce qui est le nombre 0.88251495361328125.

Question 24 #

Écrivez un code Java qui affiche tous les entiers pairs de 0 à 20 inclus.

Réponse
for (int i = 0; i <= 20; i += 2) {
    System.out.println(i);
}

Question 25 #

Quel sera le résultat de l’expression 1.0 / 0.0 ?

Réponse

En Java, l'expression 1.0 / 0.0 retourne Infinity (l'infini positif), car la division par zéro avec des nombres à virgule flottante (double) ne provoque pas d'exception, mais retourne une valeur spéciale représentant l'infini.

Question 26 #

Quel sera le résultat de l’expression 1 / 0 ?

Réponse

En Java, l'expression 1 / 0 provoque une erreur de type division par zéro, car la division entière par zéro n'est pas définie.

Question 27 #

Quelle est la différence entre == et equals() pour comparer deux chaînes de caractères en Java ?

Réponse

== compare les références (adresses en mémoire), alors que equals() compare le contenu des chaînes. Il faut utiliser equals() pour vérifier si deux chaînes ont le même texte.

Question 28 #

Que fait l’opérateur + lorsqu’il est utilisé avec des chaînes de caractères et des nombres en Java ? Donnez un exemple.

Réponse

L’opérateur + concatène les chaînes et convertit automatiquement les nombres en chaînes si l’un des opérandes est une chaîne.

Exemple :

String s = "Valeur : " + 10 + 5; // "Valeur : 105"

Question 29 #

Quelle est la valeur de l’expression 1 + 2 + “3” + 4 + 5 en Java ?

Réponse

L’expression s’évalue de gauche à droite : 1 + 2 donne 3, puis 3 + "3" donne "33" (concaténation), puis "33" + 4 donne "334", puis "334" + 5 donne "3345". La valeur finale est "3345".

Question 30 #

Comment extraire une sous-chaîne d’une chaîne en Java ? Donnez un exemple avec substring().

Réponse

On utilise la méthode substring(debut, fin) pour obtenir une sous-chaîne allant de l’indice debut (inclus) à fin (exclu).

Exemple :

String texte = "Bonjour";
String sous = texte.substring(0, 3); // "Bon"

Question 31 #

Comment vérifier si une chaîne commence ou se termine par un certain texte en Java ?

Réponse

On utilise startsWith() pour vérifier le début, et endsWith() pour la fin.

Exemple :

String phrase = "Bonjour le monde";
System.out.println(phrase.startsWith("Bon")); // true
System.out.println(phrase.endsWith("monde")); // true

Question 32 #

Qu’est-ce qu’une classe enveloppe (wrapper) en Java ? Donnez un exemple d’utilisation pour convertir une chaîne de caractères en entier.

Réponse

Une classe enveloppe permet de manipuler un type primitif comme un objet. Exemple :

String s = "123";
int n = Integer.parseInt(s); // n vaut 123

Question 33 #

Expliquez la différence entre int et Integer en Java. Dans quel cas doit-on utiliser Integer ?

Réponse

int est un type primitif, alors que Integer est une classe objet qui encapsule un int. /p>

Question 34 #

Que vaut l’expression new Integer(3) == new Integer(3) en Java ? Expliquez pourquoi.

Réponse

L’expression retourne false. Chaque appel à new Integer(3) crée un nouvel objet distinct en mémoire : les deux objets ont la même valeur mais ne sont pas le même objet. L’opérateur == compare les références (adresses) des objets, pas leur contenu. Pour comparer la valeur, il faut utiliser equals() :

System.out.println(new Integer(3).equals(new Integer(3))); // true

Question 35 #

Quels sont, selon vous, les principaux avantages et inconvénients de Java par rapport à d’autres langages de programmation modernes ?

Réponse

Avantages : portabilité, gestion automatique de la mémoire (garbage collector), vaste écosystème de bibliothèques et frameworks, documentation abondante.

Inconvénients : performances parfois inférieures au code natif (C/C++), syntaxe parfois verbeuse, nécessité d’installer la JVM.