
- •Конспект студента. Коротка хронологія найважливіших етапів розвитку мови :
- •Алфавіт мови.
- •Ідентифікатори
- •Ключові слова
- •Управляючі послідовності
- •Концепція типу даних
- •Основні типи даних
- •Діапазони значень простих типів даних для ibm pc
- •Типи з плаваючою крапкою (float, double і long double)
- •Символьний тип (char)
- •Розширений символьний тип (wchar_t)
- •Логічний тип (bool)
- •Змінні. Клас пам'яті.
- •Перетворення типів.
- •Структура програми
- •Проста програма
- •Змінні і вирази
- •Область дії ідентифікатора
- •Вирази.
- •Порядок обчислення виразів
- •Бітові операції.
- •Введення і виведення даних.
- •Стежте за помилками переповнювання
- •Стежте за помилками неспівпадання типів
- •Читання символьних даних
- •Читання слів з клавіатури
- •Форматування введення-виведення засобами мови с Функція printf()
- •Функція scanf()
- •If (вираз) оператор 1; [else оператор 2;]
Функція scanf()
Функція scanf() використовується для обробки інформації, введеної користувачем з клавіатури. Вона може перетворювати введену інформацію не тільки в символи, але і в числа, у тому числі і в числа з плаваючою крапкою.
Прототип функції scanf() на подив схожий на прототип попередньої функції, а саме printf(). Виглядає він таким чином:
int scanf(const char *control-str[, argument1 [, argument2 [, ... ]]]);
Повертає ця функція число елементів, які вона успішно прочитала. Якщо вона не прочитала ніяких елементів, функція повертає значення 0. Функція scanf() поверне значення EOF, якщо виявить символ кінця рядка або символ кінця файлу, а також у разі помилки.
Перший параметр функції - control-str - як і в попередній функції це управляючий рядок, супроводжується списком параметрів argument.
Після управляючого рядка йдуть параметри argument, кожний з яких є адресою змінної, в яку буде записано введене і лічене значення. Отже, якщо ми використовуємо функцію для читання рядка в символьний масив, як аргумент ми передаємо назву символьного масиву, в решті випадків, тобто для читання інших типів - ми передаємо назву змінної із знаком амперсанта (&).
Управляючий рядок указує, в які формати повинен бути перетворений текст, що вводиться. У ній також використовуються специфікатори перетворення, їх прототип схожий на прототип специфікатора функції printf, але все таки відрізняється. От як виглядає прототип специфікатора перетворення функції scanf():
% [*] [width] [{h | l | L}] type
Розглянемо типи (type) специфікаторів перетворення для даної функції. Вони ідентичні специфікаторам функції printf.
Специфікатор перетворення |
Значення |
|
|||||
%c |
Інтерпретує введення як символ |
||||||
%d, %i |
Інтерпретує введення як десяткове ціле число із знаком |
||||||
%e, %f, %g %E, %G |
Інтерпретує введення як число з плаваючою крапкою (float) |
||||||
%o |
Інтерпретує введення як вісімкове ціле число із знаком |
||||||
%p |
Інтерпретує введення як покажчик (адреса) |
||||||
%s |
Інтерпретує введення як рядок; прочитує введене значення з першого символу, що не є службовим, і включає всі символи до наступного службового символу. |
||||||
%u |
Інтерпретує введення як десяткове ціле число без знаку |
||||||
%x, %X |
Інтерпретує введення як шістнадцяткове ціле число із знаком |
Для того, щоб відокремити значення, що вводяться, функція scanf() використовує символи, звані службовими. До них відносяться символи переносу рядка, табуляції і пропуски. Що це означає: під час введення інформації користувач повинен після кожного введеного значення вводити службовий символ для того, щоб показати функції, що він закінчив введення чергового значення. Єдине виключення - специфікатор %c, який читає кожен наступний символ, навіть якщо цей символ є службовим. Приведемо приклад:
char name[15];
int age;
float salary;
printf("Input your name, age and your salary\n");
scanf("%s %d %f", name &age, &salary);
printf("Name is %s\n Age is %d\n Salary is %6.2f\n", name, age, salary);
коли на екрані з'являється рядок
Input your name, age and your salary
ми вводимо
Bill
35 521.55
після цього на екрані повинен з'явитися рядок
Name is Bill
Age is 35
Salary is 521.55
Модифікатор * примушує функцію scanf() ігнорувати відповідне введення. Тобто, якщо в специфікаторі перетворення стоїть зірочка, то функція введене значення не записує в змінну. Приклад:
int num;
printf("Input 3 numbers:\n");
scanf("%*d %d %*d", &num);
printf("Second number is %d\n",num);
коли на екрані з'явиться рядок
Input 3 numbers:
ми вводимо
44 55 66
внаслідок чого на екрані повинен з'явитися рядок
Second number is 55
Другий необов'язковий модифікатор специфікатора - width - максимальна ширина поля. Введення зупиняється, коли досягнута максимальна ширина поля або при виявленні службового символу. Після досягнення максимальної ширини поля функція вважає, що почалося введення наступного значення.
Використання необов'язкових префіксів h | l | L розглянуте в таблиці:
Використання префікса |
з типом специфікатора |
визначає тип |
|
|
l |
d, i, про, x або X |
long |
||
l |
u |
unsigned long |
||
l |
e, f, g, E або G |
double |
||
h |
d, i, про, x, або X |
short int |
||
h |
u |
unsigned short int |
||
L |
e, f, g, E або G |
long double |
Як Ви вже відмітили, в контрольному рядку функції scanf() між специфікаторами перетворення в прикладах використовувалися пропуски. Пропуск в контрольному рядку означає, що потрібно пропускати будь-який службовий символ перед наступним одержуваним елементом. Оскільки практично всі специфікатори, за виключенням %с, автоматично пропускають службові символи, то :
int n;
float m;
рядок коду
scanf("%d%f" &n, &m);
ідентичний
scanf(" %d %f", &n &m);
Якщо ж використовується специфікатор перетворення %с, то без пропуску перед цим специфікатором функція рахує будь-який перший символ, у тому числі і службовий. Але якщо ж перед специфікатором %с коштує пропуск, то функція рахує перший неслужбовий символ.
У контрольному рядку можна також використовувати звичайні символи, відмінні від пропуску. Наприклад
scanf("%d + %f", &n, &m);
В даному прикладі функція чекатиме від користувача, що він введе між двома значеннями знак +. Якщо ж не ввести з клавіатури символ +, то в подальші елементи не будуть занесені значення.
Оператори розгалуження. Оператор безумовного переходу goto.
Умовний оператор IF.