ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ...

24
H ΓΛΩΣΣΑ C Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα ∆ηµήτρης Ψούνης

Transcript of ΓΛΩΣΣΑ C - ΜΑΘΗΜΑ 17 - ΕΠΙΚΟΙΝΩΝΙΑ ΜΕ ΤΟ ΛΕΙΤΟΥΡΓΙΚΟ...

H ΓΛΩΣΣΑ C

Μάθηµα 17:

Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

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

Περιεχόµενα ΜαθήµατοςA. Επικοινωνία µε το Λειτουργικό Σύστηµα

1. Γενικά

2. Λειτουργικό Σύστηµα3. Ορίσµατα Γραµµής Εντολής

1. Ορισµός της main µε ορίσµατα2. Παράδειγµα µε διαφορετικό πλήθος ορισµάτων3. Μετατροπή συµβολοσειράς σε άλλο τύπο δεδοµένων

4. Ανακατεύθυνση Εισόδου / Εξόδου1. Ανακατεύθυνση εξόδου2. Ανακατεύθυνση εισόδου

B. Ασκήσεις

2∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

A. Επικοινωνία µε το Λειτουργικό Σύστηµα1. Γενικά

3∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Στο µάθηµα αυτό το πρόγραµµα µας θα αλληλεπιδράσει µε το λειτουργικό σύστηµα.

Θα δούµε πως το πρόγραµµά µας µπορεί να λάβει ορίσµατα από την γραµµή εντολής (DOS)

Επίσης θα δούµε πως µπορούµε να ανακατευθύνουµε την είσοδο και την έξοδο από τις συνήθεις ροές σε αρχεία!

A. Επικοινωνία µε το Λειτουργικό Σύστηµα2. Λειτουργικό Σύστηµα

4∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Το λειτουργικό σύστηµα είναι το «πρόγραµµα» που τρέχει άλλα προγράµµατα: Το πιο συνηθισµένο είναι τα “Windows” στις διάφορες εκδόσεις του, της εταιρίας Microsoft

Υπάρχουν πολλά ακόµη λειτουργικά συστήµατα όπως είναι το MAC OS, το UNIX, το LINUX στις διάφορες εκδόσεις τους.

Ο «µπαµπάς» των Windows είναι το DOS, στο οποίο (τα αρχαία χρόνια) γραφόντουσαν απευθείας εντολές στο λειτουργικό σύστηµα όπως για παράδειγµα: Η εντολή “dir” που εµφανίζει τα περιεχόµενα του τρέχοντος καταλόγου. Η εντολή “cls” που διαγράφει τα περιεχόµενα της οθόνης. Η εντολή “cd” που αλλάζει τον τρέχοντα κατάλογο Και γενικά να γράψουµε το όνοµα ενός προγράµµατος και να το τρέξουµε.

Στα Windows δίνεται η δυνατότητα να τρέξουµε εντολές µέσω της κονσόλας (όπως κάποτε ήταν το DOS) και να τρέξουµε τα προγράµµατά µας.

A. Επικοινωνία µε το Λειτουργικό2. Λειτουργικό Σύστηµα

5∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Για παράδειγµα, πηγαίνοντας «Εναρξη=>Γραµµή Εντολών» (start=>command prompt) µπορούµε να τρέξουµε τις εντολές DOS.

Στην παρακάτω οθόνη φαίνονται τα περιεχόµενα του καταλόγου του προηγούµενου µαθήµατος:

A. Επικοινωνία µε το Λειτουργικό2. Λειτουργικό Σύστηµα

6∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Εδώ µπορούµε να εκτελέσουµε ένα από τα προγράµµατα γράφοντας απλά το όνοµα του:

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής1. Ορισµός της main µε ορίσµατα

7∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Υπάρχει η δυνατότητα να λαµβάνουµε τιµές από την κλήση του προγράµµατος από την γραµµή εντολής ως εξής:

Ορίζουµε ορίσµατα γραµµής εντολής τροποποιώντας το πρωτότυπο της main:

Όπου κάνοντας κατάλληλη κλήση του προγράµµατος: το πλήθος των συµβολοσειρών (+1) που ακολουθούν το όνοµα του προγράµµατος αποθηκεύεται την µεταβλητή argc

