THMMY.gr

Μαθήματα Βασικού Κύκλου => Αντικειμενοστραφής Προγραμματισμός => Topic started by: vasilis94 on November 24, 2014, 18:19:41 pm



Title: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: vasilis94 on November 24, 2014, 18:19:41 pm
Άσκηση Ε

         Σε ένα χυτήριο υπάρχει μια σειρά από παραγγελίες που πρέπει να εκτελεστούν. Η παραγγελίες εκτελούνται σύμφωνα με μια σειρά προτεραιότητας που έχει καθοριστεί από πριν. Τα τεμάχια των παραγγελιών διαφέρουν ως προς το σχήμα ή και τις διαστάσεις τους ενώ δεν ενδιαφέρει είδος του μετάλλου που θα χρησιμοποιηθεί. Στο χυτήριο υπάρχουν διάφορες ποσότητες μετάλλων που χρησιμοποιούνται για την χύτευση των τεμαχίων. Η σειρά με την οποία χρησιμοποιείται το κάθε μέταλλο είναι και αυτή προκαθορισμένη. Η διαδικασία που ακολουθείται για την εκτέλεση των παραγγελιών απαιτεί να κατασκευαστούν πρώτα όλα τα τεμάχια της παραγγελιάς που έχει προτεραιότητα χρησιμοποιώντας, με τη σειρά που έχει προκαθοριστεί, τα  αποθέματα των μετάλλων που υπάρχουν στο χυτήριο. Η διαδικασία συνεχίζεται με την επόμενη παραγγελία μέχρι να εκτελεστούν όλες οι παραγγελίες ή να τελειώσουν τα αποθέματα μετάλλων που υπάρχουν στο χυτήριο.
         Να γραφεί το λογισμικό στο οποίο να ορίζεται η κλάση material τα αντικείμενα τις οποίας να υλοποιούν τα διαφορετικά μέταλλα πού υπάρχουν στο χυτήριο. Με τη δημιουργία αντικειμένων στον τύπο της κλάσης να διαβάζεται η ποσότητα του αντίστοιχου μετάλλου καθώς και το ειδικό του βάρος.
         Στο λογισμικό να ορίζεται ακόμη η συνάρτηση production(…) η οποία να εκτυπώνει τη διαδικασία με την οποία θα εκτελεστούν οι παραγγελίες. Η συνάρτηση να υπολογίζει και να εκτυπώνει τον αριθμό και τον τύπο των τεμαχίων που θα κατασκευαστούν από το κάθε μέταλλο μέχρι να τελειώσουν όλες οι παραγγελίες ή να εξαντληθούν τα αποθέματα μετάλλων που διαθέτει το χυτήριο. Η συνάρτηση να είναι ανεξάρτητη από τον αριθμό και τον τύπο των τεμαχίων που πρόκειται να κατασκευαστούν.
         Ως εφαρμογή να οριστούν οι κλάσεις product1 και product2 που να υλοποιούν δύο διαφορετικού σχήματος τεμάχια που πρέπει να κατασκευάσει το χυτήριο. Τα αντικείμενα της κλάσης product1 είναι κύλινδροι για κάθε έναν από τους οποίους είναι γνωστή η ακτίνα της βάσης και το ύψος, καθώς και ο αριθμός των τεμαχίων που πρέπει να κατασκευαστούν. Τα αντικείμενα της κλάσης product2 είναι κύβοι για κάθε έναν από τους οποίους είναι γνωστή η πλευρά καθώς και ο αριθμός των τεμαχίων που πρέπει να κατασκευαστούν. Κατά την δημιουργία των αντικειμένων στους τύπους των πιο πάνω κλάσεων να διαβάζεται ο αριθμός των τεμαχίων και όλα τα απαραίτητα στοιχεία για τον υπολογισμό του όγκου του τεμαχίου που υλοποιεί το αντικείμενο. Οι κλάσεις να διαθέτουν τις κατάλληλες συναρτήσεις για τον υπολογισμό του όγκού του μετάλλου που θα απαιτηθεί για την κατασκευή του κάθε τεμαχίου.
        Η συνάρτηση main του προγράμματος να ορίζει έναν πίνακα από 5 αντικείμενα τύπου material τα οποία να υλοποιούν τα μέταλλα που διαθέτει το χυτήριο. Στη συνέχεια, αφού οριστούν, ένας πίνακας με 5 αντικείμενα τύπου product1 και ένας πίνακας με 4 αντικείμενα τύπου product2, να καλείται η συνάρτηση production(), για τα 9 αυτά αντικείμενα, για να εκτυπώσει τη διαδικασία με την οποία θα εκτελεστούν οι παραγγελίες.

