UQAM Département d'informatique

INF3105 / Solution exercice Sections 2 et 4 -- Tableau<T> et C++

Soit le fragment programme.cpp:
/* programme.cpp */
template <class T> class Tableau {
  public:
    Tableau(int capacite_initiale=1); // =1 important pour Q1(d)
    ~Tableau();
    void ajouter(const T& element); // ajouter à la fin
    T&	 operator[] (int index);
  private:
    T* elements;
    int capacite, taille;
};
template <class T> Tableau<T>::Tableau(int capacite_initiale)
 : capacite(capacite_initiale), taille(0) 
{  elements = new T[capacite]; }  // <<=== LIGNE 14
/* ... */
class Coordonneess {
  public:
    Coordonnees(double latitude_=0, double longitude_=0);
  private:
    double latitude;
    double longitude;
  friend double distance(const Coordonnees& c1, const Coordonnees& c2);
  /*...*/
};
double distance(const Coordonnees& c1, const Coordonnees& c2){
  double s1 = sin((c2.latitude-c1.latitude)/2);
  double s2 = sin((c2.longitude-c1.longitude)/2);  // <<=== LIGNE 27
  return 2*RAYONTERRE * asin(sqrt(s1*s1 + cos(c1.latitude)*cos(c2.latitude)*s2*s2));
}
int main(){
    int i, j, n;
    std::cin >> n;
    Tableau<Coordonnees> coors;
    for(i=0;i<n;i++){
        Coordonnees c;
        std::cin >> c;
        coors.ajouter(c);
    }
    for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)
            if(distance(coors[i], coors[j]) <= 25.0)
                std::cout << "Eureka!" << std::endl;
    double d = distance(coors[1], coors[3]);
    return 0;
}

Que fait ce programme?

Ce programme :
  1. lit un entier n;
  2. lit n coordonnées et les met dans un tableau;
  3. parcours les n(n-1)/2 paires de coordonnées:
  4. affiche "Eureka!" chaque fois qu'une paire est à une distance de 25 ou moins.

Simulation

Considérez que le programme reçoit la chaine suivante :

5 (45,-73) (45,-13) (30, 40) (74,-100) (50, 50)

On met un point d'arrêt sur la ligne 28. Dessinez l'état de la mémoire du programme immédiatement après la première exécution de la ligne 27. Montrez clairement les objets sur la pile d'exécution (stack) et ceux dans le tas (heap).

Expliquez tout ce que fait la ligne 14.

Cette ligne contient le mot clé new. Soyez aussi précis que possible dans votre réponse. Mettez en évidence les différentes étapes et leur ordre.

(1) Demande au gestionnaire de mémoire d'allouer un bloc de capacité * sizeof(Coordonnees).
(2) Appelle le constructeur Coordonnees::Coordonnees() sur les tous les objets du tableau natif alloué (nb=capacite). Ce constructeur initialise latitude et longitude à 0.0 (valeurs par défault des 2 paramètres).
(3) Assigne le pointeur elements à l'adresse du bloc qui a été alloué.

Allocation mémoire

Dans le programme, il y a deux occurrences du mot clé new. La première dans le constructeur de Tableau et la deuxième dans la fonction ajouter. Combien d'octets au total ont été alloués dynamiquement par ces deux occurrences de new durant toute la vie du programme? Considérez que la fonction Tableau<T>::ajouter double la capacité à chaque fois qu'un agrandissement est requis.

Le tableau a une capacité initiale de 1 est est doublé 3 fois jusqu'à capacité=8.
Donc 4 allocations. Taille des allocations : 1 + 2 + 4 + 8 = 15.
Nombres d'octets : 15 * sizeof(Coordonnees) = 15 * 2 * sizeof(double) = 15*2*8 = 240 octets.