Директиви препроцесора. Директиви визначення.
Директивами препроцесора є інструкції, записані в тексті програми на С++, і виконувані до трансляції програми. Директиви препроцесора дозволяють змінити текст програми, наприклад, замінити деякі лексеми в тексті, вставити текст з іншого файлу, заборонити трансляцію частини тексту і тому подібне. Всі директиви препроцесора починаються із знаку #. Після директив препроцесора крапка з комою не ставляться.
Одну з директив препроцесора #include, що вставляє вміст деякого файлу під час компіляції, ми вивчали.
Директива #define служить для заміни констант, що часто використовуються, ключових слів, операторів або виразів деякими ідентифікаторами. Ідентифікатори, замінюючі текстові або числові константи, називають іменованими константами. Ідентифікатори, замінюючі фрагменти програм, називають макроозначеннями, причому макроозначення можуть мати аргументи.
Директива #define має дві синтаксичні форми:
#define ідентифікатор текст
#define ідентифікатор (список параметрів) текст
Ця директива замінює всі подальші входження ідентифікатора на текст. Такий процес називається макропідстановкою. Текст може бути будь-яким фрагментом програми на С++, а також може бути і відсутнім. У останньому випадку всі екземпляри ідентифікатора видаляються з програми.
Приклад:
#define WIDTH 80
#define LENGTH (Width+10)
Ці директиви змінять в тексті програми кожне слово WIDTH на число 80, а кожне слово LENGTH на вираз (80+10) разом з дужками, що оточують його.
Дужки, що містяться в макроозначенні, дозволяють уникнути непорозумінь, пов'язаних з порядком обчислення операцій.
Приклад, за відсутності дужок вираз t=length*7 буде перетворений у вираз t=80+10*7, а не у вираз t=(80+10)*7, як це виходить за наявності дужок, і в результаті вийде 780, а не 630.
У другій синтаксичній формі в директиві #define є список формальних параметрів, який може містити один або декілька ідентифікаторів, розділених комами. Формальні параметри в тексті макроозначення відзначають позиції на яких повинні бути підставлені фактичні аргументи макровиклику. Кожен формальний параметр може з'явитися в тексті макроозначення кілька разів.
При макровиклику услід за ідентифікатором записується список фактичних аргументів, кількість яких повинна співпадати з кількістю формальних параметрів.
Оскільки препроцесор не є частиною компілятора мови С++, а представляє відносно простий макрогенератор, є можливість перевизначати різні синтаксичні одиниці мови-лексеми (тобто ідентифікатори, ключові слова, константи, ланцюжки літер, знаки операцій і знаки пунктуацій).
Приклад:
#define MAX(x,y) ((x)>(y))?(x):(y)
Ця директива замінить фрагмент t=MAX(i,s[i]);
на фрагмент t=((i)>(s[i])?(i):(s[i]);
Приклад:
#include <iostream.h>
#define then
#define begin {
#define end }
main()
begin
int n,x,y,k=0;
cout<<"введи n\n";
cin>>n;
for(x=-n;x<=n;x++)
for(y=-n;y<=n;y++)
if(2*y-x*x==4)then
begin
k=k+1;
cout<<”x=”<<x<<”y=\n"<<y;
end
if(k==0) then
cout<<"коренів нема\n ";
end
2. Директива #undef.
Директива #undef використовується для відміни дії директиви #define. Синтаксис цієї директиви наступний
#undefідентифікатор
Директива відміняє дію поточного визначення #define для вказаного ідентифікатора. Не є помилкою використання директиви #undef для ідентифікатора, який не був визначений директивою #define.
Приклад:
#undef WIDTH
#undef MAX
Ці директиви відміняють визначення іменованої константи WIDTH і макроозначення MAX.
Якщо є визначення #define l 20, то директива #undef l відміняє його.
3. Умовна компіляція. Директиви # ifdef, # else, #endif.
Команди керування компіляцією дозволяють не компілювати частин програми, які за певних зовнішніх умов виявляються не потрібними. За командою
# ifdef константний вираз
# else вираз
#endif
Препроцесор перевіряє істиність константного виразу.
Приклад:
#ifdef mac
#include “goon.h” //виконується, якщо mac буде визначена
#define st 5 //за допомогою #define
#else
#include “cow.h”
#define st 15
#endif
Форма #ifdef - #else подібна до повного умовного оператора в Сі. Головна відмінність в тому, що препроцесор не розпізнає фігурні дужки для відмітки блока директиви. Таким чином, #else і #endif використовуються для відмітки блоку директив.
Команда
# ifndef константний ідентифікатор
використовується для визначення константи, якщо вона ще не визначена.
Якщо умова, що перевіряється в командах #ifdef i #ifndef істина, то рядки програми між #els #endif ігноруються .
директиви #if, #elif.
Директива нагадує звичайний умовний оператор в Сі. За цим оператор слідує цілочисельна стала , що розглядається як істинна, якщо відмінні від нуля.
Приклад:
#if s==1
#include “il.h”
#elif s==2
#include “nom.h”
#elif s==3
#include “ght.h”
#endif
Тема. Масиви. Ініціалізація масивів. Одновимірні та багатовимірні масиви.
План
1. Поняття масиву. Одновимірні та багатовимірні масиви.
2. Ініціалізація масивів.
1. Поняття масиву. Одновимірні та багатовимірні масиви.
Масив - це впорядкований скінченний набір даних одного типу, які зберігаються в послідовно розташованих комірках оперативної пам’яті і мають спільну назву. Назву масиву надає користувач. Кожна окрема така комірка – це елемент масиву. Для ідентифікації елементів масиву, кожен елемент має свій індекс, за яким його можна знайти в масиві. Кількість індексів, а отже і кількість елементів визначає розмірність масиву.
Розрізняють одномірні, двомірні та багатомірні мавсиви.
Можна говорити про масиви цілих чисел, масивів символів і.т.д. Ми можемо навіть визначити масив, елементи якого - масиви (масив масивів), визначаючи, таким образом, багатовимірні масиви.
Масиви зручно використовувати для зберігання однотипної інформації, наприклад, елементів таблиць, коефіцієнтів громіздких лінійних рівнянь та систем рівнянь, прізвищ працівників деякої великої фірми, назв днів тижня, тощо.
Загальний вигляд конструкції опису одномірного масиву:
<тип> <ім’я масиву> [<розмір>]
Тобто, будь-який масив в програмі повинен бути описаний: після імені масиву добавляють квадратні дужки [ ], усередині яких зазвичай записується число, що показує кількість елементів масиву.
Розмір – це кількість елементів масиву. Розміром може бути лише стала величина (не змінна).
Ім’я масиву у програмі змінювати не можна – це стала величина, яка містить адресу першого елемента. Отже, назва масиву є вказівником на перший елемент.
Наприклад: запис int x[10]; визначає x як масив з 10 цілих чисел. У разі багатовимірних масивів показують стільки пар дужок, скільки (яка) розмірність масиву, а число усередині дужок показує розмір масиву по даному вимірюванню.
Наприкладint a[10] – масив на ім’я а складається з десяти цілих елементів: а[0], a[1], a[2],…a[9].
Нумерація елементів масиву в С++ завжди починається з нуля.
Загальний вигляд конструкції опису багатовимірного масиву такий
<Тип> < ім’я масиву > [< p1 >][< p1 >]….[< p N >}
де p1, p2 …pN – задають розміри для кожного виміру.
Кількість індексів визначає вимірність масиву: двовимірні масиви мають два індекси, тривимірні – три індекси.
Елементи двовимірного масиву визначаються іменем масиву та двома індексами: перший індекс означає номер рядка, другий – номер стовпця, на перетині яких розміщений елемент.
Для роботи з масивом завжди використовують оператори циклу.
Щоб звернутись до деякого елемента, необхідно зазначати ім’я масиву, а у квадратних дужках – його номер.
Наприклад:змінна stud[2]є третім елементом масиву stud, а stud[4]–п’ятим, оскільки масив stud має елементи stud[0] stud[1] stud[2] stud[3] stud[4].
ПрикладУтворити масив з елементами 0, 10, 20, 30, 40
void main()
{
int a[5];
for (int i=0;i<5;i++) a[i] = i*10;
}
Приклад .Утворити масив з перших десяти цілих чисел і обчислити суму всіх його значень.
void main()
{ int a[5];
for (int i=0,s=0;i<5;i++)
{ a[i]=i;
s = s + a[i]; }
}
2. Ініціалізація масивів.
Проініціалізувати масив (надати значення елементам масиву) можна одним із способів:
· Використовуючи принцип за замовчуванням;
· Безпосередньо під час його оголошення;
· Застосовуючи команду присвоєння;
· Під час введення даних із клавіатури.
Константний вигляд конструкції опису одномірного масиву:
<Тип> < ім’я масиву > [<константний вираз >]= {елементи константи};
Константний-вираз в квадратних дужках задає кількість елементів масиву.
За замовчуванням усім елементам масиву надається значення 0. Масив можна ініціалізувати повністю або частково, відразу під час його оголошення, записуючи значення змінних через кому у фігурних дужках.
Наприклад:
Int stud[]={2, 10, 5, 7, 3};
float stud[10]={163.4, 153.5, 170, 172.3};
Двовимірний масив можна ініціювати так:
int matr[2][5]= {3,4,0,1,2},{6,5,1,4,9};
Приклади:
int a[2][3]; /* представлено у вигляді матриі
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2] */
double b[10]; /* вектор із 10 елементів тип яких double */
int w[3][3] = { { 2, 3, 4 },
{ 3, 4, 8 },
{ 1, 0, 9 } };
Якщо масив повністю ініціалізують під час оголошення, то його розмір зазначати не обов’язково.
Наприклад:
Int stud[]={2, 10, 5, 7, 3};
Приклад:Створити масив з перших ста цілих чисел і обчислити суму всіх його значень можна одним із способів:
Int n[100];
Int s=0;
For(k=0; k<100; k++)
{
n[k]=k+1;
s+=n[k];
}
Приклад:в заданому масиві з 10 цілих чисел потрібно змінити порядок проходження його елементів на зворотний без залучення додаткового елементу масиву.
{ int p,i=0;
static a[10]={10,11,12,13,14, 15,16,17,18,19};
while(i<10/2)
{
p=a[i];
a[i]=a[9-i];
a[9-i]=p;
i++;
}
i=0;
while(i<10)
cout<<a[i++];
}
Елементи масиву також можна вводити з клавіатури під час виконання програми, як це робимо для змінних простих стандартних типів даних.
Масиви сталі (константи) оголошуються так: const int tag[]={1,2}.Константитреба ініціалізувати під час оголошення, інакше елементам масиву автоматично будуть присвоєні нульові значення.
Отже,
1. Масив є структурою даних, яка дозволяє одній змінні зберігати декілька значень.
2. При оголошенні масиву ви повинні вказати тип значень, що зберігаються в масиві, а також кількість значень (елементів масиву).
3. Всі елементи усередині масиву повинні бути одного і того ж типу, наприклад, int, float або char.
4. Для збереження значення усередині масиву вам слідує вказати номер елемента масиву, в якому ви хочете зберегти своє значення.
5. Щоб звернутися до значення, що зберігається усередині масиву, ваші програми указують ім'я масиву і номер елемента.
6. При оголошенні масиву програми можуть використовувати оператор присвоєння для ініціалізації елементів масиву.
7. Програми можуть передавати змінні-масиви у функції точно так, як і вони передають будь-який інший параметр.
Наприклад: Скласти програму для занесення в двовимірний масив p таблиці множення двох чисел і виведення масиву на екран.
void main()
{
int i,j;
int p[9][9];
for ( i=0; i<9; i++)
{
for ( j=0; j<9; j++)
{ //Множення чисел
p[i][j]=(i+1)*(j+1);
printf(p[i][j],"\t");
}
printf("\n"); //Для виводу масиву у вигляді таблиці
}
getch();
}
Тема. Символьні масиви. Стрічки і дії з ними.
План
1. Символьні масиви.
2. Стрічки і дії з ними.
2. Символьні масиви.
Будь-яка символьна константа, наприклад "ОЙ У ПОЛІ КРИНИЧКА", є масив символів. У внутрішньому уявленні компілятор завершує такий масив символом "\0", так що будь-яка програма може по ньому легко виявити кінець рядка. Тому рядок займає в пам’яті на один символ більше, ніж записано між подвійними лапками. Нумерація елементів масиву починається з нуля. Треба пам'ятати, що, наприклад 't' - це символ(буква), а ' T ' - це рядок, що складається з двох символів: 't' і '\0'. Звідси витікає, що порожніх рядків не буває.
Рядок в мові С++ - це різновид константи і її можна присвоїти деякій змінній, що представляє масив символів:
char str[]="ТЕКСТ";
Такий запис і коротше і зрозуміліше, ніж загальноприйнята для початкової ініціалізації масивів:
char str[]={'Т','е','к','с','т'};
Якщо довжина рядка в квадратних дужках опущена, то вона визначається автоматично, по кількості присвоюваних символів. У приведеному вище прикладі вона рівна шести.
Приклад. Розглянемо оголошення та ініціалізацію рядків
const char text1[] = "Ми вивчаємо програмування";
char slovo[] = "University";
char frazal [11], fraza2[40];
Тут оголошено сталу textl, яка має значення "Ми вивчаємо програмування", символьні масиви: slovo (без зазначення розміру), frazal (може містити до 10 символів) та fraza2 (до 39 символів).
Символьний масив slovo ще можна оголосити так:
char slovo[11] = "University";
або
char slovo[] = {‘U’, ‘n’, ‘i’, ‘v’, ‘e’, ‘r’, ‘s’,’i’,’ t’, ‘y’,’\0’ };
Тут вручну записуємо нуль-символ, інакше компілятор трактуватиме змінну slovo не як рядок, а як масив.
Рядки можна опрацьовувати посимвольно за допомогою назви масиву, наприклад:
f or (int n = 0; n < 11; n++) cout«frazal;
Змінній frazal надається значення "University" і ця фраза виводиться на екран. Інакше це можна зробити так:
for (int n = 0; n < 11; n++)
frazal [n] = slovo[n]; cout «frazal;
Увести масив символів можна за допомогою команди
сіn » <назва масиву>;
Якщо рядок даних містить символ пропуску, то команда сіn» зчитає дані лише до першого пропуску. Щоб зчитати весь рядок до символу вводу, необхідно застосувати команду
сіn.get(<назва рядка>, максимальна довжина рядка>);
Наприклад, cin.get(fraza2, 40). Зчитати символ вводу можна так: cin.get(). Зчитати рядок разом із символом вводу можна одним із способів:
1) cin.get(fraza2, 40);
cin.get()
2) cin.get(fraza2,40).get() ,
3) cin.getline(fraza2, 40).
Вивести значення рядка на екран можна за допомогою команди
cout« <назва рядка>;
Посимвольно вводити чи виводити елементи рядка можна за допомогою команд циклу for або while.
В бібліотеці conio.h визначені стандартні функції введення-виведення рядків. Наприклад, getc(), getchar() зчитують по одному символу рядка, введеного з клавіатури, putc() та putchar()виводять окремі символи рядка тощо. У бібліотеці stdio.h описані функції для введення gets() та виведення puts() усього рядка.
Розглянемо функції putchar і getchar , які виконують введення і виведення символа відповідно і створимо на їх основі ряд своїх корисних функцій. Функція getcharза одне звернення до неї видає як результат один символ, що отримали з системного введення. Ми можемо розглядати getchar як функцію, що має заголовок
Дата добавления: 2015-08-26; просмотров: 1344;