Subsections

1 Διάλεξη Πρώτη - 25 Νοεμβρίου 2011

1.1 Το πρόγραμμα square.bas για υπολογισμό του τετραγώνου ενός αριθμού



   1 CLS
   2 PRINT "Hello."
   3 PRINT "Give me a number: "
   4 INPUT x
   5 PRINT "The square of the number is "; x * x

Το αρχείο l1/square.bas


Ένα πρόγραμμα στη γλώσσα BASIC και στις περισσότερες άλλες γλώσσες προγραμματισμού είναι μια ακολουθία από εντολές οι οποίες εκτελούνται από τον υπολογιστή η μια μετά την άλλη. Στο πρόγραμμα sq.bas που φαίνεται παραπάνω υπάρχουν 5 εντολές, μια σε κάθε γραμμή (οι αριθμοί μπροστά από τις γραμμές δεν υπάρχουν πραγματικά στο πρόγραμμα αλλά τις έχουμε βάλει μέσα για να μπορούμε να αναφερόμαστε στις γραμμές με κάποιο τρόπο).

Η εντολή CLS καθαρίζει την οθόνη του υπολογιστή και τη χρησιμοποιούμε ως πρώτη εντολή σχεδόν σε κάθε πρόγραμμα από αυτά που θα γράψουμε. Στις γραμμές 2 και 3 η εντολή PRINT τυπώνει στην οθόνη το μήνυμα που ακολουθεί εντός εισαγωγικών. Τα δύο αυτά μηνύματα προτρέπουν το χρήστη του προγράμματος να δώσει ένα αριθμό (πληκτρολογώντας τον στο πληκτρολόγιο). Ο αριθμός αυτός διαβάζεται από τον υπολογιστή στην επόμενη εντολή INPUT x, και τοποθετείται στη μεταβλητή x.

Η έννοια της μεταβλητής είναι κεντρική στον προγραμματισμό. Μπορούμε να φανταζόμαστε μια μεταβλητή ως ένα κουτί που έχει ένα όνομα (x στην περίπτωση αυτή) και κάποια περιεχόμενα. Μετά την εκτέλεση της εντολής της γραμμής 4 τα περιεχόμενα του κουτιού x είναι ο αριθμός που έδωσε ο χρήστης.

Τέλος στη γραμμή 5 εκτυπώνεται στην οθόνη το τετράγωνο του αριθμού που έδωσε ο χρήστης, το οποίo υπολογίζεται από την έκφραση x*x. Η χρήση της εντολής PRINT εδώ είναι λίγο διαφορετική απ' ό,τι στις γραμμές 2 και 3. Η βασική διαφορά είναι ότι εδώ η PRINT έχει δύο ορίσματα, της δίνουμε δηλ. δύο πράγματα να τυπώσει στην οθόνη. Το πρώτο είναι το κείμενο "The square of the number is " και το δεύτερο είναι η αριθμητική έκφραση x*x. Τα δύο αυτά ορίσματα διαχωρίζονται από το σύμβολο ; (semicolon ή ελληνικό ερωτηματικό).

Στο πρόγραμμα αυτό υπάρχουν κάποιες λέξεις που είναι δεσμευμένες από την BASIC. Αυτές οι λέξεις έχουν ειδικό νόημα για τη γλώσσα και δεν επιτρέπεται να τις χρησιμοποιήσουμε αλλιώς, π.χ. ως ονόματα μεταβλητών. Οι δεσμευμένες λέξεις που εμφανίζονται στο πρόγραμμα αυτό είναι οι CLS, PRINT, INPUT. Αυτές είναι εντολές (για καθάρισμα οθόνης, γράψιμο στην οθόνη και διάβασμα από το πληκτρολόγιο αντίστοιχα).

Άσκηση 1.
Αλλάξτε την γραμμή 5 σε:

PRINT "The square of "; x; " is "; x*x
Τι κάνει τώρα το πρόγραμμα;
$\surd$

Άσκηση 2.
Τρέξτε το πρόγραμμα square.bas και αντί να δώσετε ένα αριθμό (αφού η υπολογιστής σας τυπώσει στην οθόνη το ερωτηματικό ? που σημαίνει ότι περιμένει από το χρήστη να του δώσει κάποια δεδομένα) δώσετε ένα τυχαίο κείμενο, π.χ. sdkfhsl;kf. Πώς συμπεριφέρεται το πρόγραμμα; Γιατί το κάνει αυτό; Τι περιμένει από το χρήστη;
$\surd$

