Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lexzii_08 / lexs_2_oper.doc
Скачиваний:
15
Добавлен:
17.05.2015
Размер:
124.93 Кб
Скачать

Лекція №2

Вибір варіантів, прийняття рішень, "істина" і "хибність" в мові Сі. Порівняння. Логіка в мові Сі.

Ми повинні зрозуміти роботу і використання таких ключових слів:

goto, continue, if, else, switch, break, case, default; використання операцій : >> = <<= = = != && / : ?.

Оператор if називається ще оператором розгалуження і дія його подібна до аналогічного оператора в мові Паскаль.

Якщо значення виразу ненульове або true (істина) тоді виконується наступний оператор, якщо воно дорівнює нулю або false(хибне), то наступний оператор не виконується.

Наприклад if (і)

++ і;

Дужки навкруги виразу і є обов’язковими. Вираз в дужках може бути зовсім довільним, але з однією умовою: він повинен повертати скалярну величину, яку можна порівняти з нулем. Попередній приклад можливо переписати в вигляді

if (і !=0)

++ і;

Коли величина може дорівнювати нулю? Для типів bool(false), short(0), int(0l), float(0.0) і double(0.0) відповідь очевидна. А якщо це символ або покажчик? Нульовим значенням типу char є \0. Покажчики дорівнюють нулю в тому випадку, якщо вони мають значення Null або 0.

Крім того оператор if має ще дві форми використання:

іf (вираз) оператор 1;

еlse оператор 2;

Якщо вираз істинний, то виконується оператор 1, якщо ні, то виконується оператор 2. Оператор 1, оператор 2 – це простий або скалярний оператор. Перед ключовим словам еlse крапка з комою – ставиться, якщо оператор 1-простий оператор, і – не ставиться, якщо оператор 1 – складений оператор.

Приклади умовних операторів повної форми

if (х < 0) y = 1; // повна форма

еlse y = 2; // і прості оператори

if (a > b) { x = 0; y = 1} // повна форма

еlse {x = 1; y = 0} // і складені оператори.

Форма 3.

if (вираз 1 ) оператор 1

еlse if (вираз 2 ) оператор 2 еlse оператор 3

Якщо вираз 1 істинний, то виконується оператор 1, якщо вираз 1 – хибний, але вираз 2 – істинний, то виконується оператор 2. Якщо обидва вирази хибні, то виконується оператор 3.

Приклад:

if(legs = = 4)

printf (“Це може бути кінь \n ”);

else if (legs > 4)

printf (“Це не кінь \n ”);

else /* в випадку, якщо ніг < 4 */

{

legs ++;

printf (“тепер у нього стало на одну ногу більше. \n”)

}

Якщо вкладений оператор if повинен бути в скороченій формі, можна використовувати фігурні дужки, щоб не використовувати пустий оператор після ключового слова else.

Наприклад:

  1. можна використовувати оператор if з пустим else:

if (n > 0)

if (a > b) z = a; // повна форма if

else; // + пустий оператор після else;

else z = b;

  1. але краще в цьому випадку використовувати фігурні дужки:

if (n > 0)

{if (a > b) z = a;} // -скорочена форма if

else z = b;

Умовний вираз

Умовний вираз або тернарна операція ?: призначена для вибору одного з двух виразів для обчислення значень змінної в лівій частині оператора присвоєння.

Форма умовного виразу така:

a = (b ) ? B1 : B2;

де a – ім’я змінної лівої частини оператора присвоєння;

b – умова прийняття рішень, вираз любого типу;

B1, B2 – вирази, за допомогою яких вираховується значення а (дужки не обов’язкові ).

Виконання оператора з умовним виразом відбувається таким чином: спочатку вираховується значення b. Потім аналізується результат його обчислення:

  1. Якщо B! = 0, тобто умова істина. То обчислення змінної а відбувається за допомогою виразу b1;

  2. Якщо B = 0, тобто хибне, то – за допомогою виразів b2.