Βοηθητικές παρατηρήσεις:

Η συνάρτηση production() να καλείται μια μόνο φορά.
Για την κατασκευή των τεμαχίων δεν επιτρέπεται η ανάμιξη των μετάλλων.


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: K on November 24, 2014, 18:38:22 pm
πως δύναται να υπάρξει δυναμική συνάρτηση χωρίς κληρονομικότητα?


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: ablaoublas on November 24, 2014, 22:00:06 pm
'Αλλος ένας γρίφος για εκφώνηση >:(
Ποια θα είναι η βασική κλάση και τι θα περιέχει ;


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Kthulu on November 25, 2014, 11:59:49 am
Έχει κανεις ιδεα για το πως θ υλοποιηθει η συναρτηση και πως στο καλο θα μαθουμε ποια ειναι η προτεραιοτητα;


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: mrboombastic on November 26, 2014, 22:08:43 pm
Τα τεμάχια κάθε παραγγελίας θα είναι φτιαγμένα απ΄το ίδιο υλικό;


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: airguitar on November 27, 2014, 23:22:36 pm
η κλαση material θα εχει 5 κλασεις παραγωμενες απο αυτη οπου καθε μια απο τις 5 ειναι ενα διαφορετικο μεταλο ?


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Kthulu on November 28, 2014, 15:14:43 pm
η κλαση material θα εχει 5 κλασεις παραγωμενες απο αυτη οπου καθε μια απο τις 5 ειναι ενα διαφορετικο μεταλο ?
Όχι φυσικά. Μια κλάση θα ειναι και θα οριζεις 5 αντικειμενα αυτης της κλασης,τα οποια θα ειναι τα διαφορετικα μεταλλα


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Kthulu on November 28, 2014, 16:33:05 pm
Η προτεραιότητα κατασκευής είναι η ίδια με την σειρα που δηλωνονται τα αντικειμενα με πρωτο τα product1 και μετα το product2 ; Για τα μεταλλα επισης; Ή η προτεραιότητα δηλώνεται κάπως αλλιώς μέσα στο πρόγραμμα;;


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: airguitar on November 28, 2014, 21:39:20 pm
πως θα υπολογιζει η συναρτηση τον αριθμό και τον τύπο των τεμαχίων που θα κατασκευαστούν από το κάθε μέταλλο ??


