[eeei.gr Logo]
Επικοινωνία
Ταυτότητα
Μαθήματα Internet | Μαθήματα Προγραμματισμού | Net Business | Τα νέα του Internet | Ο Κόσμος του Αύριο

If elsif else

Η λειτουργικότητα του προγράμματος με το οποίο παρουσιάσαμε τις scalar variables είναι φυσικά πολύ περιορισμένη. Μπορούμε να μετατρέψουμε βαθμούς Fahrenheit σε Κελσίου, αλλά όχι το αντίθετο. Έχουμε βέβαια πλέον τις γνώσεις να δημιουργήσουμε ένα δεύτερο πρόγραμμα που να μετατρέπει βαθμούς Κελσίου σε Fahrenheit, αλλά θα ήταν πολύ πιο λειτουργικό, αν μπορούσαμε να ενσωματώσουμε και τις δύο λειτουργίες μέσα σε ένα πρόγραμμα.

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

#!/usr/bin/perl -w

use strict;

print "Welcome to the Fahrenheit - Centigrade script\n";

print "Please type the temperature you want to convert:\n";

my $fah; # Oi bathmoi se Fahrenheit

my $cen; # Oi bathmoi se Kelsiou

my $temp; # Temperature

my $forc; # f if Fahrenheit or c if Centigrade

$temp = <STDIN>;

chomp ($temp);

Αποφασίσαμε ότι ο τρόπος με τον οποίο θα λειτουργεί το πρόγραμμά μας είναι ο ακόλουθος:

Ο χρήστης θα πληκτρολογεί μια θερμοκρασία και μετά θα λέει στο πρόγραμμα αν η θερμοκρασία που έδωσε είναι βαθμοί Κελσίου (άρα θέλει να μετατραπούν σε Fahrenheit) ή το αντίθετο.

Οι παράμετροι που θα χρησιμοποιήσουμε είναι:

  • my $fah = Οι βαθμοί σε Fahrenheit
  • my $cen = Οι βαθμοί σε Κελσίου
  • my $temp = Η θερμοκρασία που έδωσε ο χρήστης
  • my $forc = Η πληροφορία για το είδος της θερμοκρασίας που δήλωσε ο χρήστης (f αν είναι Fahrenheit και c αν είναι Κελσίου)

Προσέξτε ότι:

Στο προηγούμενο πρόγραμμα η θερμοκρασία που έδινε ο χρήστης ήταν πάντοτε Fahrenheit. Εδώ όμως αυτό δεν ισχύει. Έτσι, τη θερμοκρασία που έδωσε ο χρήστης την ονομάζουμε $temp. Με τον τρόπο αυτό όμως το πρόγραμμα δεν γνωρίζει τι είδους θερμοκρασία μας έδωσε ο χρήστης. Γι’ αυτό, προσθέσαμε μια ακόμη μεταβλητή η οποία λέει στο πρόγραμμα αν η θερμοκρασία είναι Fahrenheit ή Κελσίου. Τη μεταβλητή αυτή την ονομάσαμε $froc δηλαδή f or c (f αν είναι Fahrenheit και c αν είναι Κελσίου). Όταν $froc = f τότε ο χρήστης μας έδωσε θερμοκρασία σε Fahrenheit, ενώ όταν $froc = c τότε η θερμοκρασία που μας έδωσε θα είναι σε Κελσίου.

Τώρα οι μεταβλητές μας έγιναν περισσότερες και πιο περίπλοκες, απ’ ό,τι στο προηγούμενο πρόγραμμα. Για παράδειγμα πρέπει να θυμόμαστε ότι αποφασίσαμε πως αν ο χρήστης πληκτρολογήσει c (βλέπε παρακάτω) αυτό σημαίνει ότι δήλωσε βαθμούς Κελσίου, ενώ αν πληκτρολογήσει f αυτό σημαίνει ότι δήλωσε βαθμούς Fahrenheit. Επειδή όμως αν χρειαστεί να επανεξετάσουμε αυτό το πρόγραμμα στο μέλλον (ή να το δώσουμε σε κάποιον άλλον) πιθανώς να μην θυμόμαστε αυτά τα στοιχεία, αποφασίσαμε να κρατήσουμε μερικές σημειώσεις.

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

