ΕΠΛ 034: Εισαγωγή στον Προγραμματισμό για ΗΜΥ Αχιλλέας Αχιλλέως, Τμήμα Πληροφορικής, Πανεπιστήμιο Κύπρου Email: achilleas@cs.ucy.ac.cy
Κεφάλαιο 4 Είσοδος/Έξοδος εδομένων
Θέματα ιάλεξης Συνάρτηση εξόδου printf Συνάρτηση εισόδου scanf Ανάκτηση/Καταγραφή Πληροφοριών από/σε αρχείο Με χρήση ανακατεύθυνσης(redirection) Με χρήση εντολών fprintf, fscanf
Είσοδος / Έξοδος Σε σχεδόν όλα τα προγράμματα πρέπει να πάρουμε κάποια δεδομένα και να δώσουμε αποτέλεσμα Συνάρτηση εισόδου αντιγράφει δεδομένα από μονάδα εισόδου σε χώρο στην μνήμη, πχ scanf, getchar Συνάρτηση εξόδου εκτυπώνει σε μονάδα εξόδου πληροφορίες αποθηκευμένες στην μνήμη, πχ printf, putchar Η βιβλιοθήκη stdio περιέχει βασικές συναρτήσεις εισόδου/εξόδου
Έξοδος printf Σύνταξη: printf(μορφή εξόδου); printf(μορφή εξόδου, λίστα εκφράσεων);
Μορφή Εξόδου Σύνταξη: ξεκινά με και τελειώνει με Περιλαμβάνει: strings, ορίσματα, ειδικούς χαρακτήρες Σημασία: τυπώνει ως έχουν τα strings ορίσματα και ειδικοί χαρακτήρες...
Ειδικοί Χαρακτήρες (escape sequences) Σημασία: \n μετάφερε δρομέα στην επόμενη γραμμή \t μετάφερε δρομέα στην επόμενη δεξιά στήλη \ εκτύπωσε \\ εκτύπωσε \ \a ήχησε κουδούνι Παραδείγματα printf( hello world ); printf( hello world\n ); printf( hello world\nhello world\n ); printf( hello world\ti m alive\n );
Ορίσματα Σύνταξη: %d %c %f %e %s Σημασία: αντικατάστησε όρισμα με τιμή έκφρασης από την λίσταεκφράσεων %d ακέραια τιμή (int) %f κινητή υποδιαστολή μονής ακριβείας (float) %e κινητή ηήυποδιαστολή ολή διπλής ακριβείας ρβείας (double) %c ένας χαρακτήρας (char) %s σειρά από χαρακτήρες (string) Προσοχή: ο αριθμός ορισμάτων πρέπει να είναι ο ίδιος με το μέγεθος της λίστας εκφράσεων, και η σειρά και οι τύποι να ταιριάζουν.
Παραδείγματα Ορισμάτων printf( to to EPL131 exei %d foitites\n, 27); int n_students; printf( to EPL131 exei %d foitites\n, n_students); float average; printf( o mesos oros einai %f\n, average); printf( simeio i i = (%f, %f, %f), x, y, z);
Μορφοποίηση (formatting) Ακεραίων Σύνταξη: %nd Σημασία: χρησιμοποίηση n θέσεων για την εκτύπωση του ακέραιου αριθμού. Εάν ο αριθμός έχει λιγότερα από n ψηφία, τοποθετούνται κενά στα αριστερά (δεξιά ευθυγράμμιση). Εάν ο αριθμός έχει περισσότερα ψηφία, εκτυπώνονται όλα printf( \n%3d%3d\n\n%2d %3d, 1, 22, 33, -444); 1 2 2 3 3-4 4 4
Μορφοποίηση Κινητής Υποδιαστολής Σύνταξη: %n.mf Σημασία: χρησιμοποίηση τουλάχιστον n θέσεων για την εκτύπωση του αριθμού (συμπεριλαμβάνει την και. το,αν χρειάζεται) Τα m ψηφία να είναι δεκαδικά Εάν ο αριθμός έχει περισσότερα ψηφία, εκτυπώνονται όλα Σύνταξη: %.mf (m δεκαδικά ψηφία) printf( %4.2f %9.6f %3.2f, 4.4, 22.1, 466.00); 4. 4 0 2 2. 1 0 0 0 0 0 4 6 6. 0 0
Μορφή Eισόδου Σύνταξη: Ξεκινά με και τελειώνει με Περιλαμβάνει: ορίσματα Σημασία: τύπος ορισμάτων και σειρά τιμών που θα εισαχθούν τύποι ανάλογοι με printf (πχ %d %f %e %c κτλ) %d, %f και %e διαπερνούν white space
Τελεστής διεύθυνσης και scanf Σύνταξη: &<όνομα μεταβλητής> Σημασία: δίνει την διεύθυνση της μεταβλητής π.χ. &numbera scanf: αποθηκεύει τιμές στις μεταβλητές χρησιμοποιώντας τις διευθύνσεις τους Όπως κάθε συνάρτηση στην C Θα το δούμε σε λεπτομέρεια πιο μετά (Ενότητα Θα το δούμε σε λεπτομέρεια πιο μετά (Ενότητα Συναρτήσεων)
Είσοδος scanf Σύνταξη: scanf(μορφή εισόδου, λίστα διευθύνσεων μεταβλητών);
Χρήση printf και scanf int numbera, numberb; printf( Enter two integer numbers: ); scanf( %d%d,&numbera, &numberb); printf( The two numbers entered are %d %d\n\n, numbera, numberb);
Παράδειγμα 1 Να γραφεί πρόγραμμα που να υπολογίζει το άθροισμα, διαφορά, γινόμενο, πηλίκο και υπόλοιπο (mod) για δυο ακέραιους αριθμούς. Οι δυο αριθμοί πρέπει να διαβαστούν από τον χρήστη.
Παράδειγμα 1 Λύση 1 #include <stdio.h> int main(){ int numbera, numberb; int sum, difference, product, ratio, modulo; /* inputs*/ /*results*/ printf( Enter t two integer numbers: ); /*get data*/ scanf( %d%d,&numbera, &numberb); sum = numbera + numberb; difference = numbera - numberb; product = numbera * numberb; ratio = numbera / numberb; modulo = numbera % numberb; /* compute results*/ /* display output */ printf( The sum of %d and %d is %d\n,numbera, numberb,sum); printf( The difference of %d and %d is %d\n,numbera, numberb,difference); printf( The product of %d and %d is %d\n,numbera, numberb,product); printf( The ratio of %d and %d is %d\n,numbera, numberb,ratio); printf( The ratio of %d and %d is %d\n,numbera, numberb,ratio); printf( The mod of %d and %d is %d\n,numbera, numberb,modulo); return 0; }
Παράδειγμα 1 Λύση 2 #include <stdio.h> int main(){ int numbera, numberb; /* inputs*/ printf( Enter two integer numbers: ); scanf( %d%d,&numbera, &numberb); /*get data*/ /* compute & display results */ printf( The sum of %d and %d is %d\n,numbera, numberb, numbera + numberb); printf( The difference of %d and %d is %d\n,numbera, numberb, numbera - numberb); printf( The product of %d and %d is %d\n,numbera, numberb, numbera * numberb); printf( The ratio of %d and %d is %d\n,numbera,, numberb, numbera / numberb); printf( The mod of %d and %d is %d\n,numbera, numberb, numbera % numberb); return 0; }
Παράδειγμα 2 Γράψετε πρόγραμμα που να υπολογίζει και να τυπώνει την περίμετρο και εμβαδό ενός κύκλου. Το μόνο δεδομένο είναι η ακτίνα του κύκλου σε μέτρα, η οποία πρέπει να δίδεται από τον χρήστη.
Παράδειγμα 2 Λύση /* program that computes the perimeter and area of a circle*/ #include <stdio.h> #define PI 3.14259 /*program constant*/ int main(){ float radius; /* variable for input data*/ float perimeter, area; /*variable for output data*/ /*GET INPUT DATA*/ printf( This program computes the area and perimeter of a circle\n ); printf( Enter radius of a circle in meters: ); scanf( %f,&radius); /*COMPUTE PERIMETER AND AREA*/ perimeter = 2 * PI * radius; area = PI * radius * radius; /*PRINT RESULTS*/ printf( A circle with radius %f m has perimeter %f m and area %f sq. m\n, radius, perimeter, area); return 0; }
Επικοινωνία με Πρόγραμμα Επικοινωνία με έναπρόγραμμα Εισαγωγή δεδομένων Εξαγωγή δεδομένων γίνεται ουσιαστικά με δύο τρόπους Καθώς τρέχει ρχ το πρόγραμμα Ο χρήσης δίνει δεδομένα από το πληκτρολόγιο Ο χρήστης πληροφορείται πότε και τι να δώσει από την οθόνη Πληροφορίες από/σε αρχείο Με χρήση ανακατεύθυνσης (redirection) Με χρήση εντολών fprintf, fscanf
Είσοδος / Έξοδος με Ανακατεύθυνση Ανακατεύθυνση εισόδου myprogram < in in: αρχείο τύπου ASCII που περιέχει πληροφορίες εισόδου Ανακατεύθυνση εξόδου myprogram > out out: αρχείο τύπου ASCII που αποθηκεύονται τα αποτελέσματα εξόδου Ανακατεύθυνση εισόδου και εξόδου myprogram < in > out
Παράδειγμα /* programma revnum.c */ #include<stdio.h> int main(){ float lires, rate; scanf( %f %f, &lires, &rate); printf( Oi %f lires einai %f Euro\n, lires, lires*rate); return 0; } Τι πρέπει να περιέχει το in πριν την εκτέλεση και τι περιέχει το out μετά την εκτέλεση revnum < in > out
εδομένα από Συγκεκριμένο Αρχείο Ένα πρόγραμμα μπορεί να καθορίζει ρζ το αρχείο από το οποίο θα διαβάσει ή θα αποθηκεύσει δεδομένα Πρώτα ορίζεται ένα δείκτης τύπου αρχείου ο οποίος θα δί δείχνει στο συγκεκριμένο αρχείο π.χ. FILE *inp (δείκτης στο αρχείο εισόδου) FILE *outp (δείκτης στο αρχείο εξόδου) Τα αρχεία ανοίγονται στο πρόγραμμα με την εντολή fopen( file_name, access_type ) π.χ. inp = fopen( input.dat, r ) outp = fopen( output.dat, w ) (Υπάρχει και το access_type a )
Εντολή fprintf Η εντολή fprintf είναι ανάλογη της printf αλλά για αρχεία (αντί οθόνης) π.χ fprintf(outp, O arithmos einai: %d, num ) είκτης σε αρχείο εξόδου Όπως printf
Εντολή fscanf Η εντολή fscanf είναι ανάλογη της scanf αλλά για αρχεία (αντί πληκτρολογίου) π.χ fscanf(inp, %d, &num ) είκτης σε αρχείο εισόδου Όπως scanf
Κλείσιμο Αρχείων Όταν δεν χρειαζόμαστε τα αρχεία, τότε τα κλείνουμε με την εντολή: fclose(δείκτης στο αρχείο) π.χ. fclose(inp); fclose(outp); Αν δεν κλείσουμε τα αρχεία πριν τον τερματισμό του προγράμματος, τότε τα αρχεία κλείνουν ταυτόχρονα με την εκτέλεση της return 0 της main().
Παράδειγμα /* programma revnum.c */ #include<stdio.h> int main(){ float lires, rate; FILE *inp inp, *outp; inp = fopen( input.dat, r ); outp = fopen( output.dat, p w ); fscanf(inp, %f %f, &lires, &rate); fprintf(outp, Oi %f Lires einai %f Euro\n, lires, lires*rate); fclose(inp); fclose(outp); return 0; }
Περίληψη Συνάρτηση Εξόδου printf Σύνταξη και σημασία Μορφή εξόδου Ορίσματα Ειδικοί χαρακτήρες Μορφοποίηση Συνάρτηση Εισόδου scanf Σύνταξη και σημασία Μορφή εισόδου Ορίσματα Τελεστής διεύθυνσης Παραδείγματα Ανάκτηση/Καταγραφή Πληροφοριών από/σε αρχείο Με χρήση ανακατεύθυνσης(redirection) Με χρήση εντολών fprintf, fscanf
Τέλος Κεφαλαίου 4