Типы с плавающей точкой (float, double и long double) 


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



ЗНАЕТЕ ЛИ ВЫ?

Типы с плавающей точкой (float, double и long double)



Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и long double.

Типы данных с плавающей точкой хранятся в памяти компьютера иначе, чем целочисленные.

Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка. В IBM PC-совместимых компьютерах величины

типа float занимают 4 байта, из которых один двоичный разряд отводится под

знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса — это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.

Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка — его диапазон. Как можно видеть из табл. 1.2, при одинаковом количестве байт, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления.

Спецификатор long перед именем типа double указывает, что под величину отводится 10 байт.

Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f (float) и L, 1 (long). Например, константа 2E+6L будет иметь тип long double, а константа 1.82f — тип float.

Для представления десятичных дробей с плавающей запятой используются данные типа float, а для представления десятичных дробей с большой точностью используетcя тип double.

Тип void

Кроме перечисленных, к основным типам языка относится тип void. Множество значений этого типа пусто. Он используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типа.

Переменная типа Void не имеет значения и служит для согласования синтаксиса. Например, если нет необходимости использовать возвращаемое значение функции, то перед именем функции ставится тип Void.

 

Для того чтобы переменная стала информационным объектом программы и могла бы участвовать в процессах выполнения операций над данными необходимо, чтобы она обладала именем, типом, а значит и размером выделяемой памяти, а также рядом специальных свойств.

Требуемые свойства переменной должен назначить программист до ее применения в каком-то выражении с помощью специальных операторов, записываемых по установленным синтаксическим правилам. Определение или объявление переменной в программе начинается с ключевого слова, определяющего ее тип, за которым следует имя переменной и инициализация(присвоение начального значения). Описание завершается точкой с запятой(;). Допускается описывать несколько однотипных переменных в одной конструкции, с обязательным разделением описаний запятой. Хотя начальная инициализация(присвоение начального значения) не является обязательной при определении переменной, все же это необходимо делать, так как переменная изначально может принять непредсказуемое значение, затрудняющее интерпретацию результатов работы программы.

Имя переменной(идентификатор) может быть представлено любой комбинацией букв длиной не более 256 символов, но оно не должно содержать пробелов. При этом необходимо учитывать регистр букв (Nik и nik – это разные имена). Имена переменных должны быть лаконичными и мнемоничными (раскрывающими смысловую нагрузку переменной в терминах решаемой задачи).


Примеры описания переменных:

 

 

Константы

Константы также как и переменные предназначены для хранения данных, однако в отличии от переменных константу нельзя изменить. Создаваемую константу необходимо сразу инициализировать. В языке С++ предусмотрено два вида констант: литеральные и типизованные.

Литеральная константа – это значение непосредственно вводимое в выражениях самой программы. Например, в выражении int myLusy=1936; слово myLusy является переменной типа int, а число 1936- литеральной константой. Литеральные константы делятся на: символьные, строковые, целые и вещественные.

Символьная константа - это отдельный символ, заключенный в апострофы: ‘z‘,’@’.

Строковые константы – это последовательность символов, заключенная в двойные кавычки: ”О, если б, как в свое окно, взглянуть в судьбу хоть раз!”.

Целые константы бывают десятичные, восьмеричные, шестнадцатеричные. Десятичные могут быть представлены последовательностью десятичных цифр, начинающуюся не с нуля, например: 9876; 495298. Восьмеричные константы –последовательность восьмеричных цифр от 0 до, начинающаяся с нуля, например: 034,076.

Шестнадцатеричные константы начинаются с символов 0х или 0Х с последующими шестнадцатеричными цифрами 0..9,A…F,например, 0xF4;0X5D. Буквенные символы могут быть представлены в любом регистре. Длинные целые константы, используемые в переменных типа long, определяются буквой l или L сразу после символов константы без пробела, например: 36L, 012L, 0x67L.

Вещественные константы – числа в форме с плавающей запятой могут быть записаны в формате с фиксированной точкой, например: 789.098, 54.08,.23, или в экспоненциальной форме, например: 1е9, 5е+3, 2.7е-5. В мантиссе может пропускаться целая или дробная часть.

Символьные константы в С++ занимают один байт памяти и могут принимать значения от 0 до 255. Однако существует ряд неотображаемых при печати символов, но выполняющих специальные действия и называемых escape-последовательностями.Escape-символы в программе отображаются в виде обратного слеша, за которым следует буква или символ.

 

Таблица 2.2 – Символы escape-последовательности

Символ Выполняемое действие
\\ Вывод на печать обратной черты
\’ Вывод апострофа
\” Вывод кавычки при печати
\? Символ вопросительного знака
\a Подача звукового сигнала
\b Возврат курсора на один символ назад
\f Перевод страницы
\n Перевод строки
\r Возврат курсора на начало текущей строки
\t Перевод курсора к следующей позиции табуляции
\v Вертикальная табуляция (вниз)

 