my $forc; # f if Fahrenheit or c if Centigrade

ή μπορεί να ξεκινάει από την αρχή της γραμμής:

# F to C or C to F program. © 2005 Giorgos Epitidios

Αν θέλουμε το σχόλιο να εκτείνετε σε περισσότερες από μια γραμμές, κάθε μια τους πρέπει να ξεκινάει με το #

# F to C or C to F program. Copyright 2001 Giorgos Epitidios

# Feel free to copy and modify this program

# Long live free software !!!

Συνεχίζοντας το πρόγραμμά μας, ο χρήστης έχει ήδη πληκτρολογήσει τη θερμοκρασία. Τώρα λοιπόν πρέπει να μας πει αν αυτό που μας έδωσε είναι βαθμοί Κελσίου ή Fahrenheit:

print "Type f if what you typed is in Fahrenheit or c if it is in Centigrade:\n";

$forc = <STDIN>;

chomp ($forc);

Με το print του εξηγήσαμε τι είναι αυτό που του ζητάμε (να γράψει f αν η θερμοκρασία που πληκτρολόγησε είναι Fahrenheit και c αν είναι Κελσίου), ενώ με τον κώδικα που ακολουθεί λαμβάνουμε και αποθηκεύουμε (<STDIN>) καθαρό (chomp) τον χαρακτηρισμό της θερμοκρασίας (c ή f).

Τώρα αρχίζουν τα δύσκολα (που όμως όπως θα δείτε δεν είναι και τόσο τρομερά). Το πρόγραμμά μας πρέπει να εκτελέσει μια σειρά από λογικές λειτουργίες και συγκεκριμένα τις ακόλουθες:

  1. Αν ο χρήστης δήλωσε f τότε πρέπει να πάρω την τιμή που έχω καταχωρημένη στη μεταβλητή $temp, να την μετατρέψω σε Κελσίου και να του δώσω το αποτέλεσμα.
  2. Αν ο χρήστης δήλωσε c τότε πρέπει να πάρω την τιμή που έχω καταχωρημένη στη μεταβλητή $temp, να την μετατρέψω σε Fahrenheit και να του δώσω το αποτέλεσμα.
  3. Αν ο χρήστης πληκτρολόγησε κάτι διαφορετικό από c ή f τότε πρέπει να του παρουσιάσω ένα μήνυμα «διαμαρτυρίας».

Φυσικά τα 1 και 2 θα μπορούσαν να τοποθετηθούν και αντίστροφα, ενώ είμαι βέβαιος ότι μπορείτε να σκεφθείτε πολλές άλλες λογικές λειτουργίες που δεν καλύπτονται εδώ (π.χ. μετά το τέλος του προγράμματος να ερωτάται ο χρήστης αν θέλει να μετατρέψει και κάποια άλλη τιμή). Αυτά όμως θα τα δούμε παρακάτω. Εδώ το συντακτικό μοντέλο με το οποίο λειτουργούμε είναι:

  1. Αν συμβαίνει το Α τότε κάνε το Χ (if)
  2. Αν δεν συμβαίνει το Α, αλλά συμβαίνει το Β τότε κάνε Ψ (elsif)
  3. Διαφορετικά κάνε το Ω (else)

Το καλό με την Perl είναι ότι ο δημιουργός της (Larry Wall) είναι γλωσσολόγος. Έτσι, το συντακτικό της Perl θυμίζει πολύ φυσική γλώσσα. Στη ζωή δεν θα λέγαμε ποτέ:

  1. Βγάλε αεροπορικό εισιτήριο για Θεσσαλονίκη και ΚΤΕΛ για Γρεβενά
  2. Αν δεν υπάρχει αεροπλάνο αλλά υπάρχει ΚΤΕΛ βγάλε εισιτήριο για Γρεβενά
  3. Διαφορετικά έλα να με πάρεις με το αυτοκίνητό σου.

