Κοινοποίησε

Αξιολόγηση Χρήστη: 5 / 5

Αστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια Ενεργά
 

Στους τοπογράφους μηχανικούς είναι σίγουρο ότι κάποια στιγμή θα χρειαστεί η κατασκευή κώδικα αριθμητικής επεξεργασίας δεδομένων ή επίλυσης κάποιου προβλήματος; Η γλώσσα προγραμματισμού python είναι ένα από τα εργαλεία που μπορούν να χρησιμοποιηθούν. Ξεκινάμε με τα βασικά: ο σχολιασμός κώδικα και η εισαγωγή δεδομένων.

Python σχόλια - εισαγωγή δεδομένων

Γιατί χρειάζεται ο σχολιασμός του κώδικα;

  • η τοποθέτηση σχολίων εντός του κώδικα python ξεκινάει με το σύμβολο # (καγκελάκι)
  • μετά το # μπορούμε να γράψουμε τον σχολιασμό μας
  • ο σχολιασμός μπορεί να τοποθετηθεί σε μία ή περισσότερες γραμμές
  • κάθε γραμμή πρέπει να ξεκινάει με το #
  • ο σχολιασμός μπορεί επίσης να τοποθετηθεί σε μία γραμμή που περιλαμβάνει κώδικα, στο τέλος όμως της γραμμής, δεξιά του κώδικα, ξεκινώντας με το #
  • ο σχολιασμός είναι απαραίτητος διότι:
    • επεξηγεί τι κάνει ο κώδικας σε εκείνη την περιοχή που τοποθετείται το σχόλιο
    • είναι χρήσιμος για όταν επιστρέψουμε στον κώδικα με σκοπό την τροποποίησή του
    • για τους ίδιος λόγους είναι χρήσιμος και σε κάποιον άλλο στα χέρια του οποίου βρέθηκε ο κώδικας

Παράδειγμα 1:

Στο παρακάτω παράδειγμα τοποθετούνται 2 σχόλια, ένα σε ολόκληρη γραμμή και ένα δεξιά του κώδικα.

#Εισαγωγή μαθηματικής βιβλιοθήκης math και μετονομασία της σε mt
import math as mt
print(4*mt.atan(1)) #εκτύπωση αποτελέσματος υπολογισμού της τιμής του π=3.14159....

Αντίγραψε τον κώδικα και κλικ εδώ για να τον εκτελέσεις και δεις το αποτέλεσμα.

Κώδικας για εισαγωγή δεδομένων

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

  • με πληκτρολόγηση των αριθμητικών δεδομένων κατά την εκτέλεση του κώδικα
  • με ανάγνωση των αριθμητικών δεδομένων από αρχείο (στον σκληρό δίσκο ή από το διαδίκτυο) κατά την εκτέλεση του κώδικα
  • με ενσωμάτωση των αριθμητικών δεδομένων στον κώδικα

Ακολουθεί παράδειγμα εισαγωγής ενός αριθμητικού δεδομένου και η συμμετοχή του σε μεταγενέστερη πράξη. Η πληκτρολόγηση του αριθμού γίνεται με την εντολή input, η οποία σταματά την ροή του προγράμματος, εμφανίζει το μήνυμα "Δώσε μια αριθμητική τιμή:", περιμένει τον χρήστη να δώσει τον αριθμό και μόλις πατήσει το πλήκτρο Enter συνεχίζει η ροή του προγράμματος. Η input εισάγει τον δοσμένο αριθμό σε μορφή κειμένου και η μετατροπή της σε αριθμό κινητής υποδιαστολής γίνεται με την εντολή float.

Παράδειγμα 2:

#Εισαγωγή μαθηματικής βιβλιοθήκης math και μετονομασία της σε mt
import math as mt

#Εισαγωγή μιας αριθμητικής τιμής με το πληκτρολόγιο
#Μετατροπή της αριθμητικής τιμής σε αριθμό κινητής υποδιαστολής με την εντολή float
#Αποθήκευση του αριθμού στην μεταβλητή x
x=float(input("Δώσε μια αριθμητική τιμή:"))

#Υπολόγισε το τόξο εφαπτομένης της x και αποθήκευσε το αποτέλεσμα στην μεταβλητή y
y=mt.atan(x) 

#Εκτύπωσε το αριθμητικό περιεχόμενο της y
print(y)