Title: Re: [Προγραμματιστικές Τεχνικές] Γενικές απορίες ανακοινώσεις/επικαιρότητα 2014/2015
Post by: K on November 29, 2014, 19:30:29 pm
Τελικά μεχρί πόσες εργασίες μπορείς να μην παραδώσεις ηλεκτρονικά στον Κορτέση χωρίς να κοπείς ;
Η εργασία Ε είναι απάλευτηηηηηη  >:(
2

για την Ε δες τις αντίστοιχες από προηγούμενα έτη

Μπορείς να εξηγήσεις γιατί στη λύση του κάνει τη δέσμευση μνήμης με αυτόν τον τρόπο:
product **P;
int Np=0;
product::product()
{
if(Np==0){
P=(product **)malloc(sizeof(product *));
if(P==NULL){
cout<<"Δεν υπάρχει αρκετή διαθέσιμη μνήμη (θέση 1)\n";
exit(1);
}
P[0]=this;
Np++;
}
else{
Np++;
P=(product **)realloc(P,Np*sizeof(product *));
if(P==NULL){
cout<<"Δεν υπάρχει αρκετή διαθέσιμη μνήμη (θέση 2)\n";
exit(1);
}
P[Np-1]=this;
}
}


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on November 30, 2014, 02:23:50 am
πως δύναται να υπάρξει δυναμική συνάρτηση χωρίς κληρονομικότητα?
Χρειαζεται τελικα virtual ή οχι??
Το οτι σχεδον κανεις δεν απανταει στις ερωτησεις απολυτα λογικο με τετοια εκφωνηση  >:(


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: BabisI on November 30, 2014, 03:28:40 am
πως δύναται να υπάρξει δυναμική συνάρτηση χωρίς κληρονομικότητα?
Χρειαζεται τελικα virtual ή οχι??
Το οτι σχεδον κανεις δεν απανταει στις ερωτησεις απολυτα λογικο με τετοια εκφωνηση  >:(
Ναι χρειάζεται,επειδή θέλει ανεξαρτησία της συνάρτησης από τον τύπο/είδος της παραγγελίας.Για να υπολογίζεις τον κάθε όγκο,να εμφανίζεις τι είναι το είδος κλπ θα πρέπει να καλούνται virtual αντίστοιχες συναρτήσεις.Εδώ φυσικά ξέρουμε εκ των προτέρων ότι τα 5 πρώτα είναι κύλινδροι  και τα υπόλοιπα 4 κύβοι,αλλά γενικά δεν ξέρεις τι παίρνεις από τη main,αν πχ ο πίνακας είχε 3 κυλίνδρους,5 κύβους,9 κυλίνδρους κλπ για 100 αντικείμενα,θα έπρεπε κάθε φορά να ξέρεις τι διαχειρίζεσαι.


Title: Re: [Προγραμματιστικές Τεχνικές] Γενικές απορίες ανακοινώσεις/επικαιρότητα 2014/2015
Post by: c0ndemn3d on November 30, 2014, 03:43:55 am
Τελικά μεχρί πόσες εργασίες μπορείς να μην παραδώσεις ηλεκτρονικά στον Κορτέση χωρίς να κοπείς ;
Η εργασία Ε είναι απάλευτηηηηηη  >:(
2

για την Ε δες τις αντίστοιχες από προηγούμενα έτη

Μπορείς να εξηγήσεις γιατί στη λύση του κάνει τη δέσμευση μνήμης με αυτόν τον τρόπο:
product **P;
int Np=0;
product::product()
{
if(Np==0){
P=(product **)malloc(sizeof(product *));
if(P==NULL){
cout<<"Δεν υπάρχει αρκετή διαθέσιμη μνήμη (θέση 1)\n";
exit(1);
}
P[0]=this;
Np++;
}
else{
Np++;
P=(product **)realloc(P,Np*sizeof(product *));
if(P==NULL){
cout<<"Δεν υπάρχει αρκετή διαθέσιμη μνήμη (θέση 2)\n";
exit(1);
}
P[Np-1]=this;
}
}

Καταρχάς έχει ορίσει ένα αντικείμενο τύπου product**. Όπως βλέπεις, χρησιμοποιείται για να κρατήσει pointers σε αντικείμενα τύπου product. Σκέψου:

  • Δεν γνωρίζουμε πόσα αντικείμενα τέτοια έχουμε (από εκτέλεση σε εκτέλεση διαφέρει).
  • Ο constructor καλείται πολλές φορές.

Καλώ πρώτη φορά τον constructor, άρα ο πίνακας δεν έχει αντικείμενα. Ωραία, σου λέει. Θα δεσμεύσω χώρο για ένα αντικείμενο και θα βάλω το οριζόμενο αντικείμενο εκεί. Αυξάνω τη μεταβλητή Np για να δείξω ότι ορίστηκε ακόμα ένα αντικείμενο.

Μετά καλώ δεύτερη ή ν-οστή φορά. Αυτή τη φορά κάνουμε realloc γιατί έχουμε ήδη δεσμευμένο χώρο και αντικείμενα που δεν πρέπει να χάσουμε!

Τώρα θα πεις <<μάγκα μου, το κατάλαβα, αλλά γιατί έτσι;>>.

1) Έχουμε έναν γενικό πίνακα για να αποθηκεύουμε τα αντικείμενα γιατί δεν ξέρουμε πόσα θα είναι.
2) Ακόμη δεν ξέρουμε τι τύπου θα είναι. Αυτό είναι που λέμε ανεξαρτησία προγράμματος, με την έννοια ότι εγώ θα πάρω τον κώδικα, θα βάλω άλλη μια κλάση (κληρονομημένη προφανώς από την αρχική μας) και το πρόγραμα θα δουλεύει μια χαρά. Για αυτό αποθηκεύω τους pointers! Άμα δεις τη θεωρία αυτό επιτρέπεται (δηλαδή να είναι διαφορετική κλάση), εφόσον οι κλάσεις κληρονομούνται από την ίδια!


Title: Re: [Προγραμματιστικές Τεχνικές] Γενικές απορίες ανακοινώσεις/επικαιρότητα 2014/2015
Post by: K on November 30, 2014, 13:03:29 pm
Τελικά μεχρί πόσες εργασίες μπορείς να μην παραδώσεις ηλεκτρονικά στον Κορτέση χωρίς να κοπείς ;
Η εργασία Ε είναι απάλευτηηηηηη  >:(
2

για την Ε δες τις αντίστοιχες από προηγούμενα έτη

Μπορείς να εξηγήσεις γιατί στη λύση του κάνει τη δέσμευση μνήμης με αυτόν τον τρόπο:
product **P;
int Np=0;
product::product()
{
if(Np==0){
P=(product **)malloc(sizeof(product *));
if(P==NULL){
cout<<"Δεν υπάρχει αρκετή διαθέσιμη μνήμη (θέση 1)\n";
exit(1);
}
P[0]=this;
Np++;
}
else{
Np++;
P=(product **)realloc(P,Np*sizeof(product *));
if(P==NULL){
cout<<"Δεν υπάρχει αρκετή διαθέσιμη μνήμη (θέση 2)\n";
exit(1);
}
P[Np-1]=this;
}
}

Καταρχάς έχει ορίσει ένα αντικείμενο τύπου product**. Όπως βλέπεις, χρησιμοποιείται για να κρατήσει pointers σε αντικείμενα τύπου product. Σκέψου:

  • Δεν γνωρίζουμε πόσα αντικείμενα τέτοια έχουμε (από εκτέλεση σε εκτέλεση διαφέρει).
  • Ο constructor καλείται πολλές φορές.

Καλώ πρώτη φορά τον constructor, άρα ο πίνακας δεν έχει αντικείμενα. Ωραία, σου λέει. Θα δεσμεύσω χώρο για ένα αντικείμενο και θα βάλω το οριζόμενο αντικείμενο εκεί. Αυξάνω τη μεταβλητή Np για να δείξω ότι ορίστηκε ακόμα ένα αντικείμενο.

Μετά καλώ δεύτερη ή ν-οστή φορά. Αυτή τη φορά κάνουμε realloc γιατί έχουμε ήδη δεσμευμένο χώρο και αντικείμενα που δεν πρέπει να χάσουμε!

Τώρα θα πεις <<μάγκα μου, το κατάλαβα, αλλά γιατί έτσι;>>.

1) Έχουμε έναν γενικό πίνακα για να αποθηκεύουμε τα αντικείμενα γιατί δεν ξέρουμε πόσα θα είναι.
2) Ακόμη δεν ξέρουμε τι τύπου θα είναι. Αυτό είναι που λέμε ανεξαρτησία προγράμματος, με την έννοια ότι εγώ θα πάρω τον κώδικα, θα βάλω άλλη μια κλάση (κληρονομημένη προφανώς από την αρχική μας) και το πρόγραμα θα δουλεύει μια χαρά. Για αυτό αποθηκεύω τους pointers! Άμα δεις τη θεωρία αυτό επιτρέπεται (δηλαδή να είναι διαφορετική κλάση), εφόσον οι κλάσεις κληρονομούνται από την ίδια!

Καταρχήν σε ευχαριστώ ειλικρινά φίλε που μπήκες στον κόπο να γράψεις ένα τόσο μεγάλο κείμενο για να μου απαντήσεις στην απορία. Το εκτιμώ ιδιαίτερα διότι το φόρουμ σιγά σιγά καταντάει νεκρό και η βοήθεια αν και αναγκαία είναι πλέον δυσεύρετη.
Μια μικρή διευκρίνιση μόνο πάνω σ' αυτό,ο pointer this  που δίνεται την δεύτερη φορά (διότι εν προκειμένω έχουμε 2 αντικείμενα) διαφέρει από αυτόν που δίνεται την πρώτη και κρατιέται ώστε μετά να γίνει το realloc?
Ρωτάω γιατί έχω δοκιμάσει να δεσμεύσω κατευθείαν 2 θέσεις στον **P εφόσον εδώ ξέρουμε το μέγεθος και να δώσω κατευθείαν και στις 2 τον this.Παρολ' αυτά το πρόγραμμα τρέχει λανθασμένα έτσι.


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: c0ndemn3d on November 30, 2014, 16:28:08 pm
Προφανώς! Γιατί το this αναφέρεται στο αντικείμενο το οποίο ορίζεται εκείνη τη στιγμή! Άρα αυτό που κάνεις είναι να βάλεις το ίδιο αντικείμενο 2 φορές σε 2 διαφορετικές θέσεις μνήμης. Η συνάρτηση αυτή εκτελείται μια φορά ανά αντικείμενο και το this προφανώς κάθε φορά κρατάει εκείνο το αντικείμενο.


Γενικά, εντάξει φαίνεται δύσκολο, αλλά εφόσον έχεις αρκετές απορίες, φρόντισε πρώτα να τελειώσεις την εργασία με τυφλοσούρτη και μετά να δεις τι κάνεις το κάθε κομμάτι της εργασίας (βάζει cout παντού για να δεις τι εκτελείται κάθε φορά).



Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: ablaoublas on November 30, 2014, 17:01:15 pm
Προφανώς! Γιατί το this αναφέρεται στο αντικείμενο το οποίο ορίζεται εκείνη τη στιγμή! Άρα αυτό που κάνεις είναι να βάλεις το ίδιο αντικείμενο 2 φορές σε 2 διαφορετικές θέσεις μνήμης. Η συνάρτηση αυτή εκτελείται μια φορά ανά αντικείμενο και το this προφανώς κάθε φορά κρατάει εκείνο το αντικείμενο.


Γενικά, εντάξει φαίνεται δύσκολο, αλλά εφόσον έχεις αρκετές απορίες, φρόντισε πρώτα να τελειώσεις την εργασία με τυφλοσούρτη και μετά να δεις τι κάνεις το κάθε κομμάτι της εργασίας (βάζει cout παντού για να δεις τι εκτελείται κάθε φορά).



Δεν κατάλαβα γιατί ακριβώς χρησιμοποιούμε τον this, P[0]= this και P[Np-1]=this  ??
Ο this εκείνη την στιγμή τι έχει ? Την διεύθυνση του αντικειμένου product ? Εμείς όμως θέλουμε να έχουμε στον πίνακα διευθύνσεις των παραγόμενων τάξεων σωστά ? Άρα γιατί το κάνουμε αυτό ?


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: c0ndemn3d on November 30, 2014, 17:50:32 pm
Θα εξηγήσω λίγο γενικά τη λειτουργία με το δικό μου project εκείνης της χρονιάς επειδή μπορεί να μπερδεύω λίγο κατά λάθος μου.

Code:
#include <iostream>
#include <cstdlib>
#define MACHINE_POWER 100

using namespace std;
/* Orismos abstract klasews.
   mpainoun statikes metavlites.
   sinithws exoume 4. 1 zeugos gia tin main
   kai ena gia ta dokimastika antikeimena */
  
class Device{
char *single_id;
protected:
static Device **Devices;
static int n;
static Device **ID;
static int m;
public:
Device();
Device(char *id);
char *getType(){return single_id;}
static Device ** getDevices(){return Devices;}
static long int getN(){return n;}
static short int getM(){return m;}
static Device ** getID(){return ID;}
virtual void create(int num) = 0;
virtual float getImax(float V) = 0;
virtual int getFuseType(float I) = 0;
virtual float getPmax() = 0;
virtual float getCable() = 0;
};

Device **Device::Devices;
Device **Device::ID;
int Device::n;
int Device::m;

Device::Device(){
n++;
if(n==1){
Devices = (Device **)malloc(sizeof(Device *));
}
else{
Devices = (Device **)realloc(Devices, n * sizeof(Device *));
}
Devices[n-1] = this;
}

Device::Device(char *id){
single_id = id;
m++;
if(m==1){
ID = (Device **)malloc(sizeof(Device *));
}else{
ID = (Device **)realloc(ID, m*sizeof(Device *));
}
ID[m-1] = this;
}

class Device1:public Device{
float Pmax, dist;
public:
Device1();
Device1(char *p):Device(p){}
void create(int num);
float getImax(float V);
float getPmax();
int getFuseType(float I);
float getCable(){return dist;}
}TEMPORARY_ITEM_1("Device 1");

Device1::Device1():Device(){
cout << "Give Pmax, dist\n";
cin >> Pmax >> dist;
}

void Device1::create(int num){
Device1 *p;
p = new Device1[num];
if(p == 0){
cout << "Could not allocate memory. Terminating program...\n";
exit(0);
}
}

float Device1::getImax(float V){
return Pmax/V;
}

float Device1::getPmax(){
return Pmax;
}

int Device1::getFuseType(float I){
if(I <= 10){
return 0;
}
else if(I <= 16){
return 1;
}
else if(I <= 20){
return 2;
}
else if(I <= 25){
return 3;
}
else{
return -1;
}
}

class Device2:public Device{
float Pmax, dist, c;
public:
Device2();
Device2(char *p):Device(p){}
void create(int num);
float getImax(float V);
float getPmax();
int getFuseType(float I);
float getCable(){return dist;}
}TEMPORARY_ITEM_2("Device 2");

Device2::Device2():Device(){
cout << "Give Pmax, dist, c\n";
cin >> Pmax >> dist >> c;
}

void Device2::create(int num){
Device2 *p;
p = new Device2[num];
if(p == 0){
cout << "Could not allocate memory. Terminating program..\n";
exit(0);
}
}

float Device2::getImax(float V){
return (Pmax + MACHINE_POWER*c)/V;
}

float Device2::getPmax(){
return Pmax;
}

int Device2::getFuseType(float I){
if(I <= 10){
return 0;
}
else if(I <= 16){
return 1;
}
else if(I <= 20){
return 2;
}
else if(I <= 25){
return 3;
}
else{
return -1;
}
}


float get_total_P(Device **devices, float voltage, int numberOfDevices, int *fuseNumber, float *fuseCable){
float totalPower = 0;
for(int i=0; i < numberOfDevices; i++){
int fuse = devices[i]->getFuseType(devices[i]->getImax(voltage));
switch(fuse){
case -1:
cout << "A device has current more that 25 A. It will be excluded.\n";
break;
default:
totalPower += devices[i]->getPmax();
fuseNumber[fuse]++;
fuseCable[fuse] += devices[i]->getCable();
}
}
return totalPower;
}

main(){
Device **types;
types = Device::getID();
int fuseNumber[] = {0, 0, 0, 0};
float voltage, fuseCable[] = {0, 0, 0, 0};
cout << "Give Voltage.\n";
cin >> voltage;
int numberOfTypes = Device::getM();
for(int i=0; i<numberOfTypes; i++){
cout << "Give number of Devices of category: " << types[i]->getType() << "\n";
int numberOfDevices;
cin >> numberOfDevices;
if(numberOfDevices == 0){
continue;
}else{
types[i]->create(numberOfDevices);
}
}
float Power = get_total_P(Device::getDevices(), voltage, Device::getN(), fuseNumber, fuseCable);
cout << "Total power required for eligible devices: " << Power << "\n";
for(int i=0; i<4; i++){
        cout << fuseNumber[i] << " " << fuseCable[i] << "\n";
    }
}

1) Oρίζω κατ' αρχάς την αρχική κλάση Device, από την οποία θα κληρονομείται κάθε άλλο αντικείμενο, ώστε να μπει στον αντίστοιχο πίνακα. Μην ξεχνάτε, ότι δεν θα βάζω στους πίνακες pointers τύπου Device, αλλά οποιουδήποτε άλλου τύπου κληρονομείται από την Device, δηλαδή Device1, Device2 και οποιουδήποτε άλλου τύπου θελήσω να προσθέσω.

