Тема: Дані. Послідовні програми 


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



ЗНАЕТЕ ЛИ ВЫ?

Тема: Дані. Послідовні програми



Урок №2

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

Тема: Дані. Послідовні програми

Питання:

1. Елементи мови С.Основні символи.

2. Ключові слова.

3. Ідентифікатори.

4. Константи.

5. Лексеми

6. Коментарі

Елементи мови С.Основні символи

Безліч символів, що використовуються в мові C, можна розділити на п'ять груп:

- символи, використовувані для запису ключових слів і ідентифікаторів, до яких відносяться прописні і малі літери англійського алфавіту та символ підкреслення (_). Слід зазначити, що однакові прописні і малі літери вважаються різними символами, так як мають різні коди (A, a - різні символи). Компілятори мов C і C + + розпізнають прописні і малі літери;

- арабські цифри 0,..., 9;

-роздільники:,.;:? '"! | / \ ~ * () {} [] <> + - & #% = _., Що використовуються, з одного боку, для організації процесу обчислень, а з іншого - для передачі компілятору певного набору інструкцій;

- пробільні символи (пробіл, символи табуляції, перекладу рядка, кінця файлу), що відокремлюють один від одного об'єкти, визначені користувачем (константи, ідентифікатори). Послідовність пробільних символів розглядається компілятором як один символ (послідовність пробілів);ESC- символи (escape-символи, escape-послідовності або керуючі послідовності), тобто послідовність символів, що починається з символу \ (зворотній похилій риси), використовувана для представлення в програмі коду одного символу, як друкованого, так і недрукованих.

\ a - звуковий сигнал

\ b - повернення на крок

\ f - переклад сторінки

\ n - новий рядок

\ r - повернення каретки

\ t - горизонтальна табуляція

\ v – вертикальна табуляція

\ \ - похила риса

\ "- подвійна лапка

\ '- одиночна лапка

\ ooo - 8-ковий код

\ xhh - 16-ковий код.

Ключові слова

Зарезервовані мовою C службові слова, що мають певний сенс для компілятора

auto

do

for

return

switch

const

break

double

goto

short

typedef

restrict

case

else

if

signed

union

volatile

char

enum

int

sizeof

unsigned

_Bool

continue

extern

long

static

void

_Complex

default

float

register

struct

while

_Imaginary

В якості ключових слів в C + + з'явилися додатково: asm, catch, class, delete, friend, inline, new, operator, overload, private, protected, public, template, this, throw, try, virtual.

Ідентифікатори

Ідентифікатором називається ім'я якого об'єкта в програмі (змінної, функції і т. д.).

Для утворення ідентифікаторів можуть бути використані рядкові або прописні букви латинського алфавіту, цифри і символ підкреслення '_'. Першим символом в ідентифікаторі повинна бути буква. Допускається використання в якості першого символу знаку підкреслення '_'.

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

Відзначимо ряд обмежень при виборі ідентифікатора.

По-перше, ідентифікатор не повинен співпадати з ключовими і зарезервованими словами, іменами бібліотечних функцій.

По-друге, слід звернути особливу увагу на використання символу підкреслення в якості першого символу ідентифікатора. Ідентифікатори, побудовані таким чином, з одного боку, можуть збігатися з іменами системних функцій / змінних, а з іншого боку, при використанні таких ідентифікаторів програми можуть виявитися нестерпними, тобто їх не можна буде використовувати на комп'ютерах інших типів, тому доцільно починати ідентифікатор з малої літери, наприклад, x1, a_prim і т. д.

Константи

Константами називаються незмінні в програмі величини.

У мові C визначені наступні типи констант:

- цілі;

- з плаваючою точкою;

- символьні;

- рядкові (літерали).

Ціла константа - ціле позитивне число, представлене в десятковій, вісімковій або шістнадцятковій системах числення.

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

Вісімкова константа складається з обов'язкового нуля і однієї або декількох вісімкових цифр (0,1,2,3,4,5,6,7), наприклад, 017. Шістнадцяткова константа починається з обов'язкової послідовності 0х або 0Х і містить одну або декілька шістнадцяткових цифр (0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F), наприклад, 0x6E або 0x6e.

