ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΑΓΡΟΝΟΜΩΝ ΤΟΠΟΓΡΑΦΩΝ ΜΗΧΑΝΙΚΩΝ Μάθηµα: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ ΓΡΑΠΤΗ ΕΞΕΤΑΣΗ ΦΕΒΡΟΥΑΡΙΟΥ 2002 ιδάσκοντες: Β.Βεσκούκης, Ρ.Κορακίτης ΘΕΜΑΤΑ + ΥΠΟ ΕΙΓΜΑΤΙΚΗ ΕΠΙΛΥΣΗ 1 2 3.1 3.2 3.3 3.4 4.1 4.2 4.3 Θεµα 1 (µονάδες 5) Να συµπληρώσετε τον παρακάτω πίνακα κάνοντας τις µετατροπές µεταξύ των αριθµητικών συστηµάτων δεκαεξαδικό, οκταδικό και δυαδικό. Α ΥΑ ΙΚΟ ΟΚΤΑ ΙΚΟ ΕΚΑΕΞΑ ΙΚΟ 1 00000010 2 2 2 011111 37 1F 3 10001100 214 8C 4 010001 21 11 5 01110101 165 75 Β ΥΑ ΙΚΟ ΟΚΤΑ ΙΚΟ ΕΚΑΕΞΑ ΙΚΟ 1 00010011 23 13 2 111011 73 3Β 3 10011101 235 9D 4 010010 22 12 5 00110100 64 34 Θεµα 2 (µονάδες 5) Εξηγήστε στο χώρο που διατίθεται τη διαφορά µεταξύ των τύπων της C++ unsigned int (οµάδα Β: unsigned short) και int (οµάδα Β: short) σε υπολογιστή που για την παράσταση του τύπου int (οµάδα Β: short) χρησιµοποιεί λέξη µήκους 32 bit (οµάδα Β: 16 bit). εν χρειάζεται να υπολογίσετε δυνάµεις του 2, αρκεί να τις αναφέρετε απλά ως δυνάµεις (π.χ. 2 8 ). Α. Με χρήση µη προσηµασµένων ακεραίων τύπου unsigned int µπορεί να παρασταθούν οι αριθµοί 0 έως 2 32-1, ενώ µε χρήση προσηµασµένων int παριστάνονται αριθµοί από -(2 31-1) έως 2 31-1 διότι 1 bit χρησιµοποιείται για το πρόσηµο. Στη δεύτερη περίπτωση, µε χρήση συµπληρώµατος ως προς 2 παριστάνονται οι αριθµοί από -2 31 έως 2 31-1. Β. Με χρήση µη προσηµασµένων ακεραίων τύπου unsigned short µπορεί να παρασταθούν οι αριθµοί 0 έως 2 16-1, ενώ µε χρήση προσηµασµένων short παριστάνονται αριθµοί από -(2 15-1) έως 2 15-1 διότι 1 bit χρησιµοποιείται για το πρόσηµο. Στη δεύτερη περίπτωση, µε χρήση συµπληρώµατος ως προς 2 παριστάνονται οι αριθµοί από -2 15 έως 2 15-1.
Θέµα 3 (µονάδες 55) Προκειµένου να διασφαλιστεί η ποιότητα των εργασιών τοπογραφικής αποτύπωσης που εκτελούνται από έναν φορέα, δύο οµάδες Α και Β που λειτουργούν ανεξάρτητα, λαµβάνουν µετρήσεις αποστάσεων Ν σηµείων από ένα καθορισµένο σηµείο αναφοράς µε γνωστές συντεταγµένες (Χ 0, Υ 0 ), ίδιες και για τις δύο οµάδες Α και Β. Από κάθε οµάδα λαµβάνονται οι µετρήσεις αποστάσεων A i, και B i αντίστοιχα, i=1 έως N. Μετά την ολοκλήρωση των µετρήσεων οι τιµές που µετρήθηκαν από κάθε οµάδα καταχωρούνται σε Η/Υ µε χρήση ενός προγράµµατος C++ προκειµένου να ελεγχθεί η ακρίβειά τους. Ο έλεγχος έχει ως αποτέλεσµα έναν νέο πίνακα τιµών T i και ακολουθεί τους εξής κανόνες: Αν οι δύο µετρήσεις Α i και Β i του ίδιου µήκους διαφέρουν µεταξύ τους µέχρι 2% λαµβάνεται ως σωστή και καταχωρείται στη θέση Τ i η µικρότερη µέτρηση από αυτές. Αν διαφέρουν από 2 έως 5% λαµβάνεται ως σωστή τιµή και καταχωρείται στη θέση Τ i η τιµή του µέσου όρου των δύο µετρήσεων. Αν διαφέρουν πάνω από 5%, τότε η συγκεκριµένη µέτρηση µήκους (i) πρέπει να επαναληφθεί. Με αυτή την επεξεργασία των µετρήσεων, προκύπτει ο πίνακας T i που περιέχει Ν τιµές µηκών οι οποίες έχουν υπολογιστεί µε τον παραπάνω τρόπο, καθώς και ένας πίνακας Measure i µε Ν στοιχεία, καθένα από τα οποία έχει την τιµή 1 (ένα) αν η αντίστοιχη µέτρηση πρέπει να πραγµατοποιηθεί και 0 (µηδέν) αν όχι. 3.1 (µονάδες 10) Να συµπληρώσετε παρακάτω τα δεδοµένα εισόδου και τα αποτελέσµατα του προβλήµατος που περιγράφηκε. εδοµένα εισόδου - Οι συντεταγµένες του σηµείου αναφοράς Χ 0, Υ 0 - Το πλήθος των σηµείων Ν - Οι µετρήσεις A(i) της οµάδας Α - Οι µετρήσεις Β(i) της οµάδας Β Αποτελέσµατα - Ο πίνακας Τ που περιέχει τις τελικές µετρήσεις - Ο πίνακας Measure που περιέχει τις µετρήσεις που πρέπει να ξαναγίνουν 2
3.2 (µονάδες 15) Να καταστρώσετε έναν αλγόριθµο για την πραγµατοποίηση ελέγχου της ακρίβειας των µετρήσεων σύµφωνα µε τη διαδικασία που περιγράφηκε. Nα αναφερθείτε µόνο στον έλεγχο των µετρήσεων και όχι στην ανάγνωση των δεδοµένων ή την έξοδο των αποτελεσµάτων. Σηµείωση: για τα θέµατα της οµάδας Β, οι τιµές 2 και 5 είναι 3 και 6 αντίστοιχα 3
3.3 (µονάδες 10) Να κατασκευάσετε ένα πρόγραµµα C++ που να διαβάζει από το πληκτρολόγιο τις τιµές Χ 0, Υ 0, την τιµή Ν, καθώς και τις τιµές των µετρήσεων τις οποίες να αποθηκεύει στους πίνακες Α[] και Β[] για τις αποστάσεις που µέτρησε η οµάδα Α και Β αντίστοιχα. Το πρόγραµµά σας πρέπει να διασφαλίζει ότι το πλήθος Ν των σηµείων δεν είναι µεγαλύτερο από 500, να περιέχει τις δηλώσεις των πινάκων και να πραγµατοποιεί µόνο την ανάγνωση των δεδοµένων. int N, i; float A[500], B[500], X0, Y0; cout<<"enter the value of X0 :"; cin>>x0; cout<<"enter the value of Y0 :"; cin>>y0; do cout<<"how many measurements? "; cin>>n; while ((N<=0) (N>500)); for (i=0;i<n;i++) cout<<"enter measurement "<<i<<" for team A:"; cin>>a[i]; cout<<"enter measurement "<<i<<" for team B:"; cin>>b[i]; 4
3.4 (µονάδες 20) Να κατασκευάσετε ένα πρόγραµµα C++ που θεωρεί ότι έχουν διαβαστεί τα δεδοµένα N, Α[i], Β[i], i=0..(n-1) µε τις µετρήσεις των δύο οµάδων και υπολογίζει τους πίνακες Τ[i], i=0..n-1 µε τα τελικά µήκη και Measure[i], i=0..n-1 ο οποίος σε κάθε θέση του έχει την τιµή 1 ή 0 ανάλογα µε την ανάγκη να επαναληφθεί η αντίστοιχη µέτρηση ή όχι, σύµφωνα µε την περιγραφή που προηγήθηκε. Το πρόγραµµά σας πρέπει να περιέχει τις δηλώσεις των πινάκων και να πραγµατοποιεί µόνο τους υπολογισµούς που ζητούνται. Η ποσοστιαία % διαφορά δύο τιµών Κ και Λ να εκληφθεί ως abs(κ-λ)/κ * 100 float D; // προαιρετική δήλωση for (i=0;i<n;i++) D=abs(A[i]-B[i])/A[i]*100; if (D<=2) if (A[i]>B[i]) T[i]=B[i]; else T[i]=A[i]; Measure[i]=0; else if ((D>2) && (D<=5)) T[i]=(A[i]+B[i])/2; Measure[i]=0; else T[i]=0; Measure[i]=1; // οµάδα Β: D<=3 // οµάδα Β: (D>3) && (D<=6) Μια δεύτερη εκδοχή: for (i=0;i<n;i++) D=abs(A[i]-B[i])/A[i]*100; Measure[i]=0; T[i]=0; if (D<=2) T[i] = (A[i]>B[i])? B[i] : A[i]; else if (D<=5) T[i]=(A[i]+B[i])/2; else Measure[i]=1; // οµάδα Β: D<=3 // οµάδα Β: D<=6 5
Θέµα 4 (µονάδες 15) ίνεται το παρακάτω τµήµα προγράµµατος C++ int hours; float parking_price; cout<<"parking price estimation"<<endl; do cout<<"how many hours? "; cin>>hours; 4.1 while ((hours<1) (hours>8)); parking_price=10; // οµάδα Β: 8 αντί για 10 switch (hours) case 8: parking_price = parking_price + 5; // οµάδα Β: +4 αντί για 5 case 7: parking_price = parking_price + 5; case 6: parking_price = parking_price + 5; // 4 αντί για 5 case 5: parking_price = parking_price + 5; 4.3 case 4: parking_price = parking_price + 5; case 3: parking_price = parking_price + 5; case 2: parking_price = parking_price + 5; case 1: parking_price = parking_price + 5; cout << "The price is:"<<parking_price<< endl; // οµοίως µέχρι το τέλος 4.1 (µονάδες 5) Τι κάνει το τµήµα προγράµµατος που είναι σηµειωµένο ως "4.1" ιαβάζει έναν ακέραιο (hours) από το πληκτρολόγιο και επαναλαµβάνει την ανάγνωση µέχρις ότου δοθεί αριθµός µεταξύ 1 και 8, δηλαδή να ισχύει 1<=hours<=8. 4.2 (µονάδες 5) Τι τυπώνει το πρόγραµµα αν δοθούν από το πληκτρολόγιο τα δεδοµένα 10 (οµάδα Β: 9) και 2 (οµάδα Β: 3) µε αυτή τη σειρά; Α: The price is 20. ιότι για την τιµή 10 επαναλαµβάνεται η ανάγνωση και δεν τυπώνεται αποτέλεσµα, ενώ για την τιµή 2 εκτελούνται οι δύο τελευταίες εντολές της δοµής switch, οπότε parking_price=10 (αρχική τιµή) + 5 (τιµή από το "case 2") + 5 (τιµή από το "case 1"). Οι εντολές µέσα στο switch από το 2 και µετά εκτελούνται όλες γιατί δεν υπάρχει break. Β: The price is 20. ιότι για την τιµή 9 επαναλαµβάνεται η ανάγνωση και δεν τυπώνεται αποτέλεσµα, ενώ για την τιµή 3 εκτελούνται οι τρεις τελευταίες εντολές της δοµής switch, οπότε parking_price=8 (αρχική τιµή) + 4 (τιµή από το "case 3") + 4 (τιµή από το "case 2") + 4 (τιµή από το "case 1"). Οι εντολές µέσα στο switch από το 3 και µετά εκτελούνται όλες γιατί δεν υπάρχει break. 4.3 (µονάδες 5) Προτείνετε έναν εναλλακτικό και πιο απλό τρόπο να γραφεί το τµήµα του προγράµµατος "4.3" Τρόπος 1 parking_price=parking_price+hours*5; Οµάδα Β: το ίδιο, µε 4 αντί για 5 Τρόπος 2 int i; for (i=1; i<=hours; i++) parking_price = parking_price + 5; 6