ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 21.12.2021
Просмотров: 977
Скачиваний: 3
Регістрова (register) змінна відрізняється від автоматичної лише пам'яттю, що виділяється для її збереження. Регістрова змінна зберігається в регістрі процесора, і, відповідно, доступ до цієї змінної набагато швидший, ніж до змінної, яка зберігається в оперативній пам'яті (auto). У випадку відсутності вільних регістрів регістрова змінна стає автоматичною.
Зовнішня (extern) змінна є глобальною змінною. Специфікатор extern інформує компілятор, що змінна буде оголошена (без extern) в іншому файлі, де їй і буде виділена пам'ять.
Статичній (static) змінній (константі) виділяється пам'ять після її оголошення і зберігається до кінця виконання програми. Статичні змінні при оголошенні ініціалізуються нульовими (логічні, цілі і дійсні) порожніми значеннями.
5.3 Цілі типи даних
Тип даних int призначений для відображення цілих чисел. Розмір пам’яті який виділяється для змінної типу int визначений як правило розміром машинного слова, для більшості сучасних ПК це 32 біта (4 байта). Приклади літералів цілих чисел – 1, 2, 10, 101. При використанні 4-х байт для зберігання цілих чисел діапазон їх представлення – від мінус 2147483648 до плюс 2147483647. Таким чином тип int може представляти 4294967294 цілих чисел, тобто 232.
Якщо є потреба оголосити змінну цілого типу потрібно використати ключове слово int.
Приклад 3 . Оголошення однієї змінної типу int.
int numberOfStudent;
Приклад 4 . Оголошення декількох змінних типу int.
int numberOfStudent, i, j;
Приклад 5 . Оголошення та ініціалізація змінних типу int.
int numberOfStudent = 25, i = 0, j = 2;
Тип даних char призначений для зберігання одного ASCII символа. Розмір памяті який виділяється для змінної типу char визначений розміром таблиці ASCII символів і складає 1 байт. Приклади літералів символів – ‘a’, ‘d’, ‘4’, ‘R’, а також спеціальні символи такі як ‘\0’, ‘\n’. Під час компіляції літерали символів переводяться у відповідне, згідно таблиці ASCII, ціле значення. Наприклад, ‘A’ буде переведено у ціле число 65.
Коли потрібно ініціалізувати змінну типу char, це можна зробити двума способами, рекомендується застосовувати перший спосіб, другий вважається поганою програмістською практикою.
Приклад 6. Перший спосіб.
char letter1 = ‘a’;
Приклад 7. Другий спосіб.
char letter2 = 97; /* в таблиці ANSII 97 відповідає символу ‘a’*/
Ще один вид літералів що мають бути згадані у звязку з char це стрічкові літерали (string literals). Стрічка це набір символів, і для її представлення використовуються подвійні кавички (“ ”), на відміну від символів які представляються у одинарних кавичках (‘ ’). Прикладом стрічкового літералу є “Hello World \n”, в прикладі першої програми на С.
Типи даних short int та long int на відміну від базового типу int дозволяють використовувати відповідно менше чи більше пам’яті для представлення даних. Так якщо для представлення цілого числа достатній діапазон значень від мінус 32768 до плюс 32767, то доцільно використати тип short int. Відповідно тип long int використовується у випадку, коли потрібний більший діапазон значень для представлення числа у порівнянні з типом int.
Ключове слово int не обов’язкове при оголошенні змінних типів short int чи long int.
Як правило змінні типу short int займають в пам’яті 2 байти, int – 4 байти, long int – 4 чи 8 байт.
Для базових типів даних один біт використовується для представлення знаку числа. Якщо відомо, що змінна ніколи не буде приймати негативних значень, для її оголошення можна використати ключове слово unsigned, яке визначає тип, у якому біт, що у базових типах використовується для знаку буде використаний для збереження даних, збільшивши таким чином удвіччі діпазон значень для представлення числа.
При оголошенні змінних типу unsigned int, unsigned short int та unsigned long int ключове слово int не є обовязковим.
На відміну від unsigned ключове слово signed вказує, що тип даних знаковий, але використання signed не є обов’язковим, так як усі базові типи даних по замовченню знакові.
Тип даних unsigned char використовується для представлення символів російського алфавіту, тому що коди російських букв перевищують величину 127.
5.4 Дійсні типи даних
Тип даних float, скорочення від «floating point», призначений для відображення дійсних чисел. Розмір пам’яті який виділяється для змінної типу float визначений розміром машинного слова. Як правило це 4 байти, з яких 1 біт відводиться для знака, 8 біт для надлишкової експоненти і 23 біта для мантиси, діапазон значень змінної типу float приблизно дорівнює від 3.14E-38 до 3.14E+38.
Тип float використовується у випадках коли не потрібно подвійної точності. Літерали типу float мають використовувати суфікси, в інакшому випадку вони будуть інтерпретуватися як тип double. Приклади літералів типу float: 3.1415926f, 4.0f, 6.022e+23f.
Змінні типу float визначаються використовуючи ключове слово float.
Приклад 8. Оголошення змінних типу float.
float pi, chislo;
Приклад 9 . Оголошення та ініціалізація змінних типу float.
float pi = 3.1415926f, chislo = 4.0f;
Тип даних double схожий до типу float. Відміна полягає у тому що double дозволяє зберігати дійсні числа подвійної точності. Розмір типу, як правило, два машинних слова, тобто для більшості ПК, 8 байт.
Біти пам'яті розподіляються в такий спосіб: 1 біт для знака, 11 біт для експоненти і 52 біта для мантиси. З обліком опущеного старшого біта мантиси діапазон значень змінної типу double дорівнює від 1.7E-308 до 1.7E+308.
Приклади літералів типу double: 3.1415926535897932, 4.0, 6.022e+23. Використання 4 замість 4.0 буде інтерпретовано як int.
Змінні типу double визначаються використовуючи ключове слово double.
Приклад 10. Оголошення змінних типу double.
double pi, chislo;
Приклад 11. Оголошення та ініціалізація змінних типу double.
double pi = 3.1415926535897932, chislo = 4.0;
У деяких реалізаціях мови С існує тип long double, розмір якого, як правило, три машинних слова, тобто для більшості ПК, 12 байт.
Приклад 12.
unsigned int b;
int c; /*мається на увазі signed int c */
unsigned d; /*мається на увазі unsigned int d */
signed f; /*мається на увазі signed int f */
unsigned char symbol = ‘в’;
unsigned short total = 123; /* unsigned short int total */
unsigned long apples= 23444232; /*unsigned long int apples */
Загальна інформація про описані вище прості типи даних представлена в табл.. 5.1 (з врахуванням того що розмір машинного слова 4 байти).
Таблиця 5.1 – Прості типи даних
Типи даних |
Розмір пам’яті, байт |
Діапазон значень |
[signed] int |
4 |
від - 2147483648 до 2147483647 |
[signed] char |
1 |
від -128 до 127 |
float |
4 |
від 3.14E-38 до 3.14E+38 |
double |
8 |
від 1.7E-308 до 1.7E+308 |
[signed] long [int] |
4 |
від - 2147483648 до 2147483647 |
[signed] short [int] |
2 |
від - 32768 до 32767 |
long double |
12 |
від 3.4E-4932 до 3.4E+4932 |
unsigned int |
4 |
від 0 до 4294967295 |
unsigned short [int] |
2 |
від 0 до 65535 |
unsigned long [int] |
4 |
від 0 до 4294967295 |
unsigned char |
1 |
від 0 до 255 |
5. ОПЕРАТОРИ КЕРУВАННЯ
Оператори керування обчислювальним процесом використовуються для організації: розгалуження, циклічного повторення операторів програми, а також передачі керування в необхідне місце програми залежно від виконання певних умов.
5.1 Оператор розгалуження if
Приклад 1.Синтаксис оператора розгалуження if
if ( Вираз ) true-оператор;
де «Вираз» – це вираз довільного вигляду, що інтерпретується мовою C як логічне «так» (true), тобто будь-яке відмінне від нуля значення, або «ні» (false) у випадку якщо значення виразу дорівнює нулю.
Виконання оператора if починається з обчислення виразу, якщо значення виразу відмінне від нуля, то виконується true-оператор, а потім наступний за if оператор; якщо значення виразу дорівнює нулю, то true-оператор пропускається і керування передається наступному за if оператору. true-оператор може містити простий чи складений оператор.
Блок-схема оператора if зображена на рисунку 5.1.
Рисунок 5.1 – Блок-схема оператора розгалуження if
Приклад 2. Написати програму обчислення вартості розмови по телефону з врахуванням 20% знижки, яка надається по суботам та неділям.
#include <stdlib.h>
#include <stdio.h>
int main()
{
int time; /* тривалість розмови, хвилин */
int day; /* день тиждня */
float sum; /*вартість розмови*/
printf("Vveditj tryvalistj rozmovy:\n");
scanf("%i",&time);
printf("Vveditj denj tyznya (1-7):\n");
scanf("%i",&day);
sum = 2.4 * time;
if (day == 6 || day == 7)
{
printf("E znygka 20%\n"); /*Повідомлення про знижку*/
sum = sum * 0.8;
}
printf("Vartistj rozmovy: %3.2f\n", sum);
system("PAUSE");
return 0;
}
5.2 Оператор розгалуження if-else
Розглянутий вище оператор if можна розглядати як окремий випадок оператора if-else.
Приклад 3.Синтаксис оператора if-else .
if ( Вираз ) true-оператор;
else false-оператор;
Блок-схема оператора if-else зображена на рисунку 5.2.
Рисунок 5.2 – Блок-схема оператора розгалуження if-else
Виконання оператора if-else починається з обчислення виразу, якщо значення виразу відмінне від нуля, то виконується true-оператор, а потім наступний за if-else оператор; якщо значення виразу дорівнює нулю, то виконується false-оператор а потім наступний за if-else оператор. Як true-оператор так і false-оператор можуть бути простим чи складеним оператором.
Приклад 4 Обчислити площу кільця, радіуси отвору та кільця задати з клавіатури, у випадку якщо введений радіус отвору більший за радіус кільця видати повідомлення про помилку.
#include <stdlib.h>
#include <stdio.h>
int main()
{
float S; // S – площа кільця
float R,r; // R – радіус кільця, r - радіус отвору
printf("Vveditj R, r:\n");
scanf("%f %f",&R,&r); // Введення значень радіусів
if (r > R)
printf("Error!"); //Виведення повідомлення про помилку
else
{
S = 3.14*(R*R - r*r); // Обчислення площі кільця
printf("S = %f", S); // Виведення результату на екран
}
system("PAUSE");
return 0;
}
Оператори if та if-else можуть бути вкладеними. У цьому випадку true-блок чи false-блок можуть містити оператори if чи if-else.
Приклад 5. Програма рішення рівняння ax = b.
#include <stdlib.h>
#include <stdio.h>
int main()
{
float a,b,x;
printf("Vveditj a, b:\n");
scanf("%f %f",&a, &b);
if(a!=0)
printf("x = %f\n", b/a);
else
if(b==0)
printf("x - bydj-yake chislo\n");
else
printf("Rishenj nemae\n");
system("PAUSE");
return 0;
}
Для усунення неоднозначності компілятор С інтерпретує вкладені if таким чином, що гілка else належить до найближчого попереднього if.
5.3 Оператор множинного розгалуження switch
Приклад 6. Синтаксис оператора switch
switch ( Вираз )
{
case константний вираз 1: набір операторів 1; break;
case константний вираз 2: набір операторів 2; break;
…………………………………………………….
case константний вираз n: набір операторів n; break;
default : набір операторів по замовченню;
}
Блок-схема оператора switch зображена на рисунку 5.3.
Рисунок 5.3 – Блок-схема оператора множинного розгалуження switch
Вираз, що іде за ключовим словом switch у круглих дужках, може бути будь-яким виразом, припустимим в мові С, значення якого повинно бути цілим.
Значення цього виразу є ключовим для вибору з декількох варіантів. Тіло оператора switch складається з наборів операторів, кожен з яких позначений ключовим словом case з наступним константним виразом. Слід зазначити, що використання цілого константного виразу є істотним недоліком, який властивий оператору switch.
Так як константний вираз обчислюється під час трансляції, він не може містити змінні чи виклики функцій. Зазвичай у якості константного виразу використовують цілі або символьні константи.
Усі константні вирази в операторі switch повинні бути унікальні. Крім наборів операторів, позначених ключовим словом case, може бути, але не обов'язково, один набір позначений ключовим словом default.
Набір операторів може бути порожнім, або містити один або більше операторів. Причому в операторі switch не потрібно набір операторів об’єднувати за допомогою фігурних дужок, як у складеному операторі.
Схема виконання оператора switch наступна:
- обчислюється вираз в круглих дужках;
- обчислене значення виразу послідовно порівнюються з константними виразами, що ідуть за ключовими словами case;
- якщо один з константних виразів збігається зі значенням виразу, то управління передається набору операторів, що позначений відповідним ключовим словом case;
- якщо жоден з константних виразів не дорівнює виразу, то управління передається набору операторів, позначеному ключовим словом default, а у випадку його відсутності управління передається наступному після switch оператору.
Використання оператора break дозволяє в необхідний момент перервати послідовність виконуваних операторів у тілі оператора switch, шляхом передачі управління оператору, що іде за switch.
Варто знати, що за відсутності операторів break в тілі оператора switch і збігу значення виразу з яким-небудь константним виразом, виконується наскрізний прохід через усе тіло оператора, що залишилося у switch, включаючи й оператор гілки default.
Приклад 7. Написати програму яка виводить по введеному ключу (від 1 до 7) назву дня тижня. У випадку виходу за діапазон виводиться повідомлення про помилку.