1.2 Το πρόγραμμα sum.bas για υπολογισμό του αθροίσματος δύο αριθμών



   1 CLS
   2 PRINT "Give me the first number:"
   3 INPUT x
   4 PRINT "Now, give me the second:"
   5 INPUT y
   6 PRINT "The sum is "; x + y

Το αρχείο l1/sum.bas


Το πρόγραμμα sum.bas διαβάζει δύο αριθμούς από το χρήστη, στις γραμμές 3 και 5, αφού προηγουμένως τυπώσει, στις γραμμές 2 και 4, αντίστοιχα μηνύματα προτροπής προς το χρήστη. Οι δύο ποσότητες που δίνει χρήστης αποθηκεύονται (καταχωρούνται) στις δύο αριθμητικές μεταβλητές x και y.

Τέλος, στη γραμμή 5 τυπώνεται το άθροισμα x+y των δύο αυτών αριθμών μετά από το επεξηγηματικό μήνυμα "The sum is ".

Άσκηση 3.
Γράψτε μια παραλλαγή του προγράμματος sum.bas που υπολογίζει τη διαφορά δύο αριθμών.
$\surd$

Άσκηση 4.
Γράψτε μια παραλλαγή του προγράμματος sum.bas που υπολογίζει το άθροισμα τριών αριθμών.
$\surd$

Μια παραλαγή του προγράμματος sum.bas, που κάνει ακριβώς την ίδια δουλειά, φαίνεται στο αρχείο sum2.bas.



   1 CLS
   2 PRINT "Give me the first number:"
   3 INPUT x
   4 PRINT "Now, give me the second:"
   5 INPUT y
   6 z = x + y
   7 PRINT "The sum is "; z

Το αρχείο l1/sum2.bas


Η διαφορά με προηγουμένως είναι ότι τώρα, στη γραμμή 6, το άθροισμα των δύο μεταβλητών x και y υπολογίζεται και αποθηκεύεται σε μια τρίτη μεταβλητή, τη z, τα περιεχόμενα της οποίας εν συνεχεία τυπώνονται στη γραμμή 7.

Η πράξη που γίνεται στη γραμμή 6 ονομάζεται μια εντολή εκχώρησης και ο υπολογιστής την εκτελεί ως εξής: πρώτα υπολογίζεται το δεξί μέλος (στην περίπτωσή μας το άθροισμα x+y) και έπειτα το αποτέλεσμα αποθηκεύεται στη μεταβλητή που φαίνεται στο αριστερό μέλος, στην περίπτωσή μας στη μεταβλητή z.

Είναι πολύ σημαντικό να θυμόμαστε ότι μια εντολή όπως η z = x+y ερμηνεύεται ακριβώς όπως είπαμε πιο πάνω. Έτσι φαίνεται ότι κάτι φαινομενικά αντιφατικό, όπως η εντολή εκχώρησης

x=x+1,
έχει στην πραγματικότητα ένα πολύ συγκεκριμένο νόημα: υπολόγισε την ποσότητα x+1 και βάλε το αποτέλεσμα στη μεταβλητή x, καταστρέφοντας έτσι τα προηγούμενά της περιεχόμενα. Με άλλα λόγια, με αυτή την εντολή πετυχαίνουμε το να αυξήσουμε την τιμή της μεταβλητής x κατά 1.

Άσκηση 5.
Τρέξτε το ακόλουθο πρόγραμμα



   1 CLS
   2 PRINT "Give me the first number:"
   3 INPUT x
   4 PRINT "Now, give me the second:"
   5 INPUT y
   6 x = x + y
   7 PRINT "The sum is "; x

Το αρχείο l1/sum3.bas


και εξηγείστε γιατί κάνει ακριβώς την ίδια δουλειά με τα προγράμματα sum.bas και sum2.bas.
$\surd$

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



   1 CLS
   2 PRINT "Give me the first number:"
   3 INPUT x
   4 PRINT "Now, give me the second:"
   5 INPUT y
   6 x = x + y
   7 x = x + y
   8 PRINT "The sum is "; x

Το αρχείο l1/sum4.bas



$\surd$

Άσκηση 7.
Τι κάνει το παρακάτω πρόγραμμα;



   1 CLS
   2 PRINT "Give me two numbers: ";
   3 INPUT x, y
   4 z = x
   5 x = y
   6 y = z
   7 PRINT "Here they are: "; x; y

