Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Зубенко, Омельчук - Програмування. Поглиблений курс

.pdf
Скачиваний:
58
Добавлен:
07.03.2016
Размер:
5 Мб
Скачать
☆

 

Розділ ІІІ. МОВИ ПРОГРАМУВАННЯ С ТА С++

 

 

 

Операція

Дія

[]

Індексація

 

<<

Виведення

 

>>

Введення

 

+=

Додавання

 

Методи класу string:

Метод

Призначення

append

Додає символи в кінець рядка

assign

Призначає нові значення символам рядка

at

Повертає посилання на елемент у зазначеній пози-

begin

ції в рядку

Повертає ітератор, що адресує перший елемент у

c_str

рядку

Перетворює вміст рядка на C-рядок

capacity

Повертає найбільшу кількість елементів, що можуть

 

бути записані в рядок, без додаткового виділення

clear

пам'яті

Видаляє всі елементи рядка

compare

Порівнює рядок із зазначеним рядком, щоб визна-

copy

чити, чи є два рядки лексикографічно рівними

Копіює максимальну кількість символів від індексо-

data

ваної позиції в рядку

Перетворює вміст рядка в масив символів

empty

Перевіряє, чи містить рядок зазначені символи

end

Повертає ітератор, що адресує позицію, наступну за

erase

останнім елементом у рядку

Видаляє елемент чи зазначений діапазон елементів

find

у рядку

Шукає найбільш ліве входження зазначеного рядка в

 

даному рядку, починаючи із заданої позиції. Повертає

 

позицію входження чи npos, якщо входження не

find_first_not_of

знайдене

Шукає перший символ у рядку, який не є символом

find_first_of

зазначеного рядка

Шукає перший символ у рядку, який є символом

find_last_not_of

зазначеного рядка

Шукає останній символ у рядку, який не є симво-

find_last_of

лом зазначеного рядка

Шукає останній символ у рядку, який є символом

 

зазначеного рядка

431

ПРОГРАМУВАННЯ

Метод

Призначення

insert

Вставляє елемент, елементи чи діапазон елементів у

length

рядку в зазначену позицію

Повертає поточну кількість елементів у рядку

max_size

Повертає максимальну кількість елементів, яку мо-

push_back

же містити рядок

Додає елемент у кінець рядка

rbegin

Повертає ітератор першого елемента в зміненому

rend

рядку

Повертає ітератор символу, що йде за останнім у

replace

зміненому рядку

Заміняє елементи в рядку в зазначених позиціях

 

символами, скопійованими з іншого рядка чи із C-

reserve

рядка

Установлює місткість рядка не меншою ніж зазна-

resize

чене число

Визначає новий розмір рядка, за необхідності додає

rfind

чи видаляє елементи

Шукає останнє входження символу чи рядка, почи-

size

наючи з позиції

Повертає поточну кількість елементів у рядку

substr

Копіює підрядок рядка, що складається максимум

 

із зазначеної кількості символів і розпочинається із

swap

зазначеної позиції

Обмінює вміст двох рядків

Тут size_type – визначений у std синонім типу unsigned int, npos – константа, що задає максимально можливе число. Методи ви- значені для різних аргументів (перевантаження), тому типи аргумен- тів не зазначаються, за необхідності з ними можна ознайомитися в документації.

Приклад 3.80. Робота з класом string:

#include <iostream> #include <string>

int main()

{

using namespace std;

string s1 ("one"); //створення рядка string s2 ("two"); //створення рядка

cout<<"s1="<<s1<<"."<<endl;

432

Розділ ІІІ. МОВИ ПРОГРАМУВАННЯ С ТА С++

cout<<"s2="<<s2<<"."<<endl;

s1.swap (s2); //обмін значеннями рядків

cout<<"s1.swap (s2):"<<endl; cout<<"s1="<<s1<<"."<<endl; cout<<"s2="<<s2<<"."<<endl;

cout<<"s1[2]="<<s1.at(2)<<endl; /*виведення на екран значен-

ня 2-го елемента рядка (елементи нумеруються з 0)*/

s1.at(2)='O'; /*присвоювання 2-му елементу рядка значення*/

cout<<"s1[2]="<<s1.at(2)<<endl; /*виведення на екран значен-

ня 2-го елемента рядка (елементи нумеруються з 0)*/

cout<<"s1="<<s1<<endl; /*виведення на екран рядка s1*/

cout<<"s1.find(n)="<<s1.find("n")<<endl; /*виведення на ек-

ран позиції символу n у рядку s1*/

cout<<"s1.find(w)="<<s1.find("w")<<endl; /*виведення на ек-

ран позиції символу w у рядку s1*/

s1.clear(); //очищення рядка cout<<"s1="<<s1<<endl;

return 0;

}

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

s1=one

s2=two s1.swap (s2): s1=two s2=one s1[2]=o s1[2]=O s1=twO

s1.find(n)=4294967295

