2ο σετ σημειώσεων. 1 Εντολές εκτέλεσης υπό συνθήκη. 19 Μαρτίου 2012

Σχετικά έγγραφα
Εντολές ελέγχου ροής if, for, while, do-while

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

Σημειώσεις για πρόοδο στο εργαστήριο

5ο σετ σημειώσεων - Δείκτες

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Οι εντολές ελέγχου της ροής ενός προγράμματος.

Υπολογισμός - Εντολές Επανάληψης

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Η γλώσσα προγραμματισμού C

Ψευδοκώδικας. November 7, 2011

Pascal, απλοί τύποι, τελεστές και εκφράσεις

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Η γλώσσα προγραμματισμού C

4. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Α' μέρος: for)

Προγραμματισμός Ι (HY120)

ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διαδικασιακός Προγραμματισμός

Η γλώσσα προγραμματισμού C

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 3η Διάλεξη Είσοδος Δεδομένων Συνθήκες Βρόχοι Παραδείγματα

Εισαγωγή στον Προγραμματισμό

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Η γλώσσα προγραμματισμού C

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

Ανάπτυξη και Σχεδίαση Λογισμικού

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

ΗΥ-150. Προγραμματισμός

Στόχοι και αντικείμενο ενότητας. Προτάσεις επανάληψης. Έλεγχος ροής προγράμματος. #5.. Εντολές Επανάληψης

Δομημένος Προγραμματισμός

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Εντολές Επανάληψης. int sum = 0, i=1; sum += i++ ; sum += i++ ; Η πράξη αυτή θα πρέπει να επαναληφθεί Ν φορές!

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Pascal. 1 Γλώσσες προγραμματισμού. 21 Οκτωβρίου 2011

Συμβολοσειρές. 1 Συμβολοσειρές. 6 Απριλίου 2014

Μεταβλητές τύπου χαρακτήρα

Pascal. 15 Νοεμβρίου 2011

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Δομές Ανακυκλώσεων. Εντολές ελέγχου - 1

Δομημένος Προγραμματισμός (ΤΛ1006)

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΗΥ-150. Προγραμματισμός

Διαδικαστικός Προγραμματισμός

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