Якщо типи змінної лівої частини оператора присвоєння і результатів віразів b1 і B2 різні, то тип результат n обчислення виразу перетворюється в тип змінної а.

Наприклад: Дано а. Якщо a > 0, то х = 1.5, а якщо а <= 0, то х =2.3

Рішення можна записати в вигляді умовного оператора:

if (a > 0 ) x = 1.5;

y = 2.3;

Або за допомогою умовного виразу:

x = (a > 0 ) ? 1.5 : 2.3;

Приклад вибору за допомогою умовного виразу більшого з двох значень a і b;

x = (a > b ) ? a : b;

або x = a > b ? a : b;

Switch оператор вибору варіанта.

Оператор switch використовується, якщо треба вибрати одну із деяких альтернатив процесу обробки даних, тобто одно із N можливих комбінацій в залежності від значення ключа (перемикача).

Switch є мов би узагальненням оператора if (вибір одного із 2-х варіантів) на N варіантів. Оператор switch має скорочену (без default) або повну форму (з default).

Switch (B)

{ case мітка _1: [оператори)] [break;]

...,,...,,.....,,....,,…,,…..

case мітка_n : [оператори)] [break;]

[default : оператори;]

}

де B – вираз любого типа, результатом якого може бути значення цілого або символьного типу; воно визначає одну з міток, які стоять після слова case;

мітка_1  мітка_n – константний вираз, в тому числі ціла або символьна константа;

S1  SN – нуль і більше операторів, які виконуються при виборі відповідної мітки.

Break – переривання, не обов’язковий оператор завершення виконання оператора switch;

default – ключове слово, після якого стоять оператори, які виконуються, якщо результат виразу В не стоїть з жодною міткою після ключового слова case; використовується тільки в повній формі оператор switch.

Константний вираз – це вираз, який вираховується під час компіляції; він складається з раніше визначених констант і змінних, з’єднаних операціями.

Правила виконання оператора switch подібні правилам виконання оператора case в Паскалі.

1) вираховується значення виразу В (ключ).

2) це значення послідовно порівнюється з кожним значенням мітки, яка стоїть після ключового слова case;

3)якщо знаходиться значення мітки, яке співпадає з ключем, то можливі два варіанта дій в залежності від наявності оператора break;

а) якщо після оператора або групи операторів даного case стоїть оператор break, то після нього виконання оператора завершується.

б) якщо після оператора або групи операторів даного case стоїть оператор break, то після цього виконання оператора switch завершується.

4) в випадку, якщо значення ключа не співпадало з жодною міткою case , то можливий один з двох варіантів виконання в залежності від наявності або відсутності default;

а) якщо default є, то виконується оператори, які стоять після нього;

б) якщо default нема, то не виконується жоден оператор switch;

5) всі мітки варіантів одного оператора switch повинні бути різні;

6) на мітку варіантів оператора switch не рекомендується переходити за допомогою оператора goto, хоча це і допустимо.

Приклад програми з використанням оператора switch. При введенні одного із символів, ‘y’ або ‘Y’ програма виведе на екран слово “Так”, а при введенні символів ‘n’ або ‘N’ – слово “Ні”.

#include <stdio.h>

#include <conio.h>

void main()

{

char c;

clrscr (); // очистити екран

puts(“введіть символ ’Y’, ’y’ або ‘n’, ‘N’ \ ”); //введення симв. з клавіатури

с = getchar();

switch (c)

{ case ‘Y’:

case ‘y’: puts (“ Так”); break;

case ‘N’:

case ‘n’: puts (“Ні”); break;

default : printf(“Ви помилились! \n” );

}

printf(“\n Для завершення програми натисніть любу клавішу\n”);

getch ();

}

Приклад програми введення номера запитання і вибору необхідного виду посилання за допомогою оператора switch:

#include <stdio.h>

#include <conio.h>

void main()

