- •Конспект студента. Коротка хронологія найважливіших етапів розвитку мови :
- •Алфавіт мови.
- •Ідентифікатори
- •Ключові слова
- •Управляючі послідовності
- •Концепція типу даних
- •Основні типи даних
- •Діапазони значень простих типів даних для ibm pc
- •Символьний тип (char)
- •Розширений символьний тип (wchar_t)
- •Логічний тип (bool)
- •Змінні. Клас пам'яті.
- •Типи з плаваючою крапкою (float, double і long double)
- •Перетворення типів.
- •Структура програми
- •Проста програма
- •Змінні і вирази
- •Область дії ідентифікатора
- •Вирази.
- •Порядок обчислення виразів
- •Бітові операції.
- •Введення і виведення даних.
- •Стежте за помилками переповнювання
- •Стежте за помилками неспівпадання типів
- •Читання символьних даних
- •Читання слів з клавіатури
- •Форматування введення-виведення засобами мови с Функція printf()
- •Функція scanf()
- •If (вираз) оператор 1; [else оператор 2;]
Форматування введення-виведення засобами мови с Функція printf()
int printf(const char *control-str[, argument1 [, argument2 [, ... ]]]);
Ця функція повертає при вдалому збігу обставин кількість виведених символів, інакше поверне код помилки.
Параметр control-str (управляючий рядок) - це рядок в подвійних лапках. Даний параметр може бути єдиним у функції. Наприклад: рядок коду
printf("Нello, everybody! \n It's me again.");
виведе на екран
Hello, everybody!
It's me again.
Параметри argument1, argument2 і т.д. - це ті елементи, які необхідно вивести на екран. Вони можуть бути змінними або константами або навіть виразами, значення яких обчислюється при виведенні на друк.
Якщо у функції є хоч один параметр argument, управляючий рядок повинен містити специфікатор перетворення для нього. Для кожного параметра argument необхідний специфікатор перетворення. Самі специфікатори перераховані в таблиці.
Специфікатор перетворення |
Результат |
|
|||||||||||
%c |
одиночний символ |
||||||||||||
%d |
десяткове ціле число |
||||||||||||
%e |
число з плаваючою крапкою, експоненціальне представлення (e-представлення) |
||||||||||||
%E |
число з плаваючою крапкою, експоненціальне представлення (E- представлення) |
||||||||||||
%f |
число з плаваючою крапкою, десяткове представлення |
||||||||||||
%g |
використовує %f або %e, залежно від значення. %e використовується, якщо показник експоненти менше ніж -4 або більше або рівний заданій точності |
||||||||||||
%G |
використовує %f або %E, залежно від значення. %E використовується, якщо показник експоненти менше ніж -4 або більше або рівний заданій точності |
||||||||||||
%i |
десяткове ціле число із знаком |
||||||||||||
%o |
вісімкове ціле число без знаків |
||||||||||||
%p |
покажчик |
||||||||||||
%s |
рядок символів |
||||||||||||
%u |
десяткове ціле число без знаку |
||||||||||||
%x |
шістнадцяткове ціле число без знаку, використання шістнадцяткових цифр від 0 до f |
||||||||||||
%X |
шістнадцяткове ціле число без знаку, використання шістнадцяткових цифр від 0 до F |
||||||||||||
%% |
друк знаку відсотка |
||||||||||||
Елементи, які необхідно вивести на екран, потрібно розташувати у функції в такому порядку, в якому в управляючому рядку розташовані для них специфікатори перетворення. Це пов'язано з роботою функції printf(). Функція виводить без змін всі символи управляючого рядка, за винятком специфікаторів перетворення. Коли функція знаходить в управляючому рядку перший специфікатор перетворення, вона підставляє значення другого параметра (argument1) на місце специфікатора, заздалегідь перетворивши це значення відповідно до даного специфікатора. Далі, знайшовши наступний специфікатор, функція підставляє на його місце третій параметр і так далі. Розглянемо приклади:
int numPages = 273;
printf("The book has %d pages.", numPages);
виведе на екран
The book has 273 pages.
float nQuantity = 100;
printf("They have eaten only %f%% from %d kilograms of food\n", nQuantity/3, 25);
виведе на екран
They have eaten only 33.333333% from 25 kilograms of food.
У останньому прикладі цифри, виведені на екран, виглядають не дуже красиво. Для того, щоб виправити положення, що склалося, за допомогою функції printf(), необхідно розглянути як виглядає повністю прототип специфікатора перетворення. Насправді специфікатор перетворення -це не тільки знак відсотка з певною буквою. Специфікатор має декілька необов'язкових параметрів і виглядає він таким чином:
%[flags] [width] [.precision] [{h | l | L}]type
У даному прототипі type - це якраз ті букви, які ми розглянули раніше. До цього моменту ми використовували, так скажемо, спрощені специфікатори перетворення, тобто в нашому випадку прототип виглядав би так: %type
Що теж є правильним, правда, не завжди зручним. Щоб зрозуміти, навіщо потрібні специфікатору перетворення необов'язкові параметри, розглянемо їх по порядку. І почнемо наш розгляд з першого необов'язкового параметра - flags. Всі існуючі прапори приведені в таблиці. Відразу необхідно відзначити, що в специфікаторі можуть застосовуватися відразу декілька прапорів.
Прапор |
Значення |
|
||
- |
елемент із значенням вирівнювання по лівому краю; тобто вміст буде надрукований, починаючи з лівого краю |
|||
+ |
значення із знаком "плюс", якщо вони додатні, і із знаком "мінус", якщо вони від’ємні |
|||
Пропуск |
значення із знаком "плюс" друкуються з пропуском (але без знаку), якщо вони додатні, і із знаком "мінус", якщо вони від’ємні. Прапор "+" відміняє появу пропуску на початку |
|||
# |
використовує альтернативну форму для специфікації перетворення. Виводить на початку 0 для форми %о і 0x або 0X для форм %x і %X. Для всіх форм з плаваючою крапкою # гаран |
|||
0 |
для числових форм заповнює поле по ширині нулями замість пропусків. Цей прапор ігнорується, якщо є прапор "-" або якщо вказана точність для цілочисельної форми |
|||
Розглянемо декілька прикладів з використанням прапорів:
int books = 10;
printf("In my library %+d books\n", books);
виведе на екран
In my library +10 books
int count = 923;
printf( "Decimal %d as:\n\tHex: %X hex: %x Octal: %o\n",
count, count, count, count );
printf( "Decimal % d as:\n\tHex: %#X hex: %#x Octal: %#o\n",
count, count, count, count );
виведе на екран
Decimal 923 as:
Hex: 39B hex: 39b Octal: 1633
Decimal 923 as:
Hex: 0X39B hex: 0x39b Octal: 01633
width - мінімальна ширина поля. Ширше поле використовуватиметься, якщо число, що виводиться, або рядок не відповідатиме полю.
Приклад:
int num = 345;
printf("'%d'\n", num);
printf("'%2d'\n", num);
printf("'%8d'\n", num);
printf("'%-8d'\n", num);
виведе на екран
'345'
'345'
' 345'
'345 '
.precision - точність. Для перетворень %e, %E і %f задається кількість цифр, які будуть виведені праворуч від десяткового числа. Для перетворень %g і %G задається максимальне число значущих цифр. Для перетворення %s задається максимальне число символів, яке буде надруковано. Для перетворень цілого числа задається мінімальне число цифр, які повинні з'явитися; якщо ціле число містить менше цифр, чим задано, то в початок числа додаються нулі. При використанні крапки (.) розуміється наступний далі нуль, так що %.f - той же специфікатор, що і %.0f.
Приведемо приклад:
float nQuantity = 100;
printf("They have eaten only %.1f%% from %d kilograms of food\n"
nQuantity/3, 25);
printf("They have eaten only %03.f%% from %.4d kilograms of food\n"
nQuantity/3, 25);
виведе на екран
They have eaten only 33.3% from 25 kilograms of food
They have eaten only 033% from 0025 kilograms of food
Якщо замість числа в модифікаторі width поставити зірочку (*), то для даного специфікатора не буде задана фіксована ширина поля, а ширину регулюватиме змінна (ціле число). Те ж саме стосується точності - якщо замість числа в модифікаторі precision поставити *, то за кількість знаків після коми відповідатиме змінна. Приклад:
float num = 12.5;
int width = 7; //відповідає за ширину поля
int precision = 3;// відповідає за точність
printf("%0*.*f", width, precision, num);
виведе на екран
012.500
h | l | L необов’язкові префікси, що приставляються до типу специфікатора модифікації. Вони уточнюють розмір параметра argument, що відноситься до даного специфікатора. h використовується при цілочисельному перетворенні для кодування значень short int або unsigned short int. l використовується при цілочисельному перетворенні для кодування значень long int або unsigned long int. L використовується для перетворень з плаваючою крапкою для кодування значень long double.
