Лабораторне заняття 2. Використання циклів та розгалужень

Мета роботи: ознайомитися з мовою програмування С, її функціями та синтаксисом; навчитися використовувати цикли та розгалуження.

Теоретичні відомості

Мова С (Сі) – мова програмування загального призначення, розроблена в 1969-1973 роках співробітником Bell Labs Деннісом Рітчі як розвиток мови B (Бі). Спочатку вона була розроблена для реалізації операційної системи UNIX, але згодом був перенесена на інші платформи.

Мова програмування С зробила істотний вплив на розвиток індустрії програмного забезпечення, а її синтаксис став основою для таких мов програмування, як C++, C#, Java і Objective-C.

Алфавіт мови С

У мові використовуються всі символи латинського алфавіту, цифри і деякі спеціальні символи:

  • символи латинського алфавіту: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
  • цифри: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
  • спеціальні символи: , (кома), ;, . (точка), +, -, *, ^, & (амперсанд), =, ~ (тильда), !, /, <, >, (, ), {, }, [, ], |, %, ?, ‘(апостроф), “(лапки), : (двокрапка), _ (знак підкреслення), \, #.

З допустимих символів формуються лексеми – визначені константи, ідентифікатори та знаки операцій.

Допустимий ідентифікатор – це слово, до складу якого можуть входити символи латинського алфавіту, цифри і знак підкреслення. Ідентифікатори даються операторам, константам, змінним, типам і функціям.

Важливо пам’ятати! В мові С розрізняються маленькі та великі літери, тому змінна Name, name та naMe – це різні змінні.

Типи даних та оголошення змінних

Сучасні мови, такі як PHP та JavaScript, зазвичай не потребують вказувати тип даних змінної. Потрібно просто оголосити її і можна починати використовувати. Але в мові C потрібно вказати тип даних для кожної змінної, яку потрібно створити перш ніж почати її використовувати. Основні типи даних представлені в таблиці 2.1.

 

Таблиця 2.1 – Типи даних в мові С

Тип даних

Опис

Об’єм

Значення

int

Використовується для змінних, що будуть зберігати цілі значення

16 біт,

32 біта

-32767 … 32767,

-231 … 231 - 1

char

Використовується для змінних, які будуть зберігати окремі символи

8 біт

всі символи з таблиці ASCII

float

Числа з плаваючою точкою (десяткові дробові числа). В першу чергу існує обмеження по кількості знаків після точки

32 біта

 

double

Дробові числа подвійної точності. Дозволяє використовувати більше знаків після точки

64 біта

 

void

Порожній тип даних. Не можна створити змінну даного типу, але він використовується для визначення функцій, що не повертають значення, а також вказують на відсутність аргументів функції

bool

Тип даних з бібліотеки cs50.h (не є стандартним типом даних). Використовується для змінних, які зберігають логічне значення

1 біт

true або false

string

Тип даних з бібліотеки cs50.h (не є стандартним типом даних). Рядок символів (текстовий рядок), який може містити слова, речення, абзаци чи навіть цілі тексти

не має фіксованого розміру

всі символи з таблиці ASCII

 

Для того, щоб визначити змінну потрібного типу даних необхідно: вказати тип даних; визначити ім'я змінної. В кінці рядка з кодом обов’язково потрібно поставити крапку з комою:

int number; // змінна number цілочисельного типу

char letter; // змінна letter символьного типу

Якщо потрібно створити кілька змінних одного і того ж типу, потрібно вказати назву типу лише один раз:

int height, width;

Можна створювати оголошувати змінну лише тоді, коли це потрібно. Тому не обов'язково створювати всі змінні на початку програми, як прийнято робити в деяких мовах програмування.

При оголошенні змінної існує можливість одразу ж присвоїти їй значення:

int number = 17;

char letter = ‘H’;

Оператори

