КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Формат Тип выводимой информации
Применение функции scanf(). Использование функции printf() для преобразования данных. Модификаторы спецификации преобразования, используемые в функции printf(). Использование функции printf().
4. Символьные строки. Здесь мы продолжим работу с данными: покопаемся в вопросах, выходящих за пределы тех, которые были связаны с типами данных, и рассмотрим символьную строку. /* непринужденный разговор */ #define DENSITY 62.4 /* плотность тела человека в фунтах на кубический фут */ main() /* любопытствующая программа*/ { float weight, volume; int size, letters; char name[40]; /* или попробуйте "static char name [40];" */ printf(" Привет! Как вас зовут?\n"); scanf("%s", name); printf("%s, Каков ваш вес в фунтах?\n", name); scanf("%f", &weight); size = sizeof name; letters = strlen (name); volume = weight/DENSITY; printf(" Прекрасно, %s, ваш объем %2.2f кубических фута.\n", name, volume); printf("Кроме того, ваше имя состоит из %d букв,\n", letters); printf("и для его размещения в памяти у нас есть %d байт,\n", size); } Перечислим основные новые черты этой программы. 1. Мы использовали «массив» для хранения «символьной строки» — в данном случае для некоторого имени. 2. При вводе и выводе строки была использована «спецификация преобразования» %s. 3. Для определения символической константы DENSITY был использован препроцессор языка Си. 4. Для нахождения длины строки была использована функция strlen().
7.1. Символьные строки. «Символьная строка» — это последовательность, состоящая из одного или более символов. В качестве примера рассмотрим следующую строку: "Строки изливались прямо из сердца!"
Кавычки не являются частью строки. Они вводятся только для того, чтобы отметить ее начало и конец, т. е. играют ту же роль, что и апострофы в случае одиночного символа. В языке Си нет специального типа, который можно было бы использовать для описания строк. Вместо этого строки представляются в виде «массива» элементов типа char.
Необходимо отметить, что на рисунке последним элементом массива является символ \0. Это «нуль-символ», и в языке Си он используется для того, чтобы отмечать конец строки. Ну, а теперь спросим, что такое массив? Массив можно представить себе как совокупность нескольких ячеек памяти, объединенных в одну строку. Если вы предпочитаете более формальные и строгие определения, то массив — это упорядоченная последовательность элементов данных одного типа.
char name [40];
Квадратные скобки указывают, что переменная name — массив, 40 — число его элементов, a char задает тип каждого элемента. Попробуйте выполнить приведенную ниже программу, чтобы посмотреть, как просто все происходит на практике:
/* похвала 1*/ #define PRAISE " Вот эта да, какое великолепное имя!" main() { char name [50]; printf(" Как вас зовут?\n"); scanf(" %s", name); printf(" Привет, %s. %s\n", name, PRAISE); } Как видите, нам не пришлось самим помещать нуль-символ в конец массива. Эта задача была выполнена за нас функцией scanf() при чтении вводимой строки. PRAISE — «символическая строковая константа». Заметим (и это очень важно), что функция scanf() при вводе строки «Элмо Бланк» читает только имя Элмо. Дело в том, что, встретив какой-нибудь разделитель (пробел, символ табуляции или перевода строки), функция scanf() прекращает ввод символов, т. е. в данном случае она прекращает опрос переменной name в тот момент, когда доходит до пробела между «Элмо» и «Бланк». Вообще говоря, функция scanf() вводит только одиночные слова, а не целую фразу в качестве строки. Для чтения входной информации в языке Си имеются другие функции, например функция gets(), предназначенная для обработки строк общего вида. Необходимо заметить также, что строка "х" не то же самое, что символ 'х'. Первое различие: 'x' — объект одного из основных типов (char), в то время как "х" — объект производного типа (массива элементов типа char). Второе различие: "х" на самом деле состоит из двух символов — символа 'х' и нуль-символа.
7.2. Длина строки — функция strlen(). Раньше мы практически без объяснений использовали операцию sizeof, которая дает нам размер объектов в байтах. Функция strlen() позволяет определять длину строки числом символов. /* похвала 2*/ #define PRAISE " Вот это да, какое великолепное имя!" main() { char name [50]; printf(" Как вас зовут?\n"); scanf(" %s", name); printf(" Привет, %s. %s\n", name, PRAISE); printf(" Ваше имя состоит из %d букв и занимает %d ячеек памяти. \n", strlen (name), sizeof name); printf(" Хвалебная фраза состоит из %d букв", strlen (PRAISE)); printf(" и занимает %d ячеек памяти. \n", sizeof PRAISE); }
Заметим, что случайно мы воспользовались двумя методами для обработки длинных операторов printf(). В первом случае мы записали один оператор печати в двух строках программы (строкой программы считается строка до запятой).Мы сделали это, поскольку разрешается разбивать строку между аргументами, но не посередине строки. В другом случае использовались два оператора printf() для печати одной строки; мы указали символ «новая строка» (\ n) только во втором из них. Представленный ниже результат работы данной программы поможет понять подобную ситуацию:
Давайте посмотрим, в чем дело. Массив name занимает 50 ячеек памяти, и именно об этом сообщает операция sizeof. Но для хранения имени Перки требуются только первые пять ячеек, и как раз об этом нас информирует функция strlen(). В шестой ячейке массива name содержится нуль-символ, и его появление служит сигналом для функции strlen() прекратить подсчет символов. Еще одно замечание: мы использовали операцию sizeof со скобками, а здесь — без них. Решение, использовать ли скобки или нет, зависит от того, что вы хотите знать: объем памяти, отводимый под элементы конкретного типа, или объем памяти, занимаемый определенным объектом. В первом случае вы писали бы sizeof(char) или sizeof(float), а во втором — sizeof name или sizeof 6.28.
7.3. Функции printf() и scanf(). Функции printf() и scanf() дают нам возможность взаимодействовать с программой. Мы называем их функциями ввода-вывода. Это не единственные функции, которыми мы можем воспользоваться для ввода и вывода данных с помощью программ на языке Си, но они наиболее универсальны. Указанные функции не входят в описание языка Си. И действительно, при работе с языком Си реализация функций ввода-вывода возлагается на создателей компилятора; это дает возможность более эффективно организовать ввод-вывод на конкретных машинах.
%d Десятичное целое число %с Один символ %s Строка символов %е Число с плавающей точкой, экспоненциальная запись %f Число с плавающей точкой, десятичная запись %g Используется вместо записей %f или %е, если он короче %u Десятичное целое число без знака %o Восьмеричное целое число без знака %х Шестнадцатеричное целое число без знака
7.3.1. Использование функции printf(). Приведем программу, иллюстрирующую обсуждаемые вопросы.
/* печать чепухи*/ #define PI 3.14159 main() { int number = 5; float ouzo = 13.5; int cost = 31000; printf("%d женщин выпили %f стаканов ликера.\n", number, ouzo); printf("Значение числа pi равно %f.\n", PI); printf("Прощай! Твое искусство слишком дорого для меня. \n"); printf("%c%d\n", '$', cost); }
Формат, указываемый при обращении к функции printf(), выглядит следующим образом: рrintf(Управляющая строка, аргумент1, аргумент2,...,);
Аргумент1, Аргумент2 и т. д. — это печатаемые параметры, которые могут быть переменными, константами или даже выражениями, вычисляемыми вначале, перед выводом на печать. Управляющая строка — строка символов, показывающая, как должны быть напечатаны параметры. Например, в операторе printf("%d женщин выпили %f стаканов ликера\n", number, ouzo);
управляющей строкой служит фраза в кавычках (учитывая предыдущие замечания, это — строка символов), a number и ouzo — аргументы или в данном случае значения двух переменных.
7.3.2. Модификаторы спецификации преобразования, используемые в функции printf(). Мы можем несколько расширить основное определение спецификации преобразования, поместив модификаторы между знаком % и символом, определяющим тип преобразования. В приводимой ниже таблице дан список тех символов, которые вы имеете право туда поместить.
Примеры Посмотрим, как эти модификаторы работают. Начнем с того, что продемонстрируем влияние модификатора ширины поля на печать целого числа. Рассмотрим следующую программу:
main() { printf ("/%d/\n", 336); printf ("/%2d/\n", 336); printf ("/%10d/\n", 336); printf ("/%-10d/\n", 336); }
Эта программа печатает одно и то же значение четыре раза, но использует при этом четыре различные спецификации преобразования. Мы вводим также символы /, чтобы вы могли видеть, где начинается и кончается каждое поле. Результат выполнения программы выглядит следующим образом:
Первая спецификация преобразования %d не содержит модификаторов. Вторая спецификация преобразования — %2d. Она указывает, что ширина поля должна равняться 2, но, поскольку число состоит из трех цифр, поле автоматически расширяется до необходимого размера. Следующая спецификация %10d показывает, что ширина поля равна 10. И действительно, между символами / имеется семь пробелов и три цифры, причем число сдвинуто к правому краю поля. Последняя спецификация %— 10d также указывает ширину поля, равную 10, а знак — приводит к сдвигу всего числа к левому краю, как показано в приведенном выше примере.
7.3.3. Использование функции printf() для преобразования данных. Здесь мы снова займемся выводом на печать целых чисел. Поскольку мы уже осведомлены о полях, то не будем заботиться об использовании символа /, чтобы отмечать их начало и конец:
main() { printf(" %d\n", 336); printf(" %o\n", 336); printf(" %x\n", 336); printf(" %d\n", -336); printf(" %u\n", -336); }
В нашей системе результат будет выглядеть следующим образом:
Как вы, по-видимому, и ожидали, при использовании спецификации %d будет получено число 336 точно так же, как в примере, обсуждавшемся чуть выше. Но давайте посмотрим, что произойдет, когда вы «попросите» программу напечатать это десятичное целое число в восьмеричном коде. Она напечатает число 520, являющееся восьмеричным эквивалентом 336 (5*64+2*8 + 0*1 = 336). Аналогично при печати этого числа в шестнадцатеричном коде мы получим 150. Таким образом, мы можем использовать спецификации, применяемые для функции printf() с целью преобразования десятичных чисел в восьмеричные или шестнадцатеричные и наоборот. Или же если вы захотите напечатать данные в желаемом для вас виде, то необходимо указать спецификацию %d для получения десятичных чисел, %о — для восьмеричных, а %х— для шестнадцатеричных. При этом не имеет ни малейшего значения, в какой форме число первоначально появилось в программе.
7.3.4. Применение функции scanf(). Так же как для функции printf(), для функции scanf() указываются управляющая строка и следующий за ней список аргументов. Основное различие двух этих функций заключается в особенностях данного списка. Функция printf() использует имена переменных, константы и выражения, в то время как функция scanf() — только указатели на переменные. К счастью, при применении этой функции мы ничего не должны знать о таких указателях. Необходимо помнить только два правила: 1. Если вам нужно ввести некоторое значение и присвоить его переменной одного из основных типов, то перед именем переменной требуется писать символ &. 2. Если вы хотите ввести значение строковой переменной, использовать символ & не нужно.
Приведем правильную программу:
main() { int age; float assets; char pet [30]; printf(" Укажите ваш возраст, состояние и любимое животное.\n"); scanf(" %d %f", &age, &assets); scanf(" %s", pet); /* & отсутствует при указании массива символов */ printf(" %d $%.0f %s\n", age, assets, pet); }
Вот пример диалога: Функция scanf() использует некоторые специальные знаки (пробелы, символы табуляции и «новая строка») для разбиения входного потока символов на отдельные поля. Функция scanf() использует практически тот же набор символов спецификации преобразования, что и функция printf(). Основные отличия в случае функции scanf() следующие: 1. Отсутствует спецификация %g. 2. Спецификации %f и %е эквивалентны. Обе спецификации допускают наличие (или отсутствие) знака, строки цифр с десятичной точкой или без нее и поля показателя степени. 3. Для чтения целых чисел типа short применяется спецификация %h. Наличие пробелов между спецификациями преобразования гарантирует, что даже в том случае, если все поле будет заполнено, символы, соответствующие данному числу, не перейдут в следующее поле. Это вызвано тем обстоятельством, что обычные символы, имеющиеся в управляющей строке, включая пробелы, всегда печатаются. 9. Функции и переключение ввода-вывода. 9.1. Ввод и вывод одного символа: функции getchar() и putchar(). 9.2. Буферы. 9.3. Чтение данных.
Дата добавления: 2015-01-03; Просмотров: 682; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |