Eντολες Επαναληψης - Βροχοι (repetition and loops) while(){} for(){} do{ }while() τελεστες postfix/prefix (++, --, ...) και συνθετοι τελεστες break (εξοδος απο βροχο) break και continue βιβλιοθηκη
Δομες Ελεγχου Ενα προγραμμα αποτελειται απο Ακολουθιες πχ {εντολη;εντολη;…} Εκλογη πχ 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);
Shift/Bitwise Operators (appendix C) Δυαδικοι: & | ^ (and, or, exclusive-or) 0x0ffff & 0x0ffa0003 0x3 Μοναδιαιος: ~ (complement) ~ 0x0000ffff 0xffff0000 Shift Δυαδικοι: << >> (shift left, shift right) 5 >> 1 (101) 2 (10) 6<<2 (110) 24 (11000)
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){}
Αριθμος Λεξεων Γραψετε ενα προγραμμα που διαβαζει ενα κειμενο απο την εισοδο και υπολογιζει και τυπωνει τον αριθμο λεξεων.
Αριθμος Λεξεων Τι πρεπει να γινει: Διαβασμα ακολουθιας χαρακτηρων Μετρηση Γεγονοτος: Λεξης Τι ειναι λεξη:συνεχομενη σειρα χαρακτηρων Τα αλλα τι ειναι? ‘\n’, ‘\t’, ‘ ’ Μετασχηματισμος σε διαστημα ή χαρακτηρα Μετρουμε: μετακινηση απο ασπρο διαστημα σε λεξη (ή απο λεξη σε ασπρο διαστημα) Που ειμαστε προηγουμενως/τωρα:διαστημα ή λεξη-εννοια σημαίας (flag)
int main() { /* xρηση δυο σημαιων -πριν, τωρα (διαστημα η λεξη)*/ /* πριν = διαστημα --- αρχικοποιηση*/ /* διαβασε καθε χαρακτηρα απο εισοδο μεχρι ΕΟF καθε φορα επαναλαβε τα πιο κατω*/ /* που ειμαστε τωρα (λεξη ή διαστημα) */ /* εαν πριν σε διαστημα και τωρα σε λεξη τοτε μετρα λεξη*/ /*πριν παιρνει τιμη του τωρα */ return 0; }
/* convert stream returns WHITE_SPACE gia ‘\n’ ‘\t’ kai ‘ ’ gia oles tis alles periptwsis NON_WHITE_SPACE */ int main() { int c, nw; int where_before, where_now; /* simaies */ where_before = WHITE_SPACE; nw = 0; while((c=getchar()) != EOF){ where_now = convert_stream(c); if ( where_before == WHITE_SPACE && where_now == NON_WHITE_SPACE) nw = nw + 1; where_before = where_now; } printf(“The number of words in the input is %3d.\n”,nw); return 0;
break (προωρη εξοδος) while(count<n){ scanf(“%d”,&number); if (number== -1) break; ++count; } printf(“%d %d\n”, count, n, number);