ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

27
H ΓΛΩΣΣΑ C Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων ∆ηµήτρης Ψούνης

Transcript of ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

Page 1: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

H ΓΛΩΣΣΑ C

Μάθηµα 9:

Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

∆ηµήτρης Ψούνης

Page 2: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

Περιεχόµενα ΜαθήµατοςΑ. Έξοδος ∆εδοµένων

1. Η εντολή printf1. Τρόποι Χρήσης2. Ειδικοί Χαρακτήρες3. Προσδιοριστές για Βασικούς Τύπους ∆εδοµένων4. Χρήση Προσδιοριστών για ∆εκαδικούς Αριθµούς5. Συµβουλές

6. Τυπικό Συντακτικό της printfΒ. Είσοδος ∆εδοµένων

1. Η εντολή scanf1. Συντακτικό

2. Τρόποι ΧρήσηςΓ. Ασκήσεις

2∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Page 3: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων1. Γενικά

3∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Γενικά µε τον όρο «έξοδος δεδοµένων» εννοούµε την διαδικασία που το πρόγραµµα µας προβάλλει τα δεδοµένα που έχουν οι µεταβλητές του. ∆ύο τρόπους θα µάθουµε:

Την έξοδο στην οθόνη. Έχουµε ήδη δει την βασική χρήση της printf και στο µάθηµα αυτό θα την δούµε πιο αναλυτικά, µε όλες τις λεπτοµέρειες της σύνταξής της.

Σε επόµενο µάθηµα θα δούµε και άλλες βοηθητικές συναρτήσεις που κάνουν πιο εξειδικευµένες ενέργειες όπως η puts, η putc, κ.λπ.

Την έξοδο σε αρχείο του υπολογιστή Όπου θα µάθουµε να αποθηκεύουµε τα δεδοµένα που έχουν οι µεταβλητές µας σε αρχεία που είναι αποθηκευµένα στον υπολογιστή. Θα δούµε αναλυτικά αυτές τις ενέργειες σε επόµενο µάθηµα.

Page 4: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf

4∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Η εντολή printf είναι µια συνάρτηση βιβλιοθήκης, η οποία προβάλλει το περιεχόµενο της στην οθόνη.

Μερικά Παραδείγµατα είναι τα εξής:

Η printf είναι µια πάρα πολύ σηµαντική συνάρτηση, ακριβώς διότι προβάλλει στην οθόνη τα µηνύµατα που θέλουµε. Θα δούµε διαφορετικούς τρόπους µε τους οποίους µπορούµε να την συντάξουµε.

printf("Eisagete arithmo metaksi 1 kai 100:");

printf("Eisagete allon ena arithmo metaksi 1 kai 100:");

printf("To ginomeno tou %d kai tou %d einai: %d\n",a,b, c);

printf("\n\nPatiste Enter gia eksodo");

Page 5: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf1.Τρόποι Χρήσης

5∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Όπως κάθε συνάρτηση, έτσι και η printf παίρνει ορίσµατα. Στην 1η χρήση της βλέπουµε πως λειτουργεί µε ένα όρισµα:

όπου συµβολοσειρά είναι οποιοδήποτε κείµενο θέλουµε να προβάλλουµε στην οθόνη.

