E ντολες Επαναληψης - Βροχοι ( repetition and loops)

Post on 06-Jan-2016

32 views 2 download

description

E ντολες Επαναληψης - Βροχοι ( repetition and loops). while(){} for(){} do{ }while() τελεστες postfix/prefix (++, --, ...). Δομες Ελεγχου. Ενα προγραμμα αποτελειται απο Ακολουθιες πχ {εντολη;εντολη;…} Εκλογη πχ if(){} Επαναληψη πχ while{}. Χρηση Βροχων. - PowerPoint PPT Presentation

transcript

Eντολες Επαναληψης - Βροχοι (repetition and loops)• while(){}

• for(){}

• do{ }while()

• τελεστες postfix/prefix (++, --, ...)

Δομες Ελεγχου

• Ενα προγραμμα αποτελειται απο– Ακολουθιες πχ {εντολη;εντολη;…}– Εκλογη πχ if(){}– Επαναληψη πχ while{}

Χρηση Βροχων

• Για επαναληψη λειτουργικοτητας– μετρητης (counter)

• επαναλαβε εαν μετρητης μικροτερος(μεγαλυτερος) μια τιμης

– σημαια (sentinel, flag)• επανελαβε εαν διαφορο του EOF, -1 κτλ

– συνθηκη/ελεγχος (conditional)• επαναλαβε εφοσον συνθηκη δεν ισχυει

– συνδυασμος (με χρηση λογικων τελεστων)

while

• Συνταξη: while (εκφραση)

εντολη;

while (εκφραση){

εντολη;

…..

}

while (συν)

• Σημασια: οσον η τιμη της εκφρασης (συνθηκης) ειναι διαφορη του μηδεν εκτελα τις εξαρτομενες εντολες αλλιως συνεχισε με τις εντολες που ακουλουθουν το while block

while με μετρητη

int x;

x=0;

while(x<5){

printf(“%d\n”,x);

++x;

}

αρχικοποιησησυνθηκη επαναληψης

μεταβλητη που χρησιμοπoιειται γιαελεγχο επαναληψης(control/induction variable)

ενημερωσηςεπομενο βημα

Tελεστες

• προ-σημειογραφική (prefix)++i; <==> i = i + 1;

--i; <==> i = i - 1;

• μετα-σημειογραφική(postfix)i++; <==> i = i + 1;

i--; <==> i = i - 1;

Prefix vs Postfix

i = 5;

x = ++i;

y = i++;

• x ειναι 6, y ειναι 6 και το i ειναι 7

• Χρησιμοποιητε -- ++ σε απλες εκφρασεις

Συνθετοι Τελεστες Αναθεσης

• i+=k;<==> i = i + k;

• i*=k; <==> i = i * k;

• iop= k; <==> i = i op (k);

while με σημαια

Aθροισμα σειρας απροσδιοριστου μεγεθους που τερματιζεται με 0

int number, sum=0; scanf(“%d”,&number); /* diabase prwto stoixeio */while(number != 0){ /*sinthiki epanalipsis*/

sum +=number; /*sum=sum+number */scanf(“%d”,&number); /* διαβασε επομενο στοιχειο */

}printf(“To athroisma tis seiras einai %d\n”,sum);

while με συνθηκη

Διαβασμα τιμης μεχρι να ικανοποιηθει συνθηκη (αργοτερα do-while)

int number; printf(“Enter a possitive value: ”);scanf(“%d”,&number); /* diabase timh */while(number<= 0){ /*sinthiki epanalipsis*/

printf(“Enter a possitive value: ”);scanf(“%d”,&number); /* διαβασε timi xana */

}

Nested while (φωλιασμενα)

int i=0,j;while(i<5){

j=0;while(j<5){

printf(“%d-%d”,i,j);++j;

}printf(“\n”);++i;

}

0-0 0-1 0-2 0-3 0-41-0 1-1 1-2 1-3 1-42-0 2-1 2-2 2-3 2-43-0 3-1 3-2 3-3 3-44-0 4-1 4-2 4-3 4-4

Nested while (φωλιασμενα)

int i=0,j;while(i<5){

j=0;while(j<=i){

printf(“%d-%d”,i,j);++j;

}printf(“\n”);++i;

}

0-01-0 1-12-0 2-1 2-23-0 3-1 3-2 3-34-0 4-1 4-2 4-3 4-4

Συνταξη for

for(αρχικοποιηση; συνθηκη επαναληψης ; ενημερωση)

εντολη;