Το αρχείο l1/quest1.bas


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

Όταν σας ζητάει δύο αριθμούς δώστε τους στην ίδια γραμμή, χωρισμένους με κόμμα.
$\surd$

1.3 Εντολές υπό συνθήκη IF ...



   1 CLS
   2 PRINT "Give me a number: ";
   3 INPUT x
   4 IF x >= 0 THEN
   5  PRINT SQR(x)
   6 ELSE
   7  PRINT "OK, it is: "; SQR(-x)
   8 END IF

Το αρχείο l1/sqroot.bas


Το πρόγραμμα αυτό υπολογίζει την τετραγωνική ρίζα ενός αριθμού. Αφού ζητήσει και πάρει από το χρήστη ένα αριθμό x (στις γραμμές 2 και 3) στις γραμμές 4-8 τυπώνει την τετραγωνική ρίζα του x, εάν αυτός είναι μη αρνητικός αριθμός, αλλιώς τυπώνει την τετραγωνική ρίζα του -x.

Ο υπολογισμός της τετραγωνικής ρίζας ενός αριθμού γίνεται με τη συνάρτηση SQR(x). Πρόκειται για ένα έτοιμο πρόγραμμα που υπάρχει στη βιβλιοθήκη της qbasic και το οποίο, όταν του περάσουμε ένα όρισμα υπολογίζει και μας επιστρέφει ως τιμή την τετραγωνική ρίζα του ορίσματος αυτού. Ως προγραμματιστές δε χρειάζεται να μας απασχολήσει λοιπόν το πώς λειτουργεί αυτό το υποπρόγραμμα (συνάρτηση βιβλιοθήκης), πράγμα που είναι και αρκετά περίπλοκο για το συγκεκριμένο υποπρόγραμμα, αλλά μόνο το με ποιο τρόπο μπορούμε να χρησιμοποιήσουμε το υποπρόγραμμα αυτό, με ποιο τρόπο δηλ. μπορούμε να «καλέσουμε» αυτή τη συνάρτηση βιβλιοθήκης (τι όρισμα της περνάμε) και τι μας επιστρέφει.

Το δεύτερο νέο στοιχείο του προγράμματος αυτού είναι η σύνθετη εντολή IF ... THEN ... ELSE ... END IF που βλέπουμε στις γραμμές 4-8. Πρόκειται για εντολές που εκτελούνται υπό συνθήκη. Η συνθήκη είναι ο έλεγχος x >= 0. Αν ο έλεγχος της συνθήκης αυτής αποβεί αληθής τότε εκτελείται το κομμάτι του IF ανάμεσα στο THEN και το ELSE. Αν η συνθήκη δεν ισχύει τότε εκτελείται το κομμάτι του IF ανάμεσα στο ELSE και το END IF.

Έτσι πετυχαίνουμε να εκτελείται ένα διαφορετικό κομμάτι του προγράμματος ανάλογα με το τι ισχύει.

Παρατήρηση 1.1   Ανάμεσα στο THEN και το ELSE όπως και ανάμεσα στο ELSE και το END IF μπορεί κανείς να βάλει παραπάνω από μια εντολή, ακόμη και πολύ πολύπλοκες ομάδες εντολών.

Στο πρόγραμμα sqroot.bas, για παράδειγμα, θα μπορούσε κανείς να γράψει το κομμάτι ανάμεσα στις γραμμές 6 και 8 ως εξής:

ELSE
 PRINT "Negative numbers do not have a square root"
 PRINT "Here is the root of the negative of your number: "; SQR(-x)
END IF

Άσκηση 8.
Στο παρακάτω πρόγραμμα βλέπουμε μια μορφή του IF χωρίς το κομμάτι ELSE.



   1 CLS
   2 PRINT "Give me a number: ";
   3 INPUT x
   4 
   5 IF x <= 0 THEN
   6  x = -x
   7 END IF
   8 
   9 PRINT "The square root is: "; SQR(x)

Το αρχείο l1/sqroot3.bas


Εξηγείστε γιατί το πρόγραμμα αυτό κάνει την ίδια δουλειά με το πρόγραμμα sqroot.bas.
$\surd$

