UQAM Département d'informatique

INF3105 / 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 Q4
    ~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 Coordonnees {
  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?

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.

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.