У мові Сі є особливість, пов'язана з тим, що всі аргументи функції передаються по значенню. При виклику функції в стеці виділяється місце для формальних параметрів і в це виділене місце заноситься значення фактичного параметра, тобто значення параметра при виклику функції. Далі функція використовує і змінює параметри в стеку. При виході з функції змінені значення параметрів втрачаються.
У мові Сі викликана функція не може змінити змінні, вказані в якості фактичних параметрів при звертанні до неї.
Усі змінні повинні бути оголошені до їх використання в програмі. При оголошенні змінної їй присвоюється один з типів даних і в процесі виконання програми компілятор опрацьовує значення кожної змінної, виходячи з присвоєного типу даних, який є незмінним для цілої програми. У мові Сі є п'ять типів даних, які називаються базовими:
char – символьний; int – цілочисельний; float – опрацьовує дробові числа (числа з плаваючою крапкою); double – числа з плаваючою точкою подвійної довжини; void – пустий тип, який немає значення.
Типи char та int є цілими типами даних і призначені для зберігання цілих чисел. Тип char також призначений для цілих чисел, оскільки будь-який символ у комп'ютері пов'язаний з цілим числом – кодом цього символу у таблиці ASCII. Сам символ нам необхідний, коли інформація виводиться на екран, на принтер або вводиться з клавіатури.
Усі типи по замовчуванню є знаковими (signed).
Неможливо створити змінну типу vоid. Однак, введення такого типу є корисним про що ми поговоримо пізніше.
Різниця між додатними і від'ємними цілими числами полягає в тому як інтерпретується старший біт цілого числа. Якщо старший біт рівний 0 – число додатнє, якщо старший біт – 1, число від'ємне. Ціле число +3 буде мати вигляд:
Для отримання від'ємного числа –3 код змінного на зворотній (обернений) і до молодшого біту додається 1:
На основі вищевикладених типів будуються подальші типи даних. Ці типи створюються модифікаторами (modifiers), які ставляться перед основним тілом. Модифікаторами є наступні зарезервовані слова: signed – знаковий, unsigned – беззнаковий, long – довгий, short – короткий.
Тип
Розмір в байтах (бітах)
Інтервал зміни
char
1(8)
-128
unsigned char
1(8)
signed char
1(8)
-128
int
2(16)
-32768
unsigned int
2(16)
signed int
2(16)
-32768
short int
2(16)
-32768
unsigned short int
2(16)
signed short int
2(16)
-32768
long int
4(32)
-2147483648
signed long int
4(32)
-2147483648
unsigned long int
4(32)
float
4(32)
3.4Е-38
3.4Е+38
double
8(64)
1.7Е-308
1.7Е+308
long double
10(80)
3.4Е-4932
3.4Е+4932
При уважному розгляді можна помітити, що типи int, short int, signed int та signed short int мають однакові границі зміни. Ці типи хоча і мають різні назви є абсолютно однаковими для даної реалізації компілятора мови.
Оголошення змінних
Всі змінні повинні бути оголошені (declare) до їх використання в програмі. Оголошення змінної приводить до виділення пам'яті в розмірі, який необхідний для розміщення змінної даного типу (char – 1 байт, int – 2 байти, float – 4 байти, double – 8 байтів).
Основна форма оголошення (declaration):
тип <список_змінних>;
Приклади:
char c_symbol;
int ia, ib, ic;
float fa123, fradius;
double dArray1abc;
Оголошення змінних одного типу обов'язково закінчується ;
Ім'я змінної може бути довільним, але між програмістами існує неписане правило згідно якого ім'я починається з першої букви типу даних, тобто імена змінних символьного типу починаються з с, цілого типу – з і, дробового числа – з f або d.
Коли змінна з'являється у програмі, велике значення має місце оголошення змінної. Правило, яке визначає де змінна може бути використана, залежить від того, де змінна була оголошена, і називається правилом видимості (scope rules). У мові Сі є три місця в програмі, де може бути оголошена змінна.
1. Поза будь-якими функціями, у тому числі main( ) – глобальна (global), може бути використана в будь-якому місці програми.
2. Всередині блоку, у тому числі всередині тіла функції – локальна (local), може бути використана тільки всередині блоку.
3. Як формальний параметр функції, може використовуватись як локальна змінна для даної функції.
Важливо запам'ятати наступне:
− дві глобальні змінні не можуть мати однакові імена;
− локальна змінна однієї функції може мати таке ж ім'я як і локальна змінна іншої функції (або формує параметр іншої функції);
− дві локальні змінні в одному блоці не можуть мати однакові імена, у тому числі формований параметр функції не може співпадати з локальним параметром.
Константи можуть бути будь-якого базового типу даних:
const <тип_даних> = <чисельне значення>;
Приклади:
const int i_con1 = 10;
const float f_co2 = 2.45;
Числа також вважаються константами в мові Сі. Для визначення до якого типу даних їх віднести використовується наступне правило. Ціла константа (без плаваючої точки) відноситься до типу int, якщо попадає в інтервал значень, якщо не попадає – до типу unsigned int, якщо не попадає – то long int. Це саме стосується і дробових чисел: float – unsigned float – double – long double.
У мові С існує механізм явного задавання типу констант з допомогою суфіксів: 12h, 344 – short int, 23L – long int, 23.4f – float.
Так як при програмуванні важливе значення мають вісімкові і шістнадцяткові системи числення, то розглянемо (octal) і (hexadecimal) константи.
Для 16-кових попереду ставиться Ox, для 8-кових О:
16-кова – OxFF28 8-кова – О1, О55, О38.
Ініціалізація змінних
Ініціалізація – це присвоєння змінній першого значення. Мова Сі надає користувачу можливість присвоїти змінній значення одночасно з її оголошенням у програмі.
тип <ім'я_змінної>=<константний вираз>;
Приклади:
char ch='e';
int pr=24;
int ia=2*28-4;
float rr1=23.345;
Ініціалізація приводить до того, що у виділену пам'ять заноситься значення ініціалізації. Якщо не ініціалізувати змінну, але використовувати її в програмі, то слід врахувати, що цій змінній присвоїлося значення "0".
1. #include<stdio.h>
2. /* Приклад 1 */
3. void main(void)
4. {
5. int year, month;
6. year=2006;
7.
8. printf("Зараз %d рік \n", year);
9. }
(Рядки пронумеровані для зручності подальшого пояснення).
Після введення програми з клавіатури в інтегрованому середовищі програмування необхідно зайти в пункт меню Run і запустити програму на виконання викликавши підпункт меню Run. Після виконання програми на екрані виникне повідомлення – результат виконання програми: Зараз 2006 рік. В певних трансляторах для перегляду результатів виконання програми необхідно викликати екран результатів – Alt F5 .
Пояснення:
1. Перший рядок повідомляє компілятору про необхідність підключення бібліотечного файлу stdio.h. Цей файл містить опис функцій стандартного вводу-виводу (standard input/output), зокрема в нашій програмі буде використано функцію printf(). Ця функція є необхідною, оскільки в мові програмування Сі не передбачено операторів вводу-виводу.
2. Коментар.
3. Визначає ім'я функції. В програмі обов'язково повинна бути хоча б одна функція – головна (main), яка повинна мати свій тип – перший void і мати аргументи – другий void. Представлений запис означає, що функція main() не передає жодного значення в основний проект, який може містити кілька окремих програм, і дана функція немає жодних аргументів. Можливий простіший запис – main().
4. Фігурна дужка означає відкриття основної функції. Фігурні дужки завжди ідуть парами. Закриваюча дужка повинна завершувати головну функцію.
5. Оголошення змінних. В програмі планується використання двох змінних цілого типу – year, month.
6. Оператор присвоювання. Змінній year присвоюється чисельне значення 2006. Всі оператори обов'язково закінчуються ;.
7. Пусті рядки не грають жодної ролі і вставляються для зручності читання.
8. Виклик стандартної функції виводу на екран printf(). Функція складається з двох частин – імені і двох аргументів – "Зараз %d рік \n" і year, аргументи розділяються комою. Перший аргумент – керуюча стрічка (control string) може містити між лапками будь-яки символи і специфікатори формату, які починаються з %. В нашому випадку %d показує, що в даному місці керуючої стрічки при виводі на екран повинно бути вставлене ціле число, якому відповідає значення змінної з другого аргументу. Комбінація символів \n повідомляє функції printf() про перехід на новий рядок.
9. Закриваюча фігурна дужка означає кінець функції main().
Увага! В процесі виконання програми буде видане попередження, оскільки змінна month була оголошена, але не використана в програмі. Це попередження не перешкоджає правильному виконанню програми.
#include<stdio.h>
/* Приклад 2 */
void main(void)
{
int radius;
float length, square;
printf("Введіть радіус кола");
scanf("%d", &radius);
length=2*3.14*radius;
square=3.14*radius*radius;
printf("Довжина кола-%f, площа кола-%f", length, square);
}
Пояснення:
Функція scanf() забезпечує введення значень змінних з клавіатури, & необхідний для правильної роботи програми, його використання буде пояснене при описі вказівників; %f – специфікатор формату, який відповідає за чисельні значення змінних з плаваючою крапкою.
#include<stdio.h>
/* Приклад 3 */
void main(void)
{
int i;
printf("Введіть ціле число");
scanf("%d", &i);
if(i<0) printf("Число від'ємне");
if(i>0) printf("Число додатнє");
if(i==0) printf("Число рівне 0");
for(i=0;i<=10;i++)
printf("%i \n", i)
}
Пояснення:
if – оператор умови
загальний вигляд: if(умова) оператор;
Умова – це логічний вираз, який приймає значення або "правда" або "неправда" (true i false). Якщо умова виконується – "правда", то виконується наступний оператор, якщо умова не виконується – "неправда", то наступний оператор не виконується, а програма переходить далі.
for – оператор циклу
загальний вигляд: for(ініціалізація;умова;приріст) оператор;
Ініціалізація – встановлення початкового значення параметра циклу; умова – вираз, значення якого перевіряється кожний раз при виконанні циклу, цикл виконується до того часу, поки умова – ""правда"; приріст – вираз, який змінює параметр циклу; і++ ідентичне і=і+1.
#include<stdio.h>
#include<math.h>
/* Приклад 4 */
void length(int r);
float square(int r);
void main(void)
{
int radius;
float sq;
printf("Введіть радіус кола");
scanf("%d", &radius);
length(radius);
sq=square(radius);
printf("Площа кола-%f", sq);
}
void length(int r) // Опис функції length
{
float l;
l=2*3.14*r;
printf("\n Довжина кола-%f", l);
}
void square(int r) // Опис функції square
{
float s;
s=3.14*pow(r,2);
return s;
}
Пояснення:
Програма складається з трьох функцій – main(), length() i square(), дві останні функції залежать від одного параметру цілого типу, а функція square() ще і повертає результат виконання в функцію main().
Бібліотека math.h підключається для використання функції pow(), яка дозволяє підносити до степеня: ab = pow(a,b).
#include<stdio.h>
#include<conio.h>
/* Приклад 5 */
void print_str(int m);
char ch; // глобальна змінна
void main(void)
{
int n; // локальна змінна
printf("Введіть символ");
ch=getch();
printf("Введіть кількість символів в стрічці");
scanf("%d",&n);
print_str(n);
}
print_str(int m); // формальний параметр
{
int j; // локальна змінна
for(j=0;j<m;j++) printf("%c", ch); // використання змінної
}
Пояснення:
Бібліотека conio.h підключається для використання функції getch(), яка сприймає натиснуту клавішу на клавіатурі і присвоює змінній, в нашому випадку сh, чисельне значення цієї клавіші згідно таблиці ASCII.