τα ορίσµατα της γραµµής εντολής έχουν αποθηκευτεί ως συµβολοσειρές στις διαδοχικές θέσεις (argv[1],argv[2],… argv[argc-1])

Η συµβολοσειρά argv[0] αποθηκεύει το όνοµα του εκτελέσιµου προγράµµατος µαζί µε το πλήρες όνοµα του καταλόγου του αρχείου.

main(int argc, char *argv[])...

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής1. Ορισµός της main µε ορίσµατα

8∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Μεταγλωττίστε το ακόλουθο πρόγραµµα:

Και εκτελέστε το από το DEV-C++. Θα παρατηρήσετε ότι εχουµε µήνυµα λάθους!

/* argc_argv.c: programma epideiksislipsis orismatwn apo ti grammi entolis */

#include <stdio.h>

main(int argc, char *argv[])

printf("Plithos = %d",argc);

printf("\nOrismata = %s kai %s",argv[1],argv[2]);

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής1. Ορισµός της main µε ορίσµατα

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

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

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής2. Παράδειγµα µε διαφορετικό πλήθος ορισµάτων

10∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Το ακόλουθο πρόγραµµα επιδεικνύει την αρχικοποίηση των ορισµάτων γραµµής εντολής ανάλογα µε τα ορίσµατα που διοχετεύουµε:

Πειραµατιστείτε µε το πρόγραµµα βάζοντας διαφορετικό πλήθος ορισµάτων γραµµής εντολής!

/* argc_argv_loop.c Epideikniei tin xrisiorismatwn grammis entolis */

#include <stdio.h>

main(int argc, char *argv[])

int i;

printf("argc=%d",argc);for (i=0; i<argc; i++)

printf("\nargv[%d]=%s",i,argv[i]);

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής3. Μετατροπή συµβολοσειράς σε άλλο τύπο δεδοµένων

11∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Επειδή τα ορίσµατα αποθηκεύονται ως συµβολοσειρές, πολύ χρήσιµη θα είναι η συνάρτηση

που έχει οριστεί στο

Η συνάρτηση παίρνει σαν όρισµα µία συµβολοσειρά (που κωδικοποιεί έναν ακέραιο) και επιστρέφει τον ακέραιο αριθµό σε τύπο int.

To παράδειγµα της επόµενης διαφάνειας αναδεικνύει τη χρήση της atoi.

int atoi(char *s)

stdlib.h

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής3. Μετατροπή συµβολοσειράς σε άλλο τύπο δεδοµένων

12∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Το πρόγραµµα αναδεικνύει τη χρήση της atoi:

/* atoi.c: epideikniei tin sinartisi atoi */

#include <stdio.h>

main(int argc, char *argv[])

int x,y;

if(argc!=3)

printf("Prepei na eisagete 2 orismata!");else

x=atoi(argv[1]);y=atoi(argv[2]);

printf("\nOrismata = %d kai %d",x,y);

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής3. Μετατροπή συµβολοσειράς σε άλλο τύπο δεδοµένων

13∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Αντίστοιχα ορίζονται συναρτήσεις που µετατρέπουν µια συµβολοσειρά σε άλλους τύπους δεδοµένων:

Συναρτηση Ενέργεια Βιβλιοθήκη

int atoi(char *s) Μετατρέπει την s σε int stdlib.h

long atol(char *s) Μετατρέπει την s σε long stdlib.h

long long atoll(char *s) Μετατρέπει την s σε long long stdlib.h

double atof(char *s)Μετατρέπει την s σε double stdlib.h

A. Επικοινωνία µε το Λειτουργικό3. Ορίσµατα Γραµµής Εντολής4. Προχωρηµένες συναρτήσεις µετατροπής συµβολοσειράς

14∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Αντίστοιχα ορίζονται συναρτήσεις που µετατρέπουν µια συµβολοσειρά σε άλλους τύπους δεδοµένων:

Οι συναρτήσεις αυτές δέχονται ως όρισµα µία συµβολοσειρά και την µετατρέπουν στον αντίστοιχο τύπο δεδοµένων, αλλά: Μέσω του δείκτη p επιστρέφουν και την υπόλοιπη συµβολοσειρά

