You are on page 1of 7

Ε.Α.Π.

/ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ

3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ

ΑΚΑΔΗΜΑΪΚΟΥ ΕΤΟΥΣ 2019-2020

4ος Τόμος

ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΑΤΙΣΜΟΥ

20/1/2020

Ημερομηνία παράδοσης εργασίας: Κυριακή 23/02/2020


Καταληκτική ημερομηνία παραλαβής: Τετάρτη 26/02/20201
Ημερομηνία ανάρτησης ενδεικτικών λύσεων: Σάββατο 29/02/2020
Καταληκτική ημερομηνία αποστολής σχολίων στους φοιτητές: Κυριακή 14/03/2020

ΥΠΟΕΡΓΑΣΙΑ 1. (βαθμοί 25)


Δομές Επανάληψης, Αναδρομή

ΥΠΟΕΡΓΑΣΙΑ 2. (βαθμοί 30)


Αμυντικός Προγραμματισμός, Λίστες

ΥΠΟΕΡΓΑΣΙΑ 3. (βαθμοί 20)


Έλεγχος ροής

ΥΠΟΕΡΓΑΣΙΑ 4. (βαθμοί 25)


Συναρτήσεις, Πίνακες

ΣΥΝΟΛΟ (βαθμοί 100)

1
Σύμφωνα με τον Κανονισμό Σπουδών, η καταληκτική ημερομηνία για την παραλαβή της Γ.Ε.
από το μέλος ΣΕΠ είναι η επόμενη Τετάρτη από το τέλος της εβδομάδας παράδοσης Γ.Ε.
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020

ΥΠΟΕΡΓΑΣΙΑ 1. (βαθμοί 25)

Α. Υπολογίστε και αιτιολογήστε τα αποτελέσματα που θα τυπωθούν σε κάθε μία από τις
περιπτώσεις (i) και (ii).

main() main()
{ {
int x = 1, y = 3; int x = 1, y = 3;
printf("%d %d\n", x, y); printf("%d %d\n", x, y);
what (x, y); what (&x, &y);
printf("%d %d\n", x, y); printf("%d %d\n", x, y);
} }
void what(int a, int b) void what (int *a, int *b)
{ {
a = a+1; *a = *a+1;
b = ++b; *b = ++*b;
} }

Περίπτωση (i) Περίπτωση (ii)

Β. Τι θα τυπώσει η κλήση f(7) της αναδρομικής συνάρτησης που ακολουθεί; Τεκμηριώστε την
απάντησή σας.
void f(int k)
{
int i;
if (k==0)
return;
printf("%d", k);
for (i=1;i<k;i=i+2)
f(i);
}
Γ. Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο να:
i. δηλώνει ένα πίνακα ακεραίων με το όνομα a (που να αποτελείται από 3 γραμμές και 3
στήλες) και δίνει τις ακόλουθες αρχικές τιμές στον πίνακα
1 2 3
4 5 6
7 8 9
ii. ορίζει ένα δείκτη σε ακέραιο με όνομα a_ptr και δίνει στο δείκτη τη διεύθυνση μνήμης
του πίνακα

Σελίδα 2 από 7
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
iii. εμφανίζει το στοιχείο 7 (της 3ης γραμμής, 1ης στήλης) του πίνακα χρησιμοποιώντας το
δείκτη.

Δ. Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο να υπολογίζει το γινόμενο


όλων των ακέραιων αριθμών μεταξύ 10 και 110 που διαιρούνται ακριβώς με το 7.
Υπενθυμίζεται ότι ένας αριθμός διαιρείται ακριβώς με το 7, αν το υπόλοιπο της διαίρεσης του
αριθμού με το 7 είναι 0.

E. Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο να διαβάζει από το


