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