Άσκηση 9.
Τροποποιείστε το πρόγραμμα sqroot.bas ώστε στην περίπτωση που ο χρήστης δώσει αρνητικό αριθμό το πρόγραμμα να τυπώνει το μήνυμα "Negative numbers have no square root" και να μην τυπώνει τη ρίζα του αντιθέτου του αριθμού.
$\surd$

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

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

Άσκηση 12.
Γράψτε ένα πρόγραμμα που να διαβάζει από το χρήστη τρεις αριθμούς $a, b, c$ και να τυπώνει το πόσες και ποιες ρίζες έχει η εξίσωση

\begin{displaymath}
ax^2+bx+c=0.
\end{displaymath}


$\surd$

1.4 Ανακύκλωση με goto

Στο πρόγραμμα sqroot2.bas που φαίνεται παρακάτω έχουμε τροποποιήσει το πρόγραμμα sqroot.bas ώστε να εκτελείται διαρκώς: ζητάει συνεχώς άπό το χρήστη ένα αριθμό και του τυπώνει την τετραγωνική ρίζα του αριθμού αυτού ή του αντιθέτου του (αν είναι αρνητικός), και ξανά από την αρχή χωρίς ποτέ να σταματά. Όταν θέλουμε να σταματήσουμε το πρόγραμμα αυτό που έχει πέσει, όπως λέμε, σε ατελείωτο loop, πατάμε Control-C (ταχυτόχρονα να πλήκτρα control και c) στον υπολογιστή ώστε να το σταματήσουμε «δια της βίας».



   1 CLS
   2 
   3 startagain:
   4 
   5 PRINT "Give me a number: ";
   6 INPUT x
   7 
   8 IF x >= 0 THEN
   9  PRINT SQR(x)
  10 ELSE
  11  PRINT "OK, it is: "; SQR(-x)
  12 END IF
  13 
  14 GOTO startagain

Το αρχείο l1/sqroot2.bas


Η ανακύκλωση αυτή επιτυγχάνεται από το δίδυμο των γραμμών 3 και 14. Στη γραμμή 3 βλέπουμε μια ετικέτα (label) με το όνομα startagain. Το συντακτικό της qbasic απαιτεί το όνομα μιας ετικέτας να ακολουθείτα πάντα από το σύμβολο : (colon, άνω-κάτω τελεία).

Αντίθετα με εντολές της γλώσσας όπως η CLS, η PRINT ή η IF ... η ύπαρξη μιας ετικέτας σ' ένα πρόγραμμα δε συνεπάγεται κάποια ενέργεια εκ μέρους του υπολογιστή ή κάποια αλλαγή στην πορεία εκτέλεσης του προγράμματος. Μια ετικέτα παίζει απλά το ρόλο ενός τοπωνυμίου. Είναι το όνομα που εμείς διαλέξαμε (θα μπορούσε να είναι οτιδήποτε) για αυτή τη θέση του προγράμματος, ανάμεσα δηλ. στις εντολές CLS και PRINT.

Η εντολή GOTO startagain αντίθετα κάνει τον έλεγχο του προγράμματος να μεταπηδήσει στη θέση της ετικέτας startagain, κάνοντας έτσι το πρόγραμμα να ξαναρχίσει μόλις έχει τελειώσει.

Άσκηση 13.
Μετακινείστε στο πρόγραμμα sqroot2.bas την εντολή CLS ακριβώς κάτω από την ετικέτα startagain, ώστε η ετικέτα να είναι στην πρώτη γραμμή του προγράμματος, και τρέξτε το πρόγραμμα. Τι παρατηρείτε; Γιατί συμβαίνει;
$\surd$

Άσκηση 14.
Μετακινώντας κατάλληλα την εντολή GOTO startagain κάπου μέσα στο IF .. THEN .. ELSE .. END IF κάνετε το πρόγραμμα να ανακυκλώνει μόνο αν ο αριθμός πού έχει δώσει ο χρήστης είναι μη αρνητικός. Αν δηλ. ο χρήστης δώσει αρνητικό αριθμό τότε, αφού τυπωθεί η ρίζα του αντιθέτου, να μην ξαναζητά το πρόγραμμα άλλον αριθμό αλλά να τελειώνει. Αντίθετα αν ο αριθμός που δώσει ο χρήστης είναι μη αρνητικός τότε το πρόγραμμα να τυπώνει την τετραγωνική του ρίζα και να ξαναρχίζει από την αρχή.
$\surd$

