ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ Ακαδημαϊκό έτος 2007-2008 ΤΡΙΤΟΣ ΚΥΚΛΟΣ ΑΣΚΗΣΕΩΝ Οι παρακάτω ασκήσεις είναι μέρος των εργαστηρίων του μαθήματος Προγραμματιστικές Τεχνικές. Υπάρχουν τέσσερις κύκλοι ασκήσεων. Ο τρίτος κύκλος αντιστοιχεί στο 15% του συνολικού βαθμού. Η υποβολή του προγράμματος αυτόματα δηλώνει ότι είσθε οι μοναδικοί συγγραφείς της λύσης της άσκησης. Εάν το πρόγραμμα ή μέρος αυτού έχει αντιγραφεί θα πρέπει να αναφέρεται η πηγή του και ο συγγραφέας του. ΑΣΚΗΣΗ 3-1. (40%) Α. ΠΕΡΙΓΡΑΦΗ Σχεδιάστε και υλοποιήσετε ένα πρόγραμμα στη γλώσσα προγραμματισμού C το οποίο θα υπολογίζει μία από τις ρίζες ενός πολυωνύμου χ 0 που βρίσκεται ανάμεσα σε δύο σημεία χ 1, χ 2. Συγεκριμένα, σ αυτή την άσκηση θα χρησιμοποιήσετε ένα αλγόριθμο που ονομάζεται bisection. H ιδέα είναι ότι εάν έχουμε μία συνάρτηση f η οποία είναι συνεχής στο διάστημα [x1, x2] και το πρόσημα f(x1), f(x2) διαφέρουν τότε υπάρχει τουλάχιστον μία ρίζα x0 της f μεταξύ των σημείων x1, x2. Ο αλγόριθμος είναι απλός και δίδεται παρακάτω. Αυτή η άσκηση εξετάζει την υλοποίηση αυτού του αλγόριθμου Bisection Κενρική ιδέα: Ας υποθέσουμε ότι η συνάρτηση f η οποία είναι συνεχής στο διάστημα [x 1, x 2 ] και το πρόσημα f(x 1 ), f(x 2 ) διαφέρουν (Σχήμα 1). Τότε υπάρχει τουλάχιστον μία ρίζα x 0 της f μεταξύ των σημείων x 1, x 2. Η ερώτηση είναι πώς υπολογίζουμε το χ 0?
f(x) X0 x x1 x2 Σχήμα 1 Το σημείο x 0 υπολογίζεται με τον παρακάτω αλγόριθμο. f1 = f(x1) if(f1*f(x2) >0) then error = true /* Δεν υπάρχει ρίζα μεταξύ του χ1 και του χ2 */ else error = false x_middle = (x1+x2)/2 while(abs((x1 x_middle)) > epsilon) { f_mid = f(x_middle) if(f1 * f_mid) <= 0) then x2 = x_middle else x1 = x_middle f1 = f_mid endif x_middle = (x1+x2)/2 endwhile root = x_middle endif Το πρόγραμμά σας θα διαβάζει από τον χρήστη ένα πολυώνυμο με τη παρακάτω μορφή π.χ.: ΒΑΘΜΟΣ ΠΟΛΥΩΝΥΜΟΥ?: 2 ΣΥΝΤΕΛΕΣΤΗΣ ΟΡΟΥ 2?: 4 ΣΥΝΤΕΛΕΣΤΗΣ ΟΡΟΥ 1?: 4 ΣΥΝΤΕΛΕΣΤΗΣ ΟΡΟΥ 0?: 1 Η ΤΙΜΗ Χ1 είναι?: -1 Η ΤΙΜΗ Χ2 είναι?: 1 Το παραπάνω πολυώνυμο του παραδείγματος είναι το 4χ 2 + 4χ + 1 Το πρόγραμμα θα τυπώνει το παρακάτω αποτέλεσμα Η ΡΙΖΑ ΤΟΥ ΠΟΛΥΩΝΥΜΟΥ 4χ^2 + 4χ + 1 ΜΕΤΑΞΥ -1 ΚΑΙ 1 ΕΙΝΑΙ -0.5 Το πρόγραμμα θα σταματάει όταν ο χρήστης δώσει σαν βαθμό πολυωνύμου 0.
Β. ΤΙ ΘΑ ΠΡΕΠΕΙ ΝΑ ΠΑΡΑΔΩΣΕΤΕ Τον πηγαίο κώδικά σας σε ένα ξεχωριστό αρχείο έτοιμο να συμβολο-μεταφραστεί με τη χρήση του συμβολομεταφραστεί με το εργαλείο gcc ή στο περιβάλλον DevC++. Στις πρώτες γραμμές του πηγαίου κώδικα να αναφέρετε τα ονόματα σας και τους αριθμούς των φοιτητικών μητρώων σας. Θα αποστείλετε τον πηγαίο κώδικά σας με e-mail στη διεύθυνση που θα ανακοινωθεί στο μάθημα. Τα αποτελέσματα του προγράμματος θα πρέπει να είναι στη μορφή που παρουσιάσθηκε παραπάνω. ΒΑΘΜΟΛΟΓΙΑ Η βαθμολογία υπολογίζεται με άριστα το 50 ως εξής: -10% του βαθμού της άσκησης για τη μη επεξήγηση του αλγόριθμου -15% του βαθμού της άσκησης για κακή στοίχιση του πηγαίου κώδικα -5% του βαθμού της άσκησης για ελλιπή σχόλια στον πηγαίο κώδικα -5% του βαθμού της άσκησης για κακή ονομασία των μεταβλητών -5% του βαθμού της άσκησης για κακή χρήση εντολών (π.χ. παραπάνω από ότι χρειάζονται εντολές) -50% του βαθμού της άσκησης για τη συνολική μη σωστή λειτουργία του προγράμματος και της μορφής εκτύπωσης. ΑΣΚΗΣΗ 3-2. (60%) Α. ΠΕΡΙΓΡΑΦΗ Σχεδιάστε και υλοποιήσετε ένα πρόγραμμα στη γλώσσα προγραμματισμού C το οποίο θα υλοποιεί μία μικρή βάση δεδομένων με τους μαθητές μίας τάξης και θα υπολογίζει τον τελικό βαθμό κάθε μαθητή και το μέσο όρο της τάξης. Ο κάθε μαθητής θα μοντελοποιείται με μια δομή (struct) στη παρακάτω μορφή: typedef struct { char * firstname; char * lastname; int idnumber; studentrecordtype * marks; } studenttype;
Ο «φάκελος» κάθε μαθητή με τους βαθμούς της πρώτης και δεύτερης άσκησης, της προόδου, και του τελικού διαγωνίσματος μοντελοποιούνται σε μία δομή όπως παρακάτω: typedef struct { float firstassignment; /* Ο βαθμός της πρώτης άσκησης */ float secondassignment; /* Ο βαθμός της δεύτερης άσκησης */ float midterm; /* Ο βαθμός της προόδου */ float final; /* Ο βαθμός του τελικού διαγωνίσματος */ float finalmark; /* Ο γενικός βαθμός για το μάθημα */ } StudentRecordType; Υπολογίστε ότι για αυτή την ιδεατή τάξη η πρώτη άσκηση είναι το 10% του βαθμού, η δεύτερη άσκηση το 15% του βαθμού, η πρόοδος το 25% του βαθμού, και το τελικό διαγώνισμα το 50% του βαθμού. Όλες οι βαθμολογίες τους είναι με άριστα το 100. Η τάξη θα είναι υλοποιημένη σαν μία συνδεδεμένη λίστα που κάθε κόμβος της θα είναι της μορφής struct classnodestruct{ StudentType *astudent; classnodestruct *next; }; typedef struct classnodestruct classnodetype; Γραφικά η «Τάξη» θα είναι:
*astudent *next *astudent *next.. *astudent *next firstname lastname idnumber *marks firstassignment secondassignment midterm final finalmark <αριθμός μαθητών> <όνομα> <επώνυμο> <βαθμός πρώτης άσκησης> <βαθμός δεύτερης άσκησης> <βαθμός προόδου> <βαθμός τελικού διαγωνίσματος> <όνομα> <επώνυμο> <βαθμός πρώτης άσκησης> <βαθμός δεύτερης άσκησης> <βαθμός προόδου> <βαθμός τελικού διαγωνίσματος>... END Π.χ. 20 Yiannis Yiannopoulos 90 78 67 80 Kostas Kontogiannis 50 60 40 90. END Να υλοποιήσετε ένα πρόγραμμα το οποίο: 1. Θα διαβάζει τα δεδομένα 2. Θα υπολογίζει τον τελικό βαθμό κάθε μαθητή 3. Θα υπολογίζει το μέσο όρο της τάξης 4. Θα τυπώνει τα αποτελέσματα με τη παρακάτω μορφή.
ΑΠΟΤΕΛΕΣΜΑΤΑ ------------------------- ΑΝΑΛΥΤΙΚΑ <όνομα> <επώνυμο> <τελικός βαθμός> <όνομα> <επώνυμο> >τελικός βαθμός>... ΜΕΣΟΣ ΟΡΟΣ ΤΑΞΗΣ <μέσος όρος> Κάθε μία από τις παραπάνω λειτουργίες 1-4 θα πρέπει να υλοποιείται σαν μία ξεχωριστή συνάρτηση, Η βάση θα πρέπει να υλοποιηθεί σαν ένα διάνυσμα δομών στοιχείων τύπου StudentType ή σαν ένα διάνυσμα δεικτών σε δομές τύπου StudentType. Β. ΤΙ ΘΑ ΠΡΕΠΕΙ ΝΑ ΠΑΡΑΔΩΣΕΤΕ Τον πηγαίο κώδικά σας σε ένα ξεχωριστό αρχείο έτοιμο να συμβολο-μεταφραστεί με τη χρήση του συμβολομεταφραστεί με το εργαλείο gcc ή στο περιβάλλον DevC++. Στις πρώτες γραμμές του πηγαίου κώδικα να αναφέρετε τα ονόματα σας και τους αριθμούς των φοιτητικών μητρώων σας. Θα αποστείλετε τον πηγαίο κώδικά σας με e-mail στη διεύθυνση που θα ανακοινωθεί στο μάθημα. Τα αποτελέσματα του προγράμματος θα πρέπει να είναι στη μορφή που παρουσιάσθηκε παραπάνω. ΒΑΘΜΟΛΟΓΙΑ Η βαθμολογία υπολογίζεται με άριστα το 50 ως εξής: -15% του βαθμού της άσκησης για κακή στοίχιση του πηγαίου κώδικα -5% του βαθμού της άσκησης για ελλιπή σχόλια στον πηγαίο κώδικα -5% του βαθμού της άσκησης για κακή ονομασία των μεταβλητών -5% του βαθμού της άσκησης για κακή χρήση εντολών (π.χ. παραπάνω από ότι χρειάζονται εντολές) -50% του βαθμού της άσκησης για τη συνολική μη σωστή λειτουργία του προγράμματος και της μορφής εκτύπωσης.