Для того, щоб працювати зі значеннями та змінними в мові C, існує цілий ряд операторів. Розглянемо деякі з найбільш поширених, починаючи з арифметичних операторів.

В мові С використовуються стандартні операції додавання, віднімання, множення та ділення, використовуючи відповідно оператори + (плюс), - (мінус), * (зірочку) та / (слеш). Приклад:

int x = y + 1;

x = x * 5;

В даному прикладі створюється змінна x цілочисельного типу та присвоюється їй значення y плюс 1. Наприклад, якщо десь вище над цим рядком коду вказано, що y рівне 10 – в результаті виконання цих дій змінна x набуде значення рівного 11.

В наступному рядку коду x присвоюється значення x збільшене в 5 разів. До цього значення x було рівне 11. Після виконання цього рядка коду воно стане рівним 55.

Отже, при використанні оператора присвоєння (=), значення, що стоїть праворуч нього присвоюється змінній, яка знаходиться ліворуч оператора. Тобто спочатку ми виконуємо дії праворуч оператора і лише тоді присвоюємо результат змінній. Результат який там був раніше, тепер перезаписаний.

Розглянемо ще один оператор – оператором модуля. Даний оператор отримує залишок від ділення двох цілих чисел:

int m = 13 % 4

В представленому рядку коду створюється змінна m яка рівна остачі від ділення числа 13 на число 4, тобто значення m буде рівне 1.

Мова C також дає можливість застосувати арифметичні оператори до однієї змінної, використовуючи трохи коротший запис:

x = x * 5;

x *= 5;

Записані вище рядки коду повністю еквівалентні.

Однак існують дії, що досить часто використовуються в програмуванні: збільшення змінної на 1 або зменшення змінної на 1. Для спрощення цих дій в мові C існують оператори інкременту (збільшення на одиницю) та декременту (зменшення на одиницю):

x++;

x--;

Приведений вище код збільшує значення змінної x на одиницю в першому рядку, та зменшує його на 1 в другому.

Умовні оператори

Умовні оператори дозволяють програмам приймати рішення та здійснювати розгалуження в програмному коді. Нижче представлена дана конструкція на мові C:

if (логічний вираз) {

}

Якщо логічний вираз в операторі if є істинним, то всі рядки коду між фігурними дужками виконуватимуться по порядку зверху вниз. Якщо логічний вираз хибний, пропускається все, що знаходиться між фігурними дужками, тому що цей код виконується тільки тоді, коли логічний вираз є істинним.

Розглянемо ще один варіант розгалуження на мові C. Якщо логічний вираз істинний, виконується все, що знаходиться в першому наборі фігурних дужок. Якщо логічний вираз є хибним, буде виконуватися той код, що знаходиться в другому наборі фігурних дужок:

       if (логічний вираз) {

       } else {

       }

В мові C можна створити ланцюжок if-else if-else. Всі розгалуження в даному випадку є взаємовиключними – виконується лише одне з розгалужень:

       if (логічний вираз 1) {

       } else if (логічний вираз 2) {

       } else if (логічний вираз 3) {

       } else {

       }

У цьому прикладі оператор працює наступним чином: якщо не виконується перша умова – переходимо до другої; якщо не виконується друга умова – переходимо до третьої; якщо не виконується третя умова – виконуємо набір команд з останнього блоку else.

Цикли

Цикл (циклічний процес) повторення одних і тих же дій.

Тіло циклу – послідовність дій, які виконуються в циклі.

Змінні, що змінюються всередині циклу і впливають на його закінчення, називаються параметрами циклу.

 При написанні циклічних алгоритмів слід пам'ятати наступне: Для того, щоб цикл закінчився, тіло циклу має обов'язково впливати на умову входу в цикл!

В С для зручності користувача передбачено три оператори, що реалізують циклічний процес: while, do .. while і for.

Цикл з передумовою while спершу перевіряє умову, а потім виконує дії, поки умова істинна:

while (умова) {

// виконувати поки умова істинна

}