for for for for( . */

Προγραμματισμός Ι (ΗΥ120)

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι (ΗΥ120)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

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

Ο πιο κάτω πίνακας περιγράφει σε ποιες περιπτώσεις χρησιμοποιούμε τους τρεις πιο πάνω τρόπους:

Κεφάλαιο : Επαναλήψεις (oι βρόγχοιfor, do-while) (Διάλεξη 10) Εντολές Επανάληψης που θα καλυφθούν σήμερα

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στην πληροφορική

Ο βρόχος for Η εντολή for χρησιμοποιείται για τη δημιουργία επαναληπτικών βρόχων στη C

Προγραμματισμός Ι (ΗΥ120)

Η ΔΟΜΗ ΕΠΑΝΑΛΗΨΗΣ Εντολές Επανάληψης REPEAT UNTIL, FOR, WHILE

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

5. ΒΡΟΧΟΙ ΕΠΑΝΑΛΗΨΗΣ (Β' μέρος: while - do..while)

Γλώσσα Προγραμματισμού C

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Διαδικασιακός Προγραμματισμός

9. Εντολές επανάληψηςκαι η εντολή

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες.

Γλώσσα Προγραμματισμού C. Προγραμματισμός HY: Γλώσσα Προγραμματισμού C. Γρήγορος Πίνακας Αναφοράς Σύνταξης. Εισήγηση #4. Επαναληπτικές δομές:

Προγραμματισμός Η/Υ (ΤΛ2007 )

Εισαγωγή στη γλώσσα προγραμματισμού C++

ΑΣΚΗΣΗ 7: ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Κεφάλαιο : Επαναλήψεις (for, do-while)

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Εισαγωγή στον Προγραμματισμό με C++

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διαδικασιακός Προγραμματισμός

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 2 Εντολές Εισόδου/Εξόδου Τελεστές. Δρ. Γιώργος Λαμπρινίδης 23/10/2015 Η - Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Διαδικασιακός Προγραμματισμός

Υπολογισμός - Συλλογή Δεδομένων - Πίνακες

Η γλώσσα προγραμματισμού C

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

Διάλεξη 5η: Εντολές Επανάληψης

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Transcript:

ο σετ σημειώσεων 19 Μαρτίου 01 1 Εντολές εκτέλεσης υπό συνθήκη Μπορούμε να εκτελέσουμε εντολές της γλώσσας σε περίπτωση που κάποια συνθήκη ισχύει χρησιμοποιώντας την εντολή if. Συντάσσεται ως εξής: 1 if ( condition) command; ή 1 if ( condition) { 3 command_1; 4 command_; 5... command_n; 7 } Και στις δύο περιπτώσεις την if ακολουθεί μία συνθήκη (condition) κλεισμένη μέσα σε παρενθέσεις. Αν η συνθήκη ισχύει τότε εκτελείται είτε η μία εντολή (command) που ακολουθεί όπως στην πρώτη περίπτωση είτε μία σειρά εντολών κλεισμένες μέσα σε άγκιστρα όπως στη δεύτερη περίπτωση. Τα άγκιστρα και οι εντολές που περικλείονται μέσα σε αυτά είναι συντακτικά ισοδύναμα με μία και μόνο εντολή. Τέτοιες ομάδες εντολών κλεισμένες μέσα σε άγκιστρα ονομάζονται μπλοκ (block) εντολών. Προφανώς η πρώτη μορφή της if είναι νόμιμη εντολή αλλά είναι καλή πρακτική να αποφεύγεται και να χρησιμοποιείται η δεύτερη μορφή με τα άγκιστρα ακόμα και στις περιπτώσεις που πρόκειται να εκτελεστεί μία και μόνο εντολή. Η συνθήκη (condition) μπορεί να είναι οποιαδήποτε λογική έκφραση δηλαδή μια έκφραση που μπορεί να αποτιμηθεί ως αληθής ή ψευδής. Για παράδειγμα μπορεί να είναι ένας συσχετιστικός τελεστής με δύο ορίσματα όπως a > b, a+1 <= b*, b*b - 4*a*c >= 0 κτλ. Θυμηθείτε ότι εκφράσεις όπως τις προηγούμενες μπορούμε να τις συνδυάσουμε χρησιμοποιώντας λογικούς τελεστές όπως ο ΚΑΙ (&&), ο Η ( ) και η λογική άρνηση (!), π.χ. γράφοντας (a > b) && (a == 3*c), (a+1 <= b*) (5*x*x >.4). Στην πραγματικότητα η C θεωρεί τις λογικές εκφράσεις που αναφέραμε παραπάνω ως εκφράσεις που έχουν την τιμή 1 αν είναι αληθείς ή την τιμή 0 αν είναι ψευδείς. Και τελικά, εκτελεί τις εντολές που 1

ακολουθούν το if αν η έκφραση που βρίσκεται μέσα στις παρενθέσεις είναι μη-μηδενική (αληθής) ενώ δεν τις εκτελεί αν είναι ίση με το μηδέν (ψευδής). Μία δεύτερη μορφή εκτέλεσης εντολών υπό συνθήκη είναι το σχήμα if-else που συντάσσεται όπως παρακάτω: 1 if ( condition) { 3 commands_1; 4 } 5 else { commands_; 7 } Σε αυτήν τη μορφή, αποτιμάται η συνθήκη condition και αν είναι αληθής εκτελείται το μπλοκ εντολών commands_1. Αν δεν είναι, τότε εκτελούνται οι εντολές commands_¹. Παράδειγμα Το πρόγραμμα 1 ζητάει από το χρήστη να δώσει την ηλικία του στο πληκτρολόγιο. Αν η ηλικία του είναι μεγαλύτερη ή ίση από 18 τυπώνει ένα μήνυμα που του λέει ότι έχει δικαίωμα ψήφου, αλλιώς ότι δεν έχει. Listing 1: Παράδειγμα if-else 5 int age; 7 printf(" Dose tnv nlikia sou: "); 8 scanf("%d", &age); 9 10 if (age >= 18) 11 printf(" Exeis dikaiwma psnfou\n"); 1 else 13 printf(" Dev exeis dikaiwma psnfou\n"); 14 15 return 0; 1 } Eντολές επανάληψης Η C μας δίνει τη δυνατότητα να πραγματοποιήσουμε επαναλήψεις με τρεις διαφορετικούς τρόπους: Τους βρόχους for, while και do-while. ¹Στο παράδειγμα αναφέρεται μόνο μία εντολή αλλά όπως είπαμε και παραπάνω σε ένα μπλοκ μπορούν να βρίσκονται οσεσδήποτε. Επίσης μπορούμε να παραλείψουμε τα άγκιστρα στην περίπτωση που θέλουμε να εκτελεστεί μόνο μία εντολή αλλά αυτό δεν είναι καλή πρακτική.

.1 Βρόχος for Η εντολή επανάληψης for συντάσσεται όπως παρακάτω: 1 for ( ic; cond; step) { commands... } ic Είναι μία εντολή η οποία αρχικοποιεί το βρόχο. Εκτελείται μία και μόνο φορά πριν ξεκινήσουν οι επαναλήψεις. cond Μία συνθήκη η οποία αποτιμάται μία φορά πριν από κάθε επανάληψη. Αν είναι ψευδής τότε διακόπτονται οι επαναλήψεις. Αν είναι αληθής πραγματοποιείται η επόμενη επανάληψη. step Μία εντολή που εκτελείται στο τέλος κάθε επανάληψης. commands Είναι οι εντολές που εκτελούνται σε κάθε επανάληψη. Συγκροτούν το σώμα (body) του βρόχου. Αν οι εντολές που απαρτίζουν το σώμα του βρόχου δεν είναι περισσότερες από μία τότε δεν είναι απαραίτητο να βρίσκονται σε ένα μπλοκ με άγκιστρα όπως παραπάνω αλλά είναι καλή πρακτική να μπαίνουν. Η διαδικασία εκτέλεσης του βρόχου είναι η εξής: 1. Εκτελείται η εντολή ic.. Αποτιμάται η συνθήκη cond. Αν είναι αληθής τότε η εκτέλεση συνεχίζεται στο βήμα 3. Αλλιώς στο βήμα 5. 3. Εκτελούνται οι εντολές (ή εντολή) που συγκροτούν το σώμα του βρόχου. 4. Εκτελείται η εντολή step και η διαδικασία συνεχίζεται στο βήμα. 5. Ο βρόχος τερματίζεται και το πρόγραμμα συνεχίζει με την επόμενη εντολή. Γενικά, χρησιμοποιούμε το βρόχο for για να πραγματοποιήσουμε επαναλήψεις των οποίων τον αριθμό ξέρουμε από τα πριν, όταν δηλαδή ξέρουμε εκ των προτέρων ότι θέλουμε να πραγματοποιηθεί συγκεκριμένος αριθμός επαναλήψεων σε κάθε μία από τις οποίες κάποια μεταβλητή θα πάρει συγκεκριμένες τιμές. Όμως, ένα ενδιαφέρον σημείο σχετικά με το βρόχο for είναι ότι η αρχική εντολή, η συνθήκη και το βήμα είναι προαιρετικά. Μπορεί δηλαδή κανείς να γράψει αυτό: for (i=0; i<10; ++i) ως εξής: i=0; for (; i<10; ++i). Επίσης θα μπορούσε κάλλιστα να βγάλει το ++i και να το τοποθετήσει τελευταίο στο σώμα του βρόχου. Οι εντολές που θα εκτελούνταν θα ήταν οι ίδιες με την ίδια σειρά και στις δύο περιπτώσεις. Δείτε σχετικά το τελευταίο παράδειγμα της επόμενης ενότητας. 3

.1.1 Παραδείγματα 1. Το πρόγραμμα τυπώνει σε μία γραμμή χωρισμένους με ένα κενό τους αριθμούς από το ένα μέχρι και το 10. Η εντολή ++i στο τέλος της γραμμής 7 αυξάνει το i κατά ένα πριν από κάθε επανάληψη του βρόχου. Αντί για αυτήν θα μπορούσε να χρησιμοποιηθεί ο μεταθεματικός τελεστής μοναδιαίας αύξησης i++ ή ακόμα και η φλύαρη i = i + 1. Listing : for από ένα έως και 10 5 int i; 7 for (i = 1; i <= 10; ++i) 8 printf("%d ", i); 9 10 return 0; 11 }. Αν στο παράδειγμα αντικαταστήσουμε τη for των γραμμών 7 και 8 με τις γραμμές που φαίνονται στη λίστα 3 τότε το πρόγραμμα θα τυπώσει σε διαφορετικές γραμμές τους ζυγούς αριθμούς από το 10 μέχρι και το (σε αντίστροφη σειρά). Η εντολή i-= είναι ισοδύναμη με την i = i -. Παρατηρήστε την παράξενη συνθήκη τερματισμού η οποία είναι απλώς το i. Θυμηθείτε ότι η C θεωρεί ότι μία αριθμητική έκφραση στη θέση μιας λογικής συνθήκης είναι αληθής αν είναι διάφορη του μηδενός και ψευδής αν είναι μηδέν. Στο παράδειγμά μας λοιπόν όσο το i είναι διαφορετικό από το μηδέν, η συνθήκη i είναι αληθής οπότε ο βρόχος συνεχίζεται. Όταν τελικά η i γίνει ίση με μηδέν, η συνθήκη θεωρείται ψευδής και ο βρόχος τερματίζεται ². 1 for (i = 10; i; i -= ) printf("%d\n", i); Listing 3: for με ζυγούς σε αντίστροφη σειρά 3. Δεν υπάρχει κανένας περιορισμός σχετικά με το ποιες εντολές απαρτίζουν το σώμα ενός βρόχου-for. Μπορεί να είναι μία άλλη εντολή for. Το πρόγραμμα 4 χρησιμοποιεί δύο for για να τυπώσει ένα αριθμητικό τρίγωνο. Listing 4: Αριθμητικό τρίγωνο ²Θα μπορούσαμε να χρησιμοποιήσουμε αυτό το γλωσσικό ιδίωμα για να τυπώσουμε τους περιττούς αριθμούς 9, 7, 5, 3, 1; 4