{ int i; clrscr ();

puts (“введіть номер запитання від 1 до 4: \ ”);

scanf(“%d”, &i);

switch (i)

{ case 1: puts(“Створення файла \n”); break;

case 2: puts (“ Пошук в файлі \n”); break;

case 3: puts (“ Модифікація файлу \n”); break;

case 4: puts (“Читання файлу \n”); break;

default : printf (“Ви помилились! \n\n” );

}

printf(“ Для завершення програми натисніть любу клавішу\n”);

getch ();

}

Приклад підпрограми-функції, яка

vowel(ch)

char ch;

{

switch (ch)

{

default: return (0);

case ‘u’: case ‘U’: return (5);

case ‘a’: case ‘A’: return (1);

case ‘e’: case ‘E’: return (5);

case ‘i’: case ‘I’ : return (3);

case ‘o’: case ‘O’: return (4);

}

}

визначає, чи є символ голосною буквою. Якщо є, то повертається ціле від 1 до 5, якщо ні, то повертається 0.

0ператор default може стояти в будь якому місті. Замість break використовується оператор return – повернення. Він приводе до виходу і із оператора і із функції.

Цикли. Вкладені цикли. Переходи в програмі.

Ключові слова: while, do, for, break, continue, goto, return.

Цикл – це участок програми, який повторюється декілька разів.

Цикли використовуються тоді, якщо деякі дії треба виконати багато разів, кожний раз з новими даними. Кількість повторень визначається в залежності від типу оператора заголовку цикла. Початок виконання циклу може виконуватись тільки через оператори заголовку цикла. Завершення циклу любого типу може бути:

-в відповідності з умовами, визначенними заголовком цикла;

-по оператору goto – перехід на оператор зовні тіла цикла;

-по оператору break – вихід із цикла або

-по оператору return – вихід із функції.

В мові Сі є оператори циклу for, while, і do-while.

Якщо кількість повторів попередньо відома, то доцільно використовувати оператор for, а якщо кількість повторів визначається умовами, то оператори while або do-while.

Форма оператора цикла for:

For (сп. 1; сп 2; сп. 3) //заголовок цикла

S; //тіло цикла

Сп. 1 – список операторів, ініціюючих початкове значення, виконуються 1 раз до початку виконання тіла циклу, як правило для установки початкових значень параметрів циклу;

Сп. 2 – список операторів і виразів для перевірки кінця циклу; кінець циклу звичайно визначається на основі аналізу значення параметрів циклу, виконується перед кожним використанням циклу; якщо значення останнього виразу сп. 2 істинно (!= 0), тіло виконується, а якщо хибне (= 0) – завершується.

Сп. 3 – список операторів і(або ) для корегування параметрів циклу; виконується після кожного виконання тіла циклу.

S – простий або складений оператор тіла циклу. Всі 3 списка в тілі циклу необов’язкові.

Основні правила використання циклу for

  1. Сп 1 виконується 1 раз до початку виконання тіла циклу;

  2. Сп 2 див. раніше;

  3. Після виконання тіла циклу виконується сп 3 й перехід на п. 2;

  4. Поява в любому місці тіла цикла оператора continue дає перехід до використання сп 3, тобто до п. 3. правил;

  5. Поява оператора break викликає перехід до оператора, який йде після оператора циклу. Після виходу із цикла по оператору break або goto параметр цикла зберігає значення, при якому завершається цикл.

  6. Після нормального завершення циклу (не по goto) значення параметра циклу дорівнює значенню, яке привело до завершення виконання циклу. Наприклад, якщо межа змінних значень параметрів циклу визначена в вигляді:

for (і =1; і <5; і++) ,

то для значень і від 1 до 4 виконуються оператори тіла циклу, а при значенні і = 5 виконання циклу завершується.

  1. Якщо нема сп. 1 або сп. 2, їх крапка з комою(;) повинна залишитись в операторі заголовку циклу; наприклад

