Ecole des Mines de Nancy


Clinique Informatique
Séance 3
Remarque: Le but n'est pas de "faire" une liste d'exercice, mais de comprendre ce qui se passe. Les exercices doivent servir de support à la discussion, n'hésitez pas à poser des questions !

Objectifs de la séance: boucles, tableaux...



Rappels:


Déclaration/instantiation d'un tableau:

int monTableau[] = new int[N];
-> déclaration d'un tableau d'entiers de taille N (où N est un entier).

remarque:
monTableau.length est la taille de monTableau (ici la valeur de N).

double monTableau2[][] = new double[3][N];
-> déclaration d'un tableau de 3 tableaux de doubles, chacun étant de taille N (il s'agit donc d'une "matrice" d'ordre 3xN).


Les fonctions:

On les définit entre la première ligne ( public class exercice { ) et la ligne du main.
Syntaxe:
public static type0 nom_de_la_fonction(type1 argument1, type2 argument2 ...) {
    // corps de la fonction
}
où type0 est le type de retour de la fonction (éventuellement void s'il n'y a pas de retour)
et type 1, type 2 ... sont les types des variables argument1, argument2 ... passées en argument de la fonction.

Exemple 1:
public static double fonction_1(int k, double x) {
    return Math.cos(x*k);
}
Cette fonction sera appelée dans le main (et son résultat affecté à la variable x de type double) par:
x=fonction_1(2,3.4);

Exemple 2:
public static double trace(double mat[][]) {
    // trace d'une matrice carree
    double t=0.0;
    for (int i=0;i<mat.length;i++)
        t+=mat[i][i];
    return t;
}




Pour les exercices suivants, on créera un nouveau projet sous Eclipse et on inclura le package Utilitaire.jar comme en TD.



Exercice 0 - manipulation d'un tableau (déclaration, boucles for)
(pour ceux qui n'étaient pas présents à la séance de clinique précédente)

Ecrire un programme qui crée un tableau de 10 entiers dont le ième élément a pour valeur le carré de i, un tableaux de 10 double dont le ième élément a pour valeur le cosinus de i (fonction Math.cos), et un tableau bidimensionnel d'entiers de taille 3x4 dont l'élément d'indice (i,j) a pour valeur i*j.
Afficher ces trois tableaux (forme libre).



Exercice 1 - manipulation d'un tableau (bis) (déclaration, boucles for, fonctions)

Ecrire un programme qui
1) demande la taille d'un tableau d'entiers à l'utilisateur;
2) le remplit d'entiers tirés au hasard entre 1 et 100 (Utilitaire.tirerUnEntier), tout en construisant une chaine de caractère de manière à pouvoir afficher le tableau sous la forme [ 10 14 5 84 56 ] avec Utilitaire.ecrire;
3) calcule (et affiche) la moyenne des éléments stockés dans le tableau ainsi que les plus petits et plus grands éléments.
On écrira une fonction pour chacune de ces opérations. Les prototypes seront:
public static double moyenne(double[] tableau)
public static double elementmini(double[] tableau)
public static double elementmaxi(double[] tableau)



Exercice 2 - suite de Syracuse (écriture d'une fonction)

On définit par récurrence la suite d'entiers (u_n) par:
u_0 est un entier naturel non nul;
pour tout entier n, si u_n est pair alors u_{n+1} = u_n / 2
et si u_n est impair alors u_{n+1} = 3.u_n + 1.
On conjecture que pour toute valeur de u_0, la suite (u_n) finit par devenir périodique et prend pour valeurs successives 4, 2, 1.
Ecrire un programme qui demande à l'utilisateur un entier non nul, et, au sein d'une boucle while (de manière à s'arrêter lorsque l'on arrive à 1), appelle une fonction qui calcule les termes successifs de la suite.



Exercice 3 - moyenne arithmético-géométrique (fonctions, tableaux)

Etant donnés deux réels positifs u_0 et v_0, on définit par récurrence les deux suite (u_n) et (v_n) par u_{n+1} = sqrt(u_n . v_n)  et v_{n+1} = (u_n + v_n) / 2.
Ecrire un programme qui demande à l'utilisateur deux doubles u_0 et v_0 et stocke dans deux tableaux les 10 premières valeurs de (u_n) et (v_n).
La racine carrée s'obtient par la méthode Math.sqrt().



Exercice 4 - tri à bulle (fonctions, tableaux...)

On se donne un tableau de doubles, initialisé à (par exemple):
double tab[] = {5.5, 2.0, 3.5, 7.0, 4.4, 3.5, 0.2, 5.4, 0.4, 6.6};
On cherche à trier ce tableau dans l'ordre croissant.
Le principe du tri à bulle est le suivant: on parcourt le tableau et quand on rencontre deux éléments successifs tels que tab[i]>tab[i+1] on inverse la position de ces éléments. Tant qu'on a inversé au moins une paire d'éléments lors d'un parcours, on recommence.
Ecrire un programme qui trie le tableau tab. Il comportera une fonction tri_a_bulle qui appellera une fonction permutant deux éléments du tableau.




Contact:
Frédéric Sur, ATER au département d'informatique.