Προγραμματισμός Ι (ΗΥ120)

Σχετικά έγγραφα
Προεπεξεργαστής της C. C Preprocessor. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προεπεξεργαστής C. Προγραμματισμός Ι 1

Προγραμματισμός Ι. Προεπεξεργαστής. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Υπολογιστών με C++

(programming interfaceή/και application programming interface API).

Προγραμματισμός Ι (HY120)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Προγραμματισμός Ι (ΗΥ120)

Δομημένος Προγραμματισμός

Προγραµµατισµός Ι (ΗΥ120)

double sum(double a, double b) { return(a+b); } double my_avg(double a, double b) { return(sum(a, b)/2.0); }

Εισαγωγή στον Προγραμματισμό

Η γλώσσα προγραμματισμού C

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός σε C. Πράξεις με bits (bitwise operators)

Εισαγωγή στην γλώσσα προγραμματισμού C

Προγραμματισμός Ι (ΗΥ120)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Δομημένος Προγραμματισμός (ΤΛ1006)

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Εξοικείωση με το πρόγραμμα DEV C++ Επικοινωνία Χρήστη - Υπολογιστή

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

Προγραμματισμός Ι (ΗΥ120)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΑΣΚΗΣΗ 1: TO ΠΕΡΙΒΑΛΛΟΝ ΕΡΓΑΣΙΑΣ DEV-C++

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι (ΗΥ120)

Ανάπτυξη και Σχεδίαση Λογισμικού

Διαδικασία Ανάπτυξης Λογισμικού

Κεφάλαιο : Εισαγωγή στην C: (Διαλέξεις 3-4)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Ι (HY120)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΕΠΛ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

ΕΡΓΑΣΤΗΡΙΟ 1 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

Προγραμματισμό για ΗΜΥ

Διαδικασιακός Προγραμματισμός

που θα δώσει αποτέλεσµα 48, λόγω της αριστερής προσεταιριστικότητας των τελεστών / και *, ενώ η επιθυµητή αντικατάσταση θα ήταν η

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Αρχεία Κεφαλίδων ΑΡΧΕΙΑ ΚΕΦΑΛΙΔΩΝ. Γεώργιος Παπαϊωάννου ( )

Εισαγωγή στον Προγραμματισμό

Γλώσσα Προγραμματισμού C

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Ι. Πολλαπλά Αρχεία. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Η/Υ (ΤΛ2007 )

Η γλώσσα προγραμματισμού C

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Επεξεργασία Αρχείων Κειµένου

make Προγραμματισμός II 1

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

int a[5]; a[0] a[1] a[2] a[3] a[4] 15/10/2009

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διάλεξη 11: Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

B. Ενσωμάτωση Ιθαγενών Μεθόδων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Εισαγωγή στην Πληροφορική

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Περιεχόμενα. Πρόλογος... 17

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Αντικειµενοστρεφής Προγραµµατισµός

Ανάπτυξη και Σχεδίαση Λογισμικού

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Β' Περιόδου Θέµα 1. (α')

Αρχές Προγραμματισμού

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Ι Ανασκόπηση και εμβάθυνση Μερικά πιο προχωρημένα θέματα. ΙΙ Τα αρχεία δεδομένων στη C

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. Δείκτες (Διάλεξη 14)

3 &4. Εισαγωγήστη C Ιωάννης Κατάκης

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Εισαγωγή στο Bison. Μεταγλωττιστές, Χειμερινό εξάμηνο

TMHMA TEXNΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛ/ΝΙΩΝ Προγραμματισμός Ι ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ , Α ΕΞΑΜΗΝΟ Βασίλης Μποζαντζής. Βασίλης Μποζαντζής

Διαδικαστικός Προγραμματισμός

Διαδικασιακός Προγραμματισμός

Ενδεικτική περιγραφή μαθήματος

Εισαγωγή στον Προγραμματισμό

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Μεταγλωττιστές. Εργαστήριο 5. Εισαγωγή στο BISON. Γεννήτρια Συντακτικών Αναλυτών. 2 η Φάση Μεταγλώττισης Συντακτική Ανάλυση

