Δ.Π.Θ. - Πολυτεχνική Σχολή Τμήμα Μηχανικών Παραγωγής & Διοίκησης Ακαδ. έτος 2018-2019 Τομέας Συστημάτων Παραγωγής Εξάμηνο Β Αναπληρωτής Καθηγητής Στέφανος Δ. Κατσαβούνης ΜΑΘΗΜΑ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) 18/03/2019 ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 3 η ΑΣΚΗΣΗ 1 Χρησιμοποιώντας ένα μονοδιάστατο πίνακα ακεραίων αριθμών 10 θέσεων να διερευνήσετε την ορθότητα των παρακάτω σχέσεων : 1. a[i] == (*(a + i)) 2. a[0] == (*(a + 0)) 3. a[0] == *(a + 0) 4. a[0] == *a 5. &a[i] == &(*(a + i)) 6. &a[i] == a + i 7. &a[i] == &a[0] + i ΑΣΚΗΣΗ 2 Να γράψετε μια συνάρτηση με όνομα out_of_order που θα δέχεται 2 παραμέτρους: ένα πίνακα με στοιχεία τύπου float και το μέγεθος του πίνακα τύπου int. Η συνάρτηση θα ελέγχει αν ο πίνακας είναι ταξινομημένος σε αύξουσα διάταξη (δηλ. a[0] <= a[1] <= a[2] <= ) και θα επιστρέφει : την τιμή 1 αν όλα τα στοιχεία είναι ταξινομημένα τη θέση του πρώτου στοιχείου που είναι εκτός ταξινομημένης διάταξης. Στη συνέχεια να γράψετε ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση out_of_order και θα εμφανίζει το αποτέλεσμα. ΑΣΚΗΣΗ 3 Να γραφεί συνάρτηση που θα βρίσκει και θα επιστρέφει τα συμπληρωματικά στοιχεία ενός μονοδιάστατου πίνακα n θέσεων. Συμπληρωματικά είναι εκείνα τα στοιχεία του πίνακα που βρίσκονται στις θέσεις 0 και n-1, 1 και n-2, 2 και n-3 κλπ. και το άθροισμά τους είναι διάφορο του 99. Στη συνέχεια να γραφεί πρόγραμμα που θα γεμίζει ένα μονοδιάστατο πίνακα 100 θέσεων με ακεραίους θετικούς αριθμούς από 0-99 ( θα γίνεται έλεγχος κατά την εισαγωγή, εφόσον χρησιμοποιηθεί η scanf_s), θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 1
ΑΣΚΗΣΗ 4 Να γράψετε δύο συναρτήσεις με ονόματα : convert_to_cylindrical convert_to_spherical που θα υπολογίζουν και θα επιστρέφουν τις κυλινδρικές και σφαιρικές συντεταγμένες ενός σημείου (xx, yy, zz). Κυλινδρικές Σφαιρικές ρρ = xx 2 + yy 2 xx = ρρccccccφφ rr = xx 2 + yy 2 + zz 2 xx = rrrrrrrrrrccccccφφ φφ = arctan (yy, xx) yy = ρρρρρρρρρρ θθ = arctan xx 2 + yy 2, zz yy = rrrrrrrrrrrrrrrrrr zz = zz zz = zz φφ = arctan (yy, xx) zz = rrrrrrrrrr Στη συνέχεια να γραφεί ένα πρόγραμμα που : 1. Θα δημιουργεί NNσημεία (xx, yy, zz) χρησιμοποιώντας τη συνάρτηση rand( ).Η τιμή του NN είναι γνωστή και θα πρέπει να οριστεί ως σταθερά 2. Θα καλεί τις δύο συναρτήσεις για καθένα από τα NN σημεία και θα εμφανίζει τις τιμές που επιστρέφονται από τις συναρτήσεις (ΥΠΟΔΕΙΞΗ : όλες οι τιμές θα είναι τύπου double). ΑΣΚΗΣΗ 5 Να γραφεί μια συνάρτηση με όνομα sumarrays() που θα έχει ως παραμέτρους δύο μονοδιάστατους πίνακες, θα προσθέτει όλες τις τιμές στους 2 πίνακες και θα επιστρέφει το αποτέλεσμα στη συνάρτηση main(). Στη συνέχεια να γραφεί η συνάρτηση main() όπου: Θα καταχωρούνται τα στοιχεία σε 2 μονοδιάστατους πίνακες ακεραίων αριθμών max σε πλήθος θέσεων, με χρήση τυχαίων αριθμών στο διάστημα 1-50. Θα καλείται η συνάρτηση sumarrays() ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 2
ΑΣΚΗΣΗ 6 Να γραφεί μια συνάρτηση με όνομα addinnew() που θα δέχεται ως παραμέτρους 2 μονοδιάστατους πίνακες του ιδίου μεγέθους. Η συνάρτηση θα προσθέτει τα αντίστοιχα στοιχεία των δύο πινάκων και θα τα τοποθετεί σε τρίτο (νέο) πίνακα της ίδιας διάστασης. Στη συνέχεια να γραφεί η συνάρτηση main() όπου: Θα καταχωρούνται τα στοιχεία σε 2 μονοδιάστατους πίνακες ακεραίων αριθμών max (max=γνωστό) σε πλήθος θέσεων, με χρήση τυχαίων αριθμών στο διάστημα 1-50. Θα καλείται η συνάρτηση addinnew() ΑΣΚΗΣΗ 7 Να γραφεί μια συνάρτηση με όνομα final και ορίσματα : ένα μονοδιάστατο πίνακα ακεραίων αριθμών n θέσεων έναν ακέραιο αριθμό k Η συνάρτηση: Θα δημιουργεί έναν νέο πίνακα που θα περιέχει όλα τα στοιχεία του αρχικού πίνακα των οποίων το άθροισμα, ξεκινώντας από την αρχή του πίνακα, δεν υπερβαίνει τον αριθμό k π.χ. αν ο πίνακας περιέχει τα στοιχεία : 11 7 3 17 9 4 20 15 και k=50 Τότε ο νέος πίνακας θα περιέχει τα στοιχεία 11 7 3 17 9 (είναι 11+7+3+17+9+4=51 >50 και το τελευταίο στοιχείο που ελέγχεται είναι το 4 αλλά δεν περιλαμβάνεται στο νέο πίνακα) Στη συνέχεια να γραφεί ένα πρόγραμμα που : 1. Θα δημιουργεί ένα πίνακα θετικών ακεραίων τυχαίων διψήφιων αριθμών μεγέθους max (max = γνωστό) 2. Θα καλεί τη συνάρτηση final με παραμέτρους τον πίνακα των τυχαίων αριθμών μεγέθους max και μια τιμή για την παράμετρο k 3. Θα εμφανίζει τα αποτελέσματα που θα επιστρέψει η συνάρτηση ΑΣΚΗΣΗ 8 Να γραφεί μια συνάρτηση με όνομα disparate και ορίσματα : ένα μονοδιάστατο πίνακα ακεραίων αριθμών n θέσεων Η συνάρτηση : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 3
Θα δημιουργεί ένα νέο πίνακα που θα περιλαμβάνει όλα στοιχεία του αρχικού πίνακα αλλά μόνον μία φορά το καθένα, δηλ. δεν θα περιέχει 2η φορά το ίδιο στοιχείο. Π.χ. αν ο αρχικός πίνακας περιέχει τα στοιχεία 2,4,5,9,4,3,5,2 ο νέος πίνακας θα περιέχει μόνον τα 2,4,5,9,3. (ΥΠΟΔΕΙΞΗ : κάθε φορά που ένα στοιχείο πρόκειται να εισαχθεί στον νέο πίνακα να ελέγχετε αν υπάρχει ήδη σε αυτόν). Στη συνέχεια να γραφεί ένα πρόγραμμα που : 1. Θα δημιουργεί ένα πίνακα ακεραίων μονοψήφιων τυχαίων αριθμών μεγέθους max (max = γνωστό) 2. Θα καλεί τη συνάρτηση disparate με παράμετρο εισόδου τον πίνακα των τυχαίων αριθμών 3. Θα εμφανίζει τα αποτελέσματα που θα επιστρέψει η συνάρτηση. ΑΣΚΗΣΗ 9 Να γραφεί μια συνάρτηση με όνομα find_values που θα δέχεται ως είσοδο ένα μονοδιάστατο πίνακα ακεραίων θετικών αριθμών, τριψήφιων ή τετραψήφιων (π.χ. τα στοιχεία του πίνακα μπορούν να είναι οι αριθμοί :1409, 877, 9527, 1405, 3318, 805, 1411) μεγέθους Ν (Ν = γνωστό, η τιμή του Ν για το προηγούμενο παράδειγμα είναι Ν=7 ). Η συνάρτηση : 1. από κάθε στοιχείο του πίνακα εισόδου θα βρίσκει έναν αριθμό, έστω Κ, που θα προκύπτει από το πρώτο (αν ο αριθμός είναι τριψήφιος) ή τα 2 πρώτα ψηφία (αν ο αριθμός είναι τετραψήφιος) του αντίστοιχου στοιχείου του πίνακα. (για το παράδειγμα οι αριθμοί Κ που θα προκύψουν θα είναι αντίστοιχα : 14, 8, 95, 14, 33, 8, 14) 2. θα βρίσκει στη συνέχεια τη συχνότητα εμφάνισης κάθε αριθμού Κ δηλ. για το παράδειγμα θα είναι: 8 2 φορές 14 3 φορές 33 1 φορά 95 1 φορά 3. θα επιστρέφει τα αποτελέσματα στο πρόγραμμα (δηλ. στη main() (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf) 1. θα γεμίζει ένα μονοδιάστατο πίνακα Ν θέσεων (Ν =γνωστό) με τριψήφιους ή τετραψήφιους ακέραιους και θετικούς αριθμούς. Αν η εισαγωγή τιμών γίνει με χρήση της scanf θα πρέπει να υπάρχουν οι κατάλληλοι έλεγχοι εγκυρότητας τιμών (δηλ. οι αριθμοί να είναι ακέραιοι και θετικοί τριψήφιοι ή τετραψήφιοι) 2. θα καλεί τη συνάρτηση find_values 3. θα εμφανίζει τα αποτελέσματα που θα επιστρέφει η συνάρτηση find_values ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 4
ΑΣΚΗΣΗ 10 Μια μονάδα παράγει ισομεγέθεις μεταλλικές ράβδους μήκους d και μετρά τις αποκλίσεις των παραγομένων ράβδων από την επιθυμητή διάσταση d. Θεωρείστε μια σειρά ακεραίων αριθμών, πλήθους Ν (Ν = γνωστό) που αντιστοιχεί στις αποκλίσεις που μετρήθηκαν σε ένα δείγμα Ν ράβδων π.χ. για Ν = 20 η σειρά μπορεί να είναι: 2,6,7,0,4,0,1,3,8,0,0,2,6,9,4,5,0,1,1,3 Να γράψετε μια συνάρτηση με όνομα bar_count που θα δέχεται ως είσοδο ένα μονοδιάστατο πίνακα Ν θέσεων που αντιστοιχεί στις αποκλίσεις Ν ράβδων από την επιθυμητή διάσταση και θα επιστρέφει στη main(), υπό μορφή πίνακα, το πλήθος των ράβδων που μεσολαβούν ανάμεσα στις ράβδους που έχουν μηδενικές αποκλίσεις. (Δηλαδή για το παράδειγμα θα επιστρέφονται οι τιμές 3,1,3,0,5,3). ΑΣΚΗΣΗ 11 Να γραφεί μια συνάρτηση με όνομα overweight και ορίσματα : ένα μονοδιάστατο πίνακα ακεραίων αριθμών n θέσεων έναν ακέραιο θετικό αριθμό m Σε κάθε θέση του πίνακα αντιστοιχεί ένα βάρος, που είναι αντιστρόφως ανάλογο με τον αριθμό της θέσης δηλαδή η 1 η θέση έχει βάρος ίσο με n, η 2 η θέση βάρος ίσο με n-1. και η n-οστή θέση βάρος ίσο με 1 π.χ. αν n=7 θέση 1η 2η 3η 4η 5η 6η 7 η Βάρος θέσης 7 6 5 4 3 2 1 στοιχείο 5 3 7 6 1 4 9 Η συνάρτηση θα υπολογίζει για κάθε θέση την τιμή : στοιχείο * βάρος θέσης και θα επιστρέφει: τη θέση του πίνακα, έστω k, για την οποία το άθροισμα : στοιχείο1*βάρος θέσης1 + στοιχείο2*βάρος θέσης2 + στοιχείοk*βάρος θέσηςk γίνεται μεγαλύτερο της τιμής m. την τιμή -1 αν δεν βρεθεί τέτοια θέση στον πίνακα π.χ. για το παραπάνω παράδειγμα και με τιμή m=100 το άθροισμα 5 * 7 + 3 * 6 + 7 * 5 + 6 * 4 = 102 υπερβαίνει την τιμή m=100 στην 4 η θέση άρα η συνάρτηση θα επιστρέψει την τιμή 4. Στη συνέχεια να γραφεί πρόγραμμα που θα καλεί τη συνάρτηση. ΑΣΚΗΣΗ 12 Να γραφούν δύο συναρτήσεις σε γλώσσα C που θα επιστρέφουν: Η πρώτη τον όγκο ενός κυλίνδρου με ακτίνα RR και ύψος HH( VV = ππrr 2 HH) Η δεύτερη τον όγκο ενός ορθογωνίου ύψους HH με βάση τετράγωνο πλευράς AA (VV = AA 2 HH) ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 5
1. Θα γεμίζει ένα πίνακα x[n][2] με ακέραιους αριθμούς με εύρος τιμών [1-999]. Αν η εισαγωγή των τιμών γίνει μέσω της εντολής scanf_s είναι απαραίτητος ο έλεγχος εγκυρότητας τιμών. 2. Θα καλεί για κάθε σειρά του πίνακα και τις δύο συναρτήσεις και θα εμφανίζει τις αντίστοιχες τιμές των συναρτήσεων (Η πρώτη στήλη του πίνακα αντιστοιχεί στα R ή A και η δεύτερη στήλη στο ύψος Η). ΑΣΚΗΣΗ 13 Οι Ν φάσεις κατεργασίας (Ν = γνωστό) που εκτελούνται στις εργαλειομηχανές μιας παραγωγικής μονάδας για την παραγωγή ενός προϊόντος εφοδιάζονται με : i. τον αριθμό ταυτοποίησης της φάσης κατεργασίας (id, ακέραιος αριθμός από 1 99) ii. τον κωδικό της εργαλειομηχανής (machine, ακέραιος αριθμός από 1 9) iii. την κατάσταση (status) της εργαλειομηχανής με τις εξής επιτρεπτές τιμές: 1 (σημαίνει ότι η εργαλειομηχανή είναι έτοιμη προς χρήση), 2 (σημαίνει ότι η εργαλειομηχανή δεν είναι διαθέσιμη προς χρήση ) Ένας πίνακας a[3*n] περιέχει ζεύγη τιμών (id, machine, status). Να γραφεί μια συνάρτηση με όνομα task_info και ορίσματα εισόδου: α) ένα μονοδιάστατο πίνακα ακεραίων θετικών αριθμών 3*Ν θέσεων, όπως ο πίνακας a. β) έναν ακέραιο αριθμό code που αντιστοιχεί στον κωδικό της εργαλειομηχανής (1 code 9, απαιτείται ο σχετικός έλεγχος) Η συνάρτηση task_info θα επιστρέφει στη συνάρτηση main( ) δύο νέους πίνακες : Ο ένας, έστω b, θα περιλαμβάνει όλες τις φάσεις κατεργασίας που μπορούν να εκτελεστούν στην συγκεκριμένη εργαλειομηχανή (δηλ. αυτήν με κωδικό code), δηλ. όλες τις φάσεις με status=1. Ο άλλος, έστω c, θα περιλαμβάνει όλες τις φάσεις κατεργασίας που δεν μπορούν να εκτελεστούν στη συγκεκριμένη εργαλειομηχανή (δηλ. αυτήν με κωδικό code), δηλ. όλες τις φάσεις με status=2. Κάθε ένας από τους δύο αυτούς πίνακες θα πρέπει να περιέχει τους αριθμούς ταυτοποίησης (δηλ. τις φάσεις κατεργασίας id) σε αύξουσα σειρά του id, ΧΩΡΙΣ να χρησιμοποιηθεί διαδικασία ταξινόμησης. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ) 1. θα γεμίζει τον πίνακα a, με χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand( ). Στην περίπτωση που μια φάση κατεργασίας προκύψει στα δεδομένα περισσότερες από μία φορές δεν δημιουργείται πρόβλημα (η φάση αυτή εκτελείται περισσότερες από μία φορές), αλλά θα εμφανίζεται μόνον μία φορά στους πίνακες αποτελεσμάτων. 2. θα καλεί τη συνάρτηση task_info και θα εμφανίζει τα αποτελέσματα που θα επιστρέφει η συνάρτηση. ΠΑΡΑΔΕΙΓΜΑ με Ν=9 και code=7 Πίνακας a (δηλ. 9 τριάδες) - όσες θέσεις αφορούν code=7 είναι σε γκρίζο φόντο: 79 2 1 11 7 2 67 7 1 88 4 1 5 7 2 19 3 1 90 7 2 27 7 1 59 3 2 ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 6
Αποτελέσματα : 27 67 αντιστοιχεί σε status = 1 5 11 90 αντιστοιχεί σε status = 2 ΑΣΚΗΣΗ 14 Να δημιουργηθεί δισδιάστατος πίνακας a με στοιχεία τυχαίους ακέραιους θετικούς, διαστάσεων 20 Χ 2. Στη συνέχεια να δημιουργηθεί και να εμφανιστεί ένας νέος πίνακας b που θα περιέχει εκείνες τις γραμμές του πίνακα a στις οποίες η διαφορά των τιμών στις 2 στήλες της γραμμής είναι κατά μέγιστο 10. ΑΣΚΗΣΗ 15 Να δημιουργηθεί δισδιάστατος πίνακας 10 Χ 5 με στοιχεία τυχαίους θετικούς ακεραίους διψήφιους αριθμούς. Στη συνέχεια: Να γραφεί μια συνάρτηση find_maxmin που θα βρίσκει το μέγιστο και το ελάχιστο στοιχείο κάθε γραμμής του πίνακα Η συνάρτηση main() θα καλεί την find_maxmin και θα εμφανίζει τα μέγιστα και ελάχιστα κάθε γραμμής μαζί με τον πίνακα σε κατάλληλη θέση, όπως φαίνεται παρακάτω: 19 45 77 43 34 77 19 35 79 65 27 45 79 27 2 3 6 7 8 8 2.. ΑΣΚΗΣΗ 16 Να γραφεί μία συνάρτηση με όνομα find_non_zero που θα δέχεται ως είσοδο ένα μονοδιάστατο πίνακα nn θέσεων και θα επιστρέφει (υπό μορφή πίνακα) τις θέσεις των στοιχείων με τιμές ίσες με μία δεδομένη γνωστή τιμή, έστω cc. Να δημιουργηθεί δισδιάστατος τετραγωνικός πίνακας, μεγέθους nn XX nn (nn = γνωστό), και να γεμίσει με τυχαίους αριθμούς 0 ή 1. Στη συνέχεια να χρησιμοποιηθεί η συνάρτηση find_non_zero για να βρεθούν και να εμφανιστούν, για ολόκληρο τον πίνακα, οι θέσεις των μη μηδενικών στοιχείων του. ΑΣΚΗΣΗ 17 Οι Ν φάσεις κατεργασίας που εκτελούνται στις εργαλειομηχανές μιας παραγωγικής μονάδας για την παραγωγή ενός προϊόντος (Ν = γνωστό) εφοδιάζονται με έναν αριθμό ταυτοποίησης (id, ακέραιος αριθμός από 1 99) και την κατάσταση (status) με τις εξής τιμές: 0 (σημαίνει ότι η φάση κατεργασίας είναι σε παύση εκτέλεσης), ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 7
1 (σημαίνει ότι η φάση κατεργασίας είναι σε εξέλιξη), 2 (σημαίνει ότι η φάση κατεργασίας απέτυχε), 3 (σημαίνει ότι η φάση κατεργασίας ολοκληρώθηκε με επιτυχία). Ένας πίνακας a[2*n] περιέχει ζεύγη τιμών (id, status). Να γραφεί μια συνάρτηση με όνομα find_status και ορίσματα εισόδου: α) ένα μονοδιάστατο πίνακα ακεραίων θετικών αριθμών 2*Ν θέσεων, όπως ο πίνακας a. β) έναν ακέραιο αριθμό, έστω flag, με επιτρεπτές τιμές 0, 1, 2 ή 3. Η συνάρτηση find_status θα επιστρέφει στη συνάρτηση main( ) έναν νέο πίνακα, που θα περιλαμβάνει μόνον εκείνους τους αριθμούς ταυτοποίησης (δηλ. τις φάσεις κατεργασίας id) των οποίων το status είναι ίσο με το flag, σε αύξουσα σειρά του id, ΧΩΡΙΣ να χρησιμοποιηθεί διαδικασία ταξινόμησης. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf) 1. θα γεμίζει τον πίνακα a, με χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand( ). Στην περίπτωση που μια φάση κατεργασίας υπάρχει περισσότερες από μία φορές δεν δημιουργείται πρόβλημα (η φάση αυτή εκτελείται περισσότερες από μία φορές). 2. θα καλεί διαδοχικά τη συνάρτηση find_status, για όλες τις πιθανές τιμές της flag, και θα εμφανίζει τα αποτελέσματα που θα επιστρέφει η συνάρτηση. ΠΑΡΑΔΕΙΓΜΑ με Ν=13 Πίνακας με αριθμό φάσης κατεργασίας και κατάσταση, ανά ζεύγη (δηλ. 13 ζεύγη): 7 3 95 1 14 0 27 1 74 2 88 0 55 3 19 1 4 0 90 2 22 0 35 1 16 3 Επιστρεφόμενοι πίνακες στη συνάρτηση main( ): status Φάσεις κατεργασίας 0 4 14 22 88 1 19 27 35 95 2 74 90 3 7 16 55 ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 8
ΑΣΚΗΣΗ 18 Να γραφεί μία συνάρτηση void remove_min που θα διαγράφει το μικρότερο ή τα μικρότερα σε τιμή στοιχεία ενός μονοδιάστατου αριθμητικού πίνακα Ν θέσεων (Ν = γνωστό). ΑΣΚΗΣΗ 19 Να γραφεί μια συνάρτηση με όνομα is_magic που θα ελέγχει εάν ένας τετραγωνικός πίνακας Ν x N με στοιχεία τους ακεραίους θετικούς αριθμούς 1, 2, 3,, Ν 2 είναι «μαγικός», εάν δηλαδή το άθροισμα των στηλών, το άθροισμα των γραμμών, το άθροισμα των στοιχείων της κυρίας διαγωνίου και το άθροισμα των στοιχείων της δευτερεύουσας διαγωνίου είναι ίσα μεταξύ τους. Η συνάρτηση πρέπει καταρχήν να καλεί μια άλλη συνάρτηση test_numbers που θα ελέγχει εάν όλες οι τιμές 1, 2, 3,, Ν 2 υπάρχουν, από μία μόνο φορά, στον τετραγωνικό πίνακα Ν x Ν. ΠΑΡΑΔΕΙΓΜΑ 6 1 8 7 5 3 2 9 4 Α) 6+1+8=7+5+3=2+9+4=15 Β) 6+7+2=1+5+9=8+3+4=15 Γ) 6+5+4=15 Δ) 2+5+8=15 ΑΣΚΗΣΗ 20 Δύο μονοδιάστατοι πίνακες, έστω a και b, είναι όμοιοι εάν περιέχουν ακριβώς τα ίδια στοιχεία, όχι απαραίτητα στις ίδιες θέσεις. Να γραφεί μια συνάρτηση με όνομα check_identical με ορίσματα εισόδου δύο μονοδιάστατους πίνακες ακεραίων θετικών αριθμών με ίδιο μέγεθος Ν (Ν = γνωστό) Η συνάρτηση check_identical θα επιστρέφει στη συνάρτηση main( ) : την τιμή 0 εάν οι δύο πίνακες περιέχουν ακριβώς τα ίδια στοιχεία την τιμή 1 εάν οι δύο πίνακες ΔΕΝ ΠΕΡΙΈΧΟΥΝ ακριβώς τα ίδια στοιχεία καθώς και έναν νέο πίνακα που θα περιέχει σε αύξουσα διάταξη, ΧΩΡΙΣ να χρησιμοποιηθεί διαδικασία ταξινόμησης, όλα τα μη κοινά στοιχεία και των δύο πινάκων. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf) ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 9
1. θα γεμίζει τους πίνακες a και b, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand() ώστε οι τιμές να ανήκουν στο διάστημα [1-30]. 2. θα καλεί τη συνάρτηση check_identical, και θα εμφανίζει τα σχετικά αποτελέσματα. ΠΑΡΑΔΕΙΓΜΑ με Ν=8: Πίνακας a 4 3 8 14 11 9 3 17 Πίνακας b Αποτελέσματα στη main( ) : 14 9 7 19 17 3 9 8 1 (δηλ. οι πίνακες δεν είναι όμοιοι) Μη κοινά στοιχεία σε αύξουσα διάταξη : 3, 4, 7, 9, 11, 19 ΑΣΚΗΣΗ 21 Δύο μονοδιάστατοι αριθμητικοί πίνακες θετικών ακεραίων αριθμών, έστω ab,, με πλήθος στοιχείων mn, αντίστοιχα, περιέχουν θετικούς ακέραιους αριθμούς στην περιοχή [0-99]. ΝΑ ΘΕΩΡΗΣΕΤΕ ΩΣ ΔΕΔΟΜΕΝΟ ΟΤΙ: κάθε ακέραιος αριθμός εμφανίζεται μόνον μία φορά σε κάθε πίνακα και ότι οι δύο πίνακες, ab,, δεν έχουν κανένα κοινό στοιχείο. Να γραφεί μια συνάρτηση με όνομα check_successive με ορίσματα εισόδου τους πίνακες ab., Η συνάρτηση check_ successive θα επιστρέφει στη συνάρτηση main( ) : Έναν νέο πίνακα που θα περιέχει σε αύξουσα διάταξη, ΧΩΡΙΣ να χρησιμοποιηθεί διαδικασία ταξινόμησης, όλα τα στοιχεία των δύο πινάκων ab., Αν τα στοιχεία του νέου πίνακα δεν είναι απολύτως διαδοχικά θα πρέπει να επιστρέφονται επίσης σε μορφή μονοδιάστατου αριθμητικού πίνακα οι τιμές που λείπουν, στο διάστημα τιμών που οριοθετούν το πρώτο και το τελευταίο στοιχείο του νέου πίνακα. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf) 1. θα γεμίζει τους πίνακες ab,, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand( ) ώστε οι τιμές να ανήκουν στο διάστημα [0-99]. 2. θα καλεί τη συνάρτηση check_ successive και θα εμφανίζει τα σχετικά αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 10
ΠΑΡΑΔΕΙΓΜΑ με m= 8, n= 6 : Πίνακας a 14 13 8 17 21 20 19 9 Πίνακας b 7 5 22 11 16 25 Αποτελέσματα στη main( ) : Ο νέος πίνακας είναι : 5 7 8 9 11 13 14 16 17 19 20 21 22 25 Πίνακας με τις τιμές που λείπουν στο διάστημα [5,25] : 6 10 12 15 18 23 24 ΑΣΚΗΣΗ 22 Δύο μονοδιάστατοι αριθμητικοί πίνακες θετικών ακεραίων αριθμών, έστω ab,, με πλήθος στοιχείων mn, αντίστοιχα, περιέχουν θετικούς ακέραιους αριθμούς στην περιοχή [0-99]. Να θεωρήσετε ότι οι δύο πίνακες περιέχουν κοινά στοιχεία. Να γραφεί μια συνάρτηση με όνομα check_chain με ορίσματα εισόδου τους πίνακες ab., Η συνάρτηση check_ chain θα επιστρέφει στη συνάρτηση main( ) : Έναν νέο πίνακα που θα περιέχει σε αύξουσα διάταξη, ΧΩΡΙΣ να χρησιμοποιηθεί διαδικασία ταξινόμησης, όλα τα στοιχεία των δύο πινάκων ab, υπό την προϋπόθεση ότι κάθε στοιχείο στον νέο πίνακα θα εμφανίζεται ΜΟΝΟΝ ΜΙΑ ΦΟΡΑ. Τη μεγαλύτερη ακολουθία διαδοχικών τιμών στον νέο πίνακα. Η ακολουθία θα δημιουργεί έναν κατάλληλο αριθμητικό πίνακα. Να θεωρήσετε ότι υπάρχει μόνον μία τέτοια ακολουθία (δηλ. δεν υπάρχει δεύτερη ακολουθία με το ίδιο μήκος). (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf) 1. θα γεμίζει τους πίνακες ab,, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand( ) ώστε οι τιμές να ανήκουν στο διάστημα [0-99]. 2. θα καλεί τη συνάρτηση check_ chain και θα εμφανίζει τα σχετικά αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 11
ΠΑΡΑΔΕΙΓΜΑ με m= 8, n= 6 : Πίνακας a 14 13 8 7 21 20 19 9 Πίνακας b 7 8 22 11 18 16 Αποτελέσματα στη main( ) : Ο νέος πίνακας είναι : 7 8 9 11 13 14 16 18 19 20 21 22 Πίνακας με την ακολουθία διαδοχικών τιμών : 18 19 20 21 22 ΑΣΚΗΣΗ 23 Δύο μονοδιάστατοι αριθμητικοί πίνακες θετικών ακεραίων αριθμών, έστω ab,, με γνωστό πλήθος στοιχείων mn, αντίστοιχα, περιέχουν τιμές στην περιοχή [0-99]. Να θεωρήσετε ότι οι δύο πίνακες περιέχουν κοινά στοιχεία. Να γραφεί μια συνάρτηση με όνομα fcc με ορίσματα εισόδου τους πίνακες ab, η οποία θα επιστρέφει στη συνάρτηση main( ) : Έναν νέο πίνακα c, που θα περιέχει σε αύξουσα διάταξη, ΧΩΡΙΣ να χρησιμοποιηθεί διαδικασία ταξινόμησης, όλα τα στοιχεία των δύο πινάκων ab, υπό την προϋπόθεση ότι κάθε στοιχείο στον νέο πίνακα θα εμφανίζεται ΜΟΝΟΝ ΜΙΑ ΦΟΡΑ. Έναν νέο πίνακα d, με τα όρια όλων των περιοχών τιμών του πίνακα c που είναι διαδοχικές, υπό μορφή ζευγών. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf) 1. θα γεμίζει τους πίνακες ab,, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand( ) ώστε οι τιμές να ανήκουν στο διάστημα [0-99]. 2. θα καλεί τη συνάρτηση fcc και θα εμφανίζει τα σχετικά αποτελέσματα. ΠΑΡΑΔΕΙΓΜΑ με m= 8, n= 6 : Πίνακας a 14 13 8 7 21 20 19 9 Πίνακας b Αποτελέσματα στη main( ) : 7 8 22 11 18 16 ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 12
Ο νέος πίνακας c : 7 8 9 11 13 14 16 18 19 20 21 22 Ο νέος πίνακας d με τα όρια των περιοχών με διαδοχικές τιμές : 7 9 13 14 18 22 ΑΣΚΗΣΗ 24 Θεωρείστε έναν μονοδιάστατο πίνακα ακεραίων θετικών αριθμών Ν θέσεων (Ν= γνωστό) με τιμές στην περιοχή [0,99]. Ορίζουμε ως pivot μία οποιαδήποτε θέση του πίνακα. Να διαμερίσετε τον πίνακα, δημιουργώντας έναν νέο πίνακα, σε δυο τμήματα ως εξής: ο νέος πίνακας περιλαμβάνει στο πρώτο του τμήμα, σε αύξουσα διάταξη, χωρίς να χρησιμοποιηθεί διαδικασία ταξινόμησης, όλες τις τιμές του αρχικού πίνακα που είναι μικρότερες ή και ίσες από την τιμή που υπάρχει στη θέση pivot. Στη συνέχεια, υπάρχει η τιμή της θέσης pivot και ακολουθούν, στο δεύτερο τμήμα του, οι τιμές του αρχικού πίνακα που είναι μεγαλύτερες της τιμής που υπάρχει στη θέση pivot, όπως εμφανίζονται στον αρχικό πίνακα, από αριστερά προς τα δεξιά. ΠΑΡΑΔΕΙΓΜΑ για Ν = 10, pivot = 3 (η τιμή που βρίσκεται στην 3 η θέση του πίνακα, δηλ. η τιμή 14) αρχικός πίνακας 3 2 91 14 44 3 8 11 16 5 νέος πίνακας 2 3 3 5 8 11 14 91 44 16 Να γραφεί μια συνάρτηση με όνομα check_pivot με ορίσματα εισόδου έναν μονοδιάστατο πίνακα ακεραίων θετικών αριθμών Ν θέσεων (Ν = γνωστό) και μια τιμή pivot. Η συνάρτηση check_pivot θα επιστρέφει στη συνάρτηση main( ) τον νέο πίνακα. ( ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ) ) 1. θα δίνει τιμές στα ορίσματα εισόδου της συνάρτησης check_pivot, εντός των αποδεκτών ορίων τιμών, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand(). 2. θα καλεί τη συνάρτηση check_pivot, και θα εμφανίζει τα σχετικά αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 13
ΑΣΚΗΣΗ 25 Θεωρείστε έναν μονοδιάστατο πίνακα ακεραίων θετικών αριθμών. Ο πίνακας περιέχει N (Ν = γνωστό και N>200) ζεύγη ακεραίων θετικών τιμών. Κάθε ζεύγος τιμών αντιστοιχεί στον αύξοντα αριθμό εβδομάδας (επιτρεπτές τιμές 1-52, όλες οι εβδομάδες αφορούν το ίδιο ημερολογιακό έτος) και στις ώρες εκτός λειτουργίας εντός της συγκεκριμένης εβδομάδας μιας οποιασδήποτε εργαλειομηχανής σε μία βιομηχανική μονάδα. Κάθε αύξων αριθμός εβδομάδας μπορεί να υπάρχει περισσότερες από μία φορές και ο πίνακας δεν είναι ταξινομημένος ως προς τον αύξοντα αριθμό εβδομάδας, δηλ. τα ζεύγη υπάρχουν με τυχαία σειρά. Ενδέχεται να μην υπάρχουν όλοι οι δυνητικοί αύξοντες αριθμοί εβδομάδας στον πίνακα. Να γραφεί μια συνάρτηση με όνομα weeks_off που θα δέχεται ως όρισμα εισόδου αυτόν τον πίνακα. Η συνάρτηση θα επιστρέφει στην main( ): 1. Ένα νέο μονοδιάστατο πίνακα που θα περιλαμβάνει σε αύξουσα σειρά, χωρίς να χρησιμοποιηθεί διαδικασία ταξινόμησης, όλους τους υπάρχοντες αύξοντες αριθμούς εβδομάδας, καθέναν από μία φορά. 2. Ένα νέο μονοδιάστατο πίνακα που θα περιλαμβάνει σε αύξουσα σειρά, χωρίς να χρησιμοποιηθεί διαδικασία ταξινόμησης, ζεύγη ακεραίων θετικών τιμών : (α/α εβδομάδας, συνολικός χρόνος εκτός λειτουργίας για την εβδομάδα, για όλες τις εργαλειομηχανές), για όλους τους υπάρχοντες α/α εβδομάδας του αρχικού πίνακα εισόδου. ( ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ) Παράδειγμα με N=8 : αρχικός πίνακας 13 2 19 4 33 8 8 11 13 9 8 5 19 4 50 40 νέος πίνακας μόνον με τους κωδικούς 8 13 19 33 50 Νέος πίνακας ζευγών 8 16 13 11 19 8 33 8 50 40 θα δίνει τιμές στα ορίσματα εισόδου της συνάρτησης weeks_off, εντός των αποδεκτών ορίων τιμών, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand(). θα καλεί τη συνάρτηση weeks_off, και θα εμφανίζει τα σχετικά αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 14
ΑΣΚΗΣΗ 26 Μονοδιάστατος αριθμητικός πίνακας, έστω a, μεγέθους M=24, περιέχει ακέραιες θετικές τιμές, στην περιοχή [10,20] που εκφράζουν την προγραμματισμένη ωριαία ποσότητα παραγωγής ενός προϊόντος. Η παραγωγική μονάδα παράγει το προϊόν σε δύο πανομοιότυπες γραμμές παραγωγής, 1 και 2, σε συνεχή 24ωρη λειτουργία. Δεύτερος μονοδιάστατος αριθμητικός πίνακας ακεραίων, έστω b, περιέχει σε μορφή συνεχόμενων τριάδων τις εξής πληροφορίες (η ωριαία παραγωγή κάθε γραμμής καταχωρείται άπαξ): Κωδικός γραμμής παραγωγής (1 ή 2) Πραγματική παραχθείσα ωριαία ποσότητα, περιοχή επιτρεπτών τιμών [10,20] Ώρα που παρήχθη η ανωτέρω ποσότητα [1, 24] Ο πίνακας b έχει μέγεθος Ν τριάδες. Τα δεδομένα του πίνακα b δεν είναι ταξινομημένα ως προς κάποια πληροφορία. Να γραφεί μια συνάρτηση με όνομα check_prod και παραμέτρους εισόδου τους πίνακες a και b. Η συνάρτηση θα επιστρέφει στην main( ), για κάθε μία από τις δύο γραμμές παραγωγής : 1. Την ωριαία πλεονάζουσα ή υπολειπόμενη ποσότητα παραγωγής, κατά αύξουσα σειρά της ώρας, χωρίς να χρησιμοποιηθεί διαδικασία ταξινόμησης, υπό μορφή μονοδιάστατου πίνακα. 2. Τη συνολική παραχθείσα ποσότητα και κατά πόσο αυτή ξεπερνά ή υπολείπεται της προγραμματισμένης συνολικής ημερήσιας παραγωγής ( ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ) Παράδειγμα, πίνακας a : 15 11 18 18 20 19 14 17 17 11 14 13 12 19 14 11 20 20 11 17 15 16 17 10 Πίνακας b με 6 τριάδες τιμών 1 19 7 1 13 5 2 11 13 1 10 22 2 18 6 1 20 11 Από τα δεδομένα αυτά προκύπτει π.χ. για τη γραμμή 1 και την ώρα 7 πλεονάζουσα παραγωγή 7 προϊόντων, ενώ για τη γραμμή 2 και την ώρα 6 προκύπτει έλλειμμα παραγωγής 1 προϊόντος θα δίνει τιμές στα ορίσματα εισόδου της συνάρτησης check_prod, εντός των αποδεκτών ορίων τιμών, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand(). θα καλεί τη συνάρτηση check_prod, και θα εμφανίζει τα σχετικά αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 15
ΑΣΚΗΣΗ 27 Κάθε πρώτος (prime) αριθμός διαιρείται μόνον με τη μονάδα και με τον εαυτό του. Ο πρώτος prime αριθμός είναι το 2. Στη συνέχεια παρατίθεται μία περιοχή συνεχόμενων primes αριθμών, μικρότερων του 1000:. 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691,. 1. Να γραφεί μία συνάρτηση με όνομα find_prime που θα δέχεται ως παράμετρο έναν ακέραιο θετικό αριθμό z και θα επιστρέφει εάν ο αριθμός αυτός είναι πρώτος (prime). Να χρησιμοποιήσετε τον πηγαίο κώδικα που δίνεται στο τέλος. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ). 2. Να γραφεί μια συνάρτηση με όνομα primes_triplets και παράμετρο εισόδου έναν πίνακα ακεραίων θετικών αριθμών, έστω a, μεγέθους n. Η συνάρτηση θα επιστρέφει στη main( ) : a. Ένα νέο πίνακα, με όνομα b, που θα περιέχει σε αύξουσα σειρά διάταξης όλα τα στοιχεία του πίνακα a, που είναι πρώτοι (primes) αριθμοί, χρησιμοποιώντας τη συνάρτηση find_prime. b. Ένα νέο πίνακα, έστω c που θα περιέχει τριάδες ακεραίων αριθμών, ως εξής (ΠΡΟΣΟΧΗ : Η συνάρτηση δεν θα πρέπει να περιέχει εντολές printf) : i. Ο πρώτος αριθμός σε κάθε τριάδα θα είναι κάθε αριθμός του πίνακα a που δεν είναι πρώτος (prime). ii. Ο δεύτερος αριθμός σε κάθε τριάδα θα είναι ο αμέσως μικρότερος prime αριθμός από τον πρώτο αριθμό της τριάδας. iii. Ο τρίτος αριθμός σε κάθε τριάδα θα είναι ο αμέσως μεγαλύτερος prime αριθμός από τον πρώτο αριθμό της τριάδας. ΠΑΡΑΔΕΙΓΜΑ: αν ο αριθμός από τον πίνακα a είναι ο 627 η τριάδα θα είναι 627, 619, 631 3. Μονοδιάστατος αριθμητικός πίνακας ακεραίων, x, περιέχει N ακεραίους αριθμούς ( N = γνωστό και N > 20 ), στο διάστημα [100-999]. Στη συνάρτηση main( ) : a. Να καταχωρήσετε τιμές στα στοιχεία του πίνακα x, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand(). b. Να καλέσετε τη συνάρτηση primes_triplets, με παράμετρο εισόδου τον πίνακα x, και να εμφανίσετε τα αποτελέσματα που προκύπτουν από την κλήση της συνάρτησης. #include <stdio.h> void main() { int n, i, flag = 1; printf("enter a positive integer: "); scanf("%d",&n); for(i=2; i<=n/2; ++i) { if(n%i==0) { flag=0; break; } } if (flag = = 1) printf("%d is a prime number.",n); else printf("%d is not a prime number.",n); } ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 16
ΑΣΚΗΣΗ 28 Μονοδιάστατος αριθμητικός πίνακας ακεραίων, a, περιέχει N ζεύγη τιμών ( N = γνωστό και N > 100 ) που αντιστοιχούν, για τις ημέρες του ιδίου μήνα : στην ποσότητα παραγωγής (θετικές ακέραιες τιμές στην περιοχή [0,999]) K διαφορετικών προϊόντων και στον κωδικό προϊόντος (με κωδικούς στην περιοχή τιμών [1, M ], όπου M ένας γνωστός ακέραιος θετικός αριθμός, ( 0 < M < 10 ). Το πλήθος των διαφορετικών προϊόντων K είναι μικρότερο από την τιμή M. Κάθε προϊόν μπορεί να εμφανίζεται περισσότερες από μία φορές στον πίνακα. Παράδειγμα για N = 11, M = 10 και K = 4 (δηλ. τέσσερα διαφορετικά προϊόντα που έχουν κωδικούς 2, 5, 8 και 9) 270 2 200 8 410 5 450 2 330 9 500 8 220 9 560 5 450 9 170 5 150 2 Ένας μονοδιάστατος σταθερός πίνακας b, μεγέθους M, περιέχει τις προβλεπόμενες μηνιαίες ποσότητες παραγωγής για καθένα από τα M προϊόντα, π.χ. Προβλεπ. Μην. Ποσότ. παραγωγής 2000 1700 1900 1500 1020 1090 880 890 550 1300 Κωδικός προϊόντος 0 1 2 3 4 5 6 7 8 9 Να γραφεί μια συνάρτηση με όνομα real_pr και παράμετρο εισόδου τον πίνακα a. Η συνάρτηση θα επιστρέφει στη main( ) : 1. Έναν νέο πίνακα, με όνομα z, που θα περιέχει σε αύξουσα διάταξη, χωρίς να χρησιμοποιηθεί κάποια μέθοδος ταξινόμησης, τους κωδικούς προϊόντων που υπάρχουν στον πίνακα a για τα οποία η συνολική μηνιαία πραγματική ποσότητα παραγωγής υπερβαίνει την προβλεπόμενη μηνιαία ποσότητα παραγωγής 9) μαζί με την πλεονάζουσα μηνιαία ποσότητα παραγωγής, υπό μορφή ζευγών (κωδικός προϊόντος, πλεονάζουσα μηνιαία ποσότητα παραγωγής). (Για το παράδειγμα ο πίνακας z θα περιέχει τα ζεύγη τιμών (5,50), (8,150) (π.χ. για τον κωδικό 5 : συνολική ποσότητα 410+560+170=1140 > 1090, πλεονάζουσα ποσότητα 1140-1090=50) 2. Έναν ακόμη νέο πίνακα, y, που θα περιέχει τους κωδικός προϊόντος που έχουν συνολική μηνιαία πραγματική ποσότητα παραγωγής μικρότερη της προβλεπόμενης. Οι κωδικοί προϊόντος θα καταχωρούνται στον νέο πίνακα σε αύξουσα διάταξη. Ο νέος πίνακας για το ανωτέρω παράδειγμα θα είναι (π.χ. για τον κωδικό 2: 270+450+150=870 <1900) 2 9 (ΥΠΟΔΕΙΞΗ : τα στοιχεία στους δύο νέους πίνακες μπορούν να καταχωρούνται ταυτόχρονα) (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ) 1. θα δίνει τιμές στα ορίσματα εισόδου της συνάρτησης real_pr, εντός των αποδεκτών ορίων τιμών, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand(). 2. θα καλεί τη συνάρτηση real_pr, και θα εμφανίζει τα σχετικά αποτελέσματα. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 17
ΑΣΚΗΣΗ 29 Ένας ακέραιος θετικός αριθμός μπορεί να γραφεί ως άθροισμα δύο διαφορετικών πρώτων (primes) αριθμών. Παράδειγμα για τον αριθμό 16 ( ο πρώτος prime αριθμός είναι το 2) : 16 = 2 + 14 Το 2 είναι πρώτος, το 14 όχι 16 = 3 + 13 Και οι δύο είναι πρώτοι 16 = 4 + 12 Κανένας δεν είναι πρώτος 16 = 5 + 11 Και οι δύο είναι πρώτοι 16 = 6 + 10 Κανένας δεν είναι πρώτος 16 = 7 + 9 Το 7 είναι πρώτος, το 9 όχι 16 = 8 + 8 Οι αριθμοί είναι ΙΔΙΟΙ!!!! 4. Να γραφεί μία συνάρτηση με όνομα find_prime που θα δέχεται ως παράμετρο έναν ακέραιο θετικό αριθμό z και θα επιστρέφει εάν ο αριθμός αυτός είναι πρώτος (prime). Να χρησιμοποιήσετε τον πηγαίο κώδικα που δίνεται στο τέλος. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ). 5. Να γραφεί μια συνάρτηση με όνομα primes_sum και παράμετρο εισόδου έναν ακέραιο θετικό αριθμό m. Η συνάρτηση θα επιστρέφει στη main( ) έναν πίνακα, με όνομα b, που θα περιέχει όλα τα ζεύγη πρώτων αριθμών, το άθροισμα των οποίων είναι ίσο με τον αριθμό m. Τα ζεύγη θα δημιουργούνται ταξινομημένα σε αύξουσα διάταξη ως προς το πρώτο στοιχείο κάθε ζεύγους. (ΠΡΟΣΟΧΗ: η συνάρτηση ΔΕΝ θα πρέπει να περιέχει εντολές printf ). 6. Μονοδιάστατος αριθμητικός πίνακας ακεραίων, a, περιέχει N ακεραίους αριθμούς ( N = γνωστό και N > 20 ). Οι αριθμοί ανήκουν στο διάστημα [100-999]. Στη συνάρτηση main( ): a. Να καταχωρήσετε τιμές στα στοιχεία του πίνακα a εντός των αποδεκτών ορίων τιμών, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand(). b. Για κάθε στοιχείο του πίνακα a να βρείτε και να εμφανίσετε όλα τα ζεύγη των πρώτων (primes) αριθμών το άθροισμα των οποίων ισούται με το στοιχείο αυτό, χρησιμοποιώντας τις συναρτήσεις find_prime και primes_sum. Σε κάθε γραμμή της οθόνης θα εμφανίζεται το στοιχείο του πίνακα και όλα τα σχετικά ζεύγη. Στο τέλος θα εμφανίζεται και το πλήθος αυτών των ζευγών. ΑΡΙΘΜΗΤΙΚΟ ΠΑΡΑΔΕΙΓΜΑ m = 250 ζεύγη : (11,239), (17, 233), (23,227), (53,197), (59,191), (71,179), (83,167), (101,149), (113,137) #include <stdio.h> void main() { int n, i, flag = 0; printf("enter a positive integer: "); scanf("%d",&n); for(i=2; i<=n/2; ++i) if(n%i==0) { flag=1; break; } if (flag==0) printf("%d is a prime number.",n); else printf("%d is not a prime number.",n); } ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2018-2019 18