s1.finf(w)=1

s1=

■

433

ПРОГРАМУВАННЯ

3.10.8. ПОСИЛАННЯ

У мові C++ є спеціальні покажчики – посилання, що, на відміну від звичайного покажчика, постійно прив'язані до об'єкта, на який поси- лаються. Посилання ініціалізується покажчиком на існуючий об'єкт даного типу.

Посилання завжди вказує на одну й ту саму адресу.

Увага! При зверненні до посилання операція розіменування * про- водиться автоматично ►

<cпецифікатор_посилання>::=<посилання> <прямий-специфікатор> <посилання>::=&[<кваліфікатори-типу>] [<посилання>]

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

Посилання як змінні. Наведемо програму, яка використовує по- силання як змінні.

Приклад 3.81.

Лістинг.

#include <iostream> // для cout

using namespace std; /*робить видимими імена простору std, зок-

рема cout*/ int main()

{

int i_x=10; int i_y=5;

int *p_ix=&i_x; /*покажчику присвоєно адресу змінної i_x*/ int &r_ix=i_x; //посилання, асоційоване з i_x

int *p =&r_ix; /*покажчику присвоєно адресу r_ix*/

cout<<"i_x=="<<i_x<<'\n'; cout<<"*p_ix=="<<*p_ix<<'\n'; cout<<"r_ix=="<<r_ix<<'\n'; cout<<"*p=="<<*p<<'\n';

r_ix=22; cout<<"i_x=="<<i_x<<'\n'; cout<<"*p_ix=="<<*p_ix<<'\n'; cout<<"r_ix=="<<r_ix<<'\n'; cout<<"*p=="<<*p<<"\n";

i_x=33;

434

Розділ ІІІ. МОВИ ПРОГРАМУВАННЯ С ТА С++

cout<<"i_x=="<<i_x<<'\n'; cout<<"*p_ix=="<<*p_ix<<'\n'; cout<<"r_ix=="<<r_ix<<'\n'; cout<<"*p=="<<*p<<'\n';

p_ix=&i_y; cout<<"i_x=="<<i_x<<'\n'; cout<<"*p_ix=="<<*p_ix<<'\n'; cout<<"r_ix=="<<r_ix<<'\n'; cout<<"*p=="<<*p<<"\n";

return 0;

}

У результаті роботи програми маємо:

i_x==10 *p_ix==10 r_ix==10 *p==10 i_x==22 *p_ix==22 r_ix==22 *p==22 i_x==33 *p_ix==33 r_ix==33 *p==33 i_x==33 *p_ix==5 r_ix==33 *p==33

■

Посилання як параметри й результат роботи функцій. Поси-

лання можуть бути параметрами й результатом роботи функції.

Приклад 3.82.

Лістинг.

#include <iostream>//для cout #define SIZE 10

using namespace std; /*робить видимими імена простору std, зок-

рема cout*/

double array[SIZE];

435

ПРОГРАМУВАННЯ

//функція, що демонструє роботу з посиланнями

double &f(double &x, int index); /*посилання як аргумент і ре-

зультат*/ //ініціалізація масиву void setArray(); //друкування масиву void printArray(); int main()

{

setArray();

printArray(); double x=0;

double &p=array[1]; cout<<"x=="<<x<<'\n'; cout<<"p=="<<p<<'\n';

f(p, 6)=x; //присвоювання функції посиланню cout<<"x=="<<x<<'\n';

cout<<"p=="<<p<<'\n';

printArray(); return 0;

}

double &f(double &x, int index)

{

x=22; //присвоювання аргументу посиланню if((index>=SIZE)||(index<0))

index=0; return array[index];

}

void setArray()

{

for(int i=0; i<SIZE; i++) array[i]=i;

}

void printArray()

{

for(int i=0; i<SIZE; i++) cout<<"array["<<i<<"]=="<<array[i]<<'\n';

}

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

array[0]==0

array[1]==1

array[2]==2

436

Розділ ІІІ. МОВИ ПРОГРАМУВАННЯ С ТА С++

array[3]==3

array[4]==4

array[5]==5

array[6]==6

array[7]==7

array[8]==8

array[9]==9

x==0

p==1

x==0

p==22

array[0]==0

array[1]==22

array[2]==2

array[3]==3

array[4]==4

array[5]==5

array[6]==0

array[7]==7

array[8]==8

array[9]==9

■

3.10.9. КЕРУВАННЯ ПАМ'ЯТТЮ

Замість функцій malloc() та free(), що залишилися для сумісно- сті із C, мова C++ пропонує альтернативні засоби – оператори new()

та delete().

