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