
- •1 Основні елементи мови с
- •1.1 Алфавіт мови програмування
- •1.2 Лексеми
- •1.3 Ключові слова
- •1.4 Ідентифікатори
- •1.5 Класифікація типів даних
- •1.6 Літерали
- •1.7 Оператори
- •1.8 Коментарі
- •1.9 Директиви препроцесора
- •1.10 Організація програми
- •2 Операції та вирази
- •2.1 Загальні відомості
- •2.2 Арифметичні операції
- •2.3 Операції приведення типів
- •2.4 Операції присвоєння
- •2.5 Операції інкремента і декремента
- •2.6 Операції порівняння
- •2.7 Операції зсуву
- •2.8 Порозрядні операції
- •2.9 Логічні операції
- •2.10 Операція sizeof
- •2.11 Операція послідовного обчислення
- •2.12 Операція умови (?:)
- •2.13 Адресні операції
- •3 Прості типи даних
- •3.1 Оголошення змінних
- •3.2 Час існування та область видимості змінних
- •3.3 Цілі типи даних
- •3.4 Дійсні типи даних
- •4 Оператори керування
- •4.1 Оператор розгалуження if
- •4.2 Оператор розгалуження if-else
- •4.3 Оператор множинного розгалуження switch
- •4.4 Оператор циклу for
- •4.5 Оператор циклу while
- •4.6 Оператор циклу do while
- •4.7 Оператор break
- •4.8 Оператор continue
- •5 Функції
- •5.1 Основні поняття
- •5.2 Види виклику функцій
- •5.3 Область видимості
- •5.4 Порожній тип void
- •5.5 Передача аргументів у функцію
- •5.6 Рекурсивні функції
- •5.7 Прототипи функцій
- •6 Покажчики
- •6.1 Визначення та ініціалізація покажчиків
- •6.2 Визначення покажчиків
- •6.3 Масиви
- •6.4 Операції порівняння
- •6.5 Копіювання рядка
- •6.6 Покажчики на функцію
- •6.7 Покажчики на void
- •6.8 Арифметика покажчиків
- •7 Масиви
- •7.1 Загальні поняття
- •7.2 Одновимірні масиви
- •7.3 Багатовимірні масиви
- •8 Рядки в с
- •8.1 Рядки
- •8.2.Створення рядків
- •8.3 Прототипи
- •8.3 Функції перетворення буферів
- •8.4 Функції перевірки літер
- •8.5 Операції з рядками
- •9 Структури, об’єднання, перерахування
- •9.1 Структури
- •9.2 Бітові поля
- •9.3 Ключове слово typedef
- •9.4 Об’єднання
- •9.5 Перераховуваний тип
- •10 Введення та виведення даних
- •10.1 Функція виведення printf
- •10.2Функція введення scanf
- •10.3 Введення та виведення у файл
- •11 Динамічне виділення пам'яті
9.5 Перераховуваний тип
Перераховуваний тип (Enum) – тип даних що має обмежений список ідентифікаторів.
Кожному значенню відповідає власне ім'я-ідентифікатор і ціле число, значення цього імені.
Синтаксис визначення перерахувань:
enum <ідентифікатор типу>
{
<список перерахування>
};
де ідентифікатор типу – задає ім'я перераховуваного типу,
список перерахування – список перерахування складається з імен, розділених комами. Кожне ім’я задається ідентифікатором значення і, можливо, цілим значенням типу char чи int.
Приклад 9.19. Визначення перерахувань.
enum dataType
{
DT_INT, /* 0 */
DT_CHAR, /* 1 */
DT_STRING=3, /* 3 */
DT_FLOAT, /* 4 */
DT_BYTE=8, /* 8 */
DT_SHORT, /* 9 */
DT_POINTER /* 10 */
};
Коли не вказано значення ідентифікатора, воно буде на одиницю більшим за значення попереднього ідентифікатора. Значення за замовчанням для першого ідентифікатора у списку перерахування дорівнює нулю.
Для зберігання значень змінних перерахування використовується тип int.
Перерахування зручно використовувати для запобігання появ у коді програми числових літералів, логічне значення яких може бути незрозуміле читачеві. Також перерахування це більш безпечна заміна макровизначенням #define.
Приклад 9.20. Доступ до елементів неіменованого перерахування.
#include <stdio.h>
#include <stdlib.h>
enum
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
};
void prn_day(int d)
{
Static char week[][10] = {"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"};
printf("%s\n",week[d]);
}
int main(void)
{
int i;
for(i=Sunday;i<Saturday;++i)
prn_day(i);
system("PAUSE");
return 0;
}
Програма приведена у прикладі 9.20 працює аналогічно програмі з прикладу 9.19. Якщо у прикладі 9.19 перерахування використовувалось як власний тип даних, що підкреслював логічну структуру програми, то у прикладі 9.20 перерахування служить тільки для введення іменованих констант. Таке використання перерахувань аналогічне введенню макровизначень за допомогою директиви препроцесора #define.
Приклад 9.20 показує загальнодоступність ідентифікаторів значень списку перерахування. Це в свою чергу означає що два різних визначення перераховуваного типу в одному програмному блоці не можуть мати ідентифікаторів значень з однаковими іменами, навіть якщо їм присвоєно однакові значення.
Контрольні запитання
Для чого використовуються структури?
Опишіть синтаксис визначення структури.
Що таке об’єкт структури?
Що таке поле структури?
Для чого використовується операція вибору “крапка” (“.”)?
Для чого використовується операція непрямого доступу “->”?
Як здійснюється введення/виведення даних у елементи структури?
Для чого використовується typedef?
Для чого використовується union?
Написати програму, яка зчитуватиме дані про студентів, та виводитиме їх на екран в алфавітному порядку прізвищ студентів.
Написати структуру з ім’ям STUDENT, що містить наступні поля:
прізвище, ім’я, по-батькові;
номер групи;
успішність;
Написати програму, що виконує наступні дії:
введеня з клавіатури даних в масив, що складається з 10 структур типу STUDENT;
записи повинні бути упорядковані по номеру групи;
вивід на дисплей прізвищ і номерів груп, включених у масив, якщо середній бал не більше 4;