ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 9 : Βασικές Εντολές 1. Εισαγωγή Εντολή Εκχώρησης - Αντικατάστασης Μια µεταβλητή σε ένα πρόγραµµα Pascal µπορεί να πάρει τιµή µέσω µιας εντολής read (π.χ. read(x);) Άλλος τρόπος για να πάρει τιµή µια µεταβλητή σε ένα πρόγραµµα Pascal είναι να ζητήσουµε να γίνει απευθείας αποθήκευση κάποιου δεδοµένου στη µνήµη ως τιµή µιας µεταβλητής. Τότε λέµε ότι γίνεται ανάθεση ή εκχώρηση τιµής σε µεταβλητή. Η ανάθεση εκχώρηση τιµής σε µεταβλητή γίνεται µια εντολή εκχώρησης (αντικατάστασης) 2. Η εντολή εκχώρησης τιµής σε µεταβλητή Μορφή όνοµα_µεταβλητής:=έκφραση Παρατήρησεις Λειτουργία Η εντολή εκχώρησης τιµής σε µεταβλητή αποτελείται από δύο µέρη (αριστερό και δεξί) που χωρίζονται από το σύµβολο :=. Το αριστερό µέρος µιας εντολής εκχώρησης πρέπει να είναι υποχρεωτικά µια µεταβλητή (όνοµα µεταβλητής) Η έκφραση που υπάρχει δεξιά από το := µπορεί να είναι : - µια σταθερά (αριθµητική, αλφαριθµητική ή λογική) - µια µεταβλητή - µια αριθµητική ή λογική έκφραση Κατά την εκτέλεση µιας εντολής εκχώρησης τιµής 1. υπολογίζεται η τιµή της έκφρασης δεξιά 2. η τιµή που υπολογίστηκε καταχωρείται ως τιµή της µεταβλητής αριστερά 3. η τιµή που είχε η µεταβλητή αριστερά πριν από την εκτέλεση της εντολής, χάνεται. Προσοχή ο τύπος δεδοµένων της τιµής της έκφρασης πρέπει να είναι ο ίδιος µε τον τύπο της µεταβλητής. µοναδική εξαίρεση είναι η δυνατότητα καταχώρησης τιµής έκφρασης τύπου integer σε µεταβλητή τύπου real 1
Παραδείγµατα Στο παρακάτω πρόγραµµα επισηµαίνονται µε σχόλια οι εντολές ανάθεσης οι οποίες δεν είναι έγκυρες. (Αρχείο assign_error.pas: Να µπουν σε σχόλια τις µη έγκυρες εντολές ανάθεσης.) 1. program assign_error(input, output); 2. const 3. A=10; 4. B=4.5; 5. C=true; 6. D='πληροφορική'; 7. var 8. X,Y:integer; 9. Z,W:real; 10. V,L:boolean; 11. M,N:string; 12. P:char; 13. 14. X:=1; 15. X:=A; 16. X:=Y; 17. X+1:=3; {To Χ+1 δεν είναι µεταβλητή} 18. X:=1+3; 19. X:=(Y-1)*A; 20. X:=X+1; 21. X+Y:= Y; {To Χ+Y δεν είναι µεταβλητή} 22. X:=Y mod X; 23. Z:=2.1; 24. Z:=B; 25. A:=X; {Το Α είναι σταθερά} 26. Z:=W; 27. Z:=5/2; 28. X:=3/2; {Real σε Integer} 29. Z:=(W/4+1)/7; 30. V:=true; 31. V:=C; 32. V:=L; 33. X:=Z; {Real σε Integer} 34. M:=3; {Αριθµός σε String} 35. V:=L or V; 36. M:='Βπ'; 37. M:=D; 38. M:='***'; 39. V:='telos'; {String σε boolean} 40. P:='*'; 41. 2
2.1. Παραδείγµατα χρήσης Παράδειγµα 1 (αρχείο assign_1.pas) 1 program assign_1(input, output); 2 var X,Y,Z:integer; 3 4 X:=3; 5 Y:=7; 6 Z:=(X+Y)*2; 7 X:=2; 8 Y:=1; 9 writeln('z=',z); 10 Όταν υπολογίζεται µια παράσταση που περιέχει µεταβλητές κάθε µεταβλητή αντικαθίσταται από την τιµή που έχει εκείνη τη στιγµή. Έτσι στο παραπάνω πρόγραµµα όταν εκτελείται η εντολή Z:=(X+Y)*2; οι µεταβλητές X και Y έχουν τις τιµές 3 και 7 αντίστοιχα µε αποτέλεσµα η µεταβλητή Z µα παίρνει την τιµή 20. Προσέξτε ότι κατοπινές µεταβολές στις τιµές των µεταβλητών X και Y δεν αλλάζουν την τιµή που υπολογίστηκε για την παράσταση (X+Y)*2 προηγουµένως και συνεπώς η εντολή writeln που ακολουθεί τυπώνει την τιµή 20. Μεταγλωττίστε και εκτελέστε το παραπάνω πρόγραµµα και επιβεβαιώσετε τα παραπάνω. Παράδειγµα 2 (αρχείο assign_2.pas) 1 program assign_2(input, output); 2 var X:integer; 3 4 X:=3; 5 writeln( X=,X); 6 X:=X+1; 7 writeln('x=',x); 8 Όπως βλέπεται στο παραπάνω παράδειγµα, στην εντολή X:=X+1 η ίδια µεταβλητή X εµφανίζεται και πριν και µετά το :=. Σ αυτή την περίπτωση πρώτα υπολογίζεται η τιµή της παράστασης στο δεξί µέρος µε την τιµή που έχει η µεταβλητή εκείνη τη στιγµή και στη συνέχεια η τιµή που υπολογίστηκε εκχωρείται στην µεταβλητή στο δεξί µέρος. Έτσι στο παραπάνω πρόγραµµα η µεταβλητή X έχει αρχικά την τιµή 3 και µετά την εκτέλεση της εντολής X:=X+1 έχει την τιµή 4. Μεταγλωττίστε και εκτελέστε το παραπάνω πρόγραµµα και επιβεβαιώσετε τα παραπάνω. 3
Παράδειγµα 3 (αρχείο assign_3.pas) program assign_3(input, output); var X,Y,Z:real; Z:=X+Y; X:=1; Y:=2; writeln('z=',z); Αν εκτελέσετε το παραπάνω πρόγραµµα θα δείτε ότι θα τυπώσει µια τιµή για την µεταβλητή Z και µάλιστα απροσδιόριστη. Αυτό συµβαίνει γιατί κατά την έναρξη εκτέλεσης του προγράµµατος κάθε µεταβλητή που έχει δηλωθεί έχει µια τιµή (ότι υπάρχει εκείνη τη στιγµή στη θέση µνήµης στην οποία αντιστοιχεί) Άσκηση 1 Γράψτε και µεταγλωττίστε το παρακάτω πρόγραµµα. program swap(input, output); var X,Y:integer; writeln( ώσε δύο ακεραίους αριθµούς και πάτα enter ); Read(X,Y); X:=Y; Y:=X; 1. Αν η είσοδος είναι οι αριθµοί 10 και 20, τι τυπώνει; 2. Η έξοδος του προγράµµατος είναι αυτή που περιµένατε; 3. Αν όχι γιατί; Άσκηση 2 Τροποποιήστε το παραπάνω πρόγραµµα ώστε να αντιµεταθέτει τις τιµές δύο µεταβλητών Χ και Υ. program swap(input, output); var X,Y,temp:integer; writeln(' ώσε δύο ακεραίους αριθµούς και πάτα enter'); Read(X,Y); temp:=x; X:=Y; Y:=temp; Άσκηση 3 Να γράψετε ένα πρόγραµµα σε Pascal που θα διαβάζει από το πληκτρολόγιο 3 αριθµούς και για καθένα από αυτούς θα τυπώνει το διπλάσιο και το τριπλάσιο. Η µορφή της εξόδου να είναι όπως το παρακάτω παράδειγµα. 4
Αριθµός Διπλάσιο Τριπλάσιο 9 18 27 34 68 102 51 102 153 program formout(input, output); var X,Y,Z:integer; writeln(' ώσε τρεις ακεραίους αριθµούς και πάτα enter'); Read(X,Y,Z); writeln('αριθµός':12,' ιπλάσιο':12,'τριπλάσιο':12); writeln(x:12,x*2:12,x*3:12); writeln(y:12,y*2:12,y*3:12); writeln(z:12,z*2:12,z*3:12); 3. Η δοµή ακολουθίας στην Pascal Σε ένα πρόγραµµα σε Pascal µπορεί να χρησιµοποιηθεί η αλγοριθµική δοµή ακολουθίας όπως αυτή χρησιµοποιείται και για την ανάπτυξη αλγορίθµων µε ψευδοκώδικα. Παρακάτω δίνεται το λογικό διάγραµµα τµήµατος αλγορίθµου (προγράµµατος) γραµµένο σύµφωνα µε τη δοµή ακολουθίας. Δίπλα δίνεται ο κώδικας προγράµµατος, για τον υπολογισµό του µέσου όρου δύο αριθµών, που χρησιµοποιεί τη δοµή ακολουθίας. program average(input,outpout); var x,y,mo:real; write(' ώσε δύο αριθµούς'); readln(x,y); mo:=(x+y)/2; write('ο µέσος όρος των ',x:0:2,' και ',y:0:2,' είναι ',mo:0:2); Η δοµή ακολουθίας στην Pascal αναφέρεται σε ένα πρόγραµµα ή ένα τµήµα προγράµµατος όπου ένα σύνολο εντολών εκτελούνται σειριακά η µία µετά την άλλη. 5