5 int i, j; 7 for (i = 1; i <= 5; ++i) { 8 for (j = 1; j <= i; ++j) 9 printf("%d", i); 10 printf("\n"); 11 } 1 13 return 0; 14 } 4. Το παράδειγμα 5 ζητάει από το χρήστη να δώσει μία μη-μηδενική τιμή στη μεταβλητή a. Αν ο χρήστης δώσει μηδενική τιμή τότε ο βρόχος επαναλαμβάνεται. Αυτό συνεχίζεται μέχρι ο χρήστης να δώσει μία μη-μηδενική τιμή. Παρατηρήστε ότι δεν γνωρίζουμε πόσες φορές θα επαναληφθεί ο βρόχος. Ίσως ο χρήστης δώσει με την πρώτη μία μη-μηδενική τιμή, ίσως πάλι όχι. Παρατηρήστε και τη συνθήκη επανάληψης!a. Θυμηθείτε ότι αν η a έχει μη-μηδενική τιμή, τότε ως λογική έκφραση θεωρείται αληθής. Ο τελεστής! είναι ο τελεστής λογικής άρνησης ο οποίος αν εφαρμοστεί σε μία έκφραση η οποία έχει την τιμή αληθής δίνει το αποτέλεσμα ψευδής και αντίστροφα. Άρα, αν η a είναι μηδέν δηλαδή ως λογική έκφραση ψευδής, τότε η!a είναι αληθής. Οπότε ο βρόχος επαναλαμβάνεται όσο η a παραμένει μηδέν, δηλαδή μέχρι ο χρήστης να δώσει μία μη-μηδενική τιμή. Επίσης παρατηρήστε ότι εφόσον η συνθήκη ελέγχεται πριν εκτελεστεί η πρώτη επανάληψη, δεν μπορούμε να ξέρουμε τι τιμή θα έχει η!a δεδομένοου ότι ο χρήστης δεν θα την έχει δώσει ακόμα από το πληκτρολόγιο. Οπότε στο σημείο αρχικοποίησης θέτουμε a=0 ώστε να εξασφαλίσουμε ότι αρχικά η συνθήκη!a θα είναι αληθής και θα πραγματοποιηθεί η πρώτη έστω επανάληψη του βρόχου. Η χρήση του βρόχου for με αυτόν τον τρόπο δεν είναι η συνηθισμένη. Θυμίζουμε ότι συνήθως ο βρόχος for χρησιμοποιείται όταν ο αριθμός των επαναλήψεων είναι λίγο-πολύ γνωστός. Σε περιπτώση σαν αυτήν του παραδείγματος χρησιμοποιούμε βρόχους while ή do-while. Listing 5: Η for λίγο διαφορετική 5 int a; 7 for (a=0;!a; ) { 8 printf(" Dose mia mn- mndevikn timn: "); 9 scanf("%d", &a); 10 } 11 1 return 0; 13 } 5

