Лекція 6. Представлення даних. Приведення типів. Масиви

1. Типи даних

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

До простих типів даних мови відносять:

  • char - символьний
  • int - ціле число
  • float - з плаваючою точкою
  • double - подвійної точності
  • bool - логічний тип

Для формування інших типів даних використовують прості типи і так звані специфікатори. Типи даних створені на базі простих типів з використанням специфікаторів називають складеними типами даних. В С визначено чотири специфікатора типів даних:

  • short - короткий
  • long - довгий
  • signed - знаковий
  • unsigned - беззнаковий

Дані типу char в пам'яті комп'ютера завжди займають один байт. Це пов'язано з тим, що зазвичай під величину символьного типу відводять стільки пам'яті, скільки необхідно для зберігання будь-якого з 256 символів клавіатури. Сімвольний тип може бути зі знаком або без знаку. В величинах зі знаком signed char можна зберігає значення в діапазоні від -128 до 127. Відповідно значення змінних типу unsigned char можуть перебувати в діапазоні від 0 до 255.

При роботі з символьними даними потрібно пам'ятати, що якщо у виразі зустрічається одиночний символ, він повинен бути заключений в одинарні лапки. Послідовність символів, тобто строка, при використанні у виразах заключається в подвійні лапки.

Змінна типу int в пам'яті комп'ютера може займати або два, або чотири байти. Це залежить від розрядності процесора. За замовчуванням всі цілі типи вважаються знаковими, тобто специфікатор signed можна не вказувати. Специфікатор unsigned дозволяє представляти тільки додатні числа.

  • int: -32767 ... 32767
  • unsigned int: 0 ... 65535
  • long int: -2147483647 ... 2147483647

Внутрішнє подання дійсного числа в пам'яті комп'ютера відрізняється від подання цілого числа. Число з плаваючою точкою представлено в експоненціальній формі mE ± p, де m - мантиса (ціле або дробове число з десятковою точкою), p - степінь (ціле число).

3.2E-6 = 3.210-6 =0.0000032

Діапазони значень дійсного типу:

  • float: -3.4E+38 ...3.4E+38
  • double: -1.7E+308 ... 1.7E+308
  • long double: 3.4E+4932 ... 3.4E+4932

Змінна типу bool може приймати тільки два значення true (істина) або false (неправда). Будь-яке значення не рівне нулю інтерпретується як true, а при перетворенні до цілого типу приймає значення рівне 1. Значення false представлено в пам'яті як 0.

Тип void. Множина значень цього типу порожня. Він використовується для визначення функцій, які не повертають значення, для вказівки порожнього списку аргументів функції, як базовий тип для вказівника і в операції приведення типів.

 

2. Ввід та вивід даних

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

Функція

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

 виконує форматоване виведення змінних, зазначених у списку, відповідно до строки форматів.

Функція

scanf (строка форматів, список адрес змінних)

 виконує введення змінних, адреси яких вказані у списку, відповідно до строкових форматів.

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

% прапорець ширина . точність модифікатор тип

 Параметри прапорець, ширина, точність і модифікатор в специфікаціях можуть бути відсутні.

Першою строкою програми, в якій будуть застосовуватися функції введення-виведення мови С, повинна бути директива #include <stdio.h>. Заголовковий файл stdio.h містить опис функцій вводу-виводу.

Розглянемо роботу функцій на прикладі:

printf ("Vvedit a, b, c \n"); //Виведення на екран строки символів

scanf ("% f% f% f", &a, &b, &c); //Введення значень змінних

printf ("S = %5.2f \t p = %5.2f \n", S, 2*r); / / Виведення на екран результатів.

 

3. Масиви

У пам’яті ми можемо зберігати змінні послідовно, одна за одною. І в мові програмування С список збережених змінних, які розташовуються у суміжних комірках пам'яті, називається масивом.

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

За допомогою масивів ми можемо зібрати результати в циклі, а потім одержати до них доступ, також в циклі.

#include <cs50.h>

#include <stdio.h>


void chart(int score); 


int main(void)

{

    int scores[3];

    for (int i = 0; i < 3; i++)

    {

        scores[i] = get_int("Score %i: ", i + 1);

    }

    for (int i = 0; i < 3; i++)

    {

        printf("Score %i: ", i + 1);

        chart(scores[i]);

    }

}

 

void chart(int score)

{

    for (int i = 0; i < score; i++)

    {

        printf("#");

    }

    printf("\n");

}

Зверніть увагу, що ми застосовуємо int scores[3] для ініціалізації масиву з трьома цілими числами. Потім ми використовуємо scores[i] = ..., щоб зберегти значення в цьому масиві, використовуючи для цього індекс i від 0 до 2 (оскільки в нас три елементи).

Після цього ми використовуємо scores[i] для доступу до усіх значень в масиві за кожним індексом.

 

4. Рядки

Рядки – це насправді просто масиви символів. Це можна побачити у string0.c:

#include <cs50.h>

#include <stdio.h>

#include <string.h>

 

int main(void)

{

    string s = get_string("Input:  ");

    printf("Output: ");

    for (int i = 0; i < strlen(s); i++)

    {

        printf("%c\n", s[i]);

    }

}

Спочатку нам знадобиться нова бібліотека, string.h, для strlen, що показує нам довжину рядка. Далі ми використовуємо той же синтаксис для доступу до елементів масиву, s[i], аби вести окремі символи рядка s.

Коли рядок зберігається у пам’яті, кожен символ розміщується в одному байті в таблиці байтів. Десь, наприклад, слово Zamyla збережено у 6 байтах. Але нам потрібен ще один байт, для позначення кінця рядка.


Остання зміна: Thursday 28 May 2020 02:53 AM