Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Константы с плавающей точкой
Константы с плавающей точкой могут иметь тип float, double или long double. Как и в предыдущем случае, компилятор должен предупреждать о константах с плавающей точкой, которые слишком велики, чтобы их можно было представить. Компилятор использует три формы внутреннего представления данных с плавающей точкой (табл.3). Если вы хотите иметь константу с плавающей точкой типа float, вы можете определить ее как: const float pi8 = 3.14159265; Признаком константы с плавающей точкой для компилятора является наличие в записи константы десятичной точки, символа е или Е. Например, 21е-5; -44.; 67.28Е4;.09е+18;.0; 0.; 0.0. По умолчанию (при отсутствии суффиксов переопределения) константы с плавающей точкой имеют тип double. При наличии суффикса f (F) константа имеет тип float, l (L) – long double.
Символьные константы
Хотя в С++ и нет отдельного символьного типа данных, в нем для символов имеется специальная и удобная запись. Символьная константа - это символ, заключенный в одинарные кавычки; например, 'a' или '0'. Такие символьные константы в действительности являются символическими константами для целого значения символов в наборе символов машины. Употребление символьных констант вместо десятичной записи делает программу более переносимой. Несколько символов также имеют стандартные имена, в которых обратная косая \ используется как escape - символ. Некоторые из них: '\b' возврат назад '\f' перевод формата '\n'' новая строка '\r' возврат каретки ‘\t’ табуляция Для явного указания кода символа используется выражение ‘\nnn’, где nnn - восьмеричный код или ‘\0xhh’, где hh – шестнадцатеричный код.
Строки
Строковая константа - это последовательность символов, заключенная в двойные кавычки: "это строка" Каждая строковая константа содержит на один символ больше, чем кажется; все они заканчиваются пустым символом '\0' со значением 0. Например: sizeof ("wer") = = 5; Строка имеет тип "вектор из соответствующего числа символов", поэтому "wer" имеет тип char[5]. Пустая строка записывается " " (и имеет тип char[1]). В строке может стоять обратная косая, сразу после которой идет новая строка; и то, и другое будет проигнорировано: cout << "здесь все \ ok" напечатает: здесь все ok Новая строка, перед которой идет символ \ не приводит к появлению в строке новой строки, это просто договоренность записи.
В строке можно иметь пустой символ, но большинство программ не будет предполагать, что есть символы после него. Вставляя численную константу в строку с помощью восьмеричной или шестнадцатеричной записи благоразумно использовать число из трех цифр.
Const
Ключевое слово const может добавляться к описанию объекта, чтобы сделать этот объект константой, а не переменной: const int model = 232; const int w[] = {1,2,3,4}; Поскольку константе ничего нельзя присвоить, она должна быть инициализирована. Описание чего-нибудь как const гарантирует, что его значение не изменится в области видимости: model = 145; / / ошибка model++; / / ошибка Const изменяет тип, т.е. ограничивает способ использования объекта, вместо того, чтобы задавать способ размещения константы.
2.5.6. Стандартные преобразования типов.
При вычислении выражений некоторые операции требуют, чтобы операнды имели соответствующий тип, а если требования к типу не выполнены, принудительно вызывают выполнение нужных преобразований. Та же ситуация возникает при инициализации, когда тип инициализирующего выражения приводится к типу определяемого объекта. Напомним, что в языках Си и Си++ присваивание является бинарной операцией, поэтому сказанное относительно преобразования типов относится и ко всем формам присваивания. Правила преобразования в языке Си++ для основных типов полностью совпадают с правилами преобразований, стандартизованными в языке Си: операнды разных типов приводятся к "старшему", т.е. более длинному типу; ниже перечислены типы, начиная от самого старшего, в порядке убывания старшинства: самый старший - long double, double, float, unsigned long, long int, unsigned, int, char - самый младший; при выполнении операции присваивания результат приводится к типу переменной слева от знака операции; в этом случае может возникнуть ситуация преобразования "старшего" типа к "младшему". При преобразовании типов нужно различать преобразования, изменяющие внутреннее представление данных, и преобразования, изменяющие только интерпретацию внутреннего представления. Например, когда данные типа unsigned unt переводятся в тип int, менять их внутреннее представление не требуется - изменяется только интерпретация. При преобразовании типа float в тип int недостаточно изменить только интерпретацию, необходимо изменить длину участка памяти для внутреннего представления и кодировку. При таком преобразовании из float в int возможен выход за диапазон допустимых значений типа int, и реакция на эту ситуацию существенно от конкретной реализации. Именно поэтому для сохранения мобильности программ в них рекомендуется с осторожностью применять преобразование типов.
Рассмотрим этапы (последовательность выполнения) преобразования операндов в арифметических выражениях. Все короткие целые типы преобразуются в типы неменьшей длины в соответствии с табл. 1. Затем оба значения, участвующие в операции, принимают тип float или int либо double в соответствии со следующими правилами. Если один из операндов имеет тип long double, то второй тоже будет преобразован в long double. Если п.2 не выполняется и один из операндов есть double, другой приводится к типу double. Если п.2 - 3 не выполняются и один из операндов имеет тип float, то второй приводится к типу float. Если п.2 - 4 не выполняются (оба операнда целые) и один операнд long int, а другой unsigned int, то, если long int может представить все значения unsigned int, последний преобразуется к long int; иначе оба операнда преобразуются к unsigned long int. Если п.2 - 5 не выполняются и один операнд есть long, другой преобразуется к long. Если п.2 - 6 не выполнены и один операнд unsigned, то другой преобразуется к unsigned. Если п.2 - 7 не выполнены, то оба операнда принадлежат типу int.
Таблица 4 Правила стандартных арифметических преобразований
Пример: char ff = '\xff ', gg = '\x7f '; int i, j; i = ff; //0xffff для signed char (размножение знака); //0x00ff для unsigned char (размножение нуля) j = gg; //0x007f для signed char (размножение знака); //0x007f для unsigned char (размножение нуля) Используя арифметические выражения, следует учитывать приведенные правила и не попадать в "ловушки" преобразования типов, так как некоторые из них приводят к потерям информации, а другие изменяют интерпретацию битового представления данных.
ЭЛЕМЕНТАРНЫЙ ВВОД-ВЫВОД Форматированный ввод-вывод
Особенностью С++ является отсутствие специальных операторов ввода-вывода. Вместо этого используются библиотечные функции. Далее предельно кратко рассматриваются некоторые функции Borland С++ для ввода информации с клавиатуры и ее вывода на экран. Подробно ввод-вывод информации, в том числе и работа с дисками, рассматривается во второй книге комплекса. Консольный ввод-вывод может быть двух видов: форматированный и неформатированный. Форматированный ввод-вывод даст возможность обрабатывать за одно обращение к библиотечной функции несколько элементов, выполняя, если необходимо, преобразование данных. Две функции-компаньона – scanf() и printf() выполняют соответственно консольный ввод и вывод. Этим функциям передастся переменное число аргументов, но первым аргументом всегда является текстовая (так называемая форматная) строка. Она задает способ преобразования данных. Функция printf() выдаст на экран всю форматную строку, в которой знак %ххх заменяется символами выводимой информации. Символы после % до первого разделителя рассматриваются как спецификация преобразования значения выводимой переменной. Имя переменной - это второй, третий и т.д. аргументы списка аргументов. Правила использования функции printf() представлены на рис. 3.
Функция scanf() принимает с консоли все символы до нажатия клавиши ENTER и помещает их в буфер. Затем по форматной строке определяется способ преобразования введенных символов в соответствии с заданными спецификациями. Полученное в результате преобразования число помещается по адресу переменной, который является вторым, третьим и т.д. аргументом в списке аргументов функции. Спецификация преобразования задается в виде последовательности
% [флаги ] [ширина ] [.точность J [F S N i h! 1 ]<тип>
В табл. 5 перечисляются некоторые из знаков, задающих спецификацию преобразования.
Рис. 3. Правила использования функции printf().
Таблица 5. Символы управления форматированием
Приведем пример выполнения ввода-вывода информации:
// Prim3_1.cpp #include <stdio.h> void main(void) { char ch; int i, j; float х, x2; char name[81]; printf("\nВведите Ваше имя: "); scanf("%s", name): printf("Здравствуйте, %s. Вас приветствует звонком компьютер\а\n", name); printf("Введите любое целое число: "); fflush(stdin); scanf("%d", &i); j = i + 4; printf("%d+ 4 = %d, верно?\n", i, j); printf("Введите число с плавающей точкой: "); scanf("%f", &х); x2 = х • х; printf("% f в квадрате = %f, верно?", x, x2); printf("Введите любой символ:"); fflush(stdin); scanf("%c", &ch); printf("ASCII-код символа %c = %d (%#x)\n", ch, ch, ch); } Далее приводятся результаты работы программы g:\l3_1 - запуск программы на выполнение; Введите ваше имя: Александр Касаткин Здравствуйте, Александр. Вас приветствует звонком компьютер Введите любое целое число: 36 36 + 4 = 40, верно? Введите число с плавающей точкой: 5.е1 50.000000 в квадрате = 2500.000000, верно? Введите любой, символ: 1 ASCII-код символа 1 - 49 (0х31)
Программа последовательно выдает приглашения. После набора запрашиваемой информации следует нажать клавишу ENTER. После ее нажатия функция scanf() прекращает прием символов во внутренний буфер и переходит к обработке ввода в соответствии с форматной строкой. Обратите внимание, что на приглашение ввести имя в буфер функции было помещено два слова - имя и фамилия. При выводе же строки name функцией printf() на экране появляется только первое слово - имя. Дело в том, что по спецификации %s функция scanf() передает в программу все символы до первого разделителя, в том числе и пробела. Оставшиеся в буфере символы будут поступать в программу при следующих обращениях к функции scanf(), что не входит в наши планы. Вот почему перед очередным обращением к функции scanf() выполняется очистка буфера stdin функцией fflushf(). После вывода на экран второй строки звенит звонок, так как на консоль выдается символ `\а`. Функции неформатированного консольного ввода-вывода работают с отдельными символами или строками символов. Для ввода символа используется функция getchar(), не имеющая аргументов и возвращающая целое число. Для вывода символа используется функция putchar(int). Ввод-вывод строк символов выполняют соответственно функции gets(char *string) и puts(char *string), где string задает адрес области памяти, в которую помещаются символы вводимой строки и откуда они выводятся на экран. Функции gets(string) и puts(string) пo выполняемым действиям подобны scanf("%s",string) и printf("%s\n",string) соответственно. Однако функция gets() передает в программу все символы до '\n'. Поэтому, заменив в предыдущей программе строку ввода имени scanf("%s", name); на строку gets(name); удалось бы ввести как имя, так и отчество.
Функция ввода cin
Компиляторы языка С++ поддерживают функции gets(), getchar() и scanf(), о которых мы говорили в этой главе. Кроме того, С++ имеет собственное многоцелевое средство ввода для всех типов данных. Стандартный поток ввода cin в сочетании с двумя символами «больше» (>>), которые называются оператором извлечения, служит для считывания данных с клавиатуры. Программа int count; cin» count; вносит целочисленные данные с клавиатуры в значение переменной count. Стандартный поток ввода cin не требует указания адреса переменной для числовых и символьных данных, указывается только имя переменной. При использовании cin нет необходимости определять формат с помощью указателей формата. Поток ввода cin имеет возможность определять тип данных самостоятельно на основании вводимой информации. Это свойство называется перегрузкой. Из-за этой особенности оператора cin большинство программистов предпочитают использовать именно его, а не функцию scanf(). При работе с несколькими аргументами необходимо отделять каждое имя переменной оператором извлечения: cin» amount» count» age» name; Возможно, первое время вы будете испытывать затруднения в использовании операторов извлечения» и вставки «. На рис. 4 показан простой способ запоминания этих операторов, изображенных в виде стрелок, которые указывают направление вперед или назад относительно переменной из списка данных. Оператор извлечения» изображен в виде стрелки, направленной в сторону переменной. Это означает, что данные поступают к ней в виде ввода.
Рис. 4. Оператор вставки и оператор извлечения
Когда вы применяете cin для ввода данных, пользуйтесь оператором, который как бы указывает направление к переменной. Оператор вставки «изображен в виде стрелки, направленной от переменной. Это значит, что данные выводятся из переменной на экран. Со стандартным потоком вывода cout используйте, соответственно, тот оператор, который как бы указывает направление от переменной.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-05; просмотров: 415; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.207.129 (0.047 с.) |