Vous êtes sur la page 1sur 6

ΠΟΛΥΤΕΧΝΕΙΟ ΚΡΗΤΗΣ

ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ


ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ
ΕΡΓΑΣΤΗΡΙΟ ΔΙΑΝΕΜΗΜΕΝΩΝ
ΠΛΗΡΟΦΟΡΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ ΚΑΙ ΕΦΑΡΜΟΓΩΝ
http://courses.ece.tuc.gr
ΗΜΜΥ ΠΛΗ 101 - ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΗΛΕΚΤΡΟΝΙΚΟΥΣ ΥΠΟΛΟΓΙΣΤΕΣ ΚΑΙ ΤΗΝ ΠΛΗΡΟΦΟΡΙΚΗ
2H ΕΡΓΑΣΤΗΡΙΑΚH ΑΣΚΗΣΗ: ΥΠΟΣΤΗΡΙΚΤΙΚΟ ΥΛΙΚΟ
ΥΠΕΥΘΥΝΟΙ ΕΡΓΑΣΤΗΡΙΟΥ: ΑΝΕΣΤΗΣ ΓΕΩΡΓΙΟΣ, ΜΟΥΜΟΥΤΖΗΣ ΝΕΚΤAΡΙΟΣΡΙΟΣ, ΜΑΡΑΓΚΟΥΔΑΚΗΣ ΙΩΑΝΝΗΣ

AΡΙΟΣ. Έλεγχος Ροής Προγράμματος


Οι εντολές μιας γλώσσας για τον έλεγχο της ροής εκτέλεσης του προγράμματος καθορίζουν τη
σειρά με την οποία εκτελούνται οι υπολογισμοί (οι εντολές του προγράμματος). Η προεπιλεγμένη
σειρά εκτέλεσης ενός προγράμματος της C είναι σειριακή, από την αρχή προς το τέλος, με τη
σειρά που εμφανίζονται στο αρχείο του πηγαίου κώδικα. Συγκεκριμένα η εκτέλεση αρχίζει στην
αρχή της συνάρτησης main() και συνεχίζεται εντολή προς εντολή έως να φτάσει στο τέλος της
main(). Ωστόσο, αυτή η σειρά απαντάται σπανίως σε πραγματικά προγράμματα της C. Η γλώσσα
C περιλαμβάνει μια ποικιλία εντολών ελέγχου της ροής των προγραμμάτων που μας επιτρέπουν
τον έλεγχο της σειράς εκτέλεσης των εντολών ενός προγράμματος. Η βασική εντολή λήψης
αποφάσεων της C, είναι η εντολή if. Πριν προχωρήσουμε όμως στην περιγραφή της εντολής if
είναι απαραίτητο να μιλήσουμε για τους σχεσιακούς τελεστές.

AΡΙΟΣ.1. Σχεσιακοί Τελεστές


Οι σχεσιακοί τελεστές της C χρησιμοποιούνται για να συγκρίνουν εκφράσεις, θέτοντας ερωτήσεις
όπως “είναι η x μεγαλύτερη από το 100;” ή “είναι η y ίση με 0;”. Μία έκφραση που περιέχει έναν
σχεσιακό τελεστή υπολογίζεται είτε σε αληθής (1), είτε σε ψευδής (0). Οι σχεσιακοί τελεστές της
C παρατίθενται στον πίνακα που ακολουθεί.

Πίνακας 1. Σχεσιακοί τελεστές της C

Τελεστής Σύμβολο Ερώτηση που τίθεται Παράδειγμα


Ίσον == Είναι ο τελεστέος 1 ίσος με τον τελεστέο 2; x == y
Μεγαλύτερο από > Είναι ο τελεστέος 1 μεγαλύτερος από τον τελεστέο 2; x>y
Μικρότερο από < Είναι ο τελεστέος 1 μικρότερος από τον τελεστέο 2; x<y
Μεγαλύτερο ή ίσο >= Είναι ο τελεστέος 1 μεγαλύτερος ή ίσος από τον τελεστέο 2; x >= y
Μικρότερο ή ίσο <= Είναι ο τελεστέος 1 μικρότερος ή ίσος από τον τελεστέο 2; x <= y
Άνισο != Ο τελεστέος 1 δεν είναι ίσος με τον τελεστέο 2 x != y

Πίνακας 2. Σχεσιακοί τελεστές σε χρήση

Έκφραση Πως διαβάζεται Αποτέλεσμα