Αντίγραψε τον κώδικα και κλικ εδώ για να τον εκτελέσεις και δεις το αποτέλεσμα.

Κώδικας αποσφαλμάτωσης στα εισαχθέντα δεδομένα

Ο κώδικάς μας αρχίζει να σοβαρεύει και να αποκτά προστιθέμενη αξία όταν μπορέσει να ανιχνεύσει κάποιο σφάλμα κατά την πληκτρολόγηση. Για παράδειγμα, τι θα συμβεί αν αντί για τον αριθμό 1.2 πληκτρολογήσουμε 1.ς; Θα συμβεί αυτό:

Traceback (most recent call last):
  File "main.py", line 7, in <module>
    x=float(input("Δώσε μια αριθμητική τιμή:"))
ValueError: could not convert string to float: '1.ς'

Ο διερμηνέας της python κατάλαβε ότι το 1.ς δεν είναι αριθμός, διέκοψε απότομα την ροή του προγράμματος και μας ενημέρωσε με ένα μήνυμα σφάλματος. Επειδή εμείς είμαστε αυτοί που έφτιαξαν το πρόγραμμα, καταλαβαίνουμε το είδος τους σφάλματος. Εάν όμως ο τελικός χρήστης του κώδικα δεν είναι σχετικός με τον προγραμματισμό ή αν θα πρέπει να ακολουθηθεί μια μακρόσυρτη διαδικασία εισαγωγής δεδομένων, αντιλαμβανόμαστε ότι η απότομη διακοπή του προγράμματος αφού έχουν καταχωρηθεί ήδη πολλά δεδομένα πόσο εκνευρισμό και απογοήτευση μπορεί να προκαλέσει. Θα πρέπει δηλαδή ο κώδικας τουλάχιστον:

  • να ενημερώνει κατανοητά για το είδος του σφάλματος ή και
  • να αποτρέπει την διακοπή της ροής και να επιστρέφει σε κατάσταση ξανακαταχώρησης

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

Πως πιάνουμε τα σφάλματα; Στο παρακάτω παράδειγμα έχουμε μεταφέρει το τμήμα του κώδικα, το οποίο πιθανώς να παράγει το σφάλμα, εντός του μπλοκ εντολών try except. Αν τρέξουμε το πρόγραμμα και δώσουμε την τιμή 1.2, το πρόγραμμα συνεχίζει να εκτελείται και μας εκτυπώνει την τιμή της y = 0.8760580505981934. Αν όμως δώσουμε την τιμή 1.ς, τότε το πρόγραμμα βλέπει ότι παράγεται σφάλμα, επειδή δεν είναι εφικτή η μετατροπή του 1.ς σε αριθμό κινητής υποδιαστολής και ανακατευθύνει την ροή στην περιοχή κάτω από την εντολή except. Εκεί υπάρχει μόνο η εντολή εκτύπωσης ενημερωτικού μηνύματος "Αυτό που πληκτρολόγησες δεν είναι αριθμός." και ολοκληρώνεται η εκτέλεση. Ανάλογα με τις επιθυμίες μας για το πως θέλουμε να λειτουργήσει ο κώδικας, θα μπορούσαμε να έχουμε πρόσθετο κώδικα που να ζητά την επαναπληκτρολόγηση του αριθμού. Αυτό όμως είναι μια άλλη ιστορία, ίσως για ένα άλλο άρθρο μας.

Παράδειγμα 3:

#Εισαγωγή μαθηματικής βιβλιοθήκης math και μετονομασία της σε mt
import math as mt

try:

 #Εισαγωγή μιας αριθμητικής τιμής με το πληκτρολόγιο
 #Μετατροπή της αριθμητικής τιμής σε αριθμό κινητής υποδιαστολής με την εντολή float
 #Αποθήκευση του αριθμού στην μεταβλητή x
 x=float(input("Δώσε μια αριθμητική τιμή:"))
 
 #Υπολόγισε το τόξο εφαπτομένης της x και αποθήκευσε το αποτέλεσμα στην μεταβλητή y
 y=mt.atan(x) 
 
 #Εκτύπωσε το αριθμητικό περιεχόμενο της y
 print(y)

except ValueError:

 print("Αυτό που πληκτρολόγησες δεν είναι αριθμός.")

Αντίγραψε τον κώδικα και κλικ εδώ για να τον εκτελέσεις και δεις το αποτέλεσμα.