for (; ; ) for (і =1; ; і++),

– це безкінечні цикли, з яких треба вийти за допомогою операторів, break, return, goto на мітку зовні циклу.

Приклад оператора циклу типовий

for (і =1; і<20; і++)

і – параметр змінюється від 0 до 19 з кроком 1, тіло цикла виконується 20 разів.

За допомогою скороченої форми оператора for можливо реалізувати в програмі тимчасову затримку процеса виконання програми. Наприклад для обмеження часу чекання відповіді користувача

Приклад циклу з пустим оператором S:

For (n=1; n<=10000; n++);

Цей цикл рахує значення від 1 до 10000, нічого більше не роблячи. Символ ; після заголовку цикла – це пустий оператор.

Будь – який список заголовка може містити операцію кома, тобто декілька операторів і виразів, розділених комами, які виконуються зліва направо. Таким чином, оператор циклу for може мати якби декілька параметрів циклу, які змінюються синхронно (одночасно). Частіше за всі списки Сп 1 і Сп 3 – оператори присвоєння або звернення до функцій, а Сп 2 – містить вирази відношення або логічні вирази. Якщо нема сп. 1 і сп. 3, то параметр циклу мов би не розглядається.

Якщо нема сп.2 (для нього залишиться ;), то вважається, що умова перевірки кінця циклу істинна, при цьому цикл не може бути завершений по умові циклу в заголовку цикла (безкінечний цикл ), а може бути завершений тільки по оператору goto (перехід на оператор зовні тіла циклу ), за допомогою операторів break або return.

Приклад 1: Визначити сумму парних чисел від 1000 000 до 0

for (s=0.0, i=1000 000; i>=2; i- =2 ) s+=i;

Ініціюються початкові значення, після кожного разу крок параметра циклу зменшується на 2. По завершенні і=0.

Приклад 2: Вивести значення х=2і від і=1 до n по 5 значень в рядку.

#include <stdio.h>

#include <conio.h>

void main()

{ int і, n;

long x;

clrscr ();

printf(“введіть число –макс. степінь дв.\n”);

scanf(“%d ” ,&n );

printf(“\n n=%d\n” ,n);

for(x=i=1; i<=n; i++)

{

x=2; printf (“ %5d”, x);

if (i%5 = = 0) printf(“\n”);

}

printf(“\nНатисніть будь яку клавішу \n”);

getch();

}

В приведених вище прикладах оператор for мови Сі подібний іншим операторам циклів.

Але, крім того, for мови Сі має ряд інших можливостей. Розглянемо деякі з них:

  1. Для зміни значень параметра циклу (кроку) можливо використовувати любі значення і операції; приклади заголовків циклу, де корегування параметру циклу відбувається по формулі:

For (n=1000; n>0; n -- ) // n= n - 1

For (n=1000; n>0; n - = 13 ) // n= n - 13

For (x=0; x< = 200; x + = 1,5) // x= x + 1.5

For (x=1000; x>0; x - = 3.7 ) // x= x – 3.7

For (x = 1; n< = 2000; x = 1.2 ) // x= x 1.2

2. Можна використовувати і змінювати значення параметру циклу, які є символами; наприклад:

for (c = ‘a’; c< = ‘z’; c+ +) putch (c);

при виконанні цього циклу будуть виведені всі букви латинського алфавіту від а до z, для пред’явлення яких використовується відрізок натурального ряда чисел:

3. В сп. 1 можна використовувати оператор – кому, тобто декілька операторів присвоєння, які розділяються комами.

Наприклад, обчислити суму значень і для і = 1 ÷ 100

for (S = 0.0, i = 1; i< = 100; i++) S + = i;

4. В якості сп. 3 також можна використовувати один або декілька операторів і виразів для зміни змінних або параметрів циклу.

Наприклад:

For ( x = 1; y< = max; y = 5 x +10, x ++) {…..}

