Προγραμματισμός: Πως εκτυπώνω το τελευταίο ψηφίο αριθμού, είτε αυτός είναι ακέραιος είτε είναι πραγματικός (how to print the last digit of an integer or a real number)

Μετά από ερώτηση γιου συναδέλφου για μία άσκηση που αόριστα ζητούσε “να συγκριθούν τα τελευταία ψηφία δύο αριθμών” και αφού έφαγα μια αρχική παγωμάρα για την όχι και τόσο εύκολη απάντηση σε ένα τόσο απλό ερώτημα, οι σκέψεις άρχισαν να πηγαινοέρχονται, χορεύοντας ανήσυχα μεταξύ του δεξιού και αριστερού αυτιού μου.
Σημείωση: Η ερώτηση αφορούσε το μάθημα της Γ Λυκείου ‘Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον-ΑΕΠΠ’ και φυσικά απαιτούσε λύση με τη χρήση της ΓΛΩΣΣΑς του σχολικού βιβλίου (που μοιάζει με Pascal στα Ελληνικά). Το μάθημα είχα να το διδάξω δέκα χρόνια ακριβώς (από τότε που ήμουν στο όμορφο Γαλαξίδι – ορεινό Λιδορίκι).

1η Σκέψη: Η λύση απαιτεί να απομονώσουμε το τελευταίο ψηφίο ενός αριθμού και αφού δεν διευκρινίζει αν είναι ακέραιος ή πραγματικός τότε πρέπει να υλοποιηθεί και για τις δύο περιπτώσεις.

Δηλαδή στην περίπτωση του ακέραιου 1024, το τελευταίο ψηφίο είναι προφανώς το 4.

Στην περίπτωση του πραγματικού 3.14159 το τελευταίο ψηφίο είναι προφανώς το 9.

2η Σκέψη: Σκέφτομαι ότι, ο ποιητής της άσκησης μάλλον θα εννοούσε ακεραίους. Με βόλεψε αυτή η σκέψη (είναι αλήθεια…), αφού απλοποιεί αρκετά το πρόβλημα. Βρήκα στη βιβλιοθήκη και άνοιξα το βιβλίο του ΑΕΠΠ για να θυμηθώ τους τελεστές και τις λίγες συναρτήσεις που περιλαμβάνει η ΓΛΩΣΣΑ.  Ο τελεστής MOD μου χαμογέλασε παράξενα (μάλλον έπαιξε ρόλο και λίγο η Java με την οποία ασχολήθηκα τους προηγούμενες μήνες). Ο MOD λοιπόν, υπολογίζει το υπόλοιπο ακέραιας διαίρεσης. Για παράδειγμα 7 MOD 2 = 1 (το 2 χωράει 3 φορές στο 7 και έχουμε υπόλοιπο 1).

Κατσάου!!! (που θα έλεγε και ο κεραυνός Μακουίν στο Cars) και να η διαισθητική λύση εμπρός μου: Θα βρω το τελευταίο ψηφίο ενός (ΔΕΚΑΔΙΚΟΥ) ακεραίου με την πράξη: ακέραιος MOD 10 !!! Δοκιμάζω και όντως επιβεβαιώνω ότι η λύση δουλεύει.

