Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Φ1β-1 ΦΡΟΝΤΙΣΤΗΡΙΟ 1-β. Φ1β-2 ΕΝΤΟΛΗ ΑΝΑΘΕΣΗΣ Οι μεταβλητές λαμβάνουν τιμές με συκγεκριμένη εντολή ανάθεσης Η εντολή είναι της μορφής: Μεταβλητή = έκφραση.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: "Φ1β-1 ΦΡΟΝΤΙΣΤΗΡΙΟ 1-β. Φ1β-2 ΕΝΤΟΛΗ ΑΝΑΘΕΣΗΣ Οι μεταβλητές λαμβάνουν τιμές με συκγεκριμένη εντολή ανάθεσης Η εντολή είναι της μορφής: Μεταβλητή = έκφραση."— Μεταγράφημα παρουσίασης:

1 Φ1β-1 ΦΡΟΝΤΙΣΤΗΡΙΟ 1-β

2 Φ1β-2 ΕΝΤΟΛΗ ΑΝΑΘΕΣΗΣ Οι μεταβλητές λαμβάνουν τιμές με συκγεκριμένη εντολή ανάθεσης Η εντολή είναι της μορφής: Μεταβλητή = έκφραση Μεταβλητή = έκφραση όπου η έκφραση μπορεί να είναι μια σταθερή τιμή, ένας μαθηματικός τύπος, το αποτέλεσμα κλήσης μιάς συνάρτησης κλπ. όπου η έκφραση μπορεί να είναι μια σταθερή τιμή, ένας μαθηματικός τύπος, το αποτέλεσμα κλήσης μιάς συνάρτησης κλπ. Η έκφραση θα πρέπει να παράγει ένα αποτέλεσμα που να είναι συμβατό με τον τύπο της μεταβλητής

3 Φ1β-3 ΠΑΡΑΔΕΙΓΜΑ (1) #include #include float main() { float height, base, area; float height, base, area; height = 10.2; height = 10.2; base = 3.6; base = 3.6; printf(“The height of the triangle is: %f\n”, height); printf(“The height of the triangle is: %f\n”, height); printf(“The base of the triangle is: %f\n”, base); printf(“The base of the triangle is: %f\n”, base); area = (height * base)/2; area = (height * base)/2; printf(“The area of the triangle is %f\n”, area); printf(“The area of the triangle is %f\n”, area); return (area); return (area);}

4 Φ1β-4 ΠΑΡΑΔΕΙΓΜΑ (2) #include #include float main() { float height, base, area; float height, base, area; printf(“Enter the height of the triangle:”); printf(“Enter the height of the triangle:”); scanf(“%f”, &height); scanf(“%f”, &height); printf(“\n”); printf(“\n”); printf(“Enter the base of the triangle”); printf(“Enter the base of the triangle”); scanf(%f”, &base); scanf(%f”, &base); printf(“\n”); printf(“\n”); printf(“The height of the triangle is: %f\n”, height); printf(“The height of the triangle is: %f\n”, height); printf(“The base of the triangle is: %f\n”, base); printf(“The base of the triangle is: %f\n”, base); area = (height * base)/2; area = (height * base)/2; printf(“The area of the triangle is %f\n”, area); printf(“The area of the triangle is %f\n”, area); return (area); return (area);}

5 Φ1β-5 ΠΑΡΑΔΕΙΓΜΑ (3) #include #include #define FREEZING_POINT_IN_FARHENHEIT 32 #define SCALE_FACTOR (5.0 / 9.0) float main() { float farhenheit, celcius; float farhenheit, celcius; printf(“Enter the temperature in Farhenheit:”); printf(“Enter the temperature in Farhenheit:”); scanf(“%f”, &farhenheit); scanf(“%f”, &farhenheit); celcius = (farhenheit – FREEZING_POINT_IN_FARHENHEIT) * celcius = (farhenheit – FREEZING_POINT_IN_FARHENHEIT) * SCALE_FACTOR; SCALE_FACTOR; printf(“The celcius equivalent temperature of %f is %.1f \n”, farhenheit, celcius); printf(“The celcius equivalent temperature of %f is %.1f \n”, farhenheit, celcius); return (area); return (area);}

6 Φ1β-6 ΟΝΟΜΑΤΑ ΜΕΤΑΒΛΗΤΩΝ Τα ονόματα των μεταβλητών σ΄ένα πρόγραμμα C πρέπει να αρχίζουν με γράμμα καί μπορουν να περιέχουν αλφαριθμητικούς χαρακτήρες. Επίσης δεν μπορουν να περιέχουν ειδικούς χαρακτήρες όπως #, &, * κλπ. Υπάρχουν συγκεκριμένα ονόματα τα οποία αναφέρονται σε λέξεις κλειδιά της C Τα ονόματα των μεταβλητών είναι ευαισθητα στην δομή τους (Κεφαλαίοι, μικροί χαρακτήρες) π.χ. AVariable ≠ Avariable Τα ονόματα των μεταβλητών είναι ευαισθητα στην δομή τους (Κεφαλαίοι, μικροί χαρακτήρες) π.χ. AVariable ≠ Avariable

7 Φ1β-7 ΛΕΞΕΙΣ ΚΛΕΙΔΙΑ ΠΟΥ ΔΕΝ ΜΠΟΡΟΥΝ ΝΑ ΧΡΗΣΙΜΟΠΟΙΗΘΟΥΝ ΓΙΑ ΜΕΤΑΒΛΗΤΕΣ autodoubleintstruct breakelselongswitch caseenumregistertypedef charexternreturnunion constfloatshortunsigned continueforSignedvoid defaultgotosizeofvolatile doifstaticwhile

8 Φ1β-8 ΚΑΛΕΣ ΠΡΑΚΤΙΚΕΣ ΟΝΟΜΑΣΙΑΣ ΜΕΤΑΒΛΗΤΩΝ Χρήση μικρών χαρακτήρων (όχι κεφαλαίων) Μη χρήση μικρών και κεφαλαίων για δύο διαφορετικές μεταβλητές π.χ one καί ONE Χρήση μνημονικών ονομάτων π.χ. interestRate αντί ir Κατανοητή σύνταξη γιά πολύπλοκα ονόματα π.χ. interestRate, ή interest_Rate αντί interestrate

9 Φ1β-9 ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (1) Όπως είπαμε, η C είναι μία typed language όπου οι μεταβλητές ορίζονται να είναι συμβατές με κάποιο συγκεκριμένο τύπο. Υπάρχουν δύο μεγάλες κατηγορίες τύπων δεδομένων –Βασικοί τύποι που προσφέρει η γλώσσα –Τύποι που ορίζονται από τον χρήστη Στή C έχουμε τους παρακάτω βασικούς τύπους δεδομένων –Integer types (ακέραιοι αριθμοί) –Floating point types (πραγματικοί αριθμοί) –Character types (σύμβολα π.χ. Γράμματα και στοιχεία) Οι σύνθετοι (aggregate) τύποι που ορίζονται από τον χρήστη μπορούν να παραχθούν σαν διανύσματα (arrays) ή/και κατασκευές (structures) άλλων βασικών ή συνθέτων τύπων ανάλογα με το πρόβλημα και τη σχεδίαση του αλγόριθμου που χρησιμοποιείται για την επίλυση του προβλήματος.

10 Φ1β-10 ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (2) Οι παρακάτω λέξεις κλειδιά χρησιμοποιούνται για τον ορισμό ακεραίων μεταβλητών. Οι όροι μέσα σε στις παρενθέσεις είναι προαιρετικοί. Οι διαφορετικοί συνδυασμοί αφορούν στό «εύρος» των διαφορετικών τιμών που μιά μεταβλητή ενός συγκεκριμένου τύπου μπορεί να αποθηκεύσει: –char –signed char –unsigned char –[signed] short [int] –unsigned short [int] –[signed] [int] (ένα από τα δύο πρέπει να ορισθεί) –unsigned [int] –[signed] long [int] –unsigned long [int] Οι τύποι char, signed char, και unsigned char είναι μη αριθμητικοί τύποι και δεν μπορούν άμεσα να παρουσιασθούν σαν αριθμοί κατά την είσοδο/έξοδο δεδομένων του προγράμματος. Κωδικοποιούνται όμως εσωτερικά στον Η/Υ σαν ακέραιοι χρησιμοποιώντας το κώδικα ASCII. Οι τύποι short, int, και long θεωρούνται αυτόματα signed

11 Φ1β-11 ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (3) Το εύρος των τιμών που μπορεί να αποθηκεύσει μία μεταβλητή απο κάθε ένα από τους παραπάνω τύπους εξαρτάται απο τον συγκεκριμένο μεταφραστή και το συγκεκριμένο επεξεργαστή. Όμως σε κάθε περίπτωση θα πρέπει το μέγεθος που καταλαμβάνει η μεταβλητή στη μνήμη να είναι: –Μέγεθος του char ≤ Μέγεθος του short int ≤ Μέγεθος int ≤ Μέγεθος του long int

12 Φ1β-12 ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (4) Οι λέξεις κλειδιά που χρησιμοποιούνται για τον ορισμό μεταβλητών πραγματικων αριθμών είναι –float (πραγματικός αριθμός) –double (διπλής ακριβείας πραγματικός) –long double (διπλής ακρίβειας πραγματικός με ακρίβεια 15 δεκαδικών ψηφίων) Οι πραγματικοί αριθμοί στη C είναι απλά ένα υποσύνολο των πραγματικών αριθμών στα μαθηματικά μιάς και λόγω περιορισμών στη μνήμη του Η/Υ δεν μπορούμε να παρουσιάσουμε αριυμους πέρα από ένα όριο.

