Δ.Π.Θ. - Πολυτεχνική Σχολή Τμήμα Μηχανικών Παραγωγής & Διοίκησης Ακαδ. έτος 2017-2018 Τομέας Συστημάτων Παραγωγής Εξάμηνο Β Αναπληρωτής Καθηγητής Στέφανος Δ. Κατσαβούνης ΜΑΘΗΜΑ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) 20/03/2018 ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ 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), θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα. 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() 2
ΑΣΚΗΣΗ 6 Να γραφεί μια συνάρτηση με όνομα addinnew() που θα δέχεται ως παραμέτρους 2 μονοδιάστατους πίνακες του ιδίου μεγέθους. Η συνάρτηση θα προσθέτει τα αντίστοιχα στοιχεία των δύο πινάκων και θα τα τοποθετεί σε τρίτο (νέο) πίνακα της ίδιας διάστασης. Στη συνέχεια να γραφεί η συνάρτηση main() όπου: Θα καταχωρούνται τα στοιχεία σε 2 μονοδιάστατους πίνακες ακεραίων αριθμών max (max=γνωστό) σε πλήθος θέσεων, με χρήση τυχαίων αριθμών στο διάστημα 1-50. Θα καλείται η συνάρτηση addinnew() ΑΣΚΗΣΗ 7 Να γραφεί μια συνάρτηση με όνομα final και ορίσματα : ένα μονοδιάστατο πίνακα ακεραίων αριθμών n θέσεων έναν ακέραιο αριθμό k Η συνάρτηση: Θα δημιουργεί έναν νέο πίνακα που θα περιέχει όλα τα στοιχεία του αρχικού πίνακα των οποίων το άθροισμα, ξεκινώντας από την αρχή του πίνακα, δεν υπερβαίνει τον αριθμό k π.χ. αν ο πίνακας περιέχει τα στοιχεία : Και k=50 Τότε ο νέος πίνακας θα περιέχει τα στοιχεία 11 7 3 17 9 4 20 15 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 θέσεων Η συνάρτηση : 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 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) 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 Αποτελέσματα : 27 67 αντιστοιχεί σε status = 1 5 11 90 αντιστοιχεί σε status = 2 6
ΑΣΚΗΣΗ 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 (σημαίνει ότι η φάση κατεργασίας είναι σε παύση εκτέλεσης), 1 (σημαίνει ότι η φάση κατεργασίας είναι σε εξέλιξη), 2 (σημαίνει ότι η φάση κατεργασίας απέτυχε), 3 (σημαίνει ότι η φάση κατεργασίας ολοκληρώθηκε με επιτυχία). Ένας πίνακας a[2*n] περιέχει ζεύγη τιμών (id, status). 7
Να γραφεί μια συνάρτηση με όνομα 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 ΑΣΚΗΣΗ 18 Να γραφεί μία συνάρτηση void remove_min που θα διαγράφει το μικρότερο ή τα μικρότερα σε τιμή στοιχεία ενός μονοδιάστατου αριθμητικού πίνακα Ν θέσεων (Ν = γνωστό). 8
ΑΣΚΗΣΗ 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) 1. θα γεμίζει τους πίνακες a και b, με κατάλληλη χρήση της συνάρτησης δημιουργίας τυχαίων αριθμών rand() ώστε οι τιμές να ανήκουν στο διάστημα [1-30]. 2. θα καλεί τη συνάρτηση check_identical, και θα εμφανίζει τα σχετικά αποτελέσματα. 9
ΠΑΡΑΔΕΙΓΜΑ με Ν=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 και θα εμφανίζει τα σχετικά αποτελέσματα. 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 και θα εμφανίζει τα σχετικά αποτελέσματα. 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 7 8 22 11 18 16 12
Αποτελέσματα στη main( ) : Ο νέος πίνακας 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, και θα εμφανίζει τα σχετικά αποτελέσματα. 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, και θα εμφανίζει τα σχετικά αποτελέσματα. 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, και θα εμφανίζει τα σχετικά αποτελέσματα. 15