Для формування негативної цілої константи використовують знак мінус перед записом константи, званий унарний мінус:

-42, -073,-0x5F.

Кожній цілої константі присвоюється тип, що визначає перетворення, які повинні бути виконані, якщо константа використовується в виразах.

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

Для того щоб будь цілої константі був привласнений тип long, достатньо в кінці константи поставити букву l або L, наприклад, 5l, 6l, 128L, 0105L, 0X2A1L.

Константа з плаваючою точкою представляється у вигляді десяткового числа в форматі з фіксованою точкою ([цифри]. [Цифри]) або з плаваючою точкою ([цифри]. [Цифри] [Е / e [+ | -] цифри]), в експоненційному (напівлогарифмічному) вигляді.

Константи з плаваючою точкою складаються з цілої і дробової частини та (або) експоненти. Константи з плаваючою точкою за замовчуванням являють собою позитивні величини подвоєною точності, тобто мають тип double. Наприклад, 3.14159; 3E8; 1.;.2; 3.73e-19.

Якщо константа закінчується символом F або f, то вона має тип float, а якщо L або l, то long double (42.F; 1.602e-19L).

Символьна константа представляється символом, укладеними в апострофи: 'm', '7 ','; '. Значенням символьної константи є числовий код символу таблиці ASCII.

Керуючі послідовності, тобто спеціальні символьні комбінації, що використовуються у функціях введення / виводу інформації, розглядаються як одиничні символи, і їх допустимо використовувати в символьних константах. Нагадаємо, що керуюча (escape) послідовність використовує зворотний похилу риску - слеш

