HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Главная » Статьи » c++ |
Начнем наше изучение функций printf() и scanf() с того, что определим для чего они нам нужны. Функции printf() и scanf() используются для ввода и вывода информации. Точнее, функция printf() заведует выводом, а функция scanf() - вводом. Эти две функции очень похожи между собой, поэтому рассмотрим сначала функцию printf(), а после перейдем к изучению scanf(). Кстати, чтобы работать с этими функциями без проблем, не забывайте подключать в своих приложениях библиотеку stdio.h Функция printf()Как уже упоминалась ранее, функция printf() является функцией вывода. Рассмотрим прототип данной функции: int printf(const char *control-str[, argument1 [, argument2 [, ... ]]]); Начнем с того, что же эта функция возвращает. А возвращает она при удачном стечении обстоятельств количество выведенных символов, в противном случае вернет код ошибки. Параметр control-str (управляющая строка) - это строка в двойных кавычках. Данный параметр может быть единственным в функции. Например: строка кода printf("Нello, everybody! \nIt's me again."); выведет на экран Hello, everybody! It's me again. Параметры argument1, argument2 и т.д. - это те элементы, которые необходимо вывести на экран. Они могут быть переменными или константами либо даже выражениями, значение которых вычисляется при выводе на печать. Если в функции есть хотя-бы один параметр argument, управляющая строка должна содержать спецификатор преобразования для него. Для каждого параметра argument необходим спецификатор преобразования. Сами спецификаторы перечислены в таблице.
Элементы, которые необходимо вывести на экран, нужно расположить в функции в таком порядке, в каком в управляющей строке расположены для них спецификаторы преобразования. Это связано с работой функции 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. Все существующие флаги приведены в таблице. Сразу необходимо отметить, что в спецификаторе могут применяться сразу несколько флагов.
Рассмотрим несколько примеров с использованием флагов: 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. Итак, мы рассмотрели как работает функция printf() и переходим к изучению второй не менее полезной функции. Функция 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, который читает каждый следующий символ, даже если этот символ является служебным. Приведем пример: 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 рассмотрено в таблице:
Как Вы уже заметили, в контрольной строке функции scanf() между спецификаторами преобразования в примерах использовались пробелы. Пробел в контрольной строке означает, что нужно пропускать любой служебный символ перед следующим получаемым элементом. Так как практически все спецификаторы, за исключением %с, автоматически пропускают служебные символы, то : int n; float m; строка кода scanf("%d%f", &n, &m); идентична scanf(" %d %f", &n, &m); Если же используется спецификатор преобразования %с, то без пробела перед этим спецификатором функция считает любой первый символ, в том числе и служебный. Но если же перед спецификатором %с стоит пробел, то функция считает первый неслужебный символ. В контрольной строке можно также использовать обычные символы, отличные от пробела. Например, scanf("%d + %f", &n, &m); В этом примере функция будет ожидать от пользователя, что он введет между двумя значениями знак +. Если же не ввести с клавиатуры символ +, то в последующие элементы не будут занесены значения. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Просмотров: 4200 | Рейтинг: 5.0/1 |
Всего комментариев: 0 | |