Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Умовні оператори. Логічні вирази

Поиск

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

Логічний вираз (ЛВ) - це вираз, який набуває одне з двох значень: істина або брехня.

На відміну від інших мов програмування в C (C89) немає спеціального типу для логічних змінних і констант. Однак результат у ЛВ є завжди. У мові C, якщо значення ЛВ дорівнює нулю, то воно помилково, будь ненульове ЛВ істинно.

Найпростіші ЛВ - будь вирази (зокрема, змінна, арифметичний вираз).

Відношення має структуру: V1 OP V2;

де V1, V2 - вирази, OP - знак операції відносини.

Операції <, <=,>,> = є операціями одного рівня і виконуються в порядку їх написання зліва / направо; операції == і! = Мають нижчий пріоритет.

Наступний рівень ЛВ - логічні вирази з використанням логічних операцій І (&&), АБО (| |), НЕ (!). В круглих дужках представлені позначення цих операцій в C.

Алгебраїчна запис в C

<

<

<=

>

>

>=

=

==

!=

Правила запису і результат звичайні. Ієрархія операцій, якщо порядок їх виконання в ЛВ не повністю визначений круглими дужками: ​​

Рівень ієрархії

1 - ()

2 -!(НЕ)++ ––

3 - *(умножение)/%

4 - +–

5 - < <= > >=

6 - ==!=

7 - &&(И)

8 - ||(ИЛИ)

9 - = *= /= %= += –=

Форми оператора if

У загальному вигляді синтаксис оператора if наступний:

if (ЛВ) OP1;

else OP2.

При істинному значенні ЛВ виконується оператор ОР1, в іншому випадку - ОР2, іноді використовується і інша форма умовного оператора

if (ЛВ) OP;

якщо ЛВ істинно - виконується OP, в іншому випадку OP пропускається.

Якщо при ЛВ, що має значення «істина», необхідне виконання декількох операторів, то їх треба укласти у фігурні дужки {}.

У структурі операторів if дії OP1 і OP2 можуть бути представлені будь-якими операторами, в тому числі і умовними. У цьому випадку, якщо порядок виконання операцій не повністю визначений дужками {}, правило реалізації наступне: до кожного if відноситься найближчим else і т. д.

Оператор вибору switch

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

Структура оператора наступна:

switch (вираз)

{case константні вираз: оператор або група операторів

break;

case константні вираз: оператор або група операторів

break;

...............

default: оператор або група операторів}

Значення виразу оператора switch має бути цілочисловим. Це означає, що у виразі можна використовувати змінні тільки цілого або символьного типу. Результат обчислення виразу по черзі порівнюється з кожним з константних виразів. Якщо в якій-небудь рядку знаходиться збіг, управління передається на відповідну мітку case, і виконується пов'язана з нею група операторів. Виконання продовжується до кінця тіла оператора switch або поки не зустрінеться оператор break, який передає управління з тіла switch оператору, наступному за закриваючою дану конструкцію фігурною дужкою.

Застосування оператора break в контексті блоку switch є звичайним. Без нього після виконання варіанта case, який відповідає значенню керуючого вираження, оператор switch продовжить свою роботу, при цьому будуть виконані всі наступні варіанти case і гілка default.

Оператор, пов'язаний з default, виконується, якщо вираз не співпало з жодним з константних виразів в case. Оператор default не обов'язково розташовується в кінці конструкції. Крім того, він і сам не обов'язковий. У цьому випадку при відсутності збігів не виконується жоден оператор. Не допускається збіг константних виразів.

Приклад 1. За номером дня тижня, введеному з клавіатури, вивести на екран назву дня тижня:

# Include <stdio.h>

int main(void)

