Vous êtes sur la page 1sur 9

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

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


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

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


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

A.1. Η εντολή for


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

for (απόδοση_αρχικής_τιμής; συνθήκη_ελέγχου_τερματισμού; έκφραση_αύξηση_τι μής ) {


  εντολή_1;
  εντολή_2;
  ...
  εντολή_Ν;
}

όπου αρχική τιμή, συνθήκη τερματισμού και αύξηση είναι εκφράσεις της C.

Όταν εκτελείται μία εντολή for ακολουθούνται τα εξής βήματα:

1. Υπολογίζεται και τίθεται η αρχική τιμή . Συνήθως είναι μια εντολή εκχώρησης, η οποία θέτει μία
μεταβλητή σε μία συγκεκριμένη τιμή.

2. Υπολογίζεται η συνθήκη ελέγχου τερματισμού . Εάν η συνθήκη είναι ψευδής, τερματίζεται η


εντολή for και η εκτέλεση συνεχίζει με την εντολή που ακολουθεί την εντολή for, διαφορετικά (αν
δηλαδή η συνθήκη τερματισμού είναι αληθής) εκτελείται το μπλοκ εντολών στο σώμα της for.

3. Εκτελείται η έκφραση αύξησης της τιμής και η εκτέλεση επιστρέφει στο βήμα 2

1/9
Σημείωση 1: Το μπλοκ εντολών στο σώμα της for μπορεί να αποτελείται από μία μόνο εντολή. Στην περίπτωση
αυτή αυτή τα άγκιστρα δεν είναι απαραίτητα.

Σημείωση 2: Το μπλοκ εντολών στο σώμα της for δεν εκτελείται καμία φορά εάν η συνθήκη τερματισμού είναι
ψευδής την πρώτη φορά που θα υπολογιστεί.

Σημείωση 3: Η εντολή for χρησιμοποιείται συνήθως όταν είναι γνωστός ή μπορεί να υπολογιστεί ο αριθμός των
επαναλήψεων που θέλουμε να εκτελεστούν.

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

#include <stdio.h>

int main() {
  int i;

  /* Εκτυπώνει τους αριθμούς 1 εώς 20 */
  for (i = 1; i <= 20; i++)
    printf("%d ", i);

  printf("\n");

  /* Εκτυπώνει τους αριθμούς 20 εώς 1 */
  for (i = 20; i > 0; i­­)
    printf("%d ", i);

  return 0;
}

Μια εντολή for μπορεί να εκτελεστεί μέσα σε μία άλλη εντολή for. Αυτό λέγεται εμφώλευση και μπορεί να
χρησιμοποιηθεί για την πραγματοποίηση πιο σύνθετων εργασιών. Το ακόλουθο παράδειγμα δεν επιτελεί κάποια
πολύπλοκη εργασία απλά δείχνει την εμφώλευση δύο εντολών for.

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

#include <stdio.h>

#define ROW_NUM 20
#define COLUMN_NUM 10

int main() {
  int row, column;
  char symbol = 'x';

  /* Εκτυπώνει ένα πίνακα 20 γραμμών και 10 στηλών  με το χαρακτήρα x */
  for ( row = 1; row <= ROW_NUM ; row++) {
    for ( column = 1; column <= COLUMN_NUM; column++) {
      printf("%c", symbol);
    }
    printf("\n");
  }

  return 0;
}

2/9
A.2. Η εντολή while
Η εντολή while, που λέγεται και βρόχος while, επιτρέπει την επαναλαμβανόμενη εκτέλεση μίας εντολής ή ένός
μπλοκ εντολών εφόσον παραμένει αληθής μία συγκεκριμένη συνθήκη. Η εντολή while έχει την εξής μορφή:

while (συνθήκη) {
  εντολή_1;
  εντολή_2;
  ...
  εντολή_Ν;
}

όπου, συνθήκη  είναι  οποιαδήποτε  έκφραση  της  C. Όταν εκτελείται μία εντολή while ακολουθούνται
τα εξής βήματα:

1. Υπολογίζεται η έκφραση συνθήκη

2. Εάν η συνθήκη είναι ψευδής, τερματίζεται η εντολή while και η εκτέλεση συνεχίζει με την εκτέλεση της
εντολής που έπεται της εντολή while

3. Εάν η συνθήκη είναι αληθής, εκτελείται το μπλοκ εντολών στο σώμα της while και η εκτέλεση
επιστρέφει στο βήμα 1

Σημείωση 4
Εάν η συνθήκη δεν είναι αληθής όταν εκτελεστεί για πρώτη φορά η εντολή while, δεν εκτελείται καμία φορά το
μπλοκ εντολών στο σώμα της while.

Σημείωση 5
Μία εντολή while είναι ουσιαστικά μία εντολή for, χωρίς τα συστατικά απόδοσης αρχικής τιμής και αύξησης. Έτσι,
η:

for (; συνθήκη_ελέγχου_τερματισμού ; )

είναι ισοδύναμη με την:

while (συνθήκη)

Λόγω αυτής της ισοδυναμίας, οτιδήποτε μπορεί να γίνει με μια εντολή for, μπορεί επίσης να γίνει και με μια
εντολή while. Όταν εκτελείται μια εντολή while, οποιαδήποτε αναγκαία απόδοση αρχικών τιμών πρέπει να
εκτελείται πρώτα, σε ξεχωριστή εντολή, και η ενημέρωση (της συνθήκης) πρέπει να εκτελείται από μια εντολή
που θα είναι μέρος του μπλοκ εντολών στο σώμα της while.

3/9
Παράδειγμα κώδικα 3:

#include <stdio.h>

int main() {
  int count;

  /* Εκτυπώνει τους αριθμούς 1 εώς 20 */
  count = 1;
  while (count <= 20) {
    printf("%d ", count);
    count++;
  }
  printf("\n");

  /* Εκτυπώνει τους αριθμούς 20 εώς 1 */
  count = 20;
  while (count > 0) {
    printf("%d ", count);
    count­­;
  }

  return 0;
}

Μια εντολή while μπορεί να εκτελεστεί μέσα σε μία άλλη εντολή while. Αυτό λέγεται εμφώλευση και μπορεί να
χρησιμοποιηθεί για την πραγματοποίηση πιο σύνθετων εργασιών. Το ακόλουθο παράδειγμα δεν επιτελεί κάποια
πολύπλοκη εργασία απλά δείχνει την εμφώλευση δύο εντολών while.

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

#include <stdio.h>

#define ROW_NUM 20
#define COLUMN_NUM 10

int main() {
  int row, column;
  char symbol = 'x';

  /* Εκτυπώνει ένα πίνακα 20 γραμμών και 10 στηλών  με το χαρακτήρα x */
  row = 1;
  while ( row <= ROW_NUM ) {
    column = 1;
    while ( column <= COLUMN_NUM ) {
      printf("%c", symbol);
      column++;
    }
    printf("\n");
    row++;
  }
  return 0;
}

4/9
A.3. Η εντολή do... while
Η τρίτη δομή βρόχου της C είναι ο βρόχος do...while, που εκτελεί μία εντολή ή ένα μπλοκ εντολών εφόσον είναι
αληθής μία καθορισμένη συνθήκη. Ο βρόχος do...while ελέγχει την συνθήκη στο τέλος κάθε βρόχου, κι όχι στην
αρχή, όπως κάνουν οι βρόχοι for και while. Η δομή του βρόχου do...while έχει ως εξής:

do {
  εντολή_1;
  εντολή_2;
  ...
  εντολή_Ν;
} while (συνθήκη);

όπου,   συνθήκη   είναι   οποιαδήποτε   έκφραση   της   C.   Όταν εκτελείται μία εντολή do...while
ακολουθούνται τα εξής βήματα:

1. Εκτελούνται οι εντολές του μπλοκ.


2. Υπολογίζεται η έκφραση συνθήκη
3. Εάν η συνθήκη είναι ψευδής, τερματίζεται η εντολή do...while και η εκτέλεση συνεχίζει με την εκτέλεση
της εντολής που έπεται της εντολή do...while
4. Εάν η συνθήκη είναι αληθής, η εκτέλεση επιστρέφει στο βήμα 1

Οι εντολές ενός βρόχου do...while εκτελούνται πάντοτε τουλάχιστον μία φορά. Αυτό συμβαίνει διότι η συνθήκη
ελέγχου υπολογίζεται στο τέλος και όχι στην αρχή του βρόχου. Αντιθέτως, οι βρόχοι for και while υπολογίζουν
τη συνθήκη ελέγχου στην αρχή του βρόχου και έτσι οι σχετικές εντολές δεν εκτελούνται καθόλου αν η συνθήκη
είναι αρχικά ψευδής.

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

#include <stdio.h>

int main() {
  int count;

  /* Εκτυπώνει τους αριθμούς 1 εώς 20 */
  count = 1;
  do  {
    printf("%d ", count);
    count++;
  } while (count <= 20);

  printf("\n");

  /* Εκτυπώνει τους αριθμούς 20 εώς 1 */
  count = 20;
  do {
    printf("%d ", count);
    count­­;
  } while (count > 0);

  return 0;
}

5/9
Παράδειγμα κώδικα 6:

#include <stdio.h>

int main() {
  int nbr;

  /* Δέχεται αριθμούς έως ότου ο αριθμός είναι μεγαλύτερος  από 99 */

  do  {
    printf("Give a interger greater than 99:");
    scanf("%d", &nbr);
  } while (nbr <= 99);

  return 0;
}

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

