C (9)

13
1 Περιεχόμενα Χαρακτηριστικά της C Κύκλος ανάπτυξης προγραμμάτων Παράδειγμα (“Hello World”) Εκτέλεση προγραμμάτων Συντακτικοί κανόνες της C Ονόματα, Λέξεις κλειδιά Τελεστές, ∆ιαχωριστές Σχόλια, Σταθερές Απλοί τύποι δεδομένων Ορισμός μεταβλητών Χαρακτηριστικά της C (i) Γλώσσα > χαμηλού επιπέδου Οικονομία στην έκφραση (λιτή και περιεκτική). Σχετικά χαλαρό σύστημα τύπων. Φιλοσοφία: ο προγραμματιστής έχει πλήρη έλεγχο και ευθύνεται για τα σφάλματά του. Χαρακτηριστικά της C (ii) Ιδιαίτερα δημοφιλής Είναι μεταφέρσιμη (portable). Η ικανότητα μεταφοράς ενισχύεται από το πρότυπο ANSI C. Είναι ισχυρή και ευέλικτη. Έχει χρησιμοποιηθεί για την ανάπτυξη πολλών συστημάτων και εφαρμογών. Έχει χρησιμοποιηθεί ως βάση για πληθώρα άλλων γλωσσών: C++, Java Προγραμματισμός Προγραμματισμός είναι η διαδικασία επικοινωνίας με τον υπολογιστή μέσω αλγόριθμων Αλγόριθμος είναι μια διαδικασία που χρησιμοποιείται για την επίλυση κάποιου προβλήματος και της οποίας τα βήματα είναι πλήρως καθορισμένα. Ένας αλγόριθμος είναι σαν μια συνταγή.

description

σημειώσεις

Transcript of C (9)

Page 1: C (9)

1

Περιεχόµενα

• Χαρακτηριστικά της C• Κύκλος ανάπτυξης προγραµµάτων• Παράδειγµα (“Hello World”)• Εκτέλεση προγραµµάτων• Συντακτικοί κανόνες της C• Ονόµατα, Λέξεις κλειδιά• Τελεστές, ∆ιαχωριστές• Σχόλια, Σταθερές• Απλοί τύποι δεδοµένων• Ορισµός µεταβλητών

Χαρακτηριστικά της C (i)

• Γλώσσα > χαµηλού επιπέδου• Οικονοµία στην έκφραση (λιτή και περιεκτική).• Σχετικά χαλαρό σύστηµα τύπων.• Φιλοσοφία: ο προγραµµατιστής έχει πλήρη έλεγχο και ευθύνεται για τα σφάλµατά του.

Χαρακτηριστικά της C (ii)• Ιδιαίτερα δηµοφιλής• Είναι µεταφέρσιµη (portable). Η ικανότητα

µεταφοράς ενισχύεται από το πρότυπο ANSI C.• Είναι ισχυρή και ευέλικτη. Έχει χρησιµοποιηθεί για την ανάπτυξη πολλών συστηµάτων και εφαρµογών.

• Έχει χρησιµοποιηθεί ως βάση για πληθώρα άλλων γλωσσών: C++, Java

Προγραµµατισµός• Προγραµµατισµός είναι η διαδικασία επικοινωνίας µε τον υπολογιστή µέσω αλγόριθµων

• Αλγόριθµος είναι µια διαδικασία που χρησιµοποιείται για την επίλυση κάποιου προβλήµατος και της οποίας τα βήµατα είναι πλήρως καθορισµένα.

• Ένας αλγόριθµος είναι σαν µια συνταγή.

Page 2: C (9)

2

Βήµατα διαδικασίας επίλυσης1. (Είσοδος - Έξοδος)2. Εύρεση αλγόριθµου για την επίλυσή του3. ∆ηµιουργία απαραίτητου κώδικα σε C4. Εκτέλεση προγράµµατος και έλεγχος

αποτελεσµάτων• Παραδείγµατα:

– Να βρεθεί ο µικρότερος από 1000 αριθµούς.– ∆οθέντος ενός αριθµού k, είναι ο k πρώτος;

Κύκλος ανάπτυξης κώδικα• Χρησιµοποίηση ενός συντάκτη (editor) για τη δηµιουργία του αρχείου που περιέχει τον πηγαίο κώδικα (source code)

