retour au sujet Examen programmation C++ IUP 2
Première session 2005
pistes de solutions

#include <iostream.h>

//question 1
class noeud
 {
  int num;
  float x,y;
 public:
  void saisie(int i);
  void affiche(void);
  int get_num(void) {return num;}
  float get_x(void) {return x;}
  float get_y(void) {return y;}
  void deplace(float dx,float dy);
 };
void noeud::saisie(int i)
 {
  cout<<"coordonnéeacute;es du noeud "<<i<<" ? ";
  num=i;
  cin>>x;
  cin>>y;
 }
void noeud::affiche(void)
 {cout<<"noeud "<<num<<" : ("<<x<<","<<y<<")";}
void noeud::deplace(float dx,float dy)
 {x+=dx;y+=dy;}
ostream& operator<< (ostream& f,noeud& x)
 {x.affiche();return f;}

//question 2
#define MAXNOEUD 1000
class tabnoeuds
 {
  int nbn;
  noeud n[MAXNOEUD];
 public:
  void saisie(void);
  void affiche(void);
  void deplace(float dx,float dy);
  int get_nbnoeuds(void) {return nbn;}
  int position(int num);
  noeud get_noeud_direct(int i) {return n[i];}
  noeud get_noeud(int num);
 };
void tabnoeuds::saisie(void)
 {
  int i;
  cout<<"combien de noeuds ? ";
  cin>>nbn;
  for(i=0;i<nbn;i++) n[i].saisie(i+1);
 }
void tabnoeuds::affiche(void)
 { int i; for(i=0;i<nbn;i++) cout<<n[i]<<"\n"; }
void tabnoeuds::deplace(float dx,float dy)
 { int i; for(i=0;i<nbn;i++) n[i].deplace(dx,dy); }
int tabnoeuds::position(int num)
 {
  int i;
  for(i=0;i<nbn;i++) 
    if(n[i].get_num() == num) return i;
  return -1; //au cas o je n'aurais pas trouve
 }
noeud tabnoeuds::get_noeud(int num) 
 {
  int pos;
  pos=position(num);
  return n[pos];
 }
  
//Question 3, mais j'éeacute;cris quand mêecirc;me les méeacute;thodes que je ne demandais pas
class element
 {
  int num;
  int p[3];
 public:
  void saisie(int i);
  void affiche(void);
  int get_num(void) {return num;}
  int get_p(int i) {return p[i];}
  float surface(void);
  void force_trigo(void);
 };
void element::saisie(int e)
 {
  int i;
  cout<<"noeuds de l'éeacute;léeacute;ment "<<e<<" ? ";
  num=e;
  for(i=0;i<3;i++)cin>>p[i];
 }
void element::affiche(void)
 {
  int i;
  cout<<"l'éeacute;léeacute;ment "<<num<<" contient les noeuds ";
  for(i=0;i<3;i++)cout<<p[i]<<" ";
 }
ostream& operator<< (ostream& f,element& x)
 {x.affiche();return f;}

//question 4
tabnoeuds N;
float prod_vect(int na,int nb,int nc) //calcule AB ^ AC (on donne les 3 num de noeud)
 {
  noeud a,b,c;
  float xab,yab,xac,yac;
  a=N.get_noeud(na);
  b=N.get_noeud(nb);
  c=N.get_noeud(nc);
  xab=b.get_x()-a.get_x();
  yab=b.get_y()-a.get_y();
  xac=c.get_x()-a.get_x();
  yac=c.get_y()-a.get_y();
  return (xab*yac)-(xac*yab);
 }
float element::surface(void)
 {
  float pv;
  pv=prod_vect(p[0],p[1],p[2]);
  return (fabs(pv)/2);
 }
void element::force_trigo(void)
 {
  float pv;
  int tmp;
  pv=prod_vect(p[0],p[1],p[2]);
  if(pv<0)
   {
    tmp=p[1];
    p[1]=p[2];
    p[2]=tmp;
   }
 }

 //Question 5 je mets des méeacute;thodes suppléeacute;mentaires pour tester 
#define MAXELEMENT 1000
class tabelements
 {
  int nbe;
  element e[MAXELEMENT];
 public:
  void saisie(void);
  void affiche(void);
  int get_nbelements(void) {return nbe;}
  int position(int num);
  element get_element_direct(int i) {return e[i];}
  element get_element(int num);
  int connexions(int num);
 };
void tabelements::saisie(void)
 {
  int i;
  cout<<"combien d'éeacute;léeacute;ments ? ";
  cin>>nbe;
  for(i=0;i<nbe;i++) e[i].saisie(i+1);
 }
void tabelements::affiche(void)
 { int i; for(i=0;i<nbe;i++) cout<<e[i]<<"\n"; }
int tabelements::position(int num)
 {
  int i;
  for(i=0;i<nbe;i++) 
    if(e[i].get_num() == num) return i;
  return -1; //au cas o je n'aurais pas trouve
 }
element tabelements::get_element(int num) 
 {
  int pos;
  pos=position(num);
  return e[pos];
 }
int tabelements::connexions(int num)
 {
  int i,j,nb=0;
  for(i=0;i<nbe;i++)
   for(j=0;j<3;j++)
    if(e[i].get_p(j)==num)nb++;
  return nb;
 }
  
//Question 6
class maillage : public tabnoeuds, public tabelements
 {};
/* cette classe n'est pas vide : elle contient tout ce que contient un tabnoeuds
   plus ce que contient un tabelements. Peut-êecirc;tre aurait-il éeacute;téeacute; plus malin de déeacute;finir
   les attributs en protected, car pour l'instant seules les méeacute;thodes (publiques) sont
   accessibles. Mais l'objet maillage ne sera utile que si l'on lui ajoute des 
   méeacute;thodes, qui permettront de s'en servir sans s'occuper de l'organisation interne
   des attributs dans l'objet (saisie, affichage, calcul par éeacute;léeacute;ments finis, voire dessin).
   Mais çccedil;a ne va pas êecirc;tre pratique si les deux classes héeacute;ritéeacute;es utilisent
   des noms communs ! Par exemple saisie (je resouds le pb ici : 
*/
istream& operator>> (istream& f,maillage& x)
 {
  x.tabnoeuds::saisie();
  x.tabelements::saisie();
  return f;
 }
ostream& operator<< (ostream& f,maillage& x)
 {
  x.tabnoeuds::affiche();
  x.tabelements::affiche();
  return f;
 }

int main(void)
 {
  maillage m;
  cin>>m;
  cout<<m;
 }
/* autre problèegrave;me : le tabnoeuds n'ayant pas de nom, la question 4 devrait
   êecirc;tre réeacute;ecrite en créeacute;ant des méeacute;thodes de la classe maillage, car c'est
   le seul endroit oùugrave; les éeacute;léeacute;ments et leurs coordonnéeacute;es sont connus tous les 2 */


je ne déeacute;voile pas les notes individuelles, mais voici leur réeacute;partition :


pour retourner au sujets de cet examen, cliquez ici (n'est-il pas dans une autre fenêtre ?).


retour au sujet Patrick TRAU, ULP - IPST janvier 05