Στο επόμενο πρόγραμμα repeat.bas χρησιμοποιούμε ανακύκλωση για να υπολογίσουμε το άθροισμα κάποιων αριθμών που δίνει ο χρήστης, χωρίς να ξέρουμε εκ των προτέρων το πλήθος τους. Απλά αναγνωρίζουμε το πότε ο χρήστης δε θέλει να δώσει άλλους αριθμούς κάνοντας με αυτόν τη σύμβαση ότι όταν δώσει τον αριθμό 0 τότε θα σταματάμε να ζητάμε άλλους αριθμούς και θα τυπώνουμε το άθροισμα των αριθμών που έχει δώσει μέχρι τώρα.



   1 CLS
   2 s = 0
   3 
   4 label1:
   5 
   6 PRINT "Give me a number. Zero to finish.";
   7 
   8 INPUT x
   9 IF x <> 0 THEN
  10  s = s + x
  11  GOTO label1
  12 ELSE
  13  PRINT "Total: "; s
  14 END IF

Το αρχείο l1/repeat.bas


Στη μεταβλητή s, που παίρνει αρχική τιμή 0 στη γραμμή 2, κρατάμε το τρέχον άθροισμα: κάθε ένας αριθμός που μας έρχεται από το χρήστη (γραμμή 8) προστίθεται στο s (το οποίο αυξάνει αντίστοιχα) στην εντολή εκχώρησης

s = s+x
στη γραμμή 10. (Θυμηθείτε ότι πρώτα υπολογίζεται το δεξί μέλος και το αποτέλεσμα αποθηκεύεται στη μεταβλητή που αναφέρεται στο αριστερό μέλος.)

Η ανακύκλωση αρχίζει στην ετικέτα label1: (γραμμή 4) όπου το πρόγραμμα στέλνεται από το GOTO της γραμμής 11.

Αφού ο χρήστης δώσει τον αριθμό του ελέγχουμε (γραμμή 9) αν αυτός είναι διάφορος του 0 (x <> 0). Αν αυτό ισχύει τότε αυξάνουμε το s με την τιμή του x και πηδάμε στην ετικέτα label1: ώστε να διαβάσουμε κι άλλο αριθμό, να ελέγξουμε και πάλι αν είναι 0 ή όχι, κ.ο.κ.

Αν στη γραμμή 9 διαπιστωσουμε ότι ο χρήστης έδωσε 0 τότε πηγαίνουμε στο ELSE του IF και τυπώνουμε το συνολικό άθροισμα που έχουμε μέχρι εκείνη τη στιγμή. Σε αυτή την περίπτωση το GOTO δεν εκτελείται και το πρόγραμμα τελειώνει.

Άσκηση 15.
Τροποποιείστε το πρόγραμμα repeat.bas ώστε στο τέλος να τυπώνει όχι μόνο το άθροισμα των αριθμών που δόθηκαν αλλά και το πλήθος τους, χωρίς να μετράμε το τελευταίο μηδενικό που δίνει ο χρήστης για να τελειώσει.

Χρησιμοποιείστε μια ακόμη μεταβλητή, ας πούμε n, την οποία τη θέτετε αρχικά ίση με το 0 και κάθε φορά που διαβάζετε έναν αριθμό την αυξάνετε κατά 1.
$\surd$

Άσκηση 16.
Τροποποιείστε το πρόγραμμα repeat.bas ώστε να σταματάει την άθροιση όχι όταν ο χρήστης δώσει 0 αλλά όταν το τρέχον άθροισμα s γίνει μεγαλύτερο του 10.
$\surd$

Άσκηση 17.
Φτιάξτε ένα πρόγραμμα που τυπώνει όλους τους ακεραίους από το 1 έως το 100, μαζί με τα τετράγωνά τους.
$\surd$

Άσκηση 18.
Φτιάξτε ένα πρόγραμμα που τυπώνει όλους τους ακεραίους από το 100 έως το 1, με φθίνουσα σειρά.
$\surd$

Άσκηση 19.
Φτιάξτε ένα πρόγραμμα που τυπώνει όλους τους άρτιους ακεραίους από το 1 έως το 100.
$\surd$

Άσκηση 20.
Φτιάξτε ένα πρόγραμμα που διαβάζει από το χρήστη ένα ακέραιο αριθμό n και τυπώνει όλους τους αριθμούς από το 1 έως το n.
$\surd$

Mihalis Kolountzakis 2013-08-16