Τμήμα Πληροφορικής & Επικοινωνιών Εξεταζόμενο μάθημα: Προγραμματισμός Ι Ονοματεπώνυμο σπουδαστή/άστριας:... Εξάμηνο σπουδών:... Α.Ε.Μ.:... 23/1/2006 ΔΙΑΡΚΕΙΑ ΕΞΕΤΑΣΗΣ: 2 ΩΡΕΣ Οι εξεταζόμενοι επιτρέπεται να χρησιμοποιήσουν παντός είδους έντυπα βοηθήματα. Tα θέματα επισυνάπτονται στο γραπτό με συμπληρωμένο το πλαίσιο της κορυφής. Θέμα 1 ο (35%) Ο οργανισμός ύδρευσης-αποχέτευσης μίας πόλης ακολουθεί την εξής τιμολογιακή πολιτική για τους οικιακούς καταναλωτές: Έστω ΚΜ (σε κυβικά μέτρα) η συνολική κατανάλωση κατά τη διάρκεια ενός τριμήνου. Για κατανάλωση από 1 έως 15 κυβικά μέτρα: 0.39 Є/κυβικό μέτρο Για τα επόμενα κυβικά μέτρα από 16 έως 60: 0.61 Є/κυβικό μέτρο Για τα επόμενα κυβικά μέτρα από 61 έως 81: 1.75 Є/κυβικό μέτρο Για τα επόμενα κυβικά μέτρα: 2.45 Є/κυβικό μέτρο Εάν το συνολικό τίμημα της κατανάλωσης, όπως υπολογίζεται από τα ανωτέρω, λαμβάνει την τιμή ΤΚ, το τέλος αποχέτευσης συμβολίζεται ως ΤΑ και ανέρχεται στο 60% του ΤΚ. Το τέλος του ΝΔ. 1068/42 συμβολίζεται ως ΤΝΔ και ανέρχεται στο 1% του ΤΚ. Υπάρχει ένα πάγιο τέλος 1.59 Є, το οποίο συμβολίζεται ως ΠΤ. Ο ΦΠΑ επί του ΤΚ συμβολίζεται ως ΦΠΑ_ΤΚ και ανέρχεται στο 9% αυτού. Ο ΦΠΑ επί των υπόλοιπων τιμημάτων συμβολίζεται ως ΦΠΑ_ΥΠ και ανέρχεται στο 19% του αθροίσματός τους (ΤΑ+ΤΝΔ+ΠΤ). Το συνολικό κόστος ΤΚ+ΤΑ+ΤΝΔ+ΠΤ+ΦΠΑ_ΤΚ+ΦΠΑ_ΥΠ στρογγυλοποιείται στο ευρώ, δηλαδή εάν το κόστος είναι 43.34 Є ο λογαριασμός στρογγυλοποιείται στα 43 Є, ενώ κόστος 43.56 Є οδηγεί σε λογαριασμό 44 Є. Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα δέχεται από το πληκτρολόγιο τον αριθμό των καταναλωθέντων κυβικών μέτρων νερού και θα εμφανίζει στην οθόνη το λογαριασμό. 1/7
Θέμα 2 ο (30%) Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα λαμβάνει από το πληκτρολόγιο τις τιμές ενός πίνακα πραγματικών αριθμών arr[14][14]. Στη συνέχεια θα υπολογίζει: Σε κάθε γραμμή το στοιχείο με τη μέγιστη απόλυτη τιμή. Για κάθε γραμμή θα απεικονισθούν στην οθόνη η απόλυτη τιμή του μέγιστου στοιχείου και η στήλη στην οποία βρίσκεται. Το άθροισμα των στοιχείων της κύριας διαγωνίου (ίχνος του πίνακα). Τον πίνακα που θα προκύψει εάν αντιμετατεθούν η δεύτερη με την τρίτη στήλη του arr και, στη συνέχεια, η πρώτη με την τρίτη γραμμή. Θέμα 3 ο (35%) Να γραφεί πρόγραμμα στη γλώσσα C, το οποίο θα επιτελεί τα ακόλουθα: Θα δέχεται από το πληκτρολόγιο τα επώνυμα δύο φοιτητών, έως 30 χαρακτήρες το καθένα και δοσμένα με κεφαλαία λατινικά γράμματα. Θα αποθηκεύει τα επώνυμα σε δισδιάστατο πίνακα χαρακτήρων. Θα τα ταξινομεί αλφαβητικά σε νέο πίνακα. Θα πρέπει να ληφθεί μέριμνα ώστε εάν το ένα επώνυμο είναι υποσύνολο του άλλου (π.χ. ΧΑΤΖISAVVAS και ΧΑΤΖIS) ταξινομείται ως πρώτο το συντομότερο εξ αυτών. Θα εμφανίζει το νέο πίνακα στην οθόνη. Δίνεται ότι: Τα επώνυμα δόθηκαν σωστά, με κεφαλαία λατινικά γράμματα, και δεν απαιτείται έλεγχος γι αυτό. Κάθε επώνυμο είναι απλό, δεν περιέχει διπλό όνομα, τίτλο ευγενείας ή άλλου είδους προσφωνήσεις. 2/7
// 2006_1_1 #include <stdio.h> #define TIMH_1 0.39 #define TIMH_2 0.61 #define TIMH_3 1.75 #define TIMH_4 2.45 #define PT 1.59 // Πάγιο τέλος #define SYNT_TA 0.60 // 60% #define SYNT_TND 0.01 // 1% #define SYNT_FPA_TK 0.09 // 9% #define SYNT_FPA_YP 0.19 // 19% void main() int km; float kostos,ta,tnd,tk; printf("\nmeasurement (in cubic meters)= "); scanf("%d",&km); if (km<=15) tk=km*timh_1; else if (km<=60) tk=15*timh_1+(km-15)*timh_2; else if (km<=81) tk=15*timh_1+45*timh_2+(km-60)*timh_3; else tk=15*timh_1+45*timh_2+21*timh_3+(km-81)*timh_4; ta=synt_ta*tk; tnd=synt_tnd*tk; kostos=tk*(1+synt_fpa_tk)+(ta+tnd+pt)*(1+synt_fpa_yp); printf("\n\n\tactual cost= %f",kostos); if ((kostos-(int)kostos)>=0.5) kostos=(int)kostos+1.0; else kostos=(int)kostos; printf("\n\n\tfinal cost= %f",kostos); 3/7
// 2006_1_2 #include <stdio.h> #include <math.h> #define N 3 //αντί για 14 για λόγους απλότητας και δυνατότητας απεικόνισης void main() float arr[n][n],maxim,trace=0.0,temp; int i,j,col; for (i=0;i<n;i++) for (j=0;j<n;j++) printf("\narr[%d][%d]: ",i+1,j+1); scanf("%f",&arr[i][j]); for (i=0;i<n;i++) trace=trace+arr[i][i]; maxim=fabs(arr[i][0]); col=1; for (j=1;j<n;j++) if (fabs(arr[i][j])>maxim) maxim=fabs(arr[i][j]); col=j+1; printf("\nline %d: column %d, size=%f",i+1,col,maxim); printf("\n\ntrace(arr)=%f\n",trace); for (j=0;j<n;j++) temp=arr[j][1]; arr[j][1]=arr[j][2]; arr[j][2]=temp; for (j=0;j<n;j++) temp=arr[0][j]; arr[0][j]=arr[2][j]; arr[2][j]=temp; 4/7
5/7
// 2006_1_3 #include <stdio.h> #include <conio.h> #include <string.h> void main() char arr[2][31],b[2][31]; int i,mikos,count=0; printf("give first name: "); gets(arr[0]); printf("\ngive second name: "); gets(arr[1]); mikos=(strlen(arr[0])<strlen(arr[1]))?strlen(arr[0]):strlen(arr[1]); i=0; do if (arr[0][i]<arr[1][i]) count++; i++; while ((i<mikos) && (!count)); /* Έλεγχος της περίπτωσης το δεύτερο να πρέπει να ταξινομηθεί πρώτο */ if ((count) (strlen(arr[0])>strlen(arr[1]))) /* Ο δεύτερος όρος της συνθήκης προστίθεται για να ληφθεί υπόψη και η περίπτωση το δεύτερο επώνυμο να αποτελεί το αρχικό τμήμα του πρώτου, οπότε ταξινομείται πρώτο. */ strcpy(b[0],arr[1]); /* Αντιγραφή ενός string σε ένα άλλο. ΔΕΝ ΙΣΧΥΕΙ η άμεση αντιγραφή π.χ. b[0]=arr[1]!!! */ strcpy(b[1],arr[0]); else for (i=0;i<2;i++) strcpy(b[i],arr[i]); /* Η πρόταση εκτελείται είτε όταν το πρώτο επώνυμο ταξινομείται ως πρώτο είτε όταν το πρώτο επώνυμο αποτελεί το αρχικό τμήμα του δεύτερου, οπότε ταξινομείται πρώτο. */ for (i=0;i<2;i++) printf("\nb[%d]=%s",i,b[i]); 6/7
7/7