Subsections

2 Διάλεξη Δεύτερη - 2 Δεκεμβρίου 2011

2.1 Παραδείγματα με το IF ...THEN ... και τις παραλλαγές του



   1 CLS
   2 PRINT "Give me two numbers: "
   3 INPUT a, b
   4 IF a > b THEN
   5  PRINT "**************************************"
   6  PRINT "The biggest was the first: "; a
   7 ELSEIF a < b THEN
   8  PRINT "--------------------------------------"
   9  PRINT "The biggest was the second: "; b
  10 ELSE
  11  PRINT "They are equal: "; a
  12 END IF

Το αρχείο l2/if1.bas


Το πρόγραμμα if1.bas διαβάζει δύο αριθμούς από το χρήστη και βρίσκει ποιος είναι ο μεγαλύτερος ή αν είναι ίσοι.

Βλέπουμε εδώ μια παραλλαγή του IF ...THEN ...ELSE ...END IF με πολλαπλούς ελέγχους. Αν ο έλεγχος της γραμμής 4 (a>b) είναι επιτυχής τότε εκτελούνται οι γραμμές ανάμεσα στο THEN και το ELSEIF (οι γραμμές 5 και 6, όπου λέμε στο χρήστη ότι ο μεγαλύτερος αριθμός είναι ο πρώτος από αυτούς που έδωσε), αλλιώς ελέγχεται η συνθήκη που ακολουθεί το ELSEIF (γραμμή 7, a<b). Αν αυτή η συνθήκη ισχύει τότε εκτελείται το κομμάτι ανάμεσα στο THEN της γραμμής 7 και το επόμενο ELSE της γραμμής 10, κατά την εκτέλεση του οποίου ενημερώνεται ο χρήστης ότι ο δεύτερος αριθμός που έδωσε είναι ο μεγαλύτερος.

Αλλιώς, αν δηλ. αποτύχει και η συνθήκη της γραμμής 7 τότε εκτελείται ο κώδικας που ακολουθεί το ELSE (γραμμή 11) και ο χρήστης ενημερώνεται ότι οι δύο αριθμοί που έδωσε είναι ίσοι.

Πραγματικά, για να φτάσει ο έλεγχος (η εκτέλεση του προγράμματος) στη γραμμή 11 οι δύο προηγούμενες συνθήκες του IF (γραμμές 4 και 7) έχουν αποτύχει, και αν ούτε ο πρώτος είναι μεγαλύτερος από τον δεύτερο ούτε ο δεύτερος μεγαλύτερος από τον πρώτο έπεται ότι είναι ίσοι.

Πώς μπορεί κανείς να αποφασίσει ποιος από τρεις αριθμούς είναι ο μέγιστος. Το πρόγραμμα if3.bas παρακάτω είναι μια λύση.



   1 CLS
   2 PRINT "Give 3 numbers: "
   3 INPUT x, y, z
   4 IF (x>y) AND (x>z) THEN
   5  PRINT "Max = "; x; " at position 1"
   6 ELSEIF (y>x) AND (y>z) THEN
   7  PRINT "Max = "; y; " at position 2"
   8 ELSE
   9  PRINT "Max = "; z; " at position 3"
  10 END IF 

Το αρχείο l2/if3.bas


Χρησιμοποιούμε εδώ και πάλι τη μορφή του IF που είδαμε και στο πρόγραμμα if1.bas παραπάνω. Το νέο στοιχείο που βλέπουμε εδώ είναι οι δύο συνθήκες που ελέγχονται στο IF οι οποίες είναι σύνθετες και φτιάχνεται, η καθεμία από αυτές, από δύο απλούστερες συνθήκες οι οποίες συνδέονται με ένα λογικό τελεστή.

Για παράδειγμα, η συνθήκη της γραμμής 4