2) Έχω δύο constructors σε κάθε κλάση. Δες ότι τους constructors της αρχικής κλάσης τους καλώ εμμέσως μέσω των constructors από τις θυγατρικές. Θα εξηγήσω παρακάτω.

3) Ο ένας constructor για κάθε θυγατρική παίρνει ως όρισμα ένα string και καλεί τον constructor της αρχικής επίσης με to string αυτό. Δες τώρα ότι εκείνος ο constructor (δηλαδή της αρχικής) τοποθετεί τα αντικείμενα αυτά στην ID, ενώ ο άλλος τα τοποθετεί στην Devices.

4) Δες τώρα, ότι ορίζω αντικείμενα με όρισμα string, μόνο κάτω από τον ορισμό κλάσης και αυτό που λέω είναι <<ξέρεις, υπάρχουν αντικείμενα και αυτού του τύπου, βάλε τα στην ID ώστε να ξέρει το πρόγραμμα μετά στη main ότι υπάρχουν αντικείμενα τέτοιου τύπου>>. Δεν μπορώ προφανώς να πω <<βάλε την κλάση μέσα>> οπότε το κάνω έμμεσα ορίζοντας ένα αντικείμενο εκείνης της κλάσης και κάθε φορά δίνω ένα όνομα για να ξέρουμε για ποιον τύπο αντικειμένων μιλάμε.

