📝 Άσκηση 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!
🎭 Άσκηση 2: Σύστημα Κρατήσεων Θεάτρου
📌 Εκφώνηση
Ένα θέατρο διαθέτει αίθουσα χωρητικότητας 500 θέσεων.
Όταν κάποιος ενδιαφέρεται να «κλείσει» θέσεις για την παράσταση, τηλεφωνεί και δηλώνει τον αριθμό των εισιτηρίων που επιθυμεί:
- Αν οι κενές θέσεις επαρκούν τότε γίνεται η κράτηση των θέσεων
- Αν οι απαιτούμενες θέσεις είναι περισσότερες από τις κενές τότε δεν γίνεται η κράτηση
Η διαδικασία αυτή επαναλαμβάνεται μέχρι να γεμίσει η θεατρική αίθουσα (δεν θα μείνει καμία θέση κενή).
Να γραφεί πρόγραμμα σε C που θα υλοποιεί την παραπάνω διαδικασία συμπεριλαμβανόμενων και των απαραίτητων εκτυπώσεων - μηνυμάτων.
🔍 Βοήθεια
✅ Σενάριο 1: Επιτυχής κράτηση
Κενές: 500, Ζητούμενα: 50 → 50 ≤ 500 → Κράτηση OK! → Νέες κενές: 450
❌ Σενάριο 2: Αποτυχημένη κράτηση
Κενές: 30, Ζητούμενα: 50 → 50 > 30 → Αποτυχία! → Κενές παραμένουν: 30
📊 Ροή Προγράμματος
📌 Χρήσιμες Έννοιες
- const: Δηλώνει σταθερά που δεν αλλάζει
- while: Επανάληψη όσο ισχύει μια συνθήκη
- continue: Επιστρέφει στην αρχή του βρόχου
- -=: Σύνθετος τελεστής (x -= y ⟺ x = x - y)
⚖️ Άσκηση 3: Νομική Εταιρία Prins & Associates
📌 Εκφώνηση
Σε μια νομική εταιρία Prins & Associates εργάζονται 15 νομικοί όπου ο κάθε ένας από αυτούς επεξεργάζεται έναν αριθμό υποθέσεων.
Να γραφεί πρόγραμμα σε C το οποίο:
- Θα διαβάζει και θα καταχωρεί τα ονόματα των 15 νομικών στον πίνακα NAMES[15][40] και στον πίνακα CASES[15] τον αριθμό των υποθέσεων που έχει αναλάβει ο κάθε ένας.
- Για κάθε νομικό θα διαβάζει έναν πραγματικό αριθμό από το [0,1], που αντιπροσωπεύει το ποσοστό επιτυχίας του, το οποίο θα πολλαπλασιάζει με τον αριθμό των υποθέσεων του και το αποτέλεσμα θα αποθηκεύεται στον πίνακα RESULTS[15].
- Θα ταξινομεί τον πίνακα RESULTS[15] κατά φθίνουσα σειρά και μαζί του θα μεταβάλλονται και οι πίνακες των ονομάτων και των υποθέσεων. Η ταξινόμηση να πραγματοποιηθεί με συνάρτηση που θα κατασκευάσετε.
- Θα εμφανίζει το όνομα του καλύτερου νομικού της εταιρίας.
🔍 Βοήθεια
💡 Δομή Δεδομένων
| Πίνακας | Τύπος | Μέγεθος | Περιεχόμενο |
|---|---|---|---|
| NAMES | char | [15][40] | Ονόματα νομικών |
| CASES | int | [15] | Αριθμός υποθέσεων |
| RESULTS | float | [15] | Βαθμολογία = υποθέσεις × ποσοστό |
Παράδειγμα Υπολογισμού:
Νομικός: Παπαδόπουλος | Υποθέσεις: 50 | Ποσοστό: 0.85
RESULTS = 50 × 0.85 = 42.5
📌 Χρήσιμες Έννοιες
- 2D πίνακας char: Το NAMES[15][40] είναι 15 strings των 40 χαρακτήρων
- Παράλληλοι πίνακες: Όταν ταξινομείς έναν, μετακινείς και τους άλλους
- strcpy(): Για αντιγραφή strings (όχι απλή ανάθεση =)
- Φθίνουσα ταξινόμηση: Από το μεγαλύτερο στο μικρότερο
🏋️ Άσκηση 4: Γυμναστήριο - Αξιολόγηση Προπονητών
📌 Εκφώνηση
Σε ένα γυμναστήριο υπάρχουν 12 προπονητές. Για κάθε προπονητή καταχωρούνται:
- Ονοματεπώνυμο (έως 39 χαρακτήρες) σε NAMES[12][40]
- Αριθμός πελατών σε CLIENTS[12]
- Ποσοστό ικανοποίησης (real στο [0,1]) σε SAT[12]
Να γραφεί πρόγραμμα σε C που:
- Διαβάζει τα παραπάνω στοιχεία για τους 12 προπονητές.
- Υπολογίζει για κάθε προπονητή δείκτη: SCORE = CLIENTS × SAT και τον αποθηκεύει σε SCORES[12].
- Ταξινομεί κατά φθίνουσα σειρά τον πίνακα SCORES και μαζί να μετακινούνται και οι NAMES, CLIENTS, SAT. Η ταξινόμηση να γίνει με συνάρτηση που θα κατασκευάσετε και να χρησιμοποιεί pointers.
- Εμφανίζει το όνομα του καλύτερου προπονητή (μεγαλύτερο SCORE).
🔍 Βοήθεια
💡 Δομή Δεδομένων
| Πίνακας | Τύπος | Μέγεθος | Περιεχόμενο |
|---|---|---|---|
| NAMES | char | [12][40] | Ονόματα προπονητών |
| CLIENTS | int | [12] | Αριθμός πελατών |
| SAT | float | [12] | Ποσοστό ικανοποίησης [0-1] |
| SCORES | float | [12] | Βαθμολογία = CLIENTS × SAT |
📚 Θεωρία: 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)
Παράδειγμα Υπολογισμού:
Προπονητής: Γιάννης Παπαδόπουλος | Πελάτες: 50 | Ποσοστό: 0.92
SCORE = 50 × 0.92 = 46.0