(Πρόχειρο σχέδιο - Μαθήµατος 2) p.13-22 4. ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ C++ 4.1 Ξεκινώντας //02 cout.cpp cout << "C out GEIA SOU!!!...\n" <<endl; return 0; Ένα πρόγραµµα αρχίζει να εκτελεί το πρώτο που βρίσκει µέσα στην main function που δεν ανήκει σε κλάση! (..) δεν είναι πάντα άδειο, βάζουµε παραµέτρους (arguments) όταν υπάρχουν γυρνάει µια τιµή int (ακέραια) το σώµα της συνάρτησης, που έχει µέσα συνήθως πολλές εντολές π.χ. µπορεί να καλέσει άλλες συναρτήσεις cout<< \n ; C out εντολή, που θα δείξει στην οθόνη ότι υπάρχει µέσα στα cout είναι ένα αντικείµενο που αντιστοιχεί στο standard output stream-flow of data << υπερφορτωµένος τελεστής left shift bit-wise operator,- τελεστής εισαγωγής χρησιµοποιείται για να κατευθύνει το output string constant \n χαρακτήρας escape για νέα γραµµή endl manipulator χειριστής µορφοποίησης για νέα γραµµή ; δείχνει ότι τελειώνει η εντολή return 0 λέει στην main() να επιστρέψει την τιµή 0 εκεί που καλείται. Preprocessor (µέρος του compiler, πριν ξεκινήσει ο compiler) Directives // #include iostream.h /*δεν είναι σώµα συνάρτησης, δεν τελειώνει µε ; και αρχίζει µε #. Είναι οδηγία, που λέει στον compiler να συµπεριλάβει µέσα στο πρόγραµµα ένα άλλο αρχείο το iostream, που ονοµάζεται και header file. Αυτό περιέχει βασικές εντολές input/output που χρειάζονται π.χ.τα cout και << */ Τhe using Directive Ένα πρόγραµµα χωρίζεται σε διάφορα namespaces. Ένα namespace είναι ένα µέρος του προγράµµατος στο οποίο αναγνωρίζονται τα ονόµατα, έξω από αυτό είναι άγνωστα. /* σηµαίνει ότι όποιο όνοµα ακολουθεί π.χ. το cout είναι µέσα το std, αλλιώς θα έπρεπε να το προσδιορίσουµε */ std::cout << Εκτυπώνει στην οθόνη\n ; Αλλαγή γραµµής στην µέση της εντολής π.χ. using namespace std ; <=> using namespace std ; /*γενικώς τα κενά τα αγνοεί ο compiler - δεν προτείνεται όµως και υπάρχουν και εξαιρέσεις π.χ. #include */ VK - page 13
//03 fahren.cpp //ένας βαθµός Κελσίου(Κ) ισούται µε = 1,8 βαθµούς Φαρενάιτ (F) //Κ = (F - 32)/1,8 int ftemp; cout << "DOSE THERMOKRASIA SE farenheit: " ; cin>> ftemp; int ctemp=(ftemp-32)*5/9; /*Ανάθεση µεταβλητής οπουδήποτε µέσα στο πρόγραµµα, (ftemp-32) η παρένθεση για να γίνει πρώτα η αφαίρεση*/ cout << "ANTISTOIXEI SE BATHMOUS celcius: " <<ctemp<<"\n\n"; //ο τελεστής << χρησιµοποιείται επανειληµµένα return 0; cin >> ftemp; C in εντολή που αναµένει από τον χρήστη να πληκτρολογήσει µια τιµή cin είναι ένα αντικείµενο που αντιστοιχεί στο standard input stream << υπερφορτωµένος τελεστής right shift bit-wise operator,- τελεστής εξαγωγής χρησιµοποιείται για να πάρει την τιµή και να την βάλει στην µεταβλητή ftemp, κατευθύνει το output Mεταβλητές int var1; // δήλωση µεταβλητής var1 τύπου int (ακέραιος) int var2; // το όνοµα της µεταβλητής A..z, a..z, _, 1..9 var1=10; //ανάθεση τιµής 10 στην µεταβλητή var1 (assignment) var2=var1+30; Τύποι δεδοµένων Type int Ακέραιος Καταλαµβάνει 4 bytes (32 bits) στη µνήµη από -2.147.438.648 έως 2.147.438.647 short µικρός ακέραιος //shortvar=32s, 2 bytes από -32.768 έως 32.767 long µεγάλος ακέραιος //longvar=7628l, 4 bytes από -2.147.438.648 έως 2.147.438.647 Type float - Πραγµατικός Από 3.4x10-38 έως 3.4x10 38 µε ακρίβεια 7 δεκαδικών ψηφίων. Καταλαµβάνει 4 bytes (32 bits) στη µνήµη. double πραγµατικός διπλής ακρίβειας Καταλαµβάνει 8 bytes στη µνήµη, από 1.7x10-308 έως 1.7x10 308, µε 15 δεκαδικά ψηφία long double πραγµατικός διπλής ακρίβειας Καταλαµβάνει 12 bytes στη µνήµη, από 1.2x10-4932 έως 1.2x10 4932, µε 19 δεκαδικά (εκθετική µορφή - exponent ) 1234.56 => 1.23456E3 Type bool 2 πιθανές τιµές true & false Καταλαµβάνει συνήθως 2 bytes (16 bits) στη µνήµη VK - page 14
Τype char- char1= A Καταλαµβάνει 1 byte στη µνήµη, από -128 έως127 unsigned char Καταλαµβάνει 1 byte στη µνήµη, από 0 έως 255 unsigned short Καταλαµβάνει 2 bytes στη µνήµη, από 0 έως 65.535 unsigned int & unsigned long Καταλαµβάνει 4 bytes στη µνήµη, από 0 έως 4.294.967.295 //04 float.cpp float rad; const float PI=3.14159F; //σταθερή τύπου floating point cout << "\n DOSE THN AKTINA: " ; cin>> rad; float area=pi*rad*rad; //εµβαδόν του κύκλου cout << " TO EMBADON TOY EINAI: " <<area<<"\n\n"; return EXIT_SUCCESS; Μετατροπές τύπων δεδοµένων(casting) και σειρά προτεραιότητας long double (υψηλότερο), double, float, long, int, short, char (χαµηλότερο) //05 mixed.cpp int Count=7; float AvgWeight=155.5F; double TotWeight=Count*AvgWeight; //επιτρέπονται mixed τύπων εκφράσεις int*float //η ακέραια µεταβλητή count µετατρέπεται σε float και το αποτέλεσµα σε double cout << " Total : " <<Count<<'x'<<AvgWeight<<'=' <<TotWeight<<endl<<endl; int i=3,j=2; float f=i/j; cout << " DIAIRESH 3/2=" <<f<<endl; //1 cout << " DIAIRESH 3/2=" <<i/float(j)<<endl<<endl; //1.5 char ch='a'; //o char(65) είναι το γράµµα A cout << " PROSTHESH 64+3=" <<int(ch)+i<<endl<<endl; //68 ch=static_cast<char>(65 + i); //ο ακέραιος 64+i µετατρέπεται σε χαρακτήρα //ο ακέραιος µέσα σε παρένθεση cout << " CHARAKTHRAS 67=" <<ch<<endl<<endl; //C VK - page 15
cout<< " ARXIKA i=3 META i=" <<i-- <<endl; cout<< " TELIKA i=" << ++i <<endl; //3 j=++i * -- i; cout<< " PROTERAIOTHTES j="<< j <<endl; //9 return EXIT_SUCCESS; Σταθερές const #define PI 3.14159 const float PI 3.14159 //δεν καταλαµβάνει χώρο στη µνήµη Xειριστές µορφοποίησης (manipulators) setw(x) - manipulator εύρους(width) x cout <<setw(7)<<var1=123;<<endl; υποχρεώνει τον αριθµό (ή το string) που ακολουθεί να εµφανιστεί σε εύρος x θέσεων, µε ευθυγράµµιση προς τα δεξιά. Ολοι οι χειριστές (manipulators) εκτός του endl βρίσκονται µέσα στο header file <iomanip>. #include <iomanip> //IO manipulator, πρέπει να µπει για το setw. Αλλοι χειριστές ends;setfill(char),setbase(int),setprecision(int),flush Tελεστές αριθµητικών πράξεων: +, -, *, /, % το υπόλοιπο διαίρεσης(modulus) Αριθµητικοί Tελεστές ανάθεσης: =, +=, -=, *=, /=, %=, ++, -- (4 τρόποι να αυξήσω την τιµή κατά 1) i+=1 ; // i = i+1; i++ ; ++i // i = i+1; στο i++ πρώτα απoνοµή τιµής και µετά αύξηση Σχεσιακοί Τελεστές: >, <, ==,!=, >=, <= //06 relat.cpp int i=5,n; // (0) εξ ορισµού false cout << "DOSE ENA ARITHMO (LATHOS=0, SOSTO=1) n: " ; cin >> n; cout << "n<10 DINEI: " << (n<10) << endl; cout << "n>10 DINEI: " << (n>10) << endl; cout << "n==10 DINEI: " << (n==10) << endl<<endl; cout << "MANTEPSES TON ARITHMO MOU=> " << (n==i) << endl; cout << "DEN MANTEPSES TON ARITHMO=> " << (n!=i) << endl; return EXIT_SUCCESS; VK - page 16
Τελεστής συνθήκης x? α : b min = (a<b)? a : b; // min=a αν a<b, αλλιώς min=b abs = (n<0 )? n : n ; //abs=-n αν n<0, αλλιώς abs=n Αποτελείται από 2 σύµβολα? και : που επιδρούν πάνω σε 3 εκφράσεις Χαρακτήρες διαφυγής \n new line \b backspace \f form feed (νεα σελίδα) \r carriage return (αλλάζει γραµµή) \t tab \\ backslash (για to \) \' απλά εισαγωγικά \" διπλά εισαγωγικά \0 τερµατισµός string Tελεστές bitwise &,, ^, ~, <<, >> int a=166,b=176,c=8,d=4; cout << (a & b) <<endl; // 160 cout << (c d) <<endl; // 12 cout << (~a) <<endl; // 89 Προτεραιότητα Τελεστών Τελεστής Σημασία Φορά! Λογικό ΝΟΤ Μονομελής ~ Συμπλήρωμα ++ Αύξηση -- Μείωση Αριθμητικός * Πολ/σμός / Διαίρεση % Υπόλοιπο + Πρόσθεση - Αφαίρεση Ολίσθησης << Ολίσθηση αρ. >> Ολίσθηση δεξ. < Μικρότερο Σχεσιακός <= Μικρ. 'Η ίσο > Μεγαλύτερο Μεγαλύτερο ή >= ίσο == Ίσο!= Όχι ίσο & Bitwise AND Bitwise ^ Bitwise XOR Bitwise OR Λογικός && Λογικό AND Λογικό AND Συνθήκης?: OR συνθήκης = Ανάθεση /= Απόδοσης *= Τιμής %= += -= Mονοµελείς Τελεστές!, ~, ++, -- Αριθµητικοί Τελεστές *, /, %,+, - Τελεστές bitwise <<, >> Σχεσιακοί Τελεστές >, <, >=, <=, ==,!= Τελεστές bitwise ~, &, ^, I Λογικοί Τελεστές &&, ΙΙ Τελεστής Συνθήκης?: Αριθµητικοί Τελεστές Ανάθεσης =, *=, /=, %=,+=, -=, VK - page 17
4.2 Εντολές συνθήκης, ροής και επανάληψης Εντολές αποφάσεων, ελέγχου ή συνθήκης (if, if.. else, else if.., switch..case) ΙΑΚΛΑ ΩΣΕΙΣ (branches) if //07 ifdemo.cpp #include <conio.h> // για την εντολή getch() int x=10,y=10,d; char c='a'; cout<< "DOSE ENA ARITHMO: " ; cin >>x; if (x>10) return(0); cout << "\nb:boreia, a:anatolika, d:dytika; n:notia\n" ; cout << "H THESH MOU ARXIKA :" << x << "," << y <<endl; cout << "DOSE ODHGIA (b,a,d,n) : " ; c=getche(); if (c=='b') //Βόρεια y--; else if (c=='n') //Νότια y++; else if (c=='a') //Ανατολικά x++; else if (c=='d') // υτικά x--; cout << "\ntora H THESH EINAI :" <<x<<","<<y <<endl; cout<<endl; system( "PAUSE" ); return EXIT_SUCCESS; if (x>10) statement; if (x>10) statement1; statementn; //χωρίς ; πριν και µετά => for (..).. if (c== b ) statement; else statement; //ή νάχω και πολλαπλές διακλαδώσεις όπως στο παράδειγµα x>10 συνθήκη - test expression VK - page 18
Λογικοί Τελεστές (ΑΝD, OR, NOT) &&,,! if ( (x==7) && (y==8) ) cout << BRHKES XRYSO!! ; exit(0) // βγαίνει από το πρόγραµµα if ( (x<5) (x>15) ) cout << PROSOXH ENAS DRAKOS PISO SOU!! ; if ( c!= \r ) cout << PAME PALI!! <endl; Λογικό AND Λογικό OR Λογικό NOT && ενώνει 2 σχετικές εκφράσεις να αληθεύει ή η µία ή η άλλη σχετική έκφραση! να µην είναι αληθής η έκφραση switch case #include <conio.h> //για την εντολή getch() int x=10,y=10,d; char c='a'; //08 switchdemo.cpp cout << "\nb:boreia, a:anatolika, d:dytika; n:notia\n"; cout << "H THESH SOU ARXIKA :" <<x<<","<<y<<endl; cout << "DOSE ODHGIA(b,a,d,n): "; c=getch(); switch (c) case 'b': y--; break; case 'n': y++; break; case 'a': x++; break; case 'd': //Βόρεια //Νότια //Ανατολικά // υτικά VK - page 19
x--; break; case '\r': //return cout << "KRIMA..."<<endl; break; default: //οτιδήποτε άλλο εκτός από τα: b,n,a,d,\r cout << "\nprepei NA DINEIS (b,a,d,n) " cout << "\H NA PATHSEIS RETURN\n"; // end of switch cout << "\ntora H THESH EINAI :" <<x<<","<<y <<endl; cout<<endl; return EXIT_SUCCESS; switch (c) //χωρίς ; πριν και µετά => switch (..).. case b : statements; case r : statements; default: statements; switch(c) σε παρένθεση η µεταβλητή c, για την οποία έχουµε να κάνουµε επιλογές case b : το case ακολουθείται από µια σταθερά, για να εξεταστεί πχ. η περίπτωση που το c ισούται µε το χαρακτήρα b, και ακολουθεί : και κατόπιν οι εντολές για αυτήν την περίπτωση. default: µας ειδοποιεί ότι κάτι δεν πήγε καλά, δεν έδωσε ο χρήστης αυτά που έπρεπε. δεν είναι υποχρεωτικό αλλά συνιστάται. Σε περιπτώσεις, που οι εναλλακτικές τιµές µιας µεταβλητής που πρέπει να εξεταστούν είναι πολλές, το switch..case είναι πιθανότερο από το if else if.. else.. Εντολές ροής ( break, continue, goto) break; υποχρεώνει την εντολή switch (ή ένα loop γενικότερα) να σταµατήσει. ο έλεγχος µεταφέρεται στην πρώτη εντολή µετά το τέλος της switch (του loop). Προσοχή :αν δεν υπάρχει break, ο έλεγχος µεταφέρεται στο επόµενο στη σειρά case. continue; υποχρεώνει να µεταφερθεί ο έλεγχος στην αρχή του loop. goto υποχρεώνει να µεταφερθεί ο έλεγχος στο σηµείο που υποδεικνύει το goto Προσοχή :η εντολή aναφέρεται απλώς, δεν συνίσταται (spaghetti code!!). ΑΣΚΗΣΗ: Βγάλτε όλα τα break; στο παράδειγµα 08 switchdemo.cpp και µαντέψτε το αποτέλεσµα. VK - page 20
for Εντολές επανάληψης - Βρόχοι (for, while, do while) //09 fordemo.cpp #include <iomanip> //για τον χειριστή setw int i; for (i=0; i<15; i++) // o βρόχος (loop) σταµατάει όταν i=15 cout << i*i << " "; // 0 1 4 9 16 25 36 49 81 100 121 144 169 196 for (i=1; i<=10; i++) cout <<setw(4)<<i; int j=i*i*i; cout <<setw(6)<<j<<endl; // 1 1 // 2 8 // 3 27 cout <<endl; // 4 64 // 5 125 return EXIT_SUCCESS; // //10 1000 for (i=0; i<15; i++) statement; for (i=0; i<=10; i++) statement1; statementn; //χωρίς ; πριν και µετά => for (..).. i=0 ; αρχική τιµή - initialization expression i<15; συνθήκη - test expression i++ ; βήµα increment expression while //10 whiledemo.cpp #include <iomanip> //για τον χειριστή setw int i=99, p=0; cout<< "DOSE SYNEXEIA ARITMOUS, STAMATA ME: 0 " <<endl; while (i!=0) cin>>i; // δίνεις αριθµούς συνεχόµενα, µέχρι να δώσεις 0. while (i<11) VK - page 21
cout <<setw(2)<<i; cout<< setw(6)<<p<<endl; // 0 0 ++i; // 1 1 p=i*i*i*i; // 2 16 //.... //10 10000 cout <<endl; return 0; while (i!= 0) statement; while (i<11) statement1; statementn; //χωρίς ; πριν και µετά => while (..).. i!=0 συνθήκη - test expression ΑΣΚΗΣΗ: Χρησιµοποιήστε το while ( c!= \r ) στο παράδειγµα 07 ifdemo.cpp για να δίνεται οδηγίες συνεχόµενα µέχρι να πατηθεί το <return> (enter) do..while //11 dodemo.cpp #include <iomanip> //για τον χειριστή setw int i, j; char ch= n ; do cout<< "DOSE DIAIRETH : " ; cin >>i; cout<< "DOSE DIAIRETEO : " ; cin >>j; cout<< "PHLIKO ISO ME : " << i/j << endl; cout<< "YPOLOIPO ISO ME : " << i%j << endl<< endl; cout<< "Theleis kai allo? (n/o):" ; cin >> ch; while (ch!= o ); cout <<endl; return EXIT_SUCCESS; do statement1; statementn; while (ch!=0) ;//προσοχή έχει ; στο τέλος (ch!= 0) συνθήκη - test expression VK - page 22