#2 Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Σχολή Τεχνολογικών Εφαρμογών Ακαδημαϊκό έτος 2016-2017 ΤΕΙ Ηπείρου - Άρτα Δομές Δεδομένων και Αλγόριθμοι (εργαστήριο) Γκόγκος Χρήστος Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα: Ορίζουν ένα vector ακεραίων και προσθέτουν σε αυτό τις τιμές 12, 33,9, 16,20 Διανύουν το vector με τη χρήση iterator και κάθε τιμή η οποία είναι άρτια την διπλασιάζουν Ταξινομούν το vector σε φθίνουσα σειρά Εμφανίζουν τα στοιχεία του vector vector<int> v; v.push_back(12); v.push_back(33); v.push_back(9); v.push_back(16); v.push_back(20); vector<int>::iterator iter; for(iter=v.begin();iter!=v.end();iter++) if (*iter %2==0) *iter*=2; sort(v.begin(), v.end(), greater<int>()); for(iter=v.begin();iter!=v.end();iter++) cout << *iter << " "; Ποια είναι τα include που χρειάζεται να γίνουν έτσι ώστε να μπορούν να εκτελεστούν οι παραπάνω εντολές #include <vector> 2. Δίνεται η συνάρτηση interchange η οποία πραγματοποιεί αντιμετάθεση δύο ακεραίων αριθμών. void interchange(int &a, int &b) { int temp = a; a=b; b=temp; int main(){ int x=5,y=10; cout << "BEFORE: x=" << x << " y=" << y << endl; interchange(x,y); cout << "AFTER: x=" << x << " y=" << y << endl; BEFORE: x=5 y=10 AFTER: x=10 y=5 Μετατρέψτε τη συνάρτηση interchange έτσι ώστε με τη χρήση template να μπορεί να χρησιμοποιηθεί και για άλλους τύπους δεδομένων. Καλέστε τη νέα συνάρτηση για την αντιμετάθεση δύο πραγματικών μεταβλητών και δύο μεταβλητών τύπου χαρακτήρα. template <class T> void interchange(t &a, T &b) { T temp = a;
a=b; b=temp; int main(){ double x=5.1,y=10.2; cout << "BEFORE: x=" << x << " y=" << y << endl; interchange(x,y); cout << "AFTER: x=" << x << " y=" << y << endl; char z='a',w='b'; cout << "BEFORE: z=" << z << " w=" << w << endl; interchange(z,w); cout << "AFTER: z=" << z << " w=" << w << endl; Ερώτημα Β 1. Να γράψετε πρόγραμμα που να δημιουργεί έναν πίνακα με 100 τυχαίες ακέραιες τιμές στο διάστημα από 1 μέχρι και 1000. Η παραγωγή των τυχαίων τιμών να γίνει με τη συνάρτηση rand() και με seed τον αριθμό μητρώου σας. Να ταξινομήσετε τις τιμές σε αύξουσα σειρά χρησιμοποιώντας τη συνάρτηση sort της STL. Να υπολογίσετε το άθροισμα των πρώτων 20 τιμών. int main() { int seed = 12345; int a[100]; srand(seed); for (int i=0;i<100; i++) a[i] = (rand() % 1000) + 1; sort(a, a+100); int sum =0; for(int i=0;i<20;i++) sum += a[i]; cout << "SUM " << sum << endl; Seed: 12345 Αποτελέσματα: SUM 1974 Ερώτημα Γ 1. Να γράψετε πρόγραμμα που να δημιουργεί πίνακα Α με 1.000 τυχαίες ακέραιες τιμές στο διάστημα [1, 10.000] και πίνακα Β με 100.000 τυχαίες ακέραιες τιμές στο ίδιο διάστημα τιμών. Η παραγωγή των τυχαίων τιμών να γίνει με τη συνάρτηση rand() και με seed τον αριθμό μητρώου σας. Χρησιμοποιώντας τη συνάρτηση binary_search της STL να βρεθεί πόσες από τις τιμές του Β υπάρχουν στον πίνακα Α. Να χρονομετρηθεί η εκτέλεση του κώδικα. #include <ctime> #define N 1000 #define M 100000 int main() { clock_t t1=clock(), t2; int seed = 12345; int a[n]; int b[m]; srand(seed);
for (int i=0;i<n; i++) a[i] = (rand() % 10000) + 1; for (int i=0;i<m; i++) b[i] = (rand() % 10000) + 1; sort(a, a+n); int c =0; for (int i=0;i<m;i++) if (binary_search(a, a+n, b[i])) c++; t2 = clock(); cout << "Result " << c << " Time " << (double) (t2-t1)/clocks_per_sec << endl; Result 9734 Time elapsed 0.027 2. Να γράψετε πρόγραμμα που να δημιουργεί πίνακα Α με 1.000 τυχαίες ακέραιες τιμές στο διάστημα [1, 10.000] και πίνακα Β με 100.000 τυχαίες ακέραιες τιμές στο ίδιο διάστημα τιμών. Χρησιμοποιώντας τη συνάρτηση δυαδικής αναζήτησης που δίνεται να βρεθεί πόσες από τις τιμές του Β υπάρχουν στον πίνακα Α. Να χρονομετρηθεί η εκτέλεση του κώδικα. #include <ctime> #define N 1000 #define M 100000 template<class T> int binary_search(t a[], int l, int r, T key) { int m = (l + r) / 2; if (l > r) { return -1; else if (a[m] == key) { return m; else if (key < a[m]) { return binary_search(a, l, m - 1, key); else { return binary_search(a, m + 1, r, key); int main() { clock_t t1=clock(), t2; int seed = 12345; int a[n]; int b[m]; srand(seed); for (int i=0;i<n; i++) a[i] = (rand() % 10000) + 1; for (int i=0;i<m; i++) b[i] = (rand() % 10000) + 1; sort(a, a+n); int c =0; for (int i=0;i<m;i++) if (binary_search(a, 0, N-1, b[i])!=-1) c++; t2 = clock(); cout << "Result " << c << " Time " << (double) (t2-t1)/clocks_per_sec << endl; Result 9734 Time elapsed 0.015
Ερώτημα Δ 1. Να γράψετε ένα πρόγραμμα που να ορίζει τη δομή ypallhlos η οποία θα περιέχει τα πεδία: onoma, misthos, eth_proyphresias. Στη συνέχεια να διαβάζει τα περιεχόμενα του αρχείου data_ypallhlos_struct20.txt 1 με στοιχεία υπαλλήλων, να ταξινομεί τους υπαλλήλους με βάση το μισθό τους και να εμφανίζει ταξινομημένα τα στοιχεία όλων των υπαλλήλων με βάση το μισθό τους σε φθίνουσα σειρά. Για την ταξινόμηση να χρησιμοποιηθεί η συνάρτηση sort της STL. #include <sstream> #include <fstream> #define N 20 typedef struct { string onoma; int misthos; int eth_proyphresias; ypallhlos; bool ypallhlos_sort(ypallhlos &a, ypallhlos &b){ return a.misthos>b.misthos; int main(int argc, char **argv) { const char* fn = "data_ypallhlos_struct20.txt"; fstream filestr; string buffer; filestr.open(fn); ypallhlos ypa[n]; int i=0; while (getline(filestr, buffer)) { stringstream ss(buffer); ss >> ypa[i].onoma; ss >> ypa[i].misthos; ss >> ypa[i].eth_proyphresias; i++; filestr.close(); sort(ypa, ypa+n, &ypallhlos_sort); for(i=0;i<n;i++) cout << ypa[i].onoma << " " << ypa[i].misthos << " " << ypa[i].eth_proyphresias << endl; 2. Να γίνει η προηγούμενη άσκηση χρησιμοποιώντας vector στη θέση του πίνακα. #include <sstream> #include <fstream> #include <vector> typedef struct { string onoma; int misthos; int eth_proyphresias; ypallhlos; bool ypallhlos_sort(ypallhlos &a, ypallhlos &b){ return a.misthos>b.misthos; 1 Κατεβάστε το αρχείο από το https://www.dropbox.com/s/03833ux4bqrwk4z/data_ypallhlos_struct20.txt?dl=0
int main(int argc, char **argv) { const char* fn = "data_ypallhlos_struct20.txt"; fstream filestr; string buffer; filestr.open(fn); vector<ypallhlos> v; ypallhlos ypa; while (getline(filestr, buffer)) { stringstream ss(buffer); ss >> ypa.onoma; ss >> ypa.misthos; ss >> ypa.eth_proyphresias; v.push_back(ypa); filestr.close(); sort(v.begin(), v.end(), &ypallhlos_sort); for(int i=0;i<v.size();i++) cout << v[i].onoma << " " << v[i].misthos << " " << v[i].eth_proyphresias << endl; 3. Να γίνει το ερώτημα Δ.1 χρησιμοποιώντας τη συνάρτηση quick_sort που δίνεται στη συνέχεια. #include <sstream> #include <fstream> #define N 20 struct ypallhlos { string onoma; int misthos; int eth_proyphresias; bool operator<(ypallhlos other) { return misthos > other.misthos; ; template<class T> int partition(t a[], int l, int r) { int p = l; int i = l + 1; for (int j = l + 1; j <= r; j++) { if (a[j] < a[p]) { swap(a[j], a[i]); i++; swap(a[p], a[i - 1]); return i - 1; template<class T> void quick_sort(t a[], int l, int r) { if (l >= r) return; else { int p = partition(a, l, r); quick_sort(a, l, p - 1); quick_sort(a, p + 1, r); int main(int argc, char **argv) { const char* fn = "data_ypallhlos_struct20.txt"; fstream filestr;
string buffer; filestr.open(fn); ypallhlos ypa[n]; int i=0; while (getline(filestr, buffer)) { stringstream ss(buffer); ss >> ypa[i].onoma; ss >> ypa[i].misthos; ss >> ypa[i].eth_proyphresias; i++; filestr.close(); quick_sort(ypa, 0, N-1); for(i=0;i<n;i++) cout << ypa[i].onoma << " " << ypa[i].misthos << " " << ypa[i].eth_proyphresias << endl;