Лекція № 2
Тема: Ввід, вивід на консоль. Модифікатори.
План заняття:
Функція фор матованого виводу
Функція фор матованого вводу
Початкова програма
Функція форматованого виводу
Достатньо часто для виводу інформації з ЕОМ в програмах використовується функція printf(). Вона переводить дані з внутрішнього коду в символьне уявлення і виводить отримані зображення символів результатів на екран дисплея. При цьому у програміста є можливість форматувати дані, тобто впливати на їх уявлення на екрані дисплея.
Можливість форматування умовно відзначена в самому імені функції за допомогою літери f в кінці її назви {print formatted). Оператор виклику функції printf( ) можна представити так:
printf (рядок формату, список аргументів);
Рядок формату обмежений подвійними лапками і може включати довільний текст, управляючі символи і специфікації перетворення даних. Список аргументів (з попередньою комою) може бути відсутній. Наприклад:
#include <stdio.h>
void main( )
{
printf ("\n Привіт світ!\n");
}
Директива #include <stdio.h> включає в текст програми опис (прототип) бібліотечної функції printf(). (Якщо видалити з тексту програми цю препроцесорну директиву, то з'являться повідомлення про помилки і виконуваний код програмы не буде створений.
Серед параметрів функції printf() є в даному прикладі тільки рядок формату (список аргументів відсутній). В рядку формату два управляючих символа '\n' - "перевід рядка".
Управляючі символи (переклад рядка, табуляція і т.д.) дозволяють впливати на розміщення інформації, що виводиться, на екрані дисплея.
Специфікатори функції
Специфікації перетворення даних призначені для управління формою зовнішнього представлення значень аргументів функції printf(). Узагальнений формат специфікації перетворення має вигляд:
%прапорці ширина_поля.точність модифікатор специфікатор.
Серед елементів специфікації перетворення обов'язкові є тільки два - символ '% ' і специфікатор. В задачах обчислювального характеру використовуються специфікатори:
d - для цілих десяткових чисел (тип int);
і - для цілих десяткових чисел без знака (тип unsigned);
f - для дійсних чисел у формі з фіксованою крапкою (типи float і double);
е - для дійсних чисел у формі з плаваючою крапкою (з мантисою і порядком) - для типів double і float.
В список аргументів функції printf() включають об'єкти, значення яких повинні бути виведені з програми. Це вирази і їх окремі випадки - змінні і константи. Кількість аргументів і їх типи повинні відповідати послідовності специфікацій перетворення в рядку формату. Наприклад, якщо дійсна змінна summa має значення 2102.3, то при такому виклику функції
printf("\n summa=%f", summa);
на екран з нового рядка буде виведений: summa=2102.3
Після виконання операторів
float с, е;
int k;
с=48.3; к=-83; е=16.33;
printf ("\nc=%f\tk=%d\te=%e", з, до, е);
на екрані вийде такий рядок:
с=48.299999 к=-83 е=1.б3300е+01
Для виведення числових значень в специфікації перетворення корисні "ширина_поля" і "точність".
Ширина_поля - ціле позитивне число, яке визначає довжину (в позиціях на екрані) представлення значення яке виводиться.
Точність - ціле позитивне число, яке визначає кількість цифр в дробовій частині зовнішнього представлення дійсного числа (з фіксованою крапкою) або його мантиси (при використанні форми з плаваючою крапкою).
Приклад з тими ж змінними:
printf ("\nc=%5.2\tk=%5d\te=%8.2f\te=%11.4e", с, k,e,е);
Результат на екрані:
с=48.30 к= -83 e= 6.33 е= 1.6330e+01
Модифікатори функції
Як модифікатори в специфікації перетворення використовуються символи:
h - для виведення значень типу short int;
1 - для виведення значень типу long;
L - для виведення значень типу long double.
При необхідності вивести на екран (на друк) парні лапки або апострофи їх представляють за допомогою відповідних послідовностей: \" або \', тобто замінюють парами літер. Зворотня коса межа '\' для однократного виводу на екран повинна бути двічі включена в рядок формату. При необхідності вивести символ % його в рядок формату включають двічі: % %.
Функція форматованого вводу
Для введення даних з клавіатури ЕОМ в програмі використовують функцію (описана в заголовочному файлі stdio.h): scanf (рядок формату, список_аргументів);
Функція scanf() виконує "читання" кодів, які вводяться з клавіатури. Це можуть бути як коди видимих символів, так і управляючі коди, що поступають від допоміжних клавіш і від їх поєднань. Функція scanf( ) сприймає коди, перетворюя їх у внутрішній формат і передає програмі. При цьому програміст може впливати на правила інтерпретації вхідних кодів за допомогою специфікацій рядка формату. (Можливість форматування умовно відзначена в назві функції за допомогою літери f в кінці імені.) рядок формату, і список аргументів для функції scanf( ) обов'язкові. Рядок формату для функції scanf() формуватимемо із специфікацій перетворення вигляду:
% * ширина_поля модифікатор специфікатор
Специфікатори
Серед елементів специфікації перетворення обов'язкові тільки % і специфікатор. Для введення числових даних використовують специфікатори:
d - для цілих десяткових чисел (тип int);
і - для цілих десяткових чисел без знака (тип unsigned int);
f- для дійсних чисел (тип float);
е - для дійсних чисел (тип float).
Ширина_поля - ціле позитивне число, яке дозволяє визначити, яка кількість байтів (символів) з вхідного потоку відповідає значенню, яке вводиться.
Зірочка '*' в специфікації перетворення дозволяє пропустити у вхідному потоці байти відповідного значення, які вводяться.
Модифікатори
Як модифікатори використовуються символи:
h - для введення значень типу short int (hd);
1 - для введення значень типу long int (ld) або double (lf, le);
L - для введення значень типу long double (Lf, Le).
На відміну від функції printf() аргументами для функції scanf( ) можуть бути тільки адреси об'єктів програми, в частному випадку - адреси її змінних. В мові Сі є спеціальна унарна операція & отримання адреси об'єкту:
& ім'я_об'єкту
Вираз для отримання адреси змінної буде таким:
& ім'я_змінної
Отже, для позначення адреси перед ім'ям змінної записують символ &. Якщо name - ім'я змінної, то &name — її адреса. Наприклад, для введення з клавіатури значень змінних n, z, х можна записати оператор:
scanf ("%d%f%f",&n,&z,&x);
В даному прикладі специфікації перетворення у форматному рядку не містять відомостей про розміри полів і точність значень, що вводяться. Це дозволено і дуже зручно при введенні даних, діапазон значень яких визначений не строго. Якщо змінна n описана як ціла, z і х - як дійсні типу float, то після читання з клавіатури послідовності символов 18 18 -0.431 змінна n отримає значення 18, z-значение 18.0, х - значення -0.431.
При читанні вхідних даних функція scanf() (в якій специфікації не містять відомостей про довжини вводимих значень) сприймає як роздільники полів даних "узагальнені пробільні символи" - власне пропуски, символи табуляції, символи нових рядків. Зображення цих символів на екрані відсутні, але у них є коди, які "вміє" розпізнавати функція scanf( ). При наборі вхідної інформації на клавіатурі функція scanf() починає введення даних після натиснкання клавіші <Enter> (перехід на новий рядок). До цього набираючі на клавіатурі символи поміщаються в спеціально виділену операційною системою область пам'яті—в буфер клавіатури і одночасно відображаються на екрані у вигляді рядка введення. До натискання клавіші <Enter> дозволено редагувати (виправляти) дані, підготовлені в рядку введення.
Початкова програма
Початкова програма є сукупністю наступних елементів: директив препроцесора, вказівок компілятору, оголошень і визначень. Директиви препроцесора специфікують дії препроцесора по перетворенню тексту програми перед компіляцією. Вказівки компілятору— це спеціальні інструкції, яким компілятор мови Сі слідує під час компіляції. Оголошення змінної задає ім'я і атрибути змінної. Визначення змінної, крім завдання її імені і атрибутів, приводить до виділення для неї пам'яті. Крім того, визначення задає початкове значення змінної (явно або неявно). Оголошення функції задає її ім'я, тип значення, яке повертається, і може задавати атрибути її формальних параметрів.
Визначення функції специфікує тіло функції, яке є складовий оператор (блок), який містить оголошення і оператори. Визначення функції також задає ім'я функції, тип значення, яке повертається, і атрибути її формальних параметрів. Оголошення типу дозволяє програмісту створити власний тип даних. Воно полягає в присвоєнні імені деякому базовому або складовому типу мови Сі. Для типу поняття оголошення і визначення співпадають.
Початкова програма може містити довільне число директив, вказівок компілятору, оголошень і визначень. Порядок появлення цих елементів в програмі дуже важливий; в якості, він впливає на можливість використання змінних, функцій і типів в різних частинах програми
Для того, щоб програма на мові Сі могла бути скомпільована і виконана, вона повинна містити по крайній мірі одне визначення—визначення функції. Ця функція визначає дії, які виконуються програмою. Якщо ж програма містить декілька функцій, то серед них виділяється одна головна функція, яка повинна мати ім'я main. З неї починається виконання програми; вона визначає дії, які виконуються програмою, і викликає інші функції. Порядок проходження визначень функцій в початковій програмі не є суттєвим. Якщо програма містить тільки одну функцію, то вона і є головною (і повинна мати ім'я main). В наступному прикладі приведена проста програма на мові Сі:
int х = 1; /* визначення змінних */
int у = 2;
extern int printf(char * ...); /* оголошення функції */
main() /* визначення головної функції */
{
int z; /* обьявления змінних */
int w;
z = у + х; /* виконувані оператори */
w = у-х;
printf('z = %d\nw = %d\n", z, w);
}
Ця початкова програма визначає функцію з ім'ям main і оголошує функцію printf. Змінні х і у визначаються на зовнішньому рівні, а змінні z і w оголошуються всередині функції.