04 Operators

393 views

Published on

Published in: Travel, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
393
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

04 Operators

  1. 1. Бублик Володимир Васильович Програмування - 2 Лекція 4. Базові поняття програмування. Оператори Лекції для студентів 2 курсу
  2. 2. Прості оператори <ul><li>Тотожній </li></ul><ul><li>Операторний вираз </li></ul><ul><li>Блок </li></ul><ul><li>Оператори керування </li></ul>
  3. 3. Тотожній ( null statement ) <ul><li>Ніяк не позначається, зовсім не виконується. Тотожній оператор розміщуємо там, де на вимогу синтаксису повинен знаходитися оператор, але нічого робити не треба. </li></ul><ul><li>Приклади </li></ul><ul><li>1. int k=0; </li></ul><ul><li>while (++k>0) </li></ul><ul><li>/* тотожній оператор */ ; </li></ul><ul><li>cout<<k<<endl; // -2 147 483 648 </li></ul><ul><li>2. while (*t++ = *s++) </li></ul><ul><li> /* тотожній оператор */ ; </li></ul>
  4. 4. Операторний вираз ( expression statement ) <ul><li>Вираз обчислюється, а результат ігнорується, якщо тільки він не запам’ятовується внаслідок стороннього ефекту, наприклад, завдяки lvalue. </li></ul><ul><li>Приклади </li></ul><ul><li>double x = 0; </li></ul><ul><li>double a = 1.0; </li></ul><ul><li>x = x+a; </li></ul><ul><li>x += a; </li></ul><ul><li>x++; </li></ul><ul><li>x; </li></ul><ul><li>cout<<”Hallo, world!”<<endl; </li></ul>
  5. 5. Оператори керування <ul><li>Оператор виходу з блоку break служить для виходу з блоку (припинення циклу) </li></ul><ul><li>Оператор продовження (циклу) continue забезпечує перехід на наступну ітерацію циклу; поза циклом не вживається </li></ul><ul><li>Оператор виклику функції f(e1, e2, …, en); </li></ul><ul><li>Оператор виходу з функції return expression; </li></ul>
  6. 6. Складені оператори <ul><li>Розгалуження </li></ul><ul><li>Перемикач </li></ul><ul><li>Цикл </li></ul>
  7. 7. <ul><li>Розгалуження може бути скороченим і повним. Скорочене розгалуження: </li></ul><ul><li>if (x>y) </li></ul><ul><li>{ </li></ul><ul><li>z = y; </li></ul><ul><li>y = x; </li></ul><ul><li>x = z; </li></ul><ul><li>} </li></ul>Розгалуження
  8. 8. <ul><li>Повне розгалуження: </li></ul><ul><li>if (n % 2 = = 0) // ( ! n%2) </li></ul><ul><li>{ </li></ul><ul><li>n /= 2; x *= x; //n = n/2; x = x*x; </li></ul><ul><li>} </li></ul><ul><li>else </li></ul><ul><li>{ </li></ul><ul><li>n--; y *= x; //n = n-1; y = y*x; </li></ul><ul><li>} </li></ul>Розгалуження
  9. 9. <ul><li>Перемикач ( switch ) дає компактний спосіб запису вкладених розгалужень </li></ul><ul><li>switch (selector) </li></ul><ul><li>{ </li></ul><ul><li>case integral-value1 : statement; break ; </li></ul><ul><li>case integral-value2 : statement; break ; </li></ul><ul><li>case integral-value3 : statement; break ; </li></ul><ul><li>case integral-value4 : statement; break ; </li></ul><ul><li>(...) </li></ul><ul><li>default : statement; </li></ul><ul><li>} </li></ul>Перемикач
  10. 10. Перемикач <ul><li>week day; </li></ul><ul><li>int d; </li></ul><ul><li>cout<<&quot;Give your day: &quot;; </li></ul><ul><li>cin>>d; </li></ul><ul><li>day = (week)d; </li></ul><ul><li>switch (day) </li></ul><ul><li>{ </li></ul><ul><li>case mo nday: </li></ul><ul><li>cout<<”Monday”<<endl; </li></ul><ul><li>break ; </li></ul><ul><li>case tuesday: </li></ul><ul><li>cout<<”Tuesday”<<endl; </li></ul><ul><li>break ; </li></ul><ul><li>case wednesday: </li></ul><ul><li>cout<<”Wednesday”<<endl; </li></ul><ul><li>break ; </li></ul><ul><li>case friday: </li></ul><ul><li>cout<<”Friday”<<endl; </li></ul><ul><li>break ; </li></ul><ul><li>case saturday: </li></ul><ul><li>cout<<”Saturday”<<endl; </li></ul><ul><li>break ; </li></ul><ul><li>case sunday: </li></ul><ul><li>cout<<”Sunday”<<endl; </li></ul><ul><li>break ; </li></ul><ul><li>default : </li></ul><ul><li>cout<<”Mistaken day:” <<day<<endl; </li></ul><ul><li>} </li></ul>
  11. 11. <ul><li>Альтернатива за замовчуванням default найчастіше служить для виявлення помилкових значень у даних </li></ul><ul><li>У попередньому прикладі це значення, відмінні від номерів дня тижня </li></ul><ul><li>Якщо default не було, програма не помітила б некоректного значення </li></ul>Перемикач
  12. 12. <ul><li>int aCounter=0, bCounter=0; </li></ul><ul><li>char c; </li></ul><ul><li>for (int i=1; i<5; ++i) </li></ul><ul><li>{ // Для чого потрібен break ? </li></ul><ul><li>cin>>c; </li></ul><ul><li>switch (c) </li></ul><ul><li>{ </li></ul><ul><li>case 'a': </li></ul><ul><li>++aCounter; </li></ul><ul><li>case 'b': // bCounter is in fact a+b Counter </li></ul><ul><li>++bCounter; </li></ul><ul><li>} </li></ul><ul><li>} // Скільки літер a і b? </li></ul><ul><li>cout<<aCounter<<' '<<bCounter<<endl; </li></ul>Приклад. Перемикач без break
  13. 13. <ul><li>int aCounter=0, bCounter=0; </li></ul><ul><li>char c; </li></ul><ul><li>for ( int i=1; i<5; ++i) </li></ul><ul><li>{ // Відсутність груба break помилка </li></ul><ul><li>cin>>c; </li></ul><ul><li>switch (c) </li></ul><ul><li>{ </li></ul><ul><li>case 'a': </li></ul><ul><li>++aCounter; break; </li></ul><ul><li>case 'b': </li></ul><ul><li>++bCounter; break; </li></ul><ul><li>} </li></ul><ul><li>} // Скільки літер a і b? </li></ul><ul><li>cout<<aCounter<<' '<<bCounter<<endl; </li></ul>Виправлений приклад перемикача
  14. 14. Цикл з лічильником ( for statement ) <ul><li>for ( ініціалізація параметру циклу ; умова продовження циклу ; вираз для обчислення нового значення параметру ) </li></ul><ul><li>оператор ; </li></ul><ul><li>int n ; </li></ul><ul><li>double x , y =1 ; </li></ul><ul><li>… // взяти значення x, n </li></ul><ul><li>// Визначення лічильника прямо в циклі </li></ul><ul><li>for ( int i=0; i<n; i++) //можна i +=1; </li></ul><ul><li>y*=x; </li></ul><ul><li>… // віддати значення y </li></ul><ul><li>Зауваження </li></ul><ul><li>for ( ; ; ) ? </li></ul>
  15. 15. Цикл з передумовою (while statement) <ul><li>while ( умова продовження циклу ) оператор ; </li></ul><ul><li>int n ; </li></ul><ul><li>double x , y =1 ; </li></ul><ul><li>… // взяти значення x, n </li></ul><ul><li>int i=0; // ініціалізація параметру циклу ; </li></ul><ul><li>while (i<n) </li></ul><ul><li>{ </li></ul><ul><li>y*=x; i +=1; // обчислення нового значення параметру </li></ul><ul><li>} </li></ul><ul><li>… // віддати значення y </li></ul>
  16. 16. Цикл з передумовою. Швидка степінь <ul><li>int n ; </li></ul><ul><li>double x , y =1 ; </li></ul><ul><li>… // взяти значення x, n </li></ul><ul><li>int k = n; </li></ul><ul><li>while ( k >0) </li></ul><ul><li>if ( k % 2) </li></ul><ul><li> { k --; y *= x;} </li></ul><ul><li>else </li></ul><ul><li> { k /=2; x*=x;} </li></ul><ul><li>… // віддати значення y </li></ul>
  17. 17. Цикл з передумовою . Приклад з інваріантами <ul><li>int n; </li></ul><ul><li>double x, y =1 ; </li></ul><ul><li>… // взяти значення x, n </li></ul><ul><li>int i=0; // y == 1 && i =0 => y == x**i </li></ul><ul><li>while (i<n) </li></ul><ul><li>{ </li></ul><ul><li>y*=x ; i +=1; // y == x**i </li></ul><ul><li>} </li></ul><ul><li>// y == x**i && i == n => y == x**n </li></ul><ul><li>… // віддати значення y </li></ul>
  18. 18. Цикл з передумовою. Швидка степінь <ul><li>int n ; </li></ul><ul><li>double x , y =1 ; </li></ul><ul><li>… // взяти значення x, n </li></ul><ul><li>int k = n; </li></ul><ul><li>while ( k >0) </li></ul><ul><li>if ( k % 2) </li></ul><ul><li> { k --; y *= x;} </li></ul><ul><li>else </li></ul><ul><li> { k /=2; x*=x;} </li></ul><ul><li>… // віддати значення y </li></ul>
  19. 19. Цикл з передумовою. Ще один приклад інваріантів <ul><li>int n ; </li></ul><ul><li>double x , y =1 ; </li></ul><ul><li>… // взяти значення x, n </li></ul><ul><li>int k = n; // z == y*x**k => z == x**n </li></ul><ul><li>while ( k >0) </li></ul><ul><li>if ( k % 2) </li></ul><ul><li> { k --; y *= x;} // y*x**k == (y*x)*x**(k-1) ==x**n </li></ul><ul><li>else </li></ul><ul><li> { k /=2; x*=x;} // y*x**k == y*x**(k/2)**2 ==x**n </li></ul><ul><li>… // віддати значення y </li></ul><ul><li>// k == 0 => x**n == y*x**k == y </li></ul>
  20. 20. Цикл з постумовою (do-while loop) <ul><li>do оператор while ( умова продовження циклу ); </li></ul><ul><li>do </li></ul><ul><li>{ </li></ul><ul><li>t=s; </li></ul><ul><li>s=(s+x/s)*0.5; </li></ul><ul><li>} </li></ul><ul><li>while ((fabs(s-t)/s)>eps); </li></ul>
  21. 21. Нескінчений цикл <ul><li>int n; char ch; </li></ul><ul><li>while ( true ) </li></ul><ul><li>{ </li></ul><ul><li>cout<<&quot;Give your n:&quot;; </li></ul><ul><li>cin>>n; </li></ul><ul><li>cout<<&quot;Fibonacci &quot;<<‘(‘<<n<<“)=“ <<Fibonacci(n)<<&quot; &quot;; </li></ul><ul><li>cout<<&quot;Repeat (y/n)?&quot;; </li></ul><ul><li>cin>>ch; </li></ul><ul><li>if (ch=='n') break ; </li></ul><ul><li>} </li></ul>
  22. 22. Вправи <ul><li>Виразити цикл з лічильником через цикл з передумовою </li></ul><ul><li>Виразити цикл з передумовою через цикл з постумовою </li></ul><ul><li>Виразити цикл з постумовою через цикл з передумовою </li></ul><ul><li>Усунути break з нескінченого циклу </li></ul>
  23. 23. Налагодження програм <ul><li>Макрос суджень assert </li></ul><ul><li>Блок випробувань try </li></ul>
  24. 24. Макрос суджень assert <ul><li>Використовується для виявлення помилок програмування </li></ul><ul><li>Необхідно включити <cassert> </li></ul><ul><li>#include <cassert> </li></ul><ul><li>В робочій версії програми відмикається командою #define NDEBUG </li></ul><ul><li>#ifdef NDEBUG </li></ul><ul><li>#define assert (exp) ((void)0) </li></ul>
  25. 25. Судження ( assertion) <ul><li>#include < cassert > </li></ul><ul><li>int mod( int m, int n) </li></ul><ul><li>{ </li></ul><ul><li>int q=0, r=m; </li></ul><ul><li>assert ((m==n*q+r) && (r>=0)); </li></ul><ul><li>while (r>=n) </li></ul><ul><li>{ </li></ul><ul><li>q++; r-=n; </li></ul><ul><li>assert ((m==n*q+r) && (r>=0)); </li></ul><ul><li>} </li></ul><ul><li>assert ((m==n*q+r) && (r>=0) && (r<n)); </li></ul><ul><li>return r; </li></ul><ul><li>} </li></ul>
  26. 26. Блок випробувань try <ul><li>Блок випробувань try </li></ul><ul><li>Використовує оператор спричинення throw оператор захвату catch </li></ul><ul><li>Використовується для виявлення помилкового використання програми </li></ul><ul><li>Не відмикається ніколи </li></ul>
  27. 27. Блок випробувань <ul><li>int n; </li></ul><ul><li>try </li></ul><ul><li>{ </li></ul><ul><li>cout<<&quot;Give your n:&quot;; </li></ul><ul><li>cin>>n; </li></ul><ul><li>if (n<0) throw n ; </li></ul><ul><li>cout<<&quot;Fibonacci= &quot;<<Fibonacci(n)<<&quot; &quot;; </li></ul><ul><li>} </li></ul><ul><li>catch ( int n) </li></ul><ul><li>{ </li></ul><ul><li>cout<<&quot;You gave negative &quot;<<n<<endl; </li></ul><ul><li>} </li></ul>

×