Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Директиви включення



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

#include <file_1>

#include <file_2>

...

#include <file_n>

По-перше, слід звернути увагу на те, що на відміну від більшості операторів, ця директива не завершується крапкою з комою. Використання таких директив призводить до того, що препроцесор підставляє на місце цих директив тексти файлів у відповідності з тими, що перелічені у дужках <... >. Якщо ім'я файла міститься у таких дужках, то пошук файлу буде проводитися у спеціальному каталозі файлів для включення (як, правило, каталог INCLUDE, усі файли з розширенням *.h - header-файли). Якщо даний файл у цьому каталозі буде відсутнім, то препроцесор видасть відповідне повідомлення про помилку, яка є досить типовою для початківців при роботі в інтегрованому середовищі:

< Unable to open include file 'file.h'>

<Неможливо відкрити файл включення ' file.h'>

У цьому випадку достатньо перевірити не тільки наявність header-файлу у відповідній директорії, але й впевнитися у тому, що опція Options\Directories дійсно відповідає правильному диску та спеціальному каталогу, де розташовані файли включення.

Існує і другий спосіб - вказівка імені файла у подвійних лапках - "file_n.txt ", так найчастіше підключають програмісти власностворені файли включення. Тоді пошук файлу ведеться у поточній директорії активного диску, якщо ж пошук буде невдалим, система закінчує його у спеціальному каталозі для header-файлів, як і у загальному випадку. Найбільш частим у початківців є включення файлу "stdio.h":

#include <stdio.h>

main()

{

printf("Hello!...\n");

return 0;

}

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

1.4 Основні операції

Операції подібні вбудованим функціям мови програмування. Вони застосовуються до виразів (операндів). Більшість операцій мають два операнди, один з яких розташовується перед знаком операції, а інший - після. Наприклад, два операнди має операція додавання А+В. Операції, які мають два операнди називаються бінарними. Існують і унарні операції, тобто такі, які мають лише один операнд. Наприклад, запис -А означає застосування до операнду А операції унарного мінуса. А три операнди має лише одна операція -?:. Це єдина тернарна операція мови Сі.

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

За призначенням операції можна поділити на:

• арифметичні операції;

• операції присвоювання;

• операції відношення;

• логічні операції;

• порозрядні операції;

• операція обчислення розміру sizeof();

• умовна операція?;

• операція слідування (кома).

1.4.1 Арифметичні операції

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

Таблиця 1.5.Бінарні арифметичні операції
Операція Значення Приклад
+ Додавання a+b
- Віднімання a-b
* Множення a*b
/ Ділення a/b
% Залишок від ділення a%6

Для наведених арифметичних операцій діють наступні правила:

• бінарні операції додавання (+) та віднімання (-) можуть застосовуватися до цілих та дійних чисел, а також до покажчиків;

• в операціях множення (*) та ділення (/) операнди можуть бути будь-яких арифметичних типів;

• операція "залишок від ділення" застосовується лише до цілих операндів.

• операції виконуються зліва направо, тобто спочатку обчислюється вираз лівого операнда, потім вираз, що стоїть справа від знака операції. Якщо операнди мають однаковий тип, то результат арифметичної операції має той же тип. Тому, коли операції ділення / застосовується до цілих або символьних змінних, залишок відкидається. Так, вираз 11/3 буде рівний 3, а вираз 1/2 буде рівним нулю.

В мові Сі визначені також і унарні арифметичні операції (таблиця 1.5.).

Таблиця 1.5.Унарні арифметичні операції
Операція Значення Приклад
+ Унарний плюс (підтвердження знака) +5
- Унарний мінус (зміна знака) -x
++ Операція інкременту (збільшення на 1) i++, ++i
-- Операція декременту (зменшення на 1) j--, --j

Операція інкременту (++) збільшує операнд на одиницю, а операція декременту (--) відповідно зменшує операнд на одиницю. Ці операції виконуються швидше, ніж звичайні операції додавання одиниці (a=a+1;) чи віднімання одиниці (a=a-1;).

Існує дві форми запису операцій інкременту та декременту: префіксна та постфіксна.

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

Приклад, який демонструє роботу операції інкременту:

#include<stdio.h>

void main()

{

int x=3,y=3;

printf("Значення префіксного виразу: %d\n ",++x);

printf("Значення постфіксного виразу: %d\n ",y++);

printf("Значення х після інкременту: %d\n ",x);

printf("Значення y після декременту: %d\n ",y);

}

