CSI2772
Automne 2011
Devoirs
Devoir #1
1. Dans les fichiers vecteurs.h et vecteurs.cpp, définir une structure Vecteur faite de 3 nombres
réels x, y, et z.
2. Dans ces
mêmes fichiers, définir une fonction norme prenant comme paramètre un Vecteur et retournant la
norme de ce Vecteur. Concevoir une autre fonction appelée normalise prenant en
paramètre l’adresse d’un Vecteur; cette fonction normalise les éléments du Vecteur transmit par
adresse en divisant ses éléments par sa norme.
3. Toutes les définitions ci-dessus doivent se retrouver
dans l’espace de nom vctr.
4. Définir une fonction main()dans un fichier devoir1.cpp.
Définir un tableau de 5 Vecteurs. A l’aide d’une boucle for, initialiser le
premier vecteur à [1,2,3], le second à [4,5,6], le troisième à [7,8,9] et ainsi de
suite… Normaliser tous ces vecteurs en appelant la fonction normalise dans une autre
boucle for. Afficher les résultats sur la console.
Date de remise : Jeudi le 29 septembre au laboratoire
_____________________________________________________________________
Devoir #2
1. Définir une fonction main dans le fichier lab2.cpp
2. Définir dans cette fonction main() un tableau bidimensionnelle de caractères fait de 3
lignes et de 10 colonnes. Initialiser ce tableau lors de sa définition (en
utilisant la notation {} ) aux caractères suivants : "Le C++", "fantastique", "est"; chacune de ces séries de caractères se retrouvant
sur une ligne différente.
3. Dans un autre fichier, appelé fontions.cpp, définir une fonction acceptant en paramètre un
tableau de tableaux de 10 caractères, un nombre de mots et un tableau d’entiers
dont la dimension correspond au nombre de mots spécifiés. Cette fonction doit
trouver la valeur ascii maximale pour chacun des mots; ces valeurs maximales se
retrouveront dans le tableau d’entiers. Cette fonction ressemblera à ceci: void trouveMaxParRangee(ptrAtableau2D,
nombreDeRangees, ptrATableauDEntiersResultat);
Afin
de rendre les choses plus difficiles, il est interdit d’utiliser les [ ] à l’intérieur de cette fonction.
4. Dans le même fichier que la fonction précédente,
définir une fonction qui affichera à la console les 3 tableaux de caractères
dans un ordre spécifié par un tableau d’entiers. Par exemple, si cette fonction
est appelée avec le tableau défini en 2. et avec un tableau d’entiers contenant
{0, 2, 1} alors le résultat affiché
sera:
Le C++ est fantastique
Cette
fonction ressemblera à ceci: void afficheMots(ptrATableau2D,
nombreDeRangees, ptrATableauEntiersSpecifiantOrdre);
Afin
de rendre les choses plus difficiles, il est interdit d’utiliser le caractère * à l’intérieur de cette fonction.
5. Dans votre fonction main, appeler ces deux fonctions et afficher les
résultats.
Date de remise : Jeudi le 6 octobre au
laboratoire
_____________________________________________________________________
Devoir #3
Dans ce devoir, vous devrez travailler avec des
classes représentant des rectangles (alignés horizontalement et verticalement).
Le rectangle est représenté par la coordonnée de son coin supérieur gauche, sa
longueur et sa largeur. Le cercle se représente par la coordonnée de son centre
et son rayon. Tous ces attributs doivent être des nombres réels (double). Pour représenter les coordonnées, il faut utiliser une
classe Point2D avec les attributs (x, y).
1. La classe Rectangle doit avoir un constructeur plein, un
constructeur par défaut (initialisant les coordonnées à 0 et les dimensions à
1), un constructeur à un argument (coordonnées à 0, et dimensions à la valeur
spécifiée) et un constructeur-copieur. En plus de faire leur travail, ces
constructeurs doivent afficher un message à la console confirmant qu’ils ont
bien été appelés.
2.
La classe Cercle doit être conçue de façon similaire, i.e. avec un
constructeur plein, un constructeur par défaut (initialisant les coordonnées à
0 et le rayon à 1), un constructeur à un argument (coordonnées à 0, et rayon à
la valeur spécifiée) et un constructeur-copieur.
3.
La classe Cercle doit, en plus, avoir un constructeur permettant de
construire un Cercle à partir d’un Rectangle. Le centre et le rayon doivent alors est déterminés de
façon à ce que le cercle intersecte le rectangle à
ses 4 coins.
4.
Définir
une fonction ayant la signature suivante Cercle gonfle(Cercle c); et qui retourne un cercle dont la valeur du rayon est le
double du cercle passé en argument. À noter que le passage de paramètre et le
retour de la fonction se font par valeur.
5. Définir une fonction main prenant en paramètre un rectangle tel que spécifié à la
ligne de commande, e.g.: devoir3.exe 2 5 6 4, (ici un rectangle à la position (2,5), de largeur
6 et hauteur 4. Par une série d’énoncés créant des formes et des cercles,
appeler tous les constructeurs demandés. Appeler aussi la fonction gonfle.
6.
Utiliser
cette fonction main pour répondre aux questions suivantes:
a.
Qu’arrive-t-il
si on affecte un Rectangle à un Cercle ?
b.
Qu’arrive-t-il
si on affecte un double à un Cercle ?
c.
Qu’arrive-t-il
si on affecte on appelle la fonction gonfle avec
un Rectangle ?
d.
Qu’arrive-t-il
si on affecte on appelle la fonction gonfle avec
un double ?
Date de remise : Jeudi le 13 octobre au
laboratoire
_____________________________________________________________________
Devoir #4
Concevoir une
classe Point
qui serait la classe de base de 2 autres classes à concevoir : Point2D et Point3D. Ces sous-classes doivent hériter de
2 méthodes : add et print.
Point3D p3 = Point3D(-2,-2,-2);
Point2D p2 = Point2D(2,3);
Point& pA = p3;
Point* pC = &p2;
pA.add( pA ).print(); // devrait afficher à la console un Point3D
pA.add( *pC ).print(); // devrait afficher à la console un Point3D
pC->add( *pC ).print(); // devrait
afficher à la console un Point3D
pC->add( pA ).print(); //
devrait afficher à la console un Point3D
Date de remise : Mardi le 25 octobre au laboratoire
_____________________________________________________________________
Devoir #5
Une classe HighScore contient un tableau trié d’objets Player. La classe Player est constituée d’un attribut name et un attribut score. Un même joueur peut avoir plusieurs scores dans
la classe HighScore.
Définition partielle de la classe:
#include <iostream>
#include <string>
using
namespace std;
class
Player {
string d_name;
long d_score;
public:
// Constructeurs and getters
};
class HighScore {
int
d_nPlayers;
// nombre de joueurs
static
const int d_size=8; // taille
(fixe) du tableau
Player d_players[d_size]; // tableau de joueurs
public:
HighScore()
: d_nPlayers(0) {}
void print() const {
for (int i=0;
i<d_nPlayers; i++)
cout << "#"
<< i << ": " << d_players[i].getScore()
<< " " << d_players[i].getName() << endl;
}
bool addPlayer(const
string& name, long score);
// Nouveau score à
insérer à sa position.
// Le joueur avec le score le plus bas est retiré
// lorsque le
tableau est plein.
// Retourne vrai si le joueur a été ajouté au
tableau
void
removePlayer(const string& name);
// retire
tous les scores associés à ce joueurs
};
a.
Écrire
les constructeurs et getters requis pour le bon fonctionnement de la classe HighScore.
b. Il y a un certain nombre de bogues dans la
fonction addPlayer présentée ci-dessous. Ils doivent être corrigés.
bool addPlayer(const string& name, long
score) {
Player p(score,name);
if (d_nPlayers==d_size) {
if (p.getScore() <
d_players[d_nPlayers].getScore())
return false;
else {
d_players[d_nPlayers-1]=
p;
return true;
}
}
if (d_nPlayers==0) {
d_players[0]=
p;
d_nPlayers++;
return false;
}
n=
d_nPlayers-1;
while (n>=0 && d_players[n].getScore() < p.getScore())
{
d_players[n+1]=
d_players[n];
n--;
}
d_players[n+1]=
p;
return true;
}
c. Définir la méthode removePlayer.
d. Modifier la classe HighScore afin
que le tableau d_player soit maintenant alloué de façon dynamique. Le
constructeur devra maintenant inclure un paramètre servant à spécifier la dimension
désirée pour ce tableau (par défaut la valeur est de 10). Ne pas oublier de
modifier le constructeur copieur.
e.
Tester
votre classe avec l’exemple suivant exécuté avec un tableau de dimension 5 :
Ajouter les résultats suivant dans l’ordre :
Marie 211
Pierre 55
Paul 256
Jacques 198
Sylvie 79
Paul 155
Ce qui devrait donner l’affichage suivant :
Paul 256
Marie 211
Jacques 198
Paul 155
Sylvie 79
Maintenant retirer le joueur Paul, ce qui devrait produire l’affichage
suivant :
Marie 211
Jacques 198
Sylvie 79
Date de remise : Jeudi le 10 novembre au
laboratoire