Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Відповіді на питання по мові С++по лекціям.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
265.22 Кб
Скачать
  1. Як вказати діапазон елементів у масиві?

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

Існує іншій підхід – вказати діапазон елементів. Для цього потрібно передати початковий елемент масиву, що ідентифікується, та вказати кінець цього масиву. Наприклад розглянемо таку об’яву:

double elbuod [20]

Перший elbuod – це ім’я масиву, яке вказує на перший елемент. Вираз elbuod + 19 вказує на останній елемент масиву (elbuod [19]), а elbuod [20] вказує на елемент, якій є наступним відразу за останнім елементом масиву.

  1. Показники і const.

Можна застосувати ключове слово const з показниками двома способами. Перший – примусити показник вказувати на константний об’єкт, тим самим зупинити модифікацію об’єкту через показник. Другий спосіб – зробити сам показник константним, щоб не установити його на будь що інше. Об’явимо pt як показник на константу:

int age = 39;

const int *pt = &age;

Ця об’ява встановлює, що pt вказує на const int (в даному випадку – 39). Таким чином, не буде можливим використовувати pt для зміни цього значення. Тобто, значення *pt є константним і не може бути змінено. Значення це постійне, тільки коли до нього звертаються через pt. Безпосередньо можна змінити значення змінної age, але не можна змінити її значення через показним pt. Зараз можна присвоїти адресу звичайній змінній показника на константу. Це дає інші дві можливості: присвоєння адреси константній змінній показника на константу та присвоєння адреси константній змінній звичайному показнику.

Перше можливо, а друге – ні.

const float g_earth = 9.80;

const float *pe = &g_earth; //вірно

const float g_moon = 1.63;

float *pm = &g_moon; // не вірно

Ситуація стає складнішою, коли маємо діло з показниками на показники. Розглянемо ці випадки:

int age = 39; // age++ допустима операція

int * pd = &age; // *pd = 41 допустима операція

const int * pt = pd; // *pt = 42 недопустима операція

  1. Функції та двовимірні масиви.

Щоб написати функцію яка приймає в якості аргументу двовимірний масив, потрібно пам’ятати, що масив трактується як його адреса, тому відповідний формальний параметр є показником – так само, як і у випадку одновимірного масиву. Складність полягає у тому, щоб вірно об’явити показник. Наприклад:

int data [3][4] = {{1, 2, 3, 4}, {9, 8, 7, 6}, {2, 4, 6, 8}};

int total = sum (data, 3);

Так, data – це ім’я масиву із 3 елементів. Перший елемент є масивом їз чотирьох елементів зі значенням типа int. Тобто, тип data – “показник на масив із чотирьох int”, тому відповідний прототип повинний бути таким:

int sum (int (*ar2) [4], int size);

Дужки потрібні, тому що об’ява.

  1. Формат для читання.

Існує альтернативний формат, який можливо більш простий для читання:

int sum (int ar2[] [4], int size);

Будь який із двох прототипів встановлює, що ar2 – показник, а не масив. Зверніть увагу, що тип показника вказує на масив із чотирьох int. Таким чином показник вказує кількість стовпчиків – тому кількість стовпчиків не передається в окремому аргументі функції. Функція sum () працює тільки з масивами із 4 стовпчиків, а кількість рядків задаються змінною size, тому sum () працює з довільною кількістю рядків:

int a[100][4];

int b[6][4];

…..

int total1 = sum (a, 100); //сума усіх елементів а

int total2 = sum (b, 6); //сума усіх елементів b

int total3 = sum (a, 10); //сума перших 10 рядків а

int total4 = sum (a+10, 20); //сума наступних 19 рядків а

  1. Ім’я двовимірного масиву.

Простішій спосіб, щоб використати ar2 як ім’я двовимірного масиву, можна наступним чином:

int sum (int ar2[1][4], int size)

{

int total = 0;

for (int r = 0; r < size; r++)

for (int c = 0; c < 4; c++)

total += ar2[r][c];

return total;

}

Замість ar2[r][c] можна застосовувати двічі операцію *:

ar2[r][c] == *(*( ar2 +r) + с) //одне й теж

7. Як передати рядок функції у вигляді аргументу?

Коли бажаєте передати рядок функції у вигляді аргументу, то є три варіанти надавати рядки:

