ΕΡΓΑΣΤΗΡΙΟ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2014-2015 Στόχοι Εξάσκηση στη βασική είσοδο / έξοδο Εξάσκηση στη χρήση µεταβλητών Φορµαρισµένη είσοδος και έξοδος Δοµές ελέγχου Πριν ξεκινήσετε Βήµα 1 (για όσους δεν το έκαναν την προηγούµενη φορά): Ανοίξτε ένα τερµατικό και γράψτε τα παρακάτω : chmod go-rwx ~/ce120 όπου ce120 είναι ο φάκελος του µαθήµατος. Αν είναι διαφορετικό π.χ ce_120 προσαρµόστε ανάλογα. Επίσης, ανάµεσα στα go και -rwx ΔΕΝ υπάρχει κενό. Βήµα 2: Πηγαίνετε στο φάκελο ce120 και κατασκευάστε µέσα σε αυτόν ένα φάκελο µε όνοµα lab4. Μέσα σε αυτό το φάκελο θα αποθηκεύσετε τις απαντήσεις σας για το σηµερινό εργαστήριο.
Άσκηση 1 Το πρόγραµµα που θα γράψετε για την άσκηση 1 πρέπει να το αποθηκεύσετε σε αρχείο µε όνοµα lab4a.c µέσα στο φάκελο lab4. Προσοχή! Διαβάστε όλη την εκφώνηση της άσκησης πριν αρχίσετε να γράφετε κώδικα! Γράψτε ένα πρόγραµµα σε C που υλοποιεί έναν αυτόµατο πωλητή κρύων ροφηµάτων και αναψυκτικών. Ο πωλητής διαθέτει τις παρακάτω κατηγορίες α) αναψυκτικά/χυµούς β) καφέ και γ) νερό. Οι τιµές τους ορίζονται ως εξής: 1. Τα αναψυκτικά τιµώνται προς 0.8 ευρώ και οι χυµοί προς 1.25 ευρώ, 2. ο καφές προς 1 ευρώ χωρίς γάλα και 1.10 ευρώ µε γάλα και Στις παραπάνω τιµές συµπεριλαµβάνεται ΦΠΑ ως εξής: Αναψυκτικά και χυµοί 13% Καφές 23% Αρχικά, ο πωλητής ρωτάει το είδος του ροφήµατος που επιθυµεί ο πελάτης. Η απάντηση του πελάτη γίνεται µε την υποβολή δύο χαρακτήρων κολλητά (χωρίς κενό µεταξύ τους), ως εξής: R for Refreshment/Juice + ( C for Cola ή L for Lemon Soda ή O for Orange Juice ή M for Mixed Juice). C for Coffee + ( D for dark (no milk) ή M for added milk) Επιτρέπονται πεζά και κεφαλαία γράµµατα κατά την επιλογή του χρήστη. Παραδείγµατα αποδεκτής επιλογής είναι τα παρακάτω: RO, Ro, ro, ro (Refreshment/Juice - Orange Juice) CD, cd, Cd, cd (Coffee Dark ) Αρχικά, το πρόγραµµα εκτυπώνει το παρακάτω µήνυµα: Select your drink: Εάν ο χρήστης βάλει ένα µη επιτρεπτό συνδυαµό (π.χ. cκ, 2C, PO, -J), το πρόγραµµα τερµατίζει αφού εκτυπώσει τον µήνυµα Bad selection! Αφού o χρήστης επιλέξει κάτι που έχει νόηµα, το πρόγραµµα ζητάει τα χρήµατα. Please pay X.XX euros:
Ο χρήστης βάζει ένα δεκαδικό ποσό σε ευρώ. Εάν το ποσό καλύπτει το κόστος της συναλλαγής τότε υπολογίζει τα ρέστα. Εάν το ποσό δεν καλύπτει το απαιτούµενο κόστος, το πρόγραµµα εκτυπώνει το παρακάτω µήνυµα και τερµατίζει. Insufficient Payment! Eάν όλα πάνε καλά, αλλά δεν υπάρχουν ρέστα εκτυπώνει το παρακάτω µήνυµα Please receive your drink. Διαφορετικά εκτυπώνει Please receive your drink and your change. Τέλος, εκτυπώνει την παρακάτω απόδειξη Lines Sub Total: XXXX.XX 1 VΑΤ : VVVV.VV 2 Total : YYYY.YY 3 Payment : PPPP.PP 4 Change : CCCC.CC 5 THANK YOU! 6 Αναλυτικά: οι γραµµές 1, 2,3 αφορούν την µοναδιαία τιµή του είδους που επιλέχθηκε, η γραµµή 4 στο ποσό που καταθέτει ο χρήστης η γραµµή 5 στο ποσό προς επιστροφή στον χρήστη (ρέστα) Οδηγίες µορφοποίησης: Μετά τον χαρακτήρια ':' ακολουθεί χαρακτήρας tab. Οι αριθµοί θα πρέπει να καταλαµβάνουν 4 ακέραια ψηφία και 2 δεκαδικά. Εάν είναι µικρότεροι από 4 ακέραια ψηφία δεν θα πρέπει να γεµίζουν µε µηδενικά. Οι γραµµές 1,2,3 κλπ µε γκρι στα δεξιά της σελίδας ΔΕΝ εκτυπώνονται. Απαραίτητος Κανόνας συγγραφής του προγράµµατος σας Στο πρόγραµµα σας θα πρέπει να χρησιµοποιήσετε την εντολή switch() τουλάχιστον µία φορά. Αρχεία άσκησης 1 προς παράδοση: lab4a.c
Στην παρακάτω εικόνα µπορείτε να δείτε µερικές ενδεικτικές εκτελέσεις του προγράµµµατος
Άσκηση 2 Το πρόγραµµα που θα γράψετε για την άσκηση 2 πρέπει να το αποθηκεύσετε σε αρχείο µε όνοµα lab4b.c µέσα στο φάκελο lab4. Στην άσκηση αυτή θα γράψετε ένα πρόγραµµα το οποίο, δεδοµένων κάποιων αρχικών παραµέτρων, µπορεί να προβλέψει αν ένα χτύπηµα πέναλτι θα καταλήξει σε γκολ, οριζόντιο δοκάρι ή πάνω από το δοκάρι. Στοιχεία προβλήµατος Γνωρίζετε τις παρακάτω πληροφορίες: Το σηµείο του πέναλτι βρίσκεται 11m από την εστία Το οριζόντιο δοκάρι βρίσκεται σε ύψος 2.44m Ο παίκτης στοχεύει ακριβώς ευθεία (πρός το κέντρο της εστίας) Η µπάλα φεύγει από το πόδι του παίκτη µε αρχική ταχύτητα 33.3m/sec Ο τερµατοφύλακας θα πέσει δεξιά (εποµένως δε θα µπορέσει να αποκρούσει) Το πρόγραµµα σας πρέπει να κάνει τα εξής: 1. Ρωτά το χρήστη τη γωνία βολής της µπάλας (σε σχέση µε το έδαφος), σε µοίρες. Η ερώτηση πρέπει να τεθεί ως εξής: Dwste gwnia bolhs se moires (0, 60): Μπορείτε να υποθέσετε ότι ο χρήστης δε θα δώσει ποτέ γωνία 60 µοιρών και πάνω. 2. Υπολογίζει αν η µπάλα θα καταλήξει πάνω από το οριζόντιο δοκάρι ή ακριβώς στο δοκάρι ή κάτω από το δοκάρι κι εκτυπώνει στην οθόνη αντίστοιχο µήνυµα. Αν η µπάλα βρεθεί σε ύψος 2.44m +/- 5cm τότε χτυπά στο δοκάρι και το πρόγραµµα εκτυπώνει στην οθόνη το µήνυµα DOKARI! Αν η µπάλα βρεθεί σε ύψος κάτω από το δοκάρι (δηλαδή κάτω από 2.44m - 5cm), τότε µπαίνει γκολ και το πρόγραµµα εκτυπώνει στην οθόνη το µήνυµα GOAL! Διαφορετικά, η µπάλα βγαίνει έξω και το πρόγραµµα εκτυπώνει το µήνυµα OUT! Οι βασικές ποσότητες µε τις οποίες θα δουλέψετε είναι: v0 : H αρχική ταχύτητα της µπάλας v0x : Η συνιστώσα της αρχικής ταχύτητας στον άξονα x v0y : Η συνιστώσα της αρχικής ταχύτητας στον άξονα y x : Η οριζόντια απόσταση (από την αρχή της βολής µέχρι το τέρµα)
y : Το ύψος (όταν η µπάλα βρίσκεται στο τέρµα) θ : Η γωνία βολής t : Ο χρόνος από την αρχή της βολής µέχρι το τέρµα. Θα χρειαστείτε τις παρακάτω εξισώσεις: Για να µετατρέψετε τις µοίρες σε radians (που είναι η µονάδα που χρησιµοποιούν οι τριγωνοµετρικές συναρτήσεις), πολλαπλασιάζετε τις µοίρες µε π/180. Για το π, χρησιµοποιείστε την τιµή 3.14159. Για να υπολογίσετε τις συνιστώσες της ταχύτητας: v0x = v0 * cos(θ) και v0y = v0 * sin(θ) x = v0x * t y = v0y * t - 0.5 * g * t 2 όπου g είναι η επιτάχυνση της βαρύτητας και έχει τιµή 9.8m/sec 2.
Χρήση των συναρτήσεων sin()/cos() Παράδειγµα χρήσης της συνάρτησης sin(). Αντίστοιχη είναι η χρήση της cos(). #include <stdio.h> /* printf */ #include <math.h> /* sin */ int main (int argc, char *argv[]) { double degrees, sine; const double PI = 3.14159; degrees = 30.0; sine = sin (degrees * PI/180); printf ("The sine of %f degrees is %f.\n", degrees, sine ); return 0; } Μεταγλώττιση προγράµµατος Για να µπορέσετε να χρησιµοποιήσετε µαθηµατικές συναρτήσεις στο πρόγραµµά σας (sin, cos), πρέπει να συµπεριλάβετε τους ορισµούς προτύπων της µαθηµατικής βιβλιοθήκης µε #include<math.h>. Επιπλέον, όταν κάνετε τη µεταγλώττιση πρέπει να χρησιµοποιήσετε και την επιλογή -lm (το πρώτο γράµµα είναι el), ώστε να συνδέσετε το πρόγραµµα σας µε την βιβλιοθήκη µαθηµατικών συναρτήσεων της C. Για παράδειγµα, gcc -Wall penalty.c -o penalty -lm Αρχεία άσκησης 2 προς παράδοση: lab4b.c
Αποστολή του προγράµµατος για διόρθωση και σχολιασµό Για να στείλετε το πρόγραµµά σας για βαθµολόγηση, ανοίξτε ένα τερµατικό (ή χρησιµοποιήστε αυτό του Kate), πηγαίνετε στο φάκελο lab4, και χρησιµοποιήστε την εντολή mkdir για να κατασκευάσετε ένα νέο φάκελο µέσα στο lab4 µε βάση τα ονόµατα των δύο µελών της οµάδας. Για την ακρίβεια, το όνοµα του φακέλου πρέπει να είναι (µε λατινικούς χαρακτήρες) : επώνυµο1_am1_επώνυµο2_αμ2, όπου ΑΜ είναι ο τετραψήφιος αριθµός µητρώου σας. Για παράδειγµα, mkdir doufexi_1234_antonopoulos_5678 Αντιγράψτε τα lab4α.c και lab4b.c µέσα στο νέο φάκελο, όπως παρακάτω: cp -v lab4?.c doufexi_1234_antonopoulos_5678/ Τέλος πακετάρετε και συµπιέστε το φάκελο µε το πρόγραµµά σας. Η εντολή είναι: tar cvzf επώνυµο1_αμ1_επώνυµο2_αμ2.tgz επώνυµο1_αμ1_επώνυµο2_αμ2 Θα πρέπει να δηµιουργηθεί το αρχείο µε όνοµα επώνυµο1_αμ1_επώνυµο2_αμ2.tgz. Αν εµφανιστεί κάποιο µήνυµα λάθους ή δε δηµιουργηθεί το αρχείο, ζητήστε βοήθεια! Στη συνέχεια στείλτε ένα email: στη διεύθυνση: ce120lab@gmail.com µε τίτλο (subject): CE120 lab4 sectionx όπου X είναι ο αριθµός του τµήµατος, πχ section6 για µια οµάδα του τµήµατος 6. CC στο άλλο µέλος της οµάδας σας και στον εαυτό σας συνηµµένο (attached) το αρχείο: επώνυµο1_αμ1_επώνυµο2_αμ2.tgz µέσα στο email γράψτε τα ονόµατα των δύο µελών της οµάδας. Αφού στείλετε το email, επιβεβαιώστε ότι είχε σωστό attachment κι ότι έλαβε αντίγραφο και το άλλο µέλος της οµάδας. Το άλλο µέλος της οµάδας µπορεί να ξεπακετάρει το tgz αρχείο στο δικό του υπολογιστή µε την εντολή tar xvzf επώνυµο1_αμ1_επώνυµο2_αμ2.tgz ΜΗΝ ΞΕΧΑΣΕΤΕ ΝΑ ΚΑΝΕΤΕ LOGOUT ΠΡΙΝ ΦΥΓΕΤΕ!!