Πανεπιστήµιο Πατρών Τµήµα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ(C++) οµηµένος Προγραµµατισµός και οµές Ελέγχου 1 οµές Ελέγχου Περίληψη 2.1 Εισαγωγή 2.2 Αλγόριθµοι 2.4 οµές ελέγχου 2.9 Γράφοντας αλγορίθµους βήµα βήµα 2.11 Τελεστές ανάθεσης 2.12 Τελεστές αύξησης και µείωσης 2.16 switch οµή πολλαπλής επιλογής 2.17 do/while οµή επανάληψης 2.18 break και continue 2.19 Λογικοί τελεστές 2.20 Σύγχυση ισότητας µε ανάθεση 2.21 Περίληψη δοµηµένου προγραµµατισµού 2 1
2.1 Εισαγωγή Πριν γράψουµε ένα πρόγραµµα Κατανοούµε πλήρως το πρόβληµα Σχεδιάζουµε προσεκτικά την παρεχόµενη λύση Όσο γράφουµε το πρόγραµµα Γνωρίζουµε ποια δοµικά µέρη είναι διαθέσιµα Χρησιµοποιούµε σωστές αρχές προγραµµατισµού 3 2.2 Αλγόριθµοι Υπολογιστικά προβλήµατα Επιλύονται εκτελώντας µια αλληλουχία από ενέργειες µε καθορισµένη σειρά Αλγόριθµος µια διαδικασία που καθορίζει: Ενέργειες που εκτελούνται ιαταγή που εκτελείται Παράδειγµα: συνταγή Έλεγχος προγράµµατος Ορίζει τη σειρά που θα εκτελεστούν οι εντολές/ δηλώσεις 4 2
2.4 οµές Ελέγχου C++ keywords ε µπορούν να χρησιµοποιηθούν ως ονόµατα µεταβλητών ή προσδιοριστικά (identifiers) C++ Keyword s Keywords common to the C and C++ programming languages auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while C++ only keywords asm bool catch class const_cast delete dynamic_cast explicit false friend inline mutable namespace new operator private protected public reinterpret_cast static_cast template this throw true try typeid typename using virtual wchar_t 5 2.9 ιατύπωση Αλγορίθµων (Επανάληψη) Υποθέστε ότιτο το πρόβληµα είναι: Αναπτύξτε ένα πρόγραµµα υπολογισµού του µέσου όρου µιας τάξης µαθητών που θα επεξεργαστεί έναν αυθαίρετο αριθµό βαθµών κάθε φορά που τρέχει το πρόγραµµα Αγνωστος αριθµός σπουδαστών Πώςτο πρόγραµµα ξέρει πότε γιανα τελειώσει; Τιµή φρουρός είχνει "το τέλος της εισαγωγής δεδοµένων" Οβρόχος τελειώνει όταν γίνει εισαγωγή της τιµής φρουρού Επιλέγεται έτσι ώστε να µην µπορεί να γίνει σύγχησή τουµε µετην κανονική εισαγωγή τιµών -1 στην περίπτωση αυτή 6 3
2.9 ιατύπωση Αλγορίθµων (Επανάληψη) Top-down down:από επάνω προς τα κάτω, σταδιακός καθαρισµός Αρχίζουµε µε τον ψευδοκώδικα της κορυφής Καθορίστε το µέσο όρο της τάξης για το διαγώνισµα ιαιρέστε την κορυφή σε µικρότερους στόχους, καταγράψτε τους µε τη σειρά Αρχικοποίησε τις µεταβλητές Εισαγωγή, άθροιση και καταµέτρηση των βαθµών (Input, sum and count) Υπολόγισε και εκτύπωσε το µέσο όρο 7 2.9 ιατύπωση Αλγορίθµων (Επανάληψη) Πολλά προγράµµατα έχουν τρεις φάσεις Έναρξη Αρχικοποιεί τις µεταβλητές προγράµµατος Επεξεργασία Εισαγωγή δεδοµένων, προσαρµόζει τις µεταβλητές Τερµατισµός Υπολογισµός και εκτύπωση τελικού αποτελέσµατος Βοηθά τη διάσπαση του προγράµµατος για την ανάλυση top-down 8 4
2.9 ιατύπωση Αλγορίθµων (Επανάληψη) Αναλύουµε τη φάση έναρξης Αρχικοποίηση µεταβλητών σηµαίνει Αρχικοποίησε το σύνολο total στο µηδέν Αρχικοποίησε το µετρητή counter στο µηδέν Επεξεργασία Εισαγωγή, άθροιση και µέτρηση των βαθµών σηµαίνει Εισαγωγή τον πρώτο βαθµό (ενδεχοµένως και το φρουρό) While ο χρήστης δεν έχει εισάγει το φρουρό Πρόσθεσε το βαθµό στο τρέχον total Πρόσθεσε ένα στο counter Εισαγωγή του επόµενου βαθµού 9 2.9 ιατύπωση Αλγορίθµων (Επανάληψη) Τερµατισµός Υπολόγισε και εκτύπωση το µέσο όρο σηµαίνει If ο µετρητής counter δεν είναι ίσος µε µηδέν Όρισε το µέσο όρο ως το σύνολο total διαιρεµένο µε τον µετρητή counter Εκτύπωσε το µέσο όσο Else Εκτύπωσε εν εισάχθηκαν βαθµοί Στη συνέχει ο κώδικας C++ 10 5
1 // Fig. 2.9: fig02_09.cpp 2 // Class average program with sentinel-controlled repetition. 3 #include <iostream> //input-output stream header file 4 5 using std::cout;//the standard output stream; 6 using std::cin; //the standard input stream; 7 using std::endl;//outputs a newline, then "flushes the output buffer." 8 using std::fixed; //display a specific number of digits 9 10 #include <iomanip> // parameterized stream manipulators 11 12 using std::setprecision; // sets numeric output precision 13 14 // function main begins program execution 15 int main() 16 { 17 int total; // sum of grades 18 int gradecounter; // number of grades entered 19 int grade; // grade value 20 21 double average; // number with decimal point for average 22 23 // initialization phase 24 total = 0; // initialize total 25 gradecounter = 0; // initialize loop counter Ο τύπος δεδοµένων double χρησιµοποιείτε για του δεκαδικούς αριθµούς. fig02_09.cpp (1 of 3) 11 26 27 // processing phase 28 // get first grade from user 29 cout << "Enter grade, -1 to end: "; // prompt for input 30 cin >> grade; // read grade from user 31 32 // loop until sentinel value read from user 33 while ( grade!= -1 ) { 34 total = total + grade; doubleπρόσκαιρα // (casting). add grade to total 35 gradecounter = gradecounter + 1; // increment counter 36 37 cout << "Enter grade, -1 to end: "; // prompt for input υπόλοιπο. 38 cin >> grade; // read next grade 39 40 } // end while static_cast<double>() χέιρίζεται το total ως Απαιτείται διότι η διαίρεση δύο ακεραίων αποκόβει το gradecounter είναι int, αλλά προάγεται σε double. 41 42 // termination phase 43 // if user entered at least one grade... 44 if ( gradecounter!= 0 ) { 45 46 // calculate average of all grades entered 47 average = static_cast< double >( total ) / gradecounter; 48 fig02_09.cpp (2 of 3) 12 6
49 // display average with two digits of precision 50 cout << "Class average is " << setprecision( 2 ) 51 << fixed << average << endl; 52 53 } // end if part of if/else 54 55 else // if no grades were entered, output appropriate message 56 cout << "No grades were entered" << endl; 57 58 return 0; // indicate program ended successfully 59 60 } // end function main Enter grade, -1 to end: 75 Enter grade, -1 to end: 94 Enter grade, -1 to end: 97 Enter grade, -1 to end: 88 Enter grade, -1 to end: 70 Enter grade, -1 to end: 64 Enter grade, -1 to end: 83 Enter grade, -1 to end: 89 Enter grade, -1 to end: -1 Class average is 82.50 fig02_09.cpp (3 of 3) fig02_09.cpp output (1 of 1) fixed αναγκάζει setprecision(2) την έξοδο εκτυπώνει δύο ψηφία µετά να εκτυπωθεί σε µορφή την υποδιαστόλή (στρογγυλοποίηση για να σταθερής υποδιαστολής ταιριάζει (όχιστην ακρίβεια). σεεπιστηµονικήµορφή). Επίσης, αναγκάζεινα Τα προγράµµατα που τη χρησιµοποιούν πρέπει τυπώνονται η υποδιαστολή να περιλαµβάνουν: ακολουθούµενη από include <iomanip> απαραίτητα µηδενικά. Include <iostream> 13 2.11 Τελεστές Ανάθεσης Συντµήσεις εκφράσεων Τελεστής ανάθεσης αθροίσµατος c = c + 3; Μετατρέτεται σε c += 3; ηλώσεις της µορφής µεταβλητή = µεταβλητή τελεστής έκφραση; Ξαναγράφεται ως µεταβλητή τελεστής = έκφραση; Άλλοι τελεστές ανάθεσης d -= = 4 (d = d - 4) e *= 5 (e = e * 5) f /= 3 (f = f / 3) g %= 9 (g = g % 9) 14 7
2.12 Τελεστές αύξησης και µείωσης Ο τελεστής αύξησης (++ ++) µπορεί να αντικαταστήσει το: c += 1 Ο τελεστής µείωσης (--) - µπορεί να αντικαταστήσει το: c -= = 1 Προ-αύξηση Όταν ο τελεστής χρησιµοποιείται πριν τη µεταβλητή (++c or c) Η µεταβλητή αλλάζει και στη συνέχεια υπολογίζεται η έκφραση στην οποία περιλαµβάνεται Μετά-αύξηση Όταν ο τελεστής χρησιµοποιείται µετά τη µεταβλητή 15 (c++ or c--) 2.12 Τελεστές αύξησης και µείωσης If c = 5, then cout << ++c; Το c αλλάζει σε 6, και στη συνέχεια εκτυπώνεται cout << c++; Εκτυπώνεται το 5 (cout εκτελείται πριν την αύξηση. c στη συνέχεια γίνεται 6 16 8
2.12 Τελεστές αύξησης και µείωσης Όταν η µεταβλητή δεν είναι σε έκφραση Η προ-αύξηση και η µέτα-αύξηση αύξηση έχουν το ίδιο αποτέλεσµα ++c; cout << c; και c++; cout << c; είναι όµοια 17 1 // Fig. 2.14: fig02_14.cpp 2 // Preincrementing and postincrementing. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function main begins program execution 9 int main() 10 { 11 int c; // declare variable 12 13 // demonstrate postincrement 14 c = 5; // assign 5 to c 15 cout << c << endl; // print 5 16 cout << c++ << endl; // print 5 then postincrement 17 cout << c << endl << endl; // print 6 18 19 // demonstrate preincrement 20 c = 5; // assign 5 to c 21 cout << c << endl; // print 5 22 cout << ++c << endl; // preincrement then print 6 23 cout << c << endl; // print 6 fig02_14.cpp (1 of 2) 18 9
24 25 return 0; // indicate successful termination 26 27 } // end function main 5 5 6 5 6 6 fig02_14.cpp (2 of 2) fig02_14.cpp output (1 of 1) 19 2.16 switch οµή πολλαπλής επιλογής switch Ελέγχει µια µεταβλητή για πολλαπλές τιµές Μια σειρά από ετικέτες case και προαιρετικά default case switch ( variable ) { case value1: statements break; // taken if variable == value1 // necessary to exit switch } case value2: case value3: statements break; default: statements break; // taken if variable == value2 or == value3 // taken if variable matches no other cases 20 10
2.16 switch οµή πολλαπλής επιλογής 21 2.16 switch οµή πολλαπλής επιλογής Το επόµενο παράδειγµα Πρόγραµµα που διαβάζει βαθµούς (A-F) Τυπώνει τον αριθµό κάθε βαθµού που δίνεται Λεπτοµέρειες για τους χαρακτήρες Μονοί χαρακτήρες αποθηκεύονται συνήθως σε τύπο δεδοµένων char char ένας 1-byte integer, έτσι οι chars µπορούν να αποθηκευτούν ως ints Μπορεί να γίνει χειρισµός του χαρακτήρα είτε ως int είτε char 97 είναι η αριθµητική αναπαράσταση του µικρού a (ASCII) Χρησιµοποιούµε µονά εισαγωγικά για να πάρουµε την αριθµητική αναπαράσταση ενός χαρακτήρα cout << "The character (" << 'a' << ") has the value " << static_cast< int > ( 'a' ) << endl; Εκτυπώνει: The character (a) has the value 97 22 11
1 // Fig. 2.22: fig02_22.cpp 2 // Counting letter grades. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 // function main begins program execution 10 int main() 11 { 12 int grade; // one grade 13 int acount = 0; // number of As 14 int bcount = 0; // number of Bs 15 int ccount = 0; // number of Cs 16 int dcount = 0; // number of Ds 17 int fcount = 0; // number of Fs 18 19 cout << "Enter the letter grades." << endl 20 << "Enter the EOF character to end input." << endl; 21 fig02_22.cpp (1 of 4) 23 22 // loop until user types end-of-file key sequence 23 while ( ( grade = cin.get() )!= EOF ) { 24 25 // determine which grade was input 26 switch ( grade ) { // switch structure nested in while 27 28 case 'A': // grade was uppercase A 29 case 'a': // or lowercase a 30 ++acount; // increment acount 31 break; // necessary to exit switch 32 33 case 'B': // grade was uppercase B 34 case 'b': // or lowercase b 35 ++bcount; // increment bcount 36 break; // exit switch 37 38 int) µε τηνcase αριθµητική 'C': // grade was uppercase C 39 αναπαράσταση case του 'c': A και a. // or lowercase c Αυτό µπορεί να 40 ++ccount; // increment ccount 41 break; // exit αρχικοποιήσει: switch 42 Συγκρίνει το grade (έναν Οι δηλώσεις ανάθεσης έχουν τιµήπουείναιηίδιαµετη µεταβλητή αριστερά του =. Η τιµήτηςδήλωσηςείναιηίδια µετηντιµήπουεπιστρέφειη cin.get(). a = b = c = 0; break ολοκληρώνει το switch και το πρόγραµµα συνεχίζει µε την εντολή µετά από τη δοµή switch. fig02_22.cpp (2 of 4) cin.get()χρησιµοποιείτην τελεία. Αυτή η συνάρτηση επιστρέφει ένα χαρακτήρα από το πληκτρολόγιο (µετά το Enter), και τηναναθέτειστην grade. cin.get()επιστρέφει EOF (end-of-file) αφού ο χαρακτήρας EOF εισαχθεί, για να δείξει το τέλοςεισαγώµενωνδεδοµένων. EOF δίνεταιµε ctrl-d ή ctrl-z, ανάλογα το λειτουργικό σύστηµα. 24 12
43 case 'D': // grade was uppercase D 44 case 'd': // or lowercase d 45 ++dcount; // increment dcount 46 break; // exit switch 47 48 case 'F': // grade was uppercase F 49 case 'f': // or lowercase f 50 ++fcount; // increment fcount 51 break; // exit switch 52 53 case '\n': // ignore newlines, 54 case '\t': // tabs, 55 case ' ': // and spaces in input 56 break; // exit switch 57 58 default: // catch all περιπτώσεις other characters εισόδου. 59 cout << "Incorrect letter grade entered." 60 << " Enter a new grade." << endl; 61 break; // optional; will exit switch anyway 62 63 } // end switch 64 65 } // end while 66 Ο έλεγχος είναι αναγκαίος µια και δίνεται Enter µετά απόκάθεγράµµα-βαθµό. Αυτό προσθέτει ένα χαρακτήρα newline που πρέπει να αφαιρεθεί. Οµοίως πρέπει να αγνοηθεί το κενό. Παρατηρούµετηδήλωση default, που πιάνει (catches) όλες τις υπόλοιπες fig02_22.cpp (3 of 4) 25 67 // output summary of results 68 cout << "\n\ntotals for each letter grade are:" 69 << "\na: " << acount // display number of A grades 70 << "\nb: " << bcount // display number of B grades 71 << "\nc: " << ccount // display number of C grades 72 << "\nd: " << dcount // display number of D grades 73 << "\nf: " << fcount // display number of F grades 74 << endl; 75 76 return 0; // indicate successful termination 77 78 } // end function main fig02_22.cpp (4 of 4) 26 13
Enter the letter grades. Enter the EOF character to end input. a B c C A d f C E Incorrect letter grade entered. Enter a new grade. D A b ^Z fig02_22.cpp output (1 of 1) 27 Totals for each letter grade are: A: 3 B: 2 C: 3 D: 2 F: 1 2.17 do/while οµή επανάληψης Όµοια µε τη δοµή while ηµιουργεί ένα βρόγχο που ελέγχεται στο τέλος και όχι στην αρχή Οι δηλώσεις στο σώµα εκτελούνται τουλάχιστον µία φορά Μορφή do { δήλωση } while ( συνθήκη ); 28 14
2.17 do/while οµή επανάληψης 29 2.18 break και continue ήλωση: break Άµεση έξοδο από while, for, do/while, switch Το πρόγραµµα συνεχίζει µε την πρώτη δήλωση µετά τη δοµή Χρησιµοποιείται σε περιπτώσεις όπως: Νωρίτερη διαφυγή από το βρόγχο Παράβλεψη του υπόλοιπου switch 30 15
1 // Fig. 2.26: fig02_26.cpp 2 // Using the break statement in a for structure. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function main begins program execution 9 int main() 10 { 11 12 int x; // x declared here so it can be used after the loop 13 14 // loop 10 times 15 for ( x = 1; x <= 10; x++ ) { 16 17 // if x is 5, terminate loop 18 if ( x == 5 ) 19 break; // break loop only if x is 5 20 21 cout << x << " "; // display value of x 22 23 } // end for Έξοδοςαπότηδοµή for µόλις εκτελεστεί το break. 24 25 cout << "\nbroke out of loop when x became " << x << endl; fig02_26.cpp (1 of 2) 31 26 27 return 0; // indicate successful termination 28 29 } // end function main 1 2 3 4 Broke out of loop when x became 5 fig02_26.cpp (2 of 2) fig02_26.cpp output (1 of 1) 32 16
2.18 break and continue ήλωση: continue Χρησιµοποιείται στις while, for, do/while ιαφυγή από το υπόλοιπο βρόγχο Προχωρά στην επόµενη επανάληψη του βρόγχου while και do/while δοµές Ο έλεγχος για συνέχεια της επανάληψης ελέγχεται αµέσως µετά τη δήλωση continue for δοµή Εκτελείται αύξηση της έκφρασης Στη συνέχεια, ελέγχεται αν θα συνεχιστεί ο βρόγχος 33 1 // Fig. 2.27: fig02_27.cpp 2 // Using the continue statement in a for structure. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 // function main begins program execution 9 int main() 10 { 11 // loop 10 times 12 for ( int x = 1; x <= 10; x++ ) { 13 14 // if x is 5, continue with next επανάληψη. iteration of loop 15 if ( x == 5 ) 16 continue; // skip remaining code in loop body 17 18 cout << x << " "; // display value of x 19 20 } // end for structure Περνά στην επόµενη 21 22 cout << "\nused continue to skip printing the value 5" 23 << endl; 24 25 return 0; // indicate successful termination fig02_27.cpp (1 of 2) 34 17
26 27 } // end function main 35 1 2 3 4 6 7 8 9 10 Used continue to skip printing the value 5 fig02_27.cpp (2 of 2) fig02_27.cpp output (1 of 1) 2.19 Λογικοί Τελεστές Χρησιµοποιούνται ως συνθήκες σε βρόγχους και δηλώσεις if && (λογικό ΚΑΙ) true αν και οι δύο συνθήκες είναι true if ( gender == 1 && age >= 65 ) ++seniorfemales seniorfemales; (λογικόή) true αν µία από τις δύο συνθήκες είναι true if ( semesteraverage >= 90 finalexam >= 90 ) cout << "Student grade is A" << endl; 36 18
2.19 Λογικοί Τελεστές! (λογικό NOT) Επιστρέφει true όταν η συνθήκη είναι false,, & αντιστρόφως if (!( grade == sentinelvalue ) ) cout << "The next grade is " << grade << endl; Εναλλακτικά: if ( grade!= sentinelvalue ) cout << "The next grade is " << grade << endl; 37 2.20 Σύγχυση της Ισότητας (==) και της Ανάθεσης (=) Κοινό λάθος εν επιστρέφεται συνήθως συντακτικό λάθος Όψεις του προβλήµατος Οι εκφράσεις που έχουν τιµή µπορούν να χρησιµοποιηθούν για να ληφθεί απόφαση Zero = false, nonzero = true Οι δηλώσεις ανάθεσης παράγουν µία τιµή (αυτή που αναθέτουν) 38 19
2.20 Σύγχυση της Ισότητας (==) και της Ανάθεσης (=) Παράδειγµα if ( paycode == 4 ) cout << "You get a bonus!" << endl; Αν το paycode είναι 4, δίνεται bonus Aν το == αντικατασταθεί µε = if ( paycode = 4 ) cout << "You get a bonus!" << endl; Το Paycode ορίζεται σε 4 (ανεξάρτητα( από την προηγούµενη τιµή τους) Η δήλωση είναι αληθής (καθώς το 4 είναι µη µηδενικό) Το Bonus δίνεται σε κάθε περίπτωση 39 2.20 Σύγχυση της Ισότητας (==) και της Ανάθεσης (=) Αριστερές Τιµές Μπορούν να αλλάξουν (π.χ. µεταβλητές) x = 4; εξιές τιµές Σταθερές όπως αριθµοί (π.χ. δεν µπορούµε να γράψουµε 4 = x;) Οι αριστερές τιµές µπορούν να χρησιµοποιηθούν ως δεξιές αλλά όχι το ανάποδο. 40 20
2.21 Περίληψη δοµών 41 2.21 Περίληψη δοµηµένου προγραµµατισµού οµηµένος προγραµµατισµός Τα προγράµµατα είναι εύκολο να κατανοηθούν, να ελεγχθούν, να αποσφαλµατωθούν και να τροποποιηθούν Κανόνες Κάνουµε χρήση δοµών ελέγχου µοναδικής εισόδου/εξόδου εξόδου Κανόνες 1) Ξεκινούµε µε την απλούστερη ροή 2) Κάθε ενέργεια µπορεί να αντικατασταθεί από δύο ενέργειες σε σειρά 3) Κάθε ενέργεια µπορεί να αντικατασταθεί από δοµή έλεγχου (sequence, if, if/else, switch, while, do/while or for) 4) Οι κανόνες 2 και 3 µπορούν να εφαρµοστούν µε κάθε σειρά και οσεσδήποτε φορές 42 21
2.21 Περίληψη δοµηµένου προγραµµατισµού 43 2.21 Περίληψη δοµηµένου προγραµµατισµού 44 22
2.21 Περίληψη δοµηµένου προγραµµατισµού 45 2.21 Περίληψη δοµηµένου προγραµµατισµού Όλα τα προγράµµατα συνίστανται σε Ακολουθίες Επιλογές if, if/else,, or switch Κάθε επιλογή µπορεί να ξαναγραφτεί ως if Επαναλήψεις while, do/while or for Κάθε επανάληψη µπορεί να ξαναγραφτεί ως while 46 23
47 ιαίρει και Βασίλευε Εισαγωγή Κατασκευή ενός προγράµµατος από µικρότερα συστατικά Η διαχείριση του κάθε συστατικού είναι ευκολότερη από αυτή του αρχικού προγράµµατος 48 Συστατικά προγράµµατος στη C++ Modules: functions & classes Τα προγράµµατα αποτελούνται από νέα και prepackaged modules Νέα: programmer-defined functions, classes Prepackaged: προερχόµενααπότη standard library Κλήση συναρτήσεων Όνοµα συνάρτησης και πληροφορία (ορίσµατα) που χρειάζεται Ορισµός συνάρτησης Περιγράφεται µια φορά µόνο Κρυφός από τις άλλες συναρτήσεις 24
49 Συστατικά προγράµµατος στη C++ Αναλογία αφεντικού/εργάτη Το αφεντικό (η καλούσα συνάρτηση) ζητά από έναν εργάτη (η καλούµενη συνάρτηση) να εκτελέσει µια εργασία και να επιστρέψει/αναφέρει τα αποτελέσµατα αυτής της εργασίας ότανολοκληρωθεί. 50 Μαθηµατικές Συναρτήσεις (Math Library) για υλοποίηση απλών µαθηµατικών λειτουργιών Απαιτείται η συµπερίληψη του header file <cmath> Παράδειγµα cout << sqrt( 900.0 ); Το αποτέλεσµα είναι η εκτύπωση της τιµής 30.0 Όλες οι συναρτήσεις της math library επιστρέφουν double 25
Μαθηµατικές Συναρτήσεις (Math Library) 51 Το όρισµα µπορεί να είναι: Σταθερά sqrt( 4 ); Μεταβλητή sqrt( x ); Έκφραση sqrt( sqrt( x ) ) ; sqrt( 3-6x ); M e t h o d D e sc rip tio n Exa m p le ceil( x ) rounds x to the sm allest integer not less than x ceil( 9.2 ) is 10.0 ceil( -9.8 ) is -9.0 cos( x ) trigonometric cosine of x cos( 0.0 ) is 1.0 (x in radians) exp( x ) exponential function ex exp( 1.0 ) is 2.71828 exp( 2.0 ) is 7.38906 fabs( x ) absolute value of x fabs( 5.1 ) is 5.1 fabs( 0.0 ) is 0.0 fabs( -8.76 ) is 8.76 floor( x ) rounds x to the largest integer not greater than x floor( 9.2 ) is 9.0 floor( -9.8 ) is -10.0 fmod( x, y ) remainder of x/y as a floatingpoint fmod( 13.657, 2.333 ) is 1.992 num ber log( x ) natural logarithm of x (base e) log( 2.718282 ) is 1.0 log( 7.389056 ) is 2.0 log10( x ) logarithm of x (base 10) log10( 10.0 ) is 1.0 log10( 100.0 ) is 2.0 pow( x, y ) x raised to power y (xy) pow( 2, 7 ) is 128 pow( 9,.5 ) is 3 sin( x ) trigonometric sine of x sin( 0.0 ) is 0 (x in radians) sqrt( x ) square root of x sqrt( 900.0 ) is 30.0 sqrt( 9.0 ) is 3.0 tan( x ) trigonometric tangent of x (x in radians) tan( 0.0 ) is 0 Fig. 3.2 M a t h lib ra ry fu n c tio n s. 52 26
3.5 Ορισµοί Συναρτήσεων 53 Πρωτότυπο συνάρτησης Ενηµερώνει το µεταγλωττιστή για τον τύπο των παραµέτρων και τον επιστρεφόµενο τύπο της συνάρτησης int square( int ); Συνάρτηση που λαµβάνει int και επιστρέφει int Κλήση συνάρτησης square(x); Παρενθέσεις, τελεστής κλήσης συνάρτησης Πέρασµα παραµέτρου x Η συνάρτηση δέχεται το δικό της αντίγραφο των παραµέτρων Αφού τερµατίσει περνάει πίσω το αποτέλεσµα 1 // Fig. 3.3: fig03_03.cpp 2 // Creating and using a programmer-defined function. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 int square( int ); // function prototype 9 10 int main() 11 { 12 // loop 10 times and calculate and output 13 // square of x each time 14 for ( int x = 1; x <= 10; x++ ) 15 cout << square( x ) << " "; // function call 16 17 cout << endl; 18 19 return 0; // indicates successful termination 20 21 } // end main 22 Πρωτότυπο: ορίζειτους τύπους δεδοµένων και επιστρεφόµενεςτιµές. Η squareαναµένει int, επιστρέφει int. Οι παρενθέσεις () προκαλούν κλήση συνάρτησης. Όταν τελειώσουν επιστρέφεται το αποτέλεσµα. fig03_03.cpp (1 of 2) 54 27
23 // square function definition returns square of an integer 24 int square( int y ) // y is a copy of argument to function 25 { 26 return y * y; // returns square of y as an int 27 28 } // end function square 1 4 9 16 25 36 49 64 81 100 Ορισµός square. Το yείναι αντίγραφο του ορίσµατος που περνάει. Επιστρέφει y * y. fig03_03.cpp (2 of 2) fig03_03.cpp output (1 of 1) 55 1 // Fig. 3.4: fig03_04.cpp 2 // Finding the maximum of three floating-point numbers. 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 double maximum( double, double, double ); // function prototype 10 11 int main() 12 { 13 double number1; 14 double number2; 15 double number3; Η συνάρτηση maximum παίρνει 3 παραµέτρους (όλες double) καιεπιστρέφει 16 17 cout << "Enter three floating-point double. numbers: "; 18 cin >> number1 >> number2 >> number3; 19 20 // number1, number2 and number3 are arguments to 21 // the maximum function call 22 cout << "Maximum is: " 23 << maximum( number1, number2, number3 ) << endl; 24 25 return 0; // indicates successful termination fig03_04.cpp (1 of 2) 56 28
26 27 } // end main 28 29 // function maximum definition; 30 // x, y and z are parameters 31 double maximum( double x, double y, double z ) 32 { 33 double max = x; // assume x is largest 34 35 if ( y > max ) // if y is larger, 36 max = y; // assign y to max 37 38 if ( z > max ) // if z is larger, 39 max = z; // assign z to max 40 41 return max; // max is largest value 42 43 } // end function maximum Λίστα παραµέτρων που χωρίζεται µε κόµµατα, για πολλές παραµέτρους. fig03_04.cpp (2 of 2) fig03_04.cpp output (1 of 1) 57 Enter three floating-point numbers: 99.32 37.3 27.1928 Maximum is: 99.32 Enter three floating-point numbers: 1.1 3.333 2.22 Maximum is: 3.333 Enter three floating-point numbers: 27.9 14.31 88.99 Maximum is: 88.99 3.6 Πρωτότυπα συναρτήσεων 58 Αρχικές δηλώσεις των συναρτήσεων ώστε να µπορούν χρησιµοποιηθούν από πρόγραµµα Το πρωτότυπο πρέπει να ταιριάζει µε τον ορισµό της συνάρτησης Function prototype double maximum( double, double, double ); Definition double maximum( double x, double y, double z ) { } Υπογραφή συνάρτησης Το µέρος του πρωτοτύπου µε όνοµα και παραµέτρους double maximum( double, double, double ); Υπογραφή συνάρτησης 29
59 Header Files (Αρχεία επικεφαλίδων) Περιέχουν Πρωτότυπα συναρτήσεων Ορισµούς τύπων και σταθερών Τααρχείαεπικεφαλίδωνέχουνκατάληξη.h Programmer-defined header files #include myheader.h Library header files #include <cmath> 60 Γεννήτρια τυχαίων αριθµών rand function (<cstdlib>) i = rand(); Παράγειέναν unsigned integer µεταξύ 0 και RAND_MAX (συνήθως 32767) Scaling and shifting Παράδειγµα i = rand() % 6 + 1; Rand() % 6 παράγει έναν αριθµό µεταξύ 0 και 5 (scaling) + 1 δίνει το διάστηµα 1 έως 6 (shift) 30
1 // Fig. 3.7: fig03_07.cpp 2 // Shifted, scaled integers produced by 1 + rand() % 6. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; //set width 11 12 #include <cstdlib> // contains function prototype for rand 13 14 int main() 15 { 16 // loop 20 times 17 for ( int counter = 1; counter <= 20; counter++ ) { 18 19 // pick random number from 1 to 6 and output it 20 cout << setw( 10 ) << ( 1 + rand() % 6 ); 21 22 // if counter divisible by 5, begin new line of output 23 if ( counter % 5 == 0 ) 24 cout << endl; 25 26 } // end for structure Output of rand() scaled and shifted to be a number between 1 and 6. fig03_07.cpp (1 of 2) 61 27 28 return 0; // indicates successful termination 29 30 } // end main 6 6 5 5 6 5 1 1 5 3 6 6 2 4 2 6 2 3 4 1 fig03_07.cpp (2 of 2) fig03_07.cpp output (1 of 1) 62 31
63 Γεννήτρια τυχαίων αριθµών Το επόµενο πρόγραµµα είχνει την κατανοµή των παραγόµενων αριθµών από τη rand() Εξοµοιώνει 6000 ρίψεις ενός ζαριού Τυπώνειταστατιστικά τωνρίψεων (πόσεςφορέςφέραµε 1, 2, 3, κ.ο.κ.) Αναµένουµε περίπου 1000 εµφανίσεις κάθε δυνατού αποτελέσµατος 1 // Fig. 3.8: fig03_08.cpp 2 // Roll a six-sided die 6000 times. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 #include <cstdlib> // contains function prototype for rand 13 14 int main() 15 { 16 int frequency1 = 0; 17 int frequency2 = 0; 18 int frequency3 = 0; 19 int frequency4 = 0; 20 int frequency5 = 0; 21 int frequency6 = 0; 22 int face; // represents one roll of the die 23 fig03_08.cpp (1 of 3) 64 32
24 // loop 6000 times and summarize results 25 for ( int roll = 1; roll <= 6000; roll++ ) { 26 face = 1 + rand() % 6; // random number from 1 to 6 27 28 // determine face value and increment appropriate counter 29 switch ( face ) { 30 31 case 1: // rolled 1 32 ++frequency1; 33 break; 34 35 case 2: // rolled 2 36 ++frequency2; 37 break; 38 39 case 3: // rolled 3 40 ++frequency3; 41 break; 42 43 case 4: // rolled 4 44 ++frequency4; 45 break; 46 47 case 5: // rolled 5 48 ++frequency5; 49 break; fig03_08.cpp (2 of 3) 65 50 51 case 6: // rolled 6 52 ++frequency6; 53 break; 54 55 default: // invalid value 56 cout << "Program should never get here!"; 57 58 } // end switch 59 60 } // end for 61 62 // display results in tabular format 63 cout << "Face" << setw( 13 ) << "Frequency" 64 << "\n 1" << setw( 13 ) << frequency1 65 << "\n 2" << setw( 13 ) << frequency2 66 << "\n 3" << setw( 13 ) << frequency3 67 << "\n 4" << setw( 13 ) << frequency4 68 << "\n 5" << setw( 13 ) << frequency5 69 << "\n 6" << setw( 13 ) << frequency6 << endl; 70 71 return 0; // indicates successful termination 72 73 } // end main Η default περίπτωση πειρλαµβάνεται σαν δείγµα καλού προγρ. Στυλ, αν και το πρόγραµµα δεν θα φτάσει εδώ. fig03_08.cpp (3 of 3) 66 33
Face Frequency 1 1003 2 1017 3 983 4 994 5 1004 6 999 fig03_08.cpp output (1 of 1) 67 68 Γεννήτρια τυχαίων αριθµών Η χρήση της rand() σε επαναλαµβανόµενες εκτελέσεις του προγράµµατος Αποδίδει την ίδια ακολουθία αριθµών Για να πάρουµε διαφορετικές ακολουθίες αριθµών Χρησιµοποιούµε µια τιµή φύτρο (seed value) Αντιστοιχεί σε τυχαίο σηµείο εκκίνησης της ακολουθίας Το ίδιο seed θα αποδώσει την ίδια ακολουθία srand(seed); <cstdlib> Χρησιµοποιείται πριν από τη rand() για προσδιορίσει το τυχαίο σηµείο εκκίνησης 34
69 Γεννήτρια τυχαίων αριθµών Μπορούµε να χρησιµοποιήσουµε την τρέχουσα ώρα ως φύτρο (seed) srand( time( 0 ) ); time( 0 ); <ctime> Επιστρέφει την τρέχουσα ώρα σε δευτερόλεπτα General shifting and scaling Number = shiftingvalue + rand() % scalingfactor shiftingvalue = first number in desired range scalingfactor = width of desired range 35