Η πρόταση 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