πληκτρολόγιο τις τιμές δύο πινάκων ακεραίων Α και Β, μεγέθους Ν ο καθένας, και να
δημιουργεί ένα νέο πίνακα ακεραίων C, μεγέθους Ν, όπου Ci = min(|Ai|, |Bi|) (δηλαδή κάθε
στοιχείο του C είναι ίσο με τη μικρότερη κατά απόλυτη τιμή των δύο αντίστοιχων τιμών των
πινάκων Α και Β). Θεωρήστε ότι το Ν είναι ορισμένο στο πρόγραμμα ως σταθερά.

ΥΠΟΕΡΓΑΣΙΑ 2. (βαθμοί 30)


Α. Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο να διαβάζει τις τιμές των
εισόδων A, B και C του παρακάτω λογικού κυκλώματος και να εμφανίζει την τιμή εξόδου του
F. Το πρόγραμμα να ελέγχει εαν οι τιμές των A, B και C είναι 0 ή 1 και σε αντίθετη περίπτωση
να επαναλαμβάνει την ανάγνωση μέχρι η είσοδος να είναι σωστή.

Β. Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο να διαβάζει διαδοχικά 3


ακέραιους θετικούς διψήφιους αριθμούς και να τους εισάγει σε μια απλά συνδεδεμένη λίστα με
αλλαγμένη τη σειρά των ψηφίων. Για παράδειγμα αν η είσοδος είναι το 72, στη λίστα θα
εισάγεται το 27. Κατά την εισαγωγή των αριθμών να γίνεται έλεγχος έτσι ώστε οι αριθμοί να
είναι διψήφιοι και θετικοί. Στο τέλος, το πρόγραμμα να διατρέχει τη λίστα και να εκτυπώνει την
τιμή κάθε κόμβου, καθώς και το γινόμενο των τιμών των κόμβων της λίστας.

Γ. Υποθέτουμε ότι η ΠΛΗ10 έχει 2 τμήματα φοιτητών και καθένα από αυτά έχει 3 φοιτητές.
Στην καρτέλα του κάθε φοιτητή αναγράφονται 4 βαθμοί που αντιστοιχούν στις 4 γραπτές
εργασίες κατά τη διάρκεια της ακαδημαϊκής χρονιάς. Οι λειτουργίες που εκτελούνται στις
(ηλεκτρονικές) καρτέλες των φοιτητών είναι οι ακόλουθες:

Σελίδα 3 από 7
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
i. Εισαγωγή (από το πληκτρολόγιο) των βαθμών όλων των φοιτητών, και των 2 τμημάτων για
όλες τις εργασίες σε ένα πίνακα τριών διαστάσεων. Οι βαθμοί δίνονται ανά εργασία και τμήμα.

ii. Εύρεση και εκτύπωση του μέσου όρου της βαθμολογίας κάθε φοιτητή.

iii. Εύρεση και εκτύπωση του μέσου όρου κάθε τμήματος, το ποσοστό φοιτητών που δεν
απέκτησαν δικαίωμα εξετάσεων σε κάθε τμήμα καθώς και το συνολικό πλήθος των φοιτητών
που δεν απέκτησαν δικαίωμα εξετάσεων από όλα τα τμήματα (μέσος όρος μικρότερος από 5).

Να γραφεί πρόγραμμα στη γλώσσα προγραμματισμού C, το οποίο υλοποιεί όλες τις παραπάνω
λειτουργίες, εισάγοντας κώδικα αμυντικού προγραμματισμού στην εισαγωγή των βαθμών.

ΥΠΟΕΡΓΑΣΙΑ 3. (βαθμοί 20)

Η τετραγωνική ρίζα ενός θετικού αριθμού y μπορεί να υπολογισθεί με επαναλαμβανόμενες


προσεγγίσεις χρησιμοποιώντας τον τύπο: x = (x_old + y / x_old) / 2, όπου x_old είναι η
προηγούμενη προσέγγιση x με αρχική τιμή του x_old το y. Η επαναληπτική διαδικασία
σταματά όταν η διαφορά μεταξύ δύο προσεγγιστικών τιμών x και x_old, σε απόλυτη τιμή, είναι
μικρότερη ενός επιθυμητού δοσμένου μικρού αριθμού π.χ. 0.0001.

