ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 11 : Εντολές Επανάληψης 6 ο Φύλλο Εργασιών : Φωλιασµένες επαναλήψεις ΑΠΑΝΤΗΣΕΙΣ Α. Άσκηση 1 Να γράψετε ένα πρόγραµµα που θα τυπώνει τους πίνακες της προπαίδειας για τους αριθµούς από 1 έως 10 µε τη µορφή που δίνεται παρακάτω για κάθε αριθµό. Να χρησιµοποιήσετε την εντολή for. 1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9 1x10=10 Α.1 Αλγοριθµική λύση του προβλήµατος Για κάθε έναν αριθµό από 1 έως και 10 θα πρέπει να βρούµε το γινόµενό του µε κάθε αριθµό από 1 έως 10. ηλαδή για κάθε αριθµό από 1 έως 10 θα πρέπει να υπολογίσουµε 10 γινόµενα. Αντιλαµβανόµαστε ότι καταρχήν θα πρέπει να εκτελεστούν 10 επαναλήψεις που θα αφορούν τους δέκα αριθµούς και σε κάθε βήµα της επανάληψης άλλες δέκα επαναλήψεις που θα αφορούν τα δέκα γινόµενα. Το πρόβληµα θα λυθεί µε δύο εντολές for όπου η µία θα είναι φωλιασµένη µέσα στην άλλη. Α.2 Το πρόγραµµα σε Pascal program propedia(input, output); var I,J:integer; for I := 1 to 10 do for J := 1 to 10 do writeln(i,'x',j,'=',i*j); writeln(); 1
Β. Άσκηση 2 Να γράψετε ένα πρόγραµµα που θα τυπώνει τους πίνακες αλήθειας των πράξεων ΚΑΙ Η ΣΥΜΠΛΗΡΩΜΑ της άλγεβρας Boole µε την παρακάτω µορφή. X Y not X X AND Y X OR Y FALSE FALSE TRUE FALSE FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE TRUE TRUE Β.1 Αλγοριθµική λύση του προβλήµατος Αν θεωρήσουµε µια µεταβλητή X τύπου Boolean αυτή θα µπορεί να πάρει τις τιµές FALSE και TRUE. Για κάθε µία από αυτές τις τιµές µια άλλη µεταβλητή Y θα µπορεί να πάρει τις τιµές FALSE και TRUE αντίστοιχα. Έτσι έχουµε τα τέσσερα ζεύγη τιµών που βλέπουµε στον παραπάνω πίνακα (FALSE-FALSE, FALSE-TRUE, TRUE-FALSE, TRUE-TRUE). Μια µεταβλητή τύπου Boolean είναι µια δυαδική µεταβλητή, όπως τη γνωρίσαµε από την άλγεβρα Boole. Η διαφορά εδώ είναι ότι αντί για τις τιµές 1 και 0 παίρνει τις τιµές true και false. Επίσης το αποτέλεσµα των πράξεων αντί για 1 και 0 είναι true και false αντίστοιχα. ηλαδή ο παραπάνω πίνακας αλήθειας είναι ο γνωστός µας X Y not X X AND Y X OR Y 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 Επειδή ο τύπος Boolean είναι διατεταγµένος µπορούµε να έχουµε µια εντολή for της µορφής for X := FALSE to TRUE η οποία θα εκτελέσει δύο επαναλήψεις για X = FALSE και για X = TRUE. Για κάθε βήµα αυτής της επανάληψης µπορούµε να γράψουµε µια εντολή for της µορφής for Y := FALSE to TRUE η οποία θα εκτελέσει επίσης δύο επαναλήψεις για Y = FALSE και για Y = TRUE. Έτσι θα έχουµε µια φωλιασµένη for µέσα σε for (η for Y := FALSE to TRUE) η οποία για κάθε ένα από τα δύο βήµατα της πρώτης for θα εκτελέσει επίσης δύο βήµατα. Συνεπώς η φωλιασµένη for θα εκτελέσει δύο φορές από δύο βήµατα, δηλαδή σύνολο τέσσερα βήµατα. Είναι εύκολο να αντιληφθούµε ότι στα τέσσερα αυτά βήµατα οι µεταβλητές X και Y θα έχουν τα τέσσερα ζεύγη τιµών που αναφέραµε παραπάνω. Για κάθε ένα από αυτά τα ζεύξη τιµών εκτελούµε την αντίστοιχη λογική πράξη και τυπώνουµε το αποτέλεσµα. Β.2 Το πρόγραµµα σε Pascal program boole(input, output); var X,Y:boolean; writeln('x':10,'y':10,'not X':10,'X AND Y':10,'X OR Y':10); writeln(x:10,y:10,not X:10,X AND Y:10, X OR Y:10); 2
Γ. Άσκηση 3 Να γράψετε ένα πρόγραµµα που θα τυπώνει τα παρακάτω A AB ABC ABCD ABCDE ABCDEF ABCDEFG ABCDEFGH ABCDEFGHI ABCDEFGHIJ ABCDEFGHIJK ABCDEFGHIJKL ABCDEFGHIJKLM ABCDEFGHIJKLMN ABCDEFGHIJKLMNO ABCDEFGHIJKLMNOP ABCDEFGHIJKLMNOPQ ABCDEFGHIJKLMNOPQR ABCDEFGHIJKLMNOPQRS ABCDEFGHIJKLMNOPQRST ABCDEFGHIJKLMNOPQRSTU ABCDEFGHIJKLMNOPQRSTUV ABCDEFGHIJKLMNOPQRSTUVW ABCDEFGHIJKLMNOPQRSTUVWX ABCDEFGHIJKLMNOPQRSTUVWXY ABCDEFGHIJKLMNOPQRSTUVWXYZ Γ.1 Αλγοριθµική λύση του προβλήµατος Με µία εντολή for της µορφής for I := 'A' to 'Z' απαριθµούµε όλα τα γράµµατα του αγγλικού αλφάβητου. Μέσα στην προηγούµενη for "φωλιάζουµε" µια δεύτερη for της µορφής for J := 'A' to I δηλαδή η δεύτερη for απαριθµεί τα γράµµατα από Α µέχρι εκείνο στο οποίο έχει φτάσει η πρώτη for και τα τυπώνει. ηλαδή η πρώτη for θα εκτελέσει 26 επαναλήψεις και για κάθε επανάληψη της πρώτης for η δεύτερη θα εκτελέσει τόσες επαναλήψεις όσο είναι και ο αριθµός της επανάληψης της πρώτης for. ηλαδή για την πρώτη επανάληψη της for η δεύτερη θα εκτελέσει µία επανάληψη, για τη δεύτερη επανάληψη της πρώτης for η δεύτερη θα εκτελέσει δύο επαναλήψεις, για την τρίτη επανάληψη της πρώτης for η δεύτερη for θα εκτελέσει τρεις επαναλήψεις κ.ο.κ. 3
Γ.2 Το πρόγραµµα σε Pascal program alphabet(input, output); var I,J:char; for I := 'A' to 'Z' do for J := 'A' to I do write(j); writeln();. Άσκηση 4 program boole(input, output); var X,Y:boolean; X_, Y_, NOT_X, X_OR_Y, X_AND_Y:integer; writeln('x':10,'y':10,'not X':10,'X AND Y':10,'X OR Y':10); case X of TRUE: X_ := 1; FALSE: X_ := 0; case Y of TRUE: Y_ := 1; FALSE: Y_ := 0; case NOT X of TRUE: NOT_X := 1; FALSE: NOT_X := 0; case X OR Y of TRUE: X_OR_Y := 1; FALSE: X_OR_Y := 0; case X AND Y of TRUE: X_AND_Y := 1; FALSE: X_AND_Y := 0; writeln(x_:10,y_:10,not_x:10,x_and_y:10,x_or_y:10); 4
Ε. Άσκηση 5 program alphabet(input, output); var X,Y,Z:boolean; X_,Y_,Z_,F:integer; writeln('x':2,'y':2, 'Z':2, '(X AND Y OR Z)':18); for Z := FALSE to TRUE do case X of TRUE: X_ := 1; FALSE: X_ := 0; case Y of TRUE: Y_ := 1; FALSE: Y_ := 0; case Z of TRUE: Z_ := 1; FALSE: Z_ := 0; case X AND Y OR Z of TRUE: F := 1; FALSE: F := 0; writeln(x_:2,y_:2,z_:2, F:9) 5