• Μεταγλώττιση (compilation) πηγαίου κώδικα και δηµιουργία αντικειµενικού κώδικα (object code)

• Σύνδεση (linking) του αντικειµενικού κώδικα• Εκτέλεση και έλεγχος προγράµµατος

∆ηµιουργία πηγαίου κώδικα• Ο πηγαίος κώδικας είναι µια σειρά εντολών µε την οποία υλοποιούµε τον αλγόριθµο µας σε κάποια γλώσσα προγραµµατισµού.

• Χρησιµοποιώντας έναν συντάκτη δηµιουργούµε ένα αρχείο που περιέχει τον πηγαίο κώδικα.

• Το αρχείο πρέπει να έχει την κατάληξη .c• Παραδείγµατα: example.c, minimum.c, κλπ.

Μεταγλώττιση (compilation) (i)• Ο πηγαίος κώδικας της C αποτελείται από εντολές κατανοητές στον άνθρωπο (π.χ. if … then, while, κλπ)

• Πρόβληµα: Ο υπολογιστής καταλαβαίνει µόνο εντολές πολύ χαµηλού επιπέδου (σειρές από 0 και 1)

Page 3: C (9)

3

Μεταγλώττιση (ii)• Η µετάφραση του πηγαίου κώδικα σε γλώσσα κατανοητή από τον υπολογιστή γίνεται από τον compiler.

• Το αποτέλεσµα της µεταγλώττισης είναι η δηµιουργία του αρχείου που περιέχει τον αντικειµενικό κώδικα (object code) . Αυτό έχει την κατάληξη .obj

• Παράδειγµα: bcc example.c . example.obj

Λάθη µεταγλώττισης• Πολλές φορές ο µεταγλωττιστής ανακαλύπτει λάθη στο πρόγραµµά µας.

• Αυτά τα λάθη λέγονται συντακτικά και µπορεί να είναι ορθογραφικά, τυπογραφικά, κλπ.

• Οι µοντέρνοι µεταγλωττιστές εντοπίζουν µε ακρίβεια τα λάθη κάνοντας εύκολη τη διόρθωσή τους.

Σύνδεση (linking) (i)• Τις πιο πολλές φορές τα προγράµµατά µας θα χρησιµοποιούν κώδικα που έχει ήδη µεταγλωττιστεί.

• Ο κώδικας αυτός βρίσκεται σε ειδικά µέρη στον υπολογιστή που λέγονται βιβλιοθήκες.

• Τέτοιος κώδικας χρησιµοποιείται για εµφάνιση δεδοµένων στην οθόνη, ανάγνωση στοιχείων από πληκτρολόγιο, κλπ.

Page 4: C (9)

4

Σύνδεση (linking) (ii)• Ο κώδικας που δηµιούργησε ο compiler πρέπει να συνδεθεί µε τον κώδικα των βιβλιοθηκών.

• Αυτή η διαδικασία λέγεται σύνδεση (linking)• Συνήθως η µεταγλώττιση και η σύνδεση γίνονται σε ένα βήµα από τους µοντέρνους µεταγλωττιστές.

Εκτέλεση (execution)• Το αποτέλεσµα της σύνδεσης είναι η δηµιουργία ενός αρχείου που περιέχει τον εκτελέσιµο κώδικα (executable code). Αυτό έχει την κατάληξη .exe

• Το αρχείο αυτό µπορούµε να το τρέξουµε και να δούµε αν κάνει αυτό που θέλουµε.

• Παράδειγµα: example.exe

Λάθη εκτέλεσης• Αν ο εκτελέσιµος κώδικας δε συµπεριφέρεταιόπως θα θέλαµε, τότε το πρόγραµµά µας έχει λάθη εκτέλεσης ή τρεξίµατος (run-time errors)

• Τι κάνουµε; Εντοπίζουµε τα λάθη και επαναλαµβάνουµε όλα τα προηγούµενα βήµατα.

Hello world!# include <stdio.h>void main ( ){printf("Hello world!\n");}• Παρατηρήσεις

– Η επικοινωνία µε τον «έξω» κόσµο γίνεται µέσω της βιβλιοθήκης συναρτήσεων

