Τετάρτη 7 Μαΐου 2014

Περιορισμός στο Προγραμματισμό!

Στο Ασκησιολόγιο του Νικολαΐδη (SpiNet) έχω αναρτήσει μερικά προγράμματα για κάθε ενδιαφερόμενο. Εδώ παραθέτω ένα. Ο χρωματισμός έχει γίνει αυτόματα από τη σελίδα του SpiNet. Εκεί έχω το όνομα χρήστη Bugman.
Η γλώσσα του σχολείου είναι απλή και σκοπό έχει να μάθει το μαθητή αλγόριθμους, δηλαδή μια σειρά εντολών που σε πεπερασμένο χρόνο δίνουν μια εξαγωγή για δοσμένη εισαγωγή δεδομένων. Με άλλα λόγια ασχολούνται το πολύ με πίνακες αριθμών. Εδώ το πρόγραμμα παίρνει δυο ακέραιους και τους διαιρεί με τον αριθμό δεκαδικών που έχουμε σε σταθερά γράψει και δεν αλλάζει κατά τη διάρκεια εκτέλεσης. Δίνεται μαζί και μια βοηθητική συνάρτηση όπου επιστρέφει το πρόσημο ενός αριθμού ως μονάδα με πρόσημο και για το μηδέν δίνει το μηδέν (κατατάσσεται στις συναρτήσεις χρήστη, σε αυτή τη γλώσσα, σε όλες τις άλλες αυτή η συνάρτηση είναι ενσωματωμένη).

Η γλώσσα έχει εδώ την Α_Τ() συνάρτηση που σημαίνει ακέραια τιμή. Μερικές γλώσσες όταν διαβάζουν ακέραιο λογαριάζουν μόνο την εισαγωγή χαρακτήρων που κάνουν ένα ακέραιο..και έτσι μεταβιβάζουν το πρόβλημα της σωστής εισαγωγής στοιχείων στον χρήστη. Άλλες γλώσσες το πλεόνασμα το πετάνε! Δηλαδή διαβάζουν ό,τι εισαγωγή δώσει ο χρήστης και από αυτήν βγάζουν ένα αποτέλεσμα. Ουσιαστικά ο περιορισμός υφίσταται στη γλώσσα και απλά εδώ συζητάμε για το χειρισμό. Γιατί όμως να έχει η γλώσσα περιορισμούς, και αφού μιλάμε για τον χειρσμό, άρα μιλάμε για τον προγραμματισμό, αυτό δηλαδή που δίνει εκείνο που θα χειριστούμε;

Το πρόβλημα είναι ότι κάθε μεταβλητή έχει περιορισμό σε μέγεθος άρα και στο τι τελικά θα καταχωρηθεί. Όταν κάνουμε μια διαίρεση και πρέπει να βάλουμε το αποτέλεσμα κάπου θα περιοριστούν τα τυχόν δεκαδικά σε αυτά που χωράνε. Όμως αυτό δεν σημαίνει ότι περιοριζόμαστε από το μέγεθος των μεταβλητών. Το πρόγραμμα παρακάτω αυτό δείχνει. Κάνει διαίρεση με όσα δεκαδικά θέλουμε...αλλά δεν τα γράφει σε μεταβλητή αλλά στην οθόνη, όπου δεν υπάρχει περιορισμός, μάλιστα θα μπορούσε κανείς να σταματάει να διαβάζουμε και να συνεχίζει τη διαίρεση...μέχρι τον αριθμό των δεκαδικών που θα έχουμε δώσει. Αν δεν δώσουμε, τότε δεν έχουμε πρόγραμμα αλλά ένα μποτιλιάρισμα που για να διακοπεί πρέπει να καταρρεύσουμε το σύστημα...(επιμένω ότι η Μ2000 είναι πιο ωραία γλώσσα)

ΠΡΟΓΡΑΜΜΑ διαιρεση
ΣΤΑΘΕΡΕΣ
  ΑΡΙΘΜΟΣ_ΔΕΚΑΔΙΚΩΝ=12
ΜΕΤΑΒΛΗΤΕΣ
  ΑΚΕΡΑΙΕΣ: Α,Β, ΘΕΣΗ
  ΑΚΕΡΑΙΕΣ: ΑΡΧΙΚΟ_Α, ΑΡΧΙΚΟ_Β
  ΧΑΡΑΚΤΗΡΕΣ: Π[3], ΑΠ

