Ασκήσεις - Μελέτες περίπτωσης για το μάθημα Προγραμματισμός II (1) Να καταστρωθεί πρόγραμμα, το οποίο θα διαβάζει δύο αλφαριθμητικά από το πληκτρολόγιο και θα τα μεταβιβάζει στη συνάρτηση str_index(char *s, char *t). Οι δείκτες σε χαρακτήρα θα χειρίζονται τα δύο αλφαριθμητικά. Ακολούθως, μέσω του κώδικα της συνάρτησης θα υπολογίζεται η θέση της δεξιότερης εμφάνισης του αλφαριθμητικού t μέσα στο s, η οποία και θα επιστρέφει στη main. Εάν το t δεν υπάρχει μέσα στο s, θα επιστρέφεται το 0. Στη main θα εμφανίζεται κατάλληλο μήνυμα για τη θέση στην οποία εμφανίζεται το t ή για τη μη εμφάνισή του. Για την ορθή λειτουργία της συνάρτησης str_index απαιτείται χρήση της συνάρτησης strstr, η οποία ορίζεται στο αρχείο κεφαλίδας string.h. Για παράδειγμα, εάν στο s αποδοθεί το αλφαριθμητικό piriminimikirhimi και στο t το αλφαριθμητικό mi, θα πρέπει η συνάρτηση str_index να επιστρέψει ως τιμή το 16, καθώς η δεξιότερη εμφάνιση του mi γίνεται στην 16η και 17η θέση του s. -1/5-
Πάρις Μαστοροκώστας, Προγραμματισμός ΙΙ (2) Να γραφεί πρόγραμμα, το οποίο θα διαβάζει χαρακτήρες από ένα αρχείο κειμένου file1.dat, θα τους εμφανίζει στην οθόνη και θα τυπώνει το πλήθος των προτάσεων, το πλήθος των λέξεων και το πλήθος των χαρακτήρων του κειμένου. Η ανάγνωση των χαρακτήρων θα γίνεται μέσα στη main. Μία πρόταση ολοκληρώνεται όταν αναγνωσθεί ένας εκ των χαρακτήρων. ή ; ή!. Μία λέξη ολοκληρώνεται όταν αναγνωσθεί ένας εκ των χαρακτήρων. ή ; ή! ή ή,. Το πρόγραμμα θα περιλαμβάνει τις ακόλουθες συναρτήσεις: (i) int endofsentence(char ch), η οποία θα δέχεται ένα χαρακτήρα και θα επιστρέφει 1 αν ο χαρακτήρας είναι δηλωτικός του τέλους πρότασης, αλλιώς θα επιστρέφει 0. (ii) int endofword(char ch), η οποία θα δέχεται ένα χαρακτήρα και θα επιστρέφει 1 αν ο χαρακτήρας είναι δηλωτικός του τέλους λέξης, αλλιώς θα επιστρέφει 0. (iii) void displayresults(int s, int w, int c), η οποία θα δέχεται τα πλήθη των προτάσεων, λέξεων και χαρακτήρων και θα τα εμφανίζει στην οθόνη. Σημείωση: Θεωρείται ότι δεν υπάρχουν διαδοχικές εμφανίσεις των χαρακτήρων., ;,!,,,. -2/5-
Ασκήσεις - Μελέτες περίπτωσης (3) Να γραφεί πρόγραμμα, το οποίο: (α) Θα διαβάζει έως το τέλος του το δυαδικό αρχείο input_file.txt, στο οποίο βρίσκονται αποθηκευμένοι ακέραιοι αριθμοί, και θα υπολογίζει το πλήθος τους, το οποίο θα αποθηκεύει στην ακέραια μεταβλητή size. (Υπόδειξη: Για να διαβασθούν τα δεδομένα ένα προς ένα έως το τέλος του αρχείου, χωρίς να είναι γνωστός εκ των προτέρων ο αριθμός τους, μπορεί να χρησιμοποιηθεί ένας πίνακας μίας θέσης, π.χ. arr[1], ως προσωρινός χώρος αποθήκευσης του δεδομένου σε κάθε κλήση της fread(). Λάβετε υπόψη ότι η fread() επιστρέφει έναν ακέραιο που ισούται με τον αριθμό των δεδομένων που ανεγνώσθησαν σε κάθε κλήση της, ανεξάρτητα του αριθμού των δεδομένων που ζητήθηκε να αναγνωσθούν). (β) Θα δεσμεύει μνήμη για size ακέραιους αριθμούς με χρήση της συνάρτησης malloc(). Τη μνήμη θα διαχειρίζεται ο δείκτης σε ακέραιο με όνομα array_ptr. (γ) Θα διαβάζει εκ νέου το αρχείο input_file.txt, αποδίδοντας τους ακεραίους που περιέχει στον πίνακα array_ptr. (δ) Στη συνέχεια θα καλείται η συνάρτηση void pwr(int *array, int array_size), η οποία θα μεταβάλλει τις τιμές των δεδομένων που διαχειρίζεται ο δείκτης array, υψώνοντας στο τετράγωνο κάθε δεδομένο (κλήση της συνάρτησης μέσα στη main: pwr(array_ptr, size);). (ε) H main θα τελειώνει με την εγγραφή στο δυαδικό αρχείο output_file.txt των νέων τιμών των στοιχείων του πίνακα array_ptr, και την απελευθέρωση της δεσμευθείσας μνήμης με χρήση της συνάρτησης free(). Σημείωση: H ανάγνωση από αρχείο και η εγγραφή σε αρχείο να γίνεται με χρήση των συναρτήσεων fread(), fwrite().το δυαδικό αρχείο input_file.txt θεωρείται πως προϋπάρχει. -3/5-
Πάρις Μαστοροκώστας, Προγραμματισμός ΙΙ (4) Για τη διαχείριση των στοιχείων των συνδρομητών μίας εταιρείας που παρέχει υπηρεσίες τηλεφωνίας ορίζεται στη main ο πίνακας customer_list[size] με στοιχεία τύπου δομής CustomerT, η οποία θα περιλαμβάνει το ονοματεπώνυμο του συνδρομητή, τη διεύθυνσή του (σε μεταβλητή τύπου δομής), το επάγγελμά του και τον τηλεφωνικό αριθμό του. Για τη διαχείριση μεμονωμένων συνδρομητών, μέσα στη main ορίζεται η μεταβλητή svar, επίσης τύπου δομής CustomerT. Ο αριθμός των συνδρομητών SIZE καθορίζεται με εντολή προεπεξεργαστή #define. Ζητείται: (α) Nα ορισθεί ο τύπος δομής CustomerT. (β) Να γραφούν συναρτήσεις που να επιτελούν τα ακόλουθα: void save_data( FILE *fp, CustomerT *list ): Aποθήκευση των δεδομένων του πίνακα customer_list στο δυαδικό αρχείο customers.dat. void read_data( FILE *fp, CustomerT *list ): Aνάγνωση των δεδομένων από το αρχείο και αποθήκευσή τους στον πίνακα customer_list. void read_customer( FILE *fp, CustomerT *s, int k ): Προσπέλαση ενός συνδρομητή που βρίσκεται στην k θέση του αρχείου και αποθήκευση των στοιχείων του σε μία μεταβλητή s τύπου CustomerT, η οποία αντιστοιχίζεται σε μεταβλητή svar της main. void save_customer( FILE *fp, CustomerT *s, int k ): Aποθήκευση στο αρχείο των στοιχείων ενός συνδρομητή που βρίσκεται στην k θέση του πίνακα customer_list. H συνάρτηση read_customer() χρησιμοποιείται για να φέρουμε τα στοιχεία του k-στού συνδρομητή από το αρχείο και πιθανώς να τα αλλάξουμε αργότερα. H συνάρτηση save_customer() χρησιμοποιείται όταν έχουμε κάνει αλλαγές στα στοιχεία ενός συνδρομητή και θέλουμε να ενημερώσουμε την εγγραφή του στο αρχείο. (γ) Να γραφεί τμήμα της main που θα περιλαμβάνει μόνο δήλωση των κατάλληλων μεταβλητών και από μία κλήση στις ανωτέρω συναρτήσεις. Παρατήρηση: Απαιτείται η χρήση εργαλείων για τυχαία προσπέλαση δυαδικού αρχείου. -4/5-
Ασκήσεις - Μελέτες περίπτωσης (5) Να γραφεί πρόγραμμα, το οποίο, με χρήση της εντολής fread(), θα διαβάζει ακεραίους από ένα υπάρχον δυαδικό αρχείο file_b.dat έως ότου φθάσει στο τέλος του αρχείου, και θα τους αποθηκεύει σε χώρο αποθήκευσης 10 θέσεων που θα χειρίζεται ο int *buf. Στο τέλος της ανάγνωσης ενός μπλοκ δεδομένων θα καλείται η συνάρτηση int find_max(int cnt, int *buffer), η οποία θα υπολογίζει το μέγιστο ακέραιο σε αυτό το μπλοκ και θα επιστρέφει την τιμή του στη main. Η παράμετρος cnt θα δέχεται τον αριθμό των αναγνωσθέντων ακεραίων και η παράμετρος buffer θα «δείχνει» όπου δείχνει ο buf. Το πρόγραμμα θα τελειώνει με την εμφάνιση στην οθόνη του μέγιστου ακεραίου μέσα στο αρχείο και το μπλοκ στο οποίο βρέθηκε. Σημειώνεται ότι ο δείκτης σε ακέραιο buf υποδηλώνει δυναμική δέσμευση - αποδέσμευση μνήμης για 10 θέσεις ακεραίων. Για παράδειγμα, εάν το αρχείο περιέχει 45 ακεραίους με μέγιστο ακέραιο το 12832 στη 32η θέση, με χώρο αποθήκευσης 10 θέσεων θα απαιτηθούν 5 κύκλοι ανάγνωσης και ο μέγιστος ακέραιος βρίσκεται στο 4ο μπλοκ. -5/5-