#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 ?).
Patrick
TRAU, ULP - IPST
janvier 05