(x>y) AND (x>z)
ισχύει αν και η συνθήκη (x>y) και η συνθήκη (x>z) ισχύουν (στην οποία περίπτωση ο x είναι ο μεγαλύτερος αριθμός.

Άσκηση 21.
Γράψτε μια συνθήκη που να είναι η άρνηση της συνθήκης της γραμμής 4. Μπορείτε να χρησιμοποιήσετε το λογικό τελεστή OR.
$\surd$

Μια καλύτερη λύση στο πρόβλημα της εύρεσης του μεγαλύτερου από τρεις αριθμούς φαίνεται στο παρακάτω πρόγραμμα.



   1 CLS
   2 PRINT "Give 3 numbers: "
   3 INPUT x, y, z
   4 m = x
   5 c = 1
   6 IF y > m THEN
   7  m = y
   8  c = 2
   9 END IF
  10 IF z > m THEN
  11  m = z
  12  c = 3
  13 END IF
  14 PRINT "Max = "; m; " at position "; c

Το αρχείο l2/if2.bas


Εδώ χρησιμοποιούμε δύο βοηθητικές μεταβλητές, τις m και c. Επεξεργαζόμαστε τους αριθμούς έναν έναν και φροντίζουμε ώστε όταν έχουμε «δει» κάποιους από τους αριθμούς το m να είναι ίσο με το μέγιστο που έχουμε δει μέχρι στιγμής και το c να είναι ίσο με τη θέση του μέχρι τιμής μέγιστου (1, 2 ή 3).

Έχοντας αυτά υπόψιν μας θέτουμε στις γραμμές 4 και 5 τις αρχικές τιμές m = x και c = 1. Το νόημα αυτής της ανάθεσης είναι ότι αφού έχουμε εξετάσει μόνο το x τότε το μέγιστο είναι το ίδιο το x και το έχουμε δεί στην θέση 1 (που είναι και η μόνη που έχουμε εξετάσει). Στις γραμμές 6-9 ενημερώνουμε τις δύο αυτές μεταβλητές ώστε να λάβουμε υπόψιν μας και το y. Έτσι αν η νέα ποσότητα που εξετάζουμε, η y, είναι μεγαλύτερη από το μέχρι στιγμής μέγιστο τότε θέτουμε το m να ισούται με τη νέα αυτή ποσότητα, ώστε να εξακολουθήσει να ισχύει η σημασία του m, και επίσης ενημερώνουμε και τη μεταβλητή c ώστε να φαίνεται ότι το μέχρι στιγμής μέγιστο είναι στη θέση 2. Ομοίως, στις γραμμές 10-13 ενημερώνουμε τις μεταβλητές m, c ώστε να λάβουμε υπόψιν μας και το z. Στη γραμμή 14, τέλος, τυπώνεται το αποτέλεσμα.

Άσκηση 22.
Το πρόγραμμα if2.bas είναι καλύτερο από τα δύο προηγούμενα γιατί είναι πολύ εύκολο να τροποποιηθεί ώστε να δουλεύει για 4 αριθμούς ή και παραπάνω. Κάντε το να δουλεύει για 4 αριθμούς.
$\surd$

Άσκηση 23.
Γράψτε ένα πρόγραμμα που να διαβάζει μια λίστα από αριθμούς από το χρήστη και να βρίσκει το μέγιστο και το ελάχιστο στοιχείο της.

Οι αριθμοί της λίστας πρέπει όλοι να είναι θετικοί αριθμοί. Αν το πρόγραμμα διαβάσει ένα αριθμό που είναι $\le 0$ από το΄χρήστη θεωρεί ότι ο χρήστης δε θέλει να δώσει άλλους αριθμούς, τυπώνει το μέγιστο και το ελάχιστο και τελειώνει. Ο τελευταίος αριθμός που έδωσε ο χρήστης (που είναι $\le 0$) θεωρείται ότι δε συμμετέχει στη λίστα.

Θα χρειαστείτε μια ανακύκλωση με GOTO.
$\surd$

2.2 Ανακύκλωση με το FOR

Το παρακάτω πρόγραμμα count1.bas τυπώνει όλους τους ακεραίους από το 1 έως το 100 μαζί με τα τετράγωνά τους.



   1 CLS
   2 i = 100
   3 
   4 p:
   5 
   6 PRINT i, i * i
   7 IF i > 1 THEN
   8  i = i - 1
   9  GOTO p
  10 END IF

Το αρχείο l2/count1.bas


Για να το πετύχουμε αυτό ξεκινάμε τη μεταβλητή i από την τιμή 100 και τη μειώνουμε διαρκώς κατά 1 μέχρι που αυτή γίνεται 1. Για κάθε τιμή της i τυπώνουμε την τιμή της όπως και το τετράγωνό της (γραμμή 6). Η ανακύκλωση επιτυγχάνεται από την ετικέτα p: και την εντολή GOTO p. Στη γραμμή 7 ελέγχουμε αν i>1 και σε αυτή την περίπτωση ελαττώνουμε την τιμή του i κατά 1 και συνεχίζουμε την ανακύκλωση. Όταν το i φτάσει να γίνει 1 αποτυγχάνει η συνθήκη στο IF και το πρόγραμμα τελειώνει αφού η εντολή GOTO p δεν εκτελείται.

Τρέχοντας το πρόγραμμα count1.bas παρατηρούμε ότι δεν προλαβαίνουμε να διαβάσουμε τις πρώτες γραμμές που τυπώνουνται (μια και η οθόνη μας έχει λιγότερες από 100 γραμμές, συνήθως). Για να λύσουμε αυτό το πρόβλημα στο πρόγραμμα που ακολουθεί σταματάμε κάθε 10 τυπωμένες γραμμές και περιμένουμε από το χρήστη να πατήσει enter για να συνεχίσουμε.



   1 CLS
   2 i = 100
   3 j = 0
   4 
   5 p:
   6 
   7 IF j = 10 THEN
   8  PRINT "Hit enter"
   9  INPUT x
  10  j = 0
  11 END IF
  12 j = j + 1
  13 
  14 PRINT i, i * i
  15 IF i > 1 THEN
  16  i = i - 1
  17  GOTO p
  18 END IF

Το αρχείο l2/count2.bas


Αυτό το πετυχαίνουμε με μια νέα μεταβλητή j η οποία ξεκινά από το 0 και ανεβαίνει ένα-ένα μέχρι το 10, οπότε και ξαναμηδενίζεται κ.ο.κ. Όποτε η μεταβλητή j έχει την τιμή 10 (IF στη γραμμή 7) ζητάμε από το χρήστη να πατήσει enter και έπειτα μηδενίζουμε το j, αλλιώς το j αυξάνει κατά 1 (γραμμή 12). Στη γραμμή 8 ζητάμε από το χρήστη να πατήσει enter για να συνεχίσει το output στην οθόνη. Στη γραμμή 9 διαβάζουμε μια μεταβλητή x (την οποία ουδέποτε χρησιμοποιούμε) απλά και μόνο για να περιμένει ο υπολογιστής το enter του χρήστη (ο χρήστης δε χρειάζεται να γράψει τίποτε πέρα από το να πατήσει το enter).

Ας δούμε τώρα ένα πολύ πιο εύχρηστο τρόπο υλοποίησης μιας ανακύκλωσης, την εντολή FOR, με την οποία το πρόγραμμα που τυπώνει τους αριθμούς από το 1 έως το 100 (με αύξουσα σειρά) μαζί με τα τετράγωνά τους γίνεται:



   1 CLS
   2 FOR i = 1 TO 100
   3  PRINT i; i * i
   4 NEXT

Το αρχείο l2/for1.bas


ενώ το αντίστοιχο πρόγραμμα όπου οι αριθμοί φθίνουν είναι το



   1 CLS
   2 FOR i = 100 TO 1 STEP -1
   3  PRINT i; i * i
   4 NEXT

Το αρχείο l2/for2.bas


Η ανακύκλωση FOR, η οποία περιλαμβάνει τις εντολές από το FOR έως το αντίστοιχο NEXT (γραμμή 3 μόνο και στα δύο παραπάνω προγράμματα) κάνει τη μεταβλητή δείκτη που χρησιμοποιεί (i στα δύο αυτά προγράμματα) να διατρέξει όλες τις τιμές από την πρώτη τιμή του FOR έως τη δεύτερη. Αν δε δώσουμε το STEP τότε το βήμα είναι 1 (στο πρόγραμμα for1.bas για παράδειγμα) αλλιώς από τη μια εκτέλεση στην επόμενη η τιμή της μεταβλητής αλλάζει κατά όσο λέει το STEP. Για να πετύχουμε τη μεταβλητή να φθίνει κατά 1 θέτουμε το STEP ίσο με -1 στο πρόγραμμα for2.bas.

Άσκηση 24.
Για να υπολογίσουμε το υπόλοιπο της διαίρεσης a/b χρησιμοποιούμε τον τελεστή MOD. Έτσι a MOD b είναι το υπόλοιπο της διαίρεσης a/b, και είναι συνεπώς ένας αριθμός στο εύρος 0, 1, ..., b-1.

Τρέξτε το παρακάτω πρόγραμμα και εξηγείστε τι κάνει.



   1 CLS
   2 FOR i = 100 TO 1 STEP -1
   3  PRINT i; i * i
   4  IF i MOD 10 = 1 THEN
   5   PRINT "Give enter to continue: ";
   6   INPUT x
   7  END IF
   8 NEXT
   9 

Το αρχείο l2/for3.bas



$\surd$

Στο παρακάτω πρόγραμμα tree.bas βλέπουμε επανειλλημένη χρήση της ανακύκλωσης FOR για να «σχεδιάσουμε» στην οθόνη ένα δέντρο με τους χαρακτήρες *.



   1 CLS
   2 DIM i, j, n AS INTEGER
   3 
   4 PRINT "Give n: ";
   5 INPUT n
   6 
   7 ' Loop n times
   8 FOR i = 1 TO n
   9  ' print blanks
  10  FOR j = 1 TO n - i
  11   PRINT " ";
  12  NEXT
  13  ' Print i stars
  14  FOR j = 1 TO 2 * i - 1
  15   PRINT "*";
  16  NEXT
  17  ' Change line
  18  PRINT
  19 NEXT
  20 
  21 FOR i = 1 TO 3
  22  FOR j = 1 TO n - 1
  23   PRINT " ";
  24  NEXT
  25  PRINT "*"
  26 NEXT

Το αρχείο l2/tree.bas


Τρέχοντας π.χ. με input n=10 το πρόγραμμα αυτό παίρνουμε το παρακάτω output.



   1          *
   2         ***
   3        *****
   4       *******
   5      *********
   6     ***********
   7    *************
   8   ***************
   9  *****************
  10 *******************
  11          *
  12          *
  13          *

Το αρχείο l2/tree-output


Ποια νέα στοιχεία βλέπουμε στο πρόγραμμα tree.bas;

Δηλώσεις μεταβλητών
Κατ' αρχήν στη γραμμή 2 του προγράμματος βλέπουμε, για πρώτη φορά, δηλώσεις μεταβλητών, των i, j, n, που δηλώνονται με την εντολή DIM. ως μεταβλητές ακεραίου τύπου (INTEGER). Από δω και πέρα αν επιχειρήσουμε να δώσουμε μια εντολή όπως η n = 1.2 που δεν είναι συμβατή με αυτό το είδος μεταβλητής θα προκληθεί σφάλμα. Οι δηλώσεις μεταβλητών, αν και συνήθως περιττές για τα πολύ απλά προγράμματα σε qbasic (ενώ σε άλλες γλώσσες όπως η Pascal και η C είναι υποχρεωτικές) είναι πολύ καλή τακτική προγραμματισμού γιατί μας προφυλάσσουν από το να κάνουμε εμείς λάθη. Πολλά λάθη του προγραμματιστή «πιάνονται» αν έχουν δηλωθεί οι τύποι των μεταβλητών κατ' αρχήν, χώρια που τα προγράμματα είναι πιο αποτελεσματικά (τρέχουν πιο γρήγορα).

Γραμμές σχολίων
Δεύτερον, βλέπουμε γαι πρώτη φορά γραμμές με σχόλια, αυτές δηλ. που αρχίζουν με το χαρακτήρα ' (single quote), στις γραμμές 7, 9, 13, 17. Οι γραμμές αυτές παίζουν μόνο διακοσμητικό ρόλο μέσα στο πρόγραμμα και ο υπολογιστής τις αγνοεί. Συνεισφέρουν όμως τα μέγιστα στο να είναι ένα πρόγραμμα ευανάγνωστο, και είναι ένας από τους σημαντικότερους κανόνες καλού προγραμματισμού (και σίγουρα αυτός που παραβιάζεται συχνότερα, πάνω στη βιασύνη μας) το να έχει ένα πρόγραμμα αρκετά σχόλια γραμμένα μέσα του. Είναι πολύ συνηθισμένο να διαβάζει κανείς προγράμματα που έχει γράψει ο ίδιος πριν από μερικά χρόνια και, επειδή δεν είχε τότε κάνει τον κόπο να γράψει αρκετά σχόλια μέσα, να μην τα καταλαβαίνει.

Ανακύκλωση μέσα σε ανακύκλωση
Τέλος βλέπουμε για πρώτη φορά μια ανακύκλωση μέσα σε άλλη ανακύκλωση: τα FOR των γραμμών 10 και 14 είναι μέσα στο FOR της γραμμής 8 και το FOR της γραμμής 22 είναι μέσα στο FOR της γραμμής 21. Τυπικά μιλώντας, αυτό δεν είναι ένα νέο στοιχείο της γλώσσας καθώς τίποτα δεν απαγορεύει να βάλουμε μέσα σε ένα FOR ό,τι και όσες εντολές θέλουμε. Είναι όμως η πρώτη φορά που συναντάμε κάτι τέτοιο, και αυτό είναι σημαντικό γιατί το «βάθος» της ανακύκλωσης είναι ένα καλό κριτήριο της δυσκολίας ενός αλγορίθμου. Υπό αυτή την έννοια έχουμε κάνει με το πρόγραμμα tree.bas ένα σημαντικό βήμα μπροστά στην κατεύθυνση πιο περίπλοκων προγραμμάτων.

Λίγα λόγια τώρα για το πώς δουλεύει το πρόγραμμα tree.bas.

Ο χρήστης δίνει ένα ακέραιο n που παριστάνει το ύψος του δέντρου, από το πρώτο επίπεδο φύλλων του έως και την κορυφή. Στις γραμμές 7-19 σχεδιάζεται το φύλλωμα του δέντρου (γραμμές 1-10 στο αρχείο l2/tree-output που φαίνεται παράπάνω) και στις γραμμές 21-26 σχεδιάζεται ο κορμός του δέντρου (γραμμές 11-13 στο στο αρχείο l2/tree-output).

Η μεταβλητή i στο FOR της γραμμήες 8 μετράει τις γραμμές του φυλλώματος με 1η γραμμή την κορυφή και τελευταία την κάτω σειρά του φυλλώματος (γραμμή 10 στο αρχείο l2/tree-output). Το πλήθος αστεριών που ζωγραφίζουμε σε κάθε γραμμή είναι 1, 3, 5, 7, ..., από πάνω προς τα κάτω. Το τύπωμα αυτών των 2*i-1 το πλήθος αστεριών γίνεται στις γραμμές 14-18, με τη γραμμή 18 να είναι υπεύθυνη για την αλλαγή γραμμής και το FOR να τυπώνει τα αστεράκια ένα ένα.

Πριν τυπωθούν τα αστεράκια όμως τυπώνουμε τον κατάλληλο αριθμό από κενούς (λευκούς) χαρακτήρες ώστε τα αστεράκια να τυπώνονται πάντα συμμετρικά ως προς μια κατακόρυφη ευθεία. Ο σωστός αριθμός από κενούς χαρακτήρες για τη γραμμή i είναι n-i και αυτοί τυπώνονται από το FOR των γραμμών 10-12.

Τέλος, στις γραμμές 21-26 τυπώνεται ο κορμός του δέντρου. Αυτός αποτελείται από τρεις πανομοιότυπες γραμμές που η καθεμία έχει n-1 κενούς χαρακτήρες που ακολουθούνται από ένα αστεράκι. Οι κενοί χαρακτήρες τυπώνονται στο FOR των γραμμών 22-24 και το αστεράκι (με ταυτόχρονη αλλαγή γραμμής) τυπώνεται στη γραμμή 25.

Άσκηση 25.
Τροποποιείστε το πρόγραμμα tree.bas ώστε να τυπώνει 5 τέτοια δέντρα, το ένα κάτω από το άλλο. Επίσης να τυπώνει 5 τέτοια δέντρα το ένα δίπλα στο άλλο (δυσκολότερο).
$\surd$

2.3 Πίνακες

Θέλουμε να φτιάξουμε ένα πρόγραμμα που να διαβάζει μια λίστα από αριθμούς από το χρήστη (το μέγεθος της λίστας το καθορίζει επίσης ο χρήστης, πριν δώσει τη λίστα) και να την τυπώσουμε μετά που θα τελειώσει ο χρήστης ανάποδα (πρώτο στοιχείο αυτό που ο χρήστης έδωσε τελευταίο). Αμέσως βλέπουμε ότι για να το καταφέρουμε αυτό θα πρέπει να έχουμε ένα τρόπο να κρατάμε όλα τα στοιχεία της λίστας σε κάποιες μεταβλητές μέχρι να έρθει η ώρα να τα τυπώσουμε. Πώς όμως μπορεί να γίνει αυτό αφού δεν μας είναι γνωστό, τη στιγμή που γράφουμε το πρόγραμμα, το πόσα στοιχεία θα έχει η λίστα που θα δώσει ο χρήστης; Πόσες μεταβλητές θα δηλώσουμε, με τι ονόματα, κλπ;

Αυτά τα προβλήματα λύνει η έννοια του πίνακα, που είναι, με λίγα λόγια, μια μεταβλητή με πολλές θέσεις στις οποίες μπορούμε να αναφερόμαστε με το όνομα της μεταβλητής συνοδευόμενο από ένα αριθμό που καθορίζει το για ποια θέση του πίνακα μιλάμε.

Βλέπουμε παρακάτω ένα πρόγραμμα που κάνει ακριβώς αυτή τη δουλειά.



   1 CLS
   2 
   3 DIM i, n AS INTEGER
   4 
   5 PRINT "How many numbers: "
   6 INPUT n
   7 
   8 DIM a(n) AS INTEGER
   9 
  10 FOR i = 1 TO n
  11  PRINT "Give number No "; i;
  12  INPUT a(i)
  13 NEXT
  14 
  15 PRINT "Your list upside-down: "
  16 FOR i = n TO 1 STEP -1
  17  PRINT a(i)
  18 NEXT

Το αρχείο l2/lrev.bas


Αφού ο χρήστης δώσει το πόσα στοιχεία θα έχει η λίστα του (μεταβλητή n, γραμμή 6) δημιουργείται στη γραμμή 8 ένας πίνακας από n ακεραίους και όνομα a. Τα στοιχεία του πίνακα αυτού είναι οι ακέραιοι

a(1), a(2), ..., a(n-1), a(n).

Με την ανακύκλωση FOR στις γραμμές 10-13 ο χρήστης δίνει n ακεραίους που αποθηκεύονται στις θέσεις αυτές.

Στο FOR των γραμμών 16-18 τυπώνεται η λίστα αυτή ανάποδα (παρατηρείστε ότι ο δείκτης i ξεκινά από το n και κατεβαίνει μέχρι και το 1 μειούμενος σε κάθε ανακύκλωση κατά 1).

Παρατηρείστε ότι σε αυτό το πρόγραμμα έχουμε δηλώσει (με DIM) κάθε μεταβλητή που χρησιμοποιήσαμε. Αυτή η πρακτική είναι μια πολύ καλή τακτική να έχει κανείς και θα την ακολουθούμε από δω και πέρα. Η αξία της φαίνεται βέβαια σε μεγάλα και πολύπλοκα προγράμματα όπου, μεταξύ άλλων, προστατεύει τον ίδιο τον προγραμματιστή από το να χρησιμοποιήσει μια μεταβλητή με διαφορετικό τρόπο από αυτόν που είχε υπόψιν τους όταν τη δήλωνε. Σε πολλές γλώσσες προγραμματισμού μάλιστα (π.χ. Pascal, C) η δήλωση όλων των μεταβλητών είναι υποχρεωτική.

Άσκηση 26.
Γράψτε ένα πρόγραμμα που να διαβάζει από το χρήστη ένα ακέραιο N, και κατόπιν να διαβάζει από το χρήστη δύο λίστες ακεραίων μεγέθους N η κάθε μία. Αφού τελειώσει το input το πρόγραμμα τυπώνει μια λίστα N ακεραίων, κάθε στοιχείο της οποίας είναι το άθροισμα, στις αντίστοιχες θέσεις, των λιστών που έδωσε ο χρήστης.

Χρησιμοποιείστε δύο πίνακες

DIM a(n), b(n) AS INTEGER
και τυπώστε δηλ. όλα τα στοιχεία a(i)+b(i), για i=1 έως i=n.
$\surd$

Άσκηση 27.
Τι υπολογίζει το παρακάτω πρόγραμμα στη μεταβλητή s;



   1 DIM x(10) AS INTEGER
   2 DIM i AS INTEGER
   3 
   4 FOR i=1 TO 10
   5  x(i) = i
   6 NEXT
   7 
   8 s = 0
   9 FOR i=1 TO 10
  10  s = s + x(i)
  11 NEXT
  12 
  13 PRINT s

Το αρχείο l2/for4.bas


Τροποποιείστε το πρόγραμμα αυτό ώστε να υπολογίζει το άθροισμα των τετραγώνων των στοιχείων του πίνακα x.
$\surd$

Άσκηση 28.
Τι υπολογίζει το παρακάτω πρόγραμμα;



   1 DIM i, n AS INTEGER
   2 
   3 CLS
   4 
   5 PRINT "Give an integer: ";
   6 INPUT n
   7 
   8 DIM x(n) AS INTEGER
   9 
  10 x(1)=1
  11 FOR i=2 TO n
  12  x(i) = x(i-1)*i
  13 NEXT
  14 
  15 PRINT x(n)

Το αρχείο l2/for5.bas


Δοκιμάστε να το τρέξετε για διαδοχικές τιμές του n ξεκινώντας από το 4. Τι παρατηρείτε;
$\surd$

Άσκηση 29.
Γράψτε ένα πρόγραμμα που να διαβάζει από το χρήστη ένα ακέραιο N, και κατόπιν να διαβάζει από το χρήστη μια λίστα με N πραγματικούς αριθμούς. Αν οι αριθμοί αυτοί είναι οι

\begin{displaymath}
a_1, a_2, \ldots, a_N
\end{displaymath}

με τη σειρά που τους δίνει ο χρήστης, τότε να τυπώνει το πρόγραμμα τους αριθμούς $b_1, b_2, \ldots, b_N$ που δίνονται από τους τύπους

\begin{displaymath}
b_k = a_1+a_2+\cdots+a_k,   \mbox{για $k=1,2,\ldots,N$}.
\end{displaymath}

Οι αριθμοί αυτοί ονομάζονται μερικά αθροίσματα της $a_i$. Επίσης να τυπώνει τους αριθμούς $c_1, c_2, \ldots, c_N$ που δίνονται από τους τύπους

\begin{displaymath}
c_k = a_k + a_{k+1} + \cdots + a_N,   \mbox{για $k=1,2,\ldots,N$}.
\end{displaymath}

Οι πραγματικοί αριθμοί δηλώνονται ως SINGLE. Π.χ. η δήλωση

DIM x, a(10) AS SINGLE
δηλώνει μια μεταβλητή x που είναι πραγματικός αριθμός και ένα πίνακα a πραγματικών αριθμών με 10 στοιχεία.
$\surd$

Άσκηση 30.
Γράψτε ένα πρόγραμμα που να διαβάζει από το χρήστη μια λίστα με n αριθμούς (το n επίσης το δίνει ο χρήστης πριν δώσει τη λίστα) την οποία αποθηκεύει σε ένα πίνακα a με n θέσεις. Έπειτα αντιστρέφεται η σειρά των στοιχείων στον πίνακα a, χωρίς να χρησιμοποιήσουμε κι άλλο πίνακα. (Ο μόνος πίνακας που θα έχουμε δηλώσει θα είναι ο a.) Τέλος τυπώνονται τα στοιχεία του πίνακα a ώστε να επιβεβαιώσουμε το αποτέλεσμα.
$\surd$

Mihalis Kolountzakis 2013-08-16