Δ.Π.Θ. - Πολυτεχνική Σχολή Τμήμα Μηχανικών Παραγωγής & Διοίκησης Ακαδ. έτος 2017-2018 Τομέας Συστημάτων Παραγωγής Εξάμηνο Β Αναπληρωτής Καθηγητής Στέφανος Δ. Κατσαβούνης ΜΑΘΗΜΑ : ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) 26/02/2018 ΕΡΓΑΣΤΗΡΙΑΚΕΣ ΑΣΚΗΣΕΙΣ C ΣΕΙΡΑ 2 η ΑΣΚΗΣΗ - 1 Να γραφεί μια συνάρτηση που θα υπολογίζει τον αριθμό ημέρας μιας δεδομένης ημερομηνίας, χρησιμοποιώντας τον ακόλουθο τύπο που είναι γνωστός ως Zeller s congruence. Όλες οι διαιρέσεις είναι ακέραιες. Οι παράμετροι είναι : d = η ημέρα του μήνα mm = ο αριθμός μήνα (τροποποιημένος) (3=Μάρτιος, 4=Απρίλιος,, 13=Ιανουάριος, 14=Φεβρουάριος) w = ο αριθμός ημέρας (0=Δευτέρα, 1= Τρίτη,, 6=Κυριακή) ( 26 ( mm + 1) ) 5 ( year%100) 21 ( year / 100) w= d + 5 + + + %7 10 4 4 Στη συνέχεια να γράψετε ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα που επιστρέφει η συνάρτηση. ΑΣΚΗΣΗ 2 Να γράψετε 2 συναρτήσεις για τον υπολογισμό της επιφάνειας και του όγκου του σχήματος: 1 V = π h R + R + RR 3 2 2 ( 1 2 1 2) ( ) ( ) 2 2 2 S =π R + R R R + h +π R 1 2 2 1 1 Στη συνέχεια να γράψετε ένα πρόγραμμα σε γλώσσα C που θα καλεί τις συναρτήσεις και θα εμφανίζει τα αποτελέσματα που επιστρέφει η συνάρτηση. ΑΣΚΗΣΗ 3 Για τον υπολογισμό της τιμής του n! όταν η τιμή του n είναι μεγάλη χρησιμοποιείται ο προσεγγιστικός τύπος του n n Stirling : n! e n 2π n. Nα γραφεί πρόγραμμα σε γλώσσα C για τον υπολογισμό της τιμής n! (τύπου double) σύμφωνα με τον παραπάνω τύπο. Η τιμή του n (τύπου int) εισάγεται με τη χρήση της scanf_s (να χρησιμοποιηθεί η συνάρτηση pow της math.h). Στο ίδιο πρόγραμμα, να γραφεί το αντίστοιχο τμήμα προγράμματος για τον υπολογισμό του n! σύμφωνα με τον τύπο n! = 1 2 3 n, και να βρεθούν οι διαφορές (ως ποσοστό %) που παρουσιάζουν οι δύο μέθοδοι υπολογισμού, για διάφορες τιμές του n. ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 1
ΑΣΚΗΣΗ 4 Να λυθεί η προηγούμενη Άσκηση 3 με χρήση συναρτήσεων. Να γραφούν δύο συναρτήσεις που θα επιστρέφουν την τιμή του n!, σύμφωνα με τους δύο τρόπους, και ένα πρόγραμμα που θα τις καλεί διαδοχικά. ΑΣΚΗΣΗ 5 Η μηνιαία πληρωμή (Payment) ενός δανείου μπορεί να υπολογιστεί από τον παρακάτω τύπο: Payment = N Rate* (1 + Rate) * Loan N ((1 + Rate) 1) Rate είναι το μηνιαίο επιτόκιο, δηλαδή το ετήσιο επιτόκιο διαιρεμένο με το 12 (π.χ. 12% ετήσιο επιτόκιο αντιστοιχεί σε 1% μηνιαίο επιτόκιο), N είναι το πλήθος των πληρωμών και Loan είναι το ποσό του δανείου. Να γράψετε μια συνάρτηση για τον υπολογισμό της μηνιαίας πληρωμής (Payment) και στη συνέχεια ένα πρόγραμμα που θα χρησιμοποιεί τη συνάρτηση. Η συνάρτηση θα έχει ως ορίσματα τα Rate, N, Loan. Το πρόγραμμα θα πρέπει να έχει τη δυνατότητα να εμφανίζει αποτελέσματα για πολλές διαφορετικές τιμές των ορισμάτων της συνάρτησης. Η εμφάνιση δεδομένων και αποτελεσμάτων θα γίνεται στη main() με την παρακάτω μορφή: Ποσό δανείου: 10000.00 Μηνιαίο επιτόκιο: 1% Πλήθος πληρωμών: 36 Μηνιαία πληρωμή: 332.14 Συνολικό ποσό πληρωμής: 11957.15 Συνολικός τόκος: 1957.15 ΑΣΚΗΣΗ 6 Να γραφεί μια συνάρτηση για τον υπολογισμό του n! και στη συνέχεια ένα πρόγραμμα που θα την χρησιμοποιεί για τον υπολογισμό του αθροίσματος : 2 3 e x = 1+ x+ x + x + 2! 3! με ακρίβεια 10-5. Η τιμή του x είναι τύπου double και εισάγεται με χρήση της scanf_s. Το μέγιστο επιτρεπόμενο πλήθος επαναλήψεων είναι 15. ΑΣΚΗΣΗ - 7 Το παρακάτω τμήμα κώδικα σε γλώσσα C βρίσκει αν ένας ακέραιος και θετικός αριθμός kk 2 είναι πρώτος (prime) αριθμός. i=2; flag=0; while ((i<=k/2) && (flag==0)) if (k%i==0) flag=1; i++; if (flag==0) printf("number %4d is prime \n",k); ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 2
Να μετατρέψετε το τμήμα αυτό σε μια συνάρτηση με όνομα is_prime, επιλέγοντας τον τύπο της συνάρτησης καθώς και τις τυπικές παραμέτρους. Στη συνέχεια να γραφεί ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει στην οθόνη όλους τους πρώτους αριθμούς που είναι μικρότεροι μιας γνωστής μέγιστης τιμής max που ορίζεται μέσω μιας δήλωσης #define. ΑΣΚΗΣΗ - 8 Να επαναλάβετε την Άσκηση 7, τοποθετώντας τους πρώτους αριθμούς που θα βρείτε σε μονοδιάστατο πίνακα ακεραίων αριθμών. Το μέγεθος του πίνακα δεν είναι εξ αρχής γνωστό (υπόδειξη: να διαχειριστείτε τον πίνακα ως pointer) ΑΣΚΗΣΗ - 9 Οι Η.Α.Brothers και J.A. Κnox ανακάλυψαν ότι καθώς η τιμή του x γίνεται μεγαλύτερη, η τιμή της έκφρασης x 2x + 1 προσεγγίζει την τιμή του e. Να γράψετε μια συνάρτηση που θα υπολογίζει την τιμή της παραπάνω 2x 1 έκφρασης για μια τιμή του x μέχρις ότου η απόλυτη τιμή της διαφοράς μεταξύ της τιμής της έκφρασης και της συνάρτησης exp (ανήκει στην math.h) γίνει μικρότερη της τιμής 0.000001. Η συνάρτηση θα επιστρέφει την τιμή του x και θα καλείται κατάλληλα από τη main( ). ΑΣΚΗΣΗ - 10 Η τετραγωνική ρίζα ενός αριθμού N μπορεί να υπολογιστεί κατά προσέγγιση με επαναληπτική εφαρμογή του τύπου NG = 0.5 ( LG + N / LG) όπου NG είναι η επόμενη εκτίμηση για την τιμή της τετραγωνικής ρίζας και LG είναι η τελευταία υπολογισμένη εκτίμηση για την τιμή της τετραγωνικής ρίζας. Να γραφεί μια συνάρτηση για τον υπολογισμό της τετραγωνικής ρίζας με την παραπάνω μέθοδο. Η αρχική εκτίμηση θα είναι η αρχική τιμή για την LG. Το πρόγραμμα θα υπολογίζει μια τιμή για την NG. Η διαφορά μεταξύ NG και LG ελέγχεται για να διαπιστωθεί εάν αυτές οι δύο τιμές είναι ίδιες. Εάν είναι η αποδεκτή τιμή της ρίζας είναι η NG. Διαφορετικά, η NG γίνεται LG και η διαδικασία επαναλαμβάνεται μέχρις ότου η διαφορά μεταξύ NG και LG γίνει μικρότερη από 0.005. Να χρησιμοποιήσετε ως αρχική εκτίμηση την τιμή 1.00. Στη συνέχεια να γράψετε ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα που επιστρέφει η συνάρτηση (ΥΠΟΔΕΙΞΗ : Να ελέγξετε το πρόγραμμά σας για τους αριθμούς 4, 0.25, 10000, 88, 127.5). ΑΣΚΗΣΗ - 11 Να γραφεί μια συνάρτηση alter(x,y) που θα αλλάζει την τιμή του x σε x+y και την τιμή του y σε x*y, όπου x,y είναι ορίσματα τύπου double. Η συνάρτηση θα καλείται από την main(). ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 3
ΑΣΚΗΣΗ - 12 Να γραφεί μια συνάρτηση με όνομα convert_to_polar που θα δέχεται ως είσοδο τις καρτεσιανές συντεταγμένες ενός σημείου x, y και θα επιστρέφει τις πολικές συντεταγμένες του r, θ. Οι πολικές συντεταγμένες υπολογίζονται σύμφωνα με τους τύπους : r P(x,y) 0 άξονας x xx = rrrrrrrrrr yy = rrrrrrrrrr θ Η συνάρτηση θα καλείται από τη main(). ΑΣΚΗΣΗ - 13 Να γραφεί μια συνάρτηση που θα υπολογίζει το εναλλασσόμενο άθροισμα των στοιχείων ενός μονοδιάστατου αριθμητικού πίνακα ακεραίων αριθμών. Π.χ. εάν ο πίνακας είναι 1 4 9 16 9 7 4 9 11 Τότε η συνάρτηση θα υπολογίζει και θα επιστρέφει το άθροισμα 1 4 + 9 16 + 9 7 + 4 9 + 11 = -2 Στη συνέχεια να γραφεί ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα. ΑΣΚΗΣΗ - 14 Μια διαδρομή ορίζεται ως μια ακολουθία επαναλαμβανόμενων γειτονικών αριθμητικών τιμών. Να γραφεί μια συνάρτηση που θα βρίσκει και θα επιστρέφει το μήκος της μέγιστης διαδρομής σε ένα μονοδιάστατο αριθμητικό πίνακα ακεραίων αριθμών. Π.χ. η μέγιστη διαδρομή στον ακόλουθο πίνακα έχει μήκος 4. 2 5 3 3 4 6 7 7 7 7 9 8 9 2 3 4 4 4 Στη συνέχεια να γραφεί ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα. ΑΣΚΗΣΗ - 15 Να γραφεί μια συνάρτηση με όνομα find_max που θα βρίσκει και θα επιστρέφει τους 2 μεγαλύτερους διαφορετικούς αριθμούς από μια σειρά ακεραίων αριθμών πλήθους n. Οι αριθμοί αυτοί αποτελούν τα στοιχεία ενός μονοδιάστατου πίνακα n θέσεων (η τιμή του n να οριστεί ως σταθερά). Στη συνέχεια να γραφεί ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα. (ΥΠΟΔΕΙΞΗ : 1. Η εισαγωγή των τιμών στον πίνακα να γίνει με χρήση της rand( ). 2. Προσπαθήστε να βρείτε τους 2 μεγαλύτερους αριθμούς με μία μόνον επαναληπτική διαδικασία). ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 4
ΑΣΚΗΣΗ - 16 Να γραφεί μια συνάρτηση που θα δέχεται ως είσοδο έναν ακέραιο και θετικό αριθμό n, μεγαλύτερο ή ίσο του 2, και θα επιστρέφει, υπό μορφή πίνακα, όλους τους πρώτους αριθμούς που είναι μικρότεροι του n. Στη συνέχεια να γραφεί ένα πρόγραμμα σε γλώσσα C που θα καλεί τη συνάρτηση και θα εμφανίζει τα αποτελέσματα. ( ΥΠΟΔΕΙΞΗ : Μπορείτε να χρησιμοποιήσετε τη συνάρτηση is_prime ή το κόσκινο του Ερατοσθένη, σχετικά μπορούν να βρεθούν στο Διαδίκτυο π.χ. http://primes.utm.edu/glossary/xpage/sieveoferatosthenes.html ) ΑΣΚΗΣΗ - 17 Για καθένα από τα παρακάτω, να γράψετε μια απλή εντολή σε γλώσσα C που θα υλοποιεί την αντίστοιχη λειτουργία. Η συνάρτηση main( ) θα πρέπει να περιέχει τις κατάλληλες εντολές για την επαλήθευση αυτών των λειτουργιών, με τη σειρά που ακολουθεί. a. Δήλωση και αρχικοποίηση της next ως μεταβλητής τύπου χαρακτήρα με τιμή 'B'. b. Δήλωση και αρχικοποίηση της current ως μεταβλητής τύπου χαρακτήρα με τιμή 'y'. c. Δήλωση του ptr ώστε να είναι δείκτης σε αντικείμενα τύπου char. d. Εκχώρηση της διεύθυνσης της current στη μεταβλητή ptr. e. Αλλαγή της τιμής του αντικειμένου στο οποίο δείχνει ο ptr σε '0'. f. Εκχώρηση της διεύθυνσης της next στη μεταβλητή ptr. g. Αλλαγή της τιμής της μεταβλητής στην οποία δείχνει ο ptr σε 'd'. h. Εμφάνιση της διεύθυνσης που είναι αποθηκευμένη στην ptr. i. Ποιες τιμές είναι αποθηκευμένες στις next και current? ΑΣΚΗΣΗ - 18 Δίνονται οι παρακάτω δηλώσεις: int x=0; int y=0; int *myptr=null; int *otherptr=null; Να βρείτε τις τιμές των myptr, otherptr, x, και y, μετά από κάθε μια από τις παρακάτω γραμμές κώδικα σε γλώσσα C : 1. myptr=&x; 2. otherptr=&y; 3. *myptr=4; 4. *otherptr=*myptr; 5. x=5; 6. otherptr=myptr; 7. *otherptr=6; Για την εμφάνιση των τιμών πρέπει να χρησιμοποιήσετε την εντολή printf στη main(). ΑΣΚΗΣΗ - 19 Τι πιστεύετε ότι θα γίνει αν εκτελέσετε το ακόλουθο πρόγραμμα και γιατί; void main() double trouble = 3.27; double *pt; *pt = 27.3; pt = &trouble; ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 5
ΑΣΚΗΣΗ - 20 Τι πιστεύετε ότι θα γίνει αν εκτελέσετε το ακόλουθο πρόγραμμα και γιατί; void main() int i, *k; *k = 4; k = &i; ΑΣΚΗΣΗ - 21 Να βρεθεί και να δικαιολογηθεί το αποτέλεσμα που θα επιστρέψει η παρακάτω συνάρτηση : int identical() int a[3] = 6, 3, 7; int *p = &a[0]; if (a[0] == p[0] && a[1] == p[1] && a[2] == p[2]) return 1; else return 0; ΑΣΚΗΣΗ - 22 Να βρεθούν και να δικαιολογηθούν τα αποτελέσματα του παρακάτω προγράμματος : #include <stdio.h> void div_and_sub(int *number); void sub_and_div(int number); void main() int k = 29; int *ptr = &k; div_and_sub(ptr); sub_and_div(*ptr); div_and_sub(&k); printf("the value of k is %d\n", k); printf("the value of k is %d\n", k); printf("the value of k is %d\n", k); void div_and_sub(int *number) *number = *number/3; *number-=1; printf("in FUNCTION DIV number =%d\n",*number); void sub_and_div(int number) number+=3; number=number/2; printf("in function sub number =%d\n",number); ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 6
ΑΣΚΗΣΗ - 23 Να βρεθούν και να δικαιολογηθούν τα αποτελέσματα του παρακάτω προγράμματος : #include <stdio.h> void half_and_add(int *number); void add_and_half(int number); void main() int i = 27; int *ptr = &i; half_and_add(ptr); printf("the value of i is %d\n", i); half_and_add(&i); printf("the value of i is %d\n", i); add_and_half(i); printf("the value of i is %d\n", i); void half_and_add(int *number) *number = *number/2; *number+=2; printf("in FUNCTION HALF number =%d\n",*number); void add_and_half(int number) number+=2; number=number/2; printf("in function add number =%d\n",number); ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (ΓΛΩΣΣΑ C) ΑΚΑΔ. ΕΤΟΣ 2017-2018 7