13 Φ1β-13 ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ (5) (Borland 5.02 C) ΤύποςSigned (με πρόσημο) Unsigned (χωρίς πρόσημο) char -128 έως έως 255 short int έως έως int έως έως long int έως έως float έως Ακρίβεια 7 δεκαδικών double έως Ακρίβεια 15 δεκαδικών long double έως Ακρίβεια 18 δεκαδικών

14 Φ1β-14 Δυαδικοί Αριθμοί Ένας δυαδικός αριθμός είναι μια ακολουθία από 0 και 1. Η μετατροπή ενός δυαδικού αριθμού b 3 b 2 b 1 b 0 b -1 b -2 b -3 είναι ( b 3 X 2 3 ) + (b 2 X 2 2 ) + (b 1 X 2 1 ) + (b 0 X 2 0 ) + (b -1 X 2 -1 ) + (b -2 X 2 -2 ) + (b -3 X 2 -3 ) ( b 3 X 2 3 ) + (b 2 X 2 2 ) + (b 1 X 2 1 ) + (b 0 X 2 0 ) + (b -1 X 2 -1 ) + (b -2 X 2 -2 ) + (b -3 X 2 -3 ) Οπότε ( ) 2 = (11.625) 10

15 Φ1β-15 Signed και Unsigned Στούς αριθμούς με πρόσημο (signed) όταν το πρώτο bit είναι 0 δηλώνει θετικό πρόσημο και όταν είναι 1 δηλώνει αρνητικό. Οι αρνητικές τιμές είναι γνωστές σαν συμπλήρωμα του 2 ή δυαδικό συμπλήρωμα. Για να παράγουμε το δυαδικό συμπλήρωμα ενός αριθμού λαμβάνουμε το 2 n – x όπου n είναι το πλήθος των bits και χ είναι ο αριθμός του οποίου προσπαθούμε να υπολογίσουμε το δυαδικό συμπλήρωμα. Το πλεονέκτημα του δυαδικού συμπληρώματος είναι ότι δυαδικοί αριθμοί μπορούν να προστεθούν ή να αφαιρεθούν σαν να ήταν χωρίς πρόσημο. Π.χ. Δυαδική Παρουσίαση Δεκαδική Παρουσίαση Δυαδική Παρουσίαση Δεκαδική Παρουσίαση ______ _____ ______ _____

16 Φ1β-16 Signed και Unsigned (Παράδειγμα σε Ακεραίους) Δυαδικό Δεκαδικό χωρίς πρόσημο (unsigned) Δεκαδικό με πρόσημο (signed)

17 Φ1β-17 ΑΡΙΘΜΗΤΙΚΗ ΜΕ signed/unsigned Στή C δέν γίνεται αυτόματα ο έλεγχος για να διαπιστωθεί ότι το αποτέλεσμα μιάς πράξης είναι στά σωστά όρια του τύπου της μεταβλητής. Ένα παράδειγμα έιναι ότι = δηλαδή ( ) + 1= !!! = δηλαδή ( ) + 1= !!!

18 Φ1β-18ΣΤΑΘΕΡΕΣ Οι μεταβλητές πού ορίζονται να έχουν σταθερές τιμές σ’ όλη τη διάρκεια του προγράμματος μπορεί να είναι ακέραιοι (int) ή πραγματικοί (float, double), ή χαρακτήρες (char). Μιά ακέραια σταθερή π.χ είναι int. Μία long παρίσταται με την καταλληξη l ή L π.χ L. Unsigned σταθερές δηλώνονται με την κατάλληξη U π.χ UL. Ακέραιες σταθερές μπορούν να παρουσιαστούν και στο οκταδικό σύστημα με το πρόθεμα 0 (μηδέν) π.χ. ο δεκαδικός 31 είναι 037 εάν ορισθεί σαν οκταδικός, και 0x1f εάν ορισθεί στο δεκαεξαδικό σύστημα. Π.χ. 011 είναι οκταδικός και είναι ο αριθμός 9 στό δεκαδικό. Πραγματικές σταθερές ορίζονται με την κατάλληξη f. Οι χαρακτήρες σταθερές ορίζονταο μέ quotes (‘ ‘) π.χ. ‘a’. Η τιμή της σταθερής είναι η τιμή του χαρακτήρα στο σύστημα μετατροπής που χρησιμοποιεί ο συγκεκριμένος Η/Υ. Π.χ. Ο χαρακτήρας ‘0’ έχει τιμη στον κώδικα ASCII 48. Περισσότερα για σταθερές αργότερα στο μάθημα.

19 Φ1β-19 ΠΑΡΑΔΕΙΓΜΑΤΑ int anIntegerVariable; float aFloatVariable; char aCharVariable; double aDoubleVariable; #define MAXLINE 100 #define ASTRING “I am a string” unsigned short aVar; signed int aSignedInt; Για αρχή ας εστιάσουμε στους ακεραίους καί στούς πραγματικούς (με ή χωρίς πρόσημο) Για αρχή ας εστιάσουμε στους ακεραίους καί στούς πραγματικούς (με ή χωρίς πρόσημο)

20 Φ1β-20 ΠΑΡΑΔΕΙΓΜΑ #include #include #define fahr1 0 #define fahr2 20 #define fahr3 40 #define fahr4 60 /* Τύπωσε τους βαθμους σε κλίμακα Κελσίου καί Φαρεναΐτ. /* void main() { int celcius1, celcius2, celcius3, celcius4; int celcius1, celcius2, celcius3, celcius4; celcius1 = 5 * (fahr1 – 32) / 9; celcius1 = 5 * (fahr1 – 32) / 9; celcius2 = 5 * (fahr2 – 32) / 9; celcius2 = 5 * (fahr2 – 32) / 9; celcius3 = 5 * (fahr3 – 32) / 9; celcius3 = 5 * (fahr3 – 32) / 9; celcius4 = 5 * (fahr4 – 32) / 9; celcius4 = 5 * (fahr4 – 32) / 9; printf(“%d\t%d\n”, fahr, celcius) /* Τύπωσε ακέραιο, tab, ακέραιο */ printf(“%d\t%d\n”, fahr, celcius) /* Τύπωσε ακέραιο, tab, ακέραιο */ } Το αποτέλεσμα θα είναι

21 Φ1β-21 ΕΝΤΟΛΕΣ ΕΙΣΟΔΟΥ/ΕΞΟΔΟΥ Ας δούμε δύο βασικές εντολές εισόδου / εξόδου καί συγκεκριμένα τις: –printf, και την scanf

22 Φ1β-22 ΕΝΤΟΛΗ ΕΚΤΥΠΩΣΗΣ ΣΤΗΝ ΟΘΟΝΗ (standard output) Η σύνταξη της εντολής printf έιναι printf(“δήλωση φόρμας”, έκφραση1, έκφραση2...) printf(“δήλωση φόρμας”, έκφραση1, έκφραση2...) όπου: όπου: Η δήλωση φόρμας ορίζει το πως θα φορμάρεται ή Η δήλωση φόρμας ορίζει το πως θα φορμάρεται ή εκτύπωση, και το τι θα τυπώνεται στο standard output. εκτύπωση, και το τι θα τυπώνεται στο standard output. H δήλωση φόρμας ορίζει επίσης το πώς οι τιμές των H δήλωση φόρμας ορίζει επίσης το πώς οι τιμές των μεταβλητών που είναι να τυπωθούν, μετατρέπονται μεταβλητών που είναι να τυπωθούν, μετατρέπονται από τη εσωτερική δυαδική μορφή του Η/Υ στην από τη εσωτερική δυαδική μορφή του Η/Υ στην επιθυμητή μορφή της εκτύπωσης. επιθυμητή μορφή της εκτύπωσης.

23 Φ1β-23 ΠΑΡΑΔΕΙΓΜΑ void main() { int i, j; int i, j; float x, y; float x, y; i = 10; i = 10; j = 20; j = 20; x = ; x = ; y = ; y = ; printf( “ i = %d, j = %d, x = %f, y = %f\n”, i, j, x, y); printf( “ i = %d, j = %d, x = %f, y = %f\n”, i, j, x, y); } Δήλωση φόρμας Εκτύπωση σε ακεραίου Εκτύπωση σε πραγματικό Οι μεταβλητές για εκτύπωση Αποτέλεσμα εκτύπωσης : i = 10, j = 20, x = , y =

24 Φ1β-24 ΤΥΠΟΙ ΜΕΤΑΤΡΟΠΗΣ Στη δήλωση φόρμας οι πιο κοινές παρακάτω μετατροπές ορίζονται: –%d : Εκτύπωση ακεραίου –%e : Εκτύπωση πραγματικού σε εκθετική μορφή –%f : Εκτύπωση πραγματικού σε δεκαδική μορφή με δεκαδικά ψηφία –%g : Εκτύπωση πραγματικού σε εκθετική ή σε δεκαδική μορφή ανάλογα με το μεγεθός του Συμπληρωματικά με τα παραπάνω, η γενική μορφή είναι : –%m.pX όπου m δηλώνει τον ελάχιστο αριθμό «χαρακτήρων» πρός εκτύπωση, p δηλώνει τον αριθμό δεκαδικών ψηφίων για εκτύπωση, και Χ είναι ένα από %d, %f, %g. m δηλώνει τον ελάχιστο αριθμό «χαρακτήρων» πρός εκτύπωση, p δηλώνει τον αριθμό δεκαδικών ψηφίων για εκτύπωση, και Χ είναι ένα από %d, %f, %g. – –a alert bell – ηχητικό σήμα – –\n new line – νέα γραμμή – –\b backspace – κενό πρίν – –\t horizontal tab – οριζόντιο κενό συγκεκριμένου μήκους Δοκιμάστε το παρακάτω πρόγραμμα

