ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 9 : Βασικές Εντολές 1. Εισαγωγή Εντολές Εξόδου Κάθε Η/Υ έχει µία προκαθορισµένη συσκευή ή αρχείο (η συσκευή αναπαρίσταται ως αρχείο) όπου γίνεται η έξοδος των αποτελεσµάτων µιας επεξεργασίας (ενός προγράµµατος) εκτός και αν ο χρήστης ορίσει κάτι άλλο. Μια πολύ κοινή συσκευή εξόδου είναι η οθόνη του Η/Υ ή ένας εκτυπωτής. Σε κάθε υλοποίηση της Pascal αυτή η συσκευή είναι γνωστή σαν ένα προκαθορισµένο αρχείο µε όνοµα Output (µεταβλητή τύπου αρχείου). Κάθε εντολή εξόδου σε ένα πρόγραµµα Pascal γράφει σ αυτό το αρχείο εκτός και αν ο χρήστης έχει ορίσει ένα διαφορετικό αρχείο συσκευή. Για την έξοδο αποτελεσµάτων ένα πρόγραµµα Pascal χρησιµοποιεί τις διαδικασίες write και writeln. Σε κάθε περίπτωση οι παραπάνω διαδικασίες γράφουν δεδοµένα σε ένα αρχείο. Αυτό το αρχείο µπορεί να είναι ένα κανονικό αρχείο ή µία συσκευή (οθόνη εκτυπωτής) την οποία η Pascal χειρίζεται σαν αρχείο. Για να χρησιµοποιήσουµε τις εντολές write και writeln θα πρέπει στην επικεφαλίδα του προγράµµατος να δηλώσουµε το αρχείο output καθώς επίσης και τη βιβλιοθήκη wincrt - program p_name(output); - uses crt; 2. Η εντολές write και writeln Για την έξοδο αποτελεσµάτων, δηλαδή για την εµφάνιση των τιµών µεταβλητών ή σταθερών στην οθόνη ή σε εκτυπωτή, η Pascal χρησιµοποιεί τις διαδικασίες (procedures) write και wtiteln που ονοµάζονται εντολές εξόδου. Οι ίδιες εντολές µπορούν να χρησιµοποιηθούν και για εγγραφή δεδοµένων σε αρχεία που βρίσκονται αποθηκευµένα στο σκληρό δίσκο του υπολογιστή. Ωστόσο στα πλαίσια του µαθήµατός µας δεν θα µας απασχολήσει αυτή η περίπτωση παρά µόνο η χρήση τους για εµφάνιση δεδοµένων στην οθόνη. 2.1. Η εντολή write Μορφή write(παράµετρος_1, παράµετρος_2,...,παράµετρος_ν) Λειτουργία Όταν εκτελείται η εντολή write, οι τιµές των παραµέτρων τυπώνονται µε τη σειρά που δίνονται από αριστερά προς τα δεξιά Κάθε παράµετρος της write µπορεί να είναι σταθερά (αριθµητικού, αλφαριθµητικού ή λογικού τύπου) Σ αυτή την περίπτωση τυπώνεται η τιµή της σταθεράς 1
µεταβλητή (αριθµητικού, αλφαριθµητικού ή λογικού τύπου) Σ αυτή την περίπτωση τυπώνεται η τιµή της µεταβλητής αριθµητική (ή λογική) έκφραση Σ αυτή την περίπτωση υπολογίζεται και τυπώνεται το αποτέλεσµα της παράστασης Παράδειγµα (αρχείο write.pas) 1 program write_1(output); 2 uses crt; 3 var 4 a,b:integer; 5 X,Y:boolean; 6 C:string; 7 begin 8 a:=1; 9 b:=2; 10 X:=true; 11 Y:=false; 12 C:='µήνυµα'; 13 write(1); {εµφάνιση αριθµητικής σταθεράς τύπου integer} 14 write(2.1); {εµφάνιση αριθµητικής σταθεράς τύπου real} 15 write('turbo pascal'); {εµφάνιση αλφαριθµητικής σταθεράς} 16 write(true); {εµφάνιση λογικής σταθεράς} 17 write(a); {εµφάνιση µεταβλητής} 18 write(c); {εµφάνιση µεταβλητής} 19 write(x); {εµφάνιση µεταβλητής} 20 write((a+1)*2/b); {εµφάνιση αριθµητικής έκφρασης} 21 write(x and Y); {εµφάνιση λογικής έκφρασης} 22 writeln(); {εµφάνιση κενής γραµµής} 23 write(1,2.1,'turbo Pascal', true,a,c,x,(a+1)*2/b,x and Y); {όλες οι παραπάνω εντολές write σε µία} 24 writeln(); {εµφάνιση κενής γραµµής} 25 write(1,' ',2.1,' ','Turbo Pascal',' ', true,' ',a,' ',C,' ',X,' ',(a+1)*2/b,' ',X and Y); {η προηγούµενη εντολή µε τις παραµέτρους να χωρίζονται µε κενά} 26 end. Η εκτέλεση του παραπάνω προγράµµατος δίνει τα ακόλουθα αποτελέσµατα 1 2.1000000000000000E+0000Turbo pascaltrue1µήνυµαtrue2false 1 2.1000000000000000E+0000Turbo PascalTRUE1µήνυµαTRUE2FALSE 1 2.1000000000000000E+0000 Turbo Pascal TRUE 1 µήνυµα TRUE 2 FALSE Παρατηρήσεις Οι τιµές των παραµέτρων τυπώνονται η µία δίπλα στην άλλη χωρίς κενά ενδιάµεσα. Αν θέλουµε να χωρίσουµε τις τιµές που τυπώνονται µε κενά θα πρέπει να συµπεριλάβουµε στις παραµέτρους και τα κενά π.χ. write(a,,b); (βλέπε και γραµµή 25 στον κώδικα παραπάνω. 2
2.2. Η εντολή writeln Μορφή writeln(παράµετρος_1, παράµετρος_2,...,παράµετρος_ν) Λειτουργία H εντολή writeln, έχει ακριβώς την ίδια λειτουργία µε την write εκτός από την παρακάτω διαφορά.: Αν έχουµε µία εντολή write η οποία ακολουθείται από µία άλλη εντολή εξόδου (write ή writeln) τότες αφού τελειώσει η πρώτη την εµφάνιση των παραµέτρων της η επόµενη θα εµφανίσει τις δικές τις παραµέτρους αµέσως µετά την τελευταία τιµή της προηγούµενης χωρίς κανέναν διαχωρισµό όπως είδαµε από το προηγούµενο παράδειγµα. Η εντολή writeln αφού εµφανίσει όλες τις παραµέτρους τις εισάγει και µια αλλαγή γραµµής (σαν να πατάµε enter στο word) οπότε η επόµενη εντολή εξόδου θα ξεκινήσει από την επόµενη γραµµή. Παράδειγµα 1 Εντολές Τιµές των µεταβλητών Write(data1,, data2); Write ( telos ); Data1=55 data2=35 Writeln(data1,, data2); Writeln ( telos ); Data1=55 data2=35 Αποτέλεσµα 55 35 telos 55 35 telos 3
Παράδειγµα 2 (αρχείο writeln.pas) 1 program writeln_1(output); 2 uses crt; 3 var 4 a,b:integer; 5 X,Y:boolean; 6 C:string; 7 begin 8 a:=1; 9 b:=2; 10 X:=true; 11 Y:=false; 12 C:='µήνυµα'; 13 writeln(1); {εµφάνιση αριθµητικής σταθεράς τύπου integer} 14 writeln(2.1); {εµφάνιση αριθµητικής σταθεράς τύπου real} 15 writeln('turbo pascal'); {εµφάνιση αλφαριθµητικής σταθεράς} 16 writeln(true); {εµφάνιση λογικής σταθεράς} 17 writeln(a); {εµφάνιση µεταβλητής} 18 writeln(c); {εµφάνιση µεταβλητής} 19 writeln(x); {εµφάνιση µεταβλητής} 20 writeln((a+1)*2/b); {εµφάνιση αριθµητικής έκφρασης} 21 writeln(x and Y); {εµφάνιση λογικής έκφρασης} 22 writeln(); {εµφάνιση κενής γραµµής} 23 writeln(1,2.1,'turbo Pascal', true,a,c,x,(a+1)*2/b,x and Y); {όλες οι παραπάνω εντολές write σε µία} 24 writeln(); {εµφάνιση κενής γραµµής} 25 writeln(1,' ',2.1,' ','Turbo Pascal',' ', true,' ',a,' ',C,' ',X,' ',(a+1)*2/b,' ',X and Y); {η προηγούµενη εντολή µε τις παραµέτρους να χωρίζονται µε κενά} 26 end. Μεταγλωττίστε και εκτελέστε το παραπάνω πρόγραµµα και συγκρίνεται τα αποτελέσµατα µε το προηγούµενο. Παρατήρηση Η εντολή writeln µπορεί να χρησιµοποιηθεί χωρίς παραµέτρους. Σ αυτή την περίπτωση το αποτέλεσµα είναι να εισάγεται µια αλλαγή γραµµής οπότε η επόµενη εντολή εξόδου να τυπώνει στην επόµενη γραµµή. Δηλαδή η εντολή Writeln(x,y) είναι ισοδύναµη µε τις εντολές Write(x,y); Writeln; 2.3. Η Μορφοποιηµένη εκτύπωση Γενικά Μπορούµε να εισάγουµε όσες κενές γραµµές θέλουµε δίνοντας την εντολή writeln() (χωρίς παραµέτρους) τόσες φορές όσες οι κενές γραµµές που θέλουµε. Για να χωρίσουµε τις παραµέτρους στην ίδια σειρά µε κενά συµπεριλαµβάνουµε όσα κενά θέλουµε (ως παραµέτρους) µέσα σε (αυτάκια). 4
Μια γραµµή της οθόνης µπορεί να θεωρηθεί ως µια ακολουθία από ισοδιάστατες θέσεις που σε κάθε µία από αυτές µπορεί να γραφτεί ένας χαρακτήρας. Το πλήθος των θέσεων εξαρτάται από την οθόνη. Οι θέσεις αυτές µπορούν να θεωρηθούν αριθµηµένες από αριστερά προς τα δεξιά. Αφού έχει εκτελεστεί µια εντολή writeln, η επόµενη εντολή writeln θα ξεκινήσει από την πρώτη θέση της επόµενης γραµµής και στη συνέχεια προχωράει προς τα δεξιά µε έναν χαρακτήρα σε κάθε θέση. Αν έχουµε οθόνη 8 χαρακτήρων η εντολή writeln( ABCD ); θα τυπώσει A B C D Ακέραιες και αλφαριθµητικού τύπου τιµές Για σταθερές ή µεταβλητές ακέραιου τύπου ή αλφαριθµητικού τύπου µπορούµε να ορίσουµε σε πόσες θέσεις (εύρος πεδίου) θα τυπωθεί η τιµή µιας παραµέτρου. Σ αυτή την περίπτωση γράφουµε writeln(x:m); όπου x είναι η µεταβλητή και m το πλήθος των θέσεων εκτύπωσης. Αν το εύρος είναι ίσο µε το µήκος της τιµής της παραµέτρου, τότε η εµφάνιση της τιµής γίνεται κανονικά. Αν το εύρος είναι µεγαλύτερο από το µήκος της τιµής της παραµέτρου, τότε εµφανίζονται κενά πριν από την τιµή της παραµέτρου προκειµένου να καλυφθεί το πλήθος των θέσεων εκτύπωσης. Αν το εύρος είναι µικρότερο από το µήκος της τιµής της παραµέτρου τότε η οδηγία µορφοποίησης αγνοείται και η εµφάνιση της τιµής γίνεται κανονικά. Παράδειγµα (αρχείο formatted_out.pas) program formatted_out(output); uses crt; var A:integer; begin A:=234; writeln(1:7); writeln(a:5); writeln('μηλο':4); writeln('πιτα':7); writeln(' AB':4); writeln('efg':2); end. Η εκτέλεση του παραπάνω κώδικα δίνει τα εξής αποτελέσµατα: 1 234 ΜΗΛΟ ΠΙΤΑ AB EFG 5
Τιµές τύπου real Για µία τιµή τύπου real εκτός από το πλήθος των θέσεων εκτύπωσης µπορούµε να προσδιορίσουµε και το πλήθος των δεκαδικών ψηφίων που θα εµφανίζονται. Αν x µια µεταβλητή τύπου real τότε µπορούµε να γράψουµε writeln(x:m:n); όπου x είναι η µεταβλητή, m το πλήθος των θέσεων εκτύπωσης και n το πλήθος των δεκαδικών ψηφίων. Παράδειγµα (αρχείο real_out.pas) program formatted_out(output); uses crt; const Pi=3.14159265; var A:real; begin A:=234.8976544; writeln(12.34567:7:2); writeln(pi:7:2); writeln(a:7:2); end. Η εκτέλεση του παραπάνω προγράµµατος δίνει : 12.35 3.14 234.90 6