Π.χ. αν η συµβολοσειρά που βάλει ο χρήστης είναι 0.54fd, τότε η strtod θα επιστρέψει το 0.54 και ο δείκτης p θα είναι ίσος µε τη συµβολοσειρά «fd».

To όρισµα base καθορίζει το σύστηµα αρίθµηση στο οποίο είναι γραµµένος ο αριθµός s (π.χ. µπορεί να είναι γραµµένος στο 8-αδικό σύστηµα αρίθµησης) Για δεκαδικό σύστηµα αρίθµησης, το όρισµα µπορεί να είναι 0.

Συνάρτηση Ενέργεια Βιβλιοθήκη

double strtod( const char *s, char **p);Μετατρέπει την s σε double

stdlib.h

long strtol( const char *s, char **p,

int base );

Μετατρέπει την s σε long

stdlib.h

unsigned long strtoul( const char *s,

char **p, int base );

Μετατρέπει την s σε long long

stdlib.h

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου1. Ανακατεύθυνση Εξόδου

15∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

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

Η ανακατεύθυνση γίνεται µέσω εντολής στο λειτουργικό:

Με τον τρόπο αυτό µπορούµε να «κρατάµε» τα αποτελέσµατα της εκτέλεσης σε ένα αρχείο

program > ονοµα-αρχειου

stdout

stdin

file

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου1. Ανακατεύθυνση Εξόδου

16∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Για παράδειγµα έστω το ακόλουθο πρόγραµµα:

Το οποίο είναι ένα τυπικό πρόγραµµα εκτύπωση τυχαίων τριψήφιων αριθµών!

/* redirect_output.c: tha to xrisimopoiisoumegia anakateuthinsi eksodou */

#include <stdio.h>#include <stdlib.h>#include <time.h>

main()

int i;

srand(time(NULL));for (i=0; i<20; i++)

printf("%d\n",rand()%1000);

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου1. Ανακατεύθυνση Εξόδου

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

Και το τρέξουµε από την κονσόλα ως εξής:

Τότε δεν θα παρατηρήσουµε κάποια έξοδο στην οθόνη:

redirect_output > file.txt

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου1. Ανακατεύθυνση Εξόδου

18∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

∆ιότι η έξοδος θα έχει ανακατευθυνθεί από την stdout στο αρχείο κειµένου file.txt (To οποίο µπορούµε να χειριστούµε πλέον ως ένα ακόµη αρχείο κειµένου!) Έτσι π.χ. αν το ανοίξουµε θα δούµε το αποτέλεσµα των ενεργειών µας:

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου2. Ανακατεύθυνση Εισόδου

19∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Η ανακατεύθυνση εισόδου χρησιµοποιείται για να µην διαβάζονται τα δεδοµένα από την stdinαλλά π.χ. από ένα αρχείο!

Η ανακατεύθυνση γίνεται µέσω εντολής στο λειτουργικό:

Με τον τρόπο αυτό µπορούµε να διαβάζουµε τα δεδοµένα από αρχείο.

program < ονοµα-αρχειου

stdout

stdin

file

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου2. Ανακατεύθυνση Εισόδου

20∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Το ακόλουθο πρόγραµµα θα αρχικοποιούσε από την είσοδο έναν πίνακα 20 ακεραίων:/* redirect_input.c: tha to xrisimopoiisoume

gia anakateuthinsi eisodou */

#include <stdio.h>#define N 20

main()

int i;int array[N];

for (i=0; i<N; i++)

printf("Dwse ton epomeno arithmo: ");scanf("%d", &array[i]);

printf("\nPeriexomena Pinaka: ");for (i=0; i<N; i++)

printf("%d ",array[i]);

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου2. Ανακατεύθυνση Εισόδου

21∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Και το τρέξουµε από την κονσόλα ως εξής:

Τότε θα παρατηρήσουµε την εξής έξοδο:

redirect_input < file.txt

A. Επικοινωνία µε το Λειτουργικό4. Ανακατεύθυνση Εισόδου-Εξόδου2. Ανακατεύθυνση Εισόδου

22∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Συνεπώς ο πίνακας µας αρχικοποιείται µε τις τιµές που υπάρχουν στο αρχείο!:

Παρατηρήσεις:1. Η ανακατεύθυνση εισόδου – εξόδου είναι µέρος του λειτουργικού συστήµατος (Windows,

UNIX) κ.λπ. και όχι µέρος της C1. Για το λόγο αυτό δεν θα επεκταθούµε περαιτέρω στη µελέτη αυτή.2. Για περισσότερα απαιτείται µελέτη των λειτουργικών συστηµάτων.

2. Επίσης αν και φαίνεται πολύ ελκυστική διότι πλέον δεν θα χρειάζεται η πληκτρολόγηση της εισόδου,

• Θα προτιµήσουµε την χρησιµοποίηση έτοιµων συναρτήσεων που µας παρέχει η C για τον χειρισµό αρχείων (όπως π.χ. η fprintf και η fscanf) τις οποίες και θα µελετήσουµε σε επόµενο µάθηµα

Β. ΑσκήσειςΕφαρµογή 1: ∆ιαχείριση Συµβολοσειρών

23∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Γράψτε ένα πρόγραµµα το οποίο:1. Θα διαβάζει από τα ορίσµατα γραµµής εντολής ακεραίους αριθµούς2. Θα δεσµεύει δυναµικά έναν πίνακα τόσων θέσεων όσα και τα ορίσµατα που δέχθηκε3. Θα ταξινοµεί τον πίνακα µε χρήση της insertion-sort4. Θα τυπώνει τον ταξινοµηµένο πίνακα.

Υποδείξεις:1. Το µέγεθος του πίνακα θα είναι ίσο µε argc-12. Χρησιµοποιήστε την υλοποίηση της insertion-sort που κατασκευάσαµε στο µάθηµα

«Αλγόριθµοι σε C – Μάθηµα 3: Ταξινόµηση Πίνακα»3. Μην ξεχάσετε να απελευθερώσετε τη µνήµη που δεσµεύσατε δυναµικά.

Β. ΑσκήσειςΕφαρµογή 2: Κατασκευή ενός medium

24∆ηµήτρης Ψούνης, Η Γλώσσα C, Μάθηµα 17: Είσοδος/Έξοδος: Επικοινωνία µε το Λειτουργικό Σύστηµα

Προσληφθήκαµε ως προγραµµατιστές στην εταιρία προβλέψεων «Μπάµπα Βάνγκα» ώστε να γράψουµε ένα πρόγραµµα το οποίο θα διαβάζει µέσω ορισµάτων γραµµής εντολής: Το όνοµα, το επώνυµο, την ηλικία και το ύψος ενός ατόµου (µε αυτήν τη σειρά) και:1. Θα υπολογίζει τον λεξάριθµο του ονόµατος (άθροισµα των αντίστοιχων αριθµών (Α=1, B=2,

C=3 κ.λπ.))2. Θα υπολογίζει τον λεξάριθµο του επωνύµου (οµοίως µε το όνοµα)3. Θα πολλαπλασιάζει την ηλικία επί 104. Θα πολλαπλασιάζει το ύψος επί 1005. Θα αθροίζει τα επιµέρους αποτελέσµαταΈπειτα το πρόγραµµα-Μπάµπα θα προβλέπει µε βάση το αποτέλεσµα:• Αν είναι µεταξύ 1 και 300: Θα τυπώνει «Η Μπάµπα λέει: Σεισµός και Καταποντισµός»• Αν είναι µεταξύ 301 και 600: Θα τυπώνει «Η Μπάµπα λέει: Λιµός και Πόλεµος»• Αν είναι µεταξύ 601 και 1000: Θα τυπώνει «Η Μπάµπα λέει: Αρρώστια και Κασίδα»• Αν είναι πάνω από 1000: Θα τυπώνει «Η Μπάµπα λέει: ∆ώσε άλλα 100 ευρώ», τυχαία θα

επιλέγει έναν αριθµό από το 1 έως το 1000 και θα τυπώνει το ανάλογο µήνυµα.