В заголовку циклу приклада встановлюється початкове значення х, а на закінчення циклу перевіряється значення у, а не х; в сп. 3 змінюються значення у і х.

5. Параметри, які входять в сп. 2 і сп. 3 можливо змінювати при виконанні операторів тіла циклу.

Наприклад:

For ( n = 1; n< 100; n+ = dn ) - заголовок цикла

Після декількох ітерацій можливо за допомогою if всередині тіла циклу проаналізувати необхідність зміни і змінити значення dn.

Наприклад, оператором

іf ( a > b && n > 10 ) dn = dn 2;

6. Сп. 1 необов’язково повинен ініціювати параметр цикла. На цьому місті може стояти оператор виведення, який виконується 1 раз до початку виконання циклу.

В програмі друкується речення “ Вгадайте число!” до початку циклу і програма переходе в режим чекання введення числа з клавіатури. Після введення воно перевіряється на співпадання з сп. 2. Процес повторюється до тих пір поки не буде введене задане значення (в прикладі -0). Після цього виведеться друге повідомлення: “Це те, що треба!”.

# include < coniо.h >

# include < stdio.h >

void main ()

{

int n = 0; clrscr ();

for(printf (“\n Вгадай число! \n”); n != 6; )

scanf (“%d”, &n );

printf (“%d – це те, що треба! \n”, n );

printf (“/n Для завершення натисніть клавішу \n”);

getch ();

}

7. За допомогою оператора continue можливо пропустити виконання одного і більше операторів тіла циклу і перейти до виконання сп. 3.

Наприклад:

for ( i=1; i<n; i++)

{

if (a[i] = = 0 ) continue;

b – b/ a[i]; …

}

8. За допомогою оператора break можливо закінчити виконання циклу і перейти до виконання оператора, який іде після оператора циклу.

9. Гнучкість використання циклу for збільшує операція кома.

For (i = 1, x = xn; i < = 20; i ++ , x + = dx ) {……}

  1. Операцію кома можливо використовувати в операторі тіла циклу:

For (i = 1; i< = 5; i ++)

j = i, a += i, printf ( “ j =%d a = %f \n”, j, a );

  1. В операторах заголовка циклу можливо використовувати параметр переліковного типу.

While – оператор циклу інтерактивного типу з передумовою.

While ( B(x) ) S;

Де B(x) – вираз будь –якого типу, наприклад логічний;

S – оператор простий або складений;

Тіло циклу виконується, якщо вираз B(x) істинний (!= 0); ,якщо хибний (=0), то не виконується. Якщо вираз хибний до початку першого виконання тілу циклу, то тіло циклу не виконується жодного разу.

Приклад: Дано х. Ділити його пополам, поки х буде > 0, 1.

# include < coniо.h >

# include < stdio.h >

void main ()

{

float x; clrscr ( );

printf (“ введіть дійсне число: \n”);

scanf (“%f”, &x );

while (x > 0.1 ) x/ = 2;

printf (“x = %d ”, x );

printf (“Натисніть будь яку клавішу \n”);

getch ( );

}

Приклад копіювання одного рядка в інший за допомогою пустого оператора

While (str 1 ++ = str 2 ++);

Do-while оператор циклу інтерактивного типу з післяумовою.

Аналіз закінчення циклу відбувається після виконання операторів тілу циклу. Він використовується, коли кількість повторень операторів тіла циклу невідома і визначається в процесі виконання циклу. Оператори тіла циклу повинні виконуватись хоча б один раз.

Форма оператора циклу do-while

do

S

while (B(x));

де B(x) – вираз любого типу, наприклад логічний

S – оператор, простий або складений.

Після кожного виконання циклу аналізується значення B(x):якщо воно

не дорівнює нулю, тобто істинна (=1), то цикл повторюється, якщо хибне (=0), цикл завершується. По операторам continue і break можливо перейти за останній оператор тіла циклу.