Να γράψετε πρόγραμμα C που επαναλαμβανόμενα θα ζητά από το χρήστη ένα θετικό ακέραιο
(y) αριθμό μικρότερο από 1000 και θα εμφανίζει στην οθόνη τον αριθμό ολογράφως, καθώς και
την προσέγγιση της τετραγωνικής ρίζας ανά επανάληψη μαζί με το απόλυτο σφάλμα.
Διευκρινίζεται ότι το απόλυτο σφάλμα ισούται με την απόλυτη τιμή της διαφοράς της
τρέχουσας προσέγγισης με την προηγούμενη προσέγγιση. Το πρόγραμμά σας, θα τερματίζει
όταν δοθεί ένας αριθμός που δεν είναι θετικός.

Ακολουθεί παράδειγμα εκτέλεσης:

Δώσε τιμή (<=0 για έξοδο): 135

Οι διαδοχικές προσεγγίσεις για την εύρεση της τετραγωνικής ρίζας του εκατόν τριάντα πέντε

68.000000 με απόλυτο σφάλμα:67.000000

34.992647 με απόλυτο σφάλμα:33.007353

19.425300 με απόλυτο σφάλμα:15.567347

13.187500 με απόλυτο σφάλμα:6.237800

11.712233 με απόλυτο σφάλμα:1.475266

Σελίδα 4 από 7
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020

11.619322 με απόλυτο σφάλμα:0.092912

11.618950 με απόλυτο σφάλμα:0.000371

Η τελική προσέγγιση είναι: 11.618950

Δώσε τιμή (<=0 για έξοδο): -1

Έξοδος, λόγω μη θετικής τιμής

Υπόδειξη: Για να υπολογίσετε την απόλυτη τιμή ενός πραγματικού αριθμού χρησιμοποιήστε τη
συνάρτηση fabs() από τη βιβλιοθήκη math.h.

ΥΠΟΕΡΓΑΣΙΑ 4 (βαθμοί 25)


Ο ενδείκτης επτά κομματιών αντιστοιχεί σε ένα πολύ γνωστό συνδυαστικό ψηφιακό κύκλωμα,
το οποίο χρησιμοποιείται σε πολλές συσκευές. Για παράδειγμα, για να εμφανίσει έναν αριθμό
από 0 έως 9, χρησιμοποιεί όποια κομμάτια από τα επτά απαιτούνται κάθε φορά:

Τα επτά κομμάτια του ενδείκτη αριθμούνται όπως φαίνεται παρακάτω:

Α. Να δηλωθούν οι τιμές ενός πίνακα δυο διαστάσεων ως εξής:


const int kommatia_endeikti[13][7];
Αυτός ο πίνακας θα περιέχει τιμές 0 και 1 και θα αντιστοιχεί στην λειτουργία του παραπάνω
ενδείκτη για την εμφάνιση των αριθμών 0 έως 9 καθώς και των γραμμάτων A, C, F (δηλαδή ο
πίνακας θα πρέπει να αντιστοιχεί τους αριθμούς 0 έως 9 και τα A, C, F με τα αντίστοιχα
κομμάτια που απαιτούνται κάθε φορά). Για παράδειγμα, η πρώτη γραμμή του πίνακα
kommatia_endeikti θα αντιστοιχεί στον αριθμό 0 και θα έχει τιμές (1, 1, 1, 1, 1, 1, 0) γιατί
τα 6 πρώτα κομμάτια θέλουμε να είναι αναμμένα (συμβολίζουμε με 1 τα αναμμένα κομμάτια).
Αντίστοιχα η τελευταία τιμή του πίνακα που αντιστοιχεί στο F θα έχει τιμές (1, 0, 0, 0, 1, 1, 1).

0: F:

Να δηλωθεί ένας πίνακας δυο διαστάσεων ως εξής:


char eksodos[4][megistos_arithmos_eisodou*4];

