Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής Εφαρμογών (npet@chania.teicrete.gr) Τέταρτη (4 η ) τρίωρη διάλεξη. Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/courses/el106 Εξάμηνο: Χειμερινό 2017-18
Μορφοποίηση εισόδου /εξόδου Συναρτήσεις: printf() - Προβάλλει πληροφορίες στην οθόνη. scanf() - Εισάγει δεδομένα από το πληκτρολόγιο και εκχωρεί αυτά τα δεδομένα σε μία ή περισσότερες μεταβλητές. Τόσο για την εμφάνιση όσο και για την εισαγωγή δεδομένων χρησιμοποιούνται κωδικοί διαμόρφωσης. Οι συχνότερα χρησιμοποιούμενοι είναι οι παρακάτω: %d στο δεκαδικό (decimal) %o στο οκταδικό (octal) για ακέραιους %x στο δεκαεξαδικό (hexadecimal) %f για πραγματικούς %c για χαρακτήρες %s για συμβολοσειρές (strings) 2
Εντολή εμφάνισης στην οθόνη Η σύνταξη της εντολής printf είναι: printf("δήλωση φόρμας", έκφραση1, έκφραση2,...); όπου: η δήλωση φόρμας ορίζει το πως θα μορφοποιηθεί η εκτύπωση, και το τι θα τυπώνεται στην πρότυπη έξοδο (standard output). H δήλωση φόρμας ορίζει, επίσης, με την συνδρομή των κωδικών διαμόρφωσης, πως θα μετατραπούν οι τιμές από τη εσωτερική δυαδική μορφή του Η/Υ στην επιθυμητή μορφή της εκτύπωσης. 3
main() { int i, j; float x, y; i = 10; j = 20; x = 43.2892; y = 5527.0; Παράδειγμα Δήλωση φόρμας Εμφάνιση ως ακεραίου στο δεκαδικό σύστημα αρίθμησης Εμφάνιση ως πραγματικός printf("i = %d, j = %d, x = %f, y = %f\n",i,j,x,y); Οι μεταβλητές για εμφάνιση Αποτέλεσμα εκτύπωσης : i = 10, j = 20, x = 43.289200, y = 5527.000000 4
Κι άλλοι κωδικοί διαμόρφωσης {για την printf() %e Εμφάνιση πραγματικού σε εκθετική μορφή (ή επιστημονική) %f Εμφάνιση πραγματικού σε δεκαδική μορφή με 6 δεκαδικά ψηφία δεξιά της υποδιαστολής %g Εμφάνιση πραγματικού σε εκθετική ή σε δεκαδική μορφή ανάλογα με το μέγεθός του Συμπληρωματικά με τα παραπάνω, η γενική μορφή είναι : %π.δκ όπου π δηλώνει τον ελάχιστο αριθμό «χαρακτήρων» προς εμφάνιση (μαζί με την υποδιαστολή), δ δηλώνει τον αριθμό δεκαδικών ψηφίων δεξιά της υποδιαστολής, και Κ είναι ένα από e, f ή g. %md Εμφάνιση ακεραίου σε τουλάχιστον m θέσεις ψηφίων %% Εμφάνιση του ίδιου του % 5
main() { int i = 40; float x = 839.21; Παράδειγμα printf("12345678901234567890123456789012345678%%9\n"); printf(" %d %5d %-5d %5.3d \n", i, i, i, i); printf("\n"); printf(" %10.3f %10.3e %10g \n", x, x, x, x); return; 12345678901234567890123456789012345678%9 40 40 40 040 839.210 8.392e+002 839.21 -------------------------------- Press any key to continue... Εμφάνιση % 6
Εντολή εισαγωγής δεδομένων από το πληκτρολόγιο Η σύνταξη της εντολής scanf είναι: scanf("δήλωση φόρμας", έκφραση1, έκφραση2,...); όπου: η δήλωση φόρμας ορίζει - με την βοήθεια των κωδικών διαμόρφωσης - το πως θα ερμηνεύονται τα δεδομένα που εισάγονται από το πληκτρολόγιο, το οποίο αποτελεί την πρότυπη είσοδο (standard input). Στην συνέχεια οι εκφράσεις πρέπει να δείχνουν τις θέσεις της μνήμης RAM που θα αποθηκευθούν τα δεδομένα (δηλαδή τις διευθύνσεις των θέσεων). 7
Παράδειγμα #include <stdio.h> main() { int i, j; float x, y; scanf("%d%d%f%f", &i, &j, &x, &y); printf("%d %d %f %g", i, j, x, y); Τελεστής διεύθυνσης (διαφορά από την printf) Εάν ο χρήστης εισάγει 1, -20,.3, -4.0e3 τότε η παραπάνω εντολή εισόδου θα διαβάσει και θα αναθέσει στη μεταβλητή i τον αριθμό 1, στη j το -20, στη x το 0.3, και στη y το -4000.0 8
Οδηγία για την εισαγωγή δεδομένων Συνιστάται, για λόγους ευκολίας στην ανεύρεση σφαλμάτων, να χρησιμοποιείται ένα ζευγάρι printf() scanf() για κάθε δεδομένο που πρέπει να εισάγει ο χρήστης καθοδηγώντας τον κατάλληλα, πχ: #include <stdio.h> main() { int ak; double x; char ch; printf("δώστε έναν ακέραιο : "); scanf("%d", &ak); printf("δώστε έναν πραγματικό : "); scanf("%f", &x); printf("δώστε ένα χαρακτήρα : "); scanf("%c", &ch);... 9
Η συνάρτηση main() Η συνάρτηση main() είναι μία ειδική συνάρτηση που πρέπει να έχει ορισθεί σε κάθε αυτόνομο πρόγραμμα γραμμένο σε C. Η main() είναι η πρώτη συνάρτηση που καλείται σε ένα πρόγραμμα σε C. Η κλήση γίνεται αυτόματα από το λειτουργικό σύστημα όταν το πρόγραμμα αρχίζει να εκτελείται («να τρέχει»). Η συνάρτηση main() μπορεί να επιστρέφει, ή να μην επιστρέφει κάποιο αποτέλεσμα. 10
Σχόλια (comments) Ένα καλό πρόγραμμα δεν αρκεί να είναι μόνο συντακτικά σωστό, γρήγορο, και συμβατό με τις απαιτήσεις του χρήστη, αλλά και σωστά τεκμηριωμένο με σχόλια. Τα σχόλια στη C ορίζονται ανάμεσα στα σύμβολα /* και */ π.χ. /* This is a comment in C */ Τα σχόλια δεν μεταφράζονται από τον compiler ο οποίος τα θεωρεί σαν κενούς χαρακτήρες Δεν επιτρέπονται τα ένθετα σχόλια εκτός αν έχει γίνει η κατάλληλη ρύθμιση. Σχόλια γραμμής: στη C++ ή στη Java αρχίζουν με // και τελειώνουν με το πέρας της γραμμής. Κάποιοι μεταγλωττιστές της C το επιτρέπουν, αλλά αν σας ενδιαφέρει η φορητότητα να χρησιμοποιείτε μόνο /* και */ Προσθέστε σχόλια μόνο σε προτάσεις ή συναρτήσεις οι οποίες δεν έχουν προφανή σημασία. Βασική αρχή είναι να έχουμε ένα ευπαρουσίαστο και εύκολο να διαβαστεί πρόγραμμα (διευκολύνει τη συντήρησή του) π.χ. /*************************************************** * Name: maintry.c * * Author: Giannis Papadakis * * Purpose: Translate Celsius degrees to Fahrenheit * * Date/Version: 15/08/2017 v2.3 * ***************************************************/ 11
Αν το αποτέλεσμα ενός προγράμματος είναι το παρακάτω, ποιο είναι το πρόγραμμα; Enter a number between 1 and 100 : 35 Enter another number between 1 and 100 : 23 35 times 23 = 805 Press any key to continue!! 12
Θα μπορούσε να είναι το ακόλουθο: #include <stdio.h> #include <stdlib.h> main() { int a, b, g; /* Εισαγωγή του πρώτου αριθμού */ printf("enter a number between 1 and 100 : "); scanf("%d", &a); /* Εισαγωγή του δεύτερου αριθμού */ printf("enter another number between 1 and 100 : "); scanf("%d", &b); /* Υπολογισμός και εμφάνιση του γινομένου */ g = a * b; printf("%d times %d = %d \n", a,b, g); system("pause"); return 0; 13
Παράδειγμα: εμβαδόν τριγώνου (1) #include <stdio.h> main() { float height, base, area; height = 10.2; /* χωρίς εισαγωγή δεδομένων */ base = 3.6; /* από το πληκτρολόγιο */ printf("the height of the triangle is: %f\n", height); printf("the base of the triangle is: %f\n", base); area = (height * base)/2; printf("the area of the triangle is %f\n", area); return 0; 14
Παράδειγμα: εμβαδόν τριγώνου (2) #include <stdio.h> main() { float height, base, area; /* με εισαγωγή δεδομένων */ printf("enter the height of the triangle : "); scanf("%f", &height); printf("\n"); printf("enter the base of the triangle : "); scanf("%f", &base); printf("\n"); printf("the height of the triangle is: %f\n", height); printf("the base of the triangle is: %f\n", base); area = (height * base)/2; printf("the area of the triangle is %f\n", area); return 0; 15
Παράδειγμα: εμβαδόν κύκλου /* Υπολογισμός εμβαδού κύκλου δίνοντας την ακτίνα */ #include <stdio.h> #define PI 3.14159265359 main() { int r; /* ακτίνα */ double emv; /* εμβαδόν */ printf("δώσε ακτίνα : "); scanf ("%d", &r); emv = PI*r*r; printf("κύκλος με ακτίνα %d έχει εμβαδό %f\n", r, emv); system("pause"); return 0; 16
Παράδειγμα: Αντιστοιχία θερμοκρασιών (όχι καλό) #include <stdio.h> /* Τύπωσε τους βαθμούς σε κλίμακα Κελσίου και Φαρενάιτ. */ /* γνωρίζοντας τον τύπο: celcius = (5/9) (fahr 32) */ #define FAHR1 0 #define FAHR2 20 #define FAHR3 40 #define FAHR4 60 main() { int celcius1, celcius2, celcius3, celcius4; celcius1 = 5 * (FAHR1-32) / 9; printf("%d\t%d\n", FAHR1, celcius1); /* Τύπωσε ακέραιο, tab, ακέραιο */ celcius2 = 5 * (FAHR2-32) / 9; printf("%d\t%d\n", FAHR2, celcius2); /* Τύπωσε ακέραιο, tab, ακέραιο */ celcius3 = 5 * (FAHR3-32) / 9; printf("%d\t%d\n", FAHR3, celcius3); /* Τύπωσε ακέραιο, tab, ακέραιο */ celcius4 = 5 * (FAHR4-32) / 9; printf("%d\t%d\n", FAHR4, celcius4); /* Τύπωσε ακέραιο, tab, ακέραιο */ Το αποτέλεσμα θα είναι: 0-17 20-6 40 4 60 15 Προβλήματα: α) η τιμή celsius δεν είναι αναγκαστικά ακέραια! β) τι θα κάναμε αν είχαμε πολύ περισσότερες τιμές να αντιστοιχίσουμε; 17
Παράδειγμα: Αντιστοιχία θερμοκρασιών (βελτιωμένο) /* δημιουργία και εμφάνιση πίνακα αντιστοιχίας θερμοκρασιών Fahrenheit-Celsius από το 0 μέχρι το 500, ανά 20, γνωρίζοντας ότι C= (5/9) (F-32) */ #include <stdio.h> main() { int fahr; float celsius; int lower=0,upper= 500, step = 20; fahr=lower; printf("\n FAHRENHEIT CELSIUS "); printf("\n-----------------------------"); while(fahr <= upper) { celsius = (float)5/9*(fahr-32); printf("\n%6d\t\t%10.2f",fahr,celsius); fahr += step; printf("\n"); system ("PAUSE"); return 0; Το αποτέλεσμα θα είναι: FAHRENHEIT CELSIUS ----------------------------- 0-17.78 20-6.67 40 4.44 60 15.56 80 26.67 100 37.78 120 48.89 140 60.00 160 71.11 180 82.22 200 93.33 220 104.44 240 115.56...... 480 248.89 500 260.00 Πιέστε ένα πλήκτρο για συνέχεια... 18
Παράδειγμα με while και if else (1) Εκφώνηση: Να γίνει ένα πρόγραμμα το οποίο να ζητάει από το πληκτρολόγιο τον βαθμό που πήρε κάποιος φοιτητής σε κάποιο μάθημα και αν είναι μεγαλύτερος από το πέντε ή τουλάχιστον ίσος με το πέντε να επιστρέφει στην οθόνη το μήνυμα «Πέρασες», διαφορετικά να εμφανίζει στην οθόνη το μήνυμα «Απορρίφθηκες». Σε περίπτωση που ο βαθμός είναι εκτός ορίων (δηλαδή, είτε είναι μικρότερος του μηδενός, είτε είναι μεγαλύτερος του δέκα) να εμφανίζει το κατάλληλο μήνυμα λάθους και στην συνέχεια να ξαναζητάει τον βαθμό μέχρι να λάβει κάποιον βαθμό εντός ορίων, οπότε και θα συνεχίσει την εκτέλεση του προγράμματος. 19
Παράδειγμα με while και if else (2) Λύση: main() { int v; printf("δώστε βαθμό : "); scanf("%d", &v); while (v<0 v>10) { printf("βαθμός εκτός ορίων!\n\nξαναδώστε βαθμό : "); scanf("%d", &v); if (v>=5) printf("πέρασες.\n\n"); else printf("απορρίφθηκες.\n\n"); system("pause"); return 0; 20
Εντολή επανάληψης for Συντάσσεται ως εξής: for ( αρχικοποίηση ; συνθήκη ή ; βήμα μεταβολής ) μετρητή εντολή; παράσταση μετρητή 21
Το παράδειγμα αντιστοίχισης θερμοκρασιών ξανά με for #include <stdio.h> #define LOWER 0 #define UPPER 500 #define STEP 20 main() { int fahr; float celsius; printf("\n FAHRENHEIT CELSIUS "); printf("\n-----------------------------"); for(farh=lower; fahr<=upper; farh+=step) { celsius=(float)5/9 *(fahr-32); printf("\n %5d\t\t%9.2f ",fahr,celsius); 22
Υπολογισμός των εκφράσεων Μία έκφραση είναι οτιδήποτε που υπολογίζεται σε μία αριθμητική τιμή. Η απλούστερη έκφραση της C αποτελείται από ένα απλό στοιχείο: Μία κυριολεκτική σταθερά, μία μεταβλητή ή συμβολική σταθερά. Μία κυριολεκτική σταθερά έχει τη δική της τιμή. Μία συμβολική σταθερά έχει την τιμή που της έχει δοθεί όταν δημιουργήθηκε, π.χ. με #define. Mία μεταβλητή έχει την τρέχουσα τιμή που της εκχωρήθηκε τελευταία από το πρόγραμμα. 23
Σύνθετες εκφράσεις Οι σύνθετες εκφράσεις αποτελούνται από απλές εκφράσεις συνδεδεμένες με τελεστές. 2+8; x=a+10; x=6+(y=4+5); x = 2+3 ; x = 2 + 3 ; Γενικά, ο μεταγλωττιστής δε λαμβάνει υπ όψη του κενά διαστήματα (spaces), στηλογνώμονες (tabs) και κενές γραμμές εκτός και αν αποτελούν τμήμα συμβολοσειρών κυριολεκτικών σταθερών (ορμαθοί - ακολουθίες χαρακτήρων = strings) (μεταξύ " "). 24
Μοναδιαίοι τελεστές μεταβολής κατά ένα ++x, --y, z++, w--, Πρόσθεση ή αφαίρεση της μονάδας από τον τελεστέο, ισοδύναμες των x=x+1, y=y-1. Δηλαδή αύξηση ή μείωση του τελεστέου κατά ένα. Χρησιμοποιούνται με μεταβλητές, όχι με σταθερές. 25
Μοναδιαίοι Τελεστές Οι δύο μοναδιαίοι τελεστές μπορούν να τοποθετηθούν πριν από τον τελεστέο (μορφή προθέματος) ή μετά από τον τελεστέο (μορφή επιθέματος) και δεν είναι ισοδύναμοι. Όταν χρησιμοποιούνται σε προθεματική μορφή, οι τελεστές αύξησης και μείωσης τροποποιούν τον τελεστέο τους πριν χρησιμοποιηθεί. Όταν χρησιμοποιούνται σε επιθεματική μορφή, οι τελεστές αύξησης και μείωσης τροποποιούν τον τελεστέο τους αφού χρησιμοποιηθεί. 26
Διαφοροποίηση μοναδιαίων τελεστών Παράδειγμα: x = 10; y = x++; Η τιμή της x θα είναι 11 και της y θα είναι 10. Χρησιμοποιούμε και μετά αυξάνουμε. Παράδειγμα: x = 10; y = ++x; Η τιμή της x θα είναι 11 και της y θα είναι 11. Αυξάνουμε και μετά χρησιμοποιούμε. 27
Παράδειγμα #include <stdio.h> main() { int a, b; a = b = 5; /* Αρχικοποιεί τις μεταβλητές a και b ίσες με 5 και ύστερα τις εμφανίζει μειώνοντάς τις κατά ένα σε κάθε επανάληψη. Για την a χρησιμοποιείται η επιθεματική μορφή ενώ για την b χρησιμοποιείται η προθεματική μορφή του τελεστή αύξησης κατά ένα (++) */ printf("%d printf("%d printf("%d printf("%d printf("%d return 0; %d\n", a--, --b); %d\n", a--, --b); %d\n", a--, --b); %d\n", a--, --b); %d\n", a--, --b); Αποτέλεσμα: 5 4 4 3 3 2 2 1 1 0 ------------------------ Press any key to... 28