for(αρχικοποιηση; συνθηκη επαναληψης; ενημερωση){

εντολη;

εντολη;

…..

}

Σημασια for

for(Αρχικοποιηση; Συνθηκη επαναληψης ; Ενημερωση)

εντολη;Αρχικοποιηση

Συνθηκη

εντολη

Ενημερωση

Συνθηκη

εντολη

Ενημερωση

Συνθηκη

Παραδειγμα με for

int x;

for(x=0;x<5;++x){

printf(“%d\n”,x);

}

x x<5 εξοδος

0 1 0

1 1 1

2 1 2

3 1 3

4 1 4

5 0

Ομοιοτητα for με while

int x;

x=0;

while(x<5){

printf(“%d\n”,x);

++x;

}

int x;

for(x=0;x<5;++x){

printf(“%d\n”,x);

}

Οποιoδηποτε for μπορει να γραφει με while και

οποιoδηποτε while με for

Παραδειγμα

• Γραψετε ενα προγραμμα που υπολογιζει και τυπωνει την τιμη του ex βαση της ακολουθηςεκφρασης- n ειναι ο αριθμος ορων 1 + x/1! + x2/2! + x3/3! +…+ xn/n!

• Το προγραμμα διαβαζει τις τιμες x και n απο τον χρηστη.

• Νοte: x0/0! + x1/1! + x2/2! + x3/3! +…+ xn/n!

Υπολογισμος

• Τι πρεπει να γινει?– Δημιουργια n+1 ορων (0 μεχρι n)– Aθροισμα των ορων

exp

exp

exp

term(0,x)

+

+

+

float term(int n, float x)

term(1,x) term(2,x)term(3,x)

exp

Δημιουργια Ορου ν

• Συναρτηση float term(n,x) επιστρεφει τον n ορο της σειρας για την τιμη x

Υπολογισμος

float exp;int ith_term;

exp =0;ith_term = 0;while(ith_term <= n){

exp += term(ith_term,x);++ith_term;

}

term(n,x) - xn/n!

• Πως πρεπει να γινει?– υπολογισμος δυναμης– υπολογισμος παραγωντικου

• Χρησιμες Συναρτησεις– xn float pow(x,n);– n! int factorial(n);

n! = n n-1 … 3 2, 0!=1!=1

Οριζεται στην math.h

Need user definition

floatterm (int n, float x){

return pow(x,n)/factorial(n);}

factorial

factorial

factorial

factorial

1 2 3 4

*

*

*

float factorial(int n)

floatfactorial (int n){

int i;float f;

f=1;i=2; /* if i=0 or 1 return 1*/while(i<=n){

f *= i;++i;

}return f;

}

Trace Table for Factorial

• Για n: 0,1,2 … 5

floatfactorial (int n){

int i;float f;

/* if i=0 or 1 return 1*/for(f=1,i=2;i<=n;++i){

f *= i;}return f;

}

floatfactorial (int n){

int i;float f;

/* if i=0 or 1 return 1*/for(f=1,i=2;i<=n;f*=i,++i);return f;

}

do-while συνταξη

do

εντολη;

while(συνθηκη);

do{

εντολη;

εντολη;

}while(συνθηκη);

do-while σημασια

• Εκτελα το σωμα

• Εφοσον η συνθηκη ισχυει επανελαβε την εκτελεση των εντολων στο σωμα του βροχου

• for και while το σωμα μπορει να μην εκτελεστει, ενω στο do-while εκτελειται τουλαχιστο μια φορα

Παραδειγμα

int a,b;

do{

printf(Enter values for A and B where A < B: );

scanf(%d%d, &a, &b);

} while (a >= b);

Παραδειγμα

int number;

printf(“Enter a possitive value: ”);

scanf(“%d”,&number);

while(number<= 0){

printf(“Enter a possitive value: ”);

scanf(“%d”,&number);

}

int number;