Типизированная константа – это константа, представленная именем как и переменная, но в отличии от переменной значение инициализированной константы изменить нельзя.

Для определения констант в С++ предусмотрены два способа описания: с использованием директивы препроцессора #define и описательного оператора const.

Выражение #define nomDoma 231 инициализирует константу nomDoma значением 231 без указания конкретного типа, т.е. директива просто выполняет текстовую подстановку. Однако, более общее описание этой константы можно выполнить с помощью оператора

Const unsigned short int nomDoma =231;

Теперь константа nomDoma имеет тип данных и может быть переопределена без корректировки операторов программы, использующих константу.

Преобразование типов

В С++ существует явное и неявное преобразование типов. В случае неявного преобразования типов допускается участие в выражениях переменных разных типов. Однако, при этом возможны ошибки, если в выражениях участвуют разные переменные базовых типов. Действительно, если результат занимает в памяти больше места, чем отведено под принимающую переменную, неизбежна потеря значащих разрядов.

Пример неявного преобразования в следующем фрагменте кода программы:

 

 

В случае явного преобразования переменных одного типа в другой необходимо перед именем переменной в скобках указывать присваиваемый ей новый тип. Например:

Результат работы обеих фрагментов программ выглядит так: у=19, т.е. произошло отсечение дробной части переменной у. Только в первом случае это произошло, как бы по умолчанию, и программист этот результат мог и не ожидать. Во втором же случае, программист осознанно хотел получить только целую часть дробного значения, а поэтому и переопределил тип переменной у, написав в коде (int)y.

Вопросы и упражнения для самопроверки

 

1.Современное понятие типа базируется на множестве ………, которые могут принимать переменные данного типа, и наборе …………, которые можно к ним применять.

2.Написать перечень ключевых слов, обозначающих базовые типы данных для ПК платформы Intel.

3.Константа - область памяти для хранения данных не ………… на протяжении выполнения всей программы.

4.По внешнему представлению следующих числовых последовательностей определите правильные десятичные константы:

E 256 45,909 -2468976524.

5. По внешнему представлению следующих числовых последовательностей определите правильные вещественные константы:

23.45 678,543 0.98.234 -.159 9 e 8 4 e +3 0.345 e -9 2.23 e -5000.

6.Какая из перечисленных ESC -последовательностей обеспечивает подачу звукового сигнала: \ t \ n \ f \ a \ b \ r.

7.Выделить описание арифметических переменных и определите сколько байтов памяти будет выделено для них в памяти:

float u,b,w;

double n;

char Letter;

void MyFunction();

bool Flag;

8.Инициализировать правильными начальными значениями следующие переменные в соответствии с их типом:

float u,b,w;

double n;

char Letter;

bool Flag;

long int m,f;

9.Переменная-объект программы, занимающий несколько ячеек памяти и предназначенный для хранения ……….

10.Зачем и как можно преобразовать(переопределить) тип переменной. Привести примеры явного и неявного преобразования типов переменных.

11. Какую точность представления десятичных дробей с плавающей запятой обеспечивают данные типа float и типа double.

 


Лекция 23 Операторы языка языка C++. Операторы выбора

Цели лекции:

1. Изучение основных операторов языка С++.

2. Изучение оператора выбора.

3. Изучение операторы множественного выбора.

 

Операторы управления работой программы называют управляющими конструкциями программы. К ним относят:

1) составные операторы;

2) операторы выбора;

3) операторы циклов;

4) операторы передачи управления.

Составные операторы

Ксоставным операторам относят:

1) собственно составные операторы;

2) блоки.

В обоих случаях это последовательность операторов, заключенная в фигурные скобки. Блок отличается от составного оператора наличием определений в теле блока.

Пример 1. Составной оператор

{

n++;

summa+=n;

}

Пример 2. Блок

{

int n=0;

n++;

summa+=n;

}

Отличием примера 2 от примера 1 является наличие определения переменной n.

Операторы выбора

Коператорам выбора относятся:

1) условный оператор;

2) переключатель.

Условный оператор

Условный оператор имеет полную и сокращенную форму. Сокращённая форма используется, если в задаче имеется более двух условий.

Сокращенная форма для условного оператора имеет вид:

if (выражение-условие) оператор;

В качестве выражения - условиямогут использоваться арифметическое выражение, отношение и логическое выражение. Если значениевыражения-условияотлично от нуля (т.е. истинно), то выполняется оператор, следующий за условным.

Полная форма используется, если в задаче необходимо выполнение задачи при наличие двух условий.