Цикл do .. while виконує дію, потім перевіряє умову. Якщо умова істинна, то повторює дію, знову перевіряє умову і так далі:

        do {  

              // виконувати поки умова істинна

         } while (умова);

Цикл do .. while, на відміну від while, обов’язково виконується хоча б один раз, навіть якщо умова хибна.

Цикл з параметрами в мові С має наступну структуру:

for (початкове_присвоєння; вираз; приріст) {

//тіло циклу

}

Алгоритм роботи циклу for наступний:

  1. Виконуються початкове_присвоєння.
  2. Обчислюється значення виразу, якщо воно не дорівнює 0 (true), то виконується перехід до п.3. В іншому випадку виконання циклу завершується.
  3. Виконується тіло циклу.
  4. Керування передається оператору приріст, після чого здійснюється перехід до п.2, тобто знову обчислюється значення виразу і т.д.

Цикли також можуть бути вкладеними:

         for (int row = 0; row < 3; row++) {  

               for (int column = 0; column < 4; column++) printf("x");  

               printf("\n");

         }

Бібліотеки

В програмуванні, бібліотека – означає колекцію раніше написаного коду. За допомогою бібліотек програмісти діляться загально використовуваним та корисним кодом, який вони написали.

Наприклад, одна з найбільш часто використовуваних функцій – printf() – не є стандартною вбудовуваною функцією. Вона є частиною стандартної бібліотеки stdio.h.

Для підключення бібліотеки до програми використовується наступна конструкція:

#include <назва_бібліотеки>

Крім бібліотеки stdio.h доволі часто використовуються math.h (для використання математичних функцій – корінь квадратний (sqrt), піднесення до степеню (pow) та ін.), string.h (для роботи з текстовими рядками – копіювання, порівняння і т.д.).

Виведення даних

Виведення даних в мові С здійснюється за допомогою функції виводу printf.

Функція printf (print formatted – форматований друк) виконує форматоване виведення змінних, зазначених у списку, відповідно до рядка форматів:

printf(рядок форматів, список змінних);

Рядок форматів містить символи, які будуть виводитися на екран і так звані специфікації. Специфікації це рядки, які починаються символом % і виконують керування форматуванням:

%[прапорець][ширина][.точність][розмір]тип

Параметри прапорець, ширина, точність і розмір в специфікаціях можуть бути відсутні. Обов'язковими складовими частинами є символ початку специфікатор формату (%) і тип.

Значення типів:

  • d, i – десяткове ціле число;
  • x – шістнадцяткове число;
  • f – числа з плаваючою точкою (дробові числа);
  • e – числа з плаваючою точкою в експоненціальній формі (1.1e+44);
  • c – виведення символу;
  • s – виведення текстового рядка;
  • % – символ для виведення на екран знаку відсотка, завжди використовується у вигляді %%.

Прапорці:

- (мінус) – значення, що виводиться, буде вирівняно по лівому краю;
+ (плюс) – завжди вказувати знак плюс або мінус перед числовим значенням;
0 (нуль) – доповнює поле до ширини (вказаної параметром ширина) символом 0.

Модифікатор ширини вказує мінімальну ширину поля. Якщо значення більше, ніж ширина поля, то запис виходить за межі поля (наприклад, %2i для значення 100 дасть поле в три символи), якщо значення є меншим за вказане число, то воно буде доповнено пробілами зліва, поведінка може змінюватися прапорцями. Наприклад, printf ("%08x", 15); виведе на екран 0000000f.

Модифікатор точності вказує на мінімальну кількість символів, яка повинна з'явитися після десяткової коми (крапки) при обробці типів e, f або максимальне число символів, які будуть виведені для типу s.

Точність задається у вигляді точки з подальшим десятковим числом. Наприклад, printf( "% 08.4f", 2.5); виведе текст 002.5000.

