Δομές δεδομένων (Structures) Εισαγωγή στη C++ 1
Γενικά Μια δομή (struct) είναι μία συλλογή δεδομένων. Μπορεί να περιέχει πλήθος μεταβλητών οι οποίες μπορεί να είναι διαφορετικών τύπων. Τα στοιχεία που αποτελούν τη δομή ονομάζονται μέλη της δομής. 2
Προσδιορισμός δομής Ξεκινά με τη δεσμευμένη λέξη struct και ακολούθως το όνομα της δομής. Τα άγκιστρα οριοθετούν τα μέλη της δομής. Το ερωτηματικό στο τέλος ορίζει το τέλος της δομής. struct product { int code; string description; double price; 3
Ορισμός και απόδοση τιμών Αφού προσδιορίσουμε μία δομή, μπορούμε να ορίσουμε μεταβλητές αυτού του τύπου. struct product { int code; string description; double price; int main(){ product apple, orange; // μεταβλητές τύπου product apple.code = 101; // αναφορά σε μεταβλητή μέλους της δομής apple.description = "ambrosia"; apple.price = 1.99; cin >> orange.code >> orange.description >> orange.price; //Ορισμός και απόδοση αρχικών τιμών μαζί product banana = { 102, "chiquita", 2.70 4
Εναλλακτικός ορισμός Ο ορισμός των μεταβλητών δομής μπορεί να γίνει και αμέσως μετά τον προσδιορισμό της. struct product { int code; string description; double price; apple, banana, orange, fruits[50]; 5
H δομή ως παράμετρος συνάρτησης struct Book{ string title; string author; string book_id; void readbook(book &bk) { getline(cin, bk.title); // Το getline() διαβάζει ολόκληρη τη γραμμή getline(cin, bk.author); // π.χ Edgar Allan Poe getline(cin, bk.book_id); void printbook(book bk) { cout << "Book title : " << bk.title <<endl; cout << "Book author : " << bk.author <<endl; cout << "Book id : " << bk.book_id <<endl; int main( ){ struct Book book1; readbook(book1); printbook(book1); 6
Ένθετες δομές Μια δομή δεδομένων μπορεί να χρησιμοποιηθεί σαν μέλος άλλης δομής. Η πρόσβαση στα μέλη της ένθετης δομής γίνεται ιεραρχικά. struct employee { int id; double salary; struct company { employee manager; int years; // ένθετη δομή int main(){ company nike; nike.manager.id = 778899; nike.manager.salary = 80000; nike.years = 12; 7
Παράδειγμα 1 Να ορίσετε μια δομή με το όνομα student με τα ακόλουθα μέλη: Αριθμός μητρώου (int) Επώνυμο (string) Τηλέφωνο (int) Εκτοπισμένος (bool) Να ορίσετε ένα πίνακα 20 θέσεων τύπου student με το όνομα C3 και να γίνεται καταχώριση στοιχείων για 20 μαθητές από το πληκτρολόγιο. 8
Παράδειγμα 1 #include <iostream> using namespace std; struct student { int am; string name; int tel; bool ekt; int main(){ student C3[20]; for (int i=0; i<20; i++) cin >> C3[i].am >> C3[i].name >> C3[i].tel >> C3[i].ekt; 9
Παράδειγμα 2 Διαχειρίζεστε μια ιστοσελίδα και θέλετε να υπολογίσετε τα έσοδα από τις διαφημίσεις. Να ορίσετε μια δομή (advertising) που να κρατά δεδομένα για το πλήθος των διαφημίσεων (int), το ποσοστό διαφημίσεων που έχει επιλεγεί για προβολή (int) και το ποσό που κερδίζετε από κάθε διαφήμιση που προβλήθηκε (double). Η είσοδος των δεδομένων να γίνεται από το πληκτρολόγιο. Να υλοποιήσετε μια συνάρτηση (calculate) που να δέχεται σαν παράμετρο μια δομή advertising και να υπολογίζει τα συνολικά κέρδη από τις διαφημίσεις. 10
Παράδειγμα 2 #include <iostream> using namespace std; struct advertising { int total; double percent; double avg; double calculate(advertising ad){ return (ad.total * ad.percent / 100 * ad.avg); int main(){ advertising ads; cin >> ads.total; cin >> ads.percent; cin >> ads.avg; cout << calculate(ads); 11
Παράδειγμα 3 Προσδιορίστε μια δομή (fraction) που να έχει ως μέλη τον αριθμητή (int) και τον παρονομαστή (int) ενός κλάσματος. Να ορίσετε δύο μεταβλητές τύπου fraction για τις οποίες το πρόγραμμα θα δέχεται τα δεδομένα εισόδου από το πληκτρολόγιο. Να υλοποιήσετε συνάρτηση (multiply) η οποία να δέχεται σαν παραμέτρους δύο δομές fraction και να υπολογίζει το γινόμενο των δύο κλασμάτων: (1/2)*(2/3) = (1*2)/(2*3) 12
#include <iostream> using namespace std; Παράδειγμα 3 struct fraction{ int numerator; int denominator; double multiply(fraction f1, fraction f2){ return ((double)(f1.numerator * f2.numerator) / (f1.denominator * f2.denominator)); int main(){ fraction fra1, fra2; cin >> fra1.numerator >> fra1.denominator; cin >> fra2.numerator >> fra2.denominator; cout << multiply(fra1, fra2); 13
Παράδειγμα 4 Προσδιορίστε μια δομή (member) που να έχει ως μέλη τον κωδικό (int), το email (string) και μια ένθετη δομή (date) η οποία θα έχει ως μέλη τη μέρα (int), το μήνα (int) και τη χρονολογία γεννήσεως (int). Το πρόγραμμα θα δέχεται τα δεδομένα για 50 άτομα και θα εμφανίζει το email όσων έχουν γεννηθεί τις 5 Σεπτεμβρίου του 1980. 14
Παράδειγμα 4 #include <iostream> #include <string> using namespace std; struct date{ int d; int m; int y; struct member{ int code; string email; date dob; int main(){ member mem[50]; for (int i=0; i<50; i++) cin >> mem[i].code >> mem[i].email >> mem[i].dob.d >> mem[i].dob.m >> mem[i].dob.y; for (int i=0; i<50; i++) if (mem[i].dob.d == 5 && mem[i].dob.m == 9 && mem[i].dob.y == 1980) cout << mem[i].email << endl; 15