Απάντηση. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)?

Σχετικά έγγραφα
Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Υπολογιστών με C++

Προγραμματισμός Υπολογιστών με C++

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Τελεστές ΤΕΛΕΣΤΕΣ. Γεώργιος Παπαϊωάννου ( )

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

Υπερφόρτωση τελεστών (operator(

Κλάσεις και αντικείμενα #include <iostream.h<

Οντοκεντρικός Προγραμματισμός

Προγραμματισμός Υπολογιστών με C++

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Προγραμματισμός Ι. Εισαγωγή στην C++ Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΠΡΟΤΥΠΑ. ΠΑΡΑ ΕΙΓΜΑ ηµιουργία πρότυπου στοίβας (stack) και στη συνέχεια δηµιουργία µιας στοίβας σηµείων.

Προγραμματισμός Υπολογιστών με C++

POINTERS, AGGREGATION, COMPOSITION

Προγραμματισμός Υπολογιστών με C++

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Α.Π.Θ. ΕΡΓΑΣΤΗΡΙΟ C++ ΕΞΑΜΗΝΟ Γ Ακαδηµαϊκό Έτος

17TimeThis.h function returns reference pointer to same object { return *this; }

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Περιεχόμενα. Λίγα λόγια για αυτή την έκδοση... 23

Συναρτήσεις και Πίνακες

12. ΑΛΦΑΡΙΘΜΗΤΙΚΑ. υο είδη αλφαριθµητικών Τα αλφαριθµητικά της C πίνακες τύπου char Ta αντικείµενα της κλάσης string

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Constructors, Destructors, Pointers IO Streams, File Streams

Ηλεκτρονικοί Υπολογιστές

Εισαγωγή στη γλώσσα προγραμματισμού C++

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Δυναμική μνήμη με πίνακες και λίστες

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Προγραμματισμός Υπολογιστών με C++

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

Οντοκεντρικός Προγραμματισμός

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός I (Θ)

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Εισαγωγή στον Προγραμματισμό

Μεταφραστής (Compiler)

Προγραμματισμός Υπολογιστών με C++

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

ΜΑΘΗΜΑ: Αντικειμενοστρεφής Προγραμματισμός

Αναφορές, είκτες και Αλφαριθμητικά

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Υπερφόρτωση τελεστών

Συμβολοσειρές ΣΥΜΒΟΛΟΣΕΙΡΕΣ. Γεώργιος Παπαϊωάννου ( )

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

Προγραμματισμό για ΗΜΥ

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (Σηµειώσεις Εργαστηρίου)

Προγραμματισμός Υπολογιστών με C++

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΕΙΣ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Ιανουάριος 2007 Οι απαντήσεις να είναι καθαρογραμμένες με ευδιάκριτους όλους του χαρακτήρες.

2 using namespace s t d ; 4 { 12 int t= x ; 6 x=y ; 7 y=t ; 8 } 9 11 { 13 x= y ; 14 y=t ; 15 } {

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τύποι δεδομένων ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ ΠΡΑΞΕΙΣ ΜΕΤΑΒΛΗΤΕΣ. Ακέραιοι αριθμοί (int) Πράξεις μεταξύ ακεραίων αριθμών

Οντοκεντρικός Προγραμματισμός

ΣΤΟΙΧΕΙΑ ΤΗΣ ΓΛΩΣΣΑΣ C++ Πέρασμα παραμέτρων, συναρτήσεις δόμησης και αποδόμησης

ΗΥ-150. Προγραμματισμός

2 η Διάλεξη C++ Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

ΗΥ-150. Προγραμματισμός

ΚΑΛΟΥΠΩΜΑΤΑ & ΜΕΤΑΤΡΟΠΕΣ

Τι είναι κλάση Κλάση

Τίτλος Μαθήματος: Ηλεκτρονικοί Υπολογιστές IΙΙ. Διδάσκων: Επίκουρος Καθηγητής Αθανάσιος Σταυρακούδης

Ηλεκτρονικοί Υπολογιστές

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Τύποι δεδομένων, μεταβλητές, πράξεις. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΥΠΟΛΟΓΙΣΤΕΣ ΙI. Άδειες Χρήσης. Συναρτήσεις I Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Ευάγγελος Γ. Ούτσιος Θεόδωρος Γ. Λάντζος Διάλεξη Νο8

Προγραμματισμός Υπολογιστών με C++

Ειδικά Θέματα Ι. Σήμερα!

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διδάσκων: Παναγιώτης Ανδρέου

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

Αντικειμενοστρεφής Προγραμματισμός

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Προγραμματισμός Υπολογιστών με C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Περιεχόμενα. Πρόλογος... 21

3 η Διάλεξη C++ - Βασικοί τύποι δεδομένων. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

Η εντολή if-else. Η απλή μορφή της εντολής if είναι η ακόλουθη: if (συνθήκη) { Η γενική μορφή της εντολής ifelse. εντολή_1; εντολή_2;..

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Προγραμματισμός Ι. Πίνακες, Δείκτες, Αναφορές και Δυναμική Μνήμη. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

Εισαγωγή στον Προγραμματισμό

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Εισαγωγή στους πίνακες

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Ερωτήσεις και απαντήσεις στα θέματα του κανονισμού κατάρτισης

Η βασική συνάρτηση προγράμματος main()

Προγραμματισμός Υπολογιστών με C++

Transcript:

Θέμα 1. Γράψτε τον κώδικα ενός header file που να περιέχει: 1) Ένα macro με όνομα divides που, αν του μεταβιβάσουμε δύο ακέραιους αριθμούς επιστρέφει 1 αν ο πρώτος αριθμός διαιρεί τον δεύτερο, αλλιώς, επιστρέφει 0. 2) Μια συνάρτηση change που, αν της δώσουμε δύο οποιαδήποτε διανύσματα a και b με ίσες διαστάσεις και στοιχεία τύπου int, να επιστρέφει (ΟΧΙ ΝΑ ΤΥΠΩΝΕΙ) ένα ανάλογο διάνυσμα c με στοιχεία c(i)=a(i)+b(i) αν το a(i) διαιρεί το b(i) και c(i)=a(i)-b(i) στην αντίθετη περίπτωση, εφαρμόζοντας το προηγούμενο macro. 3) Μια συνάρτηση count που, αν της μεταβιβάσουμε δύο οποιαδήποτε διανύσματα a και b με ίσες διαστάσεις και στοιχεία τύπου int, να μετρά και να επιστρέφει πόσα στοιχεία του a διαιρούν τα αντίστοιχα στοιχεία του b και πόσα όχι, εφαρμόζοντας το macro divides. Φροντίστε ώστε αυτό το file να μην μπορεί να συμπεριληφθεί περισσότερες από μία φορές σε άλλο πηγαίο αρχείο. Γράψτε επίσης τον κώδικα ενός άλλου αρχείου που συμπεριλαμβάνει προς χρήση το προηγούμενο header file και περιέχει μια main συνάρτηση που χρησιμοποιεί τις προαναφερθείσες συναρτήσεις. // We write in a header file named my_header.h #ifndef my_header_h #define my_header_h #define divides(x,y) (((y)%(x)==0)? 1 : 0) void change (int n, int a[], int b[], int c[]) { for (int i=0; i<n; i++) if (divides(a[i],b[i])) c[i]=a[i]+b[i]; c[i]=a[i]-b[i]; void count (int n, int a[], int b[], int &count1, int &count2) { count1=count2=0; for (int i=0; i<n; i++) #endif if (divides(a[i],b[i])) count1++; count2++; // We write in a source file named test.cpp #include "my_header.h" const unsigned int n=3; int x[n]; int y[n]; int z[n]; int c1,c2; for (int i=0; i<n; i++) cin >> x[i]; for (int i=0; i<n; i++) cin >> y[i]; change(n,x,y,z); for (int i=0; i<n; i++) cout << z[i] << '\n'; count(n,x,y,c1,c2); cout << c1 << " " << c2 << '\n';

Θέμα 2. Κατασκευάστε ένα πρόγραμμα που να αποτελείται από 1) μια ΑΝΑΔΡΟΜΙΚΗ συνάρτηση subtract που, αν της δίνουμε δύο οποιαδήποτε διανύσματα a και b με διάσταση n (διάφορη του 0) και στοιχεία τύπου int, να μας επιστρέφει ένα διάνυσμα c με στοιχεία c(i)=a(i)-b(n-1-i). 2) μια ΑΝΑΔΡΟΜΙΚΗ συνάρτηση sum που, αν της δίνουμε ένα διάνυσμα a με στοιχεία τύπου int, να n 1 ai () μας επιστρέφει το άθροισμα i= 0 i + 1. 3) μια main συνάρτηση που θα χρησιμοποιεί τις προαναφερθείσες συναρτήσεις αφού ορίσει τα απαραίτητα διανύσματα. Οι διαστάσεις αυτών των διανυσμάτων δεν θα είναι γνωστές κατά την φάση της μετάφρασης. Συνεπώς, χρειάζεσθε δυναμικά διανύσματα. Να χρησιμοποιήσετε υποδείκτες (indices) για να κινηθείτε κατά μήκος των διανυσμάτων. void subtract (int n, int a[], int b[], int c[], int i) { if (i==0) c[0]=a[0]-b[n-1]; { c[i]=a[i]-b[n-1-i]; subtract(n,a,b,c,i-1); float sum (int n, int a[], int i) { return (i==0)? float(a[0]) : sum(n,a,i-1)+float(a[i])/(i+1); unsigned int n; cin >> n; if (n==0) return -1; int *x= new int[n]; int *y= new int[n]; int *z= new int[n]; for (int i=0; i<n; i++) cin >> x[i]; for (int i=0; i<n; i++) cin >> y[i]; subtract(n,x,y,z,n-1); for (int i=0; i<n; i++) cout << z[i] << '\n'; cout << sum(n,x,n-1) << '\n'; delete [] x; delete [] y; delete [] z;

Θέμα 3. Υλοποιείστε το σενάριο της προηγούμενης άσκησης γράφοντας όλον τον κώδικα στη συνάρτηση main και χρησιμοποιώντας 1) τα κλασσικά επαναληπτικά σχήματα που διαθέτει η C++ αντί για αναδρομικές συναρτήσεις και 2) αριθμητική δεικτών (pointer arithmetic) αντί για υποδείκτες για να κινείστε κατά μήκος των διανυσμάτων. unsigned int n; cin >> n; if (n==0) return -1; int *x= new int[n]; int *y= new int[n]; int *z= new int[n]; int *px; int *py; int *pz; for (px=x; px<x+n; px++) cin >> *px; for (py=y; py<y+n; py++) cin >> *py; px=x; py=y+n-1; pz=z; for ( ; px<x+n; px++) { *pz=*px-*py; py--; pz++; for (pz=z ; pz<z+n; pz++) cout << *pz << '\n'; float sum=0.0f; px=px-n; for (int i=0; i<n; i++) { sum=sum+float(*px)/(i+1); px++; cout << sum << '\n'; delete [] x; delete [] y; delete [] z;

Θέμα 4. Κατασκευάζετε μια κλάση με όνομα circle που θα διαχειρίζεται κύκλους που βρίσκονται σε ένα επίπεδο H κλάση θα περιλαμβάνει: 1) Τα απαραίτητα δεδομένα-μέλη για την αναπαράσταση ενός τέτοιου πολυωνύμου (ένα αντικείμενο τύπου char για το όνομα του κέντρου κύκλου, ένα αντικείμενο μιας δομής με δύο μέλη τύπου float για τις συντεταγμένες του και ένα αντικείμενο τύπου float για την ακτίνα του κύκλου). 2) Έναν constructor που θα επιτρέπει να του διαβιβάζετε μέσω των παραμέτρων του τα στοιχεία του δημιουργούμενου κύκλου. 3) Έναν copy constructor. 4) Έναν destructor που θα αναφέρει τα στοιχεία του κύκλου που καταστρέφει κάθε φορά. 5) Μια συνάρτηση μέλους concentric που θα εξετάζει αν ένας κύκλος είναι ομόκεντρος με το τρέχον αντικείμενο. 6) Μια συνάρτηση μέλους area που θα υπολογίζει το εμβαδόν του τρέχοντος αντικειμένου. 7) Μια συνάρτηση μέλους-υπερφόρτωση του τελεστή = που θα «αναθέτει» έναν κύκλο σε έναν άλλο. 8) Μια συνάρτηση μέλους-υπερφόρτωση του τελεστή!= που θα ελέγχει αν ένας κύκλος είναι διαφορετικός από έναν άλλο. Το πρόγραμμα θα περιλαμβάνει επίσης μια συνάρτηση print που θα είναι φίλος της κλάσης και θα τυπώνει τα στοιχεία οποιουδήποτε μέλους της κλάσης και μια main συνάρτηση που θα δημιουργεί δύο στατικά και ένα δυναμικό αντικείμενο της κλάσης και θα χρησιμοποιεί όλες τις συναρτήσεις μέλους και την print. Γράψτε τον αντίστοιχο κώδικα. #include <cmath> const float pi=4.0f*atan(1.0f); struct point { float x; float y; ; class circle { private: char c; point pos; float r; public: circle (char cc, point ppos, float rr) { c=cc; pos.x=ppos.x; pos.y=ppos.y; r=rr; circle (const circle &a) { c=a.c; pos.x=a.pos.x; pos.y=a.pos.y; r=a.r; ~circle () { cout<<"\ndestructing "<<c<<" "<<pos.x<<" "<<pos.y<<" "<<r<<"\n"; bool concentric (const circle &a) { return c==a.c; float area () { return pi*r*r; circle & operator= (const circle &a) {

; if (this!=&a) { c=a.c; pos.x=a.pos.x; pos.y=a.pos.y; r=a.r; return *this; bool operator!= (const circle &a) { if (c!=a.c r!=a.r) return true; return false; friend void print (circle a); void print (circle a) { cout << a.c << " " << a.pos.x << " " << a.pos.y << " " << a.r; point p; p.x=3.0f; p.y=2.f; circle c1('a',p,3.4f); circle c2(c1); print(c1); if (c1.concentric(c2)) cout << " concentric with "; cout << " is not concentric with "; print(c2); cout << "\n"; circle *c3= new circle(c2); cout << c3->area() << '\n'; print(c2); if (c2!=c1) cout << " is not the same with "; cout << " is the same with "; print(c1); cout << "\n";