5) Άρα με τον ορισμό των κλάσεων βάζουμε και ένα αντικείμενο, το οποίο ως αντικείμενο είναι άχρηστο, δεν θα το χρησιμοποιήσουμε ποτέ, απλώς μας δείχνει ότι έχουμε αυτή την κλάση ορισμένη (γίνεται έτσι ώστε το πρόγραμμα να είναι ανεξάρτητο).

6) Έχω τελειώσει με τους ορισμούς των κλάσεων και τώρα μπαίνω στη main. Μέσω της ID έχω 2 αντικείμενα, αλλά μέσω του pointer Devices κανένα.

7) Στη main ορίζω έναν ακέραιο και καλώ την getM, η οποία επιστρέφει το m, το οποίο αν δείτε αυξανόταν όταν ορίζαμε αντικείμενα με string ως όρισμα. Κάνω επανάληψη τόσες φορές και κάθε φορά του λέω <<πες μου πόσα αντικείμενα θες της κατηγορίας types->getType()>>, η οποία μας επιστρέφει εκείνο το string που χρησιμοποιήσαμε κατά τον ορισμό των πρώτων αντικείμενων, ώστε να ξέρουμε για τί πράγμα μιλάμε. Μετά εκτελώ types->create(numberOfDevices). Καλεί δηλαδή, την create, αλλά εκείνη την create του τύπου που έχει ο pointer, γιατί ο πρώτος θα είναι pointer σε τύπου product1 και ο άλλο θα είναι σε product2 κ.ο.κ. άρα ο compiler θα εκτελέσει την κατάλληλη κάθε φορά. Η create αν δεις, κάνει κάθε φορά