Η ιστορία με τα αριθμητικά σφάλματα δεν έχει τελειωμό και εξαρτάται από τα είδη των συναρτήσεων που χρησιμοποιούμε στους υπολογισμούς. Τι θα συμβεί για παράδειγμα αν ο υπολογισμός που έχουμε να αναθέσουμε στην y είναι 1/sin(x); Ας το δούμε στο παράδειγμα 4.

Παράδειγμα 4:

#Εισαγωγή μαθηματικής βιβλιοθήκης math και μετονομασία της σε mt
import math as mt

try:

 #Εισαγωγή μιας αριθμητικής τιμής με το πληκτρολόγιο
 #Μετατροπή της αριθμητικής τιμής σε αριθμό κινητής υποδιαστολής με την εντολή float
 #Αποθήκευση του αριθμού στην μεταβλητή x
 x=float(input("Δώσε μια αριθμητική τιμή:"))
 
 #Υπολόγισε το κλάσμα ένα δια ημίτονο της x και αποθήκευσε το αποτέλεσμα στην μεταβλητή y
 y=1/mt.sin(x)
 
 #Εκτύπωσε το αριθμητικό περιεχόμενο της y
 print(y)

except ValueError:

 print("Αυτό που πληκτρολόγησες δεν είναι αριθμός.")

Αντίγραψε τον κώδικα και κλικ εδώ για να τον εκτελέσεις και δεις το αποτέλεσμα.

Το έμπειρο μάτι αναγνωρίζει ότι αν x=0, τότε και sin(0)=0. Έχουμε λοιπόν διαίρεση με το 0, περίπτωση που ο διερμηνέας του προγράμματος αναγνωρίζει και εμφανίζει το παρακάτω μήνυμα:

Traceback (most recent call last):
  File "main.py", line 12, in <module>y=1/mt.sin(x)
ZeroDivisionError: float division by zero

Βλέπουμε ότι αυτό το σφάλμα δεν ανήκει στην κατηγορία ValueError. Με λίγο ψάξιμο στο εγχειρίδιο του διερμηνέα της python διαπιστώνουμε ότι ανήκει στην κατηγορία ZeroDivisionError. Τότε, με ένα νέο μπλοκ εντολών try except, επιτρέπουμε να γίνει ο υπολογισμός y=1/sin(x) και να εκτυπωθεί η y μόνο αν δεν προκύψει παρονομαστής με τιμή 0. Αν προκύψει παρονομαστής με τιμή 0, τότε εκτυπώνεται το μήνυμα "Αυτό που πληκτρολόγησες είναι μηδέν και προκαλεί πρόβλημα στην διαίρεση 1/sin(x)". 

#Εισαγωγή μαθηματικής βιβλιοθήκης math και μετονομασία της σε mt
import math as mt

try:

 #Εισαγωγή μιας αριθμητικής τιμής με το πληκτρολόγιο
 #Μετατροπή της αριθμητικής τιμής σε αριθμό κινητής υποδιαστολής με την εντολή float
 #Αποθήκευση του αριθμού στην μεταβλητή x
 x=float(input("Δώσε μια αριθμητική τιμή:"))
 
 try:

  #Υπολόγισε το κλάσμα ένα δια ημίτονο της x και αποθήκευσε το αποτέλεσμα στην μεταβλητή y
  y=1/mt.sin(x)

  #Εκτύπωσε το αριθμητικό περιεχόμενο της y
  print(y)

 except ZeroDivisionError:

  print("Αυτό που πληκτρολόγησες είναι μηδέν και προκαλεί πορόβλημα στην διαίρεση 1/sin(x).")
  
except ValueError:

 print("Αυτό που πληκτρολόγησες δεν είναι αριθμός.")

Αντίγραψε τον κώδικα και κλικ εδώ για να τον εκτελέσεις και δεις το αποτέλεσμα.

Η περίπτωση της διαίρεσης με το 0 είναι μια ιδανική κατάσταση, η οποία εκτός από την εσφαλμένη δακτυλογράφηση, μάλλον δεν έχει άλλη περίπτωση να συμβεί.

Στην πράξη όμως μπορεί το x, ή γενικότερα μια αλγεβρική παράσταση στον παρονομαστή, να προσεγγίζει το 0. Αυτό είναι σύνηθες φαινόμενο και μπορεί να πιαστεί με ένα μπλοκ εντολών ελέγχου if then else. Με αυτό τον τρόπο μπορεί να πιαστεί και η ιδανική περίπτωση του x=0.