– Το σηµείο έναρξης του προγράµµατος είναι η «κύρια» συνάρτηση main.

Page 5: C (9)

5

Ανάλυση hello.c (i)• Κάθε πρόγραµµα έχει µια συνάρτηση main απ’ όπου αρχίζει η εκτέλεση.

• Οι παρενθέσεις που ακολουθούν τη mainδηλώνουν στον compiler ότι είναι συνάρτηση.

• Τα άγκιστρα πάντα περιβάλλουν το σύνολο εντολών που θέλουµε να εκτελεστούν από µια συνάρτηση. Τα άγκιστρα υποδεικνύουν το σώµα µιας συνάρτησης.

Ανάλυση hello.c (ii)• printf ( )• Η printf είναι µια συνάρτηση βιβλιοθήκης που χρησιµοποιείται για να προβάλλει πληροφορίες στην οθόνη.

• "hello world!\n " Η πληροφορία που θέλουµε να τυπωθεί στην οθόνη πρέπει να περιβάλλεται από " ". Οι δύο χαρακτήρες \n έχουν σαν αποτέλεσµα την αλλαγή γραµµής.

Ανάλυση hello.c (iii)• # include• Η εντολή αυτή χρησιµοποιείται για να συµπεριλάβει τα περιεχόµενα κάποιου άλλου αρχείου στο πρόγραµµα.

• Τα αρχεία αυτά περιέχουν χρήσιµες πληροφορίες για τον compiler και λέγονται αρχεία επικεφαλίδας (header files).

• Συνήθως έχουν την κατάληξη .h (όπως το stdio.h)

Page 6: C (9)

6

Συντακτικό (i)

• Ένα πρόγραµµα είναι µια ακολουθία χαρακτήρων η οποία µετατρέπεται από τον compiler σε γλώσσα κατανοητή από τον υπολογιστή (γλώσσα µηχανής)

• Για να γίνει αυτό, το πρόγραµµα πρέπει να είναι συντακτικά σωστό.

• Ο compiler πρέπει πρώτα να οµαδοποιήσει τους χαρακτήρες σε λέξεις και έπειτα να δώσει νόηµα σε αυτές τις λέξεις σύµφωνα µε το συντακτικό της γλώσσας.

Συντακτικό (ii)

• Αντίθετα από τον άνθρωπο που καταλαβαίνει και προτάσεις µε συντακτικά λάθη, ο compiler δεν µπορεί να µεταγλωττίσει ένα πρόγραµµα όσο ασήµαντο και να είναι το λάθος

• Ο προγραµµατιστής πρέπει να είναι ακριβής όταν γράφει κώδικα

Αλφάβητο C

• Ένα C πρόγραµµα µπορεί να αποτελείται από τους παρακάτω χαρακτήρες:– Μικρά a, b, c, …, z– Κεφαλαία γράµµατα A, B, C, …, Z– Ψηφία 0, 1, ..., 9– Ειδικούς χαρακτήρες +=_-()*&%$#!|<> κ.ο.κ.

καθώς και το κενό και χαρακτήρες αλλαγήςγραµµής που είναι γνωστά ως white space.

Λεξιλόγιο C

• Όλοι οι προηγούµενοι χαρακτήρες οµαδοποιούνται από τον compiler σε λέξεις οι οποίες διακρίνονται σε:– Ονόµατα (identifiers)– Λέξεις κλειδιά (reserved words)– Σταθερές (constants)– Συµβολοσειρές (strings)– Τελεστές (operators)– ∆ιαχωριστές (separators)

Page 7: C (9)

7

sum.c/* read two integers and print their sum */#include <stdio.h>void main(){int a, b, sum;printf(“Enter a and b: ”);scanf(“%d%d”, &a, &b);sum = a + b;printf(“\nThe sum of a and b is: %d\n”,sum);

}

Λεξική ανάλυση του sum.c (i)

/* read two integers and print their sum */

Αυτό είναι ένα σχόλιο. Τα σχόλια αρχίζουν µε /* και τελειώνουν σε */ και «διαγράφονται» από τον compiler. Άλλος τρόπος είναι µε δύο πλάγιες γραµµές //