1.4.2 Операції присвоювання

В мові Сі знак = не означає "дорівнює". Він означає операцію присвоювання деякого значення змінній. Тобто зміст рядка вигляду "vr1=1024;" не виражається словами "vr1 дорівнює 1024". Замість цього потрібно казати так: "присвоїти змінній vr1 значення 1024".

Перелік операцій присвоювання мови Сі ілюструє таблиця 1.6.

Таблиця 1.6.Операції присвоювання
Операція Значення
a = b присвоювання значення b змінній а
a += b додавання з присвоюванням. Означає a = a + b
a -= b віднімання з присвоюванням. Означає a = a - b
a *= b множення з присвоюванням. Означає a = a * b
a /= b ділення з присвоюванням. Означає a = a / b
a %= b залишок від ділення з присвоюванням. Означає a = a % b
a <<= b зсув вліво з присвоюванням. Означає a = a << b
a >>= b зсув вправо з присвоюванням. Означає a = a >> b
a &= b порозрядне І з присвоюванням. Означає a = a & b
a |= b порозрядне АБО з присвоюванням. Означає a = a | b
a ^= b побітове додавання за МОД2 з присвоюванням, означає a = a ^ b

Операція присвоювання повертає як результат присвоєне значення. Завдяки цьому в мові Сі допускаються присвоювання виду:

a=(b=c=1)+1;

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

#include<stdio.h>

void main()

{

int data1, data2, data3;

data1=data2=data3=68;

printf("\ndata1==%d\ndata2==%d\ndata3==%d",

data1,data2,data3);

}

Результат роботи програми виглядає так:

data1==68

data2==68

data3==68

data1=data2=data3=68;

Присвоювання відбувається справа наліво: спочатку змінна data3 отримує значення 68, потім змінна datа2 і нарешті data1.

1.4.3 Операції порівняння

Таблиця 1.7.Операції порівняння
Операція Значення
< менше
<= менше або рівно
== перевірка на рівність
>= більше або рівно
> більше
!= перевірка на нерівність

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

b<0, 'b'=='B','f'!='F', 201>=205,

Кожна умова перевіряється: істинна вона чи хибна. Точніше слід сказати, що кожна умова приймає значення "істинно" (true) або "хибно" (flase). В мові Сі немає логічного (булевого) типу. Тому результатом умовного виразу є цілочисельне арифметичне значення. "Істинно" - це ненульова величина, а "хибно" - це нуль. В більшості випадків в якості ненульового значення "істинно" використовується одиниця.

Приклад:

#include<stdio.h>

main()

{

int tr, fal;

tr=(111<=115); /* вираз істинний */

fal=(111>115); /* вираз хибний */

printf("true - %d false - %d \n",tr,fal);

return 0;

}

1.4.4 Логічні операції

Логічні операції &&, ||,! використовуються здебільшого для "об'єднання" виразів порівняння у відповідності з правилами логічного І, логічного АБО та логічного заперечення (таблиця 1.8.).

Таблиця 1.8. Логічні операції
Операція Значення
&& логічне І (and)
| | логічне АБО (or)
! логічне заперечення (not)

Складні логічні вирази обчислюються "раціональним способом". Наприклад, якщо у виразі

(A<=B)&&(B<=C)

виявилось, що А більше В, то всі вирази, як і його перша частина (А<=B), приймають значення "хибно", тому друга частина (В<=C) не обчислюється.

Результат логічної операції 1, якщо істина і 0 у протилежному випадку.

Таблиця 1.9. Таблиця істинності логічних операцій
E1 E2 E1&&E2 E1||E2 !E1
         
         
         
         

1.4.5 Порозрядні операції (побітові операції)

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

Таблиця 1.10. Порозрядні операції
Операція Значення
~ порозрядне заперечення
& побітова кон'юнкція (побітове І)
| побітова диз'юнкція (побітове АБО)
^ побітове додавання за МОД2
<< зсув вліво
>> зсув вправо
Таблиця 1.11. Таблиця істинності логічних порозрядних операцій
E1 E2 E1&E2 E1^E2 E1|E2
         
         
         
         

• Порозрядне заперечення! заміняє змінює кожну 1 на 0, а 0 на 1.

Приклад: ~ (10011010) == (01100101)

• Порозрядна кон'юнкція & (порозрядне І) порівнює послідовно розряд за розрядом два операнди. Для кожного розряду результат рівний 1, якщо тільки два відповідних розряди операндів рівні 1, в інших випадках результат 0.