Масив char.

Константний рядок в подвійних лапках (має назву рядкові літерали)

Показник на char, який містить адресу початку рядка.

Усі три варіанти мають тип показника на char (або char *), тому можна застосувати усі три в якості аргументів функцій, які обробляють рядки:

char ghost[15] = “galloping”;

char * str = “galumphing”;

int n1 = strlen (ghost); // ghost є &ghost[0]

int n2 = strlen (str); //показник на char

int n3 = strlen (“gamboling”); //адреса рядка

ЛЕКЦІЯ 23.

  1. Функція buildstr.

Функція buildstr повертає показник. Ця функція приймає два аргументи: символ та число. Використовуючи new, вона створює рядок, довжина якого дорівнює числу, що передається, і ініціалізує кожний його елемент значенням символу, який передається. Потім вона повертає показник на цій новий рядок.

//prog060.cpp – функція, що повертає показник на char

  1. Функції та структури.

Структурні змінні ведуть себе як базові змінні, котрі мають єдине значення. У відмінні від масивів, структури зв’язують свої значення в єдине ціле, котре може бути сприйнято як одне значення. Ім’я структури – це просто ім’я структури, котре може бути сприйнято як одне значення. Ім’я структури – це просто ім’я структури. Коли потрібно визначити її адресу, то можна отримати її за допомогою операції &. Розглянемо два варіанти, починаючи з передачі та повернення цілих структур.

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

  1. Як зробити функцію для перетворення однієї форми в іншу?

Розглянемо приклад з простором замість часу. Визначимо дві структури, які мають дві різні способи опису координат на площі, а потім розробимо функцію для перетворення однієї форми в іншу і відобразимо результат. Опишімо розташування точки на екрані або на карті відносно деякої початкової точки. Один із способів є відлік горизонтального та вертикального зміщення точки від початку координат. Можна визначити структуру, яка складається з двох координат, щоб визначити позицію:

struct rect

{

double x; //відстань по горизонталі від початкової точки

double y; //відстань по вертикалі від початкової точки

};

  1. Спосіб опису позиції точки.

Спосіб опису позиції точки – це вказати її відстань від початку координат і напрям. Відстань і кут разом складають полярні координати. Можна визначити другу структуру для визначення позиції:

struct polar

{

double distance; //відстань від вихідній точки

double angle; //напрям

};

  1. Функція, яка відображає вміст структури типу polar.

Спроектуємо функцію, яка буде відображати вміст структури типу polar. Математичні функції в бібліотеці С++ вимірюють кути у радіанах, тому будемо вимірювати кути у цих величинах. Щоб відображати кути у градусах, потрібно зробити множення на 180/π, що примирно дорівнює 57.29577951. Ось ця функція:

//відображення полярних координат з перетворенням радіан у градуси

void show_polar (polar dapos)

{

using namespace std;

const double Rad_to_deg = 57.29577951

cout << “відстань = ” << dapos.distance;

cout << “, кут = ” << dapos.angle * Rad_to_deg;

cout << “градусів\n”;

}

Формальна змінна-аргумент має тип polar. Коли передається структура polar цієї функції, то її вміст копіюється у структуру dapos, і функція використовує цю копію у своєї роботі.

Оскільки dapos – структура, функція використовує операцію членства (точку) для ідентифікації її членів.

  1. Функція, що перетворює прямокутні координату у полярні.

Напишемо функцію, котра перетворює прямокутні координату у полярні. Ця функція повинна приймати у вигляді аргументу структуру rect і повертати функції, що викликається, структуру polar, і у деяких системах повинні повідомити компілятор, щоб він завантажив бібліотеку mach. Можна застосувати теорему Піфагора, щоб отримати відстань по двом координатам:

distance = sqrt (x * x+y * y)

Функція atan () із бібліотеці mach обчислює кут по значенню х і у:

angle = atan2 (y, x)

Маючи ці функції, можна написати функцію перетворення координат:

//перетворення прямокутних координат у полярні

polar rect_to_ polar(rect xypos) //тип polar

{

polar answer;

answer.distance = sqrt(xypos.x * xypos.x + xypos.y* xypos.y);

answer.angle = atan2(xypos.y, xypos.x);

return answer; //повертає структуру polar

}

ЛЕКЦІЯ 24.