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

Σχετικά έγγραφα
Προγραμματισμός Ι (ΗΥ120)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Αλγόριθμοι Ταξινόμησης Μέρος 1

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

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

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

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

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

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

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

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

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

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

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

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

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

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

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

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

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

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

CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόµενη λύση

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

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

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

Λειτουργικά Συστήματα

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Μερικές χρήσιμες οδηγίες

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

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

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

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

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

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

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

#define, 70, 575 #elif, 580 #else, 580 #endif, 580 #error, 584 #if, 580 #ifdef, 583 #ifndef, 580, 583 #include, 70, 227, 574 #undef, 579

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

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

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

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

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

Διδάσκων: Δημήτριος Βαρσάμης

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

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

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

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

Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 131 Αρχές Προγραµµατισµού I 3-2

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

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

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

Transcript:

Προγραμματισμός Ι (ΗΥ120) Διάλεξη 19: Ο προεπεξεργαστής της 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);

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

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

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

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

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

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

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

20 #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 τότε γίνεται εισαγωγή και αυτών των αρχείων μέσα στο αρχείο. 21

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

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

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

/* myprog_min.c */ int min(int a, int b) { if (a < b) { return(a); } else { return(b); } } 25 /* myprog_max.c */ int max(int a, int b) { if (a < b) { return(b); } else { return(a); } } /* myprog_main.c */ #include "myprog_min.c" #include "myprog_max.c 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. 26

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

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

/* myprog_min.c */ #ifndef INCL_MYPROGMIN #define INCL_MYPROGMIN int min(int a, int b) { } #endif /* myprog_max.c */ #include "myprog_min.c" int max(int a, int b) { if (a == min(a,b)) { return(b); } else { return(a); } } /* myprog_main.c */ 29 #include "myprog_min.c" #include "myprog_max.c" 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) Μεταγλώττιση & σύνδεση: 30 gcc......... -l<όνομα βιβλιοθήκης> -L<τοποθεσία_βιβλιοθήκης> Από το όνομα βιβλιοθήκης αφαιρούμε το lib και το.a Π.χ. για να γίνει link η βιβλιοθήκη libmy_lib.a η οποία βρίσκεται στον ίδιο κατάλογο με το my_code.c: gcc my_code.c -o my_code -lmy_lib -L.