do{

printf(“Enter a possitive value: ”);

scanf(“%d”,&number);

while(number<= 0);

Απειροι Βροχοι

– while(1){}– while(x=1){}– for(;i=1;){}– do{}while(x=13);– Μη ή λανθασμενη ενημερωση της μεταβλητης

ελεγχουint i = 0, n= 10;

while(i<n){

printf(“%d ”,i);

}

Κοινα Λαθη

• Σύγχυση ανάμεσα στις εντολές if και while:• if (συνθήκη) εντολή

• while (συνθήκη) εντολή

• while, do-while: παράλειψη παρενθέσεων γύρω από τις συνθήκες

• for: παράλειψη του χαρακτήρα ; • Σωμα συναρτησης: while(x<0)

count +=x;

++x;

printf(“%d\n”,x);

Κοινα Λαθη

• Συνθετοι τελεστες: a*=b+c; σημαίνει a = a*(b + c); όχι a = a * b + c;

• Χρήση ++, , και σύνθετης ανάθεσης (+= κτλ) σε σύνθετες εκφράσεις

• Χρήση του τελεστή != με τιμες τύπου float και double πρέπει να αποφεύγεται, π.χ.– while (balance != 0.0){}

getchar/putchar

• Συναρτησεις εισοδου/εξοδου χαρακτηρων

• Διεπαφη– int getchar(), διαβασε τον επομενο χαρακτηρα

απο την εισοδο, κινησε δρομεα διαβασματος στον επομενο χαρακτηρα (διαβαζει χαρακτηρες μιας γραμμης μετα το enter)

– void putchar(int), τυπωσε χαρακτηρα στην μοναδα εξοδου

Παράδειγμα

• Γραψετε ενα προγραμμα που μετραει τον αριθμο χαρακτηρων σε μια απροσδιοριστου μεγεθους σειρα χαρακτηρων. Η σειρα εισαγεται απο μοναδα εισοδου και τερματιζεται με την τιμη EOF.

• π.χ. εισοδου/εξοδου: Enter series: asdfre

^Z το μεγεθος της σειρας ειναι 7

Χρήσιμες Λειτουργικοτητες

• Tι πρεπει να γινει– διαβασμα μια σειρας χαρακτηρων

απροσδιοριστου μεγεθους – υπολογισμος μεγεθους σειρας

• Χρήσιμες Λειτουργικοτητες – Πως διαβαζουμε μια σειρα χαρακτηρων που

τερματιζεται με καθορισμενη τιμη? – Πως υπολογιζουμε το μεγεθος μιας σειρας?

Aνάγνωση σειρας απροσδιοριστου μεγεθους χαρακτηρων

• Απαιτει εντολή επαναληψης (βροχος)

• Δομη αναλογη με απροσδιοριστη μεγεθους σειρα αριθμων

/*διαβασε το πρωτο στοιχειο*/while(/*το στοιχειο δεν σημαδοτει τελος*/){

/* διαβασε επομενο στοιχειο */

}

Διαβασμα σειρας χαρακτηρων

int c; c = getchar(); /* diabase prwto xaraktira */while(c != EOF){ /* oxi telos tou file */

c = getchar(); /* διαβασε επομενο xaraktira */

}

echo σειρας χαρακτηρων

int c; c = getchar(); /* diabase prwto xaraktira */while(c != EOF){

putchar(c); /* typwse xaraktira */c = getchar(); /* διαβασε επομενο xaraktira */

}

Μεγεθος Σειρας Χαρακτηρων

int c; int size;size = 0; /* arxikopoihsh */c = getchar(); /* diabase prwto xaraktira */while(c != EOF){

size = size + 1; /* metra akomi ena xaraktira */c = getchar(); /* διαβασε επομενο xaraktira */

}

Απλοποίηση???

int c; int size;size = 0; /* arxikopoihsh */while((c = getchar() )!= EOF){/* diabase kai elegxe xaraktira */

size = size + 1; /* metra akomi ena xaraktira */}

Μετρημα Συγκεκριμενου Γεγονοτος

• Ποσες φορες παρουσιαστηκε ο χαρακτηρας Α?

• Tι πρεπει να γινει

– διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους

– ελεγχος για χαρακτηρα Α• αυξησε μετρητη καθε φορα

Μετρηση Γεγονοτος

int c; int count;count = 0; /* arxikopoihsh */while((c = getchar() )!= EOF){ /* diabase xaraktira */

if (c==‘A’)++count; /* metra akomi ena xaraktira */

}

Μετρηση Συγκεκριμενου Γεγονοτος

• Ποσες γραμμες υπηρχουν στα δεδομενα?

• Tι πρεπει να γινει

– διαβασμα μια σειρας χαρακτηρων απροσδιοριστου μεγεθους

– ελεγχος για χαρακτηρα επομενη γραμμη??• αυξησε μετρητη καθε φορα

Μετρηση Γεγονοτος

int c; int count;count = 0; /* arxikopoihsh */while((c = getchar() )!= EOF){ /* diabase xaraktira */

if (c==‘\n’) /* elegxe gia epomeni grammi */++count; /* metra akomi ena xaraktira */

}