Вступ
У цьому семінарі розглянуто основи взаємодії з командним рядком Linux і основні конструкції мови С: типи даних, оператори (арифметичні та логічні), умовні оператори (if/else, switch, тернарний оператор), цикли (while, do/while, for).
Командний рядок Linux
У курсі використовується спеціальна віртуальна лабораторія – віртуальна машина, на якій встановлено ОС Linux та всі необхідні для курсу програми. Вигляд віртуальної лабораторії зображено на рисунку 1.1.
Основні команди терміналу
-
ls : відобразити вміст папки (показати список файлів і папок)
- ls –l : відобразити вміст папки і додаткову інформацію
- ls –a : відобразити також приховані файли.
Перший стовпчик – це інформація про дозволи для файлу (дозвіл на читання, запис і т. ін.)
Червоним прямокутником виділено «.» (поточна папка) і «..» (папка на рівень вище).
-
cd : перейти в іншу папку (без параметрів – у домашню папку, що позначається тильдою «~»)
-
cd .. : перейти в попередню папку (на рівень вище)
-
cd [PATH] : перейти у папку за шляхом [PATH]
-
-
clear : очистити екран терміналу
-
mkdir [DIRECTORY_NAME] : створити нову папку із назвою [DIRECTORY_NAME]
-
gedit [FILE_NAME] : відкрити у текстовому редакторі файл [FILE_NAME]
Створимо файл hi.txt, напишемо у ньому нашу першу програму (вона виводитиме на екран слово «Hi!»)
-
mv [FILE_NAME] [DIRECTORY_PATH] : перемістити файл із назвою [FILE_NAME] у папку за шляхом [DIRECTORY_PATH]
Також цю команду можна використовувати для перейменування файла, якщо замість [DIRECTORY_PATH] просто вказати нову назву файла:
-
make [PROGRAM_NAME] : Скомпілювати програму і створити виконуваний файл із іменем [PROGRAM_NAME]
-
./[PROGRAM_NAME] : запустити програму [PROGRAM_NAME]
-
cp [FILE_NAME] [NEW_FILE_NAME] : скопіювати файл із назвою [FILE_NAME], надавши копіїї ім’я [NEW_FILE_NAME]
Вправа: створити нову папку, hi_dir, і перемістити всі файли в цю нову папку:
-
rm [FILE] : видаляє файл із іменем [FILE], запитуючи підтвердження.
-
rm –f [FILE] : видаляє файл без підтвердження.
Можна побачити, що файлів hi та hi.c, які раніше існували, тепер немає.
-
rm –rf [DIRECTORY] : видаляє папку [DIRECTORY] та все, що в ній знаходиться.
Команда ls нічого не вивела – отже, папка hi_dir більше не існує.
-
-
CTRL + C : перервати виконання програми (наприклад, якщо вона зависла або ви хочете її вимкнути)
Всі ключі в команд можна комбінувати. Наприклад, можна ввести ls –la, щоб вивести дозволи для прихованих файлів:
Типи даних
Тип |
Що це? |
Приклад даних |
Розмір (байт) |
int |
Цілі числа |
0; 1; 2; -3; 4; 10254 |
4 |
float |
Дробові числа |
1.5; 5.0; 123.4567 |
4 |
double |
Дробові числа |
1.5; 5.0; 123.45678932 |
8 |
long long |
Довгі цілі |
0; 1; 2; |
8 |
char |
Символ |
'A'; 'B'; 'x'; '@' |
1 |
short |
Короткі цілі |
-124; 0; 1; 125 |
2 |
string |
Рядки символів |
"Hi"; "This is fine" |
4 |
bool |
Істина чи хибність |
true; false |
1 |
Знати розмір типу даних може бути корисно, щоб переміщуватися по наборах однотипних даних.
Рядки string записуються в подвійних лапках (наприкалад, "Hi"), а символи char – в одинарних (наприклад, 'B'). Різниця полягає в тому, що у рядку string можна зберігати багато символів (хоча можна зробити й рядок з одного символа, наприклад, "H", або пустий рядок, ""), а символ char – це завжди лише один символ.
Основні арифметичні оператори
Порядок пріоритету операцій – такий самий, як в математиці:
Операція |
Символ |
Приклад |
Коли повертає значення true (істина) |
Рівність |
== |
a == b |
Значення а і b однакові |
Не дорівнює |
!= |
a != b |
Значення a i b різні |
Менше |
< |
a < b |
Значення a менше ніж b |
Менше або рівне |
<= |
a <= b |
Значення a менше або рівне b |
Більше |
> |
a > b |
Значення a більше ніж b |
Більше або рівне |
>= |
a >= b |
Значення a більше або рівне b |
Логічне «І» |
&& |
a && b |
Коли a – true, b – true. |
Логічне «АБО» |
|| |
a || b |
Коли або а – true, або b – true. |
- Спочатку обчислюються вирази в дужках;
- Потім – множення та ділення;
- Додавання і віднімання.
Для логічних І та АБО a i b повинні мати тип boolean, або бути логічними виразами. Тобто з допомогою логічного І можна, наприклад, об’єднати умови, щоб перевірити, чи значення якоїсь зміннох x лежить в діапазоні від 5 до 15:
(x > 5) && (x < 15)
Умовні оператори
Умовні оператори перевіряють умову, і виконують дії, якщо ця умова – істинна. Умова – це логічний вираз.
Оператор if перевіряє умову, і виконує все, що описано між фігурними дужками:
if (умова) { //Зробити щось, якщо умова істинна }
Оператор if/else перевіряє умову, і виконує одні дії, якщо умова істинна, якщо ж хибна – то інші дії.
if (умова) { //Зробити щось, якщо умова істинна } else { //Зробити щось, якщо умова хибна }
Приклад: якщо час менше 12 години, вивести «Доброго ранку», інакше (else) – вивести «Доброго дня».
if (time < 12) { printf("Доброго ранку!\n"); } else { printf("Доброго дня!\n"); }
В мові С існує оператор вибору (switch). Він має такий вигляд:
switch (n) { case константа1: // виконати, якщо n дорівнює константі1 break; case константа2: // виконати, якщо n дорівнює константі2 break; ... default: // виконати, якщо n не дорівнює жодній із вказаних констант. break; }
Приклад: якщо n = 50, вивести "CS50 is Introduction to Computer Science I", якщо n = 51, вивести "CS51 is Introduction to Computer Science II", інакше – вивести "Sorry, I'm not familiar with that class!"
switch (n) { case 50: printf("CS50 is Introduction to Computer Science I\n"); break; case 51: printf("CS51 is Introduction to Computer Science II\n"); break; default: printf("Sorry, I'm not familiar with that class!\n"); break; }
Без оператора break програма не буде зупинятися, а переходитиме до наступної умови.
Також є тернарний оператор. Загальний вигляд:
condition ? (виконати якщо умова істинна) : (виконати якщо умова хибна);
Наприклад:
string professor = (class_num == 50) ? "David Malan" : "not David Malan";
Цикли
Цикл while спершу перевіряє умову, а потім виконує дії, поки умова істинна:
while (умова) { // виконувати поки умова істинна }
Цикл do/while виконує дію, потім перевіряє умову. Якщо умова істинна, то повторює дію, знову перевіряє умову і так далі:
do { // виконувати поки умова істинна } while (умова);
Цикл do/while, на відміну від while, обов’язково виконується хоча б один раз, навіть якщо умова хибна.
Цикл for повторює дію певну кількість разів.
for (int dwarves = 0; dwarves < 7; dwarves++) { printf("I'm here to help you, Snow White!\n"); }
Цикли можна вкладати один в одний:
for (int row = 0; row < 3; row++) { for (int column = 0; column < 4; column++) { printf("x"); } printf("\n"); }