5 == 1 Είναι το 5 ίσο με το 1; 0 (ψευδές)
5 >= 1 Είναι το 5 μεγαλύτερο από το 1; 1 (αληθές)
5 != 1 Είναι το 5 άνισο με το 1; 1 (αληθές)
(5+10) == (3 * 5) Είναι το (5 + 10) ίσο με το (3 * 5) 1 (αληθές)

1/6
Σημείωση 1
Το “αληθές” θεωρείται ίδιο με το “ναι”, που επίσης θεωρείται ίδιο με το 1. Το “ψευδές” θεωρείται
ίδιο με το “όχι” που επίσης θεωρείται ίδιο με το 0.

Σημείωση 2
Μη συγχέετε το ==, το σχεσιακό τελεστή, με το =, τον τελεστή εκχώρησης.

AΡΙΟΣ.2. Η εντολή if
Οι σχεσιακοί τελεστές χρησιμοποιούνται κυρίως για να δημιουργήσουν συγκριτικές εκφράσεις που
χρησιμοποιούνται στην εντολή if. Στη βασική της μορφή, η εντολή if υπολογίζει μία έκφραση και
οδηγεί στην εκτέλεση του προγράμματος ανάλογα με το αποτέλεσμα αυτού του υπολογισμού. Η
μορφή μιας εντολής if έχει ως εξής:

if (έκφραση)
εντολή;

Εάν ο υπολογισμός της έκφρασης δώσει αληθές αποτέλεσμα, εκτελείται η εντολή, διαφορετικά
δεν εκτελείται. Και στις δύο περιπτώσεις, η εκτέλεση συνεχίζεται στον κώδικα που έπεται της
εντολής if.

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

if (έκφραση) {
εντολή_1;
εντολή_2;
...
εντολή_Ν;
}

Σημείωση 3
Δημιουργείτε εσοχές στις εντολές μέσα σε ένα μπλοκ, για να τις κάνετε πιο ευανάγνωστες.

Σημείωση 4
Μην κάνετε το λάθος να βάλετε Ελληνικό ερωτηματικό στο τέλος μιας εντολής if.

if (x == 2); /* δεν χρειάζεται το Ελληνικό ερωτηματικό */


εντολή_1;

Στο παραπάνω (λανθασμένο) παράδειγμα η εντολή_1 εκτελείται είτε το x ισούται με 2, είτε όχι,
επειδή κάθε πρόταση εκτελείται ως ξεχωριστή εντολή, και όχι όλες μαζί όπως θα θέλαμε.

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

#include <stdio.h>

int main() {
int x, y;

/* Είσοδος τιμών για έλεγχο */


printf("\n Insert an integer value for x:");

2/6
scanf("%d", &x);
printf("\n Insert an integer value for y:");
scanf("%d", &y);

/* Έλεγχος τιμών και εκτύπωση αποτελέσματος */


if (x == y)
printf("x is equal to y\n");
if (x > y)
printf("x is greater than y\n");
if (x < y)
printf("x is smaller than y\n");

return 0;
}

AΡΙΟΣ.3. Η φράση else


Μία εντολή if μπορεί να περιλαμβάνει προαιρετικά μία φράση else. Η φράση else περιλαμβάνεται
ως εξής:

if (έκφραση)
εντολή_1;
else
εντολή_2;

Εάν η έκφραση είναι αληθής, εκτελείται η εντολή_1. Εάν η έκφραση είναι ψευδής, εκτελείται η
εντολή_2. Και η εντολή_1 και η εντολή_2 μπορεί να είναι ένα μπλοκ εντολών:

if (έκφραση) {
εντολή_1;
εντολή_2;
...
εντολή_Ν;
}
else {
εντολή_3;
εντολή_4;
...
εντολή_Μ;
}

Στη γενική περίπτωση μια εντολή if μπορεί να αποτελεί μέρος των εντολών μιας φράσης else,
δηλαδή μπορεί να έχουμε την εξής γενική μορφή:

if (εκφραση1)
εντολή_1;
else if (εκφραση2)
εντολή_2;
else if (έκφραση3)
εντολή_3;
else
εντολή_4;
επόμενη εντολή;

Ή στην περίπτωση που έχουμε μπλοκ εντολών:

3/6
if (εκφραση1) {
εντολή_1;
εντολή_2;
...
εντολή_Ν;
} else if (εκφραση2) {
εντολή_3;
εντολή_4;
...
εντολή_M;
}
else {
εντολή_5;
εντολή_6;
...
εντολή_K;
}
επόμενη εντολή;