. Βρόχος while Ο βρόχος while εκτελεί κάποιες εντολές (ή εντολή) όσο ισχύει μία συνθήκη. Η σύνταξη της εντολής while είναι όπως παρακάτω: 1 while ( condition) { commands 3 } Η condition είναι μία συνθήκη και οι commands είναι ένα μπλοκ εντολών (θα μπορούσε να είναι και μία εντολή χωρίς άγκιστρα). Η διαδικασία εκτέλεσης του βρόχου είναι η εξής: 1. Αποτιμάται η συνθήκη condition. Αν είναι αληθής η εκτέλεση συνεχίζεται στο βήμα. Αλλιώς στο βήμα 3.. Εκτελούνται οι εντολές (ή εντολή) που αποτελούν το σώμα του βρόχου. Η ροή εκτέλεσης μεταφέρεται πάλι στο βήμα 1. 3. Ο βρόχος τερματίζεται. Η εκτέλεση του προγράμματος συνεχίζεται με την επόμενη εντολή. Ο βρόχος while χρησιμοποιείται όταν θέλουμε να εκτελεστούν κάποιες επαναλήψεις αλλά δεν γνωρίζουμε εκ των προτέρων πόσες. Γνωρίζουμε όμως κάτω από ποιες συνθήκες θα πρέπει να συνεχίζονται οι επαναλήψεις. Καλό είναι να προσέξει κανείς ότι πρώτα αποτιμάται η συνθήκη και μετά εκτελείται το σώμα της κάθε επανάληψης οπότε είναι πιθανό (αν η συνθήκη είναι αρχικά ψευδής) οι επαναλήψεις να μην πραγματοποιηθουν καθόλου...1 Παραδείγματα 1. Το πρόγραμμα αθροίζει αριθμούς που δίνει ο χρήστης στο πληκτρολόγιο μέχρι το άθροισμά τους να ξεπεράσει ένα συγκεκριμένο όριο. Listing : Βρόχος while για άθροισμα 5 int limit, sum, a; 7 printf("dose to orio: "); 8 scanf("%d", &limit); 9 10 sum = 0; 11 while (sum < limit) { 1 printf(" A8roisma %d. Dwse evav ari8mo: ", sum); 13 scanf("%d", &a); 14 sum += a; 15 } 1

