Ασκήσεις για το μάθημα Προγραμματισμός II
Να καταστρωθεί πρόγραμμα, το οποίο θα
διαβάζει δύο αλφαριθμητικά από το πληκτρολόγιο και θα τα μεταβιβάζει στη
συνάρτηση 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.
Να γραφεί πρόγραμμα, το οποίο θα διαβάζει
χαρακτήρες από ένα αρχείο κειμένου 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), η οποία θα δέχεται
τα πλήθη των προτάσεων, λέξεων και χαρακτήρων και θα τα εμφανίζει στην οθόνη.
Σημείωση: Θεωρείται ότι δεν υπάρχουν διαδοχικές εμφανίσεις των χαρακτήρων
‘.’, ‘;’, ‘!’, ‘ ’, ‘,’.
Να γραφεί πρόγραμμα, το οποίο:
(α) Θα διαβάζει έως το τέλος του το δυαδικό αρχείο 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 θεωρείται πως
προϋπάρχει.
Για τη διαχείριση των στοιχείων των συνδρομητών
μίας εταιρείας που παρέχει υπηρεσίες τηλεφωνίας ορίζεται στη 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 που θα περιλαμβάνει μόνο δήλωση των κατάλληλων μεταβλητών και
από μία κλήση στις ανωτέρω συναρτήσεις.
Παρατήρηση: Απαιτείται η χρήση εργαλείων για τυχαία προσπέλαση δυαδικού αρχείου.
Να γραφεί πρόγραμμα, το οποίο, με χρήση της
εντολής 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ο μπλοκ.
Να γραφεί πρόγραμμα το οποίο θα επιτελεί τα
ακόλουθα:
1)
Θα δεσμεύει μνήμη για
δισδιάστατο πίνακα ακεραίων arr,
μεγέθους nxm και μονοδιάστατο πίνακα
ακεραίων som, n θέσεων. Τα μεγέθη θα καθορίζονται από το χρήστη κατά το χρόνο
εκτέλεσης του προγράμματος. Η δεσμευθείσα μνήμη θα αποδεσμεύεται στο τέλος της
εκτέλεσης του προγράμματος.
2)
Θα καλείται η συνάρτηση void read_data(int **parr, int n, int m), η οποία θα αποδίδει
τιμές στον arr (έμμεσα) από το
πληκτρολόγιο. Θα γίνεται έλεγχος με χρήση κατάλληλης επαναληπτικής πρότασης
ώστε ο χρήστης να δίνει τιμές που ανήκουν αποκλειστικά στο διάστημα [65,90].
3)
Θα καλείται η συνάρτηση void calc(int **parr, int *psom, int n, int m), η οποία σε κάθε θέση
του som θα τοποθετεί το άθροισμα
της αντίστοιχης γραμμής του arr.
4) Στη
συνάρτηση main() θα
τυπώνονται στην οθόνη οι τιμές του πίνακα som, ενώ θα
εγγράφονται στο αρχείο κειμένου put_data.dat οι ASCII χαρακτήρες που
αντιστοιχούν στις τιμές των στοιχείων του arr.
Να γραφεί πρόγραμμα το οποίο θα επιτελεί τα ακόλουθα:
4)
Θα ορίζει μία δομή vect με μέλη πραγματικούς αριθμούς x
και y.
5)
Θα δεσμεύει μνήμη για
μονοδιάστατο πίνακα arr, μεγέθους n και με στοιχεία τύπου vect.
Το μέγεθος θα καθορίζεται από το χρήστη κατά το χρόνο εκτέλεσης του
προγράμματος. Η δεσμευθείσα μνήμη θα αποδεσμεύεται στο τέλος της εκτέλεσης του
προγράμματος.
6)
Θα καλείται η συνάρτηση void read_data(vect *parr, int n), η οποία θα αποδίδει τιμές στον arr
(έμμεσα) από το πληκτρολόγιο.
7)
Θα καλείται η συνάρτηση void stats(vect *parr, int n), η οποία για το μέλος x
του τύπου vect θα υπολογίζει τη
μέγιστη, την ελάχιστη και τη μέση τιμή των στοιχείων του arr. Θα εκτυπώνει τις στατιστικές τιμές στην οθόνη και τον πίνακα arr στο αρχείο κειμένου put_data.dat.
Να γραφεί πρόγραμμα το οποίο θα επιτελεί τα ακόλουθα:
1) Θα δεσμεύεται μνήμη για μονοδιάστατο
πίνακα ακεραίων Α, μεγέθους n, το οποίο θα καθορίζεται από το χρήστη κατά το
χρόνο εκτέλεσης του προγράμματος. Η δεσμευθείσα μνήμη θα αποδεσμεύεται στο
τέλος της εκτέλεσης του προγράμματος.
2) Θα καλείται η συνάρτηση void read_data(int *pA, int size), η οποία θα αποδίδει τιμές στον Α
(έμμεσα) από το πληκτρολόγιο.
3) Θα καλείται η συνάρτηση void stats(int *pA, int size), η οποία θα υπολογίζει τη μέγιστη, την
ελάχιστη και τη μέση τιμή των στοιχείων του Α. Θα εκτυπώνει τόσο
τον πίνακα Α όσο και τις στατιστικές τιμές στο αρχείο κειμένου put_data.dat.
(Άσκηση 9)
Να
γραφεί πρόγραμμα, το οποίο θα επιτελεί τα ακόλουθα:
Ø
Με χρήση της εντολής fread, θα διαβάζει αριθμούς
κινητής υποδιαστολής απλής ακρίβειας από ένα υπάρχον δυαδικό αρχείο file_b.dat έως ότου φθάσει στο τέλος του αρχείου, και θα τους
αποθηκεύει σε χώρο αποθήκευσης 16 θέσεων, τον οποίο θα διαχειρίζεται ο float *fl_ptr.
Ø
Στο τέλος της ανάγνωσης ενός μπλοκ δεδομένων θα καλείται
η συνάρτηση float get_ave(int cnt, float *flt_ptr), η οποία θα υπολογίζει
τη μέση τιμή των αναγνωσθέντων αριθμών σε αυτό το μπλοκ και θα την επιστρέφει
στη main. Η παράμετρος cnt θα δέχεται τον αριθμό των αναγνωσθέντων αριθμών και η
παράμετρος flt_ptr θα «δείχνει» όπου
«δείχνει» ο fl_ptr.
Ø
Το πρόγραμμα θα τελειώνει με την εμφάνιση στην οθόνη της
μέγιστης και της ελάχιστης από τις μέσες τιμές που υπολογίσθηκαν, καθώς και τα
μπλοκ στα οποία βρέθηκαν.
Σημειώνεται ότι ο δείκτης fl_ptr υποδηλώνει δυναμική
δέσμευση/αποδέσμευση μνήμης για 16 θέσεις αριθμών κινητής υποδιαστολής απλής
ακρίβειας.
Για
παράδειγμα, εάν το αρχείο περιέχει 51 αριθμούς, θα απαιτηθούν 4 κύκλοι
ανάγνωσης. Εάν προκύψουν οι μέσες τιμές 23.1 (επί 16 αναγνωσθέντων αριθμών),
47.2 (επί 16 αναγνωσθέντων αριθμών), -3.9 (επί 16 αναγνωσθέντων αριθμών) και
223 (επί 3 αναγνωσθέντων αριθμών), τότε η μέγιστη μέση τιμή είναι η 223 και
βρίσκεται στο 4ο μπλοκ, ενώ η ελάχιστη μέση τιμή είναι η -3.9 και
βρίσκεται στο 3ο μπλοκ.
Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα επιτελεί τα ακόλουθα:
(1) Θα δέχεται από το πληκτρολόγιο τη διάσταση n ενός τετραγωνικού πίνακα διαστάσεων nxn, ο οποίος θα περιέχει πραγματικούς
αριθμούς. Θα δεσμεύεται δυναμικά η απαραίτητη μνήμη, με χρήση του διπλού
δείκτη float
**pArr. Θα γίνεται
έλεγχος ώστε η διάσταση που θα δώσει ο χρήστης να είναι μεγαλύτερη ή ίση του 3.
(2) Θα λαμβάνει από το πληκτρολόγιο τις τιμές
των στοιχείων του πίνακα pArr.
(3) Θα υπολογίζει σε κάθε γραμμή το στοιχείο με
τη μέγιστη απόλυτη τιμή.
Για το σκοπό αυτό θα αναπτυχθεί η συνάρτηση int getMax(float **pArray, int size,
int i), η οποία θα δέχεται ως ορίσματα το δείκτη pArr, τη διάσταση n του τετραγωνικού πίνακα και τη γραμμή του πίνακα
στην οποία θα γίνει η αναζήτηση του μέγιστου στοιχείου. Η ακέραια επιστρεφόμενη
τιμή θα είναι η στήλη στην οποία βρέθηκε το στοιχείο με τη μέγιστη απόλυτη
τιμή.
(4) Για κάθε γραμμή τού pArr θα απεικονίζει στην οθόνη την απόλυτη
τιμή του μέγιστου στοιχείου και τη στήλη στην οποία βρίσκεται το στοιχείο αυτό.
(5) Θα υπολογίζει το άθροισμα των
στοιχείων της κύριας διαγωνίου (ίχνος του πίνακα).
Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα επιτελεί τα ακόλουθα:
(1) Θα
δέχεται από το πληκτρολόγιο τη διάσταση n ενός τετραγωνικού πίνακα διαστάσεων nxn, ο οποίος θα περιέχει πραγματικούς
αριθμούς. Θα δεσμεύεται δυναμικά η απαραίτητη μνήμη, με χρήση του διπλού
δείκτη float
**pArr. Θα γίνεται
έλεγχος ώστε η διάσταση που θα δώσει ο χρήστης να είναι μεγαλύτερη ή ίση του 3.
(2) Θα
λαμβάνει από το πληκτρολόγιο τις τιμές των στοιχείων του πίνακα pArr.
(3) Θα υπολογίζει τον πίνακα που θα προκύψει
εάν αντιμετατεθούν η δεύτερη με την τρίτη στήλη του pArr και, στη συνέχεια, η πρώτη με την τρίτη γραμμή.
Για το σκοπό αυτό θα αναπτυχθούν δύο συναρτήσεις:
(3.1) Η συνάρτηση void permute_columns(float **pArray, int size,
int column1, int column2), η οποία θα δέχεται ως ορίσματα το δείκτη
pArr, τη διάσταση n του τετραγωνικού πίνακα και τους
αριθμούς των προς αντιμετάθεση στηλών (1 και 2 στην προκειμένη περίπτωση, σύμφωνα με την αρίθμηση πινάκων
στη γλώσσα C). Η
συνάρτηση θα αντιμεταθέτει τη στήλη column1 και τη στήλη column2 του pArray.
(3.2) Η συνάρτηση void permute_lines(float **pArray, int size,
int line1, int line2), η οποία θα δέχεται ως ορίσματα το δείκτη
pArr, τη διάσταση n του τετραγωνικού πίνακα και τους αριθμούς
των προς αντιμετάθεση γραμμών (0 και 2 στην προκειμένη περίπτωση, σύμφωνα με την αρίθμηση πινάκων
στη γλώσσα C). Η συνάρτηση θα
αντιμεταθέτει τη γραμμή line1 και τη γραμμή line2 του pArray.
(4) Θα εμφανίζει στην οθόνη τον πίνακα που
προέκυψε μετά τις αντιμεταθέσεις.
Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα επιτελεί τα ακόλουθα:
(1) Θα
δεσμεύει δυναμικά μνήμη για πίνακες αλφαριθμητικών (δισδιάστατους πίνακες
χαρακτήρων). Για το σκοπό αυτό θα αναπτυχθεί η συνάρτηση char **alloc_2(int size
1, int size2).
H συνάρτηση θα δέχεται τις διαστάσεις του πίνακα και θα επιστρέφει διπλό
δείκτη, ο οποίος θα «δείχνει» στη δεσμευθείσα μνήμη και θα τη διαχειρίζεται
όπως ένας κανονικός πίνακας. Η δέσμευση απαιτεί χρήση της συνάρτησης malloc. Για παράδειγμα, το ζεύγος εντολών char **all; και all=alloc_2(2,41); δηλώνει
το διπλό δείκτη σε χαρακτήρα με όνομα all και δεσμεύει μνήμη για 2x41 χαρακτήρες, δηλαδή για 2 αλφαριθμητικά μήκους
έως 40 θέσεων. Τα 2 αλφαριθμητικά τα διαχειρίζεται ο διπλός δείκτης all.
(2) Με
χρήση της ανωτέρω συνάρτησης θα δεσμευθεί μνήμη 5 φορές:
·
2x41 χαρακτήρες, την οποία θα διαχειρίζεται
ο δείκτης char **all.
·
2x16 χαρακτήρες, την οποία θα διαχειρίζεται
ο δείκτης char **nm.
·
2x16 χαρακτήρες, την οποία θα διαχειρίζεται
ο δείκτης char **nm_new.
·
2x26 χαρακτήρες, την οποία θα διαχειρίζεται
ο δείκτης char **sr.
·
2x26 χαρακτήρες, την οποία θα διαχειρίζεται
ο δείκτης char **sr_new.
(2) Θα δέχεται από το πληκτρολόγιο τα
ονοματεπώνυμα δύο φοιτητών, έως 40 χαρακτήρες το καθένα και δοσμένα με κεφαλαία
λατινικά γράμματα, και θα τα αποθηκεύει στη μνήμη μέσω του **all.
(3) Θα
διαχωρίζει τα μικρά ονόματα από τα επώνυμα και θα τα αποθηκεύει σε δύο
ξεχωριστούς δισδιάστατους πίνακες χαρακτήρων. Tον πίνακα για τα μικρά ονόματα θα τον
διαχειρίζεται ο **nm και τον πίνακα για τα επώνυμα ο **sr.
Για το διαχωρισμό θα αναπτυχθεί η συνάρτηση void separate(char **pall, char
**pnm, char **psr), η οποία θα
δέχεται ως ορίσματα τους all, nm, sr, θα επιτελεί το ζητούμενο διαχωρισμό και
μέσω της κλήσης κατ’ αναφορά (o pnm αντιστοιχίζεται στον nm και ο psr αντιστοιχίζεται στον sr) οι nm και sr θα λαμβάνουν τα μικρά ονόματα και τα επίθετα, αντίστοιχα.
(4) Θα
ταξινομεί αλφαβητικά τα επώνυμα και θα αναδιατάσσει τόσο τα μικρά
ονόματα όσο και τα επώνυμα σε δύο νέους πίνακες, που θα τους διαχειρίζονται οι **nm_new και **sr_new. Θα πρέπει
να ληφθεί μέριμνα ώστε εάν το ένα επώνυμο είναι υποσύνολο του άλλου (π.χ. ΧΑΤΖISAVVAS και ΧΑΤΖIS) ταξινομείται ως πρώτο το συντομότερο εξ αυτών.
Για την κατάταξη θα αναπτυχθεί η συνάρτηση void sort(char **pnm, char
**psr, char **pnm_new,
char **psr_new), η οποία θα
δέχεται ως ορίσματα τους nm, sr, nm_new, sr_new, θα επιτελεί
τη ζητούμενη κατάταξη κατ’ αλφαβητική σειρά, και μέσω της κλήσης κατ’ αναφορά (o pnm_new
αντιστοιχίζεται στον nm_new και ο psr_new αντιστοιχίζεται στον sr_new) οι nm_new και sr_new θα λαμβάνουν
τα μικρά ονόματα και τα επίθετα, αντίστοιχα, μετά την κατάταξη.
(5) Θα
εμφανίζει τους πίνακες nm, sr, nm_new, sr_new στην οθόνη.
(6) Για
την απελευθέρωση της δεσμευθείσας μνήμης θα αναπτυχθεί η συνάρτηση void free_2(char
**deiktis,
int size1), η οποία θα δέχεται το όνομα ενός διπλού δείκτη
σε χαρακτήρα και την πρώτη διάσταση του πίνακα, στον οποίο αυτός δείχνει, και
με χρήση της συνάρτησης free απελευθερώνει
την αντίστοιχη μνήμη.
Για παράδειγμα, η κλήση της συνάρτησης free_2(all,2); απελευθερώνει τη μνήμη που δεσμεύθηκε στο
βήμα (2) με το δείκτη all. Αντίστοιχες κλήσεις της free_2 θα οδηγήσουν στην αποδέσμευση της μνήμης που δεσμεύθηκε στο βήμα (2) με
τους διπλούς δείκτες nm, sr, nm_new, sr_new.
Δίνεται ότι:
·
Τα
ονοματεπώνυμα δόθηκαν σωστά, με κεφαλαία λατινικά γράμματα, και δεν απαιτείται
έλεγχος γι’ αυτό.
·
Όταν
ο χρήστης πληκτρολογεί ένα ονοματεπώνυμο διαχωρίζει το όνομα από το επώνυμο με
απλό κενό.
·
Κάθε
μικρό όνομα και επώνυμο είναι απλό, δεν περιέχει διπλά ονόματα, τίτλους
ευγενείας ή άλλου είδους προσφωνήσεις.
Επαλήθευση: Εάν
ο χρήστης δώσει “JOAN JAMESON” και “ANDREW DOE”,
οδηγούμαστε
στους ακόλουθους πίνακες:
all[0] = “JOAN JAMESON” all[1] = “ANDREW DOE”
nm[0] =
“JOAN” nm[1] = “ANDREW”
sr[0] = “JAMESON” sr[1] = “DOE”
nm_new[0] = “ANDREW” nm_new[1] = “JOAN”
sr_new[0] = “DOE” sr_new[1] = “JAMESON”
Δημιουργείστε
τον τύπο δεδομένου δομής time, που θα αποτελείται από τις τρεις ακέραιες μεταβλητές hour, min, sec.
Γράψτε τις ακόλουθες
συναρτήσεις :
I.
void scanTime(
time *t ), η οποία θα λαμβάνει από το πληκτρολόγιο τιμές
και θα τις αποδίδει στη μεταβλητή του ορίσματός της. Τα αποτελέσματα θα
τυπώνονται σε αρχείο file1.dat, το οποίο θα δημιουργείται και θα κλείνει
μέσα στη συνάρτηση scanTime.
II.
void printTime(
time *t ), η οποία θα τυπώνει στην οθόνη το περιεχόμενο της
μεταβλητής του ορίσματός της.
III.
int TimeInSec(
time *t), η οποία θα επιστρέφει σε δευτερόλεπτα τον χρόνο
που ορίζει η μεταβλητή του ορίσματός της.
IV.
time SecInTime(
int sec ), η οποία θα δέχεται στο όρισμα της τον χρόνο σε
δευτερόλεπτα και θα αποδίδει στην μεταβλητή που την καλεί (μεταβλητή τύπου
δομής time) το χρόνο σε
ώρες, λεπτά, δευτερόλεπτα.
Να δοθούν οι εντολές δυναμικής δέσμευσης και
απελευθέρωσης μνήμης για έναν πίνακα ακεραίων 3x2x3.
(Άσκηση 15)
Να γραφεί πρόγραμμα κωδικοποίησης δεδομένων, το οποίο θα
επιτελεί τα παρακάτω:
Θα διαβάζει N τετραψήφιους αριθµούς , οι οποίοι βρίσκονται αποθηκευμένοι στο αρχείο x_file.txt. Μετά από κάθε ανάγνωση
αριθμού, ο
θα μετασχηματίζεται
στον κωδικοποιημένο αριθμό
, ο οποίος θα αποθηκεύεται στο αρχείο y_file.txt. Ακολουθείται η εξής µέθοδος
µετασχηµατισµού:
Ø Για κάθε αριθµό της µορφής , όπου ως
, k=3,2,1,0 συμβολίζονται τα τέσσερα ψηφία, υπολογίζεται ο αριθµός
όπου το
ψηφίο
προκύπτει
ως το υπόλοιπο της διαίρεσης του αριθµού (
+7) µε το 10.
Ø Ακολούθως αντιµετατίθεται το
πρώτο ψηφίο του αριθμού µε το τρίτο και το
δεύτερο µε το τέταρτο. Κατά συνέπεια ο αριθµός
µετασχηµατίζεται
στον αριθμό
.
Ο μετασχηματισμός
θα υλοποιείται με τη συνάρτηση int transform(int x), η οποία θα δέχεται τον αριθμό και θα επιστρέφει τον
αριθμό
. Μέσα στη συνάρτηση transform() θα χρησιμοποιούνται οι
ακόλουθες συναρτήσεις:
α) Η
συνάρτηση void give_digits(int x, int *arr), η οποία θα δέχεται ως εισόδους έναν τετραψήφιο θετικό
ακέραιο και έναν δείκτη που
δείχνει σε πίνακα τεσσάρων θέσεων, στον οποίο θα αποθηκευθούν τα ψηφία του
αριθμού
.
β) Η συνάρτηση
void swap_digits(int *arr), η οποία θα δέχεται ως είσοδο δείκτη,
ο οποίος θα δείχνει στον πίνακα που βρίσκονται αποθηκευμένα τα ψηφία ,
,
,
και θα αντιμεταθέτει τις τιμές τους σύμφωνα με την ανωτέρω
μέθοδο μετασχηματισμού.
β) Η
συνάρτηση int get_digits(int *arr), η οποία δέχεται ως είσοδο δείκτη που
δείχνει σε πίνακα τεσσάρων θέσεων, στον οποίο βρίσκονται αποθηκευμένα τα
τέσσερα ψηφία ,
,
,
, και επιστρέφει τον αριθμό
.
Να
γραφεί πρόγραμμα το οποίο θα διαβάζει το αρχείο κειμένου file1.dat έως το τέλος του και θα βρίσκει πόσες φορές
υπάρχει ο χαρακτήρας ‘b’ στο αρχείο.
α) Να
δημιουργηθεί ο τύπος δεδομένου δομής paral, που θα αποτελείται από τις πραγματικές
μεταβλητές a, b.
β) Να
γραφούν οι ακόλουθες συναρτήσεις :
V.
void readparal(paral *c), η οποία θα
λαμβάνει από το πληκτρολόγιο τιμές και θα τις αποδίδει στη μεταβλητή που
δείχνει η τυπική παράμετρος της συνάρτησης.
VI.
void printparal(paral *c), η οποία θα
τυπώνει στην οθόνη το περιεχόμενο της μεταβλητής στην οποία δείχνει η τυπική
παράμετρος της συνάρτησης.
VII. float paralarea(paral
*c), η οποία θα επιστρέφει στην καλούσα
συνάρτηση το εμβαδόν του
παραλληλογράμμου που περιγράφεται από τη μεταβλητή στην οποία δείχνει η
τυπική παράμετρος της συνάρτησης.
γ) Να
γραφεί ο κώδικας της main(), μέσα στην οποία
θα δημιουργείται η μεταβλητή τύπου paral με όνομα pr, θα καλούνται διαδοχικά οι τρεις συναρτήσεις με πραγματική παράμετρο τη
διεύθυνση της sq και θα αποδίδεται στη μεταβλητή area το εμβαδό που θα προκύψει από την συνάρτηση paralarea().
Να γραφεί πρόγραμμα, το οποίο θα δημιουργεί πίνακα
3 στοιχείων, με στοιχεία δομές. Κάθε δομή θα έχει ως μέλη τον τύπο αυτοκινήτου,
τον αριθμό κυκλοφορίας (string) και το έτος αγοράς. Το πρόγραμμα θα διαβάζει τα
περιεχόμενα του πίνακα από το αρχείο file1.dat και θα τα γράφει σε ένα
άλλο αρχείο, το file2.dat.
Να
γραφεί μία συνάρτηση, η οποία θα δέχεται ως ορίσματα: α) τη διεύθυνση του πρώτου στοιχείου ενός πίνακα ακεραίων και β) το πλήθος των στοιχείων του, και θα επιστρέφει
το άθροισμα των τετραγώνων των στοιχείων του πίνακα.
Να γραφεί πρόγραμμα, στο οποίο θα διαβάζονται χαρακτήρες από το
πληκτρολόγιο και θα εγγράφονται σε δυαδικό αρχείο, το οποίο λόγω της φύσης των
περιεχομένων του είναι αναγνώσιμο με τους συντάκτες κειμένου. Ως συνθήκη
τερματισμού θεωρείται η ανάγνωση του δολαρίου ($).
Ακολούθως με χρήση της συνάρτησης
void
read_character(FILE *fp, char *s, int k)
να διαβάζεται ο 14ος χαρακτήρας, χρησιμοποιώντας τυχαία προσπέλαση του
αρχείου.
Η συνάρτηση
void
save_character(FILE *fp, char *s, int k)
τοποθετεί στη 14η θέση του αρχείου το χαρακτήρας !.