• Приклад: (10010011) & (00111101) == (00010001)

• Порозрядна диз'юнкція | (порозрядне АБО) порівнює послідовно розряд за розрядом два операнди. Для кожного розряду результат рівний 1, якщо хоча б один з відповідних розрядів рівний 1.

Приклад: (10010011) | (00111101) == (10111111)

• Побітове додавання за МОД2 порівнює послідовно розряд за розрядом два операнди. Для кожного розряду результат рівний 1, якщо один з двох (але не обидва) відповідних розряди рівні 1.

Приклад: (10010011) ^ (00111101) == (10101110)

На операції побітового додавання за МОД2 ґрунтується метод обміну значень двох цілочисельних змінних.

a^=b^=a^=b;

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

Приклади:

(10001010) << 2 == (00101000)

(10001010) >> 2 == (00100010)

1.4.6 Операція слідування (кома)

Операція "кома" (,) називається операцією слідування, яка "зв'язує" два довільних вирази. Список виразів, розділених між собою комами, обчислюються зліва направо. Наприклад, фрагмент тексту

a=4;

b=a+5;

можна записати так:

a=4, b=b+5;

Операція слідування використовується в основному в операторах циклу for() (про оператори циклів піде мова пізніше).

Для порівняння наводимо приклад з використанням операції слідування (приклад 1) та без неї (приклад 2):

Приклад 1.

int a[10],sum,i;

/*... */

sum=a[0];

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

sum+=a[i];

Приклад 2.

int a[10],sum,i;

/*... */

for (i=1,sum=a[0];i<10;sum+=a[i],i++);

1.4.7 Умовна операція?:

Умовна операція?: - єдина тернарна операція в мові Сі. Її синтаксис:

умова? вираз_1: вираз_2

Принцип її роботи такий. Спочатку обчислюється вираз умови. Якщо цей вираз має ненульове значення, то обчислюється вираз_1. Результатом операції?: в даному випадку буде значення виразу_1. Якщо вираз умови рівний нулю, то обчислюється вираз_2 і його значення буде результатом операції. В будь-якому випадку обчислюється тільки один із виразів (вираз_1 або вираз_2).

Наприклад, дану операцію зручно використати для знаходження найбільшого з двох чисел x і y:

max=(x>y)?x:y;

Приклад 1:

#include<stdio.h>

void main()

{

int points;

printf("Введiть оцiнку [2..5]:");

scanf("%d",&points);

printf("%s",points>3?"Ви добре знаєте матерiал!":"Погано...");

}

Приклад 2:

j = (i<0)? (-i): (i); /* змінній j присвоюється модуль i*/

1.4.8 Операція sizeof()

Дана операція обчислює розмір пам'яті, необхідний для розміщення в ній виразів або змінних вказаних типів.

Операція має дві форми:

1). ім'я_типу А;

sizeof А;

2). sizeof (ім'я_типу);

Операцію sizeof() можна застосовувати до констант, типів або змінних, у результаті чого буде отримано число байт, що відводяться під операнд. Приміром, sizеof(int) поверне число байт для розміщення змінної типу int.

1.5 Основи алгоритмізації

1.5.1 Алгоритми та їх властивості

Алгоритм - це чітко визначена для конкретного виконавця послідовність дій, які спрямовані на досягнення поставленої мети або розв'язання задачі певного типу.

У 820 році нашої ери в Бухарі був написаний підручник "Аль-Джабр Ва-аль-Мукабала" ("Наука виключення скорочення"), в якому були описані правила виконання чотирьох арифметичних дій над числами в десятковій системі числення. Автором підручника був арабський математик Мухаммед Бен Муса аль-Хорезмі. Від слова "альджебр" у назві підручника пішло слово "алгебра", а від імені аль-Хорезмі - слово "алгоризм", що пізніше перейшло в слово "алгоритм".

Властивості алгоритмів:

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

2. Масовість. За допомогою складеного алгоритму повинен розв'язуватися цілий клас задач.

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

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

5. Скінченність. Завершення роботи алгоритму повинно здійснюється в цілому за скінченну кількість кроків.

6. Дискретність. Алгоритм повинен складатися з окремих завершених операцій, які виконуються послідовно.

7. Ефективність. Алгоритм повинен забезпечувати розв'язання задачі за мінімальний час з мінімальними витратами оперативної пам'яті.

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

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





Дата публикования: 2015-01-23; Прочитано: 322 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.029 с)...