#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é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'écris quand même les mé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'élément "<<e<<" ? "; num=e; for(i=0;i<3;i++)cin>>p[i]; } void element::affiche(void) { int i; cout<<"l'élé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éthodes supplé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'élé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-être aurait-il été plus malin de définir les attributs en protected, car pour l'instant seules les méthodes (publiques) sont accessibles. Mais l'objet maillage ne sera utile que si l'on lui ajoute des méthodes, qui permettront de s'en servir sans s'occuper de l'organisation interne des attributs dans l'objet (saisie, affichage, calcul par éléments finis, voire dessin). Mais ça ne va pas être pratique si les deux classes hérité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ème : le tabnoeuds n'ayant pas de nom, la question 4 devrait être réecrite en créant des méthodes de la classe maillage, car c'est le seul endroit où les éléments et leurs coordonnées sont connus tous les 2 */
je ne dévoile pas les notes individuelles, mais voici leur répartition :


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