Συγκεκριμένα, ορίζουμε ένα όριο αποδοχής ή αποτροπής των πράξεων, πχ αν το x κατά απόλυτη τιμή είναι μεγαλύτερο από 0.001 επέτρεψε τον υπολογισμό και την εκτύπωση του αποτελέσματος, αν όχι τότε ενημέρωσε τον χρήστη με το μήνυμα "Αυτό που πληκτρολόγησες είναι πολύ κοντά στο μηδέν και προκαλεί πρόβλημα στην διαίρεση 1/sin(x)".

#Εισαγωγή μαθηματικής βιβλιοθήκης math και μετονομασία της σε mt
import math as mt

try:

 #Εισαγωγή μιας αριθμητικής τιμής με το πληκτρολόγιο
 #Μετατροπή της αριθμητικής τιμής σε αριθμό κινητής υποδιαστολής με την εντολή float
 #Αποθήκευση του αριθμού στην μεταβλητή x
 x=float(input("Δώσε μια αριθμητική τιμή:"))
 
 if (mt.abs(x)>0.001):

  #Υπολόγισε το κλάσμα ένα δια ημίτονο της x και αποθήκευσε το αποτέλεσμα στην μεταβλητή y
  y=1/mt.sin(x)

  #Εκτύπωσε το αριθμητικό περιεχόμενο της y
  print(y)

 else:

  print("Αυτό που πληκτρολόγησες είναι πολύ κοντά στο μηδέν και προκαλεί πρόβλημα στην διαίρεση 1/sin(x).")
  
except ValueError:

 print("Αυτό που πληκτρολόγησες δεν είναι αριθμός.")

Αντίγραψε τον κώδικα και κλικ εδώ για να τον εκτελέσεις και δεις το αποτέλεσμα.

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

.

Διάβασε επίσης:

 

Η Kemioteko Engineering δημιουργήθηκε ως απόσταγμα εμπειριών 14 ετών στην αδειοδότηση, κατασκευή και λειτουργία δημόσιων τεχνικών έργων και 8 ετών στο ελεύθερο επάγγελμα του μελετητή μηχανικού με εξειδίκευση στην αδειοδότηση και λειτουργία επιχειρήσεων. Αποστολή της Kemioteko Engineering - Χατζηλιόντος Ι. Χριστόδουλος είναι η δημιουργία πελατών, οπαδών της, βαθειά ικανοποιημένων, που θέλουν να κάνουν διαχρονικά τα σωστά πράγματα με τους κατάλληλους συνεργάτες.

 

Διπλ. Χημικός Μηχανικός ΕΜΠ - Msc Περιβαλλοντικού Σχεδιασμού
Αγρονόμος Τοπογράφος Μηχανικός ΑΠΘ - 5ο Εξάμηνο
Επιθεωρητής Ξενοδοχείων - ΕΕΔΔ - TUV Austria RCN 6035/2016
Επιθεωρητής ISO 9001 - TUV Austria RCN 6065/2016
Επιθεωρητής ISO 45001 - Alison 1412-13849119
Επιθεωρητής GDPR - Alison 1401-13849119
Ενεργειακός Επιθεωρητής - No 16109 | No 553
Μελετητής ΥΠΕΧΩΔΕ - No 26837 - 18-A & 27-A
ΑΜ ΤΕΕ - No 83488 | ΤΕΧΝΙΚΟΣ ΑΣΦΑΛΕΙΑΣ. 330512/2017
Μητρώο Αξιολογητών ΓΓΕΤ- No 14856/95711/08-06-17
Ελεγκτής Δόμησης - No 4517
τηλ +302399-022359
Βασ Πιτσούλη 1, TK 63080, Νέα Καλλικράτεια
Χαλκιδική, Ελλάδα | http://kemioteko.gr
Μελετητικές Υπηρεσίες Βιομηχανικών & Περιβαλλοντικών Εγκαταστάσεων:
Σχεδιασμός, Αδειοδότηση, Διαχείριση Ποιοτικού Ελέγχου & Κατασκευών,
Οργανολογία & Ρύθμιση, Λειτουργία & Συντήρηση
Follow us 
 facebook  twitter  linkedin  googleplus  pinterest  youtube  twitter