17 return 0; 18 }.3 Βρόχος do-while Η βρόχος do-while είναι αντίστοιχος με το βρόχο repeat-until άλλων γλωσσών. Αποτελείται όπως και ο βρόχος while από ένα σώμα εντολών αλλά σε αυτήν την περίπτωση η συνθήκη ελέγχεται μετά την πραγματοποίηση της πρώτης επανάληψης. Συντάσσεται όπως παρακάτω: 1 do { commands 3 } while ( condition); Η ροή εκτέλεσης είναι η εξής: Αρχικά εκτελούνται οι εντολές στο σώμα του βρόχου (commands). Στη συνέχεια αποτιμάται η συνθήκη condition. Αν είναι αληθής τότε η ροή εκτέλεσης μεταφέρεται πάλι στην πρώτη γραμμή και η διαδικασία επαναλαμβάνεται. Αλλιώς, αν είναι ψευδής, δεν πραγματοποιείται άλλη επανάληψη. Η διαφορά που έχει αυτός ο τύπος επανάληψης από τον προηγούμενο είναι ότι σε αυτήν την περίπτωση η συνθήκη ελέγχεται για πρώτη φορά μετά την πραγματοποίηση της πρώτης επανάληψης δηλαδή σε κάθε περίπτωση, ακόμα και αν η συνθήκη είναι αρχικά ψευδής, πραγματοποιείται τουλάχιστον μία επανάληψη..3.1 Παραδείγματα 1. Το πρόγραμμα7 ζητάει από το χρήστη έναν αριθμό από το 5 μέχρι το 0. Αν ο χρήστης δώσει αριθμό έξω από αυτά τα όρια, τότε ξαναζητάει τον αριθμό και η διαδικασία επαναλαμβάνεται μέχρι ο αριθμός να είναι νόμιμος. Το παρακάτω είναι ένας συνηθισμένος τρόπος να ελέγξει κανείς ώστε κάποια τιμή που δίνεται από το χρήστη είναι μέσα σε νόμιμα όρια. Παρατηρήστε τον τρόπο που λειτουργεί η συνθήκη της while. Η συνθήκη (a>=5 && a<=0) ισχύει όταν η τιμή που έδωσε ο χρήστης είναι μέσα στα ορισμένα όρια. Το ζητούμενο όμως είναι να πραγματοποιείται επανάληψη της διαδικασίας όταν ο αριθμός είναι έξω από αυτά τα όρια δηλαδή όταν ισχύει η αντίθετη από την παραπάνω συνθήκη. Για να δηλώσουμε αυτό χρησιμοποιούμε τον τελεστή λογικής άρνησης!. 5 int a; 7 do { Listing 7: Επαναλήψεις για έλεγχο εισόδου 8 printf(" Dose evav ari8mo apo to 5 mexri to 0: "); 9 scanf("%d", &a); 10 } while (!(a>=5 && a<=0)); 11 7

