Ερώτημα Α 1. Να γράψετε τις εντολές που πραγματοποιούν τα ακόλουθα:

Σχετικά έγγραφα
#2. Templates, η βιβλιοθήκη STL, μέτρηση χρόνου εκτέλεσης κώδικα, αλγόριθμοι ταξινόμησης, αλγόριθμοι αναζήτησης

Δομές Δεδομένων και Αλγόριθμοι

Εργαστήριο 2: Πίνακες

Κατανεμημένα και Παράλληλα Συστήματα (εργαστήριο) Παραδείγματα με openmp

Δομές Δεδομένων και Αλγόριθμοι - Εργαστήριο 1 Βασικές έννοιες στη C και στη C++

#4. Heaps (σωροί), η ταξινόμηση HeapSort, η δομή std::priority_queue της STL

Εκφωνήσεις ασκήσεων εργαστηρίου 2 (pthreads)

#1. Δείκτες, πίνακες, δομές, αντικείμενα και αρχεία

Εκφωνήσεις ασκήσεων εργαστηρίου 1

Δομές Δεδομένων και Αλγόριθμοι ΜΕΡΟΣ Α Εργαστήριο (C++) Τ.Ε.Ι. Ηπείρου - Τμήμα Μηχανικών Πληροφορικής Τ.Ε. Χρήστος Γκόγκος

Δομές Δεδομένων και Αλγόριθμοι

ΑΣΚΗΣΕΙΣ ΓΙΑ ΤΟ ΕΡΓΑΣΤΗΡΙΟ 2

Αλγόριθμοι Ταξινόμησης Μέρος 1

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

Προχωρημένες έννοιες προγραμματισμού σε C

Εργαστηριακή Άσκηση 1

Δομές Επανάληψης. Εισαγωγή στη C++

Συναρτήσεις (Functions) Εισαγωγή στη C++

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Δομές Δεδομένων & Αλγόριθμοι

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εργαστήριο 6: Αναζήτηση, Ανάλυση Πολυπλοκότητας

Προηγµένα Θέµατα Τεχνολογιών Υλοποίησης Αλγορίθµων

Εργαστήριο 3 Εντολή for while, do while

ιαφάνειες παρουσίασης #4

Δομές Δεδομένων & Αλγόριθμοι

Standard Template Library (STL)

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

242 -ΕισαγωγήστουςΗ/Υ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Τεχνολογίες Υλοποίησης Αλγορίθµων

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

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

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

Δομές Δεδομένων & Αλγόριθμοι

Προγραμματισμός Η/Υ (ΤΛ2007 )

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

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

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

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

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

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

8. ΠΙΝΑΚΕΣ (ARRAYS) (Πρόχειρο σχέδιο - Μαθήµατος 5) //26. Array.cpp #include <iostream> using namespace std;

Φροντιςτήριο. Linked-List

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

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

TEMPLATES, STL ΠΡΟΓΡΑΜΜΑΤΑ ΜΕ ΠΟΛΛΑ ΑΡΧΕΙΑ

Αλγόριθμοι Ταξινόμησης Μέρος 2

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Προγραµµατισµός Ι Εργαστήριο 13ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 13 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Γ7.1 Επανάληψη ύλης Β Λυκείου. Γ Λυκείου Κατεύθυνσης

19. ΠΡΟΤΥΠΑ (TEMPLATES)

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 2 : Αλγόριθμοι. Δρ. Γκόγκος Χρήστος

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

Δομές δεδομένων (2) Αλγόριθμοι

Κατανεμημένος και Παράλληλος Προγραμματισμός

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

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

B1. Σειρά :

Τεχνολογίες Υλοποίησης Αλγορίθµων

Δομές Δεδομένων και Αλγόριθμοι (Γ εξάμηνο) Τμήμα Μηχανικών Πληροφορικής ΤΕ, ΤΕΙ Ηπείρου. Άσκηση εργαστηρίου #6 (Υλοποίηση δυαδικού δένδρου αναζήτησης)

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

test.txt #include <iostream> #include <fstream> int main()

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Κεφάλαιο 8.6. Πίνακες ΙI (Διάλεξη 17)

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

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

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

ΕΛΛΗΝΙΚΟ ΑΝΟΙΚΤΟ ΠΑΝΕΠΙΣΤΗΜΙΟ

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

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

Μεθόδων Επίλυσης Προβλημάτων

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

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

Προγραμματισμός Ι (ΗΥ120)

24ος ΠΑΝΕΛΛΗΝΙΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Γλώσσα Προγραμματισμού C

Υπολογιστικά Mαθηματικά II

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

Προγραµµατισµός Ι Εργαστήριο 6ο Ακαδ. Έτος ΕΡΓΑΣΤΗΡΙΟ 6 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

Προγραμματιστικές Τεχνικές

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

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Προγραμματισμός Η/Υ (ΤΛ2007 )

Transcript:

#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;