Προγραμματισμός Ι (ΗΥ120)

Προγραμματισμός Η/Υ (ΤΛ2007 )

Γλώσσα Προγραμματισμού C++ Εισαγωγή - Μια πρώτη ματιά

Περιεχόμενα. Πρόλογος... 21

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Οργάνωση Προγραμμάτων σε Πολλαπλά Αρχεία (Κεφάλαιο , KNK-2ED)

Προγραμματισμός I (Θ)

Κεφάλαιο : Εισαγωγή στην C. ( ιαλέξεις 3-4) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομημένος Προγραμματισμός (ΤΛ1006)

Ενδεικτικές λύσεις και στατιστικά

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 18: Ο προεπεξεργαστής της C.

Βασική ιδέα Ο προεπεξεργαστής (pre-proccesor) της C είναι ένα πρόγραμμα που εκτελείται και μετασχηματίζει τον πηγαίο κώδικα πριν αυτός δοθεί στον μεταγλωττιστή για μετάφραση (gcc -E). Πραγματοποιεί αλλαγές σε επίπεδο κειμένου, με την μορφή «απλών» αντικαταστάσεων χαρακτήρων, χωρίς γνώση ή ερμηνεία του συντακτικού της C. Οι πιο χαρακτηριστικές χρήσεις: μακροεντολές εισαγωγή κειμένου υπό συνθήκη αντιγραφή κειμένου από άλλα αρχεία 2

P1x preproc P1 x 3 compiler x -> y P1 y CPU y

Μακροεντολές #define <macro> <expr> Ορίζει μια μακροεντολή <macro> προς χρήση στο κείμενο του προγράμματος, που θα αντικατασταθεί από τον προεπεξεργαστή με την έκφραση <expr>. Η επεξεργασία των macros γίνεται με απλή αντικατάσταση σε επίπεδο κειμένου. Σημείωση: χρειάζεται προσοχή (παρενθέσεις) έτσι ώστε να αποφεύγονται λάθη με τελεστές που ακολουθούν στο κείμενο του προγράμματος. Σημείωση 2: χρειάζεται προσοχή με «παραμέτρους» των macros καθώς αυτές αποτιμώνται εκ νέου, όσες φορές εμφανίζονται στην έκφραση. 4

/* ορισμός συμβολικών σταθερών */ 5 #define N 100 int t[n]; for (i=0; i < N; i++ ) { } if (i == N) { }

/* ορισμός συμβολικών σταθερών */ 6 #define N 10*10 int t[n]; for (i=0; i < N; i++ ) { } if (i == N) { }

/* ορισμός συμβολικών σταθερών */ 7 #define A 10 #define B 20 #define C (A+B) #define D (C*Β)

/* ορισμός μακροεντολών */ 8 #define LOWERCASE(a) (a- 'A' + 'a') int main(int argc, char *argv[]) { char c; do { c=getchar(); if ((c >= 'A') && (c <= 'Z')) { c=lowercase(c); } putchar(c); } while (c!= '/n'); } return(0);

/* ορισμός μακροεντολών */ 9 #define LOWERCASE(a) (((a>='a') && (a<='z'))? a-'a'+'a' : a) int main(int argc, char *argv[]) { char c; do { c=getchar(); putchar(lowercase(c)); } while (c!= '\n'); } return(0);

/* μη χρήση παρενθέσεων */ 10 #define PLUSONE(x) x+1 int main(int argc, char *argv[]) { int i,j; scanf("%d",&i); j=plusone(i)*2; printf("%d\n",j); } return(0);

/* και σωστά */ 11 #define PLUSONE(x) (x+1) int main(int argc, char *argv[]) { int i,j; scanf("%d",&i); j=plusone(i)*2; printf("%d\n",j); } return(0);

/* επανειλημμένη αποτίμηση παραμέτρων... */ 12 #define SQUARE(a) ((a)*(a)) int main(int argc, char *argv[]) { int i,j; scanf("%d",&i); j=square(++i); printf("%d\n",j); } return(0);