ΠΡΟΣΟΧΗ! Μία συµβολοσειρά χαρακτηρίζεται από τα διπλά εισαγωγικά “……”. Αν ξεχάσουµε να βάλουµε τα εισαγωγικά είτε στην αρχή είτε στο τέλος, ο µεταγλωττιστής θα διαµαρτυρηθεί. Μία συµβολοσειρά αποτελείται από χαρακτήρες (δηλαδή ένα-ένα τα γράµµατα που την αποτελούν

Έχουµε δικαίωµα να εισάγουµε και ειδικούς χαρακτήρες που κάνουν µια συγκεκριµένη δουλειά

Τέτοιος είναι και ο ‘\n’ που λέγεται χαρακτήρας αλλαγής γραµµής διότι η εκτύπωση του προκαλεί την αλλαγή γραµµής στην οθόνη.

printf(" Συµβολοσειρά");

Page 6: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf1. Τρόποι Χρήσης

6∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Στην 2η χρήση της βλέπουµε πως λειτουργεί µε δύο ορίσµατα (σηµειώστε ότι ο µεταγλωττιστής αντιλαµβάνεται τα ορίσµατα διότι αυτά είναι χωρισµένα µε κόµµα):

Το 1ο όρισµα είναι η συµβολοσειρά που θα εκτυπωθεί στην οθόνη που περιέχει µέσα της το %d. Το %d καλείται προσδιοριστής και στο σηµείο όπου βρίσκεται θα εκτυπωθεί η τιµή της ακέραιας µεταβλητής που έχουµε ως δεύτερο όρισµα. Για παράδειγµα το τµήµα κώδικα:

Τυπώνει στην οθόνη

printf(" Συµβολοσειρά που έχει µέσα της %d", ακέραια µεταβλητή);

int x;

x=1;

printf(" H metabliti exei timi %d ",x)

H metabliti exei timi 1

x

1

Page 7: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf1. Τρόποι Χρήσης

7∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Στην 3η χρήση της βλέπουµε πως λειτουργεί µε τρία ορίσµατα (και πάλι πρέπει να τα χωρίσουµε µε κόµµα για να αντιληφθεί ο µεταγλωττιστής ότι πρόκειται για τρία ορίσµατα)

Μέσα στην συµβολοσειρά τώρα έχουµε δύο %d. Το 1ο %d θα αντικατασταθεί µε την τιµή της µεταβλητή1 (2ο όρισµα) και το 2ο %d θα αντικατασταθεί µε την τιµή της µεταβλητή2 (3ο

όρισµα) Για παράδειγµα το τµήµα κώδικα:

Τυπώνει στην οθόνη

printf(" Συµβολοσειρά που έχει µέσα της 2 %d", ακέραιος1, ακέραιος2);

int x,y;

x=1;y=6;

printf(" Oi times einai: %d kai %d ",y,x)

Oi times einai: 6 kai 1

x

1

y

Page 8: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf1. Τρόποι Χρήσης

8∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Ο τρόπος που είδαµε στην σύνταξη της printf γενικεύεται, δηλαδή: Μπορούµε στην συµβολοσειρά να έχουµε τρία %d ακολουθούµενα από τρία ακόµη ορίσµατα που θα είναι ακέραιες µεταβλητές.

Μπορούµε στην συµβολοσειρά να έχουµε τέσσερα %d ακολουθούµενα από τέσσερα ακόµη ορίσµατα που θα είναι ακέραιες µεταβλητές.

κ.ο.κ. Στο σηµερινό µάθηµα θα δούµε πως µπορούµε µε την printf να εκτυπώσουµε και άλλους τύπους δεδοµένων όπως πραγµατικές µεταβλητές, συµβολοσειρές κ.λ.π.

Page 9: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf2. Ειδικοί Χαρακτήρες

9∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Είδαµε ήδη ότι όταν βάζουµε το ‘\n’ µέσα στην συµβολοσειρά, αλλάζει γραµµή στην οθόνη. Ο χαρακτήρας αυτός είναι ένας ειδικός χαρακτήρας που σηµαίνει ότι προκαλεί µια συµπεριφορά και δεν τυπώνεται στην οθόνη.

Υπάρχουν και άλλοι ειδικοί χαρακτήρες που µπορούµε να χρησιµοποιήσουµε µέσα στην συµβολοσειρά. Κοινό χαρακτηριστικό τους είναι ότι ξεκινούν µε \ (backslash). Ας τους δούµε:

Ειδικός Χαρακτήρας Συµπεριφορά

\n Αλλαγή Γραµµής

\t Tab (Μετακίνηση µερικές θέσεις δεξιά)

\a Beep (O υπολογιστής κάνει beep)

\\ Εκτύπωση του \ (χαρακτήρας backslash)

\" Εκτύπωση του " (χαρακτήρας διπλο εισαγωγικό)

\' Εκτύπωση του ‘ (χαρακτήρας µονο εισαγωγικό)

Page 10: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf2. Ειδικοί Χαρακτήρες

10∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Μελετήστε το πρόγραµµα για την χρήση των συνήθων ειδικών χαρακτήρων

/* special.c: Anadeikniei tin xrisi twn xaraktirwndiafigis */

#include <stdio.h>

main()

printf("\n\t\tANAFORA");printf("\n ---------------------------------");printf("\n\tAtomo\t\tAmoibi ");printf("\n ---------------------------------");printf("\n \tGiorgos\t\t 100");printf("\n \tKostas\t\t 200");printf("\n \tEleni\t\t 150");printf("\n ---------------------------------");

printf("\n\aBeep.\n\aBeep.\n\aBeep.");

και εδώ βλέπουµε την έξοδο:ANAFORA

---------------------------------Atomo Amoibi

---------------------------------Giorgos 100Kostas 200Eleni 150

---------------------------------Beep.Beep.Beep.

Telos Programmatos.

Page 11: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf3. Προσδιοριστές Βασικών Τύπων ∆εδοµένων

11∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Το %d το χρησιµοποιήσαµε µέσα σε µια συµβολοσειρά ώστε να το αντικαταστήσουµε µε την τιµή µιας ακέραιας µεταβλητής.

Κάθε τύπος δεδοµένων, συνοδεύεται από τον προσδιοριστή του. Που σηµαίνει ότι ανάλογα µε τον τύπο δεδοµένων που θέλουµε να τυπώσουµε, χρησιµοποιούµε και τον ανάλογο προσδιοριστή.

Στην πράξη θα χρειαστούµε τους 4 πρώτους.

Προσδιοριστής Τύπος δεδοµένων που αντιστοιχεί%d int

%f float, double

%c char

%s Συµβολοσειρά (πίνακας χαρακτήρων)%ld long

%u unsigned int

Page 12: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf3. Προσδιοριστές Βασικών Τύπων ∆εδοµένων

12∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Μελετήστε το πρόγραµµα για την χρήση των προσδιοριστών:

Πειραµατιστείτε µε τον κώδικα: Αν χρησιµοποιήσουµε λάθος προσδιοριστή, τότε τα αποτελέσµατα θα είναι µη αναµενόµενα!!

/* prosd.c: Anadeikniei tin xrisi twn prosdioristwn */

#include <stdio.h>

int main()

int x,y;float a,b;

x=1;y=2;a=2.2;b=3.3;printf("\nAkeraioi Arithmoi: (%d+%d)/2=%d",x,y,(x+y) /2);printf("\nPragmatoi Arithmoi: (%f+%f)/2=%f",a,b,(a+b )/2);

Page 13: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf4. Χρήση Προσδιοριστών για δεκαδικούς αριθµούς

13∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Όπως είδαµε στο προηγούµενο παράδειγµα, η εκτύπωση ενός πραγµατικού αριθµού γίνεται µε τον προσδιοριστή %f και εξ’ορισµού τυπώνεται µε 6 δεκαδικά ψηφία.

Μας δίνεται η δυνατότητα όµως να προσδιορίσουµε ακριβώς το µέγεθος του χώρου και το πλήθος των δεκαδικών ψηφίων που θέλουµε να εµφανιστούν.

Το συντακτικό του προσδιοριστή %f γίνεται:

Σηµαίνει ότι θα εκτυπωθούν Ψ θέσεις ( αν είναι λιγότερες συµπληρώνονται µε κενά) και θα τυπωθούν Α δεκαδικά ψηφία (ακρίβεια Α δεκαδικών ψηφίων)

Για παράδειγµα η εντολή:

Θα τυπώσει στην οθόνη:

(Προσοχή ότι τυπώθηκαν 3 κενά αριστερά του αριθµού, το 0, η υποδιαστολή, 3 δεκαδικά, άρα σύνολο 8 θέσεις)

printf("%8.3f",1/3);

%Ψ. Αf

0.333

Αρκετά χρήσιµο είναι το πλήθος των θέσεων και για την εκτύπωση ακεραίων αριθµών για µορφοποιηµένη έξοδο στην οθόνη.

Π.χ. ο προσδιοριστής %4d θα εκτυπώσεις τον ακέραιο που ακολουθεί µε συµπλήρωση κενών.

Page 14: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf4. Χρήση Προσδιοριστών για δεκαδικούς αριθµούς

14∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Μελετήστε το πρόγραµµα για την χρήση των προσδιοριστών:

/*width_precision.c: Deixnei tin epirroi ston prosdior isti twn width+precision */#include <stdio.h>

main()

float f=10.0/7.0;int i,num;

printf("\nPragmatikoi Arithmoi: ");printf("\n%8.3f", f);printf("\n%8.4f", f);printf("\n%8.5f", f);printf("\n%8.6f", f);

printf("\n\nAkeraioi Arithmoi: ");num=1;for (i=1; i<=8; i++)

printf("\n|%-10d|%10d|",num,num);num*=10;

Page 15: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf5. Συµβουλές

15∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Μερικές συµβουλές για την printf

Αλλαγή γραµµής γίνεται σε δύο περιπτώσεις: Όταν χρησιµοποιούµε τον χαρακτήρα \n Όταν δεν χωράει πλέον στην γραµµή της οθόνης οπότε αλλάζει αυτοµάτως γραµµή!

Καλό θα είναι να υιοθετήσουµε µια σύµβαση για τις αλλαγές γραµµής. Μια καλή πολιτική είναι να γράφουµε µια ξεχωριστή printf όποτε θέλουµε να αλλάξουµε γραµµή στην οθόνη, βάζοντας µια \n στην αρχή της συµβολοσειράς (Αυτή η σύµβαση έχει υιοθετηθεί στις σηµειώσεις)

Έχετε ως αναφορά όταν γράφετε κώδικα, τους προσδιοριστές για κάθε τύπο δεδοµένων. Αν χρησιµοποιήσετε λάθος προσδιοριστή το πρόγραµµα θα εκτυπώσει τα δεδοµένα µε λάθος τρόπο!

Page 16: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf6. Τυπικό Συντακτικό της printf

16∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Το συντακτικό της printf είναι:

Το πρώτο όρισµα είναι η συµβολοσειρά που τυπώνεται στην οθόνη και αν αυτό περιέχει προσδιοριστές τότε αυτοί αντικαθίστανται µε µία κατάλληλη µορφοποίηση από τα ορίσµατα που ακολουθούν µε βάση τη σειρά τους.

Η συνάρτηση επιστρέφει το πλήθος των χαρακτήρων που γράφηκαν στην οθόνη. Το συντακτικό των προσδιοριστών είναι:

Όπου flags: Μορφοποιεί τον αριθµό σε στοίχιση, πρόσηµο κ.α. width: ελάχιστος αριθµός χαρακτήρων που τυπώνονται precision: Ακρίβεια ∆εκαδικών Ψηφίων length: µετατροπέας του τύπου δεδοµένων specifier: προσδιοριστής

int printf ( const char * format, ... );

%[flags][width][.precision][length]specifier

Λεπτοµέρειες του µεταγλωττιστή:Στην υποενότητα αυτή ξεφεύγουµε και βλέπουµε πλήρως το συντακτικό της printf. Σίγουρα δεν αποτελούν απαραίτητες πληροφορίες για κάποιον που µαθαίνει προγραµµατισµό, αλλά η ύπαρξη του χρησιµεύει ως εγχειρίδιο αναφοράς.

Page 17: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf6. Τυπικό Συντακτικό της printf

17∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Τυπικοί προσδιοριστές της printf:

Προσδιοριστής Τύπος δεδοµένων που αντιστοιχείd or i Προσηµασµένος ακέραιοςu Μη Προσηµασµένος ακέραιοςo Μη Προσηµασµένος Οκταδικόςx Μη Προσηµασµένος 16δικόςX Μη Προσηµασµένος 16δικός (Κεφαλαία)f Πραγµατικός

F Πραγµατικός (Κεφαλαία)e Επιστηµονική ΜορφήE Επιστηµονική Μορφή (Κεφαλαία)a Πραγµατικός ∆εκαεξαδικόςA Πραγµατικός ∆εκαεξαδικός (Κεφαλαία)c Χαρακτήρας

s Πίνακας Χαρακτήρων

p ∆ιεύθυνση ∆είκτη

% Το % ακολουθούµενο από το %, τυπώνει το %

Page 18: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf6. Τυπικό Συντακτικό της printf

18∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

flags:Τροποποιούν την εµφάνιση του αριθµού:

width: Ελάχιστο πλήθος χαρακτήρων που τυπώνονται:

precision: Ακρίβεια ∆εκαδικών Ψηφίων Αντίστοιχα µε το width, είτε βάζουµε αριθµό δεκαδικών ψηφίων, είτε βάζουµε αστέρι και το πλήθος των ψηφίων καθορίζονται µε το επόµενο όρισµα.

Flags Ενέργεια Εκτύπωσης

- Πραγµατοποιεί αριστερή στοίχιση στον αριθµό

+ Τυπώνει το πρόσηµο και για τους θετικούς αριθµούς

# Χρησιµοποιούµενο µε το o,x και X η τιµή που τυπώνεται θα έχει µπροστά 0, 0x και 0X αντίστοιχα

0Γεµίζει εξ’ αριστερών τον αριθµό µε µηδενικά, σε συνδυασµό µε τον προσδιοριστή width.

Width Ενέργεια Εκτύπωσης

Ακέραιος Αριθµός

Ελάχιστος αριθµός δεκαδικών ψηφίων που θα τυπωθούν. Σε περίπτωση που ο αριθµός είναι µικρότερος συµπληρώνεται µε κενά και ακολουθείται δεξιά στοίχιση.

* Το πλάτος δεν προσδιορίζεται µε αριθµό, αλλά µε όρισµα που ακολουθεί την συµβολοσειρά εκτύπωσης.

Page 19: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf6. Τυπικό Συντακτικό της printf

19∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

length: Αλλάζει τον τύπο δεδοµένων της εκτύπωσης

specifiers

length d i u o x X f F e E g G a A

c s p n

(none) int unsigned int double int char* void* int*

hh signed char

unsigned char

signed char*

h short int unsigned short int

short int*

l long int unsigned long int

wint_t wchar_t*

long int*

ll long long int

unsigned long long int

long long int*

j intmax_t uintmax_t

intmax_t *

z size_t size_t

size_t *

t ptrdiff_t ptrdiff_t

ptrdiff_t *

L

long double

Page 20: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

A. Έξοδος ∆εδοµένων2. Η εντολή printf6. Τυπικό Συντακτικό της printf

20∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Και ένα διεστραµµένο παράδειγµα:

/* printf example */#include <stdio.h>

int main()

printf ("Simplirwsi me kena: |%10d| \n", 1980);printf ("Simplirwsi me midenika: |%010d| \n", 1980);printf ("Morfes arithmou: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);printf ("Pragmatikoi: %4.2f %+.0e %E \n", 3.1416, 3. 1416, 3.1416);printf ("Me to asteraki: %*d \n", 5, 10);

Page 21: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

B. Είσοδος ∆εδοµένων1. Γενικά

21∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Η εντολή scanf είναι η βασική συνάρτηση που δέχεται είσοδο από τον χρήστη.

Όπως και µε την printf που είναι η πιο σηµαντική συνάρτηση εξόδου δεδοµένων, έτσι και η scanf είναι η πιο σηµαντική συνάρτηση εισόδου δεδοµένων.

Ας θυµηθούµε από το Μάθηµα 2, τους τρόπους γραφής της scanf και το συντακτικό τους.

Είναι ορισµένη στο αρχείο κεφαλίδας stdio.h, γι’ αυτό πρέπει πάντα να το κάνουµε #include αν θέλουµε να την χρησιµοποιήσουµε.

Page 22: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

B. Είσοδος ∆εδοµένων1. Η εντολή scanf1. Συντακτικό

22∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

H scanf συντάσσεται ως εξης:

Όπως βλέπουµε παίρνει 2 ορίσµατα: Το 1ο όρισµα είναι ο προσδιοριστής του τύπου δεδοµένων που θα διαβάσουµε

Έτσι στη θέση του %x (οπωσδήποτε µέσα σε διπλά εισαγωγικά) µπορούµε να βάλουµε τον προσδιοριστή που θέλουµε

Το 2ο όρισµα είναι υποχρεωτικά το & ακολουθούµενο από το όνοµα της µεταβλητής, στο οποίο θα αποθηκευτεί η τιµή που θα εισάγει ο χρήστης Περισσότερες λεπτοµέρειες για το υποχρεωτικό σύµβολο & που οφείλει να προηγείται από το όνοµα της µεταβλητής θα δούµε σε επόµενο µάθηµα που θα µελετήσουµε τους δείκτες.

Πρακτικά όταν εκτελείται η εντολή scanf το πρόγραµµα «παγώνει» και αναµένει από τον χρήστη να πληκτρολογήσει την είσοδο και να πατήσει Enter. Μόλις γίνει αυτό, η τιµή που πληκτρολόγησε ο χρήστης αποθηκεύεται στην µεταβλητή, και το πρόγραµµα εκτελεί την επόµενη εντολή.

scanf("%x",& µεταβλητή);

Σηµαντική Λεπτοµέρεια: Ο προσδιοριστής για το double δεν είναι %f, αλλά %lf. Συνεπώς για double:• Στην printf ο προσδιοριστής είναι %f (ή %lf)

• Στην scanf ο προσδιοριστής είναι %lf

Page 23: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

B. Είσοδος ∆εδοµένων1. Η εντολή scanf2. Τρόποι Χρήσης

23∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Μπορούµε να εισάγουµε περισσότερες µεταβλητές µε µία εντολή scanf χωρίζοντας µε κενά τους προσδιοριστές.

Το πρόγραµµα θα περιµένει να βάλουµε 2 αριθµούς (στο παράδειγµα έναν ακέραιο και έναν πραγµατικό) Προσοχή! Στην εκτέλεση θα προσπεράσει τυχόν αλλαγές γραµµής και κενά µέχρι να εντοπίσει τους αριθµούς που του είπαµε να διαβάσει.

Έτσι π.χ. Θα δουλέψει αν ο χρήστης εισάγει:

Ή ακόµη αν εισάγει: (δηλ. Αν βάλει περιττά κενά)

Ή ακόµη και αν βάλει περιττές αλλαγές γραµµής ή tabs.

int x;float y;

scanf("%d %f",&x,&y);

2 4.25

8 5.333

• Θεωρούµε καλή τακτική να έχουµε µία scanf για κάθε διάβασµα µεταβλητής. • Επίσης καλό θα είναι να έχουµε και µηνύµατα στον χρήστη για να ξέρει τι πρόκειται να πληκτρολογήσει κάθε φορά!

Page 24: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

Και…

24∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

• ∆εν έχουµε τελειώσει ακόµη µε την είσοδο/έξοδο…• Υπάρχουν ακόµη πολλές συναρτήσεις για την είσοδο/έξοδο.• Θα δούµε και πώς να κάνουµε είσοδο/έξοδο σε αρχεία δίσκου.

• Ο στόχος του µαθήµατος ήταν να µπορέσουµε να έχουµε είσοδο/έξοδο για όλους τους βασικούς τύπους δεδοµένων.

• Τα υπόλοιπα σε επόµενο µάθηµα!

Page 25: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

Γ. Ασκήσεις1. Ένα απλό πρόγραµµα

25∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

1. Γράψτε ένα ολοκληρωµένο πρόγραµµα που θα δέχεται και θα τυπώνει διαφορετικές εισόδους του χρήστη.

2. Συγκεκριµένα η main σας θα προτρέπει το χρήστη να εισάγει έναν αριθµό από το 1 έως το 4(να γίνει έλεγχος ότι ο χρήστης έβαλε αριθµό από 1 έως 4)

1. Αν ο χρήστης εισάγει 1, να διαβάζει µια ακέραια µεταβλητή και να τυπώνει το τετράγωνό της.

2. Αν ο χρήστης εισάγει 2, να καλεί µια συνάρτηση χρήστη (ονοµάστε την print) στην οποία να διαβάζει έναν ακέραιο αριθµό Ν και να τυπώνει Ν φορές τη λέξη Kalimera.

3. Αν ο χρήστης εισάγει 3, να διαβάζει µια float µεταβλητή, και να τυπώνει το ¼ της (δηλαδή να την διαιρεί µε το 4 και να τυπώνει το αποτέλεσµα) µε 4 δεκαδικά ψηφία.

4. Αν ο χρήστης εισάγει 4, να µεταβαίνει σε µία συνάρτηση χρήστη (ονοµάστε την eisagogi_pinaka) που δηλώνει έναν πίνακα 5 double µεταβλητών, διαβάζει τις τιµές τους από το πληκτρολόγιο και τυπώνει τον µέσο όρο τους.

Page 26: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

Γ. Ασκήσεις2. Μία µορφοποιηµένη εκτύπωση

26∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

1. Κατασκευάστε πρόγραµµα που τυπώνει το εξής τρίγωνο:

* *** ***** ******* **************

Page 27: ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 9

Γ. Ασκήσεις3. Ακόµη µία µορφοποιηµένη εκτύπωση

27∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 9: Εισαγωγή στην Είσοδο/Έξοδο ∆εδοµένων

Και τώρα ώρα για εκτύπωση βουνών από αριθµούς::

• (εννοείται ότι απαιτείται το τρίγωνο να κατασκευαστεί µε κατάλληλη χρήση δοµών επανάληψης και όχι µε ξερές printf!)

• Το πρόγραµµα να δουλεύει για οποιαδήποτε Ν από 1 έως 9 (στο παράδειγµα έχουµε Ν=5)

1234554321123455432112345543211234 43211234 43211234 4321123 321123 321123 32112 2112 2112 211 11 11 1