25 Φ1β-25 ΠΑΡΑΔΕΙΓΜΑ int main() { int i = 40; int i = 40; float x = ; float x = ; printf(“|%d|%5d|%-5d|%5.3d|\n”, i, i, i, i); printf(“|%d|%5d|%-5d|%5.3d|\n”, i, i, i, i); printf(“|%10.3f|%10.3e|%10g|\n”, x, x, x, x); printf(“|%10.3f|%10.3e|%10g|\n”, x, x, x, x); return (1); return (1); }

26 Φ1β-26 ΕΝΤΟΛΗ ΕΙΣΟΔΟΥ ΑΠΟ ΤΟ ΠΛΗΚΤΡΟΛΟΓΙΟ (standard input) Η σύνταξη της εντολής scanf έιναι scanf(“δήλωση φόρμας”, έκφραση1, έκφραση2...) scanf(“δήλωση φόρμας”, έκφραση1, έκφραση2...) όπου: όπου: Η δήλωση φόρμας ορίζει το πως θα φορμάρεται ή Η δήλωση φόρμας ορίζει το πως θα φορμάρεται ή εκτύπωση, και το τι θα διαβάζεται απο το standard εκτύπωση, και το τι θα διαβάζεται απο το standard input. input. H δήλωση φόρμας ορίζει επίσης το πώς οι τιμές των H δήλωση φόρμας ορίζει επίσης το πώς οι τιμές των μεταβλητών θα διαβαστούν. μεταβλητών θα διαβαστούν.

27 Φ1β-27 ΠΑΡΑΔΕΙΓΜΑ void main() { int i, j; int i, j; float x, y; float x, y; scanf(%d%d%f%f”, &i, &j, &x, &y); scanf(%d%d%f%f”, &i, &j, &x, &y); } Εάν ο χρήστης εισάγει 1, -20,.3, -4.0ε3 τότε η παραπάνω εντολή εισόδου θα διαβάσει και θα αναθέσει στη μεταβλητή i τον αριθμό 1, στη j το -20, στη x το 0.3, και στη y το Διαφορά από το printf

28 Φ1β-28 ΕΚΦΡΑΣΕΙΣ (expressions) Οι εκφράσεις στη C είναι συντακτικές μορφές που παράγονται από το τον συνδυασμό μεταβλητών, σταθερών, και τελεστών (operators). Προς το παρόν θα ασχοληθούμε με ακέραιες και πραγματικές μεταβλητές. Μεταβλητές ακέραιου, και πραγματικού τύπου μπορούν να συνδυαστούν με αριθμητικούς τελεστές. Το σημαντικό στοιχείο είναι ο τύπος του αποτελέσματος που προκύπτει.