6/9
Εκφώνηση Εργαστηριακή Άσκησης
Το τρίγωνο του Floyd είναι ένα ορθογώνιο τρίγωνο φυσικών αριθμών που πήρε το όνομά του από τον Robert
Floyd. Ορίζεται συμπληρώνοντας τις γραμμές του τριγώνου με διαδοχικούς φυσικούς αριθμούς, αρχίζοντας με 1
στην επάνω αριστερή γωνία. Για τέσσερις γραμμές το τρίγωνο είναι:
1
2 3
4 5 6
7 8 9 10

Γράψτε ένα πρόγραμμα σε C το οποίο θα δέχεται ως είσοδο από το πληκτρολόγιο τον αριθμό των γραμμών του
τριγώνου και θα εκτυπώνει το κατάλληλο τρίγωνο του Floyd στην οθόνη.

Επεκτάσεις και ιδέες για περαιτέρω μελέτη

1. Τροποποιήστε το πρόγραμμα που κατασκευάσατε ώστε να εκτυπώνει το τρίγωνο στοιχισμένο από τα δεξιά:
      1
    2 3
  4 5 6
7 8 9 10

2. Τροποποιήστε το πρόγραμμα που κατασκευάσατε ώστε να εκτυπώνει σε μορφή ισοσκελούς τριγώνου:


   1
  2 3
 4 5 6
7 8 9 10

3. Μελετήστε πώς συμπεριφέρεται το αρχικό πρόγραμμα και οι επεκτάσεις που κάνατε στην περίπτωση που
ζητηθεί η εκτύπωση ενός μεγάλου τριγώνου το οποίο περιέχει μονοψήφιους, διψήφιους ίσως και τριψήφιους
αριθμούς. Προσπαθήστε να πετύχετε όσο πιο συμμετρική εκτύπωση μπορείτε. Δείτε ένα παράδειγμα για
ισοσκελές τρίγωνο:
           1
         2   3
       4   5   6
     7   8   9  10
  11  12  13  14  15
16  17  18  19  20  21

Στην επόμενη σελίδα ακολουθούν κάποιες προτάσεις για επεκτάσεις της 2ης
εργαστηριακής άσκησης (υπολογισμός Δείκτης Μάζας Σώματος) αξιοποιώντας την
ύλη του 3ου εργαστηρίου. Δείτε τις προτεινόμενες επεκτάσεις που ακολουθούν και
ως μια πρώτη προπόνηση για την πρώτη εξέταση του εργαστηρίου.

7/9
Επεκτάσεις και ιδέες για περαιτέρω μελέτη στη 2η εργαστηριακή άσκηση

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

1. Να μην τερματίζεται το πρόγραμμα όταν δίνεται κάποια μη έγκυρη τιμή αλλά να συνεχίζει η εκτέλεση μέχρις
ότου δοθεί έγκυρη τιμή. Επίσης, να μην τερματίζεται το πρόγραμμα μετά τον υπολογισμό του δείκτη μάζας
σώματος και την εκτύπωση των σχετικών μηνυμάτων αλλά να δίνεται η δυνατότητα εκ νέου εισαγωγής τιμών
και υπολογισμών εφόσον ζητηθεί. Για το λόγο αυτό, μετά την εκτύπωση των μηνυμάτων το πρόγραμμα θα ρωτά
“Run again? (y/n)”. Αν δοθεί η τιμή ‘y’ τότε θα ξεκινά νέος γύρος εισαγωγής τιμών, υπολογισμού και εκτύπωσης
μηνυμάτων. Αν δοθεί η τιμή ‘n’ θα τερματίζεται η εκτέλεση του προγράμματος. Η συμπεριφορά του
προγράμματος για την περίπτωση άλλων τιμών, αφήνεται στη διακριτική σας ευχέρεια.

2. Αντί να εισάγεται το βάρος και το ύψος ενός συγκεκριμένου ατόμου για να υπολογιστεί ο δείκτης μάζας
σώματός του, να δίνονται όρια τιμών βάρους και ύψους και να δημιουργείται ένας πίνακας τιμών του δείκτη
μάζας σώματος για όλους τους συνδυασμούς τιμών βάρους-ύψους που προκύπτουν. Θα χρειαστεί, εκτός από τα
όρια τιμών να δίνεται και ένα βήμα μεταβολής της τιμής του βάρους και του ύψους αντίστοιχα ώστε να
παράγονται οι ενδιάμεσες τιμές μεταξύ των δοθέντων ορίων κατά τη δημιουργία του πίνακα. Προσπαθήστε να
τυπώνετε τον πίνακα με όμορφο τρόπο, με τις τιμές στοιχισμένες κατά στήλες και γραμμές. Η πρώτη γραμμή του
πίνακα θα δείχνει τις δυνατές τιμές του ύψους ενώ η πρώτη από τα αριστερά στήλη τις δυνατές τιμές του
βάρους. Χρησιμοποιείστε ένα ορισμένο αριθμό δεκαδικών ψηφίων κατά την εκτύπωση ώστε ο πίνακας να είναι
ευανάγνωστος. Δείτε πώς περίπου μπορεί να συμπεριφέρεται το πρόγραμμα που θα κατασκευάσετε:

Enter minimum weight in kilograms: 70
Enter maximum weight in kilograms: 110 
Enter weight step in kilograms: 5  
Enter minimum height in meters: 1.5
Enter maximum height in meters: 2
Enter height step in meters: 0.1

        1.50  1.60  1.70  1.80  1.90  2.00
 70.00 31.11 27.34 24.22 21.60 19.39 17.50
 75.00 33.33 29.30 25.95 23.15 20.78 18.75
 80.00 35.56 31.25 27.68 24.69 22.16 20.00
 85.00 37.78 33.20 29.41 26.23 23.55 21.25
 90.00 40.00 35.16 31.14 27.78 24.93 22.50
 95.00 42.22 37.11 32.87 29.32 26.32 23.75
100.00 44.44 39.06 34.60 30.86 27.70 25.00
105.00 46.67 41.02 36.33 32.41 29.09 26.25
110.00 48.89 42.97 38.06 33.95 30.47 27.50

3. Επεκτείνετε περαιτέρω το προηγούμενο πρόγραμμα ώστε εκτός από τον πίνακα με τις τιμές του δείκτη μάζας
σώματος να τυπώνει και έναν δεύτερο πίνακα με το χαρακτηρισμό για κάθε συνδυασμό τιμών. Μπορείτε να
χρησιμοποιήσετε κάποια κωδικοποίηση των χαρακτηρισμών όπως:
 UNDR αντί Underweight
 NORM αντί Normal
 OVER αντί Overweight
 OBES αντί Obese

8/9
Δείτε και πάλι μια ενδεικτική συμπεριφορά που θα μπορούσε να έχει το πρόγραμμά σας:

Enter minimum weight in kilograms: 80
Enter maximum weight in kilograms: 100
Enter weight step in kilograms: 2
Enter minimum height in meters: 1.6
Enter maximum height in meters: 2.1
Enter height step in meters: 0.05

        1.60  1.65  1.70  1.75  1.80  1.85  1.90  1.95  2.00  2.05  2.10
 80.00 31.25 29.38 27.68 26.12 24.69 23.37 22.16 21.04 20.00 19.04 18.14
 82.00 32.03 30.12 28.37 26.78 25.31 23.96 22.71 21.56 20.50 19.51 18.59
 84.00 32.81 30.85 29.07 27.43 25.93 24.54 23.27 22.09 21.00 19.99 19.05
 86.00 33.59 31.59 29.76 28.08 26.54 25.13 23.82 22.62 21.50 20.46 19.50
 88.00 34.37 32.32 30.45 28.73 27.16 25.71 24.38 23.14 22.00 20.94 19.95
 90.00 35.16 33.06 31.14 29.39 27.78 26.30 24.93 23.67 22.50 21.42 20.41
 92.00 35.94 33.79 31.83 30.04 28.40 26.88 25.48 24.19 23.00 21.89 20.86
 94.00 36.72 34.53 32.53 30.69 29.01 27.47 26.04 24.72 23.50 22.37 21.32
 96.00 37.50 35.26 33.22 31.35 29.63 28.05 26.59 25.25 24.00 22.84 21.77
 98.00 38.28 36.00 33.91 32.00 30.25 28.63 27.15 25.77 24.50 23.32 22.22
100.00 39.06 36.73 34.60 32.65 30.86 29.22 27.70 26.30 25.00 23.80 22.68

        1.60  1.65  1.70  1.75  1.80  1.85  1.90  1.95  2.00  2.05  2.10
 80.00 OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM  NORM  UNDR  UNDR 
 82.00 OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM  UNDR  UNDR 
 84.00 OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM  UNDR  UNDR 
 86.00 OBES  OBES  OVER  OVER  OVER  OVER  NORM  NORM  NORM  NORM  UNDR 
 88.00 OBES  OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM  UNDR 
 90.00 OBES  OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM  NORM 
 92.00 OBES  OBES  OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM 
 94.00 OBES  OBES  OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM  NORM 
 96.00 OBES  OBES  OBES  OBES  OVER  OVER  OVER  OVER  NORM  NORM  NORM 
 98.00 OBES  OBES  OBES  OBES  OBES  OVER  OVER  OVER  NORM  NORM  NORM 
100.00 OBES  OBES  OBES  OBES  OBES  OVER  OVER  OVER  OVER  NORM  NORM

9/9

Vous aimerez peut-être aussi