p = new Device1[num] για τα αντικείμενα τύπου Device 1 και το αντίστοιχο για τα αντικείμενα τύπου Device2. Εφόσον καλούμε τη new, θα δεσμεύσει num-το-πλήθος αντικείμενα, καλώντας για το κάθε ένα το constructor με void όρισμα και θα τοποθετεί τα οριζόμενα αντικείμενα στην Devices.



Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: c0ndemn3d on November 30, 2014, 17:53:14 pm
Ο constuctor καλείται τόσες φορές, όσες και το όρισμα στη new. Κάθε φορά το this έχει τη διεύθυνση για εκείνο το αντικείμενο που ορίζεται, άρα είναι διαφορετικός κάθε φορά!

Προφανώς τα ορίσματα στη δική σας άσκηση μπορεί να διαφέρουν, εγώ απλώς λές τα γενικά του θέματος.


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on November 30, 2014, 19:28:51 pm
Quote
class A
{...
};

int a;
product b;

product::product()
{...
}
Οι δηλωσεις π.χ. του a και του product που γινονται αναμεσα στη δηλωση της κλασης και τον ορισμο της συναρτησης, ουσιαστικα που ανηκουν? Για ποιο μερος του προγραμματος "ισχυουν"??


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Napoleon on November 30, 2014, 19:35:47 pm
οταν δηλώνεις μεταβλητές εκτός κλάσης-συνάρτησης-main είναι global μεταβλητές.Μπορούν να χρησιμοποιηθούν παντού στο πρόγραμμα(και πχ σε συναρτησεις χωρις να χρειάζεται να τις παρεις σαν ορισματα)


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on November 30, 2014, 19:41:16 pm
οταν δηλώνεις μεταβλητές εκτός κλάσης-συνάρτησης-main είναι global μεταβλητές.Μπορούν να χρησιμοποιηθούν παντού στο πρόγραμμα(και πχ σε συναρτησεις χωρις να χρειάζεται να τις παρεις σαν ορισματα)
ωραια θενξ!  ;)


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: airpap on November 30, 2014, 20:38:01 pm
ρε παιδια, ποσα μεταλλα χρησιμοποιω για το product1 και για το product2?? ενα ειδος μεταλλου δε χρησιμοποιω για καθε τεμαχιο???


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: reservoir dog on November 30, 2014, 21:31:05 pm
Η συναρτηση production σε ποια κλαση ανηκει?


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: airpap on November 30, 2014, 21:37:43 pm
υπαρχει καποιος που μπορει να στειλει την ιδεα του γιατι καιγομαστε ολοι??  :-[


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on November 30, 2014, 21:39:26 pm
ρε παιδια, ποσα μεταλλα χρησιμοποιω για το product1 και για το product2?? ενα ειδος μεταλλου δε χρησιμοποιω για καθε τεμαχιο???
ναι ενα ειδος μεταλλου για καθε τεμαχιο, ειτε product1 ειτε product2, αν καταλαβα καλα. Το ποιο απ΄ολα θα χρησιμοποιησεις λογικα το διαβαζεις (?)   :???:
Η συναρτηση production σε ποια κλαση ανηκει?
Νομιζω πως σε καμια κλαση δε χρειαζεται να ανηκει, αφου χρησιμοποιεις κυριως pointers για προσβαση σε οποια στοιχεια θες  ;)


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: airpap on November 30, 2014, 21:53:32 pm
η συναρτηση production πως θα οριζεται...τι θα εχει για ορισματα??


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: reservoir dog on November 30, 2014, 22:00:44 pm
α ειχα την εντυπωση πως ειναι virtual συναρτηση αρα πρεπει να ανηκει σε κλαση. Οχι?


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: ablaoublas on November 30, 2014, 22:09:43 pm
α ειχα την εντυπωση πως ειναι virtual συναρτηση αρα πρεπει να ανηκει σε κλαση. Οχι?

