TD No 6
from http://vernier.frederic.free.fr/Teaching/PimpA

Les Pointeurs

Questions sans code à écrire

  1. Quels sont les 2 caractères utilisés pour noter les pointeurs en C++ ?
  2. Quel place occupe en mémoire un pointeur ?
  3. Quelle différence y a t-il entre un pointeur char* et int* ?
  4. Un pointeur char* peut-il pointer vers des int ?
  5. Lequel peut etre utilisé pour coder un pointeur vers des pixels ?
  6. Qu'affiche le code suivant et pourquoi ?
Telecharger le code suivant
// compile avec g++ main.cpp -o main.out
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <stdlib.h>
using namespace std;

struct Ville{
  string *Insee;
  int dep;
  string *Nom;
  int Altitude;
  string *code_postal;
  float longitude_radian;
  float latitude_radian;
  int pop99;
  float surface;
};
vector<Ville*> liste;

void lire_fichier(string s){
  ifstream f(s.c_str());
  string line;

  getline(f,line);
  while(getline(f,line)) {
    Ville *v = (Ville*)malloc(sizeof(Ville)) ;
    int ind = line.find(";");
    v->Insee = new string (line.substr(0, ind));;
    string code_dep = v->Insee->substr(0, v->Insee->size()-3);
    if (code_dep == "2A" || code_dep == "2B")
      v->dep = 20;
    else
      v->dep   =  atoi(code_dep.c_str());

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->Nom = new string(line.substr(0, ind));

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->Altitude = atoi(line.substr(0, ind).c_str());

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->code_postal = new string(line.substr(0, ind));

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->longitude_radian = atof(line.substr(0, ind).c_str());

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->latitude_radian = atof(line.substr(0, ind).c_str());

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->pop99 = atoi(line.substr(0, ind).c_str());

    line = line.substr(ind+1, line.size()-1);
    ind = line.find(";");
    v->surface = atof(line.substr(0, ind).c_str());

    liste.push_back(v);
  }
  f.close();
}


int main(int, char*[]) {
  lire_fichier("villes.csv");
  cout << *liste[0]->Nom << " a une population de " << liste[0]->pop99 << " personnes" << endl;
}

Implémentation

Le but de l'implementation sera de coder une structure de département de France à partir de la liste des communes.
Nous souhaitons créer dynamiquement les départements à partir des 2 premiers caractères du code INSEE au fur et à mesure de la lecture des 36000 communes. Pour simplifier toutes les communes de corse (No insee commençant par 2A ou 2B) seront regroupées dans le département unique "20"

  1. Rajouter au code du TD 1 modifié (ci-dessus) une structure departement qui contient des champs population, surface et numero
  2. Créer un tableau de 100 departements et un pointeur vers le premier département qui s'appelle "depvide"
  3. Ajouter 3 ou 4 departements fictifs dans le main (tester en affichant)
  4. Ecrire la fonction de recherche linéaire qui cherche un departement ayant un numéro précis (tester en cherchant un departement fictif)
  5. Dans la fonction de lecture, pour chaque commune crée (voir code) chercher le departement correspondant et
    1. SI LE DEPARTEMENT N'EXISTE PAS : initialiser la population, la surface et le numero au bout de depvide et faites avancer depvide
    2. SI LE DEPARTEMENT EXISTE : augmenter la population et la surface par les chiffres de la commune
  6. Enlever les departements fictifs
  7. Rajouter un champ "nombre de communes" (et mettre ce champ à jour)
  8. Creer un tableaux de 100 pointeurs vers departement
  9. Initialiser ces pointeurs pour que le premier pointeur pointe vers le premier departement du tableau et ainsi de suite.
  10. Créer une fonction qui trie le tableau de pointeurs (donc sans déplacer les departements du tableau de departement !) en fonction du nombre de communes
  11. Modifier le code ci-dessus pour que chaque commune ait un pointeur vers la commune suivante (dans l'ordre de lecture)
  12. Trier les communes pour que les communes se suivent dans l'ordre croissant de population avec le tri fusion !