Εργαστηριακή Άσκηση 1 Επανάληψη προγραμματισμού Βασικοί Αλγόριθμοι Είσοδος τιμών από το πληκτρολόγιο Σε όλα τα προγράμματα που θα γράψουμε στην συνέχεια του εξαμήνου θα χρειαστεί να εισάγουμε τιμές σε ένα πίνακα και με βάση αυτές τις τιμές να έχουμε κατάλληλους υπολογισμούς. Δραστηριότητα 1 Χρησιμοποιώντας τον παρακάτω παράρτημα κώδικα να γράψετε ένα πρόγραμμα που θα διαβάζει από το πληκτρολόγιο Ν τιμές και θα τις τυπώνει στην οθόνη. Το N είναι μία σταθερά που έχει γίνει define στην αρχή του προγράμματος. #include <stdio.h> #include <stdlib.h> #define N 5 int main() { int i; int A[N]; //read values for( ){ //use scanf function //ouput values for( ){ //use printf function Υπολογισμός Αθροίσματος Η πιο απλή πράξη που μπορούμε να εκτελέσουμε στα δεδομένα που διαβάσαμε είναι να υπολογίσουμε το άθροισμα των στοιχείων. Για να γίνει αυτό πρέπει να έχουμε μία μεταβλητή sum που θα την αρχικοποιούμε στο 0 (μηδέν) και στη συνέχεια κάθε στοιχείο θα το
προσθέτουμε στη μεταβλητή sum. Δραστηριότητα 2 Χρησιμοποιώντας το πρόγραμμα της δραστηριότητας 1 υλοποιήστε ένα πρόγραμμα όπου θα διαβάζετε ένα πίνακα Ν θέσεων. Στη συνέχεια θα υπολογίζεται το άθροισμα και θα το εκτυπώνετε. Υπόδειξη: Καλό είναι να εμφανίζεται κατάλληλο μήνυμα μαζί με τα αποτελέσματα ώστε να καταλαβαίνει ο χρήστης τι είναι αυτό που βλέπει στην οθόνη. Εύρεση ελάχιστου στοιχείου Πολύ συχνά καλούμαστε να βρούμε το ελάχιστο στοιχείο ενός πίνακα. Για τον λόγο αυτό πρέπει να διατρέξουμε όλο τον πίνακα και να κρατάμε κάθε φορά το τρέχον ελάχιστο. Αρχικά το ελάχιστο είναι το πρώτο στοιχείο. Στη συνέχεια, κάθε στοιχείο το συγκρίνουμε με το τρέχον ελάχιστο και αν είναι μικρότερο τότε ανανεώνουμε το τρέχον ελάχιστο. Άρα θα χρησιμοποιήσουμε μία μεταβλητή min που θα αποθηκεύουμε το τρέχον ελάχιστο. Δραστηριότητα 3 Χρησιμοποιώντας το πρόγραμμα της δραστηριότητας 2 και το παρακάτω τμήμα ψευδοκώδικα υλοποιήστε ένα πρόγραμμα όπου θα διαβάζετε ένα πίνακα Ν θέσεων και στη συνέχεια θα βρίσκετε και θα εκτυπώνετε το ελάχιστο στοιχείο του πίνακα. min=πρώτο στοιχείο; Για κάθε στοιχείο x Αν x < min min=x; τελος αν τελος για Εύρεση θέσης ελαχίστου Ακόμη πιο συχνά από το ελάχιστο θέλουμε την θέση του ελάχιστου. Για τον λόγο αυτό μπορούμε να κρατάμε εκτός από το τρέχον ελάχιστο και την θέση(minpos) όπου το έχουμε βρει. Δραστηριότητα 4 Χρησιμοποιώντας το πρόγραμμα της δραστηριότητας 3 υλοποιήστε ένα πρόγραμμα όπου θα διαβάζετε ένα πίνακα Ν θέσεων και στη συνέχεια θα βρίσκετε και θα εκτυπώνετε το ελάχιστο καθώς και την θέση του. Εργαστηριακή Άσκηση 2
Γραμμική Αναζήτηση Δυαδική Αναζήτηση Ταξινόμηση Φυσαλίδας Γραμμική Αναζήτηση Συχνά καλούμαστε να αναζητήσουμε μέσα σε ένα πίνακα στοιχείο ένα συγκεκριμένο στοιχειό. Αν το στοιχείο αυτό υπάρχει πρέπει να εκτυπώσουμε την θέση στην οποία βρίσκεται αλλίως πρέπει να εμφανίσουμε μήνυμα πως δεν βρέθηκε. Δραστηριότητα 1 Να γραφεί συνάρτηση με προτότυπο: int linear_search(int A[], int x); Η συγκεκριμένη συνάρτηση πρέπει να ψάχνει το στοιχείο x μέσα στον πίνακα Α. Αν το βρει θα επιστρέφει την θέση του αλλιώς θα επιστρέφει -1. Επίσης να γραφεί main που θα ζητάει από τον χρήστη να δώσει τον πίνακα Α και ένα στοιχείο x. Στην συνέχεια ο θα καλείται η συνάρτηση και θα τυπώνετε μήνυμα ανάλογα με το τι επέστρεψε. Δυαδική Αναζήτηση Η γραμμική αναζήτηση πρέπει να ψάξει όλο τον πίνακα για να αποφασίσει αν υπάρχει ή όχι ένα στοιχείο. Για τον λόγο αυτό είναι πολύ αργή στην περίπτωση που ο πίνακας είναι μεγάλος. Αν όμως υποθέσουμε ότι ο πίνακας είναι ταξινομημένος τότε μπορούμε να εφαρμόσουμε την δυαδική αναζήτηση. Δραστηριότητα 2 Να γραφεί συνάρτηση με πρωτότυπο: int binary_search(int A[], int x); Η συγκεκριμένη συνάρτηση θα εφαρμόζει την γραμμική αναζήτηση και στη συνέχεια θα επιστρέφει την θέση του στοιχείου x ή -1 αν δεν υπάρχει στον πίνακα Α. Μπορείτε να χρησιμοποιήσετε το παρακάτω τμήμα κώδικα lower = 0; upper = N -1 while(lower<=upper){ middle = (upper - lower ) / 2; if(a[middle] == x) { return middle; else if(a[middle] < x){
lower = middle + 1; else { upper = middle - 1; return -1; Τέλος να γράψετε μία main για να δοκιμάζετε την συνάρτηση που μόλις γράψατε. Δραστηριότητα 3 Χρησιμοποιώντας το αποτέλεσμα της Δραστηριότητας 2 να δείξετε πια είναι τα ενδιάμεσα βήματα για την δυαδική αναζήτηση. Για να το κάνετε αυτό πρέπει να εκτυπώνετε κάθε φορά το αριστερό άκρο(lower) και το δεξί άκρο(upper). Ταξινόμηση φυσαλιδας (bubble sort) Η πιο απλή μέθοδος να ταξινομήσουμε τα δεδομένα είναι η ταξινόμηση φυσαλίδας. Σε αυτή τα μικρότερα στοιχεία ανεβαίνουν τις θέσεις όπως οι φυσαλίδες στο νερό. Έτσι προέκυψε και το όνομά της. Ένας ενδεικτικός κώδικας για την φυσαλίδα είναι ο ακόλουθος: int i,j,tmp; for(i=ν-2;i>=0;i--){ for(j=0;j<=i;j++){ if(α[j]>α[j+1]){ tmp=α[j]; Α[j]=Α[j+1]; Α[j+1] = tmp; Δραστηριότητα 4 Να γράψετε μια συνάρτηση που θα δέχεται που θα δέχεται ως όρισμα ένα πίνακα και θα εφαρμόζει την ταξινόμηση της φυσαλίδας. Για να δοκιμάσετε την συνάρτηση να γράψετε και μία main που θα την καλεί κατάλληλα. Δραστηριότητα 5 Χρησιμοποιώντας το αποτέλεσμα της Δραστηριότητας 4, να δείξετε πως είναι ο πίνακας μετά από κάθε βήμα. Για να το κάνετε αυτό πρέπει μετά από κάθε επανάληψη του i να εκτυπώσετε ολόκληρο τον πίνακα.
Εργαστηριακή Άσκηση 3 Ταξινόμηση Εισαγωγής Ταξινόμηση Επιλογής Ταξινόμηση εισαγωγής (insertion sort) Ο συγκεκριμένος αλγόριθμος θεωρεί ένα αρχικό τμήμα ταξινομημένο ως προς τον εαυτό του και το υπόλοιπο τμήμα μη ταξινομημένο Σε κάθε βήμα παίρνει το πρώτο στοιχείο από το μη ταξινομημένο και το εισάγει στο ταξινομημένο. Στη συνέχεια υπάρχει ενδεικτικός ψευδοκώδικας για την ταξινόμηση της εισαγωγής. for (i = 1; i < n; i++) { key = A[i]; j = i - 1; while ((j >= 0) && (key < a[j])) { a[j + 1] = a[j]; j----; a[j + 1] = key; Δραστηριότητα 1 Να γράψετε μια συνάρτηση που θα δέχεται που θα δέχεται ως όρισμα ένα πίνακα και θα εφαρμόζει την ταξινόμηση εισαγωγής. Για να δοκιμάσετε την συνάρτηση να γράψετε και μία main που θα την καλεί κατάλληλα. Δραστηριότητα 2 Χρησιμοποιώντας το αποτέλεσμα της Δραστηριότητας 1, να δείξετε πως είναι ο πίνακας μετά από κάθε βήμα. Για να το κάνετε αυτό πρέπει μετά από κάθε επανάληψη του i να εκτυπώσετε ολόκληρο τον πίνακα. Ταξινόμηση επιλογής (selection sort) O συγκεκριμένος αλγόριθμος σε κάθε βήμα εκτελεί μία εύρεση ελαχίστου από μία θέση μέχρι το τέλος. Αφού βρει το ελάχιστο το τοποθετεί στη θέση και στην συνέχεια πηγαίνει στην επόμενη θέση και ψάχνει ξανά για ελάχιστο. Η εύρεση ελαχίστου θα γίνει σε πλήθος στοιχείων μειωμένο κατά ένα. Έτσι, σε κάθε βήμα τοποθετεί το κάθε στοιχείο στη σωστή θέση και μειώνει το πλήθος των στοιχείων που πρέπει να ταξινομηθούν κατά ένα. Στη συνέχεια υπάρχει ενδεικτικός ψευδοκώδικας για την ταξινόμηση της επιλογής.. for (i = 0; i < (SIZE-1); i++) {
min = i; for (j = (i+1); j < SIZE; j++) { if(num[j] < num[min]) { min = j; if (i!= min) { swap = num[i]; num[i] = num[min]; num[min] = swap; Δραστηριότητα 3 Να γράψετε μια συνάρτηση που θα δέχεται που θα δέχεται ως όρισμα ένα πίνακα και θα εφαρμόζει την ταξινόμηση επιλογής. Για να δοκιμάσετε την συνάρτηση να γράψετε και μία main που θα την καλεί κατάλληλα. Δραστηριότητα 4 Χρησιμοποιώντας το αποτέλεσμα της Δραστηριότητας 3, να δείξετε πως είναι ο πίνακας μετά από κάθε βήμα. Για να το κάνετε αυτό πρέπει μετά από κάθε επανάληψη του i να εκτυπώσετε ολόκληρο τον πίνακα.
Εργαστηριακή Άσκηση 4 Ταξινόμηση Συγχώνευσης Ταξινόμηση συγχώνευσης (merge sort) Ο συγκεκριμένος αλγόριθμος είναι ένα αναδρομικός αλγόριθμος και ανήκει στην κατηγορία των αλγορίθμων διαίρει και βασίλευε. Σε κάθε βήμα διαιρεί την είσοδο σε δύο τμήματα και καλείται αναδρομικά ώστε να ταξινομήσει καθένα από τα δύο τμήματα. Στη συνέχεια, αφού ταξινομηθούν τα δύο τμήματα, εκτελεί μία συγχώνευση δύο ταξινομημένων πινάκων. Στη συνέχεια, υπάρχει ο κώδικας για την συγχώνευση δύο ταξινομημένων πινάκων μεγέθους N και M αντίστοιχα. int merge(int A[N], int B[M], int C[K]) { int i,j,k; i=j=k=0; while(i<n && j <M){ if(a[i]<b[j]){ C[k]=A[i]; i++; else{ C[k]=B[j]; j++; k++; while(i<n){ C[k]=A[i]; k++; i++; while(j<m){ C[k]=B[j]; k++; j++; Δραστηριότητα 1 Να γράψετε μια συνάρτηση που θα δέχεται που θα δέχεται ως ορίσματα τρεις πίνακες ακεραίων και δύο ακεραίους. Οι δύο πρώτοι πίνακες είναι ταξινομημένοι και η συνάρτηση θα τους συγχωνεύσει και θα τους αποθηκεύσει στον τρίτο πίνακα. Οι δύο ακέραιοι που παίρνει ως
όρισμα η συνάρτηση θα είναι το μέγεθος των δύο πινάκων αντίστοιχα. Δραστηριότητα 2 Να γράψετε μια συνάρτηση που θα δέχεται που θα δέχεται ως όρισμα ένα πίνακα και θα εφαρμόζει την ταξινόμηση συχγώνευσης. Για να δοκιμάσετε την συνάρτηση να γράψετε και μία main που θα την καλεί κατάλληλα. Στην συνέχεια η υπάρχει ο κώδικας για την συνάρτηση υλοποίησης της merge_sort. void merge_sort(int A[], int N) { int i,j; int B[N/2], C[N/2]; if(n<=1) return ; for(i=0; i<n/2; i++){ B[i]=A[i]; for(i=n/2; i<n; i++){ C[i-N/2] = A[i]; merge_sort(b,n/2); merge_sort(c,n/2); merge(b,c,a,n/2,n/2); Δραστηριότητα 3 Χρησιμοποιώντας το αποτέλεσμα της Δραστηριότητας 2, να δείξετε πως είναι ο πίνακας μετά από κάθε βήμα. Για να το κάνετε αυτό πρέπει μετά από κάθε αναδρομική κλήση να εκτυπώσετε ολόκληρο τον πίνακα. Δοκιμάστε ως είσοδο τα νούμερα {2,1,4,7,3,9,6,0.
Εργαστηριακή Άσκηση 5 Quicksort - Ταχυταξινόμηση Quicksort Ο συγκεκριμένος αλγόριθμος είναι ένα αναδρομικός αλγόριθμος και ανήκει στην κατηγορία των αλγορίθμων διαίρει και βασίλευε. Σε κάθε βήμα διαλέγει ένα τυχαίο στοιχείο x και το τοποθετεί στην σωστή του θέση με βάση την αύξουσα σειρά ταξινόμησης. Για να το βρει την θέση του μετράει πόσα στοιχεία είναι μικρότερα από αυτό. Στην συνέχεια, με κατάλληλες αντιμεταθέσεις, φέρνει όλα τα στοιχεία που είναι μικρότερα του x, αριστερά του, ενώ δεξιά του φέρνει όλα τα μεγαλύτερα. Στην συνέχεια υπάρχει κώδικας για την υλοποίηση της quicksort void quick_sort(int A[], int low, int upper) { int i,j, pivot, pos,tmp; if(low>=upper) return; pivot = A[low]; pos=low; for(i=low+1; i<=upper; i++){ if(a[i]<pivot){ pos++; A[low]=A[pos]; A[pos]= pivot; i=low; j=upper; while(i<pos && j>pos){ while(a[i]<pivot && i<pos){ i++; if(i>=pos) break; while(a[j]>pivot && j>pos){ j--; if(j<=pos) break; tmp=a[i]; A[i]=A[j]; A[j]=tmp; quick_sort(a,low,pos-1); quick_sort(a,pos+1,upper);
Δραστηριότητα 1 Να γράψετε την παραπάνω συνάρτηση σε ένα πρόγραμμα και να υλοποιήσετε κατάλληλη main που θα την καλεί με είσοδο τον πίνακα {2,1,4,7,3,9,6,0. Δραστηριότητα 2 Να τροποποιήσετε το παραπάνω πρόγραμμα ώστε να εμφανίζει και τα ενδιάμεσα βήματα του αλγορίθμου quicksort. Για να το πετύχετε αυτό πρέπει να βάλετε μία εντολή εκτύπωσης του πίνακα πρίν τις δύο αναδρομικές κλήσεις της quicksort.