Полная форма для условного оператора имеет вид:

if (выражение-условие) оператор1;

else оператор2;

Если значение выражения-условияотлично от нуля, то выполняется оператор1, при нулевом значениивыражения-условиявыполняется оператор2.

Пример 3

1) if (a<0) b = 1;// 1

2) if (a<b && (a>d || a==0)) b++;

else {b* = a; a = 0;}// 2

if (a<b) {if (a<c) m = a; else m = c;}

else {if (b<c) m = b; else m = c;}// 3

В пункте 1) примера 3 отсутствует ветвь else. Подобная конструкция называется «пропуск оператора», поскольку присваивание либо выполняется, либо пропускается в зависимости от выполнения условия.

Если требуется проверить несколько условий, их объединяют знаками логических операций. Например, выражение в пункте 2) примера 24 будет истинно в том случае, если выполнится одновременно условиеa<b и одно из условий в скобках. Если опустить внутренние скобки, будет выполнено сначала логическое И, а потом – ИЛИ.

Оператор в пункте 3) примера 3 вычисляет наибольшее значение из трех переменных. Фигурные скобки в данном случае не обязательны.

Пример 4

if (d>=0)

{

x1=(-b-sqrt(d))/(2*a);x2=(-b+sqrt(d))/(2*a);

cout<< “\nx1=”<<x1<<“x2=”<<x2;

}

else cout<<“\nРешения нет”;

 

Переключатель

Переключатель определяет множественный выбор. Общая форма для записи переключателя имеет вид:

switch (выражение)

{

case константа1: оператор1; case константа2: оператор2;

...........

[default: операторы;]

}

При выполнении оператора switch, вычисляется выражение, записанное послеswitch, оно должно быть целочисленным. Полученное значение последовательно сравнивается с константами, которые записаны следом заcase. При первом же совпадении выполняются операторы помеченные данной меткой. Если выполненные операторы не содержат оператора перехода, то далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель. Если значение выражения, записанного после switch не совпало ни с одной константой, то выполняются операторы, которые следуют за меткой default. Метка default может отсутствовать.

Пример 5

#include <iostream.h> void main()

{

int i;

cout<<"\nEnter the number"; cin>>i;

switch(i)

{

case 1:cout<<"\n the number is one";

case 2:cout<<"\n 2*2="<<i*i;

case 3:cout<<"\n 3*3="<<i*i; break;

case 4:cout<<"\n"<<i<<" is very beautiful!"; default:cout<<"\nThe end of work";

}

}

Результаты работы программы, представленной в примере 25 следующие:

При вводе 1 будет выведено: The number is one

При вводе 2 будет выведено: 2*2=4

При вводе 3 будет выведено: 3*3=9

При вводе 4 будет выведено: 4 is very beautiful!

При вводе всех остальных чисел будет выведено: The end of work

Выход из переключателя обычно выполняется с помощью операторов break или return, о которых будет рассказано далее.

 


Контрольные вопросы:

1. Какие операторы выбора известны? Перечислить их и привести синтаксис их записи.

2. Для чего в условных операторах используют фигурные скобки?

3. Какие операции можно использовать в условии операторов с единственным и двойным выбором?

4. Какие логические операции можно использовать при написании сложных логических условий?

5. Написать синтаксис записи switch-структуры с множественным выбором.

6. Обязательно ли присутствие default в switch-структуре с множественным выбором?

7. Что произойдет, если в switch-структуре с множественным выбором будет отсутствовать команда break?

 

 


Лекция 24 Операторы языка языка C++. Операторы цикла

Цели лекции:

1. Изучение оператора цикла while.

2. Изучение оператора цикла for.

3. Изучение оператора цикла do while.

4. Рассмотрение программирования вложенных циклов.

 

Оператор цикла while

С помощью данного оператора реализуется цикл, который выполняется до тех пор, пока истинно условие цикла. Синтаксис данного оператора следующий:

while(<условие>) { <тело цикла> }

Пример реализации данного цикла, в котором выполняется суммирование элементов ряда S = 0+1+2+3... пока S

int N=20, i = 0;

long S = 0L;

while(S < N)

{

S=S+i; i++;

}

В данном примере реализуется цикл while с условием i < N. Так как начальное значение переменной i=0, а N=20, то условие истинно и выполняется тело цикла, в котором осуществляется суммирование переменной i и увеличение ее на 1. Очевидно, что на 20 итерации значение i=20, условие станет ложным и цикл будет завершен. Продемонстрируем гибкость языка С++, изменив данный пример следующим образом:

int N=20, i = 0;

long S = 0L;

while((S=S+i++) < N);