Σελίδα 5 από 7
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020
Αυτός ο πίνακας θα τυπώνεται στην οθόνη στο τέλος του προγράμματος και θα έχει 4 γραμμές
(επειδή ο κάθε αριθμός ή γράμμα που θα πρέπει να τυπωθεί στην οθόνη απαιτεί 4 χαρακτήρες
σε ύψος) και megistos_arithmos_eisodou*4 στήλες (επειδή ο κάθε αριθμός ή γράμμα
που θα πρέπει να τυπωθεί στην οθόνη σε πλάτος απαιτεί 3 χαρακτήρες συν ένα κενό διάστημα
για να ξεχωρίζουν μεταξύ τους).
Να δηλωθούν οι τιμές ενός πίνακα δυο διαστάσεων ως εξής:
const int thesi_kommation[7][2];
Αυτός ο πίνακας θα περιέχει τιμές 0, 1, 2 και θα έχει 7 γραμμές (μια για το κάθε κομμάτι του
ενδείκτη) και 2 στήλες και θα αντιστοιχεί κάθε κομμάτι του ενδείκτη στην αντίστοιχη θέση του
χρησιμοποιώντας ένα νέο πίνακα 3Χ3:
0
5 6 1
4 3 2
Για παράδειγμα, το κομμάτι με αριθμό 0 του ενδείκτη αντιστοιχεί στην 0 γραμμή και την στήλη
1, δηλαδή η πρώτη γραμμή του πίνακα thesi_kommation θα έχει τιμές (0, 1).
Β. Να γραφεί μια συνάρτηση η οποία θα αποθηκεύει κενούς χαρακτήρες σε όλα τα στοιχεία του
πίνακα eksodos. Η συνάρτηση θα δηλώνεται ως εξής:
void adiasma_pinaka_eksodou(void)
Γ. Να γραφεί μια συνάρτηση η οποία θα αποθηκεύει την αντιστοίχιση κάθε ενός από τα επτά
κομμάτια του ορίσματος eisodos στην αντίστοιχη θέση του πίνακα eksodos (οι θέσεις
παίρνουν τιμές από 0 έως megistos_arithmos_eisodou - 1). Η συνάρτηση θα δηλώνεται
ως εξής:
void epeksergasia_eisodou(int eisodos, int thesi)
Δ. Να γραφεί μια συνάρτηση η οποία θα τυπώνει τα περιεχόμενα κάθε γραμμής του πίνακα
eksodos όπως φαίνεται στο παρακάτω παράδειγμα. Η συνάρτηση θα δηλώνεται ως εξής:
void ektuposi_eksodou(void)
Ε. Να γραφεί ένα κυρίως πρόγραμμα (συνάρτηση main), το οποίο θα διαβάζει μία σειρά
ακέραιων αριθμών από 0 έως 9 καθώς και τα γράμματα A, C και F. Αυτή τη σειρά θα τη
μετατρέπει σε ένδειξη του ενδείκτη επτά κομματιών και θα την τυπώνει στην οθόνη, καλώντας
τις συναρτήσεις adiasma_pinaka_eksodou(), epeksergasia_eisodou() και
ektuposi_eksodou(). Ως μέγιστη τιμή των αριθμών και γραμμάτων που εισάγει ο χρήστης
θα δηλώνετε το 10: #define megistos_arithmos_eisodou 10. Εάν οι αριθμοί και τα
γράμματα που εισάγει ο χρήστης είναι περισσότεροι από 10, τα επιπλέον να αγνοούνται. Αν
δοθεί άλλος χαρακτήρας από αυτούς τους δεκατρείς απλά να μην τυπώνεται. Ακολουθεί
παράδειγμα εκτέλεσης:

Σελίδα 6 από 7
3η ΓΡΑΠΤΗ ΕΡΓΑΣΙΑ ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2019-2020

Υπόδειξη: Συνίσταται η χρήση της συνάρτησης isdigit() της βιβλιοθήκης ctype.h

