Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лаб_Гриф.doc
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
2.81 Mб
Скачать

Хід роботи

  1. Вивчити теоретичні відомості.

  2. Відповідно до індивідуального завдання розробити алгоритм рішення задачі. На базі заняття №11 реалізувати завдання, при цьому використовувати бібліотечні функції, розглянуті на лекції й у теоретичній частині заняття. Наприклад, використовувати функції пошуку одиночних символів і послідовностей у заданому рядку. Забезпечити можливість передачі даних з оточення (з командного рядка).

  3. Розробити програму.

  4. Набрати програму на комп'ютері, налагодити її і вивчити роботу операторів.

  5. Одержати результати.

  6. Оформити звіт.

  7. Підготуватися до захисту роботи, вивчивши контрольні питання по даній темі.

Індивідуальні завдання до заняття №12 взяти з попереднього заняття №11.

Вимоги до змісту звіту приведені в занятті №1.

Питання для контролю і самостійної роботи

  1. Який заголовочний файл необхідний для роботи з бібліотечними функціями обробки символьних даних ?

  2. Який символ необхідний наприкінці рядка для нормальної роботи з рядками ?

  3. Що означає модифікатор const при оголошенні формальних параметрів функцій ?

  4. Як оголосити масив покажчиків ?

  5. Для чого можна використовувати масив покажчиків при роботі із символьними даними ?

  6. Поясніть формати приведених у теоретичній частині функцій.

  7. Який тип має і’мя функції ?

  8. Що означає буква n у функціях strncmp( ), strnset( ) ?

  9. Що означає буква i у strcmpi( ) ?

  10. Що означає додаткова буква r у функції strrchr( ) ?

  11. Що адресує покажчик на n - ний символ у рядку ?

  12. Як виконати передачу даних з оточення (з командного рядка) у функцію main( ) ?

  13. Як виконується порівняння букв і слов ?

Заняття № 13

Вкладені цикли. Багатомірні масиви. Масиви покажчиків

(2години)

Ціль роботи: вивчити конструкції мови С і оператори для обробки багатомірних масивів із застосуванням оператора циклу for.

Теоретичні відомості

Масиви і покажчики, індексні вирази

Ідентифікатор масиву є покажчиком на тип елементів цього масиву і адресує його перший елемент. По визначенню, оператор індексування [ ] інтерпретується таким чином, що А[ j ] еквівалентно *(А + j). Відповідно до правил перетворення, що виконуються при операції "+", якщо А є ім'ям масиву (ім'я масиву є покажчиком на тип елементів масиву), те індексне вирази А[ j ] указує на j - ий елемент масиву А. Таким чином j є індексом масиву і має цілий тип (int). Індексування є комутативною операцією, тому припустимі записи j[А], *(j+А).

Багатомірний масив у С можна оголосити в такий спосіб:

[ <Клас_пам'яті ] Тип_даних Ім'я_масиву> [ <Розмір_масиву1> ] [<Розмір_масиву2> ][ <…> ][ <Розмір_масиву_N> ]

Кожний Розмір_масиву_i може бути заданий константним вирази м. Вирази типу А[ i ][ j ][ ][ k ] називається індексним. У випадку використання багатомірних масивів інтерпретація індексного вирази наступна: А[ i ][ j ][ ][ k ] являє собою n-мірний масив з рангом i*j*...*k, тоді якщо A зустрічається у вираженні, воно розглядається як вектор, що містить i (n -1)-мірних масивів з рангом j*...*k. Ім'я масиву A є покажчиком на цей вектор. Якщо до покажчика застосовується оператор ( * ) у явному чи в неявному вигляді (як результат індексування), то результат буде вказувати на елемент (n -1)-мірного масиву.

Розглянемо, наприклад масив int x[N][M] - масив цілих чисел розмірності N * M. Масиви в мові С зберігаються по рядках (останній індекс змінюється найшвидше). Перший індекс (N) в оголошенні масиву дозволяє визначити обсяг необхідної для масиву пам'яті, але не грає ніякої ролі в обчисленні переміщення покажчика при доступі до елемента масиву – х[ i ][ j ]. Даний елемент розташований фактично в i+1 рядку, j+1 стовпці, тому що індекси в масиві починаються з нульового. Масив розглядається як одномірний (вектор), що містить N елементів, кожний з яких є масивом (у даному випадку) з М елементів типу int. Ім'я масиву x є покажчиком на тип: масив, який має М елементів типу int і адресує нульовий елемент цього масиву. Розглянемо елемент масиву x[ i ][ j ]. У вираженні *x[ i ], що еквівалентно *( x+i ), x – покажчик на нульовий елемент масиву. Для доступу до i-того елемента-масива х переміщується на і довжин об'єкта, на який указує покажчик, а саме на і довжин одномірного масиву (рядка з М елементів типу int), тобто на (i * М * sizеof( int)). У результаті індексної операції виходить покажчик, що адресує нульовий елемент i-го одномірного масиву (рядка) х[ i ][ 0 ]. Для другого індексу знову застосовується той же алгоритм. Покажчик переміщується на величину ( j * sizеof( int )), після чого відбувається разіменування (разадресація). Після разадресації результат буде мати тип int. Елемент масиву можна представити також у вигляді *( * ( х + i ) + j ).

Таким чином, загальне переміщення у байтах покажчика на нульовий елемент масиву X[N][M] при доступі x[ i ][ j ] обчислюється по формулі

(( i * M + j) * sizеof( int )).

Для тривимірного масиву float х3D[N][M][K] величина переміщення в байтах для доступу до елемента х3D[ i ][ j ][ k ] обчислюється по формулі

і * ( M + K ) + j * R + k) * sizеof( float ).

Для доступу до елемента масиву х3D[ i ][ j ][ k ] можна також використовувати вирази *( *( *( х3D + i ) + j ) + k ).