Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16
Συμβολικές Σταθερές Μία συμβολική σταθερά είναι μία σταθερά που αναπαρίσταται από ένα όνομα. Μία συμβολική σταθερά δεν μπορεί να μεταβληθεί. Για την δήλωση μίας σταθεράς χρησιμοποιούμε το #define π.χ. #define PI 3.14159 Χωρίς ίσον και χωρίς ερωτηματικό στο τέλος! Προτείνεται η χρήση κεφαλαίων χαρακτήρων για να ξεχωρίζουν εύκολα από τις μεταβλητές. Οι εντολές define μπορούν να τοποθετούνται οπουδήποτε στον πηγαίο κώδικα αλλά είναι σε ισχύ μόνο για το τμήμα του πηγαίου κώδικα που ακολουθεί μετά τη define. Οι προγραμματιστές πιο συχνά ομαδοποιούν τις define στην αρχή της main() ή του κάθε αρχείου. 2
Αναπαράσταση των σταθερών στην C Σταθερά απαρίθμησης (enumeration constant) Σύνταξη: enum [ <type_tag> ] { <constant_name> [ = <value> ], }[var_list]; Παραδείγματα: enum boolean {NO, YES} ; enum months {JAN=1, FEB, MAR, } ; (αλλιώς θα ήταν JAN=0) 3
Μεταβλητές Μεταβλητή (variable) είναι η θέση αποθήκευσης δεδομένων η οποία μπορεί να δέχεται τιμές κατά τη διάρκεια της εκτέλεσης του προγράμματος. Στη C οι μεταβλητές πρέπει: 1. Να έχουν δηλωθεί σε κάποια εντολή δήλωσης, συνήθως στην αρχή ενός αρχείου πηγαίου κώδικα, ή στην αρχή μιας συνάρτησης 2. Να έχουν συγκεκριμένο τύπο δεδομένων 3. Να έχουν αρχική τιμή πριν χρησιμοποιηθούν για πρώτη φορά 4. Τα δεδομένα (οι τιμές) που αποθηκεύονται στη μεταβλητή πρέπει να είναι του ίδιου ή συμβατού τύπου με αυτόν της μεταβλητής 4
Δηλώσεις μεταβλητών Για να δηλώσουμε μια μεταβλητή πρέπει πρώτα να ορίσουμε τον τύπο και μετά το όνομα της μεταβλητής, π.χ.: short int a; /* δήλωση μεταβλητής τύπου μικρού ακεραίου */ int i, k, l; /* δήλωση 3 ακέραιων μεταβλητών */ char c, line[100]; /* δήλωση χαρακτήρα και πίνακα χα/ρων */ float periferia, emvadon; /* δήλωση πραγματικών */ char cp= a ; char esc = \\ ; int k=0; /* με αρχική τιμή */ int m = MX + 5; float eps = 1.0e-5; /* δήλωση πραγματικού απλής ακρίβειας */ double e = 2.7; /* δήλωση πραγματικού διπλής ακρίβειας */ float inch = 2.54; ή float inch = 254e-2; long double pi = 314159265359e-11; /* εκτεταμένης ακρίβειας */ 5
Ονόματα μεταβλητών Τα ονόματα των μεταβλητών σ ένα πρόγραμμα C πρέπει να αρχίζουν με γράμμα και μπορούν να περιέχουν αλφαριθμητικούς χαρακτήρες, δηλαδή: γράμματα, ψηφία και το σύμβολο underscore (_). Δεν μπορούν να περιέχουν ειδικούς χαρακτήρες όπως: #, &, *,., +, -, /, (, {, κλπ. Τα ονόματα count και Count αντιστοιχούν σε διαφορετικές μεταβλητές (διαχωρισμός πεζώνκεφαλαίων). Υπάρχουν συγκεκριμένα ονόματα τα οποία αναφέρονται σε λέξεις κλειδιά της C τα οποία δεν μπορούν να χρησιμοποιηθούν ως ονόματα μεταβλητών. 6
Λέξεις κλειδιά (δεσμευμένες λέξεις) που δεν μπορούν να χρησιμοποιηθούν ως ονόματα μεταβλητών auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while 7
Καλές πρακτικές ονομασίας μεταβλητών Χρήση μικρών χαρακτήρων (όχι κεφαλαίων) Αποφυγή χρήσης μικρών και κεφαλαίων για δύο διαφορετικές μεταβλητές π.χ. one και ONE Χρήση μνημονικών ονομάτων που είναι περιγραφικά, π.χ. interestrate αντί ir Κατανοητή σύνταξη για πολύπλοκα ονόματα π.χ. interestrate, ή interest_rate αντί interestrate 8
Χρήση του const για μεταβλητές που δεν αλλάζουν τιμή! O δεύτερος τρόπος δήλωσης μιας συμβολικής σταθεράς είναι με τη λέξη κλειδί const. Μία τιμή const δεν μπορεί να τροποποιηθεί κατά τη διάρκεια του προγράμματος, δέχεται μόνο αρχική τιμή τη στιγμή της δήλωσής της. Π.χ. const int count = 100; const float PI = 3.14159265; 9
Τελεστές Ένας τελεστής είναι ένα σύμβολο που οδηγεί την C να εκτελέσει κάποια λειτουργία, σε ένα ή περισσότερους τελεστέους. Τελεστές εκχώρησης (=), τελεστές αριθμητικοί, τελεστές σχεσιακοί, τελεστές λογικοί. H C έχει δύο μοναδιαίους (unary) αριθμητικούς τελεστές (επιδέχονται έναν τελεστέο) και 5 δυαδικούς (binary) αριθμητικούς τελεστές (απαιτούν δύο τελεστέους). 10
Αριθμητικοί Τελεστές (+) Πρόσθεση (δυαδικός τελεστής binary operator), και έκφραση θετικού προσήμου (μοναδιαίος τελεστής unary operator) (-) Αφαίρεση (δυαδικός τελεστής binary operator), και έκφραση αρνητικού προσήμου (μοναδιαίος τελεστής unary operator) (*) Πολλαπλασιασμός (δυαδικός τελεστής binary operator) (/) Διαίρεση (δυαδικός τελεστής binary operator) (%) Υπόλοιπο διαίρεσης (για ακέραιους τύπους μόνο - (δυαδικός τελεστής binary operator) 11
Παραδείγματα 10/3 δίνει 3 10%3 δίνει 1 10%2 δίνει 0 10+2 δίνει 12 10*2-2 δίνει 18 10/0 δεν ορίζεται (διαίρεση με 0) 10%0 δεν ορίζεται (υπόλοιπο διαίρεσης με 0) 6/2+4 δίνει 7-10+2 δίνει -8 10/2 + -10/3 = (10/2) + ((-10)/3) δίνει 2 12
Σχεσιακοί Τελεστές (1) Οι σχεσιακοί ή συσχετιστικοί τελεστές χρησιμοποιούνται για να συγκρίνουν εκφράσεις. Ο υπολογισμός μίας έκφρασης που περιέχει ένα σχεσιακό τελεστή δίνει αποτέλεσμα είτε αληθές (μη μηδενικό) είτε ψευδές (μηδέν). == (Ίσον), > (Μεγαλύτερο από), < (Μικρότερο από), >= (Μεγαλύτερο ή ίσο), <= (Μικρότερο ή ίσο),!= (Διάφορο) ΠΡΟΣΟΧΗ: Το = είναι ο τελεστής εκχώρησης, ενώ το == είναι ο σχεσιακός τελεστής. 13
Σχεσιακοί Τελεστές (2) Οι σχεσιακοί τελεστές θέτουν ερωτήσεις όπως: «Είναι η x μεγαλύτερη από το 100;», «Είναι η y ίση με 0;». Π.χ.: 5 == 1, Είναι το 5 ίσο με το 1; (ψευδές) 5>1, Είναι το 5 μεγαλύτερο του 1; (αληθές) 5!= 1, Είναι το 5 διαφορετικό από το 1; (αληθές) (5+10) == (3*5), Είναι το (5+10) ίσο με το (3*5); (αληθές) 14
Σχεσιακοί Τελεστές Οι αριθμητικοί τελεστές έχουν υψηλότερη προτεραιότητα από τους σχεσιακούς τελεστές Π.χ. η συνθήκη: (x+2>y) είναι ισοδύναμη με την ((x+2)>y) Η σειρά προτεραιότητας των σχεσιακών τελεστών είναι < <= > >=!= == Π.χ. το: x == y>z είναι ίδιο με το: x == (y>z) 15
Λογικοί Τελεστές Οι λογικοί τελεστές χρησιμοποιούνται για να συνδέσουν εκφράσεις σχηματίζοντας πιο σύνθετες συνθήκες. Τελεστής σύζευξης && (λογικό και, and) Τελεστής διάζευξης (λογικό ή, or) Τελεστής άρνησης! (λογικό όχι, not) Το && έχει μεγαλύτερη προτεραιότητα από το ενώ το! είναι μοναδιαίος τελεστής. Υπολογίζονται από τα αριστερά προς τα δεξιά όταν είναι πάνω από δύο με ίδια προτεραιότητα. 16
Τελεστές πράξεων ανά μπιτ Εφαρμόζονται μόνο σε ακέραιους τελεστέους. & σύζευξη (and) διάζευξη (or) ^ αποκλειστική διάζευξη (xor) << ολίσθηση αριστερά (shift left) >> ολίσθηση δεξιά (shift right) ~ συμπλήρωμα ως προς ένα (1 s complement) Μόνο το ~ είναι μοναδιαίος τελεστής ενώ όλοι οι υπόλοιποι είναι δυαδικοί. 17
Τελεστής αντικατάστασης (Εντολή ανάθεσης) Οι μεταβλητές λαμβάνουν τιμές με συγκεκριμένη εντολή ανάθεσης Η εντολή είναι της μορφής: μεταβλητή = έκφραση όπου η έκφραση μπορεί να είναι μια σταθερή τιμή, μια λογική ή αριθμητική πράξη, το αποτέλεσμα κλήσης μιας συνάρτησης κλπ. Η έκφραση θα πρέπει να παράγει ένα αποτέλεσμα που να είναι συμβατό με τον τύπο της μεταβλητής 18
Συγκεντρωτικά οι τελεστές της C (1) Αριθμητικοί τελεστές: + - * / % + - Συσχετιστικοί τελεστές: > >= < <= ==!= Λογικοί τελεστές: &&! 19
Συγκεντρωτικά οι τελεστές της C (2) Τελεστές πράξεων ανά bit (bitwise): & ^ << >> ~ Τελεστές αντικατάστασης: = += -= *= /+ %= <<= >>= ^= &= = π.χ. x= y+z; x = a*5 + b/c + 12.75/(d-8); i=i+5; μπορεί να γραφεί ως: i+=5; j=j*(k+7); μπορεί να γραφεί ως: j*=(k+7); 20
Το πρώτο μου πρόγραμμα /* my first C program */ #include <stdio.h> main() { printf ("Hello World"); } 21
/* my first C program */ Εντολή Προ-επεξεργασίας Τύπος Επιστροφής της main #include <stdio.h> void main() { } printf( Hello World! ); Σχόλια Εντολή εισαγωγής βιβλιοθήκης για χρήση συναρτήσεων είσοδου/έξοδου Βιβλιοθήκη Η αρχική συνάρτηση main Η συνάρτηση printf που έχει ορισθεί στη βιβλιοθήκη stdio και επιτρέπει την εμφάνιση στην οθόνη (standard output) Αυτή η πρόταση οδηγεί τον υπολογιστή να εμφανίσει το μήνυμα Hello World! στην οθόνη. 22
Μορφοποίηση εισόδου /εξόδου Συναρτήσεις printf() - Προβάλλει πληροφορίες στην οθόνη. scanf() - Εισάγει δεδομένα από το πληκτρολόγιο και εκχωρεί αυτά τα δεδομένα σε μία ή περισσότερες μεταβλητές. Κωδικοί διαμόρφωσης %d %5d %o %x %f %8.2f %.3f %s %c %% 23
Εντολή εμφάνισης στην οθόνη Η σύνταξη της εντολής printf είναι printf ( δήλωση φόρμας, έκφραση1, έκφραση2...); όπου: Η δήλωση φόρμας ορίζει το πως θα μορφοποιηθεί η εκτύπωση, και το τι θα τυπώνεται στην πρότυπη έξοδο (standard output). H δήλωση φόρμας ορίζει, επίσης, με την συνδρομή των κωδικών διαμόρφωσης, πως θα μετατραπούν οι τιμές από τη εσωτερική δυαδική μορφή του Η/Υ στην επιθυμητή μορφή της εκτύπωσης. 24
Παράδειγμα main() { int i, j; float x, y; Δήλωση φόρμας } Εμφάνιση ως ακεραίου στο δεκαδικό σύστημα αρίθμησης i = 10; j = 20; x = 43.2892; y = 5527.0; printf( i = %d, j = %d, x = %f, y = %f\n, i, j, x, y); Εμφάνιση ως πραγματικός Οι μεταβλητές για εκτύπωση Αποτέλεσμα εκτύπωσης : i = 10, j = 20, x = 43.289200, y = 5527.000000 25
Εντολή εισαγωγής δεδομένων από το πληκτρολόγιο Η σύνταξη της εντολής scanf είναι scanf ( δήλωση φόρμας, έκφραση1, έκφραση2...); όπου: Η δήλωση φόρμας ορίζει - με την βοήθεια των κωδικών διαμόρφωσης - το πως θα ερμηνεύονται τα δεδομένα που εισάγονται από το πληκτρολόγιο το οποίο αποτελεί την πρότυπη είσοδο (standard input). Στην συνέχεια οι εκφράσεις πρέπει να δείχνουν τις θέσεις της μνήμης RAM που θα αποθηκευθούν τα δεδομένα (δηλαδή τις διευθύνσεις των θέσεων) 26
Παράδειγμα #include <stdio.h> main() { int i, j; float x, y; scanf("%d%d%f%f", &i, &j, &x, &y); printf("%d %d %f %g", i, j, x, y); } Διαφορά από το printf Εάν ο χρήστης εισάγει 1, -20,.3, -4.0e3 τότε η παραπάνω εντολή εισόδου θα διαβάσει και θα αναθέσει στη μεταβλητή i τον αριθμό 1, στη j το -20, στη x το 0.3, και στη y το -4000.0 27
Η συνάρτηση main() Η συνάρτηση main είναι μία ειδική συνάρτηση που πρέπει να έχει ορισθεί σε κάθε C πρόγραμμα. Η συνάρτηση main είναι η πρώτη συνάρτηση που καλείται σε ένα C πρόγραμμα. Η κλήση γίνεται αυτόματα από το λειτουργικό σύστημα όταν το πρόγραμμα αρχίζει να «τρέχει». Η συνάρτηση main μπορεί να επιστρέφει, ή να μην επιστρέφει κάποιο αποτέλεσμα. 28
Σχόλια (comments) Ένα καλό πρόγραμμα δεν είναι μόνο συντακτικά σωστό, γρήγορο, και συμβατό με τις απαιτήσεις του χρήστη, αλλά και τεκμηριωμένο με σχόλια. Τα σχόλια δεν μεταφράζονται από τον compiler ο οποίος τα θεωρεί σαν κενούς χαρακτήρες Τα σχόλια στη C ορίζονται ανάμεσα στα σύμβολα /* και */ π.χ. /* this is a comment in C */ Δεν επιτρέπονται τα ένθετα σχόλια εκτός αν έχει γίνει η κατάλληλη ρύθμιση. Σχόλια γραμμής: στη C++ ή στη Java αρχίζουν με // και τελειώνουν με το πέρας της γραμμής. Κάποιοι μεταγλωττιστές της C το επιτρέπουν, αλλά αν σας ενδιαφέρει η μεταφορά να χρησιμοποιείτε /* και */ Προσθέστε σχόλια μόνο σε προτάσεις ή συναρτήσεις οι οποίες δεν έχουν προφανή σημασία. Βασική αρχή είναι να έχουμε ένα ευπαρουσίαστο και εύκολο να διαβαστεί πρόγραμμα (διευκολύνει τη συντήρησή του) π.χ. /************************************************************ * Name: main.c * * Author: John Smith * * Purpose: Translate Celsius degrees to Fahrenheit * * Date/Version: 12/12/02 v1.1 * ************************************************************/ 29
Αν το αποτέλεσμα του προγράμματος είναι το παρακάτω, ποιο είναι το πρόγραμμα; Enter a number between 1 and 100 : 35 Enter another number between 1 and 100 : 23 35 times 23 = 805 Press any key to continue!! 30