Приклад: Дано х>1. Вивести степені х, обчислення проводити доти, поки обчислене значення стане більше, ніж 108.

#include < coniо.h >

#include < stdio.h >

#include < math.h >

void main ( )

{

float x, y = 1. ; clrscr ( );

printf (“ введіть значення для піднесення до степені: \n”);

scanf (“%f”, &x );

printf (“\n x =%.0 f \n Результати: \n”, x);

do

{

y = x; printf (“ %7.0f ”, y );

}

while (y <= le8);

printf (“Натисніть клавішу \n”);

getch ( );

}

x = 3

Результати:

3 9 27 81 243 729 2187

Приклад

Ввести послідовність літер, які закінчуються признаком кінця файлу (EOF), підрахувати кількість пробілів, кількість літер “A” (беручи до уваги верхній та нижній регістри та кількість інших символів).

  1. З використанням оператора if:

#include < stdio.h >

#include < conio.h >

void main ()

{

int ka = 0, kpr = 0, kost = 0;

char c;

clrscr ( );

puts(“ введіть послідовність символів, закінчення EOF ”);

while ((c = getchar ( )) != EOF)

if ( c = = ‘ a’ | | c = = ‘A’) ka ++;

else

if (c = = ‘ ‘ | | c = = ‘\t’ | | c = = ‘\n’) kpr ++;

else kost ++;

printf (“\n Було введено \n Букв А: %3d \n ”, kpr, kost);

printf (“ Пробілів: %3d \n Інших: %3d ”, kpr, kost );

getch ( );

}

  1. З використанням оператора switch

#include < stdio.h >

#include < conio.h >

void main ()

{

int ka = 0, kpr = 0, kost = 0;

char c;

clrscr ( );

puts(“ введіть послідовність символів, закінчення EOF ”);

while ((c = getchar ( )) != EOF)

switch ( c )

{ case ‘a’: case ‘A’: ka ++; break;

case ‘ ‘: case ‘t’: case ‘\n’: kpr ++; break;

default: kost ++;

} printf (“\n Було введено \n Букв А: %3d \n ”, kpr, kost);

printf (“ Пропусків: %3d \n Інших: %3d ”, kpr, kost );

getch ( );

}

UNIX – ctrl /D - ознака закінчення файлу в системі UNIX.

MS – DOS – ctrl/z –ознака закінчення файлу в системі MS – DOS.

Приклад . Дано два дійсних числа – координати ( ) на площині. Необхідно обчислити значення :

F = 1+xy, якщо (х,у)F;

5, якщо (a,y) F

# include < stdio.h >

# include < conio.h >

void main ()

{ float x, y,p;

int n; clrscr ();

m1:

puts (“введіть координати () ”);

printf (“ \n\t x = \n”);

scanf (“%f”, &x );

printf (“\n\t y =” );

scanf (“ %f ”, &y);

if ( y <= 0&& x >= 0&& xx + yy <= 1 // попадання в нижню чверть

| | x <= 0&&y >=0&& y <=1 && x>= -1 ) // в прямокутник

p =1+ xy; else p=5;

printf (“\n Значення p =%-5.2f \n”, p);

printf (“\n Продовжуєм? Да? – введіть 7: ”);

scanf (“ %d”, &n);

if (n = = 7) goto m1;

else puts (“кінець роботи”);

}

Приклад :

Введення символу з клавіатури і виведення його на екран.

#include < stdio.h >

#include < conio.h >

void main ()

{ char ch; clrscr ( ); //очистити екран

printf (“введіть символ: \n “);

ch = getchar ( );

putchar ( ch );

printf (“ \n Для завершення програми натисніть будь-яку клавішу\n ” );

getch ( );

}

Функція getchar зі стандартного вхідного потоку stdin ( за замовчуванням – це клавіатура) зчитує черговий символ в ch – змінну лівої частини. Функція putchar виводить символ, що є параметром.

Соседние файлы в папке lexzii_08