480 likes | 577 Views
E ντολες Επαναληψης - Βροχοι ( repetition and loops). while(){} for(){} do{ }while() τελεστες postfix/prefix (++, --, ...). Δομες Ελεγχου. Ενα προγραμμα αποτελειται απο Ακολουθιες πχ {εντολη;εντολη;…} Εκλογη πχ if(){} Επαναληψη πχ while{}. Χρηση Βροχων.
E N D
Eντολες Επαναληψης - Βροχοι (repetition and loops) • while(){} • for(){} • do{ }while() • τελεστες postfix/prefix (++, --, ...)
Δομες Ελεγχου • Ενα προγραμμα αποτελειται απο • Ακολουθιες πχ {εντολη;εντολη;…} • Εκλογη πχ if(){} • Επαναληψη πχ while{}
Χρηση Βροχων • Για επαναληψη λειτουργικοτητας • μετρητης (counter) • επαναλαβε εαν μετρητης μικροτερος(μεγαλυτερος) μια τιμης • σημαια (sentinel, flag) • επανελαβε εαν διαφορο του EOF, -1 κτλ • συνθηκη/ελεγχος (conditional) • επαναλαβε εφοσον συνθηκη δεν ισχυει • συνδυασμος (με χρηση λογικων τελεστων)
while • Συνταξη: while (εκφραση) εντολη; while (εκφραση){ εντολη; ….. }
while (συν) • Σημασια: οσον η τιμη της εκφρασης (συνθηκης) ειναι διαφορη του μηδεν εκτελα τις εξαρτομενες εντολες αλλιως συνεχισε με τις εντολες που ακουλουθουν τοwhile block
μεταβλητη που χρησιμοπoιειται για ελεγχο επαναληψης(control/ induction variable) αρχικοποιηση συνθηκη επαναληψης ενημερωσης επομενο βημα while με μετρητη int x; x=0; while(x<5){ printf(“%d\n”,x); ++x; }
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-4 1-0 1-1 1-2 1-3 1-4 2-0 2-1 2-2 2-3 2-4 3-0 3-1 3-2 3-3 3-4 4-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-0 1-0 1-1 2-0 2-1 2-2 3-0 3-1 3-2 3-3 4-0 4-1 4-2 4-3 4-4
Συνταξη for for(αρχικοποιηση; συνθηκη επαναληψης ; ενημερωση) εντολη; for(αρχικοποιηση; συνθηκη επαναληψης; ενημερωση){ εντολη; εντολη; ….. }
Σημασια for for(Αρχικοποιηση; Συνθηκη επαναληψης ; Ενημερωση) εντολη; Αρχικοποιηση Συνθηκη εντολη Ενημερωση Συνθηκη εντολη Ενημερωση Συνθηκη
x x<5 εξοδος 0 1 0 1 1 1 2 1 2 3 1 3 4 1 4 5 0 Παραδειγμα με for int x; for(x=0;x<5;++x){ printf(“%d\n”,x); }
int x; x=0; while(x<5){ printf(“%d\n”,x); ++x; } int x; for(x=0;x<5;++x){ printf(“%d\n”,x); } Ομοιοτητα for με while Οποι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 term(0,x) term(1,x) term(2,x) term(3,x) exp exp exp float term(int n, float x)
Δημιουργια Ορου ν • Συναρτηση 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
float term (int n, float x) { return pow(x,n)/factorial(n); }
2 3 4 * * * factorial 1 factorial factorial factorial float factorial(int n)
float factorial (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
float factorial (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; }
float factorial (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 */ }