
- •Лабораторна робота №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)
- •Контрольні питання
- •Література
2. Теоретичні відомості
Для формування двомірного динамічного масиву в мові С необхідно використовувати оператори:
-
Підключення бібліотеки:
#include<stdlib.h>
#includе<alloc.h>
-
Описати двомірний динамічний масив як масив вказівників:
Int**array;
-
Організувати ввод показників розміру (тобто, n – кількість стрічок, m – кількість стовпців):
int n =0, m=0;
printf(“\n n=”); scanf(“%d”, &n);
printf(“\n m=”); scanf(“%d”, &m);
-
Розподілити пам'ять під масив вказівників, які вказують на масив стрічок:
array=(int**)malloc(n*sizeof(int*))
-
Розподілити пам'ять під масив стрічок:
for(i=0;i<n;i++)
array[i]=(int*)malloc(m*sizeof(int));
6) Далі з масивом array[][] можна працювати як з звичайним двомірним масивом:
array[i][j].
Використання масивів як параметрів функцій. Якщо в якості параметра функції використовується масив, то насправді всередину функції передається лише адрес початку масиву. Наприклад, заголовок функції Scalar() для обчислення скалярного добутку двох векторів (масивів a[] та b[], розмір яких n) виглядає так:
float Scalar(int n, float a[ ], float b[ ])...
або
float Scalar(int n, float *a, float *b)...
Конструкції
float b[ ]; і float *b;
цілком рівноправні в специфікаціях параметрів функцій. Однак в першому випадку роль імені b як вказівника не така виразна. У другому варіанті все більш очевидно - b визначається як вказівник типу float *.. .
В тілі функції Scalar() звернення до елементів масивів-параметрів виконувалося за допомогою індексованих елементів a[i] і b[i]. Однак можна звертатися до елементів масивів, використовуючи вирази *(a+i) і *(i+b).
Так як масив завжди передається у функцію як вказівник, то всередині функції можна змінювати значення елементів масиву-фактичного параметра, визначеного в головній програмі. Це можливо і при використанні індексування, і при розіменуванні вказівників на елементи масиву.
Для ілюстрації вказаних можливостей розглянемо функцію, що підносить до квадрату значення елементів одномірного масиву, і викликає її програму.
#include <stdio.h>
/* Визначення функції: */
Void quart(int n, float * х)
{
int i ;
for(i=0;i<n;i++)
/* Присвоєння після множення: */
*(x+i)*=*(x+i);
}
Void main()
{
/* Визначення масиву: */
float z[ ]={1.0, 2.0, 3.0, 4.0};
int j ;
quart(4,z); /* Звернення до функції */
/* Розпечатка зміненого масиву */
for(j=0;j<4;j++)
printf ("\nz [%d] =%f "., j , z [ j ]) ;
}
Результат виконання програми:
z[0]=l.000000 z[l[=4.000000 z[2]=9.000000 z[3]=16.000000
Щоб ще раз звернути увагу на рівноправність параметрів у вигляді масиву і вказівника того ж типу, відмітимо, що заголовок функції в нашій програмі може бути і таким:
Void quart (int n, float X [ ])
В тілі функції розіменовано вираз, що містить ім’я масиву-параметру, тобто замість індексованої змінної х[i] використовується *(x+i). Більш цікава можливість полягає в тому, що можна змінювати всередині тіла функції значення вказівника на масив, тобто в тілі циклу записати, наприклад, такий оператор:
*х*=*х++;