Εισαγωγή - Τα Βασικά της C1 Τ.Ε.Ι. ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ Τ.Ε.Ι. ΛΑΜΙΑΣ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΕΧΝΟΛΟΓΙΑΣ ΥΠΟΛΟΓΙΣΤΩΝ «Προγραμματισμός Ι» Herbert Schildt, «Οδηγός της C», Εκδ. Μ. Γκιούρδας, 3η έκδοση.
ΕΙΣΑΓΩΓΗ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ C Γλώσσα υψηλής απόδοσης δομημένου προγραμματισμού Πύλη για τις γλώσσες C++ & Java Εφευρέτης Dennis Ritchie τη δεκαετία του ‘70 Προτυποποιήθηκε (ANSI C) τη δεκαετία του ‘90 Γλώσσα μεσαίου επιπέδου Assembly C Visual Basic Assembly: Συμβολική μορφή εντολών hardware Visual Basic: Γλώσσα προγρ/σμού Windows εφαρμογών Σχέση μεταξύ C & C++
Δομή Προγράμματος (1) Γλώσσα C Εντολές προεπεξεργαστή Δηλώσεις συναρτήσεων Δηλώσεις μεταβλητών Κυρίως πρόγραμμα Ορισμοί συναρτήσεων main ( ) { - δηλώσεις μεταβλητών - προτάσεις γλώσσας }
Δομή Προγράμματος (2) Κυρίως πρόγραμμα Είσοδος δεδομένων Επεξεργασία δεδομένων Έξοδος αποτελεσμάτων Προτάσεις γλώσσας
ΤΑ ΣΥΣΤΑΤΙΚΑ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΗΣ C - 1 Δομικό στοιχείο ενός προγράμματος C είναι οι συναρτήσεις Κάθε μία από αυτές περιέχει 1 ή περισσότερες εντολές Οι εντολές τερματίζονται με ; Η γενική μορφή μίας συνάρτησης της C: τύπος-επιστρεφόμενης τιμής όνομα-συνάρτησης(λίστα-παραμέτρων) { κορμός-συνάρτησης (εντολές) } Αποδεκτοί τύποι δεδομένων Αποδεκτή ονοματολογία συναρτήσεων και η συνάρτηση main() Ο κορμός ενός προγράμματος και οι συναρτήσεις Βιβλιοθήκης
Ένα απλό πρόγραμμα #include int k = 0; float f; int n=10; int a; main ( ) { int i ; for ( i = 1; i < n ; i++) { scanf (“%d”, &a); k = k + a;} f = k/n; printf (“%f”, f); } Εντολή προεπεξεργαστή Δηλώσεις μεταβλητών Εισαγωγή δεδομένων Επεξεργασία δεδομένων Έξοδος δεδομένων Κυρίως πρόγραμμα
ΤΑ ΣΥΣΤΑΤΙΚΑ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ ΤΗΣ C - 2 Συναρτήσεις εισόδου/εξόδου π.χ. printf(“αλφαριθμητικό”); Οι ντιρεκτίβες του προεπεξεργαστή της C Το πρώτο πρόγραμμα σε C: #include int main(void) { printf("This is a short C program."); return 0; } #include int main(void) { printf("This is "); printf("another C "); printf("program."); return 0; }
ΔΗΜΙΟΥΡΓΙΑ ΚΑΙ ΜΕΤΑΓΛΩΤΤΙΣΗ ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ Μοντέρνοι έναντι παραδοσιακών μεταγλωττιστών Μοντέρνοι (Windows): Όλα τα αναλαμβάνει το περιβάλλον Παραδοσιακοί (DOS, UNIX, LINUX): 1. Συγγραφή προγράμματος σε κειμενογράφο 2. Μεταγλώττιση προγράμματος 3. Εκτέλεση (τρέξιμο) προγράμματος Π.χ. bcc test.c (με Borland C++) cl test.c (με Microsoft Visual C++) Κάθε μία από αυτές περιέχει 1 ή περισσότερες εντολές Μεταγλώττιση C προγράμματος με C++ μεταγλωττιστή Προσοχή στην κατάληξη των αρχείων πηγαίου κώδικα. Μηνύματα λάθους και προειδοποιήσεις Αποτέλεσμα της μεταγλώττισης είναι το εκτελέσιμο αρχείο
Στοιχεία Γλώσσας Προγραμματισμού Αλφάβητο Οι χαρακτήρες από τους οποίους σχηματίζονται οι λέξεις της γλώσσας Λεξιλόγιο Οι λέξεις που χρησιμοποιεί η γλώσσα Συντακτικό Οι κανόνες σύνταξης των προτάσεων της γλώσσας Σημασιολογία Οι κανόνες ερμηνείας των προτάσεων της γλώσσας
Λεξιλόγιο-Κατηγορίες λέξεων Δεσμευμένες λέξεις (reserved words) Λέξεις κλειδιά (π.χ. int, if, for) Ονόματα συναρτήσεων βιβλιοθήκης (π.χ. printf, isdigit) Ονόματα εντολών προεπεξεργαστή (π.χ. include, define) Αναγνωριστές (identifiers) Ονόματα μεταβλητών, σταθερών, συναρτήσεων, τα οποία δίνονται από τον προγραμματιστή Τελεστές (operators) Ειδικά σύμβολα που παριστάνουν μια συγκεκριμένη στοιχειώδη διεργασία που εκτελείται σε δεδομένα
Κανόνες Δημιουργίας Αναγνωριστών Αποτελούνται από γράμματα, αριθμούς και τον ειδικό χαρακτήρα “_”. Αρχίζουν πάντα από γράμμα ή “_” Δεν μπορεί να είναι ίδια με κάποια δεσμευμένη λέξη Διάκριση μικρών και κεφαλαίων Όριο μήκους (π.χ. 31 για ANSI C) class1 Class-1 2classClass_1 class#1 ClAsS1 Παραδείγματα
Αναγνωριστές-Αναγνωσιμότητα x = 20; if (x > y) function1(); else function2(); baros = 20; if (baros < max_baros) ADD _baros(); else DECREASE _baros();
Δεδομένα (1) Είναι αυτά που δίνονται, τα γνωστά, η ακατέργαστη γνωστή πληροφορία, με την επεξεργασία της οποίας θα παραχθούν τα αποτελέσματα (η λύση του προβλήματος) Δεδομένα = τιμές ή πλειάδες τιμών που σχετίζονται με τις οντότητες του προβλήματος
Μεταβλητές (1) Είναι υπολογιστικές οντότητες μέσω των οποίων χρησιμοποιούνται τα δεδομένα. Το περιεχόμενο (τιμή) μιας μεταβλητής μπορεί να μεταβάλλεται κατά τη διάρκεια εκτέλεσης ενός προγράμματος Η χρήση των μεταβλητών πηγάζει από την ανάγκη για αποθήκευση δεδομένων ανάκληση αποθηκευμένων δεδομένων
Μεταβλητές (2) Οι μεταβλητές αποτελούν αναφορά σε μια θέση μνήμης στο περιεχόμενο μιας θέσης μνήμης Χαρακτηριστικά μεταβλητής το όνομά της (θέση μνήμης) η τιμή της (περιεχόμενο) Οι μεταβλητές παριστάνουν οντότητες του προβλήματος που επιλύει το πρόγραμμα Π.χ. Πρόβλημα υπολογισμού της επιφάνειας ενός ορθογωνίου. Οντότητες: μήκος, πλάτος, εμβαδόν Μεταβλητές: mikos, platos, embadon
Σταθερές-Τιμές Σταθερές (constants) είναι υπολογιστικές οντότητες που έχουν σταθερή τιμή κατά τη διάρκεια εκτέλεσης ενός προγράμματος (Π.χ. PI για το 3.14) Τιμές (literals) είναι δεδομένα που δεν χρειάζονται αποθήκευση, χρησιμοποιούνται όπως είναι (Π.χ. Οι αριθμοί 2, 3.5)
Τύποι Δεδομένων Τα δεδομένα δεν έχουν όλα τις ίδιες ιδιότητες, δεν είναι του ίδιου τύπου Τύπος δεδομένων = πεδίο τιμών+τρόποι διαχείρισης = πεδίο τιμών+πράξεις Τύποι δεδομένων βαθμωτοί ή ατομικοί ή πρωτογενείς συναθροιστικοί ή σύνθετοι
Πρωτογενείς Τύποι Δεδομένων ακέραιος (int) πραγματικός (float, double) χαρακτήρας (char) λογικός (η C δεν διαθέτει)
Γιατί τύποι δεδομένων; Οικονομία χώρου λόγω διαφορετικής αποθήκευσης Καλύτερος έλεγχος κατά τη μετάφραση και εκτέλεση του προγράμματος
Προτάσεις Προεπεξεργαστή Ειδικές προτάσεις (δεν τελειώνουν σε ;) Εκτελούν κάποια επεξεργασία του πηγαίου κώδικα πριν τη μεταγλώττιση Πρόταση συμπερίληψης #include > ή #include “ ” Π.χ. #include, #include Πρόταση μακρο-αντικατάστασης #define Π.χ. #define PI , #define sq(x) x * x (πρβλ. sq(x+1))
ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΕΚΧΩΡΗΣΗ ΤΙΜΩΝ - 1 Μεταβλητή είναι μία επώνυμη θέση στην μνήμη Στην C αποτελεί νόμο: «Δήλωση πριν την Χρήση» Η C υποστηρίζει πέντε βασικούς τύπους δεδομένων: ΤύποςΔεσμευμένη λέξη χαρακτήραςchar προσημασμένος ακέραιοςint αριθμός κινητής υπο/λήςfloat αρ. κιν. υπο/λής, διπλής ακρίβειαςdouble απουσία τιμήςvoid Δήλωση (αποτελεί εντολή): τύπος όνομα-μεταβλητής; Παράδειγμα: int counter; Θέσεις δήλωσης μεταβλητών & προσπέλαση τους 1. Μέσα σε συναρτήσεις (local variables) 2. Έξω από όλες τις συναρτήσεις (global variables) Δημιουργία κατά την κλήση – Καταστροφή κατά τον τερματισμό
ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΕΚΧΩΡΗΣΗ ΤΙΜΩΝ - 2 Πολλαπλή δήλωση μεταβλητών Π.χ. float x, y, z; Ονοματολογία μεταβλητών όμοια με συναρτήσεις (0-9 όχι στην αρχή, γράμματα αλφαβήτου και κάτω παύλα) Η C είναι case-sensitive Π.χ. int count, COUNT; Eκχώρηση τιμών (αποτελεί εντολή): όνομα-μεταβλητής = τιμή; Παράδειγματα: counter = 100; fl = 100.1; fl = 100.0; Κάτι ακόμα για τη συνάρτηση εξόδου printf() printf("This prints the number %d", 99); printf("This displays %d, too", 99); % - Κωδικός μορφοποίησης Άλλοι κωδικοί: %c για χαρακτήρες & %f για αριθμούς κινητής υποδιαστολής
Δήλωση Μεταβλητής ή = ; Π.χ. float mikos, platos, embadon; int i = 1; Μεταβλητές που δεν αλλάζουν τιμή (Σταθερές) Π.χ. const float pi = 3.14; διαχωριστικό ;
Τύποι Δεδομένων (data type) int – integer όλοι οι ακέραιοι (...,-2,-1,0,1,2,...) μέχρι τα όρια που καθορίζονται από το υλικό του υπολογιστή συνήθως (16 bit) Αριθμοί κινητής υποδιαστολής (floating-point numbers) float double – double-precision floating point (32 bit)
Τύπος ‘ακέραιος’ Αναπαράσταση ακεραίων, θετικών ή αρνητικών, αριθμών Λέξη κλειδί: int Εύρος: εξαρτάται από το μήκος λέξης του Η/Υ. Π.χ. για λέξη 16-bit: ως ή 0 ως Προσδιοριστές: short, long, unsigned Ακέραιες τιμές: της χειρίζεται σαν ακέραιους αριθμούς, ανάλογα με το μέγεθος. Π.χ. την 125 την χειρίζεται σαν int, ενώ την σαν long int (μπορούμε όμως να επιβάλουμε τον τύπο χειρισμού, π.χ. 6524L)
Τύπος ‘πραγματικός’ Αναπαράσταση πραγματικών αριθμών Εκφράσεις Σταθερής υποδιαστολής: , Εκθετικής ή επιστημονικής μορφής: e+02, 3.5e-2 Λέξεις κλειδιά float: απλής ακρίβειας (6-7 δεκαδικά ψηφία) double: διπλής ακρίβειας (14-15 δεκαδ. ψηφία) Προσδιοριστές: long για το double Πραγματικές τιμές: θεωρούνται σαν double Π.χ. 0.13, 56.48, 8e-3, 15e05, 0.004e-04
Τύπος ‘χαρακτήρας’ Αναπαράσταση απλών χαρακτήρων του αλφαβήτου της γλώσσας Λέξη κλειδί: char Η C χειρίζεται τους χαρακτήρες σαν ακεραίους. Κάθε χαρακτήρας θεωρείται σαν ακέραιος με τιμή τον αντίστοιχο κωδικό ASCII (στο δεκαδικό σύστημα)
Τιμές (Σταθερές) Ο τύπος μιας τιμής (σταθεράς) είναι φανερός, αναγνωρίζεται άμεσα, από την εμφάνισή της, δεν χρειάζεται δήλωση Π.χ. 123 int 25865L long int double 123.5f float ‘A’ char
Ανάθεση-Καταχώρηση Σύμβολο ανάθεσης/καταχώρησης: ‘=’ Διαβάζεται «γίνεται» Σύνταξη = ; Π.χ. mikos = 5; embadon = mikos * platos; Ο τύπος της μεταβλητής πρέπει να είναι συμβατός με τον τύπο του αποτελέσματος της έκφρασης Αποτέλεσμα: αλλαγή της τιμής της μεταβλητής x = x +1; (τι σημαίνει;)
Είσοδος δεδομένων Είσοδος ακεραίων: scanf (“%d”, &num); Είσοδος πραγματικών: scanf (“%f”, &num); Προσδιοριστές: %f, %e, %g Είσοδος χαρακτήρων: scanf (“%c”, &ch); τελεστής διεύθυνσης Εντολή/Συνάρτηση scanf: scanf (“ ”, & );
Έξοδος αποτελεσμάτων (1) Εντολή/Συνάρτηση printf: printf (“ ”, ); Έξοδος ακεραίων: printf (“%d”, num); Προσδιοριστές: %d, %x, %o Έξοδος πραγματικών: printf (“%f”, num); Προσδιοριστές: %f, %e, %g Έξοδος χαρακτήρων: printf (“%c”, ch); (χαρακτήρας) printf (“%d”, ch); (Κωδικός ASCII) Προσδιοριστές: %c, %d
Έξοδος αποτελεσμάτων (2) Προσδιοριστές μορφής εκτύπωσης Οθόνης: ‘\t’, ‘\n’ Αριθμών: % (καθορισμός πλάτους πεδίου). Π.χ. %3d %[ ][. ] (καθορισμός πλάτους πεδίου και δεκαδικών ψηφίων). Π.χ. %6.1f, %.2f, %6f
ΠΑΡΑΔΕΙΓΜΑ-ΠΡΟΓΡΑΜΜΑ #include main () { int num; printf (“Δώσε ένα αριθμό μεταξύ 65 και 90: \t”); scanf (“%d”, &num); printf (“\nΧαρακτήρας: %c\t ASCII κωδικός: %d”, num, num); }
ΑΠΟΤΕΛΕΣΜΑ Δώσε ένα αριθμό μεταξύ 65 και 90: 66 Χαρακτήρας: ΒΚωδικός: 66 Το πληκτρολογεί ο χρήστης
Hello World Σχόλια κείμενο μεταξύ /* και */ Συμπεριλήψεις βιβλιοθηκών πρότυπες βιβλιοθήκες “…” προσωπικές βιβλιοθήκες Κυρίως πρόγραμμα συνάρτηση (function) main αρχή και τέλος συνάρτησης {..} εντολές (statements) /* Αρχείο hello.c * Εμφανίζει στην οθόνη το * μήνυμα hello world */ #include #include “genlib.h” main() { printf(“Hello, world.\n”); }
printf Κλήση της συνάρτησης printf που συμπεριλαμβάνεται στη βιβλιοθήκη stdio.h H printf εμφανίζει δεδομένα στην οθόνη το όρισμα (argument) της συνάρτησης printf καθορίζει τι ακριβώς θα εμφανίσει στην οθόνη Το “Hello, world.\n” είναι μια ακολουθία χαρακτήρων ή αλφαριθμητικό (string) To \n είναι ένας ειδικός χαρακτήρας που ονομάζεται αλλαγή γραμμής (newline)
ΔΗΛΩΣΗ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΕΚΧΩΡΗΣΗ ΤΙΜΩΝ #include int main(void) { int num; num = 100; printf("The value is %d", num); return 0; } #include int main(void) { char ch; float f; double d; ch = 'X'; f = ; d = ; printf("ch is %c, ", ch); printf("f is %f, ", f); printf("d is %f", d); return 0; }
ΕΙΣΟΔΟΣ ΑΡΙΘΜΩΝ ΑΠΟ ΤΟ ΠΛΗΚΤΡΟΛΟΓΙΟ scanf(“%d”, &όνομα-μεταβλητής-int); Π.χ. int num; scanf("%d", &num); scanf(“%f”, &όνομα-μεταβλητής-float); Π.χ. float fl; scanf("%f", &fl); scanf(“%lf”, &όνομα-μεταβλητής- double); Π.χ. double dbl; scanf("%lf", &dbl); #include int main(void) { int num; float f; printf("Enter an integer: "); scanf("%d", &num); printf("Enter a floating point number: "); scanf("%f", &f); printf("%d ", num); printf("%f", f); return 0; }
ΕΚΤΕΛΕΣΗ ΥΠΟΛΟΓΙΣΜΩΝ ΜΕ ΑΡΙΘΜΗΤΙΚΕΣ ΕΚΦΡΑΣΕΙΣ - 1 Η C ορίζει ένα εκτεταμένο σύνολο αριθμητικών τελεστών: ΤελεστήςΣημασία +πρόσθεση -αφαίρεση & μοναδιαίος τελεστής *πολλαπλασιασμός /διαίρεση %υπόλοιπο διαίρεσης ακεραίων Εκφράσεις στη δεξιά πλευρά εντολών εκχώρησης Π.χ. int answer; answer = 100 * 31; Προτεραιότητα πράξεων – Οι τελεστές *, /, % έχουν υψηλότερη προτεραιότητα από τους +, - Χρησιμοποιείτε παντού παρενθέσεις! Π.χ.10 – 2 * 5 (10 – 2) * 5 Μία έκφραση μπορεί να περιέχει μεταβλητές, σταθερές ή συνδυασμό Π.χ. answer = count - 100;
ΕΚΤΕΛΕΣΗ ΥΠΟΛΟΓΙΣΜΩΝ ΜΕ ΑΡΙΘΜΗΤΙΚΕΣ ΕΚΦΡΑΣΕΙΣ - 2 Παράδειγμα 1: #include int main(void) { printf("%d", 5/2); printf(" %d", 5%2); printf(" %d", 4/2); printf(" %d", 4%2); return 0; } Παράδειγμα 2: count *num+88/val-19%count (count * num) + (88 / val) - (19 % count)
ΕΚΤΕΛΕΣΗ ΥΠΟΛΟΓΙΣΜΩΝ ΜΕ ΑΡΙΘΜΗΤΙΚΕΣ ΕΚΦΡΑΣΕΙΣ - 3 Παράδειγμα 3: #include int main(void) { int len, width; printf("Enter length: "); scanf("%d", &len); printf("Enter width: "); scanf("%d", &width); printf("Area is %d", len * width); return 0; } Παράδειγμα 4: #include int main(void) { int i; i = 10; i = -i; printf("This is i: %d", i); return 0; }
ΠΡΟΣΘΗΚΗ ΣΧΟΛΙΩΝ ΣΕ ΕΝΑ ΠΡΟΓΡΑΜΜΑ /* This is a comment. */ /* This is a longer comment that extends over five lines. */ /* this is a comment /* this is another comment nested inside the first -- which will cause a syntax error */ with a nested comment */ pri/* wrong */ntf("this won't work"); /* This program converts earth days into Jovian years. */ #include int main(void) { float e_days; /* number of earth days */ float j_years; /* equivalent number of Jovian years */ /* get number of earth days */ printf("Enter number of earth days: "); scanf("%f", &e_days); /* now, compute Jovian years */ j_years = e_days / (365.0 * 12.0); /* display the answer */ printf("Equivalent Jovian years: %f", j_years); return 0; }