ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #3
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #3 2 Γενικά Στο Τετράδιο #3 του Εργαστηρίου θα εξοικειωθούμε με τη χρήση της εντολής πολλαπλής επιλογής switch καθώς και με τις εντολές for και while (εντολές προκαθορισμένης επανάληψης και επανάληψης υπό συνθήκη, αντίστοιχα). Με την προσθήκη των τριών αυτών εντολών και με τη χρήση των όσων έχουμε αναλύσει έως τώρα, είμαστε σε θέση να συντάσσουμε πιο σύνθετα προγράμματα που να επιλύουν αντίστοιχα προβλήματα. Η σύνταξη των πιο πάνω εντολών είναι η ακόλουθη: 1. switch (μεταβλητή) case τιμή1: εντολές_1 case τιμή2: εντολές_2;... default: εντολές_d; 2. for (αρχική_τιμή_μεταβλητής; συνθήκη_επανάληψης; ενημέρωση_τιμής_μεταβλητής) εντολή; 3. while (συνθήκη_επανάληψης) εντολή;
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #3 3 Πρόβλημα 1 Να γραφεί πρόγραμμα που να υπολογίζει την δύναμη x y, όπου x,y δύο θετικοί ακέραιοι αριθμοί που αναπαριστούν την βάση και τον εκθέτη αντίστοιχα και δίνονται ως είσοδος από το χρήστη. Προσοχή: Το πρόγραμμα θα πρέπει να κάνει έλεγχο ορθότητας των μεταβλητών (x,y >=0) που εισάγει ο χρήστης. Ανάλυση του προβλήματος Σχεδιάζουμε τον πίνακα Σταθερών και Μεταβλητών, βάση των δεδομένων του προβλήματος: Πίνακας Μεταβλητών & Σταθερών Ονομασία Μεταβλητή / Σταθερά Τύπος Περιγραφή Μεταβλητής power Μεταβλητή Int Το αποτέλεσμα x y x Μεταβλητή Int Η βάση της δύναμης y Μεταβλητή Int Ο εκθέτης της δύναμης i Μεταβλητή (βοηθητική) Int Μετρητής (αυξάνεται κατά ένα σε κάθε επανάληψη) Είναι σημαντικό να προσεγγίσουμε τη λύση του προβλήματος, βάσει του τρόπου με τον οποίο υπολογίζουμε την δύναμη στα μαθηματικά. Π.χ. για τον υπολογισμό του 2 4 σκεφτόμαστε ως εξής: 1 η φορά: 2*1 = 2 2 η φορά: 2*2 = 4 3 η φορά: 2*4 = 8 4 η φορά: 2*8 = 16 (Τελικό αποτέλεσμα) Στο πιο πάνω παράδειγμα βλέπουμε ότι ο αλγόριθμος με τον οποίο σκεπτόμαστε περιέχει την έννοια της επανάληψης, δηλαδή θα πολλαπλασιάσουμε τη βάση με το αποτέλεσμα τόσες φορές όσες μας υποδεικνύει ο εκθέτης και το αποτέλεσμα του πολλαπλασιασμού θα αντικαθιστά κάθε φορά το προηγούμενο αποτέλεσμα. Στη C ο πιο πάνω υπολογισμός απαιτεί τη χρήση επαναληπτικών εντολών (for ή while). Το πρόγραμμα θα πρέπει να ξεκινά την επανάληψη δίνοντας την αρχική τιμή 1 στο αποτέλεσμα (power) και στο μετρητή (i) και στη συνέχεια να πολλαπλασιάζει το αποτέλεσμα με τη βάση (x) εκχωρώντας την νέα τιμή στο αποτέλεσμα (power), μέχρι ο μετρητής i να γίνει ίσος με τον εκθέτη (y). Μπορούμε να υλοποιήσουμε, όπως αναφέραμε νωρίτερα, το συγκεκριμένο πρόγραμμα χρησιμοποιώντας την εντολή for ή την while. Στην ενδεικτική λύση που ακολουθεί η εύρεση της δύναμης γίνεται με την εντολή for. Η λύση με τη χρήση της while αφήνεται σε σας ως εξάσκηση για να κατανοήσετε τη διαφορά στη «λογική» των δύο εντολών (βλ. και ενότητα #5 σημειώσεων).
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #3 4 Συχνά Προγραμματιστικά Σφάλματα: Η χρήση πραγματικών αριθμών στη συνθήκη εξόδου από την επανάληψη, μπορεί, λόγω του μη βαθμωτού (scalar) τύπου των τιμών των πραγματικών αριθμών, να οδηγήσει σε «άπειρη εκτέλεση» των εντολών που περιέχονται στο σώμα της επανάληψης (άπειρο loop). Προγραμματιστικές Συμβουλές Ελέγχετε τις συνθήκες εξόδου από τις εντολές επανάληψης με τη χρήση ακεραίων μετρητών. Προτιμήστε την εντολή for αντί της while όταν είναι εκ των προτέρων γνωστός ο αριθμός των επαναλήψεων. Προτεινόμενη Λύση: /* Προγραμματιστής : Όνομα Επώνυμο, Αριθμός Μητρώου Ημερομηνία συγγραφής : 10/4/2002 Λειτουργία Προγράμματος : Υπολογίζει τη δύναμη x y όπου x,y δύο θετικοί ακέραιοι αριθμοί. */ #include <stdio.h> main () int x,y,i; int power=1; /* Αρχική τιμή της δύναμης */ printf("δώστε την βάση και τον εκθέτη: "); scanf("%d%d",&x,&y); if (x>=0 && y>=0) for(i=1;i<=y;i++) power=x*power; printf("το αποτέλεσμα είναι : %d",power); else printf ("H βάση και ο εκθέτης πρέπει να είναι θετικοί");
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #3 5 Πρόβλημα 2 Να γραφεί πρόγραμμα που να υπολογίζει τη συχνότητα εμφάνισης των γραμμάτων a, b, c (ΚΕΦΑΛΑΙΑ και μικρά), σε μια ακολουθία χαρακτήρων που θα δίνεται από το χρήστη και η οποία θα τερματίζεται με τον χαρακτήρα control-d (EOF) 1. Το πρόγραμμα θα πρέπει να αγνοεί τις αλλαγές γραμμών (/n), τα κενά ( ) και να τυπώνει μήνυμα σε περίπτωση εισαγωγής μη αποδεκτού χαρακτήρα. Στο τέλος θα πρέπει να τυπώνει τον αριθμό εμφάνισης του κάθε γράμματος. Προσοχή: Για να διαβάσουμε την ακολουθία των χαρακτήρων μπορούμε να χρησιμοποιήσουμε τη συνάρτηση getchar(), η οποία επιστρέφει την ακέραια τιμή ενός χαρακτήρα που διαβάστηκε ως είσοδος. Ανάλυση του προβλήματος Σχεδιάζουμε τον πίνακα Σταθερών και Μεταβλητών, βάση των δεδομένων του προβλήματος: Πίνακας Μεταβλητών & Σταθερών Ονομασία Μεταβλητή / Σταθερά Τύπος Περιγραφή Μεταβλητής acount, Μεταβλητές Int Οι μετρητές των γραμμάτων bcount, ccount. Letter Μεταβλητή Char Το γράμμα που εισάγεται Το συγκεκριμένο πρόγραμμα απαιτεί σύνθετη σκέψη. Από τη μία, απαιτείται μια εντολή επανάληψης που να εκτελείται για όσα γράμματα ο χρήστης επιθυμεί να εισάγει. Στην συγκεκριμένη περίπτωση, μιας και ο αριθμός των γραμμάτων που θα εισαχθούν δεν είναι εκ των προτέρων γνωστός θα χρησιμοποιήσουμε την εντολή while. Από την άλλη απαιτείται και μια εντολή που θα ελέγχει κάθε φορά το γράμμα που πληκτρολογήσαμε και θα αυξάνει τον αντίστοιχο μετρητή γραμμάτων. Η εντολή αυτή είναι η switch, η οποία μας επιτρέπει να επιλέγουμε μεταξύ πολλών εναλλακτικών. Στη περίπτωσή μας, έχουμε τρεις επιλογές για τα αποδεκτά γράμματα (a,b,c), μία για την περίπτωση που ο χρήστης πληκτρολογήσει <enter> ή κενό διάστημα, και μία τελευταία (default) για οποιοδήποτε άλλο γράμμα. Προσοχή: Η ακολουθία των χαρακτήρων θα τερματίζεται με τον ειδικό χαρακτήρα Control-D, δηλαδή ο χρήστης θα πρέπει να πατήσει ταυτόχρονα τα πλήκτρα Ctrl και D. 1 Ο χαρακτήρας Control-D (End_Of_File) είναι ένας προκαθορισμένος συνδυασμός πλήκτρων που δηλώνει το τέλος ενός κειμένου. Στη C ο συνδυασμός αυτών των δύο πλήκτρων έχει οριστεί στη βασική βιβλιοθήκη ως η σταθερά EOF και μπορεί να χρησιμοποιηθεί στην συνθήκη ελέγχου μιας εντολής while για τον τερματισμό της επανάληψης.
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #3 6 Συχνά Προγραμματιστικά Σφάλματα: Μην παραλείπετε την πρόταση break στην δομή της switch. Επίσης, όταν επεξεργάζεστε χαρακτήρες πρέπει να συμπεριλαμβάνετε και τους χαρακτήρες αλλαγής γραμμής, αλλιώς είναι δυνατόν να προκληθούν λογικά σφάλματα στο πρόγραμμά σας. Προγραμματιστικές Συμβουλές Συνηθίζεται η default επιλογή στη δομή case της εντολής switch να τοποθετείται στο τέλος, παρόλο που οι προτάσεις case μπορούν να συμβούν με οποιαδήποτε σειρά.
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #3 7 Προτεινόμενη Λύση /* Προγραμματιστής : Όνομα Επώνυμο, Αριθμός Μητρώου Ημερομηνία συγγραφής : 10/4/2002 Λειτουργία Προγράμματος : Μετρά τον αριθμό εμφανίσεως των γραμμάτων : a, b, c. */ #include <stdio.h> main() char letter; int acount = 0, bcount = 0, ccount = 0; printf( "Εισάγετε τα γράμματα.\n" ); printf( "Πληκτρολογείστε Control-D για να τερματιστεί η είσοδος.\n" ); while ( ( letter = getchar() )!= EOF ) switch ( letter ) /* φωλιασμένο switch στη while */ case 'A': case 'a': /* Το γράμμα είναι A ή a */ ++acount; case 'B': case 'b': /* το γράμμα είναι B ή b */ ++bcount; case 'C': case 'c': /* Tο γράμμα είναι C ή c */ ++ccount; case '\n': case' ': /* Αγνοεί τα κενά και τις αλλαγές γραμμών */ default: /* Όλες οι υπόλοιπες περιπτώσεις */ printf( "Λανθασμένη εισαγωγή γράμματος." ); printf( "Εισάγετε νέο γράμμα.\n" ); /* Τέλος του switch */ /* Τέλος του while */ printf( "\nοι συνολικές εμφανίσεις κάθε γράμματος είναι:\n" ); printf( "A: %d\n", acount ); printf( "B: %d\n", bcount ); printf( "C: %d\n", ccount );