{

char day;

printf ("Введіть номер дня тижня \ n");

scanf ("% c», & day);

switch (day)

{

case'1 ': printf ("Понеділок \ n"); break;

case'2 ': printf ("Вівторок \ n"); break;

case'3 ': printf ("Середа \ n"); break;

case'4 ': printf ("Четвер \ n"); break;

case'5 ': printf ("П'ятниця \ n"); break;

case'6 ': printf ("Субота \ n"); break;

case'7 ': printf ("Неділя \ n"); break;

default: printf ("Помилка вводу \ n");

}

return 0;

}

У цьому прикладі змінна day, керуюча оператором switch, має символьний тип. При введенні з клавіатури символів 1, 2,... 7 на екран виводиться назва відповідного дня тижня. При введенні будь-якого іншого символу на екран виводиться повідомлення про помилку. Приклад 2. За номером місяця, введеному з клавіатури, вивести на екран назву пори року:

# include <stdio.h>

int main (void)

{int month;

printf ("Введіть номер місяця в році \ n");

scanf ("% d", & month);

switch (month)

{

case 12:

case 1:

case 2: printf ("Зима \ n"); break;

case 3:

case 4:

case 5: printf ("Весна \ n"); break;

case 6:

case 7:

case 8: printf ("Літо \ n"); break;

default: printf ("Помилка вводу \ n"); break;

case 9:

case 10:

case 11: printf ("Осінь \ n");

}

return 0;}

У цьому прикладі оператор switch управляється цілочисельний змінної month. При введенні в цю змінну значень 12, 1 або 2 виконується одне і те ж дія - виведення на екран слова "Зима", так як в гілках case 12: і 1: немає жодного оператора. При введенні значення 12, наприклад, виконання switch почнеться зі строчки case 12:, потім буде виконана рядок case 1:, потім оператори рядки case 2:, останній з яких - break - завершить виконання оператора switch. Зверніть увагу також на становище гілки default - зовсім не обов'язково поміщати її останньої в switch.

Питання для контролю:

1. Що таке логічний вираз?

2. Які можна використовувати умови в С?

3. Що таке оператор вибору?

4. Який оператор здійснює умову?

Література:

1. Шпак З.Я. Програмування мовою С: Навчальний посібник. Львів: Оріяна-Нова, 2006. - 432 с –Стор 51-75

Урок №5

(згідно робочої навчальної програми)

Тема:Перерахування. Перетворення типів

Питання:

1. Перерахування типів

2. Перетворення типів

Перерахування типів

Перерахування типу (type conversion) - перетворення значення змінної одного типу в значення іншого типу. Виділяють явне і неявне приведення типів.

При явному приведенні вказується тип змінної, до якого необхідно перетворити вихідну змінну.

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

Само приведення відбувається як під час присвоювання значення змінної, так і при операціях порівняння, обчислення виразу. При використанні в виразі кілька різних типів значення одного або кількох підтипів може бути здійснене перетворення до більш загального типу (супертіп), з великим діапазоном можливих значень.

У мові C:

double d; / тип з плаваючою крапкою

long l; / / цілий тип

int i; / / цілий тип

if (d> i) d = i;

if (i> l) l = i;

if (d == l) d * = 2;

Кожного разу при виконанні операцій порівняння або присвоювання змінні різних типів будуть приведені до єдиного типу. Слід з обережністю використовувати неявне приведення типу. При перекладі числа з речовинного типу в цілочисельний, дробова частина відсікається. Зворотне приведення з цілочисельного типу до вещественному також може привести до пониження точності, що пов'язано з різним поданням речових і цілочисельних чисел на машинному рівні. Наприклад, речовинний тип single стандарту IEEE 754 не може точно уявити число 16777217, в той час як 32-бітовий цілочисельний тип може. Це може призвести до ситуацій, коли порівняння на рівність одного і того ж числа, представленого типами (int і single) буде видавати помилковий результат (числа не рівні один одному).

Перетворення типів

При виконанні операцій відбуваються неявні перетворення типів в наступних випадках:

- При виконанні операцій здійснюються звичайні арифметичні перетворення (які були розглянуті вище);

- При виконанні операцій присвоювання, якщо значення одного типу присвоюється змінної іншого типу;

- При передачі аргументів функції.

Крім того, в Сі є можливість явного приведення значення одного типу до іншого.

В операціях присвоювання тип значення, що присвоюється, перетвориться до типу змінної, яка отримує це значення. Допускається перетворення цілих і плаваючих типів, навіть якщо таке перетворення веде до втрати інформації.

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

Перетворення цілого зі знаком до плаваючого типу відбувається без втрати інформації, за винятком випадку перетворення значення типу long int або unsigned long int до типу float, коли точність часто може бути втрачена.

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

Цілі значення без знака перетворюються до плаваючого типу, шляхом перетворення цілого без знака до значення типу signed long, а потім значення signed long перетвориться в плаваючий тип. Перетворення з unsigned long до типу float, double або long double виробляються з втратою інформації, якщо значення, яке більше, ніж максимальне позитивне значення, яке може бути представлене для типу long.

Перетворення плаваючих типів. Величини типу float перетворюються до типу double без зміни значення. Величини double і long double перетворюються до float c деякою втратою точності. Якщо значення дуже велике для float, то відбувається втрата значущості, про що повідомляється під час виконання.

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

Перетворення з float, double або long double до типу unsigned long проводиться з втратою точності, якщо значення, яке більше, ніж максимально можливе позитивне значення, представлене типом long.

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

Покажчик на тип void може бути перетворений до покажчика на будь-який тип, і покажчик на будь-який тип може бути перетворений до покажчика на тип void без обмежень. Значення покажчика може бути перетворено до цілої величини. Метод перетворення залежить від розміру покажчика та розміру цілого типу наступним чином:

- Якщо розмір покажчика менше розміру цілого типу або дорівнює йому, то покажчик перетвориться так само, як ціле без знаку;

- Якщо покажчик більше, ніж розмір цілого типу, то покажчик спочатку перетвориться до вказівником з тим же розміром, що і цілий тип, і потім перетвориться до цілого типу.

Цілий тип може бути перетворений до адресного типу за наступними правилами:

- Якщо цілий тип того ж розміру, що і покажчик, то ціла величина просто розглядається як покажчик (ціле без знаку);

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

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

Ці перетворення виконуються незалежно для кожного аргументу. Величини типу float перетворяться до double, величини типу char і short перетворяться до int, величини типів unsigned char і unsigned short перетворяться до unsigned int. Можуть бути також виконані неявні перетворення змінних типу вказівник. Ставлячи прототипи функцій, можна перевизначити ці неявні перетворення і дозволити компілятору виконати контроль типів.

Перетворення при приведенні типів. Явне перетворення типів може бути здійснене за допомогою операції приведення типів, яка має формат:

(Ім'я-типу) операнд.

У наведеній записи ім'я-типу задає тип, до якого повинен бути перетворений операнд.

приклад:

int i = 2;

Питання для контролю:

1. Що таке перерахування типів?

2. Що таке перетворення типів?

3. Які типи данних можна використовувати при перерахуванні?

Література:

1. Шпак З.Я. Програмування мовою С: Навчальний посібник. Львів: Оріяна-Нова, 2006. - 432 с –Стор 77-81

Урок №6

(згідно робочої навчальної програми)

Тема: Циклічні програми

Питання:

1.Оператори циклу

2. Оператор while

3. Оператор for

4. Оператор do-while

5. Оператори переходу

Оператори циклу

У мові C, як і в інших мовах програмування, оператори циклу служать для багатократного повторення послідовності операторів до тих пір, поки виконується деяка умова. Цикл складається з заголовка і тіла циклу. Вхід в цикл і вихід з циклу здійснюються через заголовок циклу. У C існують три види циклів: for, while, do-while.

Оператор while

Ключове слово while дозволяє виконувати оператор або групу операторів до тих пір, поки умова не перестане бути істинним.

Синтаксис: while (ЛВ) ОP;

де ЛВ - логічне вираження, ОP - тіло циклу (простий або складений оператор).

Отже:

якщо ЛВ - істинно, виконується ОР, потім знову перевіряється ЛВ і так далі;

якщо ЛВ - помилково, ОР пропускається, і управління передається на оператор, наступний за тілом циклу.

Оскільки перевірка ЛВ виконується перед тілом циклу, цикл while називають циклом з передумовою.

Якщо ЛВ спочатку хибно, тіло циклу while не виконається жодного разу.

Приклад програми

Обчислити значення sin (x) для деякого x із заданою точністю шляхом розкладання в степеневий ряд, за умови, що x> e:

# Include <stdio.h>

# Include <math.h>

# Define EPS 0.001

int main (void)

{ float x, S = 0, U;

int i = 0;

printf («\ n Input x →");

scanf ("% f", & x);U=x;

while (fabs (U)> EPS) / * fabs - функція обчислення

абсолютного значення, оголошена в math.h * /

{S + = U;

+ + I;

U * = (-x) * x;

U / = 2 * i * (2 * i +1);

}

printf ("\ n sin (% f) =% 7.3f", x, S);

return 0;}

Оператор for

Оператор циклу for дозволяє виконувати оператор або групу операторів заздалегідь задану кількість разів.

Загальна форма оператора

for (V1; ЛВ; V2) ОP;

де V1 - вираз, в якому проводиться присвоювання змінної, званої параметром циклу, початкового значення (ініціалізація); ЛВ - умова, що визначає, чи слід в черговий раз виконувати оператор (тіло циклу); V2 - вираз, в якому проводиться зміна змінної циклу (прирощення); ОР - оператор або група операторів.

Принцип роботи:

- обчислюється V1;

- обчислюється ЛВ;

- якщо ЛВ істинно, виконується ОР, потім обчислюється V2;

- перевірка ЛВ → ОP → V2 і т. д.

Коли ЛВ стає помилковим, здійснюється перехід до оператора, наступного за ОP. Якщо ОP - складений оператор, то його треба укласти в {}.

Якщо ЛВ відразу помилково, то ні ОР, ні V2 не виконуються жодного разу.

Відзначимо дві додаткові можливості оператора for в порівнянні з оператором while:

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

- прo можливість включення вирази V2, яке буде використовуватися після кожної ітерації оператора ОР.

Приклад 1. Обчислити значення функції sin (x) в рівновіддалених точках на інтервалі [0, 4π]. Кількість розрахункових точок вводиться з клавіатури:

#include <stdio.h>

#include <math.h>

int main(void)

{int n;

float x, y;

float x1=0, x2=4*M_PI;

printf("Введіть кількість точок\n");

scanf("%d",&n);

x=x1;

float step=(x2−x1)/(n−1);

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

{y = sin(x);

printf("%3d %8.3f %8.3f\n",i,x,y);

x+=step;}

return 0;

}

У цьому прикладі кількість точок задається в цілочисельний змінної n, межі інтервалу зміни x - в змінних x1 і x2, які мають дійсний тип і ініціалізувалися при оголошенні. M_PI - макрос, який представляє число π, оголошений в заголовному файлі math.h. Там же оголошена функція sin ().

Слід мати на увазі, що всі три вирази - V1, ЛВ, V2 є необов'язковими. В якості ОP може бути використаний порожній оператор.

Можливі конструкції:

for (V1;; V2) ОP (нескінченний цикл); for (; ЛВ;) ОP і навіть for (;;).

Зауважимо, що за допомогою операторів for і while можна створювати нескінченні цикли, якщо опустити всі три вирази в операторі for і використовувати завжди істинне ЛВ в while. Такі програми не можна назвати коректними, але існують способи завершення самих некоректних циклів.

Допускається використання оператора for, коли є декілька початкових виразів виду V1, перерахованих через кому, і кілька виразів виду V2, також перерахованих через кому. Конструкція такого виду носить назву - операція кома.

Використовуючи операцію кома, складемо програму обчислення все того ж sin (x):

# Include <stdio.h>

# Include <math.h>

# Define EPS 0.001

int main (void)

{

float x, S, U;

int i;

printf ("\ n Input x?");

scanf ("% f", & x);

for (S = 0, U = x, i = 0; fabs (U)> EPS; S + = U, i + +, U * = (-x / 2 * i +1)));

printf ("\ n sin (% 6.3f) =% 7.3f", x, S);

return 0;

}

Оператор do-while

У циклі do-while перевірка умови проводиться після виконання тіла циклу:

do ОP while (ЛВ)

дія

- виконується ОР;

- якщо ЛВ істинно, повторюється виконання ОР, у противному випадку здійснюється перехід до оператора, наступного за while.

Якщо в циклі повинно виконуватися кілька операторів, вони полягають в {}. Даний цикл носить назву циклу з постусловіем, тобто при будь-якому ЛВ тіло циклу виконується хоча б один раз.

З використанням раніше записаної формули розкладання обчислимо y = sin (x) з точністю e:

# include <stdio.h>

# include <math.h>

# define EPS 0.001

int main (void)

{

float x, S = 0, U;

int i = 0;

printf ("\ n Input x →");

scanf ("% f", & x);

U = x;

do

{

S + = U;

+ + i;

U * = (-x) * x;

U / = 2 * i * (2 * i +1);

}

while (fabs (U)> EPS);

printf ("\ n sin (% 6.3f) =% 7.3f", x, S);

return 0;

}

Оператори переходу

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

У мові C визначено чотири оператора переходу: break, continue, return і goto. Оператори break і continue можна використовувати в будь-якому з операторів циклу. Зауважимо, що вхід в тіло циклу з оператора, розташованого поза цього циклу, неможливий. Можливі вихід з циклу до його нормального завершення та обхід частині циклу при деяких умовах.

Оператор break, як зазначено раніше, можна також використовувати в операторі switch. Оператори return і goto можна використовувати в будь-якому місці всередині функції.

Оператор break

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

Наприклад, у програмі

# Include <stdio.h>

int main (void)

{

int num, count = 0;

for (;; count + +)

{

printf ("\ n num →");

scanf ("% d", & num);

if (num <0) break;

}

printf ("\ n count =% d", count);

return 0;

}

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

Можна сказати, що оператор continue трохи схожий на оператор break. Оператор break викликає переривання циклу, а continue - переривання поточної ітерації циклу і перехід до наступної ітерації.

Приклад програми: проводиться генерація випадкових чисел за допомогою функції rand () до тих пір, поки не буде знайдено 10 непарних чисел.

При генерації парного числа виконується оператор continue, передавальний керування на початок циклу:

# include <stdio.h>

# include <stdlib.h>

# include <time.h>

InitRoutin () / * створюємо функцію ініціалізації генератора випадкових чисел * /

{

printf ("Ініціалізація генератора випадкових чисел \ n");

srand (time (NULL)); / * оголошена в time.h * /

return 0;

}

int main (void)

{

int count = 0;

for (InitRoutin (); count <10;)

{

int val = rand (); / * rand ()-генератор випадкових чисел, оголошена в stdlib.h * /

if (val% 2 == 0) / * перевірка на парність * /

{

putchar ('.');

continue;

}

count + +;

 

printf ("Знайдено непарне число:% d \ n", val);

}

return 0;

}

оператор return

Завершує виконання функції, в якій він заданий, і повертає управління в зухвалу функцію. Управління передається в зухвалу функцію в точку, безпосередньо наступну за викликом.

Синтаксис: return (вираз);

Значення обчисленого в операторі return вираження повертається в зухвалу функцію в якості результату викликається функції. Якщо вираз опущено, то повертане функцією значення не визначено (функції типу void).

Якщо оператор return в викликається функції відсутнє, управління автоматично передається в зухвалу функцію після виконання останнього оператора функції. Повертане функцією значення в цьому випадку не визначено.

Отже, оператор return використовується в 2-х випадках:

- якщо треба негайно вийти з функції;

- якщо функція повинна повертати значення.

Наприклад, у першому випадку:

void print (char x) / * створення функції print * /

{

if (x <32)

{

printf ("Це керуючий код \ n");

return; / * return використовується для виходу з функції * /

}

printf ("Введено символ% c \ n", x);

}

у другому випадку:

int sum (int a, int b) / * створення функції sum * /

{

return (a + b); / * return використовується для повернення суми * /

}

Питання для контролю?

1.Які є оператори циклу?

2. Як стровити умову?

3. Які є оператори переходу?

4.Який синтаксис команди return?

Література:

1. Я. Белецкий, “ Турбо Си. Новая разработка”, Моcква, “Машиностроение”, 2004г,с. 92-101

Урок №16

(згідно робочої навчальної програми)



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 500; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.131.13.24 (0.012 с.)