1 return 0; 13 }.4 Εντολές break και continue Οι εντολές break και continue δίνουν τη δυνατότητα να τροποποιήσουμε τη φυσιολογική ροή εντολών ενός βρόχου. Η break τερματίζει άμεσα την εκτέλεση των εντολών του βρόχου ενώ η continue διακόπτει την τρέχουσα επανάληψη και προχωράει στην επόμενη. Για παράδειγμα ο παρακάτω βρόχος εκτελείται πέντε φορές και όχι δέκα όπως θα γινόταν αν δεν υπήρχε η break. Στην έκτη επανάληψη, όταν η μεταβλητή i γίνεται ίση με πέντε, η συνθήκη της if στη γραμμή 3 ισχύει και έτσι εκτελείται η break η οποία τερματίζει τις επαναλήψεις του βρόχου και συνεχίζει με όποιες εντολές βρίσκονται μετά τη γραμμή. 1 for (i=0; i <=10; ++i) { printf("a: %d\n", i); 3 if (i >= 5) 4 break; 5 printf("b: %d\n", i); } Με τον ίδιο προφανή τρόπο συμπεριφέρεται η break και στις επαναλήψεις τύπου while ή do-while. Η εντολή continue τερματίζει την τρέχουσα επανάληψη και συνεχίζει με την επόμενη. Αν αντικαταστήσουμε δηλαδή την break στο προηγούμενο παράδειγμα με την continue το αποτέλεσμα θα είναι ότι για τις πρώτες πέντε επαναλήψεις θα εκτελούνται και οι δύο printf που βρίσκονται στις γραμμές και 5. Από την έκτη όμως και στη συνέχεια καθώς η μεταβλητή i θα είναι ίση ή μεγαλύτερη από πέντε θα εκτελείται η continue της γραμμής 4. Όποτε γίνεται αυτό, ο ροή εκτέλεσης από τη γραμμή 4 θα μεταφέρεται πάλι στη γραμμή 1, δηλαδή δεν θα εκτελείται η γραμμή 5..4.1 Παραδείγματα Το παράδειγμα 8 ελέγχει αν ένας αριθμός τον οποίο δίνει ο χρήστης στο πληκτρολόγιο είναι πρώτος ή όχι. Θυμίζουμε ότι ένας αριθμός είναι πρώτος αν διαιρείται μόνο από τη μονάδα και τον ευατό του. Η λογική είναι ότι μέσα από ένα βρόχο δοκιμάζονται διάφοροι πιθανοί διαιρέτες. Αν στην τρέχουσα επανάληψη ο πιθανός διαιρέτης δεν διαιρεί τον εν λόγω αριθμό τότε δοκιμάζεται ο επόμενος. Αν όμως ο πιθανός διαιρέτης διαιρεί τον εν λόγω αριθμό τότε δεν υπάρχει λόγος να συνεχιστούν οι επαναλήψεις οπότε ο βρόχος διακόπτεται με την break. Listing 8: Πρώτος αριθμός 5 int a, i; 7 printf(" Dose ton ari8mo: "); 8