29 Φ1β-29 ΑΡΙΘΜΗΤΙΚΟΙ ΤΕΛΕΣΤΕΣ (+) Πρόσθεση (δυαδικός τελεστής – binary operator), και έκφραση θετικού προσήμου (μοναδιαίος τελεστής – unary operator) (+) Πρόσθεση (δυαδικός τελεστής – binary operator), και έκφραση θετικού προσήμου (μοναδιαίος τελεστής – unary operator) (-) Αφαίρεση (δυαδικός τελεστής – binary operator), και έκφραση αρνητικού προσήμου (μοναδιαίος τελεστής – unary operator) (-) Αφαίρεση (δυαδικός τελεστής – binary operator), και έκφραση αρνητικού προσήμου (μοναδιαίος τελεστής – unary operator) (*) Πολλαπλασιασμός (δυαδικός τελεστής – binary operator) (*) Πολλαπλασιασμός (δυαδικός τελεστής – binary operator) (/) Διαίρεση (δυαδικός τελεστής – binary operator) (/) Διαίρεση (δυαδικός τελεστής – binary operator) (%) Υπόλοιπο διαίρεσης (γιά ακέραιους τύπους μόνο - (δυαδικός τελεστής – binary operator) (%) Υπόλοιπο διαίρεσης (γιά ακέραιους τύπους μόνο - (δυαδικός τελεστής – binary operator) Άλλοι τελεστές που θα δούμε αργότερα είναι οι λογικοί τελεστές, σχεσιακοί τελεστές, καί τελεστές δυαδικών ψηφίων (bitwise operators)

30 Φ1β-30 ΠΑΡΑΔΕΙΓΜΑTA 25aVariable+x-anotherVariablea*b a/b (Παράγει ακέραιο αποτέλεσμα όταν οι τυποι των a, b, είναι ακέραιοι. είναι ακέραιοι.count/n a+ (b+c)/32) + 12 (b-4ac)/2d a%b (η γνωστή μας σχέση a modulo b)

31 Φ1β-31 ΥΠΟΛΟΓΙΣΜΟΣ ΤΩΝ ΕΚΦΡΑΣΕΩΝ Ο υπολογισμός του αποτελέσματος μιάς έκφρασης εξαρτάται απο την προτεραιότητα και την συσχέτιση των τελεστών. Η προτεραιότητα καθορίζει τη σειρά εφαρμογής (order of application) των τελεστών. Για παράδειγμα, η έκφραση 2*2+4 υπολογίζεται με την τιμή 8 μιάς και ο τελεστής του Πολ/σμού έχει μεγαλύτερη προτεραιότητα από τον τελεστή της Πρόσθεσης. Χρησιμοποιώντας παρενθέσεις μπορούμε να αλλάξουμε τη δομή μιάς έκφρασης και ουσιαστικά να μεταβάλλουμε τον τρόπο υπολογισμού της. Για παράδειγμα η έκφραση 2*(2+4) υπολογίζεται με την τιμή 12. Η συσχέτιση καθορίζει τη σειρά εφαρμογής τελεστών με την ίδια προτεραιότητα. Για παράδειγμα θεωρώντας οτι οι τελεστές / και * έχουν την ίδια προτεραιότητα η συσχέτιση τους ορίζει ότι η έκφραση 6/2*3 υπολογίζεται με την τιμή 9, αντί τη τιμή 1.

32 Φ1β-32 ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΚΑΙ ΣΥΣΧΕΤΙΣΗ ΤΕΛΕΣΤΩΝ ΠΡΟΤΕΡΑΙΟΤΗΤΑΤΕΛΕΣΤΗΣΣΥΣΧΕΤΙΣΗ ΥΨΗΛΗ Μοναδιαίος +, - Από δεξιά προς τα αριστερά *, /, % Από αριστερά προς τα δεξιά ΧΑΜΗΛΗ Δυαδικός +, - Από αριστερά προς τα δεξιά

33 Φ1β-33ΠΑΡΑΔΕΙΓΜΑΤΑ 1/5 υπολογίζεται με την τιμή 0 10/3 υπολογίζεται με την τιμή 3 10%3 υπολογίζεται με την τιμή 1 10%2 υπολογίζεται με την τιμή υπολογίζεται με την τιμη 12 10*2-2 υπολογίζεται με την τιμή 18 10/0 δεν ορίζεται (διαίρεση με 0) 10%0δεν ορίζεται (υπόλοιπο διαίρεσης με 0) 7/2+3υπολογίζεται με την τιμή υπολογίζεται με την τιμη -8 10/ /3 = (10/2) + ((-10)/3) υπολογίζεται με την τιμη 2

34 Φ1β-34 ΜΕΤΑΤΡΟΠΗ ΤΥΠΩΝ (1) Όταν οι μεταβλητές/σταθερές είναι του ιδίου τύπου το αποτέλεσμα είναι γενικά του αυτού τύπου. Όταν όμως οι μεταβλητές/σταθερές σε μία έκφραση δέν είναι του ιδίου τύπου τότε λέμε οτι έχουμε μία μικτή έκφραση. Στη C υπάρχουν μερικοί απλοί κανόνες αυτόματης μετατροπής τύπων στις μικτές εκφράσεις. Γενικά ο κανόνας είναι να μετατρέπεται ο τύπος με το μικρότερο μέγεθος στον τύπο με το μεγαλύτερο μέγεθος έτσι ώστε δεν χάνεται πληροφορία. Για παράδειγμα εαν f έιναι float και ο i είναι integer τότε στην έκφραση f+i o I μετατρέπεται σε float. Η έκφραση υπολογίζεται στον τύπο με το μεγαλύτερο μέγεθος Το αποτέλεσμ είναι τύπου όμοιου με τον «μεγαλύτερο» τύπο στην έκφαρση. Εκφράσεις που αναθέτουν ένα τύπο μεγαλύτερου μεγεθους σε ένα μικρότερο (π.χ. i = f) συνήθως δημιουργούν μια παρατήρηση (warning) από τον μεταφραστή (compiler) και γενικά πρέπει να αποφεύγονται.

35 Φ1β-35 ΠΙΝΑΚΑΣ ΜΕΤΑΤΡΟΠΗΣ ΤΥΠΩΝ Operand types intlongfloatdouble long double intintlongfloatdouble longlonglongfloatdouble floatfloatfloatfloatdouble doubledoubledoubledoubledouble Ο παρακάτω πίνακας δείχνει τον τύπο του αποτελέσματος σαν συνάρτηση των τύπων στην έκφραση. Μέγεθος

36 Φ1β-36 ΑΛΓΟΡΙΘΜΟΣ ΜΕΤΑΤΡΟΠΗΣ ΤΥΠΩΝ Έστω μια έκφραση x op y, για κάποιο τελεστή op. Βήμα 1. Κάθε char ή short μετατρέπεται σε int. Κάθε unsigned cha ή unsigned short μετατρέπεται σε unsigned (int). Βήμα 2. Αν μετά το πρώτο βήμα η έκφραση είναι μικτού τύπου η έκφραση έχει σαν αποτέλεσμα ένα τύπο ανάλογα με τον «μεγαλύτερο τύπο» που υπάρχει στην έκφραση και σύμφωνα με τον παρακάτω κανόνα μεγέθους τύπων int < unsigned < long < unsigned long < float < double

37 Φ1β-37 ΠΑΡΑΔΕΙΓΜΑΤΑ Έστω οι ακόλουθες δηλώσεις: char c; double d; float f; int i; long l; short s; unsigned u; Έκφραση Τελικός Τύπος c – s / i int u * 3 – i unsigned u * 3.0 – i double f * 3 – i float c + 1 int c float 3 * s + l long

38 Φ1β-38 ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ και ΛΟΓΙΚΕΣ ΕΚΦΡΑΣΕΙΣ Οι λογικές εκφράσεις παράγουν ένα από τα δύο αποτελέσματα: True, False Έχουμε τρεις βασικούς λογικούς τελεστές –Σύζευξη (and) ορίζεται με τον τελεστή && στη C –Διάζευξη (or) ορίζεται με τον τελεστή || στη C –Άρνηση (not) ορίζεται με τον τελεστή ! στη C Οι λογικοί τελεστές χρησιμοποιούνται για να παράγουν λογικές εκφράσεις Παράδειγμα int a, b; a = 1; b = 0; (a && b) (a || b) ((!a || b) && c) Στη C η λογική τιμή true ορίζεται με την ακέραια τιμή 1 και η λογική τιμή false με την ακέραια τιμή 0

39 Φ1β-39 ΕΡΜΗΝΕΙΑ ΛΟΓΙΚΩΝ ΤΕΛΕΣΤΩΝ ΈκφρασηabΑποτέλεσμα a && b TrueTrueTrue TrueFalseFalse FalseTrueFalse FalseFalseFalse a || b TrueTrueTrue TrueFalseTrue FalseTrueTrue FalseFalseFalse ! a TrueFalse FalseTrue

40 Φ1β-40 ΣΧΕΣΙΑΚΟΙ ΤΕΛΕΣΤΕΣ (relational operators) Οι βασικοί σχεσιακοί τελεστές είναι ΤελεστήςΕρμηνεία <Μικρότερο <= Μικρότερο ή ίσο >Μεγαλύτερο >= Μεγαλύτερο ή ίσο == Ίσο (έλεγχος) != Όχι ίσο (έλεγχος)

41 Φ1β-41 ΠΑΡΑΔΕΙΓΜA int main() { int a = 4; int a = 4; int b = 3; int b = 3; int c = 2; int c = 2; int x = (a < b); int x = (a < b); int y = (a == c); int y = (a == c); int z = ( x && y ) int z = ( x && y ) return (z); return (z); } Ποια είναι η τιμή της μεταβλητής z;

42 Φ1β-42 ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΚΑΙ ΣΥΣΧΕΤΙΣΗ Όπως έχουμε δει ο υπολογισμός του αποτελέσματος μιας έκφρασης εξαρτάται από την προτεραιότητα και την συσχέτιση των τελεστών. ΠροτεραιότηταΤελεστήςΣυσχέτιση Υψηλή ! -- (μοναδιαίος) Δεξιά προς αριστερά * / % Αριστερά προς δεξιά + - (δυαδικός) ΄΄ ΄΄ >= >= ΄΄ ΄΄ == != ΄΄ ΄΄ && || Χαμηλή = /= *= %= += -= Δεξιά προς αριστερά Πως υπολογίζεται η έκφραση (1) α/ β*γ; και (2) η α == β+γ Απ. (1) Από αριστερά προς τα δεξιά  (α / β) *γ και (2) με διαφορά προτεραιότητας  (α == (β+γ))

43 Φ1β-43 ΕΛΕΓΧΟΣ ΡΟΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ Μέχρι τώρα έχουμε μιλήσει για στοιχεία της C που αφορούν τον ορισμό μεταβλητών, την είσοδο και εκτύπωση δεδομένων από το πληκτρολόγιο και την οθόνη αντίστοιχα, εκφράσεις και διάφορους τελεστές Ουσιαστικά στην απλούστερη μορφή ένα πρόγραμμα είναι μια ακολουθία από εντολές που εκτελούνται με τη σειρά (από την πρώτη εντολή προς την τελευταία) Όμως για να είμαστε σε θέση να υλοποιήσουμε πιο σύνθετους αλγόριθμους θα πρέπει να έχουμε την δυνατότητα του ελέγχου της ροής του προγράμματος Αυτό επιτυγχάνεται με εντολές ελέγχου ροής –Διακλάδωση με συνθήκη –Εντολές βρόγχου –Συναρτήσεις

44 Φ1β-44 Εντολές Διακλάδωσης με Συνθήκη Η εντολή if χρησιμοποιείται για να ορίσει την υπό συνθήκη εκτέλεση μίας ή περισσοτέρων εντολών. Υπάρχουν δύο βασικοί τύποι της εντολής if Εντολές Συνθήκη FalseTrue Εντολές Συνθήκη FalseTrue Εντολές 1.2. If-then If-then-else

45 Φ1β-45 Η ΠΡΩΤΗ ΜΟΡΦΗ Σύνταξη: if ( ) if ( ) { εντολή 1 εντολή εντολή κ εντολή κ } Παράδειγμα if (a <= b) { a = a+1; b = b/3; } Εναλλακτικά if (a <= b) { a += 1; b /= 3; }

46 Φ1β-46 Η ΔΕΥΤΕΡΗ ΜΟΡΦΗ Σύνταξη: if ( ) if ( ) { εντολή 1 ; εντολή 2 ; εντολή κ ; εντολή κ ; } else else { εντολή κ+1 ; εντολή κ+1 ; εντολή κ+2 ; εντολή κ+2 ; εντολή ν ; εντολή ν ; } Παράδειγμα if (a <= b) { a=3; b=4; { a = a+1; b = b/3; } else { a = a+5; b = b%3; } printf(“a is: %d\n”, a); Κάθε εντολή μπορεί να είναι σύνθετη (μπλοκ) { s1; s2; …. }

47 Φ1β-47 ΑΛΓΟΡΙΘΜΟΙ ΚΑΙ ΥΛΟΠΟΙΗΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ Έχουμε μιλήσει για τις δύο βασικές μεθόδους ανάλυσης ενός προβλήματος. Όμως πώς αυτές συσχετίζονται με την σχεδίαση προγραμμάτων; Η αναλυτική μέθοδος (top down) σχετίζεται με την μέθοδο σχεδίασης «διαίρει και βασίλευε» (divide and conquer), όπου για να σχεδιάσουμε ένα πρόγραμμα το διαιρούμε σε απλούστερα προγράμματα Η συνθετική μέθοδος (bottom up) σχετίζεται με την μέθοδο σχεδίασης «σταδιακή εξέλιξη» (successive refinement), όπου αρχίζουμε με ένα απλό πρόγραμμα και σταδιακά του προσθέτουμε περισσότερες λεπτομέρειες μέχρι που όλες οι περιπτώσεις που πρέπει να λυθούν έχουν λυθεί

48 Φ1β-48 ΨΕΥΔΟ-ΚΩΔΙΚΑΣ (pseudocode) Όταν είμαστε έτοιμοι να παρουσιάσουμε ένα αλγόριθμο (πρόγραμμα) μπορούμε να χρησιμοποιήσουμε ψευδοκώδικα αντί μια γλώσσα προγραμματισμού Αυτό μας δίνει το πλεονέκτημα ότι η σχεδίαση του αλγόριθμου δεν επηρεάζεται από την γλώσσα που θα χρησιμοποιηθεί οπότε διαχωρίζονται οι φάσεις σχεδίασης προγράμματος (design) από την υλοποίηση του προγράμματος (implementation) Ο ψευδοκώδικας είναι ένα μαθηματικό μοντέλο του αλγόριθμου, εκφραζόμενο σε μια μορφή που θυμίζει (αλλά δεν είναι) γλώσσα προγραμματισμού Η ιδέα είναι ότι από τον ψευδοκώδικα είναι απλή η διαδικασία της υλοποίησης (αναλογία μεταξύ Αρχιτέκτονα που σχεδιάζει και Εργολάβου που ακολουθεί πιστά το σχέδιο για την ανέγερση μιας οικοδομής)

49 Φ1β-49 ΠΑΡΑΔΕΙΓΜΑ ΨΕΥΔΟΚΩΔΙΚΑ Μία πιθανή μορφή ψευδοκώδικα είναι: let name1, name2 (ορισμός μεταβλητών) let name1, name2 (ορισμός μεταβλητών) get name1, name2 (διάβασε τις μεταβλητές name1, name2 get name1, name2 (διάβασε τις μεταβλητές name1, name2 από κάποια μονάδα εισόδου) από κάποια μονάδα εισόδου) record name1, name2 (αποθήκευσε τις τρέχουσες τιμές των μεταβλητών name1, name2 σε κάποια εξωτερική μονάδα – π.χ. Δίσκο) record name1, name2 (αποθήκευσε τις τρέχουσες τιμές των μεταβλητών name1, name2 σε κάποια εξωτερική μονάδα – π.χ. Δίσκο) name1  έκφραση (αποθήκευσε την τιμή της έκφρασης name1  έκφραση (αποθήκευσε την τιμή της έκφρασης στη μεταβλητή name1 στη μεταβλητή name1 if expression then if expression then A else else B endif endif

50 Φ1β-50 ΠΑΡΑΔΕΙΓΜΑ Πρόβλημα Να σχεδιάσετε και να υλοποιήσετε ένα πρόγραμμα το οποίο να διαβάζει τις παραμέτρους ενός πολυωνύμου δευτέρου βαθμού αx 2 + βx + γ = Π(x) και να υπολογίζει τις ρίζες τις εξίσωσης να υπολογίζει τις ρίζες τις εξίσωσης Π(x) = 0. Π(x) = 0. Ο αλγόριθμος είναι x = (- β ± sqrt(β 2 – 4*α*γ))/ (2*α) x = (- β ± sqrt(β 2 – 4*α*γ))/ (2*α)

51 Φ1β-51 ΠΑΡΑΔΕΙΓΜΑ Μία απλή μορφή του ψευδοκώδικα είναι (περίπτωση με πραγματικές ρίζες) get a, b, c; get a, b, c; root1  (-b + sqrt(b2 -4ac)/(2a); root1  (-b + sqrt(b2 -4ac)/(2a); root2  (-b - sqrt(b2 -4ac)/(2a); root2  (-b - sqrt(b2 -4ac)/(2a); record root1, root2; record root1, root2; Όμως τι γίνεται για τις άλλες περιπτώσεις όπου α = 0, ή α = 0 και β = 0, ή η διακρίνουσα είναι αρνητική;

52 Φ1β-52 ΣΤΑΔΙΑΚΗ ΕΞΕΛΙΞΗ ΤΟΥ ΨΕΥΔΟΚΩΔΙΚΑ Ο ψευδοκώδικας γίνεται get a, b, c; get a, b, c; if a = 0 then if a = 0 then if b = 0 then if b = 0 then case  1; case  1; record case; record case; else else case  2; case  2; root1  - c/b root1  - c/b record case, root1; record case, root1; endif endif else else if b 2 >= 4ac then if b 2 >= 4ac then case  3; case  3; root1  (-b + sqrt(b 2 – 4ac) / (2a); root1  (-b + sqrt(b 2 – 4ac) / (2a); root2  (-b - sqrt(b 2 – 4ac) / (2a); root2  (-b - sqrt(b 2 – 4ac) / (2a); record case, root1, root2; record case, root1, root2; else else case  4; case  4; root1  (-b/ (2a)) + j (sqrt(abs(b 2 – 4ac)) / (2a)); root1  (-b/ (2a)) + j (sqrt(abs(b 2 – 4ac)) / (2a)); root1  (-b/ (2a)) - j (sqrt(abs(b 2 – 4ac)) / (2a)); root1  (-b/ (2a)) - j (sqrt(abs(b 2 – 4ac)) / (2a)); record case, root1, root2; record case, root1, root2; endif endif Η υλοποίηση του προγράμματος είναι τώρα απλή υπόθεση.

53 Φ1β-53 ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ (ΒΡΟΓΧΟΥ) Οι εντολές βρόγχου (iterative statements) στη C επιτρέπουν την επαναληπτική εκτέλεση μιάς σειράς εντολών όσο κάποιες λογικές συνθήκες ισχύουν. Στη C έχουμε τις παρακάτω εντολές βρόγχου, που αντιστοιχούν και σε διαφορετικές περιπτώσεις επανάληψης: –Εντολή while –Εντολή do-while –Εντολή for Η σειρά των εντολών που επαναλαμβάνεται ονομάζεται το «σώμα» (body) της εντολής βρόγχου. Η λογική συνθήκη ονομάζεται «συνθήκη» (condition). Το σημείο που η επανάληψη σταματά ονομάζεται «σταθερό σημείο» (fixed point)

54 Φ1β-54 ΚΑΤΑΣΚΕΥΕΣ ΕΠΑΝΑΛΗΨΗΣ Πρίν προχωρήσουμε όμως στη μελέτη της σύνταξης αυτών των εντολών ας μελετήσουμε πρωτα την κατασκευή τους και γιατι όχι τον αντίστοιχο ψευδοκώδικα τους και την γραφική ερμηνεία τους Κατασκευή (structure) δίνει τη γενική ιδέα και την ερμηνεία μέσω ενός μοντέλου (π.χ. Διαγράμματος ροής). Η κατασκευή είναι σχετικά ανεξαρτητη της γλώσσας προγραμματισμού. Η εντολή (statement ή command) έχει να κάνει με την συγκεκριμένη γλώσσα προγραμματισμου (π.χ. Σύνταξη της C) και υλοποιεί μία κατασκευή. Στη C έχουμε τρείς κατασκευέ βρογχου ή επανάληψης (iterative structures). Δύο απο αυτές υλοποιούνται άμεσα με εντολές της C

55 Φ1β-55 ΚΑΤΑΣΚΕΥΕΣ ΕΠΑΝΑΛΗΨΗΣ 1 Όσο ισχύει η (λογική έκφραση Α) επανελαβε σειρά εντολών Β σειρά εντολών Β Τελος επανάληψης Συνθήκη Β Α True False while A do B endwhile

56 Φ1β-56 ΚΑΤΑΣΚΕΥΕΣ ΕΠΑΝΑΛΗΨΗΣ 2 επανελαβε σειρά εντολών Β όσο ισχύει η (λογική έκφραση Α) όσο ισχύει η (λογική έκφραση Α) Τελος επανάληψης Συνθήκη Β Α True False do B while A Η διαφορά απο την προηγούμενη κατασκευή είναι οτι η σειρά εντολών Β θα εκτελεστεί τουλαχιστον μία φορά πρίν τη λογίκή συνθήκη Α

57 Φ1β-57 ΕΝΤΟΛΗ while Η εντολή while έχει τη μορφή while ( ) while ( ) σειρά εντολών Β σειρά εντολών Β Παράδειγμα: int i = 0 int i = 0 while (i <= 10) while (i <= 10) { printf(“The number is: %d\n”, i); printf(“The number is: %d\n”, i); i++; i++; } Σημαίνει i = i+1

58 Φ1β-58 ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που υπολογίζει το άθροισμα των αριθμών από 1 μέχρι 10. #include #include int main() { int i = 1; int i = 1; int sum = 0; int sum = 0; while (i <= 10) while (i <= 10) { sum = sum + i; sum = sum + i; i = i+1; i = i+1; } printf(“The sum of numbers from 1 to 10 is: %d\n”, sum); printf(“The sum of numbers from 1 to 10 is: %d\n”, sum); return (sum); return (sum); }

59 Φ1β-59 ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που υπολογίζει το άθροισμα των κύβων των αριθμών #include #include float main() { float sum = 0.0; float sum = 0.0; float increment = 0.4; float increment = 0.4; float x = 0.4; float x = 0.4; while (x <= 2.5) while (x <= 2.5) { sum = sum + x*x*x; sum = sum + x*x*x; x = x+ increment; x = x+ increment; } printf(“The sum of the cubes is: %f\n”, sum); printf(“The sum of the cubes is: %f\n”, sum); return (sum); return (sum);} Λίγο μεγαλύτερη τιμή από 2.4 για να προλάβουμε προβλήματα με rounding error π.χ. Στη τελευταία επανάληψη η μεταβλητή χ να είναι λίγο μεγαλύτερη του 2.4 μιας και οι float μπορεί να έχουν περισσότερα από ένα δεκαδικό

60 Φ1β-60ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που διαβάζει από μία πηγή εισόδου (input stream) χαρακτήρες (characters), και τους τυπώνει σε πηγή εξόδου (output stream). #include #include float main() { int c; int c; int nl = 0; int nl = 0; ………… ………… π.χ. εντολές γιά άνοιγμα αρχείου για διάβασμα π.χ. εντολές γιά άνοιγμα αρχείου για διάβασμα c = getchar(); c = getchar(); while (c != EOF) while (c != EOF) { putchar(c); putchar(c); if(c == ‘\n’) if(c == ‘\n’) nl++; nl++; c= getchar(); c= getchar(); }}

61 Φ1β-61 ΕΝΤΟΛΗ do while Η εντολή while έχει τη μορφή do σειρά εντολών Β do σειρά εντολών Β while ( ) while ( ) Χρησιμοποιείται όταν θέλουμε η σειρά εντολών Β να εκτελεστεί τουλάχιστον μία φορά πριν τον έλεγχο τερματισμού. Παράδειγμα: #include #include int i = 0 int i = 0 do do { printf(“The number is: %d\n”, i); printf(“The number is: %d\n”, i); i = i + 1; i = i + 1; } while (i <= 10) while (i <= 10)

62 Φ1β-62ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που διαβάζει αριθμούς από τον χρήστη και υπολογίζει το άθροισμα τους. Το πρόγραμμα θα σταματήσει όταν ο χρήστης δώσει ένα αριθμό μικρότερο ή ίσο του μηδενός. Εάν το άθροισμα είναι αρνητικό τότε επιστρέφουμε μηδέν. #include #include float main() { signed float number; signed float number; signed float sum = 0; signed float sum = 0; do do { printf(“Enter a number: “); printf(“Enter a number: “); scanf(“%f”, &number); scanf(“%f”, &number); sum = sum + number; sum = sum + number; printf(“\n”); /* Πήγαινε στην επόμενη γραμμή στην οθόνη */ printf(“\n”); /* Πήγαινε στην επόμενη γραμμή στην οθόνη */ } while (!(number == 0 || number < 0)) while (!(number == 0 || number < 0)) if( sum <= 0) /* Στη περίπτωση που ο χρήστης εισάγει 0 ή αρνητικό σαν πρώτο αριθμό */ if( sum <= 0) /* Στη περίπτωση που ο χρήστης εισάγει 0 ή αρνητικό σαν πρώτο αριθμό */ sum = 0; /* θέσε τη μεταβλητή sum ίση πάλι με το μηδέν */ sum = 0; /* θέσε τη μεταβλητή sum ίση πάλι με το μηδέν */ printf(“The sum of numbers is: %f\n”, sum); printf(“The sum of numbers is: %f\n”, sum); return (sum); return (sum); }

63 Φ1β-63 ΕΝΤΟΛΗ for Η εντολή for έχει τη μορφή for ( ; ; ) for ( ; ; ) σειρά εντολών Β σειρά εντολών Β Παράδειγμα: Παράδειγμα: #include int main () { int i, sum=0; for (i = 1; i <= 10; i++) { sum = sum + 1; printf(The sum now is: %d\n”, sum); } printf(“The final sum is:%d\n”, sum); return (sum); }

64 Φ1β-64ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που υπολογίζει το άθροισμα ∑ χ 3 #include #include int main() { int number; int number; int sum = 0; int sum = 0; for (number = 10; number <= 100; number++) for (number = 10; number <= 100; number++) { sum = sum + number * number * number; sum = sum + number * number * number; printf(“The number is %d and the sum is now: %d\n”, number, sum); printf(“The number is %d and the sum is now: %d\n”, number, sum); } printf(“The final sum is %d\n”, sum); printf(“The final sum is %d\n”, sum); return (sum); return (sum);} Χ=10 100

65 Φ1β-65ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που υπολογίζει το άθροισμα ∑ χ 3 ∑ χ 3 #include #include int main() { int sum; int sum; int number; int number; for (sum = 0, number = 10; number <= 100; number++) for (sum = 0, number = 10; number <= 100; number++) { sum = sum + number * number * number; sum = sum + number * number * number; printf(“The number is %d and the sum is now: %d\n”, number, sum); printf(“The number is %d and the sum is now: %d\n”, number, sum); } printf(“The final sum is %d\n”, sum); printf(“The final sum is %d\n”, sum); return (sum); return (sum);} Χ= Ο Τελεστής,

66 Φ1β-66ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που να υπολογίζει τα τετράγωνα αριθμών απο το 1 μεχρι n #include #include int main() { int i, n; int i, n; printf(“Enter the max number to compute the square: “); printf(“Enter the max number to compute the square: “); scanf(“%d”, &n); scanf(“%d”, &n); for (i = 1; i <= n; i++) for (i = 1; i <= n; i++) { printf(“%10d%10d\n”, i, i*i); printf(“%10d%10d\n”, i, i*i); } return (1); return (1);} ……….

67 Φ1β-67 ΙΣΟΔΥΝΑΜΙΕΣ ΕΝΤΟΛΩΝ while, for while ( ) { εντολές 4 εντολές 4 } i = 1; while (i <= 10) { statements; statements; i++; i++; } for ( ; ; ; <έκφραση αναπροσδιορισμού <έκφραση αναπροσδιορισμού τιμών 3>) τιμών 3>) { εντολές 4 εντολές 4 } for (i = 1; i <= 10; i++) { statements statements }

68 Φ1β-68 ΟΡΙΣΜΟΙ ΜΕΤΑΒΛΗΤΩΝ ΒΡΟΓΧΟΥ - 1 Ας θεωρήσουμε το πρόγραμμα for (int i = 1; i <= 100; i++) for (int i = 1; i <= 100; i++) printf(“The number is %d\n”, i); printf(“The number is %d\n”, i); Η μεταβλητή i δεν υπάρχει και δεν είναι διαθέσιμη μετά την εκτέλεση της εντολής for Αντίθετα στο πρόγραμμα int i; int i; for(i = 1; i<=100; i++) for(i = 1; i<=100; i++) printf(“The number is %d\n”, i); printf(“The number is %d\n”, i); Η μεταβλητή i είναι διαθέσιμη μετά την εκτέλεση της εντολής for. Μερικοί μεταφραστές όμως δεν θεωρούν τη μεταβλητή i διαθέσιμη !!!

69 Φ1β-69 ΟΡΙΣΜΟΙ ΜΕΤΑΒΛΗΤΩΝ ΒΡΟΓΧΟΥ - 2 Ας θεωρήσουμε το πρόγραμμα void main() { do do { float i = 10.0 float i = 10.0 statements; statements; ………….. ………….. i++; i++; } while i <= while i <= 100.0} Η μεταβλητή i δεν μπορεί να ορισθεί μέσα σ’ένα εσωτερικό block εντολής. Το πρόγραμμα αυτό είναι λάθος.

70 Φ1β-70 ΟΡΙΣΜΟΙ ΜΕΤΑΒΛΗΤΩΝ ΒΡΟΓΧΟΥ - 3 Αντίθετα sτο πρόγραμμα void main() { void main() { float i = 10.0 float i = 10.0 do do { statements; statements; ………….. ………….. i++; i++; } while i <= while i <= Η μεταβλητή i έχει ορισθεί στο block του main. Θα μπορούσε να είχε ορισθεί και μετά τις εντολές του προεπεξεργαστή. Θα μιλήσουμε για το εύρος και ορίζοντα των δηλώσεςν των μεταβλητών αργότερα.

71 Φ1β-71 ΚΑΤΑΣΚΕΥΗ ΕΠΑΝΑΛΗΨΗΣ 3 Σε μερικές περιπτώσεις μας ενδιαφέρει να έχουμε την λογική έκφραση τερματισμού του βρογχου ούτε στην αρχή, ούτε στο τέλος, αλλά κάπου στη μέση της σειράς εντολών που εκτελούνται επαναληπτικά Δυστυχώς δεν υπάρχει άμεση εντολή στη C που να υλοποιεί αυτή τη περίπτωση (π.χ. Η κατασκευη 1 υλοποιείται με την εντολή while και for ενώ η κατασκευή 2 με την εντολή do-while) Γραφικά η κατασκευή 3 είναι:

72 Φ1β-72 ΚΑΤΑΣΚΕΥΕΣ ΕΠΑΝΑΛΗΨΗΣ 3 – ΓΡΑΦΙΚΗ ΠΑΡΑΣΤΑΣΗ Η διαφορά από την προηγούμενες κατασκευές είναι ότι η σειρά εντολών Β1 θα εκτελεστεί τουλάχιστον μία φορά πριν τη λογική συνθήκη Α η οποία εάν είναι αληθής τότε η επανάληψη σταματά, αλλιώς η σειρά εντολών Β2 θα εκτελεστεί, και ο βρόγχος θα επαναληφθεί. Συνθήκη Β2 Α True False Β1

73 Φ1β-73 ΥΛΟΠΟΙΗΣΗ ΤΗΣ ΚΑΤΑΣΚΕΥΗΣ 3 #define TRUE 1 #define FALSE 0 void main() { int flag; int flag; flag = TRUE; flag = TRUE; while (flag) while (flag) { εντολές Β1; εντολές Β1; if (λογική συνθήκη Α) if (λογική συνθήκη Α) { flag = FALSE; flag = FALSE; } else else { εντολές Β2; εντολές Β2; } }} Η υλοποίηση αυτή απαιτεί μια παραπάνω μεταβλητή (flag) αλλά είναι εύκολα κατανοητή και επεκτάσιμη

74 Φ1β-74 ΥΛΟΠΟΙΗΣΗ ΤΗΣ ΚΑΤΑΣΚΕΥΗΣ 3 #define TRUE 1 void main() { while (TRUE) /* Συνεχής επανάληψη */ while (TRUE) /* Συνεχής επανάληψη */ { εντολές Β1; εντολές Β1; if (λογική συνθήκη Α) if (λογική συνθήκη Α) break; break; εντολές Β2; εντολές Β2; }} Μόνο η πρώτη εντολή break εκτελείται στο if διότι δεν υπάρχουν¨{ }. Η εντολή break σταματά το βρόγχο και μεταφέρει τον έλεγχο στην πρώτη εντολή μετά το βρογχο. Αυτό το loop δεν θα σταμάταγε ποτέ

75 Φ1β-75 ΛΙΓΑ ΛΟΓΙΑ ΓΙΑ ΤΗΝ ΚΑΤΑΣΚΕΥΗ 3 Φαίνεται και είναι λίγο παράξενη. Όμως την συναντάμε συχνά ιδιαίτερα όταν διαβάζουμε από ένα αρχείο ή ΄το πρόγραμμα λαμβάνει στοιχεία από τον χρήστη. Η πρώτη υλοποίηση χρειάζεται μία επιπλέον μεταβλητή αλλά είναι εύκολα κατανοητή. Η δεύτερη υλοποίηση χρησιμοποιεί την εντολή break που χρησιμοποιείται γιά να τερματίσει οποιοδήποτε βρόγχο. Όμως η εντολή break μπορεί να δημιουργήσει σύγχυση ιδιαίτερα όταν υπάρχουν βρόγχοι μέσα σε άλλους βρόγχους. Παρακάτω παρουσιάζονται τέσσερα σενάρια χρήσης της κατασκευής 3 (βιβιλογραφία: B. Preiss, J, Fields)

76 Φ1β-76 ΣΕΝΑΡΙΟ 1 void main() { int done = 0; int done = 0; while (! done) while (! done) { { διαβάζουμε στοιχεία; διαβάζουμε στοιχεία; } if (συνθήκη τερματισμού εισόδου στοιχείων) if (συνθήκη τερματισμού εισόδου στοιχείων) done = 1; done = 1; else else { διαδικασίες χρήσης των στοιχείων διαδικασίες χρήσης των στοιχείων } }} Η υλοποίηση αυτή απαιτεί μια παραπάνω μεταβλητή (done) αλλά είναι εύκολα κατανοητή και επεκτάσιμη

77 Φ1β-77 ΣΕΝΑΡΙΟ 2 #define TRUE 1 void main() { while (TRUE) while (TRUE) { διαβάζουμε στοιχεία; διαβάζουμε στοιχεία; if (συνθήκη τερματισμού εισόδου στοιχείων) if (συνθήκη τερματισμού εισόδου στοιχείων) break; break; διαδικασίες χρήσης των στοιχείων διαδικασίες χρήσης των στοιχείων }} Η break δημιουργεί τα γνωστά προβλήματα κατανόησης. Μπορεί όμως σ’αυτή τη περίπτωση να αντικατασταθεί με την εντολή return, και όλη η υλοποίηση να γίνει μια function που κάπως θα επιστρέφει τα επιθυμητά αποτελέσματα

78 Φ1β-78 ΣΕΝΑΡΙΟ 3 void main() { int done = 0; int done = 0; do do { διαβάζουμε στοιχεία; διαβάζουμε στοιχεία; if (συνθήκη τερματισμού εισόδου στοιχείων) if (συνθήκη τερματισμού εισόδου στοιχείων) done = 1; done = 1; else else { διαδικασίες χρήσης των στοιχείων διαδικασίες χρήσης των στοιχείων } } while (!done) while (!done) Η υλοποίηση αυτή είναι παρόμοια με αυτή του Σεναρίου 1, αλλά χρησιμοποιεί την εντολή do-while

79 Φ1β-79 ΣΕΝΑΡΙΟ 4 void main() { while (διαβάζουμε στοιχεία() && ! συνθήκη τερματισμού εισόδου στοιχείων) while (διαβάζουμε στοιχεία() && ! συνθήκη τερματισμού εισόδου στοιχείων) { διαδικασίες χρήσης των στοιχείων διαδικασίες χρήσης των στοιχείων }} Στην υλοποίηση αυτή θεωρούμε ότι το διάβασμα των στοιχείων γίνεται από μία συνάρτηση (function) η οποία επιστρέφει κάποια αριθμητική τιμή (ώστε να μπορεί να χρησιμοποιηθεί σε μιά λογική έκφραση, ΚΑΙ έχει σαν παράπλευρο αποτέλεσμα την απόθεση των στοιχείων σε κάποιες μεταβλητές που είναι ορατές από το πρόγραμμα. Γενικά όχι καλός τρόπος.

80 Φ1β-80 ΣΥΝΘΕΤΕΣ ΕΝΤΟΛΕΣ ΒΡΟΓΧΟΥ Σε μερικές περιπτώσεις χρειαζόμαστε να έχουμε βρόγχους (loops) μέσα σε άλλους βρόγχους (nested loops) Γενικά σ’αυτή τη περίπτωση το ζητούμενο έιναι να προσέχουμε ποιές διαδικασίες χρειάζονται σε ποιό βρόγχο οπότε να μην έχουμε παράπλευρα φαινόμενα, ή παραπάνω απ΄ότι χρειάζεται πολυπλοκότητα

81 Φ1β-81 ΠΑΡΑΔΕΙΓΜΑ Ας υλοποιήσουμε ένα πρόγραμμα το οποίο θα υπολογίζει το αθροισμα ∑ ∑ κ*χ υπολογίζει το αθροισμα ∑ ∑ κ*χ #include #include int main() { int k, x, sum = 0; int k, x, sum = 0; for(k=1; k<= 5; k++) for(k=1; k<= 5; k++) for(x=2; x<=10; x++ for(x=2; x<=10; x++ sum = sum + k*x; sum = sum + k*x; return (sum) return (sum)} k=1 5 x=2 10 (1*2 + 1*3 + … 1*10) + (2*2 + 2*3 + ….2*10) + ……………………….. (5*2 + 5*3 + …5*10)

82 Φ1β-82 ΕΙΣΑΓΩΓΗ ΣΤΑ ΑΡΧΕΙΑ (FILES) Στη C ο όρος stream ορίζει μία πηγή στοιχείων εισόδου, ή ένα προορισμό για στοιχεία εξόδου Δύο βασικά και οριζόμενα αυτόματα απο τη C streams είναι το πληκρολόγιo (keyboard) για είσοδο (input), και η οθόνη (screen or terminal), για έξοδο (output) Τα μεγάλα προγράμματα μπορούν να έχουν πολλές πηγές εισόδου π.χ. Modems, CD drives, files, κλπ. Τα προγράμματα συνήθως διαβάζουν στοιχεία απο μια πηγή και στέλνουν αποτελέσματα σε ένα προορισμό (που μπορεί να είναι πηγή στοιχείων για κάποιο άλλο πρόγραμμα)

83 Φ1β-83 ΔΕΙΚΤΕΣ ΑΡΧΕΙΩΝ (FILE POINTERS) Ένα C πρόγραμμα μπορεί να χρησιμοποιήσει ένα αρχείο σαν πηγή στοιχείων εισόδου, ή προορισμό στοιχείων εξόδου με το ορισμό δεικτών αρχείου Ο ορισμός ενός δείκτη αρχείου γίνεται με την εντολή FILE * Ουσιαστικά ένας δείκτης αρχείου ορίζει οτι μια μεταβλητή (π.χ. ifp) είναι τύπου (type) FILE, και το πρόγραμμα έτσι καταλαβαίνει πως να χρησιμοποιήσει τη μεταβλητή ifp. Για παράδειγμα έαν θέλουμε να έχουμε δύο αρχέια για χρήση (είσοδο, ή έξοδο) στο πρόγραμμά μας τα οποία χρησιμοποιούνται και ορίζονται με τις μεταβλητές π.χ. fp1, fp2 με τότε η εντολή ορισμoύ τους είναι: FILE *fp1, *fp2; FILE *fp1, *fp2;

84 Φ1β-84 ΒΑΣΙΚΕΣ ΠΗΓΕΣ ΔΕΙΚΤΗΣ ΑΡΧΕΙΟΥ ΠΗΓΗΕΡΜΗΝΕΙΑ stdin Βασική πηγή εισόδου Πληκτρολόγιο stdout Βασική πηγή εξόδου Οθόνη stderr Βασική πηγή διαγνωστικών μηνυμάτων Οθόνη Οι εντολές printf, scanf που έχουμε εξετάσει μέχρι τώρα λαμβάνουν στοιχεία stdin και αποστέλουν στοιχεία στο stdout. Μπορύμε να αλλάξουμε από την πηγή stdin και αποστέλουν στοιχεία στο stdout. Μπορύμε να αλλάξουμε την ερμηνεία των stdin, και stdout να είναι ένα αρχείο αντί του πληκτρολογίου ή της οθόνης αντίστοιχα. Αυτό γίνεται με τη χρήση του λειτουργικού συστήματος και των τελεστών > ή ή < π.χ. demo < in.dat Πρόγραμμα Αρχείο με στοιχεία εισόδου

85 Φ1β-85 ΨΗΦΙΑΚΑ ΑΡΧΕΙΑ ΚΑΙ ΑΡΧΕΙΑ ΚΕΙΜΕΝΟΥ Η βιβλιοθήκη stdio.h υποστηρίζει δύο ειδών αρχεία – ψηφιακά, και κειμένου (χαρακτήρων). Ο πηγαίος κώδικας που γράφουμε για παράδειγμα αποθηκεύεται σ’ένα αρχείο, ενώ το συμβολομεταφρασμένο πρόγραμμα σ’ένα ψηφικό αρχείο (θα το δείτε αυτο εάν προσπαθήσετε να ανοίξετε μ’ένα επεξεργαστή κειμένου ή editor ένα exe αρχείο. Στη συγκεκριμένο παράδειγμα ο μεταφραστής είναι ένα πρόγραμμα (ίσως και αυτό γραμμένο στη C !!) το οποίο έχει ώς πηγή εισόδου ένα αρχείο κειμένου (πηγαίο κώδικα), και σαν προόρισμό ένα αρχείο κειμένου (assembly code). O συμβολομεταφραστής είναι και αυτός ένα πρόγραμμα (ίσως και αυτό γραμμένο στη C !!) το οποίο έχει ώς πηγή εισόδου ένα αρχείο κειμένου (assembly code) και σαν προόρισμό ένα ψηφιακό αρχείο (binary code).

86 Φ1β-86 ΨΗΦΙΑΚΑ ΑΡΧΕΙΑ ΚΑΙ ΑΡΧΕΙΑ ΧΑΡΑΚΤΗΡΩΝ - ΠΑΡΑΔΕΙΓΜΑ Για παράδειγμα άς δούμε πως ο αριθμός θα μπορούσε να παρασταθεί σ΄ένα αρχέιο κειμένου, και σ΄ένα ψηφιακό αρχείο. Σ΄ένα αρχείο κειμένου θα φαινεται σαν η «λεξη» κειμένου που διαβάζεται απο τόν χρήστη. Εσωτερικά όμως στη μνήμη του Η/Υ θα παριστάνεται σαν η ακολουθία (έαν υποθέσουμε ότι χρησιμοποίούμε κώδικα ASCII (συνολο 5 bytes, 8 bits = 1 byte) Ο ίδιος αριθμός θα μπορούσε να παρασταθεί σ΄ένα ψηφιακό αρχέιο σαν δύο bytes

87 Φ1β-87 ΨΗΦΙΑΚΑ ΑΡΧΕΙΑ ΚΑΙ ΑΡΧΕΙΑ KEIMENOY - 2 Γιατί όμως χρειαζόμαστε δύο τύπων αρχεία? Μερικοί από τους λόγους είναι – Μέγεθος –Ο τρόπος που το κάθε λειτουργικό σύστημα καταλαβαίνει τη δομή του αρχείου (EOL, EOF) –Η δυνατότητα χρήσης ειδικών χαρακτήρων Τα αρχεία κειμένου συνήθως αποτελούνται από σειρές γραμμών, και κάθε γραμμή σταματά με ένα ειδικό χαρακτήρα (end of line). Επείσης υπάρχει ένας ειδικός χαρακτήρας για να δηλώνει το τέλος του αρχείου (end of file). Τα ψηφιακά αρχεία συνήθως δεν είναι χωρισμένα σε γραμμές, και επειδή ένα ψηφιακό αρχείο μπορεί να περιέχει οποιοδήποτε στοιχείο δεν μπορούμε συνήθως να διακρίνουμε το τέλος μιάς «γραμμής»

88 Φ1β-88 ΨΗΦΙΑΚΑ ΑΡΧΕΙΑ ΚΑΙ ΑΡΧΕΙΑ KEIMENOY (DOS) End of line: Ο τρόπος που ορίζεται το τέλος μιάς γραμμής σ΄ένα αρχείο κειμένου είναι ουσιαστικά δύο χαρακτήρες – τέλος γραμμής (carriage return) και νέα γραμμή (line feed). Ο τρόπος για ένα ψηφιακό αρχείο είναι ένας χαρακτήρας - νέα γραμμή (line feed). End of file: Ο χαρακτήρας Control-Z \x1a σ΄ένα αρχείο κειμένου ορίζει το τέλος του αρχείου. Σ’ένα ψηφιακό αρχείο ο χαρακτήρας Control-Z δέν έχει σημασία. Στο UNIX τα ψηφιακά αρχεία και τα αρχεία κειμένου έχουν την ίδι δομή σεχετικα με το End of line, End of file.

89 Φ1β-89 ΛΕΙΤΟΥΡΓΙΕΣ ΑΡΧΕΙΩΝ Ανοιγμα αρχείου: Για να «ανοίξουμε ένα αρχείο» σαν πηγή εισόδου ή εξόδου, χρησιμοποίούμε την εντολή fopen. H γενική σύνταξη είναι fopen(, ) fopen(, )Παράδειγμα fopen(“c:\\project\\test.dat”, “r”) fopen(“c:\\project\\test.dat”, “r”)

90 Φ1β-90 fopen Η εντολή (ουσιαστικά συνάρτηση) fopen, επιστρέφει ένα δείκτη αρχείου. Επιστρέγει NULL εάν το αρχείο δεν μπορεί να ανοίξει. Οπότε η ολοκληρωμένη εικόνα είναι: FILE *fp; FILE *fp; ……….. ……….. fp = fopen(“c:\\project\\test.dat”, “r”) fp = fopen(“c:\\project\\test.dat”, “r”) Δήλωση δέικτη Χρήση για είσοδο (read) Για να μην θεωρήσει ο μεταφραστής ότι είναι ειδικοί χαρακτήρες

91 Φ1β-91 ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που να ανοίγει ένα αρχείο #include #include FILE *fp; int main() { fp = fopen(“test.dat”, “r”) fp = fopen(“test.dat”, “r”) ……………. ……………. }

92 Φ1β-92 fclose Η εντολή κλείνει ένα αρχείο στο τέλος του προγράμματος ή όταν αυτό δεν χρειάζεται πιά είναι η fclose. H σύνταξη της εντολής fclose είναι fclose ( ) fclose ( )Παράδειγμα FILE *fp; FILE *fp; ……….. ……….. fp = fopen(“c:\\project\\test.dat”, “r”) fp = fopen(“c:\\project\\test.dat”, “r”) fclose(fp) fclose(fp)

93 Φ1β-93 ΠΑΡΑΔΕΙΓΜΑ Ένα μικρό πρόγραμμα που να ανοίγει ένα αρχείο να ελέγχει εάν μπορεί να ανοίξει και να το κλείνει. #include #include #define FILE_NAME “test.dat” int main() { FILE *fp; FILE *fp; fp = fopen(“test.dat”, “r”); fp = fopen(“test.dat”, “r”); if (fp == NULL) if (fp == NULL) { printf(“Can not open file %s\n”, FILE_NAME); printf(“Can not open file %s\n”, FILE_NAME); exit(EXIT_FAILURE); exit(EXIT_FAILURE); } ……………….. ……………….. fclose(fp); fclose(fp);}

94 Φ1β-94 ΚΩΔΙΚΟΙ ΧΡΗΣΗΣ Είδαμε ότι για να ανοίξουμε ένα αρχέιο χρησιμοποιούμε την εντολη fopen με σύνταξη fopen(, fopen(, ) ) Οι κωδικοι χρήσης είναι: ΚΩΔΙΚΟΣΕΡΜΗΝΕΙΑ “r” Άνοιγμα για να διαβάσει το πρόγραμμα στοιχεία “w” Άνοιγμα για να «γραψει» το πρόγραμμα αποτελέσματα “a” Άνοιγμα για να «γράψει» στο τέλος υπάρχοντος αρχείου “r+” Άνοιγμα για είσοδο-έξοδο, απο την αρχή του αρχείου “w+” Άνοιγμα για είσοδο-έξοδο, με κάλυψη “a+” Άνοιγμα για είσοδο-έξοδο, απο το τέλος εάν το αρχείο υπάρχει.

95 Φ1β-95 ΕΙΣΟΔΟΣ/ΕΞΟΔΟΣ ΣΤOΙΧΕΙΩΝ ΑΠΟ ΑΡΧΕΙΟ Η είσοδος/έξοδος στοιχείων απο αρχείο είναι πανεύκολη ! Χρησιμοποιεί τις εντολές fprintf, fscanf που έχουν λιγο πολύ πανομοιότυπη σύνταξη με τις printf και, scanf !! Η σύνταξη είναι: fprintf(,, έκφραση1, έκφραση2...) fprintf(,, έκφραση1, έκφραση2...) fscanf (,, έκφραση1, έκφραση2...) fscanf (,, έκφραση1, έκφραση2...)

96 Φ1β-96ΠΑΡΑΔΕΙΓΜΑ #include #include Int main(){ FILE *ifp; FILE *ifp; FILE *ofp; FILE *ofp; int c; int c; ifp = fopen(“test.dat”, “r”); ifp = fopen(“test.dat”, “r”); ofp = fopen(out.dat”, “w”); ofp = fopen(out.dat”, “w”); if(ifp == NULL) { if(ifp == NULL) { printf(“Can not open input file\n”); printf(“Can not open input file\n”); return(0); return(0); } if(ofp == NULL) { if(ofp == NULL) { printf(“Can not open output file\n); printf(“Can not open output file\n); return (1); return (1); } c = getc(ifp); c = getc(ifp); while(c != EOF) { while(c != EOF) { putc(c, ofp); putc(c, ofp); c = getc(ifp); c = getc(ifp); } fclose(ifp); fclose(ofp); fclose(ifp); fclose(ofp); return(2) return(2)} Το πρόγραμμα διαβάζει χαρακτήρες από το αρχείο ifp (“test.dat”) και τους αντιγράφει στο αρχείο ofp (“out.dat”)

97 Φ1β-97ΠΑΡΑΔΕΙΓΜΑ #include #include int main(){ FILE *ifp; FILE *ifp; FILE *ofp; FILE *ofp; int c; int c; ifp = fopen(“test.dat”, “r”); ifp = fopen(“test.dat”, “r”); ofp = fopen(out.dat”, “w”); ofp = fopen(out.dat”, “w”); if(ifp == NULL) { if(ifp == NULL) { printf(“Can not open input file\n”); printf(“Can not open input file\n”); return(0); return(0); } if(ofp == NULL) { if(ofp == NULL) { printf(“Can not open output file\n); printf(“Can not open output file\n); return (1); return (1); } fscanf(ifp, “%d\n”, &c); fscanf(ifp, “%d\n”, &c); while(c != EOF) { while(c != EOF) { fprintf(ofp, “%d\n”, c); fprintf(ofp, “%d\n”, c); fscanf(ifp, “%d\n”, &c); fscanf(ifp, “%d\n”, &c); } fclose(ifp); fclose(ofp); fclose(ifp); fclose(ofp); return(2) return(2)} Το πρόγραμμα διαβάζει ακεραίους από το αρχείο ifp (“test.dat”) και τους αντιγράφει στο αρχείο ofp (“out.dat”)


Κατέβασμα ppt "Φ1β-1 ΦΡΟΝΤΙΣΤΗΡΙΟ 1-β. Φ1β-2 ΕΝΤΟΛΗ ΑΝΑΘΕΣΗΣ Οι μεταβλητές λαμβάνουν τιμές με συκγεκριμένη εντολή ανάθεσης Η εντολή είναι της μορφής: Μεταβλητή = έκφραση."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google