ΑΡΧΗ
   ! Πινακας Π μετατροπής προσήμου σε χαρακτήρα
  Π[1] <-- '-'
   ! στο μηδέν λέμε πρόσημο (+) στην εμφάνιση
   ! διότι μας ενδιαφέρει τα +/-, το μηδέν θα φανεί!
  Π[2] <-- '+'
  Π[3] <-- '+'
  ΓΡΑΨΕ '---------------ΕΠΙΔΕΙΞΗ ΔΙΑΙΡΕΣΗΣ-----------'
  ΓΡΑΨΕ 'ΔΩΣΕ ΑΚΕΡΑΙΟ ΩΣ ΔΙΑΙΡΕΤΕΟ'
  ΔΙΑΒΑΣΕ Α
  ΑΡΧΙΚΟ_Α <-- Α

  ΓΡΑΨΕ 'ΔΩΣΕ ΑΚΕΡΑΙΟ ΩΣ ΔΙΑΙΡΕΤΗ'
  ΔΙΑΒΑΣΕ Β
  ΑΡΧΙΚΟ_Β <-- Β
  ΓΡΑΨΕ 'ΠΡΟΣΗΜΟ ΑΠΟΤΕΛΕΣΜΑΤΟΣ=', Π[ΠΡΟΣΗΜΟ(Α)*ΠΡΟΣΗΜΟ(Β)+2]
  Α <-- Α_Τ(Α)
  Β <-- Α_Τ(Β)
   ! Η εξαγωγή της ΠΡΟΣΗΜΟ() μας δίνει τρια πιθανά αποτελέσματα
   ! και εδώ χρησιμοποιούμε το ένα, αν και με ένα Β=0 θα είχαμε το ίδιο αποτέλεσμα

  ΑΝ ΠΡΟΣΗΜΟ(Β)=0 ΤΟΤΕ
    ΓΡΑΨΕ 'ΔΙΑΙΡΕΣΗ ΜΕ ΤΟ ΜΗΔΕΝ - ΛΑΘΟΣ'
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ 'ΔΙΑΙΡΕΣΗ=', (Α DIV Β)
    ΓΡΑΨΕ 'ΥΠΟΛΟΙΠΟ=', (Α MOD Β)
    ΓΡΑΨΕ 'ΥΠΟΛΟΓΙΣΜΟΣ ΔΕΚΑΔΙΚΩΝ'
    ΘΕΣΗ <-- 0
    Α <-- (Α MOD Β)
    ΟΣΟ  (ΘΕΣΗ <  ΑΡΙΘΜΟΣ_ΔΕΚΑΔΙΚΩΝ ) ΚΑΙ (Α>0)  ΕΠΑΝΑΛΑΒΕ
      ΘΕΣΗ <-- ΘΕΣΗ+1
      Α <-- Α*10
      ΓΡΑΨΕ (Α DIV Β)
      Α <-- (Α MOD Β)
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ 'ΕΠΑΛΗΘΕΥΣΗ:', ΑΡΧΙΚΟ_Α/ΑΡΧΙΚΟ_Β
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

   ! Στην BASIC υπάρχει η SGN() που δουλεύει ακριβώς όπως η ΠΡΟΣΗΜΟ()
   ! Η διαφορά είναι ότι σε επιστημονικούς υπολογισμούς μπορεί κανεις
   ! να κάνει έτσι την ΠΡΟΣΗΜΟ ώστε σε ένα μικρό διάστημα γύρω από το μηδέν
   ! να δίνει μηδέν π.χ. ( ΑΝ -.00000000000000005<ΑΛΦΑ<.00000000000000005 ΤΟΤΕ ΑΛΦΑ=0)
   ! Στους αυτοματισμούς το λέμε DEAD ZONE:
   ! όσο αυξάνουμε τη νεκρή περιοχή τόσο αναίσθητο κάνουμε το σύστημα!!!!

ΣΥΝΑΡΤΗΣΗ ΠΡΟΣΗΜΟ(ΑΛΦΑ):ΑΚΕΡΑΙΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ:  ΑΛΦΑ
ΑΡΧΗ
  ΑΝ ΑΛΦΑ=0 ΤΟΤΕ
    ΠΡΟΣΗΜΟ <-- 0
  ΑΛΛΙΩΣ_ΑΝ ΑΛΦΑ>0 ΤΟΤΕ
    ΠΡΟΣΗΜΟ <-- 1
  ΑΛΛΙΩΣ
    ΠΡΟΣΗΜΟ <-- -1
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.