2ο ΣΕΤ ΑΣΚΗΣΕΩΝ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ
ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ
ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ
ΠΛΗΡΟΦΟΡΙΚΗΣ
2ο ΣΕΤ ΑΣΚΗΣΕΩΝ
Οι ασκήσεις αυτού του φυλλαδίου καλύπτουν τα παρακάτω θέματα:




Συναρτήσεις (κεφάλαιο Functions)
Πίνακες (κεφάλαιο Αrrays)
Δείκτες
Δομές
Το δεύτερο σύνολο ασκήσεων θα εξετασθεί την εβδομάδα 12-18.01.2015 (ο κάθε
φοιτητής θα εξεταστεί την ώρα του τμήματός του, για κάθε υποερώτημα ο φοιτητής
θα πρέπει να έχει το αντίστοιχο αρχείο κώδικα C αποθηκευμένο στο λογαριασμό του
στο diogenis.ceid.upatras.gr το οποίο θα πρέπει να έχει μεταγλωττιστεί χωρίς
σφάλματα, ενώ για το σύνολο των ερωτημάτων θα πρέπει να έχει φέρει και μια
εκτυπωμένη αναφορά με τις απαντήσεις του ).
Σημείωση: αν χρειάζεται συμπερίληψη της βιβλιοθήκης <math.h>, τότε θα πρέπει η
μεταγλώττιση να πραγματοποιηθεί με την οδηγία –lm, δηλαδή η μεταγλώττιση να
γίνει ως εξής:
gcc –lm ονομα_αρχείου
Άσκηση 1
Να υλοποιήσετε τον αλγόριθμο ταξινόμησης BubbleSort. Ο Bubblesort είναι ένας απλός
αλγόριθμος ταξινόμησης (http://en.wikipedia.org/wiki/Bubble_sort) που λειτουργεί
σαρώνοντας όλη την ακολουθία στοιχείων που πρέπει να διαταχθεί, συγκρίνοντας κάθε
ζεύγος γειτονικών στοιχείων και εναλλάσοντάς τα αν είναι σε λάθος σειρά. Το πέρασμα
από την ακολουθία στοιχείων επαναλαμβάνεται έως ότου δεν χρειάζεται να υπάρχουν
εναλλαγές στιοιχειων, γεγονός που υποδεικνύει ότι η ακολουθία είναι ταξινομημένη.
Τα στοιχεία τα οποία πρέπει να ταξινομηθούν είναι ακέραιοι σε έναν πίνακα μεγέθους 10.
Για δική σας διευκόλυνση να φτιάξετε μία συνάρτηση η οποία θα τυπώνει τον πίνακα και
θα τη χρησιμοποιείτε όταν συμβαίνει μία εναλλαγή μεταξύ στοιχείων του πίνακα. Τα
στοιχεία του πίνακα θα τα δίνετε εσείς από το πληκτρολόγιο. Μία δεύτερη συνάρτηση
μπορεί να είναι αυτή η οποία θα πραγματοποιεί την εναλλαγή μεταξύ δύο στοιχείων του
πίνακα.
Άσκηση 2
Mε τη βοήθεια δομών και συναρτήσεων να υλοποιήσετε τις πράξεις πρόσθεση, αφαίρεση,
και πολλαπλασιασμό και των μιγαδικών αριθμών. Για την αναπαράσταση μιγαδικών
αριθμών θα χρησιμοποιήσετε μία δομή με δυο μέλη πραγματικούς αριθμούς και για τις
διάφορες πράξεις να θεωρήσετε την υλοποίηση που περιγράφεται στη διεύθυνση:
http://el.wikipedia.org/wiki/Μιγαδικός_αριθμός (κάθε πράξη να υλοποιηθεί με μια διακριτή
συνάρτηση).
Άσκηση 3
Να γραϕεί πρόγραμμα που θα ζητάει από το χρήστη να του δώσει τις διαστάσεις για να
κατασκευάσει ένα δισδιάστατο πίνακα ακεραίων. Μόλις ο χρήστης δώσει τις δύο
διαστάσεις, το πρόγραμμα θα δεσμεύει δυναμικά μνήμη για τον πίνακα με χρήση της malloc
και θα διαβάζει από τον χρήστη μια τιμή για κάθε στοιχείο του πίνακα. Στη συνέχεια, να
κατασκευαστεί συνάρτηση, η οποία θα καλείται από το πρόγραμμα και να εκτελεί τα
παρακάτω:
• να υπολογίζει την ελάχιστη τιμή κάθε γραμμής του πίνακα και θα το αποθηκεύει σ' ένα
νέο πίνακα.
• να επιστρέϕει το νέο πίνακα στο κύριο πρόγραμμα.
Το κύριο πρόγραμμα θα πρέπει να εκτυπώνει τα στοιχεία του νέου πίνακα που
δημιουργήθηκε απ' τη συνάρτηση.
Άσκηση 4
Ο ΦΠΑ ενός προιόντος μπορεί να ανήκει στις παρακάτω κατηγορίες:
Κατηγορία Ποσοστό ΦΠΑ
1
0.00
2
0.06
3
0.13
4
0.19
Να γραφεί πρόγραμμα το οποίο θα ζητάει να πληκτρολογήσουμε το πλήθος, την τιμή
μονάδας, και την κατηγορία ΦΠΑ για 10 προϊόντα. Το πρόγραμμα θα πρέπει να εμφανίζει
το συνολικό κόστος της δαπάνης, καθώς και το σύνολο του ΦΠΑ για όλα τα προϊόντα που
αγοράσαμε. Ο υπολογισμός του ΦΠΑ πρέπει να υλοποιείται από μια συνάρτηση στην οποία
θα μεταβιβάζεται το συνολικό ποσό ανά προϊόν, καθώς και η κατηγορία ΦΠΑ στην οποία
ανήκε.
Άσκηση 5
Φτιάξτε πρόγραμμα το οποίο υπολογίζει το γινόμενο δύο πινάκων. Αυτό το πρόγραμμα
δέχεται ως είσοδο δύο πίνακες και μετά τους πολλαπλασιάζει. Θεωρήστε ότι ο μέγιστος
αριθμός γραμμών και στηλών είναι 10. Στο συγκεκριμένο πρόγραμμα θα κατασκευάσετε
τις συναρτήσεις readMatrix(), printMatrix() και productMatrix() οι οποίες θα διαβάζουν
έναν πίνακα, θα εκτυπώνουν τον πίνακα και θα υπολογίζουν το γινόμενό δύο πινάκων
αντίστοιχα. Μέσα στη main() θα καλείτε τη readMatrix() η οποία θα παίρνει ως ορίσματα
τον αριθμό των στηλών και γραμμών για να γίνεται η ανάγνωση του πρώτου πίνακα κι
έπειτα θα τον εκτυπώνετε με την printMatrix(), έπειτα θα κάνετε το ίδιο με το δεύτερο
πίνακα και τέλος θα καλείτε την productMatrix() στην οποία θα γίνεται ο πολλαπλασιασμός
των πινάκων.
Σημείωση. Το γινόμενο δύο πινάκων Α, διαστάσεων n x m, και Β διαστάσεων m x t είναι
ένας πίνακας C διαστάσεων n x t, όπου οι τιμές των κελιών του C[i][j] (με 0<=i<=n-1, και
0<=j<=t-1) υπολογίζονται βάση του τύπου:
m 1
C[i][ j ]   A[i][k ] * B[k ][ j ] .
k 0
Άσκηση 6
Να υλοποιήσετε ένα πρόγραμμα που να διαχειρίζεται τα στοιχεία ενός καταστήματος
ενοικίασης αυτοκινήτων. Το πρόγραμμα θα πρέπει να παρέχει τις εξής δυνατότητες:
1. Προσθήκη ενός καινούριου αυτοκινήτου στο κατάστημα,
2. Παρουσίαση στην οθόνη των στοιχείων ενός αυτοκινήτου δοθέντος του κωδικού του
του,
3. Ενοικίαση ενός αυτοκινήτου δοθέντος του κωδικού του. Στη περίπτωση που δεν
μπορεί να πραγματοποιηθεί ενοικίαση θα πρέπει να υπάρχει πληροφορία.
4. Παρουσίαση στην οθόνη όλων των αυτοκίνήτων και παρουσίαση του πλήθους των
αυτοκινήτων που έχουν ενοικιαστεί.
5. Εξόδου από το πρόγραμμα μετά από επιλογή του χρήστη.
Τα στοιχεία κάθε αυτοκινήτου θα πρέπει να είναι καταχωρημένα σε μία δομή που θα
περιέχει τα στοιχεία: κωδικός, κατασκευαστής, μοντέλο, κυβισμός μηχανής , έτος
κατασκευής, κόστος ενοικίασης σε ευρώ (θεωρήστε ότι ο κωδικός είναι μοναδικός για κάθε
αυτοκίνητο).
Η προσπέλαση της συλλογής θα πρέπει να γίνει χρησιμοποιώντας μία απλή συνδεδεμένη
λίστα ή ένα πίνακα.
Ασκηση 7
Μια αεροπορική εταιρία πραγματοποιεί κάθε μέρα δέκα πτήσεις με διαφορετικούς τύπους
αεροσκαφών.Για κάθε πτήση της η εταιρία κρατάει τα εξής στοιχεία:tον αριθμό της
πτήσης,το πλήθος των θέσεων του αεροσκάφους και τον αριθμό των επιβαινόντων.Να
γραφεί πρόγραμμα το οποίο:
1.
Θα ζητάει να δωθούν από το πληκτρολόγιο και θα καταχωρεί τα στοιχεία κάθε
πτήσης
2.
Θα υπολογίζει το συνολικό αριθμό των επιβατών των πτήσεων.
3.
Θα υπολογίζει πόσες από τις πτήσεις έχουν πληρότητα.Μια πτήση θεωρείται ότι
έχει πληρότητα όταν έχει διαθέσει τουλάχιστον το 80% των θέσεων του αεροσκάφους.
Άσκηση 8
Με τη χρήση δισδιάστατου πίνακα, γράψτε πρόγραμμα σε C για να εμφανίσετε έναν πίνακα
που αντιπροσωπεύει ένα τρίγωνο Pascal οποιουδήποτε μεγέθους. Στo Pascal τρίγωνο, η
πρώτη και η δεύτερη σειρά έχουν οριστεί σε 1. Κάθε στοιχείο του τριγώνου (από την τρίτη
σειρά προς τα κάτω) είναι το άθροισμα του στοιχείου ακριβώς από πάνω συν το στοιχείο
από τα αριστερά του στοιχείου ακριβώς από πάνω. Παράδειγμα Pascal τριγώνου για size = 7
:
1
1
1
1
1
1
1
1
2
3
4
5
6
1
3
6
10
15
1
4
10
20
1
5
15
1
6
1
Aσκηση 9
Να γραϕεί πρόγραμμα που θα ζητάει από το χρήστη να του δώσει τις διαστάσεις για να
κατασκευάσει ένα δισδιάστατο πίνακα ακεραίων. Μόλις ο χρήστης δώσει τις δύο
διαστάσεις, το πρόγραμμα θα δεσμεύει δυναμικά μνήμη για τον πίνακα με χρήση της malloc
και θα διαβάζει από τον χρήστη μια ακέραια τιμή για κάθε στοιχείο του πίνακα. Στη
συνέχεια, να κατασκευαστεί συνάρτηση, η οποία θα καλείται από το πρόγραμμα και να
εκτελεί τα παρακάτω:
1. θα υπολογίζει το άθροισμα κάθε γραμμής του πίνακα και να το αποθηκεύει σ' ένα νέο
πίνακα.
2. να επιστρέϕει το νέο πίνακα στο κύριο πρόγραμμα.
Το κύριο πρόγραμμα θα πρέπει να εκτυπώνει τα στοιχεία του νέου πίνακα που
δημιουργήθηκε απ' τη συνάρτηση.
Άσκηση 10
Να κατασκευαστεί με χρήση πίνακα και δομών μία λίστα ταχυδρομικών διευθύνσεων. H
λίστα θα κρατάει όνοματεπώνυμο, οδό, πόλη, χώρα και ταχυδρομικό κώδικα. Ο χρήστης θα
επιλέγει από ένα μενού την ενέργεια που επιθυμεί (εισαγωγή στοιχείων, διαγραφή
στοιχείων, και εκτύπωση των καταγραφών). Να γίνεται αναζήτηση για κενό κελί στη μνήμη
προκειμένου να εισάγεται εκεί κάθε νέα εγγραφή.
Άσκηση 11
Γράψτε ένα πρόγραμμα το οποίο θα διαβάζει ένα πίνακα αλφαριθμητικών από τον χρήστη,
και θα μετράει το μήκος των αλφαριθμητικών αυτών. Στο τέλος θα εμφανίζει το
ιστόγραμμα των μηκών με γραφικό τρόπο (βλ. Παράδειγμα).
Word Length
|Number of Occurrences
1
|
2
| *******
3
| **********
4
| ****
5
| ***
6
| *****
7
| ***
8
| ***
9
| *
10
|
11
|
12
|
13
|
14
|
diogenis>
Επεκτάσεις:
-
Φροντίστε να μην προσμετρούνται τα σημεία στίξης (τελείες, παρενθέσεις κτλ) στο μήκος
της λέξης.
Κάντε το πρόγραμμα να διαβάζει την είσοδό του από ένα αρχείο κειμένου.
Άσκηση 12
Μία από τις πιο σημαντικές χρήσεις της γλώσσας C είναι στη διαχείριση αλφαριθμητικών,
και αυτό γιατί η C παρέχει πολλές ευκολίες στη διαχείρισή τους. Σκοπός της συγκεκριμένης
άσκησης είναι η διερεύνηση αυτών των δυνατοτήτων, για τον αποτελεσματικό χειρισμό
ενός πίνακα αλφαριθμητικών. Θεωρείστε λοιπόν ένα πίνακα Ν θέσεων όπου σε κάθε θέση
αποθηκεύεται η τιμή μίας μεταβλητής τύπου δομής με δύο μέλη ένα αλφαριθμητικό και μία
ακέραια τιμή που υποδηλώνει το μήκος του αλφαριθμητικού. Θεωρείστε ότι κάθε
αλφαριθμητικό είναι το καθένα μέγιστου μήκους Μ-1 και αποτελείται μόνο από
αριθμητικούς και αλφαβητικούς χαρακτήρες (όλοι του Αγγλικού αλφαβήτου), χωρίς κενά,
με το Ν και το Μ να δηλώνονται στο πρόγραμμα σαν συμβολικές σταθερές. Έστω
word_table το όνομα του πίνακα.
Τυπικά η δήλωση θα δίνεται ως εξής:
struct word_pair
{
char word[Μ];
int length;
};
struct word_pair word_table[N]
Ζητείται να υλοποιηθούν οι εξής συναρτήσεις:
(α) μία συνάρτηση που θα ζητάει από τον χρήστη και θα γεμίζει τον πίνακα με Ν
αλφαριθμητικά, και για κάθε αλφαριθμητικό θα υπολογίζει και θα αποθηκεύει στην
αντίστοιχη θέση το μήκος του.
(β) εφαρμόστε στα δοθέντα αλφαριθμητικά ένα κυκλικό κρυπταλγόριθμο αντικατάστασης
γράμματος, με βάση το οποίο κάθε γράμμα του αλφαριθμητικού θα αντικαθίσταται από το
ομόλογό του που έπεται στο αλφάβητο κατά μία σταθερή απόσταση, στην περίπτωση που η
μετακίνηση αυτή σας μεταφέρει πέρα από το τελευταίο γράμμα, θα πρέπει να γίνει κύκλος
και να ξεκινήσετε από την αρχή. Για παράδειγμα αν θεωρηθεί ότι η μετατόπιση είναι 5, και
το αλφαριθμητικό εισόδου είναι το ABCDklmKLMWw τότε η μετατροπή είναι η
FGHIpqrPQRBb. Για να το επιτύχετε αυτό ορίστε δύο συναρτήσεις, μία συνάρτηση η οποία
δεχόμενη σαν είσοδο μία συμβολοσειρά εισόδου, παράγει την κωδικοποιημένη
συμβολοσειρά εξόδου, με τιμή μετατόπισης 5, και μία συνάρτηση η οποία θα καλεί την
πρώτη συνάρτηση για κάθε γραμμή του πίνακα εισόδου.
(γ) υλοποιείστε συνάρτηση που θα δέχεται δύο αλφαριθμητικά για είσοδο και θα εντοπίζει
τις θέσεις εμφάνισης του πρώτου αλφαριθμητικού σε κάθε γραμμή του πίνακα και θα τις
αντικαθιστά με το δεύτερο.
Ελέγξτε τον κώδικά σας με ένα κυρίως πρόγραμμα το οποίο θα καλεί τις ανωτέρω
συναρτήσεις με την σειρά με την οποία ορίστηκαν.
Άσκηση 13
(προαιρετική, δεν μετρά στη βαθμολογία, για όσους θέλουν να
ασχοληθούν)
Σε πολλές εφαρμογές είναι χρήσιμη η χρήση ενός λεξικού με ορισμούς εννοιών
αλφαριθμητικών. Το λεξικό συνεπώς μπορεί να θεωρηθεί ότι είναι ενας πίνακας δομών
όπου σε κάθε θέση αποθηκεύεται το αλφαριθμητικό και ο ορισμός του.
Οριστε συνεπώς μία δομή με το όνομα lexicon_entry και με μέλη δυο αλφαριθμητικά (λέξη
και ορισμός της) και ένα πίνακα lexicon με Ν στοιχεία της δομής και υλοποιείστε μία
συνάρτηση που γεμίζει τον πίνακα με στοιχεία.
Υλοποιείστε κυρίως πρόγραμμα το οποίο διαβάζει μια συμβολοσειρά Α που θεωρούμε ότι
μοντελοποιεί ένα κείμενο συνεπώς αποτελείται από μία ακολουθία λέξεων με κάθε λέξη να
αποτελείται από συνεχόμενες εμφανίσεις αριθμητικών και αλφαβητικών χαρακτήρων, όλων
του Αγγλικού αλφαβήτου. Υποθέτουμε ότι οι λέξεις οριοθετούνται με ένα ή περισσότερα
κενά και ότι γίνεται διάκριση μεταξύ κεφαλαίων και πεζών γραμμάτων. Το πρόγραμμα θα
πρέπει να εντοπίζει τις λέξεις του Α που υπάρχουν στο λεξικό και να αντικαθιστά κάθε μία
από αυτές με τον ορισμό της όπως διατυπώνεται στο λεξικό δημιουργώντας έτσι ένα νέο
κείμενο Β. Το κείμενο Β θα πρέπει να εκτυπώνεται από τον χρήστη.
Υπόδειξη: Για την εύρεση των λέξεων που εμφανίζονται σε μία συμβολοσειρά προτείνεται
να χρησιμοποιηθεί η συνάρτηση char * strtok(char *s, char * ct) της βιβλιοθήκης <string.h>.
Για την σύγκριση αλφαριθμητικων προτεινεται η συνάρτηση int strcmp(cs, ct) της
βιβλιοθήκης <string.h>.