Σημείωση 5
Η C ακολουθεί τον κανόνα ότι μια φράση else ανήκει στην κοντινότερη εντολή if η οποία δεν έχει
ήδη «ταιριάξει» με μια φράση else. Ο προγραμματιστής μπορεί να αλλάξει τον κανόνα αυτό
χρησιμοποιώντας κατάλληλα τις αγκύλες {}.

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

#include <stdio.h>

int main() {

int x, y;

/* Είσοδος τιμών για έλεγχο */


printf("\n Insert an integer value for x:");
scanf("%d", &x);
printf("\n Insert an integer value for y:");
scanf("%d", &y);

/* Έλεγχος τιμών και εκτύπωση αποτελέσματος */


if (x == y)
printf("x is equal to y\n");
else if (x > y)
printf("x is greater than y\n");
else
printf("x is smaller than y\n");

return 0;
}

Αναφορές
1. Εγχειρίδιο της C, Peter Aitken & Bradley L. Jones.

Εκφώνηση Εργαστηριακής Άσκησης

4/6
Ο Δείκτης Μάζας Σώματος (ΔΜΣ), είναι μια αμφιλεγόμενη στατιστική μέτρηση που συγκρίνει το
βάρος και το ύψος ενός ατόμου. Μπορεί να είναι ένα χρήσιμο εργαλείο για την εκτίμηση ενός
υγιούς σωματικού βάρους με βάση το πόσο ψηλό είναι ένα άτομο. Λόγω της ευκολίας της
μέτρησης και του υπολογισμού του, είναι το πιο ευρέως χρησιμοποιούμενο διαγνωστικό εργαλείο
για τον εντοπισμό προβλημάτων βάρους εντός ενός πληθυσμού.

Ο ΔΜΣ υπολογίζεται ως: ΔΜΣ = βάρος / ύψος^2

Γράψτε ένα πρόγραμμα σε C το οποίο θα δέχεται ως είσοδο από το πληκτρολόγιο το βάρος ενός
ατόμου σε κιλά και το ύψος του σε μέτρα. Το πρόγραμμά σας θα πρέπει να ελέγχει για τυχόν
λανθασμένες τιμές εισόδου και συγκεκριμένα για αρνητικές ή μηδενικές τιμές. Στη συνέχεια το
πρόγραμμά σας θα πρέπει να υπολογίζει το ΔΜΣ του ατόμου. Έχοντας υπολογίσει το ΔΜΣ το
πρόγραμμά σας θα πρέπει να κατατάσσει το άτομο σε μια από τις ακόλουθες κατηγορίες
εκτυπώνοντας το κατάλληλο μήνυμα στην οθόνη. Συγκεκριμένα:
 εάν ο ΔΜΣ είναι <= 20 το άτομο κατατάσσεται στην κατηγορία underweight και
εκτυπώνεται το μήνυμα “Underweight” στην οθόνη.
 Εάν ο ΔΜΣ είναι > 20 και <= 25 το άτομο κατατάσσεται στην κατηγορία normal και
εκτυπώνεται το μήνυμα “Normal” στην οθόνη.
 Εάν ο ΔΜΣ είναι > 25 και <= 30 το άτομο κατατάσσεται στην κατηγορία overweight και
εκτυπώνεται το μήνυμα “Overweight” στην οθόνη.
 Εάν ο ΔΜΣ είναι > 30 το άτομο κατατάσσεται στην κατηγορία obese και εκτυπώνεται το
μήνυμα “Obese” στην οθόνη.

5/6
Επεκτάσεις και ιδέες για περαιτέρω μελέτη
 Μάθετε να ενεργοποιείτε τον debugger, να τρέχετε γραμμή γραμμή τον κώδικά σας και να
βλέπετε τις αλλαγές που συμβαίνουν στις τιμές των μεταβλητών. Για σχετικές οδηγίες
ανατρέξτε στις πέντε τελευταίες σελίδες στο “Εισαγωγικό Εγχειρίδιο Code::Blocks” που
σας έχουμε ήδη δώσει από τη δεύτερη εβδομάδα του μαθήματος. Υπάρχει για να το
κατεβάσετε στις εργαστηριακές σημειώσεις του μαθήματος.
 Αν έχετε χρόνο και διάθεση να ασχοληθείτε περισσότερο με το πρόγραμμα αυτής της
