📑 Περιεχόμενα
📝 Άσκηση 1: Αριθμοί Armstrong
📋 Εκφώνηση
📌 Ζητούμενο
Ένας αριθμός λέγεται αριθμός Armstrong αν το άθροισμα των κύβων των ψηφίων του είναι ίσο με τον ίδιο τον αριθμό.
Να γραφεί πρόγραμμα σε C που θα ζητά άγνωστο πλήθος αριθμών και θα εμφανίζει αν ο αριθμός που δόθηκε είναι αριθμός Armstrong ή όχι.
Η εισαγωγή αριθμών θα σταματά όταν δοθεί ο αριθμός μηδέν (0).
Για τον έλεγχο των αριθμών δύναται να χρησιμοποιηθεί συνάρτηση που θα κατασκευάσετε για το σκοπό αυτό.
🔍 Ανάλυση
💡 Τι είναι ο Αριθμός Armstrong;
Ένας τριψήφιος αριθμός είναι Armstrong όταν:
αριθμός = (1ο ψηφίο)³ + (2ο ψηφίο)³ + (3ο ψηφίο)³
📊 Παραδείγματα Αριθμών Armstrong
| Αριθμός | Υπολογισμός | Αποτέλεσμα | Armstrong; |
|---|---|---|---|
| 153 | 1³ + 5³ + 3³ = 1 + 125 + 27 | 153 | ✅ Ναι |
| 370 | 3³ + 7³ + 0³ = 27 + 343 + 0 | 370 | ✅ Ναι |
| 371 | 3³ + 7³ + 1³ = 27 + 343 + 1 | 371 | ✅ Ναι |
| 407 | 4³ + 0³ + 7³ = 64 + 0 + 343 | 407 | ✅ Ναι |
| 123 | 1³ + 2³ + 3³ = 1 + 8 + 27 | 36 | ❌ Όχι |
🧩 Αλγόριθμος
Βήμα 1: Εξαγωγή Ψηφίων
- αριθμός % 10 → δίνει το τελευταίο ψηφίο
- αριθμός / 10 → αφαιρεί το τελευταίο ψηφίο
Βήμα 2: Υπολογισμός Κύβου
Ο κύβος ενός ψηφίου: ψηφίο * ψηφίο * ψηφίο
Βήμα 3: Σύγκριση
Αν το άθροισμα των κύβων = αρχικός αριθμός → είναι Armstrong!
✅ Λύση
🔎 Ανάλυση Κώδικα
📌 Η Συνάρτηση isArmstrong()
- Είσοδος: Ένας ακέραιος αριθμός num
- Έξοδος: Επιστρέφει 1 αν είναι Armstrong, 0 αν δεν είναι
⚠️ Σημαντικό
Αποθηκεύουμε τον αρχικό αριθμό στη μεταβλητή original πριν ξεκινήσουμε την επεξεργασία, γιατί η μεταβλητή num θα γίνει 0 μετά το while loop!
📝 Παράδειγμα Εκτέλεσης Βήμα-Βήμα (για 153)
| Επανάληψη | num | digit | digit³ | sum |
|---|---|---|---|---|
| Αρχικά | 153 | - | - | 0 |
| 1η | 153 → 15 | 3 | 27 | 27 |
| 2η | 15 → 1 | 5 | 125 | 152 |
| 3η | 1 → 0 | 1 | 1 | 153 |
🖥️ Παράδειγμα Εξόδου
✅ Έννοιες που χρησιμοποιήθηκαν:
Συναρτήσεις, do-while loop, while loop, τελεστής %, τελεστής /, εμφωλευμένα if
🎭 Άσκηση 2: Σύστημα Κρατήσεων Θεάτρου
📋 Εκφώνηση
📌 Ζητούμενο
Ένα θέατρο διαθέτει αίθουσα χωρητικότητας 500 θέσεων.
Όταν κάποιος ενδιαφέρεται να «κλείσει» θέσεις για την παράσταση, τηλεφωνεί και δηλώνει τον αριθμό των εισιτηρίων που επιθυμεί:
- Αν οι κενές θέσεις επαρκούν τότε γίνεται η κράτηση
- Αν οι απαιτούμενες θέσεις είναι περισσότερες από τις κενές τότε δεν γίνεται η κράτηση
Η διαδικασία επαναλαμβάνεται μέχρι να γεμίσει η θεατρική αίθουσα (freeSeats = 0).
🔍 Ανάλυση
✅ Σενάριο 1: Επιτυχής κράτηση
Κενές: 500, Ζητούμενα: 50 → 50 ≤ 500 → Κράτηση OK! → Νέες κενές: 450
❌ Σενάριο 2: Αποτυχημένη κράτηση
Κενές: 30, Ζητούμενα: 50 → 50 > 30 → Αποτυχία! → Κενές παραμένουν: 30
📊 Ροή Προγράμματος
✅ Λύση
🔎 Ανάλυση Κώδικα
📌 Μεταβλητές
| Μεταβλητή | Τύπος | Περιγραφή |
|---|---|---|
| CAPACITY | const int | Σταθερά χωρητικότητας (500) |
| freeSeats | int | Τρέχουσες κενές θέσεις |
| requested | int | Ζητούμενα εισιτήρια |
⚠️ Σημαντικά
- const: Δηλώνει σταθερά που δεν αλλάζει
- continue: Επιστρέφει στην αρχή του βρόχου
- -=: Σύνθετος τελεστής (freeSeats = freeSeats - requested)
🖥️ Παράδειγμα Εξόδου
✅ Έννοιες που χρησιμοποιήθηκαν:
const, while loop, scanf validation, continue, τελεστής -=, return codes
⚖️ Άσκηση 3: Νομική Εταιρία Prins & Associates
📋 Εκφώνηση
📌 Ζητούμενο
Σε μια νομική εταιρία Prins & Associates εργάζονται 15 νομικοί.
Να γραφεί πρόγραμμα σε C το οποίο:
- Θα διαβάζει τα ονόματα στον πίνακα NAMES[15][40] και τον αριθμό υποθέσεων στον πίνακα CASES[15]
- Για κάθε νομικό θα διαβάζει το ποσοστό επιτυχίας [0,1], θα το πολλαπλασιάζει με τις υποθέσεις και θα αποθηκεύει στον RESULTS[15]
- Θα ταξινομεί φθίνουσα τον RESULTS και παράλληλα τους NAMES, CASES με συνάρτηση
- Θα εμφανίζει το όνομα του καλύτερου νομικού
🔍 Ανάλυση
💡 Δομή Δεδομένων
| Πίνακας | Τύπος | Μέγεθος | Περιεχόμενο |
|---|---|---|---|
| NAMES | char | [15][40] | Ονόματα νομικών |
| CASES | int | [15] | Αριθμός υποθέσεων |
| RESULTS | float | [15] | Βαθμολογία = υποθέσεις × ποσοστό |
Παράδειγμα Υπολογισμού:
Νομικός: Παπαδόπουλος | Υποθέσεις: 50 | Ποσοστό: 0.85
RESULTS = 50 × 0.85 = 42.5
✅ Λύση
🔎 Ανάλυση Κώδικα
📌 Η Συνάρτηση Ταξινόμησης
- Χρησιμοποιεί Bubble Sort
- Κάθε swap στον RESULTS γίνεται παράλληλα και στους NAMES, CASES
- Διατηρείται η αντιστοιχία μεταξύ των πινάκων
⚠️ Σημαντικά
- strcpy(): Απαραίτητη για αντιγραφή strings (όχι απλή ανάθεση =)
- Φθίνουσα: Συνθήκη RESULTS[j] < RESULTS[j+1]
- 2D πίνακας: Το NAMES[15][40] είναι 15 strings των 40 χαρακτήρων
🖥️ Παράδειγμα Εξόδου
✅ Έννοιες που χρησιμοποιήθηκαν:
2D πίνακες χαρακτήρων, παράλληλοι πίνακες, Bubble Sort, strcpy(), συναρτήσεις με πίνακες, #define, format specifiers
🏋️ Άσκηση 4: Γυμναστήριο - Αξιολόγηση Προπονητών (Pointers)
📋 Εκφώνηση
📌 Ζητούμενο
Σε ένα γυμναστήριο υπάρχουν 12 προπονητές. Για κάθε προπονητή καταχωρούνται:
- Ονοματεπώνυμο (έως 39 χαρακτήρες) σε NAMES[12][40]
- Αριθμός πελατών σε CLIENTS[12]
- Ποσοστό ικανοποίησης (real στο [0,1]) σε SAT[12]
Να γραφεί πρόγραμμα σε C που:
- Διαβάζει τα παραπάνω στοιχεία για τους 12 προπονητές.
- Υπολογίζει για κάθε προπονητή: SCORE = CLIENTS × SAT και τον αποθηκεύει σε SCORES[12].
- Ταξινομεί κατά φθίνουσα σειρά με συνάρτηση που χρησιμοποιεί pointers.
- Εμφανίζει το όνομα του καλύτερου προπονητή.
📚 Θεωρία: Pointers στη C
⭐ Τι είναι ο Pointer;
Ένας pointer είναι μια μεταβλητή που αποθηκεύει τη διεύθυνση μνήμης μιας άλλης μεταβλητής.
Παράδειγμα στη Μνήμη:
int x = 42; int *p = &x;
📌 Σημαντικοί Τελεστές
| Τελεστής | Όνομα | Περιγραφή | Παράδειγμα |
|---|---|---|---|
| & | Address-of | Επιστρέφει τη διεύθυνση | &x → διεύθυνση του x |
| * | Dereference | Επιστρέφει την τιμή στη διεύθυνση | *p → τιμή που δείχνει ο p |
💡 Pointer Arithmetic
Όταν έχουμε έναν πίνακα float scores[12]:
- scores = διεύθυνση του πρώτου στοιχείου
- scores + j = διεύθυνση του scores[j]
- *(scores + j) = τιμή του scores[j]
Ισοδύναμα: scores[j] ⟺ *(scores + j)
✅ Λύση
🔎 Ανάλυση Κώδικα
⭐ Πώς λειτουργεί το swapFloat με Pointers;
| Γραμμή | Επεξήγηση |
|---|---|
| float tmp = *a; | tmp = τιμή στη διεύθυνση a |
| *a = *b; | τιμή στη διεύθυνση a = τιμή στη διεύθυνση b |
| *b = tmp; | τιμή στη διεύθυνση b = tmp |
Κλήση: swapFloat(scores + j, scores + j + 1);
Περνάμε τις διευθύνσεις των στοιχείων, όχι τις τιμές τους!
📌 Σύγκριση: Με και Χωρίς Pointers
| Χωρίς Pointers | Με Pointers |
|---|---|
| scores[j] | *(scores + j) |
| &scores[j] | scores + j |
| scores[j+1] | *(scores + j + 1) |
⚠️ Σημαντικά
- scanf με %39[^\n]: Διαβάζει μέχρι 39 χαρακτήρες ή newline (επιτρέπει κενά στο όνομα)
- Έλεγχος εγκυρότητας: While loops για επαναδιάβασμα σε περίπτωση λάθους
- 0.0f: Το 'f' δηλώνει ότι είναι float (όχι double)
🖥️ Παράδειγμα Εξόδου
✅ Έννοιες που χρησιμοποιήθηκαν:
Pointers, Pointer arithmetic (*(scores + j)), Swap με pointers, Τελεστής & (address-of), Τελεστής * (dereference), scanf με [^\n], Έλεγχος εγκυρότητας εισόδου, Παράλληλοι πίνακες