- •Лабораторна робота №10
- •Порядок виконання роботи
- •1. Варіанти завдання
- •2. Теоретичні відомості
- •Int len (char e[ ])
- •Int len (char *s)
- •Void invert(char e[ ])
- •Void main( )
- •Int index(char [ ], char [ ]);
- •Int row(char c1[ ], char c2[ ])
- •Void cone(char *c1, char *c2)
- •Void substr(char *c1, char *c2, int n, int k)
- •3. Приклад розв’язання задачі на еом (варіант 3, завдання №7)
- •Void ChangeStr(char **s1,int m)
- •3.3 Результати роботи програми
- •Контрольні запитання
- •Лабораторна робота №11
- •Тема: Особливості роботи з одномірними динамічними масивами
- •Мета роботи: Отримання практичних навиків у роботі з одномірними динамічними масивами в мові c
- •Порядок виконання роботи
- •1. Варіанти завдання
- •2. Теоретичні відомості
- •Void main()
- •3. Приклад розв’язання задачі на еом (варіант №30)
- •3.2. Визначення змінних програми
- •3.3. Розробка тексту програми Крім файлів:
- •Int main(void) {
- •3.4. Налагодження програми
- •3.5. Результати роботи програми
- •Контрольні запитання
- •2. Теоретичні відомості
- •Int**array;
- •Void quart(int n, float * х)
- •Void main()
- •Void quart (int n, float X [ ])
- •3. Приклад розв’язання задачі на еом (варіант №30)
- •3.1. Розробка алгоритму вирішення
- •3.2. Представлення матриці в пам'яті
- •3.3. Визначення змінних програми (варіант 1)
- •Int size;
- •3.4. Розробка тексту програми (варіант 1)
- •Void fill(int *, int);
- •Void fill(int *a, int s) {
- •3.5. Відмінності для варіанту реалізації 3
- •Void fill(int far **, int);
- •Void fill(int far **a, int s) {
- •3.6. Налагодження програми
- •3.7. Результати роботи програми
- •Контрольні запитання
- •Лабораторна робота №13
- •Порядок виконання роботи
- •1. Варіанти завдання Завдання 1
- •2. Теоретичні відомості
- •Void main( )
- •Void main( )
- •Void main( )
- •3.Стандартні функції для роботи зі стрічками (бібліотека string.H)
- •4. Приклади використання стандартних функцій для роботи зі стрічками
- •Функція аналогічна до stpcpy, strcpy, strncat
- •Функція аналогічна до strcspn, strrchr, strspn, strstr
- •Int far _fstrcmp(const char far *s1, const char far *s2);
- •Функція аналогічна до stpcpy, strncpy
- •- Size _t maxlen - максимальне число символів, які копіюємо з вихідної стрічки в результуючу.
- •Приклад: /*strncpy/cpp*/
- •5. Приклад розв’язання задачі на еом (варіант 2)
- •5.1. Розробка алгоритму вирішення
- •5.2 Розробка тексту програми
- •Int main()
- •4.3 Результати роботи програми
- •Контрольні запитання
- •Лабораторна робота №14
- •Порядок виконання роботи
- •1. Варіанти завдання
- •2. Теоретичні відомості
- •Void main( )
- •Приклади розробки функцій для обробки текстової інформації
- •Int len (char e[ ])
- •Int len (char *s)
- •Void invert(char e[ ])
- •Void main( )
- •Int index(char [ ], char [ ]);
- •Int row(char c1[ ], char c2[ ])
- •Void cone(char *c1, char *c2)
- •Void substr(char *c1, char *c2, int n, int k)
- •3. Приклад розв’язання задачі на еом (завдання 2, варіант 7)
- •Void ChangeStr(char **s1,int m)
- •4.3 Результати роботи програми
- •Контрольні запитання
- •Лабораторна робота №15
- •Порядок виконання роботи
- •Варіанти завдання
- •Теоретичні відомості
- •Int pole2 ;
- •Приклад розв’язання задачі на еом (варіант №30)
- •Розробка алгоритму розв’язання задачі
- •Визначення змінних програми
- •Розробка тексту програми Текст програми починаємо з підключення файлу stdio.H.
- •Int main(void) {
- •If (!strcmp(mm[n].Name,"***")) break;
- •Контрольні запитання
- •Лабораторна робота №16
- •Порядок виконання роботи
- •1. Варіанти завдання
- •Теоретичні відомості Читання і запис текстових файлів
- •Int main ()
- •Приклад розв’язання задачі на еом (варіант 6)
- •Контрольні запитання
- •Лабораторна робота №17
- •Порядок виконання роботи
- •Варіанти завдання
- •Теоретичні відомості Читання і запис двійкових файлів
- •Відкриття двійкових фалів
- •Файли з послідовним доступом
- •Запис даних у файл c послідовним доступом
- •Int main()
- •If ( ! outf)
- •Int array[100];
- •Int main()
- •If ( ! inpf)
- •Int array[100];
- •Файли з довільним доступом
- •Int main()
- •If ( ! inpf)
- •Int main()
- •If ( ! outf)
- •Передача файлів між комп’ютерами.
- •Програмне підтвердження зв’язку
- •Перекачування файлу
- •Void send_file(fname)
- •Void wait(port)
- •Int port;
- •Прийом файлу
- •Void rec_file()
- •If(ferror(fp)) {
- •Void get_file_name(f)
- •Приклад розв’язання задачі на еом (варіант 10)
- •Контрольні питання
- •Література
3. Приклад розв’язання задачі на еом (варіант №30)
3.1. Розробка алгоритму вирішення
В даній роботі у нас розмірність матриці заздалегідь не відома. Чи складає це істотне розходження? Так. Якщо ми перевіримо функціонування алгоритму цієї роботи при різних значеннях розмірності (S), то ми переконаємося, що коректно він спрацьовує тільки при непарних значеннях S. При парних значеннях верхня половина матриці формується правильно, а в нижній половині область ненульових значень буде захоплювати також і самі діагоналі, що не відповідає умовам завдання. Тому для цієї роботи варто переглянути алгоритм.
Для елемента, що лежить на головній діагоналі, індекси задовольняють умові: L=R, на побічній - R=S-L-1. Отже, для верхньої половини умова попадання в ненульову область: L < R < S-L-1, а для нижньої: S-L-1 < R < L. Або, узагальнюючи: min(L,S-L-1) < R < max(L,S-L-1) . У схемі алгоритму, що приведений на малюнку 1, ми використовуємо саме цю умову. До того ж у схемі відображено поділ програми на дві функції: головну функцію - main(), що виконує виділення пам'яті для матриці, виклик функції заповнення матриці і вивід результату, і функцію fill(), що виконує заповнення матриці за заданими правилами.
У цій роботі трохи ускладнимо алгоритм, додавши в нього перевірку значення S, що введено оператором (блоки 3 - 8). Нижня границя для значення S - 1, оскільки матриця нульової або негативної розмірності просто не має змісту.
Верхня границя - 24, оскільки для матриці більшого розміру неможливо буде забезпечити наочний висновок (вона не поміститься на екрані).
3.2. Представлення матриці в пам'яті
Для даної задачі можливі три варіанти розміщення в пам'яті і представлення матриці в програмі. В усіх трьох варіантах очевидно, що загальний обсяг пам'яті для розміщення даних матриці повинен бути S2 елементів типу int.
Варіант 1 показаний на рис.12.2
|
Рисунок 12.2 - Розміщення в пам'яті. Варіант 1. |
Для даних матриці виділяється необхідний об’єм пам'яті. У програмі виводиться покажчик на початок цієї області. Тип цього покажчика - int*. Таким чином, матриця є одномірним масивом і для того, щоб по номеру рядка (L) і стовпця (R) визначити індекс в одномірному масиві (N) варто виконати обчислення: N=L*S+R.
Варіант 2 показаний на рис.12.3
|
Рисунок 12.3 - Розміщення в пам'яті. Варіант 2
|
Пам'ять для даних матриці виділяється так само, як і в попередньому випадку. Але додатково виділяється пам'ять для одномірного масиву розмірності S, елементи якого мають тип int* (покажчик на ціле). Покажчик на початок цього масиву має тип int** (покажчик на покажчик на ціле). В
|
Рисунок 12.1 - Логічна схема програми |
елементи цього масиву записуються покажчики на початки відповідних рядків у масиві даних матриці.У цьому варіанті можна звертатися до даних матриці, вказуючи номер рядка і стовпця як два індекси в масиві покажчиків.
Варіант 3 показаний на рис.12.4
-
Рисунок 12.4 - Розміщення в пам'яті. Варіант 3
Цей варіант відрізняється від попередніх тим, що для кожного рядка матриці пам'ять виділяється окремо (S областей пам'яті по S елементів у кожній), і в масив покажчиків заносяться покажчики на відповідні області. Таким чином, матриця необов'язково займає суміжні області пам'яті. Можна звертатися до даних матриці, вказуючи два індекси. Виділення пам'яті (і відповідно - звільнення) потрібно виконувати в циклі. Варіант 1 забезпечує економію пам'яті, а варіанти 2 і 3 - можливість "природного" звертання до елементів матриці. Варіант 3 дозволяє раціональніше використовувати пам'ять, ніж варіант 2, але варіант 2 алгоритмічно більш простий. Ми покажемо реалізації алгоритму для варіантів 1 і 3.