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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8. Συνθήκες ελέγχου, λογικοί τελεστές

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

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

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

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

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

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

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Ευάγγελος Γ. Ούτσιος Θεόδωρος Γ. Λάντζος Διάλεξη Νο8

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

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

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

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

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

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

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

Transcript:

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