Γενικές Υποδείξεις:
Ι) Για τις απαντήσεις της εργασίας μπορείτε να ανατρέξετε στη συμπληρωματική βιβλιογραφία που
δίνεται και στα βοηθητικά κείμενα που υπάρχουν στο δικτυακό τόπο / portal της θεματικής
ενότητας. Συνιστάται να προσθέσετε στο τέλος της εργασίας σας κατάλογο βιβλιογραφίας.

ΙΙ) Οι απαντήσεις πρέπει να είναι γραμμένες με χρήση επεξεργαστή κειμένου (π.χ. Word) σε σελίδες
διαστάσεων Α4. Ενδεικτικά, οι απαντήσεις μπορούν να επιτευχθούν σε περίπου 10 σελίδες. Για την
εφαρμογή του αμυντικού προγραμματισμού αρκεί να γίνεται έλεγχος ως προς το εάν μία τιμή που
εισάγεται από το χρήστη του προγράμματος βρίσκεται εντός αποδεκτών ορίων (π.χ. να είναι θετική,
διαφορετική από το 0, μεγαλύτερη από 20 κλπ.). Δεν απαιτείται έλεγχος ως προς το εάν η τιμή
ανήκει στο σωστό τύπο δεδομένων (π.χ. ακέραιος, πραγματικός αριθμός, χαρακτήρας κλπ.)
σύμφωνα με τον τύπο της μεταβλητής στην οποία θα αποθηκευτεί η τιμή αυτή.

ΙΙΙ) Το αρχείο της εργασίας θα πρέπει να έχει ως πρώτη σελίδα το Έντυπο Υποβολής - Αξιολόγησης ΓΕ
συμπληρωμένο και ως δεύτερη σελίδα τον τίτλο «Σχόλια προς τον φοιτητή» (θα συμπληρωθεί από
τον καθηγητή σας). Οι απαντήσεις στις υπο-εργασίες θα αρχίζουν από την τρίτη σελίδα, χωρίς να
επαναλαμβάνονται οι εκφωνήσεις. Κάθε υπο-εργασία θα αρχίζει από νέα σελίδα. Για την απάντησή
σας θα πρέπει να χρησιμοποιείτε υποχρεωτικά το Πρότυπο Υποβολής Γραπτής Εργασίας.

ΙV) Στα ερωτήματα όπου ζητείται υλοποίηση κώδικα σε γλώσσα C, και στο έγγραφο της απάντησής
σας και στο αρχείο του κώδικα θα πρέπει να δίνεται ολόκληρο το πρόγραμμα, επισημαίνοντας με
σχόλια πού απαντάτε κάθε ερώτημα. Για να θεωρούνται οι απαντήσεις ολοκληρωμένες θα πρέπει:

α) Ο κώδικας (όπου ζητείται) να είναι επαρκώς σχολιασμένος, σωστά στοιχισμένος και


ενσωματωμένος μέσα στο αρχείο με τις απαντήσεις σας σε γραμματοσειρά courier, καθώς και
(σύμφωνα με τις οδηγίες του Συμβούλου - Καθηγητή σας) σε ξεχωριστό .c αρχείο (ANSI C).

β) Το όνομα κάθε .c αρχείου να περιλαμβάνει το επώνυμό σας με λατινικούς χαρακτήρες, το


χαρακτήρα της υπογράμμισης και τον αριθμό του συγκεκριμένου υποερωτήματος (π.χ. αν το
επώνυμό σας είναι Ιωάννου, τότε ο κώδικας για την υποεργασία 1Β θα πρέπει να έχει το όνομα
Ioannou_1b.c).

γ) Κάθε αρχείο .c που θα παραδοθεί θα πρέπει τουλάχιστον να περνά τη φάση της μεταγλώττισης
χωρίς λάθη.

V) Η καλή παρουσίαση της εργασίας λαμβάνεται υπόψη στην αξιολόγηση της εργασίας.

Σελίδα 7 από 7

You might also like