public int recherche(int [] a, int debut, int element)

publicité
Faculté des Arts et Sciences - Département d'Informatique et de Recherche opérationnelle
TITRE DU COURS:
Programmation 2
SIGLE:
IFT1020
PROFESSEUR: Jian-Yun Nie
EXAMEN: INTRA-2001H
DATE: 16 oct. 2001
LIEU:
Z110
HEURES: 15:30-17:30
_________________________________________________________________________
Directives pédagogiques: Les documents sont autorisés.
_________________________________________________________________________
Question 1. 15%
1.1. (10%) Décrivez les différences et les relations entre un algorithme et un programme.
Différences :
Un algorithme est plus général et plus abstrait qu’un programme. Dans un algorithme,
on décrit les étapes importantes, en négligeant certains détails. Dans un programme,
on doit décrire tous les détails.
Un algorithme est décrit dans un langage moins strict qu’un programme qui doit
suivre strictement la syntaxe d’un langage donné. Un algorithme est indépendant du
langage de programmation.
Un algorithme ne peut pas être directement exécuté par une machine, tandis qu’un
programme le peut.
Relation : Un programme implante ou réalise un algorithme.
1.2. (5%) Pourquoi est-il important de définir un bon algorithme avant d’écrire un
programme?
Il est important de définir un bon algorithme pour la résolution d’un problème.
L’étape de définition et de l’analyse de l’algorithme permet de connaître les propriétés
(complexités) de l’algorithme, et de le comparer avec d’autres. Un programme suivant
un bn algorithme est plus efficace.
Question 2. 20%
2.1. (8%) En utilisant la récursion, quelles sont les conditions à respecter pour garantir
que la récursion ne se boucle pas à l’infini?
Il faut qu’il y ait un (ou plusieurs) cas limite simple pour lequel on connaît out de
suite la réponse;
Il faut que chaque cas plus complexe se décompose en des cas plus simples.
2.2. (12%) Écrivez un algorithme récursif de recherche linéaire dans un tableau
d’entiers. Cette recherche doit trouver l’endroit (l’index) où l’élément recherché est
stocké. Si cet élément n’existe pas, il retourne -1.
Algorithme recherche(a[0, n-1], début, élément) :
1. si a[début] = élément alors retourner début;
2. si début = n-1 alors retourner –1;
3. sinon, retourner recherche(a[0,n-1], début+1, élément).
Implantez ensuite cet algorithme en Java. Utilisez l’entête suivante pour la méthode :
public int recherche(int[] a, int debut, int element)
où a est le tableau, debut représente l’index à partir duquel on commence la
recherche, et element est l’élément à rechercher.
public int recherche(int [] a, int debut, int element) {
if (a[debut] == element) return debut;
if (debut == a.length –1) return –1;
return recherche(a, debut+1, element);
}
Question 3. 10%
La méthode suivante implante l’addition de deux matrices. Chaque matrice est
représentée par un tableau float de 2 dimensions n x n.
static void matrixAdd (int n, float [][] a, float [][] b,
float [][] sum) {
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
sum[i][j] = a[i][j] + b[i][j];
}
}
}
Donnez sa complexité en temps et en espace.
Complexité en temps : O(n2)
Complexité en espace : O(1)
Question 4. 20%
Pour chaque énoncé indiqué dans les commentaires du programme suivant, dites s’il est
vraie ou faut. Pour chaque énoncé, on considère que les erreurs précédentes (s’il en a) ont
été corrigées.
class Telephone {
private String nom;
private String numero;
public void setNom(String n) {nom = n;}
public void setNumero(String n) {numero = n;}
}
class Annuaire {
public Telephone [] abonne;
private long nombre;
public Annuaire (long n) {
nombre = n;
faux
//Énoncé 1: Erreur, parce que nombre est private, donc non accessible.
abonne = new Telephone[n];
for (int i=0; i<n; i++) {
abonne[i] = new Telephone();
faux
//Énoncé 2: Erreur, car la méthode Telephone() n’est pas définie.
}
}
}
class Tel_Compagnie extends Telephone {
public String secteur;
}
class PageJaune {
public Tel_Compagnie [] abonne;
private long nombre;
faux
//Énoncé 3 : Erreur, les attributs abonne et nombre sont en conflit avec
//ceux dans Annuaire.
public PageJaune() {}
faux
//Énoncé 4 : Erreur, il est impératif d’ajouter super(0)dans cette méthode.
Faux
//Énoncé 5 : Pas d’erreur. super(0)est facultatif.
Vrai
//Énoncé 6 : Pas d’erreur. Il est interdit d’ajouter super(0).
class Montreal {
public static void main (String[] args) {
Annuaire montreal = new Annuaire();
Vrai
//Énoncé 7 : Erreur, car la méthode Annuaire() n’existe pas.
PageJaune page = new PageJaune();
montreal.nombre = 1000000;
vrai
//Énoncé 8 : Erreur, car l’attribut nombre est inaccesible.
montreal.abonne = new Telephone[1000000];
montreal.abonne[0].setNom(“Aarchen”);
montreal.abonne[0].setNumero(“1234567”);
faux
//Énoncé 9 : Erreur, car les attributs nom et numero sont private, et
//peuvent pas être modifiés.
page = new PageJaune();
page.abonne[0] = new Tel_Compagnie();
vrai
// Énoncé 10 : Erreur, page.abonne[0] n’a pas été créé.
}
}
Question 5. 10%
Dans la déclaration des classes suivante, complétez à chaque endroit marqué par un
commentaire (1 et/ou 2) que vous jugez strictement nécessaire pour que la compilation
puisse réussir.
public interface Superficie {
public int hauteur();
public int largeur();
public int surface();
}
public class Rectangle implements Superficie {
int hauteur;
int largeur;
public Rectangle(int h, int l) {
hauteur = h ;
largeur = l;
}
// 1
public int hauteur() {return hauteur ;}
public int largeur() {return largeur ;}
public int surface() {return largeur * hauteur ;}
}
public class Carre extends Rectangle {
public Carre (int h) {
hauteur = largeur = h;
}
// 2 (Rien à ajouter)
}
Question 6. 15%
L’algorithme de Bubble Sort est comme suit :
Algorithme : Trier a[0, n-1] :
1. Pour i=0, …, n-1, répéter :
1.1. Pour j=1,…, n-i, répéter :
1.1.1. Si a[j-1] > a[j], swap a[j-1] et a[j].
2. Termner.
6.1. (10%) Implantez cet algorithme en Java.
public void trier(Comparable [] a) {
for (int i=0; i<a.length; i++) {
for (int j=1; j<a.length –i; j++) {
if (a[j-1].compareTo(a[j])<0) swap(a[j-1],a[j]);
}
}
}
6.2. (5%) Comparez cet algorithme avec le tri par sélection. Décrivez la similarité que
vous pouvez observer.
Même complexité : en temps O(n2), en espace O(1).
Principe similaire : Cet algorithme est équivalent à sélectionner le maximum et le
mettre à la fin. Le tri par sélection sélectionne le minimum et le met au début.
Question 7. 10%
Le programme suivant doit afficher une interface graphique Applet dans laquelle il y a
une fenêtre TextFiled mesage où l’usager peut entrer un message. Une fois entré,
ce message sera copier dans une autre fenêtre TextField echo. Complétez les parties
manquantes numérotées.
// Ce programme crée deux TextField – message et echo. Quand un utilisateur entre un texte dans
// le TextField message, le même texte sera affiché dans le TextField echo. Voir l’illustration.
// Note : Ce programme utilise une seule classe, et ne suit pas le modèle MVC.
import
import
import
1
2
3
;
;
;
java.awt.*
java.applet.Applet
java.awt.event.*
public class TextEcho extends Applet implements ActionListener {
TextField message;
TextField echo;
public void init () {
message = new TextField("
");
add(message);
echo = new TextField("
");
add(echo);
message.addActionListener(this);
}
public void paint(Graphics g) {
echo.setText(message.getText());
}
public void actionPerformed(ActionEvent e) {
repaint();
}
}
Un texte
Un texte
Téléchargement