Виділення пам'яті для одного об'єкта (кількох однотипних об'єктів)

типу <type> здійснює оператор new <type> (new <type> [<ціле_число>]). В обох випадках результат – покажчик типу <type>*.

Звільнення пам'яті для одного об'єкта (кількох об'єктів) здійснює оператор delete <name> (delete []<name>). Якщо аргументом є

NULL, то в обох випадках він діє як порожній оператор, інакше руй- нує об'єкт, на який посилається покажчик <name>, і звільняє область пам'яті, виділену для нього раніше оператором new() (руйнує кожен з об'єктів масиву, на який посилається покажчик <name>, і звільняє область пам'яті, виділену для цього масиву раніше операцією new <type>[<ціле число>]).

У всіх наведених вище операторах аргумент може братися в круглі дужки – наприклад, new (<type>).

437

ПРОГРАМУВАННЯ

Приклад 3.83. Керування пам'яттю:

double *dp=new double; //можна писати new(double) *dp=25.3;

delete dp; //можна писати delete (dp)

■

*Література для CР: мова С++ – [55, 57, 64, 70, 73, 102, 124].

Контрольні запитання та вправи

1.Які стандарти мови С++ ви знаєте?

2.Що таке простір імен і як його використовувати?

3.Що таке оператори namespace та using?

4.Що таке клас пам'яті mutable?

5.Описати тип bool.

6.Описати основні операції й методи класу рядків string.

7.Які особливості введення-виведення в мові C++?

8.Що таке бібліотека <iostream>?

9.Які є бібліотеки для роботи з файлами?

10.Визначити операції стандартного введення >> і виведення <<.

11.Що таке об'єкти cin, cout та cerr?

12.Яке призначення методів seekg() та seekp()?

13.Порівняти прототип функцій у мовах С та С++.

14.Як задавати аргументи функцій за умовчанням?

15.Що таке перевантаження функцій, яке його призначення й застосування?

16.Наведіть означення посилання, його відмінності від покажчика.

17.Навести приклади застосувань посилань як параметрів і ре- зультатів роботи функцій.

18.Які методи керування пам'яттю в мові C++ ви знаєте?

19.Порівняти в С++ два файли й надрукувати перший рядок, в якому вони відрізняються.

20.Написати С++-програму пошуку текстових файлів, що міс- тять входження даного слова. Слово та імена файлів вво- дяться з клавіатури.

21.Написати С++-програму для друкування кількох файлів. Ко- жний файл має розпочинатися з нової сторінки, містити за- головок і мати свою нумерацію сторінок.

22.Написати С++-програму для пошуку спільних рядків двох упорядкованих лексикографічно файлів. Програма має ви- водити рядки в три колонки: у першу – ті, що є тільки в першому файлі; у другу – ті, що є тільки в другому; у третю – спільні рядки обох файлів.

438

Розділ ІІІ. МОВИ ПРОГРАМУВАННЯ С ТА С++

23.Написати С++-програму для заміни в англійському тексті входження артикля "a" на "the".

24.У заданому тексті програми видалити коментарі (визначені за правилами C++).

25.Написати С++-програму для заміни в тексті входження си- мволу ‘1' на слово "один".

26.У тексті програми замінити кожний ідентифікатор begin на ‘{', а ідентифікатор end – на ‘}'.

3.11.Об'єктно-орієнтовані можливості C++

¾Інкапсуляція, класи та об'єкти

¾Ініціалізація, присвоювання та знищення класу

¾Спадкування

¾Поліморфізм

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

3.11.1. ІНКАПСУЛЯЦІЯ, КЛАСИ ТА ОБ'ЄКТИ

У мові C основним засобом структуризації даних є структури. На- приклад, структура, призначена для роботи з датою, має вигляд:

struct СDate { int day;

int month; int year; } ;

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

Лістинг.

struct CppDate{ int day;

439

ПРОГРАМУВАННЯ

int month; int year;

};

/*порівняння дат: 0 – рівні, 1 – перша більша, -1 – друга більша*/ int comparison(CppDate *dt1, CppDate *dt2);

//друкування дати

void printDate(CppDate *dt);

//установлення дати

void setDate(int d, int m, int y);

/*порівняння дат: 0 – рівні, 1 – перша більша, -1 – друга більша*/ int comparison(CppDate *dt1, CppDate *dt2)

{

if(dt1->year>dt2->year) return 1; if(dt1->year<dt2->year) return -1; if(dt1->month>dt2->month) return 1; if(dt1->month<dt2->month) return -1; if(dt1->day>dt2->day) return 1; if(dt1->day<dt2->day) return -1; return 0;

}

//друкування дати

void printDate(CppDate *tm)

{

char buffer[32];

sprintf(buffer, "Date: %02d.%02d.%04d\n", tm->day, tm->month, tm->year);

cout<<buffer;

}

//установлення дати

void setDate(CppDate *tm, int d, int m, int y)

{

tm->day=d; tm->month=m; tm->year=y;

}

■

При такій роботі з даними структурного типу виникає низка про- блем. Наприклад, поля структур типу CppDate не захищені від некоре- ктних модифікацій і використання. Немає загального механізму об-

440