КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Форматування введення-виведення засобами мови СФункція 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 необхідний специфікатор перетворення. Самі специфікатори перераховані в таблиці.
Елементи, які необхідно вивести на екран, потрібно розташувати у функції в такому порядку, в якому в управляючому рядку розташовані для них специфікатори перетворення. Це пов'язано з роботою функції printf(). Функція виводить без змін всі символи управляючого рядка, за винятком специфікаторів перетворення. Коли функція знаходить в управляючому рядку перший специфікатор перетворення, вона підставляє значення другого параметра (argument1) на місце специфікатора, заздалегідь перетворивши це значення відповідно до даного специфікатора. Далі, знайшовши наступний специфікатор, функція підставляє на його місце третій параметр і так далі. Розглянемо приклади: intnumPages = 273; printf("The book has %d pages.", numPages);виведе на екран The book has 273 pages. floatnQuantity = 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. Всі існуючі прапори приведені в таблиці. Відразу необхідно відзначити, що в специфікаторі можуть застосовуватися відразу декілька прапорів.
Розглянемо декілька прикладів з використанням прапорів: intbooks = 10; printf("In my library %+d books\n", books);виведе на екран In my library +10 books intcount = 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: 01633width - мінімальна ширина поля. Ширше поле використовуватиметься, якщо число, що виводиться, або рядок не відповідатиме полю. Приклад: intnum = 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. Приведемо приклад: floatnQuantity = 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 поставити *, то за кількість знаків після коми відповідатиме змінна. Приклад: floatnum = 12.5; intwidth = 7; //відповідає за ширину поля int precision = 3;// відповідає за точність printf("%0*.*f", width, precision, num);виведе на екран 012.500h | l | Lнеобов’язкові префікси, що приставляються до типу специфікатора модифікації. Вони уточнюють розмір параметра argument, що відноситься до даного специфікатора. hвикористовується при цілочисельному перетворенні для кодування значень short int або unsigned short int. lвикористовується при цілочисельному перетворенні для кодування значень long int або unsigned long int. Lвикористовується для перетворень з плаваючою крапкою для кодування значень long double. Функція 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.
Для того, щоб відокремити значення, що вводяться, функція scanf() використовує символи, звані службовими. До них відносяться символи переносу рядка, табуляції і пропуски. Що це означає: під час введення інформації користувач повинен після кожного введеного значення вводити службовий символ для того, щоб показати функції, що він закінчив введення чергового значення. Єдине виключення - специфікатор %c, який читає кожен наступний символ, навіть якщо цей символ є службовим. Приведемо приклад: charname[15]; intage; floatsalary; 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() ігнорувати відповідне введення. Тобто, якщо в специфікаторі перетворення стоїть зірочка, то функція введене значення не записує в змінну. Приклад: intnum; 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 розглянуте в таблиці:
Як Ви вже відмітили, в контрольному рядку функції scanf() між специфікаторами перетворення в прикладах використовувалися пропуски. Пропуск в контрольному рядку означає, що потрібно пропускати будь-який службовий символ перед наступним одержуваним елементом. Оскільки практично всі специфікатори, за виключенням %с, автоматично пропускають службові символи, то : intn; floatm;рядок коду scanf("%d%f" &n, &m);ідентичний scanf(" %d %f", &n &m);Якщо ж використовується специфікатор перетворення %с, то без пропуску перед цим специфікатором функція рахує будь-який перший символ, у тому числі і службовий. Але якщо ж перед специфікатором %с коштує пропуск, то функція рахує перший неслужбовий символ. У контрольному рядку можна також використовувати звичайні символи, відмінні від пропуску. Наприклад scanf("%d + %f", &n, &m);В даному прикладі функція чекатиме від користувача, що він введе між двома значеннями знак +. Якщо ж не ввести з клавіатури символ +, то в подальші елементи не будуть занесені значення.
|