(Обов'язковий перший символ) і комбінацію латинських букв і цифр: '\ n' - новий рядок; '\ a' - дзвінок; '\ v' - вертикальна табуляція і т. д.

Символьні константи в мові C і C + + мають тип char.

Строкова константа (літерал) - це послідовність символів, що включає великі та малі літери російського і латинського алфавітів, цифри та знаки, укладені в лапки, наприклад, "C + +"; "Hello, Mary", "2005 рік".

В кінець кожного строкового літерала компілятором додається нульовий символ, що представляється керуючої послідовністю '\ 0'.

Строковий літерал має тіпstatic char (статичний масив символів). Число елементів масиву дорівнює числу символів у рядку плюс 1, так як компілятор додає нульовий символ в кінець літерала. Всі рядкові літерали розглядаються компілятором як різні об'єкти. Якщо в програмі використовується декілька ідентичних рядків, то кожна буде поміщена в свою область пам'яті.

Лексеми

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

У ряді випадків лексеми можуть бути зрозумілі компілятором невірно, наприклад, x --- y буде сприйнято як (x -) - (y), а не як (x) - (- y).

Для виключення неоднозначності рекомендується використовувати дужки.

Коментарі

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

Формат коментаря: / *-символ * /, наприклад, / * Це коментар * /.

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

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

1. Які основні елементи в мові С?

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

3. Що таке константи?

4. Як в программі позначається коментар?

Література:

1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 44-51.

Урок №3

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

Тема: Програми з розгалуженням.

Питання:

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

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

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

Форми оператора 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

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

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

Перерахування типу (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

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

Cтруктури

Cтруктура - це складовий об'єкт, в який входять елементи будь-яких типів, за винятком функцій. На відміну від масиву, який є однорідним об'єктом, структура може бути неоднорідною. Тип структури визначається записом виду:

struct {список визначень}

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

тип-даних описувач;

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

Приклад:

struct {double x, y;} s1, s2, sm [9];

struct {int year;

char moth, day;} date1, date2;

Змінні s1, s2 визначаються як структури, кожна з яких складається з двох компонент х і у. Змінна sm визначається як масив з дев'яти структур. Кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day. > P> Існує й інший спосіб асоціювання імені з типом структури, він заснований на використанні тега структури. Тег структури аналогічний тегу перечислимого типу. Тег структури визначається наступним чином:

struct тег {список описів;};

де тег є ідентифікатором.

У наведеному нижче прикладі ідентифікатор student описується як тег структури:

struct student {char name [25];

int id, age;

char prp;};

Тег структури використовується для подальшого оголошення структур даного виду у формі:

struct тег список-ідентифікаторів;

Приклад:

struct studeut st1, st2;

Використання тегів структури необхідно для опису рекурсивних структур. Нижче розглядається використання рекурсивних тегів структури.

struct node {int data;

struct node * next;} st1_node;

Тег структури node дійсно є рекурсивним, оскільки він використовується в своєму власному описі, тобто у формалізації покажчика next. Структури не можуть бути прямо рекурсивними, тобто структура node не може містити компоненту, яка є структурою node, але будь-яка структура може мати компоненту, яка є покажчиком на свій тип, як і зроблено в наведеному прикладі.

Доступ до компонентів структури здійснюється за допомогою вказівки імені структури і наступного через точку імені виділеного компонента, наприклад:

st1.name = "Іванов";

st2.id = st1.id;

st1_node.data = st1.age;

Об'єднання (суміші)

Об'єднання подібно структурі, однак в кожний момент часу може використовуватися (або іншими словами бути відповідним) тільки один з елементів об'єднання. Тип об'єднання може задаватися в наступному вигляді:

union {опис елемента 1;

...

опис елемента n;};

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

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур. Тег об'єднання може бути формалізований точно так само, як і тег структури.

Об'єднання застосовується для наступних цілей:

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

- Інтерпретації основного уявлення об'єкта одного типу, як якщо б цьому об'єкту був присвоєний інший тип.

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

Приклад:

union {char fio [30];

char adres [80];

int vozrast;

int telefon;} inform;

union {int ax;

char al [2];} ua;

При використанні об'єкта infor типу union можна обробляти тільки той елемент який отримав значення, тобто після присвоєння значення елементу inform.fio, не має сенсу звертатися до інших елементів. Об'єднання ua дозволяє отримати окремий доступ до молодшого ua.al [0] і до старшого ua.al [1] байтам двухбайтного числа ua.ax.

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

1.Що таке структура?

2. Який синтаксис має структура?

3. Що таке обєднання?

Література:

1.Шилдт Г.: Пер. с англ. –М.: Издательский дом “Вильямс”, 2002. –704с. –стор 170-181

 

Урок №17

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

Робота з структурами.

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

Формат 1: = ініціатор;

Формат 2: = {список - ініціаторів};

Формат 1 використовується при ініціалізації змінних основних типів і покажчиків, а формат 2 - при ініціалізації складових об'єктів.

Приклади:

char tol = 'N';

Змінна tol ініціалізується символом 'N'.

const long megabute = (1024 * 1024);

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

static int b [2] [2] = {1,2,3,4};

Ініціалізація структур

Ініціалізується двомірний масив b цілих величин елементів масиву привласнюються значення зі списку. Ця ж ініціалізація може бути виконана таким чином:

static int b [2] [2] = {{1,2}, {3,4}};

При ініціалізації масиву можна опустити одну або декілька размерностей

static int b [3 [] = {{1,2}, {3,4}};

Якщо при ініціалізації вказано менше значень для рядків, то решта елементи инициализируются 0, тобто при описі

static int b [2] [2] = {{1,2}, {3}};

елементи першого рядка отримають значення 1 і 2, а другий 3 і 0.

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

Приклади:

struct complex {double real;

double imag;} comp [2] [3] =

{{{1,1}, {2,3}, {4,5}},

{{6,7}, {8,9}, {10,11}}};

У даному прикладі ініціалізується масив структур comp з двох рядків і трьох стовпців, де кожна структура складається з двох елементів real і imag.

struct complex comp2 [2] [3] =

{{1,1}, {2,3}, {4,5}, {6,7}, {8,9}, {10,11}};

У цьому прикладі компілятор інтерпретує розглядаються фігурні дужки наступним чином:

- Перша ліва фігурна дужка - початок складеного ініціатора для масиву comp2;

- Друга ліва фігурна дужка - початок ініціалізації першого рядка масиву comp2 [0]. Значення 1,1 присвоюються двом елементам першої структури;



Поделиться:


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

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