
- •1.1 Перші кроки
- •1.2 Змінні й арифметичні вирази
- •1.3 Твердження for
- •1.4 Символічні константи
- •1.5 Ввід і вивід знаків
- •1.5.1 Копіювання файла
- •1.5.2 Відлік символів
- •1.5.3 Відлік рядків
- •1.6 Масиви
- •1.7 Функції
- •1.8 Аргументи - виклик за значенням
- •1.9 Символьні масиви
- •1.10 Зовнішні змінні й область дії
- •2.1 Назви змінних
- •2.2 Типи даних і розміри
- •2.3 Константи
- •2.4 Оголошення
- •2.5 Арифметичні операції
- •2.6 Реляційні та логічні оператори
- •2.7 Перетворення типів
- •2.8 Оператори приросту та спаду
- •2.9 Розрядні оператори
- •2.10 Оператори та вирази присвоєння
- •2.11 Вирази умов
- •2.12 Пріоритет і послідовність обчислення
- •3.1 Вирази та блоки
- •3.3 Else if
- •3.4 Switch
- •3.5 Цикли while та for
- •3.6 Цикли do-while
- •3.7 Break і continue
- •3.8 Goto та мітки
- •4.1 Основні знання про функції
- •4.2 Функції, які не повертають цілих
- •4.3 Зовнішні змінні
- •4.4 Правила області дії
- •4.5 Файли заголовка
- •4.6 Статичні змінні
- •4.7 Регістрові змінні
- •4.8 Структура блоків
- •4.10 Рекурсія
- •4.11 Препроцесор c
- •4.11.1 Включення файлів
- •4.11.2 Заміна макросів
- •4.11.3 Обумовлене включення файлів
- •5.1 Покажчики й адреси
- •5.2 Покажчики й аргументи функцій
- •5.3 Покажчики та масиви
- •5.4 Арифметика адрес
- •5.5 Покажчики на символи та функції
- •5.6 Масив покажчиків; покажчики на покажчики
- •5.7 Багатовимірні масиви
- •5.8 Ініціалізація масиву покажчиків
- •5.9 Покажчики в порівнянні з багатовимірними масивами
- •5.10 Аргументи командного рядка
- •5.11 Покажчики на функції
- •5.12 Складні оголошення
- •6.1 Основні поняття про структури
- •6.2 Структури та функції
- •6.3 Масиви структур
- •6.4 Покажчики на структури
- •6.5 Структури зі зворотнім звертанням
- •6.6 Пошук по таблиці
- •6.7 Typedef
- •6.8 Сполуки
- •6.9 Розрядні поля
- •7.1 Стандартний ввід і вивід
- •7.2 Форматований вивід - printf
- •7.3 Списки аргументів довільної довжини
- •7.4 Форматований ввід - scanf
- •7.5 Доступ до файлів
- •7.6 Обробка помилок - stderr і exit
- •7.7 Ввід і вивід рядків
- •7.8 Додаткові функції
- •7.8.1 Операції з ланцюжками
- •7.8.2 Перевірка і перетворення класів символів
- •7.8.3 Ungetc
- •7.8.4 Виконання команд
- •7.8.5 Керування пам'яттю
- •7.8.6 Математичні функції
- •7.8.7 Генератор випадкових чисел
- •8.1 Дескриптори файлів
- •8.2 Низькорівневий ввід/вивід - read і write
- •8.3 Open, creat, close, unlink
- •8.4 Довільний доступ - lseek
- •8.5 Приклад: втілення fopen і getc
- •8.6 Приклад - перелік вмісту каталогів
- •8.7 Приклад - розподільник пам'яті
1.3 Твердження for
Існує багато способів написання програми для вирішення одного і того ж завдання. Тож, спробуймо інший варіант перетворювача температур.
#include <stdio.h>
/* виводить таблицю Фаренгейт-Цельсій */
main()
{
int fahr;
for (fahr = 0; fahr <= 300; fahr = fahr + 20)
printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}
Це спричиняє ті самі відповіді, але, без сумніву, виглядає інакше. Одна з основних перемін — це видалення більшості змінних; залишилась тільки fahr, і ми оголосили її як int. Верхня й нижня межа та крок представлені як константи у твердженні for, — нової для нас конструкції. Вираз, що обчислює температуру за Цельсієм, з'являється як третій аргумент printf, замість окремого виразу присвоєння.
Ця остання зміна є прикладом загального правила — у будь-якому контексті, де вживається значення певного типу, ви можете використати складніший вираз того самого типу. Оскільки третім аргументом printf має бути число з рухомою точкою, щоб зійтися з %6.1f, то будь-який вираз, що повертає число з рухомою точкою, може зайняти це місце.
Твердження for також є циклом — узагальненим випадком while. Якщо ви порівняєте його з попереднім while, то робота for стане зрозумілою. Всередині дужок існують три частини, розділені крапкою з комою. Перша частина, ініціалізація
fahr = 0
відбувається один раз, ще до того, як увійти до циклу. Друга частина — це перевірка умови, яка контролює цикл:
fahr <= 300
Ця умова обчислюється; якщо вона істинна, буде виконано корпус циклу (в цьому випадку один вираз printf). Після цього виконується стадія приросту
fahr = fahr + 20
і умова оцінюється знову. Цикл завершиться тільки тоді, коли умова виявиться хибною. Так само як і з while, корпус циклу може містити одне твердження або групу тверджень, включених у фігурні дужки. Ініціалізацією, умовою та приростом може служити будь-який вираз.
Вибір між while і for є довільним і може залежати тільки від того, який з них здається зрозумілішим. for, як правило, підходить для циклів, в яких ініціалізація та приріст складаються з одного виразу кожен, і вони логічно пов'язані між собою. Це компактніше за while, і зберігає вирази, які контролюють цикл, разом, в одному місці.
Вправа 1-5. Змініть програму перетворення температур, щоб вона виводила таблицю у зворотній послідовності, тобто від 300 градусів до 0.
1.4 Символічні константи
Останнє спостереження, до того як ми назавжди залишимо програму перетворення температур. Вважається поганою практикою закопувати «магічні числа», такі як 300 та 20 десь всередині програми; вони мало про що кажуть тим, хто переглядає програму пізніше, і їх важко змінити у систематичний спосіб. Одним з рішень питання про «магічні числа» є надання їм осмислених імен. Рядочок #define означує символічну назву або символічну константу для ланцюжка якихось знаків:
#define назва заміна
Таким чином, будь-яку появу назви (не в лапках, і не як частина іншої назви) буде замінено на відповідний текст заміни. Назва має ту саму форму, що й назва змінних: послідовність літер і цифр, що починаються з літери. Текст заміни може складатися з довільної послідовності знаків; він не обмежений тільки числами.
#include <stdio.h>
#define LOWER 0 /* нижня межа температурної шкали */
#define UPPER 300 /* верхня межа */
#define STEP 20 /* розмір кроку */
/* виводить таблицю Фаренгейт-Цельсій */
main()
{
int fahr;
for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP)
printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}
Величини LOWER, UPPER та STEP — це символічні константи, а не змінні, тож вони не з'являються в оголошеннях. Назви символічних сталих традиційно пишуться з великих літер, щоб легко було відрізнити їх від назв змінних у нижньому регістрі. Зверніть увагу, що крапки з комою немає в кінці рядка #define.