Επειδή τα ευκόλως εννοούμενα (το «Αν δεν υπάρχει αεροπλάνο») παραλείπονται θα λέγαμε:

  1. Βγάλε αεροπορικό εισιτήριο για Θεσσαλονίκη και ΚΤΕΛ για Γρεβενά
  2. Διαφορετικά βγάλε εισιτήριο ΚΤΕΛ για Γρεβενά
  3. Διαφορετικά έλα να με πάρεις με το αυτοκίνητό σου.

Αντίστοιχα λοιπόν και στην Perl θα πούμε:

  1. Αν συμβαίνει το Α τότε κάνε το Χ (if)
  2. Διαφορετικά αν συμβαίνει το Β τότε κάνε Ψ (elsif)
  3. Διαφορετικά κάνε το Ω (else)

Όπως και στη φυσική γλώσσα λοιπόν η Perl εκτελεί την πρώτη εντολή (if) και αδιαφορεί για τις υπόλοιπες. Μόνο αν δεν ισχύει η πρώτη θα ασχοληθεί με τη δεύτερη (elsif), την τρίτη (elsif) κ.ο.κ. μέχρι την τελευταία (if) την οποία χρησιμοποιούμε για να της πούμε τι να κάνει όταν δεν ισχύει κανένα από τα παραπάνω (if και elsif).

Σημειώστε ότι μπορούμε να έχουμε όσα elsif θέλουμε (εκτελούνται σειριακά). Στο παράδειγμά μας όμως χρησιμοποιούμε μόνο ένα.