8 scanf("%d", &a); 9 10 for (i = ; i < a; ++i) { 11 if (!(a%i)) 1 break; 13 } 14 15 if (i == a) 1 printf("o ari8mos eivai prwtos\n"); 17 else 18 printf("o ari8mos dev eivai prwtos\n"); 19 0 return 0; 1 } 3 Πίνακες Είδαμε ότι δηλώνοντας μία μεταβλητή κάποιου τύπου δεσμεύεται μνήμη επαρκής σε μέγεθος προκειμένου να αναπαρασταθεί μία τιμή του συγκεκριμένου τύπου. Στην περίπτωση που θέλουμε περισσότερες από μία τέτοιες μεταβλητές χρησιμοποιούμε πίνακες (arrays). Σε αυτήν την περίπτωση το όνομα του δηλωμένου πίνακα αναφέρεται σε ολόκληρη την περιοχή μνήμης ³ που έχει δεσμευθεί και προκειμένου να προσπελάσουμε κάποια από τις επιμέρους μεταβλητές χρησιμοποιούμε αγκύλες (braces) και τον αύξοντα αριθμό της μεταβλητής μέσα σε αυτές. Η δήλωση ενός πίνακα είναι όπως και η δήλωση μίας μεταβλητής με τη διαφορά ότι το όνομα του πίνακα ακολουθείται από τις αγκύλες και μέσα σε αυτές βρίσκεται ο αριθμός των μεταβλητών του πίνακα. Π.χ. οι παρακάτω δηλώσεις 1 int a[0]; float b[10]; 3 char c[100]; δηλώνουν αντίστοιχα έναν πίνακα 0 ακεραίων με όνομα a, έναν πίνακα 10 αριθμών κινητής υποδιαστολής με όνομα b και έναν πίνακα 100 χαρακτήρων με όνομα c. Αφού δηλωθεί ένας πίνακας, μπορούμε να αναφερθούμε στα επιμέρους στοιχεία του όπως κάνουμε και με τις απλές μεταβλητές. Γράφοντας δηλαδή το όνομα του πίνακα και έναν ακέραιο αριθμό n μέσα σε αγκύλες αμέσως μετά, αναφερόμαστε στο n-οστό στοιχείο του πίνακα. Στη C το πρώτο στοιχείο του πίνακα έχει πάντα τον αύξοντα αριθμό μηδέν. Δηλαδή στα προηγούμενα παραδείγματα τα στοιχεία του πίνακα a έχουν αύξοντες αριθμούς από 0 έως 19, του b από 0 έως 9 και του c από 0 έως 99. Όπως και στην περίπτωση των απλών μεταβλητών, η αναφορά σε ένα στοιχείο κάποιου πίνακα μπορεί να είναι για ανάγνωση ή για εγγραφή ανάλογα με τα συμφραζόμενα της εκτελούμενης εντολής. Π.χ. όταν λέμε a[] + 5 η μηχανή διαβάζει τα περιεχόμενα της υπ αριθμόν ³Για την ακρίβεια είναι η διεύθυνση μνήμης της περιοχής που έχει δεσμευθεί οπότε μπορούμε με αυτό το όνομα να αναφερθούμε στην πρώτη από τις θέσεις μνήμης που έχουν δεσμευθεί. Περισσότερα θα δούμε στην ενότητα για τους δείκτες. 9