Модифікатор розміру дозволяє вказати розмір даних, переданих функції. Найбільш часто в якості модифікатора розміру використовується l або ll як розширення long або long long відповідно для цілочисельного типу.

Середовище CS50 Sandbox

CS50 Sandbox (https://sandbox.cs50.io) – це хмарне віртуальне середовище, де встановлено відповідні бібліотеки та налаштування для комфортного програмування на мові C.

При переході за вказаною адресою буде відображено домашню сторінку (рис. 2.1), де пропонується створити нову (Create sandbox) або переглянути вже існуючі (Recent sandboxes) «пісочниці». Кожна «пісочниця» призначена для окремої програми та являє собою ізольоване середовище для безпечного виконання цієї програми. Тобто кожна нова програма створюється в новій «пісочниці».


Рисунок 2.1 – Домашня сторінка середовища CS50 Sandbox

 Для початку роботи з середовищем необхідно зареєструватися на веб-сервісі GitHub (https://github.com ).

Зверху у вікні середовища розміщений простий редактор коду (рис. 2.2); нижче знаходиться вікно терміналу, в якому будуть вводитись команди.


Рисунок 2.1 – Віртуальне середовище програмування CS50 Sandbox

Для початку роботи необхідно натиснути на кнопку створення нового файлу програми (+), ввести назву файлу з розширенням (*.c) та натиснути Create File (створити файл). Розширення файлу вказує на те, з якою мовою програмування буде працювати середовище і, відповідно, буде підсвічувати синтаксис цієї мови.

Розглянемо код першої програми (рис. 2.3):

 

Рисунок 2.3 – Код першої програми (Hello, world!)

Після збереження написаного коду, який називається вихідним кодом, для виконання його потрібно перетворити на машинний код, тобто двійкові інструкції, які комп'ютеру легше зрозуміти. Для цього використовується програма, яка називається компілятором.

Для цього використовується панель терміналу. Значок $ зліва – це запит командного рядка, куди можна вводити команди. Для компіляції написаного коду потрібно ввести команду make hello, де hello – назва файлу з кодом програми (розширення вказувати не потрібно). Результат успішної компіляції коду показано на рис. 2.4.

 

Рисунок 2.4 – Компіляція програми в середовищі CS50 IDE

Розглянемо код програми, що отримуватиме ім’я користувача та буде виводити на екран текст Hello, введене_ім’я (рис. 2.5).

 

Рисунок 2.5 – Код програми Hello name, що приймає дані від користувача

В другому рядку коду підключається бібліотека cs50, яка не входить до переліку стандартних, однак в даному випадку вона дещо спрощує ознайомлення з програмуванням. Дана бібліотека містить додаткові типи даних (string, bool), яких не має мова C, а також набір функцій для отримання даних від користувача з клавіатури: get_char (отримання символу), get_int (отримання цілого числа), get_float (отримання дійсного числа), get_string (отримання тексту) та ін. В якості аргументу функції в дужках обов’язково вводиться текст-підказка.

В шостому рядку коду оголошується змінна name типу string та відбувається присвоєння їй значення через функцію get_string().

Вивід тексту на екран (рядок 7) включає змінну name, яка підставляється на місце специфікатора %s.

Для запуску програми після компіляції використовується команда ./hello, яка вказує на те, що файл компільованої програми hello знаходиться в поточному каталозі (./). Результат виконання програми можна побачити на рис. 2.6.


Рисунок 2.6 – Результат виконання програми Hello name

Розглянемо код програми Math, яка використовує операції цілочисельної математики (рис. 2.7).

  

Рисунок 2.7 – Код програми Math та результат її виконання

В шостому та сьомому рядках коду оголошуються змінні x, y та присвоюються їм значення, отримані від користувача за допомогою функції get_int () . Далі над цими змінними виконуються математичні операції.

Особливу увагу варто звернути на операції цілочисельного ділення та операцію остачі від ділення (рядок 11 та 12 відповідно). В першому випадку здійснюється ділення двох чисел, але дробова частина відкидається. В другому випадку виводиться остача від ділення двох цілих чисел.

Розглянемо код програми Floats, яка працює з числами з плаваючою точкою (рис. 2.8).

 

Рисунок 2.8 – Код програми Floats та результат її виконання

В даному випадку варто зазначити те, що навіть коли результат виконання операції є ціле число – виводиться даний результат у форматі чисел з плаваючою точкою.

Ще одна програма, на якій варто зупинитися – Celsius, що переводить значення температури у градусах по Фаренгейту в градуси по Цельсію (рис. 2.9).

  

Рисунок 2.9 – Код програми Celsius та результат її виконання

В даній програмі варто звернути увагу на рядок 6, де прописана формула перетворення: числа 5, 9 та 32 записані у форматі чисел з плаваючою точкою. Це необхідно для того, щоб при обрахунках програма не здійснила над цими числами цілочисельні операції, оскільки в такому випадку результат буде неправильний.

При виведенні результату на екран, вказується обмеження в 2 знаки після точки (рядок 7) – %.2f.

Блок-схеми

Блок-схема – представлення алгоритму розв'язання або аналізу задачі за допомогою геометричних елементів (блоків), які позначають операції, потік, дані тощо (рис. 2.10).


Рисунок 2.10 – Блок-схема алгоритму

Використання блок-схем дозволяє описати алгоритм роботи програми, не прив’язуючись до будь-якої мови програмування, просто розв’язуючи поставлену задачу.

Основні елементи для побудови блок-схем алгоритму наведені в табл. 2.2:

 

Таблиця 2.2 – Основні елементи блок-схем

Назва

Позначення

Функція

Термінатор


Елемент відображає вхід в середовище або вихід з нього (початок та кінець програми). Всередині фігури записується відповідна дія.

Процес


Елемент відображає одну або кілька операцій, обробку даних будь-якого виду (зміна значення даних, форми подання, розташування). Всередині фігури записують безпосередньо самі операції.

Умова


Елемент відображає обробку умови, рішення або функцію розгалужувального типу з одним входом і двома або більше альтернативними виходами, з яких тільки один може бути обраний після обчислення умов, визначених всередині цього елементу. Вхід в елемент позначається лінією, що входить зазвичай у верхню вершину елементу. Якщо виходів два чи три то зазвичай кожен вихід позначається лінією, що виходить з решти вершин (бічних і нижньої). Якщо виходів більше трьох, то їх слід показувати однією лінією, що виходить з вершини (частіше нижньої) елемента, яка потім розгалужується.

Введення


Елемент відображає дані, що вводяться до програми (наприклад, з клавіатури). Цей символ не визначає носія даних.

Виведення


Елемент відображає результати обробки даних (наприклад, виведення на екран). Цей символ не визначає носія даних.

Цикл з параметром


Елемент відображає заголовок циклу з параметром. У ньому через крапку з комою вказуються ім'я змінної (параметра) з початковим значенням, граничне значення параметра (або умова виконання циклу), крок зміни параметру.

Функція


Елемент відображає виконання процесу, що складається з однієї або кількох операцій, які визначені в іншому місці програми (у вигляді окремої функції). Всередині символу записується назва функції і передані в неї дані.

Блок-схема не повинна відображати підключення бібліотек або оголошення змінних, оскільки дані операції мають різну реалізацію в різних мовах програмування, а основна мета блок-схеми – показати загальний розв’язок задачі.

Розглянемо кілька простих прикладів (рис. 2.11):


а)                                              б)                                             в)


г)                                              д)                                             е)

Рисунок 2.11 – Приклади блок-схем основних алгоритмів:
а, б – лінійний алгоритм; в – лінійний алгоритм з функціями вводу/виводу; г – цикл з параметром; д – цикл з передумовою; е – цикл з післяумовою

Остання зміна: Thursday 28 May 2020 13:35 PM