В данном случае при проверке условия сначала выполняются операторы, стоящие в скобках, где и осуществляется суммирование элементов ряда и только, затем, проверяется условие. Результат выполнения обоих вариантов программ одинаковый и S=21. Однако последняя конструкция бывает удобной при реализации опроса клавиатуры, например, с помощью функции scanf():

int num;

while(scanf(“%d”,&num) == 1)

{

printf(“Вы ввели значение %d\n”,num);

}

Данный цикл будет работать, пока пользователь вводит целочисленные значения и останавливается, если введена буква или вещественное число. Следует отметить, что цикл while можно принудительно завершить даже при истинном условии цикла. Это достигается путем использования оператора break. Перепишем предыдущий пример так, чтобы цикл завершался, если пользователь введет число 0.

int num;

while(scanf(“%d”,&mun) == 1)

{

if(num == 0) break;

printf(“Вы ввели значение %d\n”,num);

}

Цикл завершается сразу после использования оператора break, т.е. в приведенном примере, при вводе с клавиатуры нуля функция printf() выполняться не будет и программа перейдет на следующий оператор после while. Того же результата можно добиться, если использовать составное условие в цикле:

int num;

while(scanf(“%d”,&mun) == 1 && num!= 0)

{

printf(“Вы ввели значение %d\n”,num);

}

Таким образом, в качестве условия возможны такие же конструкции, что и в операторе if.

Оператор цикла for

Работа оператора цикла for подобна оператору while с той лишь разницей, что оператор for подразумевает изменение значения некоторой переменной и проверки ее на истинность. Работа данного оператора продолжается до тех пор, пока истинно условие цикла. Синтаксис оператора for следующий:

for(<инициализация счетчика>;<условие>;<изменение значения счетчика>) { <тело цикла> }

Пример вывода таблицы кодов ASCII символов.

char ch;

for(ch = ‘a’; ch <= ‘z’; ch++)

printf(“Значение ASCII для %c - %d.\n”,ch,ch);

В данном примере в качестве счетчика цикла выступает переменная ch, которая инициализируется символом ‘a’. Это означает, что в переменную ch заносится число 97 – код символа ‘a’. Именно так символы представляются в памяти компьютера. Код символа ‘z’ – 122, и все малые буквы латинского алфавита имеют коды в диапазоне [97; 122]. Поэтому, увеличивая значение ch на единицу, получаем код следующей буквы, которая выводится с помощью функции printf(). Учитывая все вышесказанное, этот же пример можно записать следующим образом:

for(char ch = 97; ch <= 122; ch++)

printf(“Значение ASCII для %c - %d.\n”,ch,ch);

Здесь следует отметить, что переменная ch объявлена внутри оператора for. Это особенность языка С++ - возможность объявлять переменные в любом месте программы.

Существует много особенностей реализации данного оператора, отметим основные из них, которые могут заметно повысить скорость написания программ. Следующим примером продемонстрируем особенности изменения значения счетчика цикла.

int line_cnt = 1;

double debet;

for(debet = 100.0;

debet < 150.0;

debet = debet*1.1, line_cnt++)

printf(“%d. Ваш долг теперь равен %.2f.\n”,line_cnt, debet);

Следующий фрагмент программы демонстрирует возможность программирования сложного условия внутри цикла.

int exit = 1;

for(int num = 0;num < 100 &&!exit; num += 1)

{ scanf(“%d”,&mov);

if(mov == 0) exit = 0;

printf(“Произведение num*mov = %d.\n”,num*mov); }

Оператор for с одним условием:

int i=0; for(;i < 100;) i++;

и без условия

int i=0; for(;;;) {i++; if(i > 100) break;}

В последнем примере оператор break служит для выхода из цикла for, т.к. он будет работать «вечно» не имея никаких условий.

 

Оператор цикла do while

Все представленные выше операторы циклов, так или иначе, проверяют условие перед выполнением цикла, благодаря чему существует вероятность, что операторы внутри цикла никогда не будут выполнены. Такие циклы называют циклы с предусловием. Однако бывают ситуации, когда целесообразно выполнять проверку условия после того, как будут выполнены операторы, стоящие внутри цикла. Это достигается путем использования операторов do while, которые реализуют цикл с постусловием. Следующий пример демонстрирует реализацию такого цикла.

const int secret_code = 13;

int code_ent;

do { printf(“Введите секретный код: ”);

 scanf(“%d”,&code_ent); }

while(code_ent!= secret_code);

Из приведенного примера видно, что цикл с постусловием работает до тех пор, пока истинно условие, т.е. в данном случае пока значение введенного кода будет отличаться от значения секретного кода. Также следует обратить внимание на то, что после ключевого слова while должна стоять точка с запятой. При реализации данного цикла можно использовать составные условия, подобно циклу while, а также принудительно выходить из цикла с помощью оператора break.

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 393; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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