Όχι, δεν ανήκει σε κλάση (απλή συνάρτηση είναι) και ως ορίσματα δίνεις :


  • product **P     πίνακας με pointers σε αντικείμενα product1 και product2
  • int N               το μέγεθος του πίνακα P 
  • material *m     πίνακας με αντικείμενα τύπου material 
  • int M              το μέγεθος του πίνακα m

Αν είπα κάτι λάθος διορθώστε με !


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Baratheon on November 30, 2014, 22:24:43 pm
συγνωμη για την χαζη ερωτηση αλλα ο constructor product::product() ποτε καλειται???


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Napoleon on November 30, 2014, 22:44:52 pm
συγνωμη για την χαζη ερωτηση αλλα ο constructor product::product() ποτε καλειται???

κάθε φορά που δημιουργεις αντικείμενο δικό της ή παραγόμενης κλάσης(πχ product1)


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Baratheon on November 30, 2014, 22:47:05 pm
δηλαδη οταν στη main γραφω π.χ  product1 P[4] πρωτα εκτελειται ο constructor product::product και αμεσως μετα ο product1::product1?? ( και ολο αυτο 4 φορες?)


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Napoleon on November 30, 2014, 22:49:04 pm
ακριβως


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Baratheon on November 30, 2014, 22:54:40 pm
οκ θενξ!!!


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: reservoir dog on November 30, 2014, 23:12:03 pm
Μπορει καποιος να μου πει ποιες συναρτησεις ποιων κλασεων θα ειναι virtual, καθως και που χρησιμοποιησε κληρονομικοτητα? Το ξερω οτι ζηταω πολλα αλλα ειναι χαωτικη η ασκηση για το level μου :P


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on November 30, 2014, 23:44:29 pm
Μπορει καποιος να μου πει ποιες συναρτησεις ποιων κλασεων θα ειναι virtual, καθως και που χρησιμοποιησε κληρονομικοτητα? Το ξερω οτι ζηταω πολλα αλλα ειναι χαωτικη η ασκηση για το level μου :P
Εκανα μια κλαση product (η βασικη) απο την οποια παραγονται 2 κλασεις, η product1 και η product2..
virtual συναρτησεις εβαλα σε αυτες τις κλασεις, μια συναρτηση που υπολογιζει και επιστρεφει τον ογκο και μια συναρτηση που να επιστρεφει τον αριθμο των τεμαχιων για product1 και product2 ..


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: reservoir dog on November 30, 2014, 23:48:09 pm
Αφού φτιάχνουμε μια virtual για τον υπολογισμο του ογκου, αλλα η μια πραξη χρειαζεται 2 ορισματα ενω για τον κυβο ενα ορισμα τι συμβαινει? Να φτιαξω μια virtual για τον ογκο και απλα στην περιπτωση product 2 να δεχεται σαν δευτερο ορισμα το 1 π.χ ?


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on November 30, 2014, 23:50:52 pm
Οχι και οι δυο συναρτησεις δεν παιρνουν ορισματα! Οριζεις μια συναρτηση που υπολογιζει τον ογκο για τον κυλινδρο στην κλαση product1 αρα εχει προσβαση σε υψος και ακτινα που χρειαζονται για να υπολογισεις τον ογκο! Ομοια για τον κυβο, αρα και οι δυο συναρτησεις επιστρεφουν float και παιρνουν ορισμα void  ;)
και συγκεκριμενα τις εκανα abstract  8))


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on December 01, 2014, 00:20:50 am
Quote
if(p_volume<=m_volume)
{
...............
}
else{
tp=m[j].get_volume()/pv;
if(tp==0)continue;
cout<<"Προϊόν "<<p->get_id()<<" "<<tp<<" τεμάχια από το υλικό "<<m[j].get_id()<<"\n";
sum+=pieces;
m_volume-=tp*pv;
m[j].set_amount(m_volume);
pieces-=tp;
p_volume=pieces*pv;
}
τι σκατα κανει εδω περα???  >:(


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: ablaoublas on December 01, 2014, 00:27:24 am
Quote
if(p_volume<=m_volume)
{
...............
}
else{
tp=m[j].get_volume()/pv;
if(tp==0)continue;
cout<<"Προϊόν "<<p->get_id()<<" "<<tp<<" τεμάχια από το υλικό "<<m[j].get_id()<<"\n";
sum+=pieces;
m_volume-=tp*pv;
m[j].set_amount(m_volume);
pieces-=tp;
p_volume=pieces*pv;
}
τι σκατα κανει εδω περα???  >:(

Ναι αυτό ούτε έγω το πολυκατάλαβα αλλά υποψιάζομαι ότι σε περίπτωση που δεν φτάνει το Χ υλικό για ΟΛΑ τα τεμάχια του προιόντος, κάνει όσα μπόρει για όσα τεμάχια φτάνει το Χ υλικό και για τα υπόλοιπα χρησιμοποιείται το επόμενο υλικό ... Αυτό μάλλον γίνεται στην else ( νομίζω χρησιμοποιεί όγκο ανά τεμάχιο για αυτό το λέω )


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Baratheon on December 01, 2014, 00:32:13 am
και γω αυτο καταλαβα οτι κανει   :D


Title: Re: [C++] Άσκηση E - 2014/2015 - Προθεσμία 30/11/2014
Post by: Vlassis on December 01, 2014, 00:41:42 am
αμα δεν το λεγες δεν θα μου περνουσε καν απο το μυαλο!  ^dontknow^