if ($forc eq 'f') {

Αν (if) η παράμετρος που μας λέει τι είδους θερμοκρασία πληκτρολόγησε ο χρήστης ($forc) είναι ίση (eq δηλαδή equal) με f (δηλαδή μας έδωσε θερμοκρασία σε Fahrenheit) τότε … (Σημειώστε ότι αν θέλαμε η forc να είναι διαφορετική από f θα χρησιμοποιούσαμε τον τελεστή ne που σημαίνει non equal. Επίσης προσέξτε ότι βάλαμε το f μέσα σε single quotes δηλαδή σε μονά εισαγωγικά.)

Προσέξτε ότι όλη η δήλωση που σχετίζεται με το if βρίσκεται μέσα σε παρένθεση ($forc eq 'f'). Επίσης, οι εντολές που εξηγούν στο πρόγραμμα τι πρέπει να κάνει αν είναι αληθές το if περικλείονται μέσα σε άγκιστρα ( { ). Το άγκιστρο που ανοίγει (και μετά το οποίο ξεκινούν οι εντολές) βρίσκεται στην ίδια γραμμή με το if ενώ το άγκιστρο που κλείνει (αφού έχουμε δώσει όλες τις εντολές) βρίσκεται ή τελευταίο σε μια γραμμή μόνο του (αν δεν υπάρχει κάτι που πρέπει να γίνει μετά) ή στην αρχή της γραμμής στην οποία δηλώνουμε την επόμενη εντολή (όπως θα δούμε παρακάτω, στην περίπτωσή μας αυτή είναι η elsif).

Σημειώστε ότι τα άγκιστρα (ειδικά αυτά που κλείνουν μια σειρά εντολών) αποτελούν ένα από τα συνηθέστερα πράγματα που ξεχνούν οι προγραμματιστές. Προσέξτε λοιπόν να μην τα ξεχνάτε. Επίσης, θυμηθείτε πάντοτε να βάζετε τις τιμές των παραμέτρων μέσα σε αποστρόφους. Προσέξετε ότι γράψαμε $forc eq 'f' και όχι $forc eq f

$cen = int(($temp-32)*5/9);

Αφού αυτό που θέλουμε είναι οι βαθμοί σε Κελσίου, υπολόγισέ τους χρησιμοποιώντας την εξίσωση $cen = ($temp-32)*5/9.

Στο σημείο αυτό αποφάσισα να προσθέσω κάτι ακόμη στην εξίσωση. Όπως ίσως θα παρατηρήσατε στο προηγούμενο παράδειγμα η μετατροπή από Fahrenheit σε Κελσίου μας έδινε την τιμή σε δεκαδικά. Επειδή όμως έχουμε συνηθίσει να διαβάζουμε τη θερμοκρασία σε ακέραιους αριθμούς, γι’ αυτό και χρησιμοποιήσαμε τη συνάρτηση int () χάρη στην οποία το τελικό αποτέλεσμα θα παρουσιάζεται ως ακέραιος αριθμός. Περικλείοντας λοιπόν όλη τη μαθηματική πράξη ($temp-32)*5/9 με τη συνάρτηση int () έχουμε int(($temp-32)*5/9) και το τελικό αποτέλεσμα (το $cen) θα εμφανίζεται ως ακέραιος αριθμός.

print "The equivalent of $temp degrees Fahrenheit is $cen Centigrade\n";

Αφού με την εξίσωση βρήκαμε την τιμή που επιθυμούσαμε (το $cen) το μόνο που μας μένει είναι να την τυπώσουμε και να την εμφανίσουμε στον χρήστη.

} elsif ($forc eq 'c') {

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

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

}

elsif ($forc eq 'c') {

ή να αποτελεί το κλείσιμο της προηγούμενης γραμμής (print "The equivalent of $temp degrees Fahrenheit is $cen Centigrade\n"};)

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

Ο μετά το κλείσιμο του άγκιστρου κώδικας

elsif ($forc eq 'c') {

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

Αν δεν ισχύουν τα προηγούμενα (elsif) και ο χρήστης έχει πληκτρολογήσει c ($forc eq 'c') τότε …

$fah = int($temp*9/5+32);

print "The equivalent of $temp degrees Centigrade is $fah Fahrenheit\n";

Και εδώ ο κώδικας είναι εύκολα κατανοητός. Κάνουμε τη μετατροπή από Fahrenheit σε Κελσίου (σε ακέραια μορφή) με το $fah = int($temp*9/5+32) και τυπώνουμε το αποτέλεσμα.

} else {

Αν τώρα ούτε η προϋπόθεση του if ($forc eq 'f') αλλά ούτε και εκείνη του elsif ($forc eq 'c') δεν ικανοποιούνται, αυτό σημαίνει ότι ο χρήστης πληκτρολόγησε κάτι διαφορετικό από f ή c. Έτσι, λέμε στο πρόγραμμα να εμφανίσει ένα μήνυμα διαμαρτυρίας.

print "You should have typed f or c. Quiting program\n";

}

Το πρόγραμμα θα σταματήσει να λειτουργεί από μόνο του, οπότε εμείς δεν χρειάζεται να κάνουμε κάτι για να το τερματίσουμε.

Ο πλήρης κώδικας του προγράμματός μας είναι:

#!/usr/bin/perl -w

use strict;

print "Welcome to the Fahrenheit - Centigrade script\n";

print "Please type the temperature you want to convert:\n";

my $fah; # Oi bathmoi se Fahrenheit

my $cen; # Oi bathmoi se Kelsiou

my $temp; # Temperature

my $forc; # f if Fahrenheit or c if Centigrade

$temp = <STDIN>;

chomp ($temp);

print "Type f if what you typed is in Fahrenheit or c if it is in

Centigrade:\n";

$forc = <STDIN>;

chomp ($forc);

if ($forc eq 'f') {

$cen = int(($temp-32)*5/9);

print "The equivalent of $temp degrees Fahrenheit is $cen

Centigrade\n";

} elsif ($forc eq 'c') {

$fah = int($temp*9/5+32);

print "The equivalent of $temp degrees Centigrade is $fah

Fahrenheit\n";

} else {

print "You should have typed f or c. Quiting program\n";

}


Τρέχουσα Ενότητα: Perl


 

Φιλικά - συνεργαζόμενα sites: Left Handed Products


© Eeei.gr 2009