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. Votre design doit permettre au code ci-dessous de s’exécuter correctement. La règle à suivre étant que lorsque qu’un Point2D est additionné à un Point3D (ou inversement), le résultat sera toujours un Point3D; la troisième coordonnée du Point2D est fixée à 0. L’addition de 2 Point2D donne un Point3D dont la coordonnée z sera égale à la somme des coordonnée x et y du résultat.

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