Константы с плавающей точкой 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Константы с плавающей точкой



 

Константы с плавающей точкой могут иметь тип 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 int, unsigned int, long int, unsigned long Расширение нулем или знаком в зависимости от умолчания для char (см. пример 1)
unsigned char int Старший байт заполняется нулем
signed char int Расширение знаком
short int Сохраняется то же значение
unsigned short unsigned int Сохраняется то же значение
int unsigned int Сохраняется то же значение
int long, unsigned long Расширение знаком
unsigned int long unsigned Добавление двух нулевых старших байтов
long int unsigned long Сохраняется то же значение
enum int Сохраняется то же значение
битовое поле int Сохраняется то же значение

 

Пример:

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.

Символы управления форматированием

 

Элемент специфика-ции Производимый эффект
Флаги  
-   + Пробел   # Производится выравнивание влево выводимого числа в пределах выделенного поля. Правая сторона выделенного поля дополняется пробелами. По умолчанию устанавливается выравнивание вправо Выводится знак числа символом ‘-‘ или ‘+’ Выводится пробел перед числом, если оно положительно. Для отрицательных чисел знак ‘-‘ выводится всегда Выводится идентификатор системы счисления для целых: 0 перед числом, выводимым в восьмеричной с/с; 0х или 0Х для чисел, выводимых в шестнадцатеричной с/с; ничего для чисел, выводимых в десятичной с/с Выводится десятичная точка для чисел типа float
Ширина Воздействует только на вывод
n   0n   * Определяет минимальную ширину поля в n символов. Если после преобразования ширины недостаточно, выводится столько символов, сколько есть. Незаполненные позиции дополняются пробелами Все то же самое, но позиции слева для целого числа дополняются нулями Следующий аргумент из списка аргументов задает ширину
Точность Воздействует только на вывод
Ничего .0   .n * Точность по умолчанию Для d, i, o, u, x точность по умолчанию. Для e, E, f десятичная точка отсутствует Для e, E, f не более n знаков после точки Следующий аргумент из списка аргументов - точность
Модификатор Воздействует там, где применимо
h l   Для d, i, o, u, x, X аргумент является short int Для d, i, o, u, x, X аргумент является long int Для e, E, f, g, G аргумент является double (только для scanf)
Тип преобра-зования  
  c     d i o u x   X     f e E   g   G     s ТИП ПЕРЕМЕННОЙ: CHAR При вводе – из файла читается и передается переменной один байт. При выводе – переменная преобразуется к типу char. В файл передается один байт ТИП ПЕРЕМЕННОЙ: INT Десятичное int со знаком Десятичное int со знаком Восьмеричное int unsigned Десятичное int unsigned Шестнадцатеричное int unsigned; при выводе числа используются символы 0-f Шестнадцатеричное int unsigned; при выводе числа используются символы 0-F При вводе различия х и Х не оказывают никакого эффекта ТИП ПЕРЕМЕННОЙ: FLOAT Значение со знаком в форме [-]dddd.dddd Значение со знаком в форме [-]d.dddde[+|-]ddd Значение со знаком в форме [-]d.ddddE[+|-]ddd При вводе нет различия между е и Е Значение со знаком в формате ‘e’ или ‘f’ в зависимости от значения и специфицированной точности Значение со знаком в формате ‘E’ или ‘F’ в зависимости от значения и специфицированной точности При вводе нет различия между g и G ТИП ПЕРЕМЕННОЙ: CHAR* При вводе принимает символы без преобразования до тех пор, пока не встретится ‘\n’ или пока не достигнута специфицированная точность. В программу передаются символы до ‘\n’ или пробела. При выводе выдает в поток все символы до тех пор, пока не встретится ‘\0’ или пока не достигнута специфицированная точность

Приведем пример выполнения ввода-вывода информации:

// 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; просмотров: 414; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.150.55 (0.049 с.)