Professional Documents
Culture Documents
Ερώτημα 2.4.
Τι θα εμφανίσει το παρακάτω Πρόγραμμα μετά την εκτέλεσή του; Αιτιολογήστε την απάντησή
σας.
#include <stdio.h>
main()
{int i, a=2,b=3, c[2]={7,8};
printf(“%d\n”,a==b);
printf(“%d\n”,a==b-1);
a=b;
printf(“%d %d\n”,a,b);
c[a==b]=12;
printf("%d %d\n",c[0],c[1]);
}
ΘΕΜΑ 3 a) Eξηγήστε τον τρόπο με τον οποίο δουλεύει ο αλγόριθμος ταξινόμησης Bubble
Sort (ταξινόμηση φυσαλίδας) χρησιμοποιώντας ως παράδειγμα τους αριθμούς 8, 12, 7, 23,
17.
b) Να γραφεί αλγόριθμος σε ψευδοκώδικα και πρόγραμμα σε γλώσσα C, το οποίο να:
b1) διαβάζει τα στοιχεία ενός πίνακα ακεραίων εκατό θέσεων
b2) ταξινομεί τα στοιχεία του πίνακα χρησιμοποιώντας τον αλγόριθμο ταξινόμησης
φυσαλίδας (Bubble Sort)
b3) εμφανίζει τα στοιχεία του ταξινομημένου πίνακα
σημειώστε δίπλα σε καθεμία από τις ακόλουθες εκφράσεις αν το αποτέλεσμα είναι αληθές ή ψευδές,
αιτιολογώντας συνοπτικά την απάντησή σας.
a) (x<y) && (x>y/2)
b) x=y
c) !(x!=y)
d) (++x<--y) && (++x+1<=--y-1)
Ερώτημα 2.4.
Κατασκευάστε ένα πρόγραμμα που να:
a) δηλώνει ένα πίνακα ακεραίων με το όνομα a (που να αποτελείται από 4 γραμμές και 3 στήλες) και
δίνει τις ακόλουθες αρχικές τιμές στον πίνακα
1 2 3
4 5 6
7 8 9
10 11 12
b) ορίζει ένα δείκτη σε ακέραιο a_ptr
c) δίνει στο δείκτη τη διεύθυνση του πίνακα
d) εμφανίζει το στοιχείο 8 (της 3ης γραμμής, 2ης στήλης) του πίνακα χρησιμοποιώντας το δείκτη.
ΤΕΛΙΚΕΣ ΕΞΕΤΑΣΕΙΣ 2001-2002
Ερώτημα 3.2.
Γράψτε αλγόριθμο ο οποίος θα διαβάζει ένα ακέραιο αριθμό και θα υπολογίζει τον αντίστοιχο δυαδικό
αριθμό. Ο ακέραιος θα πρέπει να είναι θετικός και μικρότερος του 1024. Ο αλγόριθμος θα ελέγχει αν ο
αριθμός είναι κατάλληλος (δηλαδή θετικός και μικρότερος του 1024) και σε αντίθετη περίπτωση θα δίνει
μήνυμα λάθους και θα επαναλαμβάνει την ανάγνωση. Μετά την επιτυχή ανάγνωση του ακέραιου
αριθμού, θα τον μετατρέπει σε δυαδικό αριθμό που θα τον καταχωρεί σε ένα πίνακα και θα τυπώνει το
αποτέλεσμα της μετατροπής.
Χρησιμοποιείστε το παρακάτω λεξικό δεδομένων (στο οποίο μπορείτε να προσθέσετε και όποιες άλλες
μεταβλητές χρειάζεστε):
DYADIKOS: ARRAY[1..10] OF INTEGER; {Ο δυαδικός αριθμός}
Ερώτημα 3.3.
Γράψτε πρόγραμμα στη γλώσσα προγραμματισμού C που να υλοποιεί τον αντίστοιχο αλγόριθμο. Το
πρόγραμμα θα διαβάζει ένα ακέραιο αριθμό και θα υπολογίζει τον αντίστοιχο δυαδικό αριθμό.
Χρησιμοποιήστε σχόλια για να εξηγήσετε τι κάνετε σε κάθε εντολή που δεν είναι προφανής (π.χ. μη
σχολιάσετε μία εντολή εκτύπωσης, αλλά σχολιάστε οπωσδήποτε τι γίνεται σε μία εντολή επανάληψης).
Μια ενδεικτική εμφάνιση αποτελέσματος για τον αριθμό 121 είναι: «Ο ακέραιος αριθμός: 121 αντιστοιχεί
στο δυαδικό αριθμό: 1111001»
Ερώτημα 1.2.
Γράψτε σε ψευδοκώδικα αλγόριθμο που να υπολογίζει το Μέσο Όρο των στοιχείων ενός πίνακα 3
διαστάσεων (Κ x Μ x N). Η απάντησή σας θα πρέπει να ξεκινά ως εξής:
ΑΛΓΟΡΙΘΜΟΣ MO_PINAKA_ΚxΜxN;
ΣΤΑΘΕΡΕΣ
Κ = 10;
M = 10;
Ν = 20;
ΔΕΔΟΜΕΝΑ
P : ARRAY[1..Κ,1..M,1..Ν] OF INTEGER;
. . .
Ερώτημα 1.4.
Το σύμβολο Σ συμβολίζει το άθροισμα ακεραίων αριθμών. Δηλαδή, Σ(1..5) = 1+2+3+4+5 = 15.
Αντίστοιχα το σύμβολο Π συμβολίζει το γινόμενο ακεραίων αριθμών. Δηλαδή, Π(1..5) = 1*2*3*4*5 =
120.
α. Να γραφεί πρόγραμμα σε C που να διαβάζει ένα θετικό ακέραιο αριθμό (π.χ. num) και να υπολογίζει
τα Σ(1..num) και Π(1..num).
β. Να γίνει χρήση αμυντικού προγραμματισμού και να σχολιαστούν (σχόλια στον κώδικα) οι
περιπτώσεις λάθους που ελέγχονται / προβλέπονται κάθε φορά.
Ερώτημα 2.2.
α. Διατυπώστε μια αναδρομική (recursive) συνάρτηση σε ψευδοκώδικα για τον υπολογισμό του
παραγοντικού ενός ακεραίου αριθμού Ν.
β. Εξηγήστε με λεπτομέρεια πώς δουλεύει η συνάρτηση σας εάν δοθεί για υπολογισμό το παραγοντικό
του αριθμού 5 (Σημείωση: 5! (δηλ. 5 παραγοντικό) = 1*2*3*4*5 = 120).
Ερώτημα 2.3.
Δίνεται ο παρακάτω πίνακας Α με Ι = {1, 2, ..., 10}:
2 5 8 9 11 16 20 27 32 40
I=1 I=2 I=3 I=4 I=5 I=6 I=7 I=8 I=9 I=10
α. Να εφαρμόσετε τη μέθοδο δυαδικής αναζήτησης για την περίπτωση που αναζητούμε το στοιχείο
(τιμή) ‘16’. Περιγράψτε τα βήματα της διαδικασίας αναζήτησης (τους υπολογισμούς της επόμενης
προς εξέταση θέσης και τις συγκρίσεις). Δεν χρειάζεται να γράψετε τον αλγόριθμο.
β. Αν χρησιμοποιούσαμε γραμμική αναζήτηση, θα βρίσκαμε γρηγορότερα ή αργότερα το ζητούμενο
στοιχείο; Εξηγήστε πώς δουλεύει η γραμμική αναζήτηση και γιατί θα βρίσκαμε το στοιχείο
γρηγορότερα ή αργότερα.
Ερώτημα 2.4.
Απαντήστε σωστό ή λάθος για κάθε μια από τις 8 παρακάτω προτάσεις. (Δεν είναι απαραίτητη η
αιτιολόγηση των απαντήσεων):
α. Η εντολή s *= a + 1; ισοδυναμεί με την εντολή s = s * a + 1;
β. Η εντολή if (a=b) then printf (“hello”); εμφανίζει πάντα hello εκτός αν το b έχει την τιμή 0.
γ. Η εντολή printf(“%d”,5/2); εμφανίζει τον αριθμό 2.
δ. Η λογική έκφραση !(a!=b) ισοδυναμεί με την a = b.
ε. Η λογική έκφραση (a > 0 || a < 0) είναι αληθής για όλους τους αριθμούς a.
στ. Η εντολές α=2; printf(“%d”, a++); εμφανίζουν τον αριθμό 2.
ζ. Η εντολή a++; είναι ισοδύναμη με την εντολή a= a+2;.
η. Εάν s ορίζεται ως char s[10] τότε το s[3] ισοδυναμεί με *(s+3).
Ερώτημα 1.4.
Αναπτύξτε πρόγραμμα σε γλώσσα C, το οποίο θα ζητά από το χρήστη ένα πεζό Αγγλικό γράμμα και θα
εμφανίζει σε μία γραμμή της οθόνης όλα τα Αγγλικά γράμματα από αυτό που διάβασε μέχρι και το z. Σε
περίπτωση που ο χαρακτήρας που δίνει ο χρήστης δεν είναι πεζό Αγγλικό γράμμα, να επαναλαμβάνεται η
ανάγνωση νέου χαρακτήρα.
Ερώτημα 2.1.
α) Εξηγήστε σε δύο το πολύ γραμμές τι αποτέλεσμα έχει η διαδικασία ΕΠΕΞΕΡΓΑΣΙΑ-ΔΕΔΟΜΕΝΩΝ
στον πίνακα Ρ.
β) Πόσες φορές θα εκτελεστεί η ομάδα εντολών ΕΑΝ (Ρ[J] > P[J+1]) TOTE …….. EAN-ΤΕΛΟΣ;
Ερώτημα 2.2.
Δίνεται μια συνδεδεμένη λίστα. Τα πεδία που έχει κάθε στοιχείο της λίστας (εκτός δηλαδή από το πεδίο
next το οποίο ως γνωστόν είναι ένας δείκτης στο επόμενο στοιχείο της λίστας) δεν έχουν σημασία στο
συγκεκριμένο ερώτημα. Γράψτε σε ψευδοκώδικα ένα υποπρόγραμμα το οποίο να αντιστρέφει τη λίστα,
δηλαδή να αλλάζει κατάλληλα τους δείκτες έτσι ώστε το τελευταίο στοιχείο να γίνει πρώτο, το
προτελευταίο να γίνει δεύτερο, κοκ.
Ερώτημα 2.4.
Τι θα εμφανίσει η εκτέλεση των παρακάτω προγραμμάτων (γράψτε ακριβώς τι θα εμφανιστεί στην οθόνη
ως αποτέλεσμα της εκτέλεσης των παρακάτω προγραμμάτων):
α) main ()
{
int a=10, b=11;
if (a=b) printf(“True”);
else printf (“False”);
}
β) main()
{
int num;
num= - 8;
while (num>0)
{
printf(“Hello…”);
printf(“..again.”);
num=num+2;
}
printf(“and….Goodbye”);
}
γ) main ()
{
int a=10, b=20, i;
for (i=1; i<3; i++)
printf(“%d ”, b-(a+i));
}
Και στα δύο ερωτήματα η εισαγωγή των δεδομένων θα γίνεται από το πληκτρολόγιο. Τα αποτελέσματα
θα εμφανίζονται στην οθόνη. Χρησιμοποιήστε διαδικασίες (ψευδοκώδικας) και συναρτήσεις (C) για την
εύρεση μέσων, μεγίστων και ελαχίστων, που έχουν ως παράμετρο έναν πίνακα. Να γίνει χρήση
αμυντικού προγραμματισμού τουλάχιστον σε μια περίπτωση (να γραφούν οι εντολές μέσα στον κώδικα –
όχι χωριστά- με σχόλια που να επισημαίνουν ότι γίνεται χρήση αμυντικού προγραμματισμού).
Ερώτημα 1.2.
Δίνεται ο πίνακας Α με τα εξής στοιχεία:
41 23 6 21 75 32 94 28
Δείξτε τις διαδοχικές φάσεις του πίνακα Α κατά τη διαδικασία ταξινόμησης των στοιχείων του
σε αύξουσα διάταξη με τον αλγόριθμο ταξινόμηση φυσαλίδας (bubble sort). Σχεδιάστε για το
λόγο αυτό στην κόλα σας έναν πίνακα σαν τον παρακάτω (με όσες γραμμές χρειάζεται) και
συμπληρώστε τις μεταβολές στον πίνακα βήμα προς βήμα, συμπληρώνοντας για κάθε
ανταλλαγή στοιχείων στον μικρό πίνακα δεξιά τα στοιχεία που αλλάζουν θέση.
1 2 3 4 5 6 7 8
23 41 6 21 75 32 94 28 4 2
1 3
6 21 23 28 32 41 75 94
b = a;
void main() {
int a, b;
a = 1;
b = 15;
set_b_to_a(a, b);
print("%d", b);
Ερώτημα 1.4.
α) Σχεδιάστε το λογικό κύκλωμα που υλοποιεί τη λογική συνάρτηση:
F = (A XOR B) OR ((NOT(B)) AND (A NAND C))
β) Δώστε τον πίνακα αληθείας της παραπάνω λογικής συνάρτησης F.
ΘΕΜΑ 2 (3,5 μονάδες)
Ερώτημα 2.2.
Δίνονται οι τιμές: 35, 42, 25, 70, 31, 10, 60, 12, 19, 84, 45. Σχηματίστε ένα πλήρες δυαδικό
δένδρο αναζήτησης που οι κόμβοι του έχουν τις τιμές αυτές.
Υπόδειξη: Δεν πρέπει να χρησιμοποιήσετε τις τιμές με τη σειρά που δίνονται (το 35 ΔΕΝ είναι
η ρίζα του δένδρου που ζητείται), αλλά να τις ανακατατάξετε με κατάλληλο τρόπο. Για να
διευκολυνθείτε, κατασκευάστε ένα πλήρες κενό δυαδικό δένδρο με 11 κόμβους (όσες και οι
τιμές που δίνονται), τοποθετώντας στη συνέχεια τις τιμές στις κατάλληλες θέσεις.
Ερώτημα 2.3.
α) Έστω ότι ο μονοδιάστατος πίνακας P, που δίνεται στο Σχήμα 1, λειτουργεί με τη λογική της
«στοίβας». Δώστε σχηματικά τη νέα μορφή του πίνακα P (θέσεις και περιεχόμενα του πίνακα,
δείκτης T) και περιγράψτε τις αλλαγές που γίνονται:
Μετά την εισαγωγή των στοιχείων 14, 22 και 61.
Μετά την εξαγωγή πέντε στοιχείων (αφού έχουν εισαχθεί τα τρία).
β) Έστω ότι ο πίνακας P λειτουργεί με τη λογική της «ουράς» και η αρχική του κατάσταση είναι
αυτή του Σχήματος 1. Δώστε σχηματικά τη νέα μορφή του πίνακα P (θέσεις και περιεχόμενα
του πίνακα, δείκτες F και R) και περιγράψτε τις αλλαγές που γίνονται:
Μετά την εισαγωγή των στοιχείων 27 και 64.
Μετά την εξαγωγή τριών στοιχείων (αφού έχουν εισαχθεί τα δύο).
1 2 3 4 5 6 7 8 9 10
13 72 29 37 26 12
ΕΠΑΝΑΛΑΒΕ
ΔΙΑΒΑΣΕ(A);
S:= S + A;
Ένα λύκειο έχει τρία τμήματα αποφοίτων (Γ’ Λυκείου) και καθένα από αυτά έχει 20 μαθητές.
Στην καρτέλα του κάθε μαθητή αναγράφονται 8 βαθμοί που αντιστοιχούν στα μαθήματα που
διδάχτηκαν κατά τη διάρκεια της χρονιάς. Οι λειτουργίες που εκτελούνται στις (ηλεκτρονικές)
καρτέλες των μαθητών είναι οι ακόλουθες:
i. Εισαγωγή (από το πληκτρολόγιο) των βαθμών όλων των μαθητών, και των τριών
τμημάτων σε όλα τα μαθήματα. Οι βαθμοί δίνονται στη γραμματεία από τους
καθηγητές σε μία κατάσταση ανά μάθημα και τμήμα (μια κατάσταση έχει για
παράδειγμα τους βαθμούς όλων των μαθητών του 1ου τμήματος στο μάθημα της
Έκθεσης). Η πληκτρολόγηση θα γίνεται για κάθε κατάσταση ξεχωριστά.
ii. Εύρεση και εκτύπωση του μέσου όρου της βαθμολογίας κάθε μαθητή, καθώς και
εύρεση και εκτύπωση του τμήματος που ανήκει ο καλύτερος μαθητής.
iii. Εύρεση και εκτύπωση του μέσου όρου κάθε τμήματος, το ποσοστό αποτυχίας σε κάθε
τμήμα καθώς και το συνολικό πλήθος των μαθητών που απορρίπτονται από όλα τα
τμήματα (μέσος όρος μικρότερος από 9.5).
Ζητούνται τα ακόλουθα:
α. Να σχεδιάσετε το ΔΡΠ - Διάγραμμα Ροής Προγράμματος (flowchart) της λειτουργίας (ii).
β. Να γράψετε αλγόριθμο σε ψευδοκώδικα που υλοποιεί όλες τις παραπάνω λειτουργίες.
γ. Να γράψετε πρόγραμμα σε γλώσσα C που υλοποιεί όλες τις παραπάνω λειτουργίες,
εισάγοντας κώδικα αμυντικού προγραμματισμού στην εισαγωγή των βαθμών.
Υποδείξεις:
1. Η βαθμολογία δίνεται σε κλίμακα από 0 μέχρι 20 (άριστα), με ακρίβεια ενός δεκαδικού
ψηφίου.
2. Ενδείκνυται η χρήση ενός κοινού τριπλού βρόγχου για τους υπολογισμούς των (ii) και (iii).
2. Οι αριθμητικοί τελεστές στη γλώσσα προγραμματισμού C περιλαμβάνουν και τους τελεστές ‘++’, ‘-
-’ και ‘**’.
Ερώτημα 1.4.
Οι κόμβοι μιας απλά συνδεδεμένης λίστας περιέχουν στο τμήμα της πληροφορίας έναν θετικό ακέραιο
αριθμό. Δώστε σε ψευδοκώδικα τον αλγόριθμο που υπολογίζει και εκτυπώνει τον μεγαλύτερο από τους
αριθμούς που περιέχονται στο τμήμα πληροφορίας των κόμβων της λίστας.
Συμμετρικός πίνακας είναι ένας τετραγωνικός πίνακας Α με Ν γραμμές και Ν στήλες, για τον οποίο
ισχύει ότι Αi,j = Aj,i, για κάθε τιμή των i και j (δηλαδή, κάθε στοιχείο έχει ίδια τιμή με το συμμετρικό του
ως προς την κύρια διαγώνιο του πίνακα). Σχεδιάστε αλγόριθμο σε ψευδοκώδικα που ελέγχει αν ένας
πίνακας A (N x N) είναι συμμετρικός.
Υπόδειξη: Ο αλγόριθμος θα δέχεται στην είσοδο έναν πίνακα και θα επιστρέφει στην έξοδο μια λογική
μεταβλητή SYM, που θα έχει τιμή TRUE αν ο πίνακας είναι συμμετρικός και FALSE αν δεν είναι.
Ερώτημα 2.2.
β) Βρείτε το μικρότερο και το μεγαλύτερο στοιχείο του δένδρου και αιτιολογήστε την απάντησή σας.
Στο παρακάτω σχήμα απεικονίζεται λίστα, κάθε κόμβος της οποίας περιλαμβάνει δύο πεδία: την
πληροφορία (INFO) που είναι ακέραιος αριθμός και έναν δείκτη (PTR) προς τον επόμενο κόμβο, που
περιέχει την πραγματική διεύθυνση μνήμης του επόμενου κόμβου στη λίστα. Η λίστα είναι
ταξινομημένη με αύξουσα διάταξη ως προς την πληροφορία (INFO).
INFO PTR INFO PTR INFO PTR INFO PTR INFO PTR
19 800 34 300 41 900 48 700 63 NIL
Αν η διεύθυνση βάσης της λίστας (δηλαδή η διεύθυνση του πρώτου κόμβου) είναι η 1000, τότε
περιγράψτε τη διαδικασία διαγραφής από τη λίστα των κόμβων που έχουν ως τιμές INFO τους
αριθμούς 41 και 19 και δώστε σχηματικά την κατάσταση της λίστας μετά από κάθε διαγραφή.
Υπόδειξη: Για την περιγραφή της διαδικασίας διαγραφής, θα πρέπει να αναφέρετε σε κάθε βήμα τον
τρέχοντα κόμβο, τον επόμενο κόμβο, τη σύγκριση που γίνεται, το αποτέλεσμα της σύγκρισης και την
επόμενη ενέργεια, σύμφωνα με τον πίνακα που ακολουθεί.
Ερώτημα 2.4.
Στο παρακάτω πρόγραμμα σε γλώσσα C, συμπληρώστε τη συνάρτηση exist, η οποία δέχεται ως είσοδο
μια ακέραια τιμή s και επιστρέφει έναν ακέραιο αριθμό που δείχνει πόσες φορές υπάρχει η τιμή s στον
πίνακα ακεραίων p[m][n].
Υπόδειξη: Ο πίνακας p είναι καθολική (global) μεταβλητή και ορίζεται έξω από το σώμα της συνάρτησης
exist. Οι απαραίτητες δηλώσεις, καθώς και το κυρίως πρόγραμμα (main) δίνονται στη συνέχεια.
#include <stdio.h>
int p[m][n];
int exist(int s)
main()
{
int i, j, num;
scanf("%d", &num);
}
ΘΕΜΑ 3 (3,0 μονάδες)
Ο υπολογισμός του ετήσιου φόρου των 20 υπαλλήλων μιας επιχείρησης γίνεται με βάση το ετήσιο
ακαθάριστο εισόδημά τους ως εξής:
Ζητούνται τα ακόλουθα:
α) Να σχεδιάσετε το ΔΡΠ - Διάγραμμα Ροής Προγράμματος (flowchart) και να γράψετε σε
ψευδοκώδικα τον αλγόριθμο ανάγνωσης των ετήσιων ακαθάριστων αποδοχών για όλους τους
υπαλλήλους.
i. Διαβάζει τις ετήσιες ακαθάριστες αποδοχές όλων των υπαλλήλων, με χρήση κώδικα
αμυντικού προγραμματισμού.
ii. Υπολογίζει και εκτυπώνει τον ετήσιο φόρο για κάθε υπάλληλο.
iii. Υπολογίζει και εκτυπώνει το μηνιαίο καθαρό μισθό κάθε υπαλλήλου (θεωρώντας τους
μισθούς σε δωδεκάμηνη βάση).
iv. Βρίσκει και εκτυπώνει το μεγαλύτερο καθαρό ετήσιο εισόδημα και τον αντίστοιχο φόρο.
printf("X");
for(j=0;j<5;j++)
printf("X");
που μετατρέπει έναν δυαδικό αριθμό στον αντίστοιχο οκταδικό αριθμό και στη συνέχεια τον
εκτυπώνει. Ο δυαδικός αριθμός είναι είσοδος στη συνάρτηση ως πίνακας 15 θέσεων, κάθε
στοιχείο του οποίου είναι ένα δυαδικό ψηφίο. Στην πρώτη θέση του πίνακα βρίσκεται το λιγότερο
σημαντικό ψηφίο (LSB). Για παράδειγμα, ο δυαδικός αριθμός 100110110011110 αποθηκεύεται
στον πίνακα με την παρακάτω μορφή:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 1 1 1 1 0 0 1 1 0 1 1 0 0 1