ΣΕΤ ΑΣΚΗΣΕΩΝ 2 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2009-20010 Προθεσµία: 15/11/09, 23:59 Στόχοι Χρήση συναρτήσεων Χρήση µονοδιάστατων πινάκων Διαχείριση συµβολοσειρών Φορµαρισµένη έξοδος δεδοµένων Χρήση σχολίων και αναγνωσιµότητα προγράµµατος Συµµόρφωση µε προδιαγραφές εισόδου/εξόδου Πριν ξεκινήσετε Κατεβάστε και αποσυµπιέστε το αρχείο hw2tests.tgz το οποίο περιέχει ενδεικτικές εισόδους και εξόδους για κάθε στάδιο. Διαβάστε την εκφώνηση προσεκτικά και σχεδιάστε το πρόγραµµά σας στο χαρτί. Αποφασίστε τι µεταβλητές θα χρειαστείτε, τι ονόµατα θα τους δώσετε, αν χρειάζονται σταθερές κι αν ναι για ποιες ποσότητες και τι δοµές θα χρησιµοποιήσετε για κάθε λειτουργία. Μη διστάζετε να ζητήσετε βοήθεια! Μπορείτε να χρησιµοποιήσετε το forum προγραµµατισµού (http://inf-server.inf.uth.gr/courses/coding/) και φυσικά email. Μην προσπαθήσετε να γράψετε το πρόγραµµα ολόκληρο από την αρχή. Για κάθε στάδιο που ολοκληρώνετε, βεβαιωθείτε ότι λειτουργεί σωστά και µετά να προχωράτε στο επόµενο στάδιο. Σε κάθε στάδιο σας δίνουµε µια εκτίµηση της δυσκολίας του (διαβάθµιση απο 1 έως 4). Η εργασία αυτή είναι ατοµική. Μπορείτε να συζητάτε τις ασκήσεις µε συµφοιτητές σας αλλά δεν επιτρέπεται η ανταλλαγή κώδικα µε οποιοδήποτε τρόπο. Ξεκινήστε νωρίς! Ο προγραµµατισµός είναι πάντα ΠΟΛΥ πιο χρονοβόρος από ό,τι περιµένετε. Εκπρόθεσµες ασκήσεις δε γίνονται δεκτές.
'Ασκηση: Αυτόµατος διορθωτής διαγωνισµάτων Θα γράψετε ένα πρόγραµµα το οποίο χρησιµοποιείται για να κάνει αυτόµατη διόρθωση ενός τεστ πολλαπλών απαντήσεων. Το πρόγραµµα διαβάζει τις σωστές απαντήσεις, διαβάζει τις απαντήσεις των φοιτητών και υπολογίζει το σκορ κάθε φοιτητή και στοιχειώδη στατιστικά για την απόδοση της τάξης. Ακολουθούν λεπτοµερείς οδηγίες για το πώς πρέπει να λειτουργεί το πρόγραµµά σας και στάδια κατασκευής του. ΜΗΝ προσπαθήσετε να γράψετε όλο το πρόγραµµα σε ένα βήµα γιατί θα κάνετε λάθη και θα σας πάρει πολύ περισσότερο χρόνο. Κάθε στάδιο χτίζει πάνω στο προηγούµενο. Υπάρχει περίπτωση ένα στάδιο να µεταβάλλει τον κώδικα προηγουµένου σταδίου. Στάδιο 1: Εισαγωγή δεδοµένων και έλεγχος απαντήσεων ( ) Γράψτε ένα πρόγραµµα το οποίο διαβάζει και βαθµολογεί τις απαντήσεις που έδωσαν 15 φοιτητές σε ένα τεστ που πολλαπλών απαντήσεωντο πρόγραµµά σας πρέπει να εκτελεί τις εξής λειτουργίες: Διαβάζει από το πληκτρολόγιο µια συµβολοσειρά η οποία αποτελείται από χαρακτήρες 'Α', 'Β', 'C' και 'D' και αναπαριστά τις σωστές απαντήσεις. Μπορείτε να θεωρήσετε ότι υπάρχουν ακριβώς 20 ερωτήµατα. Για κάθε φοιτητή, διαβάζει από το πληκτρολόγιο ένα τετραψήφιο ακέραιο ο οποίος αναπαριστά τον αριθµό µητρώου ενός φοιτητή και µια συµβολοσειρά η οποία αποτελείται από 20 χαρακτήρες που αναπαριστούν τις απαντήσεις που έδωσε ο φοιτητής. Μπορείτε να θεωρήσετε ότι ο φοιτητής απάντησε όλα τα ερωτήµατα και οι απαντήσεις είναι πάντα 'A' ή 'B' ή 'C' ή 'D'. Κάθε φορά που διαβάζει τις απαντήσεις ενός φοιτητή, τις συγκρίνει µε τις σωστές απαντήσεις και αποθηκεύει το σκορ του φοιτητή (πλήθος απαντήσεων που δόθηκαν σωστά) Στο τέλος, εκτυπώνει για κάθε φοιτητή τον αριθµό µητρώου, ο οποίος καταλαµβάνει 4 θέσεις (µε µηδενικά στην αρχή αν χρειάζεται), άνω-κάτω τελεία και τέλος το σκορ, το οποίο πρέπει να είναι ένας ακέραιος που καταλαµβάνει 3 θέσεις. Οι πληροφορίες για κάθε ένα φοιτητή εµφανίζονται σε νέα γραµµή. Το πρόγραµµά σας πρέπει να χρησιµοποιεί τα εξής: Ένα string (πίνακα χαρακτήρων) στο οποίο αποθηκεύονται οι σωστές απαντήσεις Ένα πίνακα ακεραίων στον οποίο αποθηκεύονται τα ΑΕΜ των φοιτητών Ένα πίνακα ακεραίων στον οποίο αποθηκεύονται τα σκορ των φοιτητών. Θεωρείστε ότι το ΑΕΜ και το σκορ κάθε φοιτητή βρίσκονται σε αντίστοιχες θέσεις στους δύο πίνακες. Εκτός από τα παραπάνω θα χρειαστείτε και άλλες βοηθητικές δοµές και µεταβλητές. Δείτε τα παραδείγµατα ενδεικτικής εισόδου και αντίστοιχης εξόδου γι'αυτό το στάδιο στο φάκελο stage1tests. Παρατηρείστε πώς δεν υπάρχουν µηνύµατα που ενηµερώνουν το χρήστη για το τι δεδοµένα πρέπει να δώσει.
Για να µπορέσετε να εµφανίζετε µηδενικά στην αρχή κάποιου ΑΕΜ που τα πρώτα του ψηφία είναι 0, υπάρχει ένας ειδικός κωδικός στο printf. Θα πρέπει να βρείτε µόνοι σας ποιος είναι αυτός. Ολοκληρώστε αυτό το στάδιο και βεβαιωθείτε ότι λειτουργεί σωστά πριν προχωρήσετε στο επόµενο. Στάδιο 2: Μεταβλητός αριθµός φοιτητών/ερωτήσεων ( ) Στο προηγούµενο στάδιο θεωρήσατε ότι ο αριθµός των ερωτήσεων είναι πάντα 20 και ο αριθµός των φοιτητών πάντα 15. Σε αυτό το στάδιο θα αλλάξετε το πρόγραµµά σας ώστε να µπορεί να λειτουργήσει για µεταβλητό αριθµό ερωτήσεων και φοιτητών, υπό την προϋπόθεση ότι αυτοί δεν ξεπερνούν το 20 και το 15 αντίστοιχα. Προσθέστε κώδικα στην αρχή του προγράµµατος ο οποίος: διαβάζει το πλήθος των ερωτήσεων αν το πλήθος υπερβαίνει το 20 ή είναι µικρότερο του 1, το ξαναδιαβάζει έως ότου δοθεί αριθµός στο σωστό εύρος διαβάζει το πλήθος των φοιτητών αν το πλήθος υπερβαίνει το 15 ή είναι µικρότερο του 1, το ξαναδιαβάζει έως ότου δοθεί αριθµός στο σωστό εύρος µεταβάλλει τον υπόλοιπο κώδικα του πρώτου σταδίου ώστε να λειτουργεί για το συγκεκριµένο αριθµό φοιτητών και ερωτήσεων. Οι θέσεις των πινάκων που "περισσεύουν" µένουν κενές και δεν πρέπει να χρησιµοποιούνται πουθενά. Δείτε τα παραδείγµατα ενδεικτικής εισόδου και αντίστοιχης εξόδου γι'αυτό το στάδιο στο φάκελο stage2tests Απαγορεύεται αυστηρά η χρήση καθολικών µεταβλητών. Ολοκληρώστε αυτό το στάδιο και βεβαιωθείτε ότι λειτουργεί σωστά πριν προχωρήσετε στο επόµενο. Στάδιο 3: Εισαγωγή συναρτήσεων ( ) Στο πρώτο στάδιο, ο έλεγχος ορθότητας των απαντήσεων κάθε φοιτητή έγινε µέσα στη main. Σε αυτό το στάδιο θα µεταβάλλετε το πρόγραµµά σας ώστε αυτός ο έλεγχος να γίνεται µέσω µιας συνάρτησης την οποία καλείτε από τη main. Γράψτε µια συνάρτηση η οποία συγκρίνει τις απαντήσεις που έδωσε ένας φοιτητής µε τις σωστές απαντήσεις και υπολογίζει και αποθηκεύει το σκορ του στον αντίστοιχο πίνακα. Η συνάρτησή σας πρέπει οπωσδήποτε να παίρνει ως παραµέτρους τον πίνακα των σκορ και τον πίνακα που περιέχει τις σωστές απαντήσεις. Θα χρειαστούν κι άλλες παράµετροι - πρέπει να αποφασίσετε ποιες. Η συνάρτηση δε χρειάζεται να επιστρέφει τίποτα. Καλέστε τη συνάρτησή σας στο κατάληλο σηµείο της main. Απαγορεύεται αυστηρά η χρήση καθολικών µεταβλητών. Για τον έλεγχο του προγράµµατός σας µπορείτε να χρησιµοποιήσετε τα ίδια παραδείγµατα εισόδου/
εξόδου µε το στάδιο 2. Ολοκληρώστε αυτό το στάδιο και βεβαιωθείτε ότι λειτουργεί σωστά πριν προχωρήσετε στο επόµενο. Στάδιο 4: Υπολογισµός στατιστικών ( ) Γράψτε µια συνάρτηση η οποία παίρνει ως παραµέτρους τον πίνακα των σκορ και ό,τι άλλο χρειάζεται και κάνει τους εξής υπολογισµούς: Μετρά πόσοι φοιτητές έχουν απαντήσει σωστά τουλάχιστον το 90% των ερωτήσεων Μετρά πόσοι φοιτητές έχουν απαντήσει σωστά τουλάχιστον το 70% των ερωτήσεων, αλλά λιγότερο από το 90% Μετρά πόσοι φοιτητές έχουν απαντήσει σωστά τουλάχιστον το 50% των ερωτήσεων, αλλά λιγότερο από το 70% Μετρά πόσοι φοιτητές έχουν απαντήσει σωστά λιγότερο από το 50% των ερωτήσεων Μετά τους υπολογισµούς, η συνάρτησή σας πρέπει να εκτυπώνει τα αποτελέσµατα ως εξής: Στην πρώτη γραµµή εµφανίζεται ο βαθµός Α, άνω-κάτω τελεία, και το πλήθος των φοιτητών της πρώτης κατηγορίας. Το πλήθος καταλαµβάνει 2 θέσεις. Στη δεύτερη γραµµή εµφανίζεται ο βαθµός B, άνω-κάτω τελεία, και το πλήθος των φοιτητών της δεύτερης κατηγορίας. Το πλήθος καταλαµβάνει 2 θέσεις. Στην τρίτη γραµµή εµφανίζεται ο βαθµός C, άνω-κάτω τελεία, και το πλήθος των φοιτητών της τρίτης κατηγορίας. Το πλήθος καταλαµβάνει 2 θέσεις. Στην τέταρτη γραµµή εµφανίζεται ο βαθµός F, άνω-κάτω τελεία, και το πλήθος των φοιτητών της τέταρτης κατηγορίας. Το πλήθος καταλαµβάνει 2 θέσεις. Καλέστε τη συνάρτησή σας στο τέλος της main. Δείτε τα παραδείγµατα ενδεικτικής εισόδου και αντίστοιχης εξόδου γι'αυτό το στάδιο στο φάκελο stage4tests. Στάδιο 5: Επαλήθευση () Βεβαιωθείτε ότι το πρόγραµµά σας διαβάζει την είσοδο και εκτυπώνει την έξοδο ακριβώς όπως περιγράφεται παραπάνω. Μπορείτε να χρησιµοποιήσετε και το διαθέσιµο εκτελέσιµο προγραµµα για να δείτε πώς πρέπει να λειτουργεί το πρόγραµµά σας. Χρησιµοποιήστε ανακατεύθυνση και την εντολή diff όπως περιγράφεται στο πρώτο σετ ασκήσεων.
Πώς να παραδώσετε τη δουλειά σας (Ακολουθείστε τις οδηγίες ακριβώς αλλιώς η άσκησή σας δε θα διορθωθεί και θα θεωρηθεί µη παραδοτέα) Αποθηκεύστε το πρόγραµµά σας σε ένα αρχείο µε όνοµα hw2.c Κατασκευάστε ένα φάκελο µε όνοµα επ ώνυμο_ όνομα_ ΑΕΜ _email και αντιγράψτε µέσα σε αυτόν το hw2.c Πηγαίνετε στο φάκελο µέσα στον οποίο βρίσκεται το επ ώνυμο_ όνομα_ ΑΕΜ _email που κατασκευάσατε και γράψτε την παρακάτω εντολή: tar czf epwnumo_onoma_aem_email.tgz epwnumo_onoma_aem_email Στείλτε email στη διεύθυνση ce120lab@gmail.com και ένα αντίγραφο (CC) στον εαυτό σας µε θέµα (subject) "CE120 hw2 tmimax " (όπου Χ είναι ο αριθµός του τµήµατος σας, δηλαδή 1-5) και επικολληµένο αρχείο το epwnumo_onoma_aem_email.tgz Όταν έρθει το αντίγραφο που στείλατε στον εαυτό σας, επιβεβαιώστε οτι περιέχει το σωστό αρχείο και ότι το αρχείο περιέχει τον κώδικά σας. Αν έχει γίνει κάποιο λάθος µπορείτε να ξαναστείλετε την άσκηση, εφόσον δεν έχει περάσει η προθεσµία.
Παράρτηµα Α: Ανακατεύθυνση στο Linux Μέχρι στιγµής, έχετε δεί πως να γράφετε ένα πρόγραµµα που διαβάζει από το πληκτρολόγιο και γράφει στην οθόνη. Αυτό που συµβαίνει στην πραγµατικότητα είναι ότι το πρόγραµµα διαβάζει από το λεγόµενο standard input (stdin, προκαθορισµένη είσοδος) και γράφει στο λεγόµενο standard output (stdout, προκαθορισµένη έξοδος). Τυπικά, το standard input είναι συνδεδεµένο µε το πληκτρολόγιο και το standard output µε την οθόνη. Στην πρώτη άσκηση του σηµερινού εργαστηρίου θέλουµε να διαβάσουµε από το πληκτρολόγιο 120 αριθµούς. Αυτό είναι αρκετά µεγάλο νούµερο - θα ήταν πιο πρακτικό αν είχαµε αυτούς τους αριθµούς σε ένα αρχείο και διαβάζαµε από το αρχείο. Το Linux µας επιτρέπει να επιτύχουµε κάτι τέτοιο µε την "ανακατεύθυνση". Όταν το πρόγραµµα παράγει έξοδο, µπορούµε να την ανακατευθύνουµε από την οθόνη σε ένα αρχείο. Οµοίως, όταν το πρόγραµµα θέλει να διαβάσει είσοδο, την ανακατευθύνουµε ώστε να γίνεται από αρχείο, αντί από το πληκτρολόγιο. Για να ανακατευθύνουµε την είσοδο χρησιµοποιούµε το ειδικό σύµβολο < Παράδειγµα:./myprogram < input Το πρόγραµµα myprogram παίρνει την είσοδό του από το αρχείο input. Για να ανακατευθύνουµε την έξοδο χρησιµοποιούµε το ειδικό σύµβολο > Παράδειγµα:./myprogram > output Το πρόγραµµα myprogram γράφει την έξοδό του στο αρχείο output. Παράδειγµα:./myprogram < input > output Το πρόγραµµα myprogram παίρνει την είσοδό του από το αρχείο input και γράφει την έξοδό του στο αρχείο output. Γράψτε σε ένα αρχείο µε όνοµα data.c το παρακάτω πρόγραµµα: #include<stdio.h> int main(int argc, char *argv[]) { int i; for (i=0; i<120; i++) { printf( %d\n, i); } return 0; } Κάντε compile κι εκτελέστε το. Θα δείτε να τυπώνει στην οθόνη 120 αριθµούς. Τώρα, εκτελέστε το µε ανακατεύθυνση εξόδου προς ένα αρχείο µε όνοµα data:./data > numbers.txt Δε θα εµφανιστεί τίποτα στην οθόνη, αλλά αν ανοίξετε το numbers.txt θα δείτε µέσα τους 120 ακεραίους.
Παράρτηµα Β: Σύγκριση αρχείων Η εντολή diff του Linux χρησιµοποιείται για να ελέγχουµε αν δυο αρχεία είναι ίδια. Δοκιµάστε τη! Φτιάξτε ένα αντίγραφο του αρχείου data.c από το προηγούµενο παράρτηµα και ονοµάστε το data2.c. Μετά, στη γραµµή εντολής γράψτε: diff -b data.c data2.c Δε θα βγεί τίποτα γιατί τα αρχεία είναι ίδια. Τώρα, κάντε κάποιες αλλαγές στο data2.c και ξαναδοκιµάστε. To diff θα παρουσιάσει όλες τις διαφορές ανάµεσα στα δύο προγράµµατα. Μπορείτε να χρησιµοποιείτε ανακατεύθυνση για να εκτυπώνετε την έξοδο ενός προγράµµατός σας σε αρχείο, να κάνετε το ίδιο και για την έξοδο του εκάστοτε εκτελέσιµου που σας δίνουµε και µετά να χρησιµοποιήσετε diff για να δείτε αν τα αποτελέσµατα είναι ίδια. Με τον ίδιο τρόπο θα ελέγχουµε κι εµείς τα αποτελέσµατα των προγραµµάτων σας όποτε είναι δυνατό. Παράρτηµα C: Μαθηµατική βιβλιοθήκη Αν το πρόγραµµά σας χρησιµοποιεί συναρτήσεις από τη µαθηµατική βιβλιοθήκη (όπως οι sin, cos, round, κτλ), τότε πρέπει να κάνετε δύο πράγµατα για παραχθεί εκτελέσιµο: 1. Να προσθέσετε τη γραµµή #include<math.h> στην αρχή του προγράµµατος. 2. Όταν κάνετε compile να προσθέσετε την επιλογή -lm στο τέλος της εντολής (gcc)