Βρίσκω στο διαδίκτυο (http://spinet.gr/glossomatheia/) το πρόγραμμα ΓλωσσοΜάθεια που υλοποιεί σε παραθυρικό περιβάλλον τη ΓΛΩΣΣΑ (και μάλιστα portable, δηλαδή χωρίς να χρειάζεται εγκατάσταση), το κατεβάζω και το τρέχω. Ιδού το πρόγραμμα για την υλοποίηση της εκτύπωσης του τελευταίου ψηφίου ενός ακεραίου αριθμού στην γλώσσα προγραμματισμού ΓΛΩΣΣΑ:

ΠΡΟΓΡΑΜΜΑ  ΕκτύπωσηΤελευταίουΨηφίουΑκέραιου
 ΜΕΤΑΒΛΗΤΕΣ
 ΑΚΕΡΑΙΕΣ: Α
 ΑΡΧΗ
 ΓΡΑΨΕ 'ΔΩΣΕ ΑΡΙΘΜΟ:'
 ΔΙΑΒΑΣΕ Α
 ΓΡΑΨΕ 'ΤΟ ΤΕΛΕΥΤΑΙΟ ΨΗΦΙΟ ΤΟΥ ',Α,' ΕΙΝΑΙ ΤΟ:', Α MOD 10
 ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

ΟΚ, λοιπόν. Όμως τι γίνεται με τους πραγματικούς αριθμούς οι οποίοι έχουν και δεκαδικά ψηφία; Ξανά οι σκέψεις να κάνουν σκέιτμποαρντ στις πτυχώσεις του εγκεφάλου, χωρίς να φορούν επιγονατίδες και κράνος.

3η Σκέψη: Πρώτα πρέπει να αναγνωρίζω πότε ο χρήστης δίνει ακέραιο και πότε πραγματικό αριθμό. Στην 1η περίπτωση η λύση είναι πιο πάνω, στη δεύτερη το σκέιτμποαρντ συνεχίζεται. Άρα πρέπει να αναγνωρίζω πότε ο  αριθμός που εισάγει κάποιος στο πρόγραμμα είναι ακέραιος ή όχι.
Η λύση είναι μαθηματικά απλή. Αν ο αριθμός χ είναι ίσος με το ακέραιο μέρος του τότε είναι ακέραιος! Και ευτυχώς η ΓΛΩΣΣΑ έχει τη συνάρτηση Α_Μ() που υπολογίζει το ακέραιο μέρος ενός αριθμού.
Παραδείγματα: Για τον πραγματικό αριθμός 19.8 είναι Α_Μ(19.8)=19 ενώ για τον ακέραιο 48 είναι  Α_Μ(48)=48.
ΟΚ. Ας πάρουμε τη περίπτωση που στο πρόγραμμα εισάγουμε τον πραγματικό αριθμό Χ = 3.14159. Με τη χρήση της συνάρτηση  Α_Μ(Χ) <> Χ που έχει αποτέλεσμα  ΑΛΗΘΗΣ διαπιστώνω προγραμματιστικά ότι ο αριθμός είναι πραγματικός. Μετά τι;

4η Σκέψη: Αν μετατρέψω τον πραγματικό σε ακέραιο π.χ. το 3.14159 σε 314159,  τότε μπορώ να χρησιμοποιήσω το παραπάνω πρόγραμμα για να απομονώσω το τελευταίο ψηφίο του. Αυτό γίνεται πολλαπλασιάζοντας οποιονδήποτε πραγματικό αριθμό με το 10 μέχρι να μην έχει πλέον δεκαδικά ψηφία. Το πρόγραμμα για να γίνει αυτό είναι το εξής:

 ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
 Χ<-- Χ*10
 ΜΕΧΡΙΣ_ΟΤΟΥ Α_Μ(Χ)=Χ

Άρα αγαπητέ/ή αναγνώστη/ρια, την βρήκαμαν τη λύση και όλα καλά και ωραία. Ας πάμε να τη δοκιμάσουμε λοιπόν:

ΠΡΟΓΡΑΜΜΑ  ΕκτύπωσηΤελευταίουΨηφίου
 ΜΕΤΑΒΛΗΤΕΣ
 ΠΡΑΓΜΑΤΙΚΕΣ: Χ
 ΑΡΧΗ
 ΓΡΑΨΕ 'ΔΩΣΕ ΑΡΙΘΜΟ:'
 ΔΙΑΒΑΣΕ Χ
 ΑΝ Α_Μ(Χ)=Χ ΤΟΤΕ
   ΓΡΑΨΕ 'ΤΕΛΕΥΤΑΙΟ ΨΗΦΙΟ ΤΟΥ ΕΙΝΑΙ ΤΟ:', Χ MOD 10
 ΑΛΛΙΩΣ
   ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
      Χ <-- Χ*10
   ΜΕΧΡΙΣ_ΟΤΟΥ Α_Μ(Χ)=Χ
   ΓΡΑΨΕ 'ΤΟ ΤΕΛΕΥΤΑΙΟ ΨΗΦΙΟ ΤΟΥ ΕΙΝΑΙ ΤΟ:', Χ MOD 10
 ΤΕΛΟΣ_ΑΝ
 ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Και εμφανίζεται το λάθος “Γραμμή 8 • Ο αριστερός παράγοντας του MOD δεν είναι ακέραιου τύπου.“….

$#%$*&#@$#@$?! και ευτυχώς οι υπόλοιποι της οικογένειας κοιμήθηκαν και δεν άκουσαν τίποτε. Μετά την έκρηξη απόγνωσης, το dead end, το FIN, το άδοξο τέλος έφθασε η απογοήτευση. Ετοίμασα στουπί και πετρέλαιο για τον ΗΥ αλλά ευτυχώς τον έσωσε η οικονομική πολιτική της κυβέρνησης, σύμφωνα με την οποία προέβλεψα ότι δεν θα μπορέσω να ανανεώσω τον ΗΥ μου (πόσο μάλλον να αγοράσω καινούργιο) τουλάχιστον μέχρι το 2018.  Ανέβαλα, έτσι,  την έν-θερμη εκδήλωση αγάπης στον παλιό μου Core2 Duo 8400, που εν τέλει απλά έκανε ότι τον προγραμμάτισα. Οι σκέψεις μου συνέχισαν, κουτσαίνοντας το σκειτμπόαρντ στις έντονα ηλεκτρικά φορτισμένες πτυχώσεις του μυαλού μου, έχοντας αποκτήσει κάμποσες κακώσεις στους αγκώνες τους.

5η σκέψη: Αφού λοιπόν η MOD χρησιμοποιείται μόνο με ακέραιους έπρεπε να παρακάμψω τη χρήση των πραγματικών αριθμών όταν θα ερχόταν η ώρα να την χρησιμοποιήσω. Άρα έπρεπε να μετατρέψω τους πραγματικούς αριθμούς σε ακέραιους. Η ΓΛΩΣΣΑ, ωστόσο, ΔΕΝ ΕΧΕΙ μετατροπή μεταβλητών σε άλλο τύπο. Ή ΜΗΠΩΣ ΕΧΕΙ….?

Μήπως η συνάρτηση για το ακέραιο μέρος Α_Μ() μπορεί να χρησιμοποιηθεί στην περίπτωσή μας  για να μετατρέψουμε πραγματικό σε ακέραιο; Όντως το Α_Μ(12.0) δίνει το 12!!!!!

Κατσάου!!!! για 2η φορά και έτσι αλλάζω το πρόγραμμα ως εξής:

 ΠΡΟΓΡΑΜΜΑ  ΕκτύπωσηΤελευταίουΨηφίου
 ΜΕΤΑΒΛΗΤΕΣ
 ΠΡΑΓΜΑΤΙΚΕΣ: Χ
 ΑΚΕΡΑΙΕΣ: Α
 ΑΡΧΗ
 ΓΡΑΨΕ 'ΔΩΣΕ ΑΡΙΘΜΟ:'
 ΔΙΑΒΑΣΕ Χ
 ΑΝ Α_Μ(Χ)=Χ ΤΟΤΕ
   Α <-- Α_Μ(Χ)
   ΓΡΑΨΕ 'ΤΕΛΕΥΤΑΙΟ ΨΗΦΙΟ ΤΟΥ ΕΙΝΑΙ ΤΟ:', Α MOD 10
 ΑΛΛΙΩΣ
   ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
     Χ <-- Χ*10
   ΜΕΧΡΙΣ_ΟΤΟΥ Α_Μ(Χ)=Χ
   Α <-- Α_Μ(Χ)
   ΓΡΑΨΕ 'ΤΟ ΤΕΛΕΥΤΑΙΟ ΨΗΦΙΟ ΤΟΥ ΕΙΝΑΙ ΤΟ:', Α MOD 10
 ΤΕΛΟΣ_ΑΝ
 ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

Τέλος, κάνοντας και μια μικρή βελτιστοποίηση στον κώδικα καταλήγουμε στο παρακάτω που είναι και η προτεινόμενη λύση μου. Με τις υγείες μας!

 ΠΡΟΓΡΑΜΜΑ  ΕκτύπωσηΤελευταίουΨηφίουΑκέραιουΉΠραγματικούΑριθμού
 ΜΕΤΑΒΛΗΤΕΣ
 ΑΚΕΡΑΙΕΣ: Α
 ΠΡΑΓΜΑΤΙΚΕΣ: Χ
 ΑΡΧΗ
 ΓΡΑΨΕ 'ΔΩΣΕ ΑΡΙΘΜΟ:'
 ΔΙΑΒΑΣΕ Χ
 ΑΝ Α_Μ(Χ) <> Χ ΤΟΤΕ
    ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
      Χ <-- Χ*10
    ΜΕΧΡΙΣ_ΟΤΟΥ Α_Μ(Χ)=Χ
 ΤΕΛΟΣ_ΑΝ
 Α <-- Α_Μ(Χ)
 ΓΡΑΨΕ 'ΤΟ ΤΕΛΕΥΤΑΙΟ ΨΗΦΙΟ ΤΟΥ ΕΙΝΑΙ ΤΟ:', Α MOD 10
 ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ

 

Υ.Γ. Αν και έβαλα εσοχές στον κώδικα, το wordpress τις έβγαλε μόνο του. Μάλλον πρέπει να βάλω κάποιο πρόσθετο -plugin για μην βάζει χέρι αυτόματα στον html κώδικα.

Υ.Γ.2. Τα αγγλικά στον τίτλο είναι για να θυμηθώ να προσθέσω τη λύση και σε κάποια κλασσική γλώσσα όπως η Pascal ή απλά να παραθέσω τη λύση περιγραφικά στα αγγλικά, αλλά τώρα είναι ώρα για ύπνο…

Permanent link to this article: https://nikmavr.sites.sch.gr/%cf%80%cf%81%ce%bf%ce%b3%cf%81%ce%b1%ce%bc%ce%bc%ce%b1%cf%84%ce%b9%cf%83%ce%bc%cf%8c%cf%82-%cf%80%cf%89%cf%82-%ce%b5%ce%ba%cf%84%cf%85%cf%80%cf%8e%ce%bd%cf%89-%cf%84%ce%bf-%cf%84%ce%b5%ce%bb%ce%b5/

6 comments

Skip to comment form

    • jalexak on 30/04/2014 at 13:34
    • Reply

    Φίλε άσε τους υπολογιστές και γίνε μυθιστορηματογράφος (καλάου για τη λέξη που βρήκα)

    • jalexak on 30/04/2014 at 13:37
    • Reply

    Βάλε και κανένα like & share στην (όπως θα ‘λεγες και ‘συ) βιβλιόφατσα

  1. ρε νικολάκη δε θα γεράσεις ποτέ… χαρά στο κουράγιο σου. Ευχές στην οικογένεια

  2. Πάνο και Γιώργο ευχαριστώ για τα σχόλιά σας! Χαιρετίσματα στις οικογένειές σας.

    • Αντωνης on 22/02/2022 at 22:04
    • Reply

    Αμα δεν μπορουμε να κανουμε με επαναληψη και μονο με εμφωλευμενο αν τι θα κανουμε αν ζηταει να βρουμε τον δεκαδικο ενως πραγματικου αριθμου οπως το 3.14 αυτο που θελουμε να βρουμε ειναι το 14 .Σε αλγόριθμο πως το κανουμε αυτο

    1. Αντώνη δες το παρακάτω (κάνε κλικ πάνω στην παρακάτω εικόνα για να μεγαλώσει):

Leave a Reply

Your email address will not be published.

The maximum upload file size: 100 MB. You can upload: image, audio, video, document, spreadsheet, interactive, text, archive, code, other. Links to YouTube, Facebook, Twitter and other services inserted in the comment text will be automatically embedded. Drop file here

This site uses Akismet to reduce spam. Learn how your comment data is processed.