θέσης του πίνακα a και τους προσθέτει τον αριθμό 5. Το αποτέλεσμα αποθηκεύεται σε μια θέση μνήμης προσωρινής αποθήκευσης χωρίς να μεταβάλλεται το περιεχόμενο της a[]. Όταν λέμε a[]++ η μηχανή αυξάνει τα περιεχόμενα της θέσης του πίνακα a κατά μία μονάδα και όταν λέμε a[] = 1 η μηχανή αποθηκεύει την τιμή 1 στη θέση του πίνακα. Είναι σημαντικό να γνωρίζει κανείς ότι η γλώσσα δεν απαγορεύει την προσπέλαση στοιχείων του πίνακα εκτός των ορίων που έχουν δηλωθεί. Δηλαδή στον πίνακα a του προηγούμενου παραδείγματος δεν απαγορεύεται να γράψει κανείς a[4] = 5; παρόλο που ο πίνακας έχει μόνο 0 στοιχεία. Αυτό είναι μειονέκτημα της γλώσσας καθώς ο προγραμματιστής δεν προστατεύεται από λάθη τα οποία θα μπορούσε να εντοπίσει ο ίδιος ο υπολογιστής είτε κατά τξ διάρκεια της μεταγλώττισης είτε κατά τη διάρκεια της εκτέλεσης. Χρειάζεται ιδιαίτερη προσοχή για να αποφεύγονται οι προσπελάσεις στοιχείων του πίνακα έξω από τα όρια. 3.1 Παραδείγματα Το παράδειγμα 9 γεμίζει ένα πίνακα 10 στοιχείων με τυχαίους αριθμούς από το 0 μέχρι και το 19 τους οποίους και τυπώνει. Στη συνέχεια βρίσκει τον μικρότερο από αυτούς και τον τυπώνει. Στις γραμμές 11 έως 1 μπαίνυν τυχαία στοιχεία στον πίνακα και στις γραμμές 18 έως 1 υλοποιείται ο γνωστός αλγόριθμος εύρεσης μικρότερου στοιχείου. # include <stdlib.h> 3 # include <time.h> Listing 9: Μικρότερο στοιχείο πίνακα 4 5 int main() { 7 int i; 8 int a[10]; 9 int mikr; 10 11 srand(time(null)); 1 for (i=0; i <=10; ++i) { 13 a[i] = rand() % 0; 14 printf("%d ", a[i]); 15 } 1 printf("\n"); 17 18 mikr = a[0]; 19 for (i=1; i <=10; ++i) 0 if (a[i] < mikr) 1 mikr = a[i]; 3 printf(" To mikrotero stoixeio eivai to %d\n", mikr); 4 5 return 0; 10

} Μια ειδική περίπτωση χρήσης των πινάκων είναι η αναπαράσταση κειμένων. Στη μνήμη του υπολογιστή οι χαρακτήρες του κειμένου αποθηκεύονται σε διαδοχικές θέσεις μνήμης και για αυτόν τον σκοπό μπορούν να χρησιμοποιηθούν πίνακες. Σε αυτήν την περίπτωση μιλάμε για συμβολοσειρές (strings). Βέβαια δεν αρκεί να αποθηκευτούν οι χαρακτήρες σε μια περιοχή μνήμης, αλλά πρέπει να γνωρίζουμε και το πλήθος των χαρακτήρων του κειμένου που αποθηκεύεται. Στη C δεν αποθηκεύεται το μήκος της συμβολοσειράς αλλά μετά το τέλος των χαρακτήρων που απαρτίζουν το κείμενο αποθηκεύεται ένας ειδικός χαρακτήρας που σηματοδοτεί το τέλος του κειμένου και είναι ο χαρακτήρας '\0' ο οποίος έχει την τιμή μηδέν. Στο παράδειγμα 10 δημιουργείται μία συμβολοσειρά με το χέρι, τοποθετώντας κάποιους χαρακτήρες σε έναν πίνακα χαρακτήρων και στη συνέχεια αποθηκεύεται ο ειδικός χαρακτήρας τερματισμού. Τελικά η συμβολοσειρά τυπώνεται στην οθόνη. Θα μπορούσε κανείς, επίσης με το χέρι, να τυπώσει έναν προς έναν τους χαρακτήρες μίας συμβολοσειράς αλλά καθώς η εκτύπωση συμβολοσειρών είναι συνηθισμένη στον προγραμματισμό, η printf χρησιμοποιεί τον προσδιοριστή %s για την εκτύπωση συμβολοσειρών. Σε αυτήν την περίπτωση η printf όταν εντοπίσει το χαρακτήρα τερματισμού σταματάει την εκτύπωση άλλων χαρακτήρων. Listing 10: Μια συμβολοσειρά 5 char p[100]; 7 p[0] = 'H'; p[1] = 'e'; p[] = 'l'; 8 p[3] = 'l'; p[4] = 'o'; p[5] = '\0'; 9 10 printf("%s\n", p); 11 1 return 0; 13 } Δύο άλλες χρήσιμες συναρτήσεις είναι η gets που γεμίζει έναν πίνακα χαρακτήρων με ότι γράψει ο χρήστης στο πληκτρολόγιο και η strlen η οποία παίρνει παράμετρο μία συμβολοσειρά και επιστρέφει το μήκος της. Το παράδειγμα 11 χρησιμοποιεί και τις δύο. 5 char s[100]; Listing 11: Εισαγωγή string από το πληκτρολόγιο και μέτρηση μήκους 7 printf(" Dose mia symvoloseira: "); 8 gets(s); 11

9 10 printf("h symvoloseira exei mnkos %d\n", strlen(s)); 11 1 return 0; 13 } 1