Προ-ορισμένες μακροεντολές DATE The date of compilation as a character literal in "MMM DD YYYY" format 13 TIME FILE func LINE STDC Τhe time of compilation as a character literal in "HH:MM:SS" format The source code filename as a string literal. The function name as a string literal. The line number in the source file as a decimal constant. Defined as 1 when the compiler complies with the ANSI standard.

14 #include <stdio.h> int main (int argc, char *argv[]) { printf("file :%s\n", FILE ); printf("date :%s\n", DATE ); printf("time :%s\n", TIME ); printf( Function: %s\n, func ); printf("line :%d\n", LINE ); printf("ansi :%d\n", STDC ); } return(0); File :predefined.c Date :Dec 21 2014 Time :23:57:58 Function: main Line :8 ANSI :1

Stringize (#) Μετατρέπει παράμετρο μακροεντολής σε string 15 #include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(int argc, char *argv[]) { message_for(carole, Debra); return 0; } Carole and Debra: We love you!

Συνένωση tokens (##) Συνενώνει παραπάνω από μία παραμέτρους της μακροεντολής σε μία 16 #include <stdio.h> #define tokenpaster(n) printf ("token %s = %d\n", #n, token##n) int main(int argc, char *argv[]) { int token34 = 40; } tokenpaster(34); return 0; token34 = 40

Εισαγωγή υπό συνθήκη #if, #else, #elif, #endif #ifdef, #ifndef 17 Συνθήκες πάνω σε συμβολικά ονόματα. Αν μια συνθήκη ισχύει τότε το αντίστοιχο κείμενο συμπεριλαμβάνεται για μετάφραση, διαφορετικά όχι. Το κείμενο που συμπεριλαμβάνεται / αφαιρείται μπορεί να είναι οτιδήποτε (δεν χρειάζεται να αντιστοιχεί σε κάποια συντακτική ενότητα). Χρήσιμο για επιλογή ανάμεσα σε διαφορετικές εκδόσεις του κώδικα (κώδικας αποσφαλμάτωσης, υποστήριξη για διαφορετικές πλατφόρμες κλπ). Χρησιμοποιείται και για την αποφυγή διπλής εισαγωγής κειμένου (βλέπε #include).

18 #define DEBUG #ifdef DEBUG /* ή #if defined(debug) */ /* my debugging code */ #endif

19 #define DEBUG aaaaaaaaa #ifdef DEBUG bbbbbbbbb #endif aaaaaaaaa bbbbbbbbb ccccccccc ccccccccc

20 #define DEBUG #ifdef DEBUG /* ή #if defined(debug) */ /* my debugging code */ #endif

21 #define DEBUG aaaaaaaaa #ifdef DEBUG bbbbbbbbb #endif aaaaaaaaa ccccccccc ccccccccc

22 #ifdef OLDVERSION /* old code */ #else /* new code */ #endif

23 #define LINUX_VERSION 5 #if LINUX_VERSION == 6 /* code for this platform */ #else /* code for default platform */ #endif

24 #ifndef INCL_X /* ή #if!defined(incl_x) */ #define INCL_X /* avoid recursive inclusion */ /* my code */ #endif

Εισαγωγή αρχείων #include "filename" Τα περιεχόμενα του αρχείου filename εισάγονται ακριβώς στο σημείο που εμφανίζεται η εντολή. Αν το αρχείο προς εισαγωγή δεν βρίσκεται στον κατάλογο εργασίας, τότε ο αντίστοιχος κατάλογος πρέπει να προσδιορίζεται με το όνομα του αρχείου. Αν το όνομα του αρχείου δίνεται σε < > αντί " ", τότε ο προεπεξεργαστής θεωρεί ότι το αρχείο βρίσκεται στον κατάλογο όπου έχουν τοποθετηθεί τα header files της C, π.χ. /usr/include. Αν το αρχείο που εισάγεται περιέχει και αυτό με την σειρά του εντολές #include τότε γίνεται εισαγωγή και αυτών των αρχείων μέσα στο αρχείο. 25

/* αρχείο stdio.h */ 26 /* αρχείο myprog */ #include <stdio.h> /* αρχείο myprog */ /* αρχείο stdio.h */

/* αρχείο file1 */ 27 /* αρχείο file2 */ #include "file1" /* αρχείο file2 */ /* αρχείο file1 */

/* αρχείο file1 */ /* αρχείο file2 */ #include "file1" /* αρχείο file3 */ #include "file2" cccccccccc cccccccccc cccccccccc /* αρχείο file3 */ /* αρχείο file2 */ /* αρχείο file1 */ cccccccccc cccccccccc cccccccccc 28

/* myprog_min.h */ #define min(a,b) ((a)<(b)? (a) : (b)) /* myprog_max.h */ #define max(a,b) ((a)>(b)? (a) : (b)) 29 /* myprog_main.c */ #include "myprog_min.h" #include "myprog_max.h int main(int argc, char *argv[])) { int a,b; scanf("%d %d",&a,&b); printf("%d %d\n",min(a,b),max(a.b)); } return(0);

Αποφυγή επανειλημμένης εισαγωγής Ένα αρχείο μπορεί να εισάγει με την σειρά του (έμμεσα) επιπλέον αρχεία, τα οποία μπορεί να εισάγονται ξανά από το κυρίως πρόγραμμα. Η διπλή εισαγωγή μπορεί να είναι ανεπιθύμητη. Π.χ. διπλή εισαγωγή μεταβλητών και συναρτήσεων που οδηγεί (στη μετάφραση) σε συντακτικά λάθη. Λύση 1: ο προγραμματιστής πρέπει να γνωρίζει ποιά αρχεία εισάγουν (έμμεσα) τα αρχεία που εισάγει στο πρόγραμμα του (άμεσα) Μη πρακτικό, άκομψο. Λύση 2: το ίδιο το αρχείο φροντίζει να μην μπορεί να εισαχθεί δύο φορές στο ίδιο κείμενο Κλασική περίπτωση χρήσης του #ifndef. 30

/* αρχείο file1 */ /* αρχείο file2 */ #include "file1" /* αρχείο file3 */ #include "file2" #include "file1" cccccccccc cccccccccc /* αρχείο file3 */ /* αρχείο file2 */ /* αρχείο file1 */ /* αρχείο file1 */ cccccccccc cccccccccc 31

#ifndef INC_FILE1 #define INC_FILE1 /* αρχείο file1 */ #endif /* αρχείο file2 */ #include "file1" /* αρχείο file3 */ #include "file2" #include "file1" cccccccccc cccccccccc /* αρχείο file3 */ /* αρχείο file2 */ /* αρχείο file1 */ cccccccccc cccccccccc 32

/* myprog_min.h */ #ifndef INCL_MYPROGMIN #define INCL_MYPROGMIN #define min(a,b) ((a)<(b)? (a) : (b)) #endif /* myprog_max.h */ #include "myprog_min.h" #define max(a, b) ({\ int res;\ if ((a) == min((a),(b))) \ res = (b); \ else \ res = (a); \ res; \ }) /* myprog_main.c */ #include "myprog_min.h" #include "myprog_max.h" 33 int main(int argc, char *argv[]) { int a,b; scanf("%d %d",&a,&b); printf("%d %d\n",min(a,b),max(a,b)); } return(0);

Χρήση Στατικής Βιβλιοθήκες Συμπερίληψη (#include) του header file της βιβλιοθήκης Χρήση στον κώδικά μας των συναρτήσεων που παρέχει η βιβλιοθήκη (όπως τεκμηριώνονται στις οδηγίες χρήσης και το header file) Μεταγλώττιση & σύνδεση: 34 gcc......... -l<όνομα βιβλιοθήκης> -L<τοποθεσία_βιβλιοθήκης> Από το όνομα βιβλιοθήκης αφαιρούμε το lib και το.a Π.χ. για να γίνει link η βιβλιοθήκη libmy_lib.a η οποία βρίσκεται στον ίδιο κατάλογο με το my_code.c: gcc my_code.c -o my_code -lmy_lib -L.