Κεφάλαιο 11 : Επανάληψη 4 ο Φύλλο Εργασιών Άσκηση 01 Μια εταιρία µεταφορών διαθέτει ένα αεροπλάνο ωφέλιµου φορτίου 100 τόνων και θα πρέπει να µεταφέρει 50 πακέτα βάρους µικρότερου από 100 τόνους έκαστο. Να γράψετε ένα πρόγραµµα το οποίο θα διαβάζει τα βάρη των 50 πακέτων και θα υπολογίζει και θα τυπώνει πόσες πτήσεις πρέπει να πραγµατοποιηθούν για τη µεταφορά τους µε το παραπάνω αεροπλάνο. (δε χρειάζεται το πρόγραµµα σας να υπολογίζει τη βέλτιστη κατανοµή των βαρών των πακέτων ώστε να ελαχιστοποιηθεί ο αριθµός των πτήσεων). program aal; var p,fortio:real; i,j:integer; j:=0; {Μετρητής πτήσεων} fortio:=0; for i:=1 to 50 do write(' ώσε το βάρος του',i,' πακέτου : '); readln(p); if fortio + p < 100 then fortio:=fortio+p; end else if fortio + p = 100 then fortio:=fortio+p; j:=j+1; writeln('συµπληρώθηκε η πτήση ',j, ' : ', fortio:0:2); fortio:=0; end else j:=j+1; writeln( Συµπληρώθηκε η πτήση ',j, ' : ', fortio:0:2); fortio:=p; if fortio > 0 then writeln( Συµπληρώθηκε η πτήση ',j+1, ' : ', fortio:0:2); 1
Άσκηση 02 Σε µία ασφαλιστική εταιρεία δουλεύουν Α ασφαλιστές που ο καθένας τους µπορεί να έχει 1 έως Ν πελάτες. Να γράψετε πρόγραµµα Pascal το οποίο: α) Θα διαβάζει από το πληκτρολόγιο το πλήθος των ασφαλιστών Α β) Για κάθε ασφαλιστή θα διαβάζει από το πληκτρολόγιο τον αριθµό των πελατών του Ν γ) Για κάθε πελάτη θα διαβάζει από το πληκτρολόγιο το όνοµά του και το ύψος της ασφάλειας του δ) Για κάθε ασφαλιστή θα τυπώνει στην οθόνη το όνοµα του πελάτη µε τη µεγαλύτερη ασφάλεια και το όνοµα του πελάτη µε τη µικρότερη ασφάλεια καθώς και το ύψος της ασφάλειας για κάθε πελάτη ε) Στο τέλος θα τυπώνει το όνοµα του πελάτη µε τη µεγαλύτερη ασφάλεια (µεταξύ όλων των ασφαλιστών) και το όνοµα του πελάτη µε τη µικρότερη ασφάλεια (µεταξύ όλων των ασφαλιστών) καθώς και το όνοµα του ασφαλιστή και ύψος της ασφάλειας για κάθε πελάτη. ΠΑΡΑ ΕΙΓΜΑ ΕΞΟ Ο ΠΡΟΓΡΑΜΜΑΤΟΣ: 1 ος Ασφαλιστής: Μεγαλύτερη ασφάλεια : Παπαδόπουλος 100000 Μικρότερη ασφάλεια : Ιλιάδου 10000 2 ος Ασφαλιστής: Μεγαλύτερη ασφάλεια : Παπαδόπουλος 100000 Μικρότερη ασφάλεια : Ιλιάδου 10000 κτλ.... Μεγαλύτερη ασφάλεια : 3 ος Ασφαλιστής, Νικολούδης 120000 Μικρότερη ασφάλεια : 7 ος Ασφαλιστής, ήµογλου 5000 ΥΠΟ ΕΙΞΕΙΣ 1. Να θεωρήσετε ότι το πλήθος των ασφαλιστών και των πελατών που θα δίνεται θα είναι θετικοί αριθµοί όπως και το ύψος κάθε ασφάλειας. 2. Καµιά ασφάλεια δεν µπορεί να ξεπερνάει το ποσό των 100000. 3. ε χρειάζεται να γίνει έλεγχος εγκυρότητας. program lala; var A,N:integer; {το πλήθος των ασφαλιστών και των πελατών κάθε ασφαλιστή} i,j:integer; {µετρητές για τους ασφαλιστές και τους πελάτες κάθε ασφαλιστή} o:string; {το όνοµα ενός πελάτη} poso:real; {το ύψος της ασφάλειας ενός πελάτη} maxa,mina: real; {η µεγαλύτερη και η µικρότερη ασφάλεια για έναν ασφαλιστή} max_onoa, min_onoa:string; {τα ονόµατα των πελατών µε τη µεγαλύτερη και µικρότερη ασφάλεια για έναν ασφαλιστή} maxt,mint: real; {η µεγαλύτερη και µικρότερη ασφάλεια µεταξύ όλων των ασφαλιστών} max_onot, min_onot:string; {τα ονόµατα των πελατών µε τη µεγαλύτερη και µικρότερη ασφάλεια µεταξύ όλων των ασφαλιστών} maxi,mini:integer; {ο αριθµός του ασφαλιστή µε τη µεγαλύτερη και τη µικρότερη ασφάλεια} 2
write(' ώσε τον αριθµό των ασφαλιστών : '); readln(a); maxt:=0; mint:=101000; for i := 1 to A do writeln(); write(' ώσε τον αριθµό των πελατών για τον ',i, ' ασφαλιστή : '); readln(n); maxa:=0; mina:=101000; for j:=1 to N do write(' ώσε το όνοµα του ', j, ' πελάτη : '); write(' ώσε το ύψος της ασφάλειας για τον ',o); readln(poso); if poso > maxa then maxa:=poso; max_onoa:=o; if poso < mina then mina:=poso; min_onoa:=o; writeln('ασφαλιστής ',i); writeln('max : ', max_onoa, ' ', maxa:0:2); writeln('min : ', min_onoa, ' ', mina:0:2); if maxa > maxt then maxt:=maxa; max_onot:=max_onoa; maxi:=i; if mina < mint then mint:=mina; min_onot:=min_onoa; mini:=i; writeln('total MAX : ', maxi, ' ασφαλιστής, ', max_onot, ' ',maxt:0:2); writeln('total MIN : ', mini, ' ασφαλιστής, ', min_onot, ' ',mint:0:2); 3
Άσκηση 03 Στους χειµερινούς Ολυµπιακούς αγώνες και στο αγώνισµα του καλλιτεχνικού πατινάζ, ένας αθλητής βαθµολογείται από 8 κριτές. Κάθε αθλητής βαθµολογείται για το τεχνικό µέρος από κάθε κριτή. Η συνολική βαθµολογία του αθλητή προκύπτει, αφού αφαιρεθούν η µεγαλύτερη και η µικρότερη βαθµολογία. Για παράδειγµα αν κάποιος αθλητής βαθµολογηθεί: 5.2, 5.0, 4.3, 5.8, 5.1, 5.2, 5.9, 5.0, τότε αφαιρείται το 5.9 και το 4.3 που είναι η καλύτερη και η χειρότερη βαθµολογία και η συνολική βαθµολογία του αθλητή είναι 31.3. Να γράψετε ένα πρόγραµµα Pascal το οποίο θα διαβάζει από το πληκτρολόγιο τους βαθµούς ενός αθλητή και θα υπολογίζει και θα τυπώνει στην οθόνη τη συνολική βαθµολογία. Ο βαθµός κάθε κριτή θα πρέπει να είναι ένας αριθµός από 1 έως 6. program lala; var s,v,vmax,vmin:real; i:integer; procedure diavase(var v:real); write(' ώσε βαθµό από 1 έως 6 : '); readln(v); if (v < 1) or (v > 6) then repeat write('λάθος! ώσε βαθµό από 1 έως 6 : '); readln(v); until (v>=1) and (v<=6) vmax := 0; vmin := 7; s := 0; for i := 1 to 8 do diavase(v); s := s + v; if v > vmax then vmax := v; if v < vmin then vmin := v; s := s - vmin - vmax; writeln('τελικός βαθµός : ', s:0:2); 4
Άσκηση 04 Να τροποποιήσετε το πρόγραµµα που γράψατε στην προηγούµενη άσκηση ώστε να υπολογίζει την τελική βαθµολογία για ένα πλήθος αθλητών. Για κάθε αθλητή θα διαβάζει το όνοµά του και θα υπολογίζει τη βαθµολογία του. Θα σταµατάει όταν στη θέση του ονόµατος δοθεί κενό. program lala; var s,v,vmax,vmin:real; i,j:integer; o:string; procedure diavase(var v:real); write(' ώσε βαθµό από 1 έως 6 : '); readln(v); if (v < 1) or (v > 6) then repeat write write('λάθος! ώσε βαθµό από 1 έως 6 : '); readln(v); until (v>=1) and (v<=6) write(' ώσε το όνοµα του αθλητή : '); while o <> ' ' do vmax := 0; vmin := 7; s := 0; for i := 1 to 8 do diavase(v); s := s + v; if v > vmax then vmax := v; if v < vmin then vmin := v; s := s - vmin - vmax; writeln('τελική Βαθµολογία : ',o, ' ', s:0:2); write(' ώσε το όνοµα του αθλητή : '); 5
Άσκηση 05 Μια δηµόσια υπηρεσία διενεργεί διαγωνισµό πρόσληψης και θέλει να εξάγει στατιστικά στοιχεία. Να γραφεί πρόγραµµα σε Pascal το οποίο : α) διαβάζει το ονοµατεπώνυµο κάθε υποψηφίου και σταµατά µόλις δοθεί ως ονοµατεπώνυµο το κενό β) διαβάζει την οικογενειακή κατάσταση κάθε υποψηφίου ( Ε = Έγγαµος, Α =Άγαµος) και ελέγχει την ορθή εισαγωγή γ) διαβάζει το επίπεδο εκπαίδευσης κάθε υποψηφίου ( 1 = Υποχρεωτική Εκπαίδευση, 2= ευτεροβάθµια Εκπαίδευση 3 =Πανεπιστηµιακή Εκπαίδευση) και ελέγχει την ορθή εισαγωγή δ) υπολογίζει και εµφανίζει το πλήθος και το ποσοστό των υπαλλήλων που είναι έγγαµοι και άγαµοι. ε) υπολογίζει και εµφανίζει το πλήθος και το ποσοστό των υπαλλήλων που έχουν υποχρεωτική, δευτεροβάθµια και πανεπιστηµιακή εκπαίδευση αντίστοιχα. ε) στο πλήθος των εγγάµων υπαλλήλων να υπολογίζει και να εµφανίζει το ποσοστό των υπαλλήλων που έχουν υποχρεωτική και το ποσοστό των υπαλλήλων που έχουν πανεπιστηµιακή εκπαίδευση program alal; var o:string; s,se,sa,s1,s2,s3,se1,se3:integer; oik:char; sp:byte; procedure oikogeneiaki(var oi:char); write(' Οικογενειακή κατάσταση (Ε/Α) : '); readln(oi); if (oi <> 'E') and (oi <> 'A') then repeat write(' Λάθος! Οικογενειακή κατάσταση (Ε)γγαµος/(Α)γαµος : '); readln(oi); until (oi='e') or (oi='a'); procedure spoudes(var sp:byte); writeln(' Σπουδες : '); write(' 1 Υποχρεωτική / 2 ευτεροβάθµια / 3 Πανεπιστηµιακή :'); readln(sp); if (sp <> 1) and (sp <> 2) and (sp <> 3) then repeat write(' Λάθος! 1 Υποχρεωτική / 2 ευτεροβάθµια / 3 Πανεπιστηµιακή : '); readln(sp); until (sp = 1) or (sp = 2) or (sp = 3); 6
write(' ώσε το όνοµα του υποψηφίου : '); s:=0; s1:=0; s2:=0; s3:=0; se:=0; sa:=0; se1:=0; se3:=0; while o <> ' ' do s:=s+1; oikogeneiaki(oik); spoudes(sp); case oik of 'E' : se:=se+1; 'A' : sa:=sa+1; case sp of 1: s1:=s1+1; 2: s2:=s2+1; 3: s3:=s3+1; if (oik = 'E') and (sp = 1) then se1:=se1+1; if (oik = 'A') and (sp = 3) then se3:=se3+1; write(' ώσε το όνοµα του υποψηφίου : '); writeln(' Πλήθος υποψηφίων : ', s); writeln(' Πλήθος έγγαµων : ', se); writeln(' Πλήθος άγαµων : ', sa); writeln(' Υποχρεωτικής εκπαίδευσης : ', s1); writeln(' ευτεροβάθµιας εκπαίδευσης : ', s2); writeln(' Πανεπιστηµιακής εκπαίδευσης : ', s3); if s > 0 then writeln(' Ποσοστό έγγαµων : ',(se/s)*100:0:2); writeln(' Ποσοστό άγαµων : ', (sa/s)*100:0:2); writeln(' Ποσοστό υποχρεωτικής εκπαίδευσης : ', (s1/s)*100:0:2); writeln(' Ποσοστό δευτεροβάθµιας εκαίδευσης : ', (s2/s)*100:0:2); writeln(' Ποσοστό πανεπιστηµιακής εκαπαίδευσης : ', (s3/s)*100:0:2); if se > 0 then writeln(' Ποσοστό έγγαµων µε υποχρεωτική εκπαίδευση: ', (se1/se)*100:0:2); writeln(' Ποσοστό έγγαµων µε πανεπιστηµιακη εκπαίδευση: ', (se3/se)*100:0:2); 7
Άσκηση 06 Ένα σχολείο πρόκειται να πάει εκδροµή. Στα πλαίσια αυτής της διαδικασίας λοιπόν ενδιαφέρονται να µισθώσουν εκδροµικά λεωφορεία προκειµένου να τους µεταφέρουν στον προορισµό τους. Το κόστος µίσθωσης του πρώτου λεωφορείου είναι 500 ευρώ και κάθε επόµενο 5% φθηνότερο από το προηγούµενο. ηλαδή το δεύτερο 5% φτηνότερο από το πρώτο το τρίτο 5% φθηνότερο από το δεύτερο κοκ. Να γράψετε πρόγραµµα Pascal το οποίο α) θα διαβάζει το πλήθος των παιδιών που δήλωσαν συµµετοχή στην εκδροµή και το πλήθος των συνοδών β) θα υπολογίζει και θα εµφανίζει στην οθόνη το πλήθος των λεωφορείων που θα χρειαστούν γ) θα υπολογίζει και θα εµφανίζει στην οθόνη το κόστος για κάθε λεωφορείο δ) θα υπολογίζει το συνολικό κόστος για όλα τα λεωφορεία Κάθε λεωφορείο χωράει 55 άτοµα program alsl; var p,s,t,leof,i:integer; kostos,k:real; write(' ώσε το πλήθος των παιδιών :'); readln(p); write(' ώσε το πλήθος των συνοδών :'); readln(s); t:=s+p; writeln(t); leof := (t div 55); if t mod 55 > 0 then leof:=leof+1; writeln('λεωφορεία : ', leof); kostos := 500; k:=kostos; writeln('λεωφορείo : 1 : ', kostos:0:2); for i:=2 to leof do k:=k - k * 0.05; writeln('λεωφορείo : ',i, ' : ', k:0:2); kostos := kostos + k; writeln('συνολικό κόστος : ', kostos:0:2); 8
Άσκηση 07 Για τις εξετάσεις πιστοποίησης ECDL στην Καβάλα δεσµεύτηκαν αίθουσες σε 5 σχολεία. Να γράψετε πρόγραµµα Pascal το οποίο : α) για κάθε σχολείο να διαβάζει το όνοµά του και το πλήθος των αιθουσών που δεσµεύτηκαν β) για κάθε αίθουσα να διαβάζει το πλήθος των εξεταζόµενων και να υπολογίζει τον αριθµό των επιτηρητών που χρειάζονται σύµφωνα µε τον παρακάτω πίνακα - να υπολογίζει και να τυπώνει το συνολικό αριθµό αιθουσών και το µικρότερο και το µεγαλύτερο πλήθος αιθουσών που δεσµεύτηκαν σε κάποιο σχολείο γ) να υπολογίζει και να τυπώνει το συνολικό αριθµό εξεταζοµένων και επιτηρητών δ) να υπολογίζει και να τυπώνει το µικρότερο και το µέγιστο πλήθος εξεταζοµένων που θα εξεταστούν σε κάποια αίθουσα program alal; var i,j:integer; {µετρητές χολείων - αιθουσών} o:string; {όνοµα σχολείου} ai:integer; {πλήθος αιθουσών ενός σχολείου} sa:integer; {σύνολο αιθουσων} ej,sej:integer; {εξεταζοµενοι ενός σχολείου και σύνολο εξεταζόµενων} maxa,mina:integer; {ελάχιστος και µέγιστος αριθµός αιθουσλων σε κάποιο σχολείο} onoma_maxa,onoma_mina:string; {όνοµα σχολείου που εντοπίστηκε ο ελάχιστος ή ο µέγιστος αριθµός αιθουσών αντίστοιχα} maxej,minej:integer; {ελάχιστος και µέγιστος αριθµός εξεταζοµένων σε κάποια αίθουσα} onoma_maxej,onoma_minej:string; {όνοµα σχολείου που εντοπίστηκε ο ελάχιστος και µέγιστος αριθµός εξεταζοµένων σε κάποια αίθουσα} ep,sep:integer; {επιτηρητες σε κάποια αίθουσα και σύνολο επιτηρητών} sa:=0; maxa:=-maxint; mina:=maxint; sej:=0; maxej:=-maxint; minej:=maxint; sep:=0; for i:=1 to 5 do write(' ώσε το όνοµα του σχολείου : '); write(' ώσε το πλήθος αιθουσών για το ',o, ' : '); readln(ai); 9
sa:=sa+ai; if ai>maxa then maxa := ai; onoma_maxa:=o; if ai<mina then mina:=ai; onoma_mina:=o; for j:=1 to ai do write(' ώσε το πλήθος των εξεταζόµενων για την αίθουσα ', j, ' του σχολείου ', o, ' : '); readln(ej); sej:=sej+ej; if ej>maxej then maxej:=ej; onoma_maxej := o; if ej<minej then minej:=ej; onoma_minej := o; if ej <= 12 then ep := 1 else if ej <= 22 then ep:=2 else ep:=3; writeln(o:20, ' αίθουσα ', j); writeln('εξεταζόµενοι : ':20,ej); writeln('επιτηρητές : ':20, ep); sep:=sep+ep; writeln('συνολικές αίθουσες : ', sa); writeln('min αίθουσες : ', mina, ' ', onoma_mina); writeln('max αίθουσες : ', maxa, ' ', onoma_maxa); writeln('συνολο εξεταζόµενων ', sej); writeln('σύνολο επιτηρητων ', sep); writeln('min εξεταζόµενοι : ', minej, ' ', onoma_minej); writeln('max εξεταζόµενοι : ', maxej, ' ', onoma_maxej); 10
Άσκηση 08 Το παιχνίδι «ΒΕΛΑΚΙΑ» (darts) παίζεται ως εξής: Ο στόχος είναι χωρισµένος σε περιοχές. Σε κάθε περιοχή αντιστοιχούν κάποιοι βαθµοί. Οι βαθµοί που αντιστοιχούν στις περιοχές είναι όλοι οι ακέραιοι από το 1 ως το 20 και οι αριθµοί 30 και 50. Αν το βελάκι δε βρει καθόλου τον στόχο ο παίκτης δεν αφαιρεί κανένα βαθµό από το υπόλοιπό του. Κάθε παίκτης ξεκινά µε «υπόλοιπο» 368 βαθµούς και για κάθε βελάκι που πετάει αφαιρεί από το υπόλοιπο που του έχει αποµείνει τους βαθµούς της περιοχής που πέτυχε. Η διαδικασία συνεχίζεται µέχρι ο παίκτης να µηδενίσει το υπόλοιπό του. Η ιδιαιτερότητα όµως του παιχνιδιού είναι το ότι τερµατίζει µόνο µε βολή που είναι ίση µε το υπόλοιπο δηλαδή πρέπει η τελευταία βολή του να µηδενίζει ακριβώς το υπόλοιπό του και να µην το κάνει αρνητικό, διαφορετικά το υπόλοιπο µένει ως έχει. Για παράδειγµα αν έχει υπόλοιπο 17 και η βολή του είναι για 30 βαθµούς, τότε το υπόλοιπο µένει 17 και ο παίκτης συνεχίζει τις βολές του. Αν βέβαια η βολή είναι για 5 βαθµούς το υπόλοιπο γίνεται 12 και ο παίκτης συνεχίζει τις βολές του. Το σκορ του παίκτη τελικά είναι το πλήθος των βολών του. Φυσικά καλύτερος θεωρείται ανάµεσα σε δύο παίκτες αυτός που έχει το µικρότερο πλήθος βολών. Σε περίπτωση ισοβαθµίας καλύτερος θεωρείται όποιος είχε περισσότερες βολές µε βαθµό 50. Σε περίπτωση που κάποιος έχει υπόλοιπο κάτω από 50 και φέρει βολή των 50 τότε η βολή ΕΝ µετράει στο υπόλοιπο αλλά ΟΥΤΕ µετράει στις 50ρες βολές. Προσµετράται όµως στις συνολικές βολές που έχει ρίξει. ηλαδή αν κάποιος έχει υπόλοιπο 30 και φέρει 50άρα βολή το υπόλοιπο παραµένει 30. Να γράψετε πρόγραµµα σε Pascal το οποίο να διαβάζει αρχικά για έναν παίκτη το όνοµά του και στη συνέχεια διαδοχικά τι βολές του µέχρι να τελειώσει γι αυτόν το παιχνίδι και να εµφανίζει το πλήθος των βολών που χρειάστηκε και το πλήθος των πενηντάρων. Το πρόγραµµα να τερµατίζει όταν ο παίκτης µηδενίσει το υπόλοιπο. Να γίνεται έλεγχος εγκυρότητας των δεδοµένων που εισάγονται. program stoxos; var ypol:integer; o:string; prosp:integer; peninta:integer; v:integer; procedure voli(var v:integer); write(βολή:'); readln(v); if not( (v>=1) and (v<=20) or (v=30) or (v=50) ) then repeat write('λάθος! Βολή:'); readln(v); until ( (v>=1) and (v<=20) or (v=30) or (v=50) ) 11
ypol:=368; write('παίκτης : '); prosp:=0; peninta:=0; writeln('υπόλοιπο : ',ypol); while ypol <> 0 do voli(v); prosp:=prosp+1; if ypol - v >= 0 then ypol := ypol - v; if v = 50 then peninta:=peninta+1; writeln('υπόλοιπο : ',ypol); writeln(τέλος παιχνιδιού'); writeln('προσπάθειες : ', prosp); writeln('πενηντάρες: ', peninta); 12