Η πρόταση while
Παράδειγμα : Διάβαζε
ακεραίους για όσο σου δίνονται |
|
#include
<stdio.h> main ()
{ int status; long num; status=scanf(“%ld”,&num); while (status ==1) { /* ενέργειες βρόχου */ status= scanf(“%ld”,&num); } } |
#include
<stdio.h> main ()
{ long num; while (scanf(“%ld”,&num)==1) { /* ενέργειες βρόχου */ } } |
Η δεξιά «έκδοση» δουλεύει
γιατί η scanf εκτός
από το να διαβάζει και να αποθηκεύει τιμές στη μεταβλητή num επιστρέφει έναν ακέραιο
(τον status στην
αριστερή έκδοση). Ο ακέραιος αυτός
είναι πόσες τιμές διάβασε στον τρέχοντα κύκλο.
Όταν δώσουμε σαν είσοδο μια
τιμή που δεν είναι long, π.χ.
τον χαρακτήρα ‘q’, τότε
το scanf θα
επιστρέψει την τιμή 0 και ο βρόχος θα τερματιστεί.
Η while είναι βρόχος συνθήκης εισόδου,
δηλαδή η συνθήκη εξετάζεται πρώτα και μόνο αν είναι αληθής, εκτελούνται οι
εντολές του βρόχου. Υπάρχουν και βρόχοι
συνθήκης εξόδου, όπου οι εντολές εκτελούνται πρώτα και μετά
ελέγχεται η συνθήκη για έξοδο από το βρόχο.
Αυτές τις εντολές θα τις δούμε αργότερα.
Προσοχή στη σύνταξη της while |
|
#include
<stdio.h> main ()
{ int n=0; while (n < 3) printf(“%d\n”,n); n ++; } |
#include
<stdio.h> main ()
{ int n=0; while (n ++ < 3); printf(“%d\n”,n); } |
Αποτέλεσμα |
|
0 0 0 0 0 .... |
4 |
Στην αριστερή περίπτωση η
εντολή n++; είναι
έξω από την πρόταση της while. Όταν δεν υπάρχουν άγκιστρα ({})
η while
τελειώνει στο πρώτο ερωτηματικό (;)
Στη δεξιά περίπτωση δεν
υπάρχουν άγκιστρα και το πρώτο ερωτηματικό είναι αυτό στην ίδια γραμμή με τη while. Άρα η while δεν
κάνει τίποτε άλλο από το να αυξήσει το n 4 φορές.
Αν όντως θέλετε η while να μην κάνει τίποτε άλλο
από τη δραστηριότητα μέσα στη συνθήκη ελέγχου γράψτε το κάπως έτσι
Παραβλέπει την είσοδο που είναι λευκά διαστήματα ή ψηφία |
while
(scanf(“%ld”,&num)==1) ; /*
το ερωτηματικό είναι σε άλλη γραμμή */ |
Η πρόταση for
Πρόγραμμα υπολογισμού κύβων με for |
#include
<stdio.h> main ()
{ int num; printf(“ n n εις τον κύβο\n”); for (num = 1; num <=6; num ++) printf(“%5d %5d \n”, num, num*num*num); } |
Τώρα με while |
#include
<stdio.h> main ()
{ int num; printf(“ n εις τον κύβο\n”); num = 1; while (num <=6) { printf(“%5d %5d \n”, num, num*num*num); num ++; } } |
Αποτέλεσμα |
n n εις τον κύβο 1
1 2
8 3
27 … |
for ( έκφραση 1 ; έκφραση 2 ;
έκφραση 3)
·
Η έκφραση 1 εκτελείται μια φορά όταν η for ξεκινάει
·
Η έκφραση 2 είναι έκφραση ελέγχου και υπολογίζεται πριν από κάθε δυνητική
εκτέλεση του βρόχου
·
Η έκφραση 3 υπολογίζεται στο τέλος κάθε βρόχου
Ο βρόχος for μας παρέχει πολύ μεγάλη
ευελιξία
·
Μπορούμε να μετράμε προς τα κάτω
αντί προς τα πάνω
for( n=5 ; n>0
; n-- )
·
Μπορούμε να μετράμε ανά 2, ανά 10
κτλ.
for( n=2 ; n<60
; n+=13 )
·
Μπορούμε να μετράμε με χαρακτήρες
αντί αριθμών
for( ch=’a’ ; ch<=’z’ ; ch++)
·
Μπορούμε να ελέγχουμε άλλες
συνθήκες αντί του αριθμού των επαναλήψεων.
Στο παραπάνω πρόγραμμα των κύβων θα μπορούσαμε να έχουμε π.χ.
for( num=1 ; num*num*num<=216 ; num++ )
·
Μπορούμε να αυξάνουμε μια
ποσότητα γεωμετρικά αντί αριθμητικά
for( debt=100. ; debt<150. ; debt*=1.1 )
·
Μπορούμε να χρησιμοποιήσουμε
οποιαδήποτε έκφραση σαν τρίτη πρόταση.
Αυτή εκτελείται αυτόματα σε κάθε κύκλο
for ( x=1 ; y<=75 ; y=++x*5+50 )
·
Μπορούμε να αφήσουμε εκφράσεις
κενές, αλλά τα ερωτηματικά πρεπει να υπάρχουν
for( n=3 ; ans<=25 ; )
·
Η πρώτη έκφραση δεν χρειάζεται να είναι εντολή καταχώρησης. Θυμηθείτε όμως ότι εκτελείται μια μόνο φορά,
στην αρχή
for(printf(“Συνέχισε με αριθμούς\n”);num!=6;)
·
Μπορούμε να έχουμε παραπάνω από
μια υποπρόταση μέσα σε κάθε θέση της for, χρησιμοποιώντας τον τελεστή κόμμα (,)
for( x=1, y=2 ; x*y < 100 ; x++, y++ )
Το παράδοξο του Ζήνωνα |
|
#include
<stdio.h> #include
<math.h> #define
LIMIT 15 main ()
{ int count; float time; for ( time=0.0, count=1; count <= LIMIT
; time += pow(2.,-count), count++ ) printf("Time
= %f at counter = %d\n",time, count); } |
|
Αποτέλεσμα |
|
Time =
0.000000 at counter = 1 Time =
0.500000 at counter = 2 Time =
0.750000 at counter = 3 Time =
0.875000 at counter = 4 Time =
0.937500 at counter = 5 Time =
0.968750 at counter = 6 Time =
0.984375 at counter = 7 Time =
0.992188 at counter = 8 |
Time =
0.996094 at counter = 9 Time = 0.998047
at counter = 10 Time =
0.999023 at counter = 11 Time =
0.999512 at counter = 12 Time =
0.999756 at counter = 13 Time =
0.999878 at counter = 14 Time =
0.999939 at counter = 15 |
Πότε χρησιμοποιούμε for και πότε while
Συνήθως όταν ένας βρόχος χρειάζεται αρχικές
τιμές και μια εντολή ανανέωσης π.χ. count++; χρησιμοποιούμε τη for
for (count=1; count<100;
count++)
Αν από την άλλη δεν ισχύουν τα παραπάνω έρχεται
πιο φυσιολογικά η χρήση της while
while(scanf(“%d”, &num)
==1)
Βρόχος συνθήκης εξόδου : do while
Do while vs. while |
|
#include
<stdio.h> main ()
{ char ch; do { scanf(“%c”,&ch); printf(“%c\n”,ch); } while ( ch != ‘#’); } |
#include
<stdio.h> main ()
{ char ch; scanf(“%c”,&ch); while ( ch != ‘#’) { printf(“%c\n”,ch); scanf(“%c”,&ch); } } |
Αποτέλεσμα |
|
Είσοδος ab# Έξοδος a b # |
Είσοδος ab# Έξοδος a b |
Εσωτερικοί βρόχοι
rows1.c |
|
#include
<stdio.h> #define
ROWS 6 #define
CHARS 6 main ()
{ int row; char ch; for (row=0;row<ROWS;row++) { for (ch=’A’;ch<’A’+CHARS;ch++) printf(“%c”,ch); printf(“\n”); } } |
ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF ABCDEF |
Πίνακες
Η παρακάτω εντολή κρατάει χώρο στη μνήμη για ένα
πίνακα με 20 στοιχεία. Κάθε στοιχείο
είναι πραγματικός αριθμός (float).
float number[20];
Το πρώτο στοιχείο είναι το number[0] και
το τελευταίο το number[19].
Χρήση for με πίνακα (scores_in.c) |
/* Χρήση βρόχων για επεξεργασία πινάκων */ #include
<stdio.h> #define SIZE
10 main(){ int index, sum, score[SIZE]; float average; printf("Δώστε %d βαθμολογίες\n", SIZE); for (index=0; index < SIZE; index++) scanf("%d", &score[index]); printf("Οι βαθμολογίες που διαβάστηκαν είναι:\n"); for (index=0; index < SIΖΕ; index++) printf("%d", score[index]); printf("\n"); for (index=0, sum=0; index < SIΖΕ; index++) sum+=score[index]; average = (float) sum/SIZE; printf("Άθροισμα βαθμολογιών = %d, μέσος όρος = %.2f\n", sum, average); } |
Αποτέλεσμα |
Δώστε 10
βαθμολογίες 76 85 62 48 98 71 66 89 70 77 99 Οι βαθμολογίες
που διαβάστηκαν είναι: 76
85 62 48
98 71 66
89 70 77 Άθροισμα
βαθμολογιών = 742, μέσος όρος = 74.20 |
Προσοχή!! Το number[20]
βρίσκεται έξω από τον πίνακα!
Οι συμβολοσειρές (strings) είναι ειδική μορφή
πίνακα που αποτελείται από χαρακτήρες και ο ειδικός χαρακτήρας '\0'
χρησιμοποιείται για να δηλώσει το τέλος της.
Bρόχος με επιστρεφόμενη τιμή συνάρτησης
(power.c) |
/* Χρήση τιμών επιστροφής */ #include <stdio.h> main() { double x,xpow; double power(); /* δήλωση της συνάρτησης */ int n; printf("Δώστε έναν αριθμό και τη θετική
ακέραια"); printf(" δύναμη
στην \n οποία ο αριθμός
θα "); printf("υψωθεί. Δώστε q για να σταματήσετε\n"); while( scanf("%lf%d",
&x,&n)==2) { xpow=power(x,n); /* κλήση της συνάρτησης
*/ printf("%.3e εις την %d είναι %.3e\n", x, n, xpow); } } double
power(a,b) double a; int b; { double pow=1; int i; for (i=1; i<=b; i++) pow *= a; return pow } |
Αποτέλεσμα |
Δώστε έναν αριθμό και τη θετική ακέραια δύναμη στην οποία ο αριθμός θα υψωθεί. Δώστε q για να σταματήσετε 2.2 5 2.200e+000 εις την 5
είναι 5.154e+001 8.0 8 8.000e+000 εις την 8
είναι 1.678e+007 144 2 1.440+002 εις την 2 είναι 2.074e+004 q |