Вступ

У цьому семінарі розглянуто основи взаємодії з командним рядком 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");
}