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; μεταβλητη που χρησιμοπoιειται για ελεγχο επαναληψης(control/ induction variable) int x; x=0; while(x<5){ printf(“%d\n”,x); ++x; } αρχικοποιηση συνθηκη επαναληψης ενημερωσης επομενο βημα
Tελεστες προ-σημειογραφική (prefix) μετα-σημειογραφική(postfix) ++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*/ 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 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; 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θροισμα των ορων
float term(int n, float x) term(0,x) term(1,x) term(2,x) term(3,x) exp + 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); }
float factorial(int n) 3 4 1 2 factorial * 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{ εντολη;
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; int number; do{ printf(“Enter a possitive value: ”); scanf(“%d”,&number); while(number<= 0); int number; 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: 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 */ }