ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 2 Ο Εισαγωγή στην C Εντολές εξόδου Εντολές εισόδου Μορφοποιητές ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 1
Εισαγωγή στη C Η γλώσσα προγραμματισμού C είναι υψηλού επιπέδου με δυνατότητες προγραμματισμού σε επίπεδο κυκλωμάτων. Κατατάσσετε στις γλώσσες δομημένου προγραμματισμού και χρησιμοποιεί μεγάλο αριθμό έτοιμων συναρτήσεων που λαμβάνονται από διάφορες βιβλιοθήκες. Η δομή των προγραμμάτων σε C είναι: Περιοχή προεπεξεργαστή #include, #define, μεταγλώττιση με συνθήκη, μακροεντολές Δηλώσεις μεταβλητών, συναρτήσεων Κυρίως πρόγραμμα main() {..} Συναρτήσεις function(μεταβλητές) { } ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 2
Εντολές εξόδου Όπως τα υπολογιστικά συστήματα διαθέτουν συσκευές εισόδου και εξόδου έτσι και σε επίπεδο προγραμμάτων πρέπει να υπάρχουν εντολές με τις οποίες εισάγονται τα δεδομένα προς επεξεργασία και αντίστοιχα εντολές με τις οποίες εμφανίζονται τα αποτελέσματα. Οι εντολές αυτές είναι συναρτήσεις που εμπεριέχονται σε κατάλληλες βιβλιοθήκες. Στην ANSI C η βιβλιοθήκη που θα χρησιμοποιηθεί είναι η <stdio.h> η οποία δηλώνεται στην περιοχή του προεπεξεργαστή. Το αποτέλεσμα δε της εξόδου μπορεί να εμφανίζεται στην οθόνη ή ακόμα να καταγράφεται σε αρχείο που υπάρχει η δημιουργείται σε μια μονάδα αποθήκευσης. Επίσης εξαρτάται από το είδος των δεδομένων που θα εξαχθεί. Στη συνέχεια θα μελετηθούν οι εντολές : printf( ), putchar( ), puts ( ), fprintf ( ) και fputc( ) ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 3
printf () H printf η συνάρτηση της καθιερωμένης βιβλιοθήκης εισόδου-εξόδου stdio.h που χρησιμοποιείται για να εμφανίζει πληροφορίες στην οθόνη. Το πιο κάτω απλούστατο πρόγραμμα χρησιμοποιεί την printf για να εμφανίσει στην οθόνη το μήνυμα ΧΑΙΡΩ ΠΟΛΥ!!! 2 3 int main() 4 { 5 printf("χαιρω ΠΟΛΥ!!!"); 6 return 0; 7 } Στην γραμμή 1 εισάγεται η βιβλιοθήκη stdio.h, στην 3 ξεκινά το πρόγραμμα, στην 5 χρησιμοποιείται η εντολή που εμφανίζει όπως ακριβώς είναι το περιεχόμενο μεταξύ των εισαγωγικών. Στην γραμμή 6 ολοκληρώνεται επιτυχώς το πρόγραμμα. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 4
Μορφοποιητές της printf 1/2 Στο προηγούμενο πρόγραμμά μας αφήσαμε το σύστημα να εκτυπώσει το μήνυμά μας όπως αυτό ήθελε. Για παράδειγμα η εμφάνιση στην οθόνη του πιο κάτω δεν είναι η καλύτερη δυνατή. 2 3 int main() 4 { 5 printf("χαιρω ΠΟΛΥ!!!"); 6 printf("και ΕΓΩ ΤΟ ΙΔΙΟ!!!"); 7 return 0; 8 } Εμφανίζεται στην οθόνη ΧΑΙΡΩ ΠΟΛΥ!!!ΚΑΙ ΕΓΩ ΤΟ ΙΔΙΟ!!! Αν όμως αντικατασταθεί η γραμμή 6 με την printf("\nκαι ΕΓΩ ΤΟ ΙΔΙΟ!!!"); τότε θα διαχώριζε τις γραμμές στην οθόνη των αποτελεσμάτων. Αυτό είναι αποτέλεσμα του \n που σημαίνει άλλαξε γραμμή. Παρόμοια αν χρειασθεί να εκτυπωθεί «\» πρέπει να γραφεί δύο φορές έτσι \\, αν χρειάζεται να εμφανισθούν εισαγωγικά για τα απλά έτσι \' ενώ για τα διπλά έτσι \". ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 5
Μορφοποιητές της printf 2/2 Αν δοκιμάσουμε το πιο κάτω πρόγραμμα στο οποίο επιχειρούμε να εμφανίσουμε με την printf το περιεχόμενο της μεταβλητής a θα διαπιστώσουμε ότι εμφανίζει κάτι αγνώριστο. Στην περίπτωση αυτή πρέπει να προσδιορισθεί στην printf ο τρόπος εκτύπωσης του περιεχομένου της μεταβλητής. Υπάρχουν λοιπόν ορισμένα προσδιοριστικά μορφοποίησης της printf. Ηγενικήσύνταξη των προσδιοριστικών αυτών είναι: %[-][συνολικός διαθέσιμος χώρος ][.][δεκαδικά ψηφία ]κωδικός μορφοποίησης Παράδειγμα %10.3f σημαίνει θα εμφανισθεί δεκαδικός αριθμός με 3 δεκαδικά ψηφία και συνολικά του διατίθενται 10 θέσεις με στοίχιση δεξιά. Ενώ το %-10.3f το ίδιο με στοίχιση όμως αριστερά. Οι κωδικοί μορφοποίησης είναι: c χαρακτήρας s αλφαριθμητικό, d και i προσημασμένοι ακέραιοι στο 10δικό σύστημα u,o,x μη προσημασμένοι ακέραιοι στο 10δικό, 8δικό και 16δικό σύστημα αντίστοιχα, f δεκαδικοί κινητής υποδιαστολής, Ε εκθετική μορφή δεκαδικού. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 6
fprintf() Η fprintf() είναι αντίστοιχη συνάρτηση εξόδου, με τη διαφορά ότι καταγράφει τα αποτελέσματα σε αρχείο. Απαιτεί ένα πρόσθετο όρισμα που δείχνει το αρχείο αυτό, είναι το πρώτο στη λίστα των ορισμάτων. Ακολουθεί παράδειγμα που γράφει το μήνυμα ΧΑΙΡΩ ΠΟΛΥ στο αρχείο out.txt. Χωρίς να αναφέρονται λεπτομέρειες για τη διαχείριση αρχείων μπορούμε να μελετήσουμε την εντολή. 2 FILE *fp; 3 int main() 4 { 5 fp=fopen("out.txt", "w"); 6 fprintf(fp, "ΧΑΙΡΩ ΠΟΛΥ!!!"); 7 fclose(fp); 8 return 0; 9 } Μπορούν να αξιοποιηθούν οι μορφοποιητές που αναφέρθηκαν στα προηγούμενα. ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 7
putchar(), puts () και fputc() Ειδικές συναρτήσεις εξόδου, που χρησιμοποιούνται με αλφαριθμητικά δεδομένα είναι οι putchar(), puts() και fputc(). Η πρώτη εξάγει στην οθόνη έναν μεμονωμένο χαρακτήρα. Η δεύτερη εξάγει στην οθόνη σειρά χαρακτήρων και ολοκληρώνοντας αλλάζει αυτόματα γραμμή. Η τρίτη γράφει έναν χαρακτήρα σε κατάλληλο αρχείο. Το ίδιο αποτέλεσμα με τις συναρτήσεις αυτές μπορεί να επιτευχθεί με τη χρήση της printf() και fprintf(), ωστόσο επιλέγει κανείς putchar(), puts() και fputc() γιατί είναι ταχύτερες και πιο απλές στην χρήση τους. 1 #include <stdio.h> 2 int main() 3 { 4 puts("ένα"); 5 puts("δύο"); 6 puts("τρία"); 7 return 0; 8 } 2 int main() 3 { 4 putchar('2'); 5 puts("δύο"); 6 putchar('3'); 7 puts("τρία"); 8 return 0; 9 } 2 FILE *fp; 3 int main() { 4 fp=fopen("out.txt", "w"); 5 fputc('(', fp); 6 fprintf(fp, "ΧΑΙΡΩ ΠΟΛΥ!!!"); 7 fputc(')', fp); 8 fclose(fp); 9 return 0;} ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 8
scanf() & fscanf() Για να εισαχθούν στοιχεία στο πρόγραμμα απαιτούνται οι εντολές εισόδου. Από το πληκτρολόγιο εισάγονται με τη συνάρτηση scanf(), ενώ από αρχείο διαβάζονται με την fscanf(). Χωρίς να συζητηθούν οι μεταβλητές στα πιο κάτω παραδείγματα φαίνεται πώς εισάγεται τιμή από πληκτρολόγιο στην ακέραιη μεταβλητή a και πώς διαβάζεται από το αρχείο inp.txt. Ισχύουν δε τα ίδια χαρακτηριστικά των μορφοποιητών. /* Εισαγωγή από πληκτρολόγιο */ #include <stdio.h> int a; int main() { scanf("%d", &a); printf("%d", a); return 0; } /* Διαβάζει από αρχείο */ #include <stdio.h> int a; FILE *fp; int main() { fp=fopen( inp.txt", r"); fscanf(fp, "%d", &a); printf("%d", a); fclose(fp); return 0; } ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 9
putchar(), puts () και fputc() Ειδικές συναρτήσεις εξόδου, που χρησιμοποιούνται με αλφαριθμητικά δεδομένα είναι οι putchar(), puts() και fputc(). Η πρώτη εξάγει στην οθόνη έναν μεμονωμένο χαρακτήρα. Η δεύτερη εξάγει στην οθόνη σειρά χαρακτήρων και ολοκληρώνοντας αλλάζει αυτόματα γραμμή. Η τρίτη γράφει έναν χαρακτήρα σε κατάλληλο αρχείο. Το ίδιο αποτέλεσμα με τις συναρτήσεις αυτές μπορεί να επιτευχθεί με τη χρήση της printf() και fprintf(), ωστόσο επιλέγει κανείς putchar(), puts() και fputc() γιατί είναι ταχύτερες και πιο απλές στην χρήση τους. 1 #include <stdio.h> 2 int main() 3 { 4 puts("ένα"); 5 puts("δύο"); 6 puts("τρία"); 7 return 0; 8 } 2 int main() 3 { 4 putchar('2'); 5 puts("δύο"); 6 putchar('3'); 7 puts("τρία"); 8 return 0; 9 } 2 FILE *fp; 3 int main() { 4 fp=fopen("out.txt", "w"); 5 fputc('(', fp); 6 fprintf(fp, "ΧΑΙΡΩ ΠΟΛΥ!!!"); 7 fputc(')', fp); 8 fclose(fp); 9 return 0;} ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 10
getchar(), fgetc(), getc() και gets() Ειδικές συναρτήσεις εισόδου είναι η getchar(), που χρησιμοποιείται για την είσοδο ενός μεμονωμένου χαρακτήρα από το πληκτρολόγιο ενώ η fgetc() και η getc() εισάγουν ένα μόνο επίσης χαρακτήρα αλλά διαβάζοντάς τον από αρχείο. Είναι ταυτόσημες και η getc() συνεχίζει να υπάρχει μόνο για ιστορικούς λόγους. Η gets() είναι συνάρτηση που εισάγει σειρά αλφαριθμητικών μέχρι να πατηθεί το enter. Οι χαρακτήρες αποθηκεύονται σε κατάλληλη μεταβλητή. #include <stdio.h> char ch; int main() { printf("αντρασ/γυναικα (Α/Γ): "); ch=getchar(); printf("διαβασα : "); putchar(ch); return 0; } #include <stdio.h> FILE *fp; char ch; int main() { fp=fopen("inp.txt", "r"); ch=getc(fp); printf("διαβασα : "); putchar(ch); ch=fgetc(fp); printf("\nδιαβασα : "); putchar(ch); fclose(fp); return 0;} #include <stdio.h> char str[80]; int main() { puts("δωσε ΝΑ ΔΙΑΒΑΣΩ : "); gets(str); puts("διαβασα : "); puts(str); return 0; } ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 11