- •Введення
- •1. Структура та обсяг дисципліни
- •2. Основи програмування на мові с
- •2.1 Найпростіші конструкції мови
- •2.2 Типи даних
- •2.4 Операції мови с
- •2.5 Структура простої с програми
- •2.6 Організація введення-виведення
- •2.7 Компіляція в системі Linux
- •2.8 Організація розгалужень в програмі
- •2.9 Організація циклів
- •2.10 Оператор break
- •2.11 Оператор continue
- •2.11 Масиви
- •2.12 Функції
- •2.13 Вызов функции с переменным числом параметров
- •2.14 Рекурсивні функції
- •2.15 Читання і запис текстових файлів
- •2.16 Структури даних
- •2.17 Перелік|перерахування| (enumeration)
- •2.18 Об'єднання (union)
- •3. Операційні системи і системне програмування
- •3.1. Поняття операційної системи
- •4. Корисні команди Linux
- •4.1. Загальні|спільні| команди
- •4.1.1. Команда arch – виведення архітектури комп'ютера
- •4.1.2. Команда clear – очищення екрану
- •4.1.3. Команда date
- •4.1.9. Команда uptime – інформація про роботу системи
- •4.1.10. Команда users – інформація про користувачів
- •4.1.11. Команди w, who і whoami інформація про користувачів
- •4.1.12. Команда xf8config – настройка графічної підсистеми
- •4.2. Команди для роботи з текстом
- •4.2.1. Команди diff і cmp
- •4.2.2. Команди grep і egrep – текстовий фільтр
- •4.2.3. Команди more и less – посторінкове виведення
- •4.2.4. Команди head і tail – виведення начала і хвоста файлу
- •4.2.5. Команда wc – підрахунок слів у файлі
- •5. Захист інформації в інформаційних системах
- •5.1 Основні завдання забезпечення безпеки
- •5.2 Базові поняття криптографії
- •5.2.1 Поняття криптографічного алгоритму і протоколу
- •5.2.2 Криптосистеми з секретним ключем
- •5.2.3 Криптосистеми із відкритим ключем
- •5.2.4. Гибридні криптосистеми
- •5.2.5. Цифрові підписи
- •5.2.6. Сертифікати
- •5.3. Принципи аутентифіекації і керування доступом
- •5.3.1. Основи аутентифікації
- •5.3.2. Основи керування доступом
- •5.4. Аутентифікація та керування доступом в unix
- •5.4.1. Облікові записи користувачів
- •5.4.2. Аутентифікація
- •5.4.3. Керування доступом
- •6. Програмний інтерфейс unix. Системні виклики і функції стандартних бібліотек
- •6.1. Підтримка програмування в oc unix. Вивчення передачі інформації
- •6.2. Змінні оточення
- •6.3. Обробка помилок
- •6.4. Правила формування і засоби розбору командних рядків
- •7. Операції над файлами
- •7.1 Файлові операції posix
- •7.2. Збирання інформації про атрибути файла
- •7.3. Операції над каталогами
- •Література
2.16 Структури даних
Структури - це один з складених типів даних. Структурні змінні, або просто структури, це об'єднання однієї або більш змінних, можливо різних типів, в одну область пам'яті, що має для простоти одне ім'я. Окремі складові частини структурної змінної називаються полями.
Поняття структури в мові З відповідає двом різним поняттям. По-перше, це позначення місця в пам'яті, де розташовується інформація. Це місце називається структурною змінною. По-друге, це правило формування структурної змінної, використовуване для виділення їй місця в пам'яті і організації доступу до її полів. Далі таке правило називатимемо шаблоном структури.
Опис структурної змінної складається з двох кроків:
завдання шаблону структури;
опис структурної змінної.
Кожен шаблон має унікальне ім'я, яке підкоряється правилам формування імен змінних в мові С.
Синтаксис шаблону:
struct name {
type1 fieldname1;
type2 fieldname2;
…
typen fieldnamen;
};
де:
name - ім'я шаблону;
typen - будь-які типи змінних;
fieldname - імена полів.
Імена полів в одному шаблоні повинні бути унікальними, в різних - можливі співпадаючі імена.
Приклад шаблону приведений нижче:
struct student {
char name[32];
char lastname[32];
int kurs;
int years;
float stypendiya;
};
На даний момент визначена тільки форми даних, що «описують» студента. Після завдання шаблону можна описати структурну змінну, наприклад:
struct student first_student, second_student;
Існує ще один варіант опису структурної змінної - оголошення її безпосередньо після оператора опису шаблону, наприклад:
struct student {
char name[32];
char lastname[32];
int kurs;
int years;
float stypendiya;
} first_student, second_student;
Існує два способи звернення до структурної змінної:
з використанням оператора .
з використанням оператора ->
Оператор . формує посилання на потрібне поле з імені структурної змінної і імені поля, наприклад:
first_student.stypendiya=500;
Якщо дані прочитуються з клавіатури, то це можна зробити так6
scanf(“%f”,&first student);
При описі структурної змінної дозволяється виконувати ініціалізацію полів змінних, наприклад:
struct student first_student{
“Іванов”,
“Іван”,
2,
19,
500,
};
За заданим шаблоном структури можна описувати масиви структур і покажчики на структури. Наприклад:
struct student gr1[40];
Доступ до елементів масиву може виконуватися через індекс елементу або через покажчик-константу, яким є ім'я масиву:
gr1[i].stypendiya=500;
*(gr1+i).stypendiya=500;
(gr1+i)->stypendiya=500;
Як приклад використання даних типу структура розглянемо програму, в якій у файлі даних car.dat (передбачається, що файл існує і зберігає дані типу структура car) шукається автомобіль за номером oi8413t.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(void)
{
struct car {
char nomer[15];
char type[15];
char mark[15];
} car_current;
char nomer[ ]=”oi8413t”;
char work[80];
unsigned int flag=0;
FILE *fp;
if((fp=fopen(“car.dat”,”rt”))==NULL)
{
printf((“n Cannot open file”);
exit(1);
}
while(fgets(work,80,fp)!=NULL)
{
sscanf(work,”%s %s %s”, car_current.nomer, car_current.type, car_current.mark);
if(strstr(car_current.nomer,nomer)==0)
{
continue;
}
else
{
printf(“%s”,work);
flag=1;
break;
}
if(flag==0)
{
printf(“ Автомобіль не знайдений”);
}
fclose(fp);
}
Тут файл car.dat відкривається на читання. На кожному кроці циклу з файлу в буфер (масив work) прочитується рядок і порівнюється з шуканого за допомогою функції пошуку підрядка в рядку strstr(). Функція strstr() у разі невдачі повертає 0, інакше повертає 1.
Функція sscanf() прочитує дані з work і розносить їх по рядку, формату, по трьох структурованих змінних.