άσκησης, σας προτείνουμε, εφόσον το υλοποιήσετε ακολουθώντας τις παραπάνω
προδιαγραφές, να προσπαθήσετε να το επεκτείνετε ως εξής:
◦ Εφόσον το άτομο δεν καταταχθεί στην κατηγορία normal, να υπολογίζει και να
εκτυπώνει το πόσα κιλά κατ' ελάχιστο θα πρέπει να αυξηθεί (ή να μειωθεί) το βάρος
του ώστε να καταταχθεί στην κατηγορία normal.
◦ Εφόσον το άτομο καταταχθεί στην κατηγορία normal να υπολογίζει και να εκτυπώνει
το πόσα κιλά το πολύ μπορεί να αυξηθεί ή να μειωθεί το βάρος του και να παραμείνει
στην κατηγορία normal.
 Αφού ολοκληρώσετε την άσκηση (με ή χωρίς την προηγούμενη επέκταση) δοκιμάστε, όπως
και στην πρώτη εργαστηριακή άσκηση, να “χαλάσετε” τον κώδικα. Δείτε μετά τι μηνύματα
σας δίνει ο μεταφραστής ώστε να εξοικειωθείτε με τα μηνύματα αυτά τα οποία, πολλές
φορές, είναι δυσνόητα για τον αμύητο. Ενδεικτικά, μπορείτε να δοκιμάσετε:
◦ Να σβήσετε κάποιο ειδικό χαρακτήρα όπως τον ‘;’ στο τέλος κάθε εντολής, το
χαρακτήρα ‘,’ ανάμεσα στα ορίσματα των συναρτήσεων, τους χαρακτήρες ‘{’ ή ‘}’ που
σηματοδοτούν την αρχή και το τέλος του μπλοκ εντολών της main, τους ‘#’, ‘<’ ή ‘>’
στο #include κ.λ.π.
◦ Να γράψετε λανθασμένα (σβήνοντας χαρακτήρες ή εισάγοντας νέους ή αλλάζοντας
κάποιους) τα ονόματα των συναρτήσεων και τις δεσμευμένες λέξεις που
χρησιμοποιούνται όπως main, printf, scanf, return, int, float κ.λ.π.
◦ Να γράψετε σε κάποιο σημείο λανθασμένα το όνομα κάποιας μεταβλητής.
◦ Να σβήσετε το χαρακτήρα ‘&’ (τελεστής διεύθυνσης) μπροστά από το όνομα των
μεταβλητών που διαβάζετε με scanf. Αυτό είναι ένα πολύ συνηθισμένο λαθάκι που
κάνουμε όταν αναπτύσσουμε κώδικα. Επειδή δεν εντοπίζει συντακτικό σφάλμα ο
μεταφραστής δεν μπορούν εύκολα να το εντοπίσουν οι αρχάριοι. Συνήθως η
συμπεριφορά του προγράμματος όταν το εκτελέσουμε (εφόσον υπάρχει αυτό το λαθάκι)
είναι να σταματήσει η εκτέλεση αναπάντεχα (το πρόγραμμα “σκάει”). Εξοικειωθείτε με
αυτή τη συμπεριφορά και μάθετε να αναζητάτε αιτίες όπως η παράλειψη του τελεστή
διεύθυνσης σε scanf για να διορθώσετε τον κώδικά σας. Μελλοντικά θα δούμε και
άλλες περιπτώσεις λαθών που προκαλούν ανάλογη συμπεριφορά κατά την εκτέλεσή
των προγραμμάτων.
 Ζητήστε από κάποιον συμφοιτητή σας να καταστρέψει τον κώδικα που φτιάξατε χωρίς να
βλέπετε τι κάνει. Μετά προσπαθήστε να τον διορθώσετε. Κάντε κι εσείς το ίδιο με τον
κώδικα του συμφοιτητή σας. Μπορείτε να μετατρέψετε αυτή την άσκηση σε ένα
διασκεδαστικό παιχνίδι προσπαθώντας με τις λιγότερες δυνατές αλλαγές στον κώδικα ο
ένας του άλλου να δείτε ποιος βρίσκει ταχύτερα τα λάθη. Για περιπτώσεις λογικών λαθών
(δηλαδή σε περιπτώσεις όπου ο μεταφραστής δεν συναντά συντακτικά λάθη αλλά το
πρόγραμμα δεν εκτελείται σωστά) χρησιμοποιείστε τον debugger προκειμένου να τα
εντοπίσετε και να τα διορθώσετε πιο εύκολα.
 Δοκιμάστε να τρέξετε και να κάνετε ανάλογες “καταστροφές” των παραδειγμάτων κώδικα
που παρουσιάστηκαν κατά τη διάλεξη του μαθήματος.

6/6

Vous aimerez peut-être aussi