#include <stdio.h>H λέξη include είναι µια λέξη κλειδί. Τα #, <, > είναι διαχωριστές

Λεξική ανάλυση του sum.c (ii)

void main (){int a,b, sum;

H λέξη main είναι το όνοµα µιας συνάρτησης.Τα (, ) και { είναι διαχωριστέςint είναι µια λέξη κλειδίTα a, b, sum είναι ονόµαταΤα , ; είναι διαχωριστές

Λεξική ανάλυση του sum.c (iii)printf("Enter a and b: ");scanf("%d%d", &a, &b);

printf και scanf είναι ονόµατα. Οι παρενθέσεις που ταακολουθούν δείχνουν στον compiler ότι είναι συναρτήσεις.

Αν δεν ορίζονται σε άλλο σηµείο του προγράµµατος, θα ψάξει να τις βρει στη βιβλιοθήκη συναρτήσεων.

"Enter a and b: "Ότι περιβάλλεται από " " αποτελεί µια συµβολοσειρά.&a και &b Το & είναι ένας τελεστής.

Page 8: C (9)

8

Λεξική ανάλυση του sum.c (iv)

sum = a + b;Τα σύµβολα = και + είναι τελεστές. Τα κενά ανάµεσά τους θα µπορούσαν να παραληφθούν. Το ίδιο αποτέλεσµα θα είχαµε αν γράφαµεsum=a+b; ήsum = a + b;αλλά όχι (γιατί;)

s u m = a + b;

Λεξική ανάλυση του sum.c (v)• Σε αυτό το παράδειγµα τα main, sum, a, b, scanf είναιόλα ονόµατα.

• Η λέξη int είναι µια λέξη κλειδί. Τα =, +, {, } είναι επίσης λέξεις, αλλά ερµηνεύονται από τον compilerσαν διαχωριστές ή τελεστές.

• Κενά και σχόλια µπορούν να τοποθετηθούν παντού στο πρόγραµµα εκτός µέσα στις λέξεις.

• Τα κενά, οι αλλαγές γραµµής (ή αλλιώς white space)χρησιµοποιούνται από τον compiler για να διαχωρίζει τις λέξεις και να τους δίνει διαφορετικό νόηµα.

• Χρησιµοποιούνται επίσης από τον άνθρωπο για να γίνεται το πρόγραµµα πιο ευανάγνωστο.

To sum.c ξανά

#include <stdio.h>void main(){int a, b, sum;printf(“Enter a and b: ”);scanf(“%d%d”, &a, &b);sum=a+b;printf(“\nThe sum of a and b is: %d\n”,sum);}

Oνόµατα (i)

• Ένα όνοµα στη C µπορεί ν’ αποτελείται απόγράµµατα, ψηφία και τον ειδικό χαρακτήρα “_” πουλέγεται υπογράµµιση (underscore).

• Ο πρώτος χαρακτήρας πρέπει να είναι γράµµα ήυπογράµµιση.

• Ο τρόπος γραφής έχει σηµασία. Για παράδειγµα το sum διαφέρει από το Sum.

• Τα ονόµατα πρέπει να επιλέγονται ώστε να κάνουν προφανή τη σηµασία τους και εύκολη την ανάγνωση του κώδικα.

Page 9: C (9)

9

Oνόµατα (ii)

• Χρησιµοποιούνται στη C για να δηλώνουµε ονόµατα µεταβλητών και συναρτήσεων.

• Παραδείγµατα σωστών ονοµάτων: i, j, sum, counter, another_counter, thisisaname, ThisIsAName, so_is_this, _and_this, double_or_nothing, intersection

• Παραδείγµατα λάθος ονοµάτων: my#name, 123test, not$good, double, union

Λέξεις κλειδιά (reserved words)

• Οι λέξεις κλειδιά είναι ονόµατα που έχουν ειδικήσηµασία στη C. ∆ε µπορεί να τροποποιηθεί η σηµασία τους από τον προγραµµατιστή.

• Μερικές από αυτές τις λέξεις φαίνονται παρακάτω:break, case, char, continue, default, do,double, else, for, if, int,, …., return,union, void, while

Τελεστές και διαχωριστές

• Υπάρχουν χαρακτήρες που έχουν ειδική σηµασία στη C. Τέτοιοι είναι για παράδειγµα οι+, -, *, /που αντιστοιχούν στις συνήθεις πράξεις και λέγονται τελεστές. Αυτοί όµως χρησιµοποιούνται και για να διαχωρίζουν ονόµατα:

• a+b /* Το a προστίθεται στο b */• a_b /* Αυτό είναι ένα όνοµα µε 3 χαρακτήρες */

Συµβολοσειρές (strings)

• Μια ακολουθία χαρακτήρων που περικλείεται µέσα σε " " ορίζει µια συµβολοσειρά. Προσέξτε ότι το " είναι ένας χαρακτήρας και όχι δύο.

• Αν πρέπει να περιληφθεί µέσα στη συµβολοσειράπρέπει να προηγηθεί από \

• Παραδείγµατα"this is a string"" " /* ένα string µόνο µε κενά */"a string with \" double quote in it""sum = a + b" /* τίποτα δεν εκτελείται */

Page 10: C (9)

10

Σχόλια (comments) (i)• Τα σχόλια είναι σειρές χαρακτήρων που βρίσκονται

µέσα σε /* και */. Θεωρούνται σαν white space από τον compiler και αγνοούνται. Μπορούν να µπουν παντού για να κάνουν εύκολη την αναγνωσιµότητα του προγράµµατος.#include <stdio.h>/* This simple program greets theworld by saying "hello" */void main (){printf( /* eh? */ "Hello world!\n");}

Σχόλια (comments) (ii)• Μπορείτε επίσης να δώσετε έµφαση ώς εξής:

/*************************** you can put comments ** in a box ***************************/

• Το παρακάτω όµως είναι λάθος/* Nested /* comments */ are wrong! */Τα σχόλια πρέπει να γράφονται την ίδια στιγµή που γράφεται και ο κώδικας. Μην αφήνετε τα σχόλια για το τέλος. Πάντα βάζετε σχόλια σε εντολές ή συναρτήσεις που η σηµασία τους δεν είναι προφανής.

Απλοί τύποι δεδοµένων (i)

• Τα αριθµητικά δεδοµένα στη C µπορεί να είναι πολλών τύπων.

• Μικροί ακέραιοι όπως οι 0, 1, -100 απαιτούν λιγότερη µνήµη και ο υπολογιστής χειρίζεται τις πράξεις τους µε µεγαλύτερη ταχύτητα.

• Μεγάλοι ακέραιοι ή πραγµατικοί αριθµοί απαιτούν περισσότερο χώρο και οι πράξεις γίνονται πιο αργές.

• Είναι σηµαντικό να επιλέγεται ο κατάλληλος τύπος µιας αριθµητικής µεταβλητής.

Απλοί τύποι δεδοµένων (ii)

Page 11: C (9)

11

Απλοί τύποι δεδοµένων (iii)

• Τι συµβαίνει όταν προσθέτουµε αριθµούς που δεν µπορεί να υποστηρίξει ο τύπος;

Παράδειγµαint a, b, c;...a = 30000; b = 30000;c = a+b;

Ποια η τιµή του c;• Η πληροφορία χάνεται λόγω overflow. Αυτό αποτελεί παράδειγµα λάθους εκτέλεσης.

Συστήµατα Αρίθµησης• ∆εκαδικό σύστηµα (σύστηµα µε βάση 10)Οι αριθµοί αποτελούνται από τα ψηφία 0, 1, 2, …, 9.

• Η τιµή ενός αριθµού υπολογίζεται από το γινόµενο του αθροίσµατος των ψηφίων πολλαπλασιασµένων µε τη βάση υψωµένη σε µια κατάλληλη δύναµη.

• Παράδειγµα523 = 5*102 + 2*101 + 3*100 = 500 + 20 + 3

• Ερώτηση: Πόσες διαφορετικές τιµές µπορεί να πάρει ένας αριθµός µε n ψηφία;

Απάντηση: 10n

Συστήµατα Αρίθµησης

• ∆υαδικόΟι αριθµοί αποτελούνται από τα ψηφία 0 και 1.

• Η τιµή ενός αριθµού υπολογίζεται όπως και στο δεκαδικό σύστηµα. Το µόνο που αλλάζει είναι η βάση (2).

• Παράδειγµα100101 = 1*25 + 1*22 + 1*20 = 32 + 4 + 1 = 37

• Ποια η τιµή του 111…1 (n συνεχόµενοι άσσοι);• Ένας δυαδικός αριθµός µε n ψηφία µπορεί να πάρει 2n

διαφορετικές τιµές.

Μετατροπή από δεκαδικό σε δυαδικό

• Χρησιµοποιούµε τη λεγόµενη greedy (άπληστη) µέθοδο. Αφαιρούµε κάθε φορά τη µεγαλύτερη δύναµη του 2. Παράδειγµα µετατροπής του 58.58 - 32 = 2626 - 16 = 1010 - 8 = 22 - 2 = 0

• Άρα, 58 = 32 + 16 + 8 + 2 = 25 + 24 + 23 + 21

= 1*25 + 1*24 + 1*23 + 0*22 + 1*21 + 0*20

=111010

Page 12: C (9)

12

Μετατροπή από δεκαδικό σε δυαδικό

• ∆ιαιρούµε συνεχώς µε το 2 µέχρι το πηλίκο να γίνει 0• Παράδειγµα µετατροπής του 41.

41 : 2 = 20 + 120 : 2 = 10 + 010 : 2 = 5 + 05 : 2 = 2 + 12 : 2 = 1 + 01 : 2 = 0 + 1

• Άρα, ο ζητούµενος αριθµός είναι το 101001.

Μεταβλητές (i)• Οι µεταβλητές είναι ονόµατα που καθορίζονται απόπρογραµµατιστή για να αποθηκεύουν κάποια πληροφορία.

• Για να χρησιµοποιηθούν, πρέπει πρώτα να δηλωθούν:Τύπος Όνοµα_Μεταβλητής;

• Παραδείγµατα:int sum;char c;int x, y, z; /* Πολλές δηλώσεις σε 1 γραµµή */double r;unsigned long abc;

Μεταβλητές (ii)• Η δήλωση µιας µεταβλητής δεσµεύει χώρο στη µνήµη του υπολογιστή. Η τιµή της όµως µπορεί να είναι τυχαία. Η απόδοση τιµών σε µια µεταβλητή µπορεί να γίνει κατά τη δήλωσή της ή αργότερα στο πρόγραµµα.

• Παραδείγµαταint a, b;int x = 1;int y = 0, z = 100;double r = 3.14;/* ...*/a = 100; b = -10;

Σταθερές (constants) (i)

• Ακέραιες42 0 -1 δεκαδικές037 οκταδικές0x1f δεκαεξαδικές42U 42L 42UL unsigned & long

• Κινητής υποδιαστολής42.0 -1.3 δεκαδικές2.99e8 µε δύναµη του 1042.0F 42.0L float & long double

Page 13: C (9)

13

Σταθερές (ii)• Χαρακτήρα

'a' '0' '$'• Ειδικοί χαρακτήρες

\n αλλαγή γραµµής\' απόστροφος\\ χαρακτήρας \ (backslash)\t αλλαγή στήλης (tab)\" εισαγωγικό\0 χαρακτήρας µε ASCII = 0 (null)\037 » µε ASCII = 37 (οκταδικό)\0x1f » µε ASCII = 1f (δεκαεξαδικό)

• Συµβολοσειρές "abc" "Hello world!\n" "10 red"

Σταθερές (iii)

• ∆ηλώσειςconst int size = 10, num = 5;const double pi = 3.14159;const char newline = '\n’

• Μια µεταβλητή που δηλώνεται µε const δεν µπορεί να µεταβληθεί κατά τη διάρκεια του προγράµµατος.

• Ή µε την εντολή#define name value

Άσκηση

• Κάνοντας χρήση της sizeof(Data Type) βρείτε από πόσα bytes αποτελείται κάθε βασικός τύπος στον υπολογιστή σας.

• Παράδειγµα χρήσης:sizeof(int)sizeof(char)

• Φτιάξτε ένα πρόγραµµα που τυπώνει το άθροισµα δύο αριθµών και δείτε πότε δηµιουργείται overflow.