Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги / 277.pdf
Скачиваний:
12
Добавлен:
07.06.2023
Размер:
1.06 Mб
Скачать

Рис. 14

Рассмотрим подробнее описания переменных и операторы, необходимые для написания линейной программы.

Описание переменных

В языке С++ обрабатываются переменные различных типов. Тип любого объекта определяет множество допустимых значений и множество допустимых операций над этими значениями.

ТИП ДАННЫХ -- форма представления данных, которая характеризуется способом организации данных в памяти, множеством допустимых значений и набором операций.

Иначе говоря, тип данных -это «идея» определенного вида переменных, заложенная в транслятор. Сама переменная - это не что иное как область памяти программы, в которой размещены данные в соответствующей форме представления, то есть определенного типа.

52

Поэтому любая переменная в языке имеет раз и навсегда заданный тип. Область памяти всегда ассоциируется в трансляторе с именем переменной.

ПЕРЕМЕННАЯ -- именованная область памяти программы, в которой размещены данные с определенной формой представления (типом).

Для того, чтобы воспользоваться переменной, необходимо произвести некоторые предварительные действия - выполнить ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ. Только при наличии такого определения транслятор будет знать ее имя, тип данных и, возможно, начальные значения. Любой идентификатор, используемый в исполняемых операторах, должен быть предварительно описан в любом месте программы, но обязательно до начала применения.

Рис. 15

В этом строгом требовании языка С++ проявляется тенденция развития языков программирования в сторону повышения надежности создаваемых программ. При описании переменные можно инициализировать. На рис.5 приведено «дерево» типов данных С++. В этой лекции мы рассмотрим целые и вещественные типы данных.

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

53

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

Таблица 2

Длина,

Название

Назначение типа

Диапазон

байт

типа

 

значений

1

unsigned

Небольшие целые

от 0 до 255

char

числа и коды

 

символов

 

 

 

 

1

char

Очень малые целые

от -128 до 127

числа и ASCII-коды

2

unsigned

Большие целые и

от 0 до 65535

int

счетчики циклов

 

 

2

int

Небольшие целые

от -32768 до

32767

 

 

 

2

short int

Небольшие целые

от -32768 до

32767

 

 

 

4

unsigned

Астрономические

от 0 до

long

расстояния

4294967295

 

4

long

Большие числа

от -2147483648

до 2147483647

 

 

 

Описание переменных целого типа может выглядеть так: int a, b=0;

long c; unsigned int d;

Переменная b инициализирована при описании. Основные операции над целыми числами:

"+» — сложение; «*» — умножение; « / « — деление; "-» — вычитание; «%» - получение остатка от целочисленного

деления.

Порядок выполнения операций такой же, как в математике.

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

5/2 =2 5%2 = 1 6/2 = 3 6%3= 0 5./2 = 2.5

54

Под данными вещественного типа понимаются числа, записанные с десятичной точкой. Значение числа вещественного типа представляется в ЭВМ лишь с некоторой конечной точностью, которая зависит от внутреннего формата вещественного числа. В табл. 3 приведены названия вещественных типов, их длина в байтах, а также диапазон возможных значений. Существует две формы представления вещественных чисел: с фиксированной и с плавающей точками. Примеры записи вещественных чисел с фиксированной точкой приведены в первом столбце, а с

плавающей — во втором:

 

 

 

1.36

 

1.36e0

 

 

 

0.0013

1.3e-3

 

 

 

123.123

1.23123e2

 

 

 

Переменные вещественного типа можно описать так:

float a, b;

 

 

 

 

 

double c, d;

 

 

 

 

 

long double l, m, n;

 

Таблица 3

 

 

 

 

 

 

Длина,

 

 

Диапазон

Количество

 

 

 

Название

абсолютных

 

 

байт

 

значащих цифр

 

 

 

 

 

величин

 

 

 

4

 

float

от 3.4e-38 до 3.4e

от 7 до 8

 

 

 

 

 

+38

 

 

 

8

 

double

от 1.7e -308 до 1.7e

от 15 до 16

 

 

 

 

 

+308

 

 

 

10

 

long

от 3.4e -4932 до

от 19 до 20

 

 

 

double

3.4e +4932

 

 

 

 

 

 

В табл. 4 приведены наиболее часто используемые функции для обработки данных вещественного типа. Этими функциями можно пользоваться только после подключения файла math.h с помощью директивы препроцессора include. Для вычисления модуля целого числа используется функция abs(x).

Таблица 4

Обращение

Реализуемое действие

fabs(x)

Модуль аргумента

atan(x)

Aрктангенс (радианы)

floor(x)

Целая часть числа в форме double

log(x)

Натуральный логарифм

pow(x,y)

Вычисляет значение x в степени y

sqrt(x)

Корень квадратный

sin(x)

Синус (радианы)

сos(x)

Косинус (радианы)

exp(x)

Экспонента

55

Оператор присваивания.

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

идентификатор переменной = выражение.

Необходимо учесть, что переменная и выражение должны быть согласованы по типам. Например, если переменные описаны следующим образом:

int x, y ; float a, b;

то можно записать операторы присваивания x = 2;

x = x+5; y = x;

a = b = 3.1;

b = 5.33*x+y/2;

Что происходит со старым значением переменной, когда ей присваивается новое значение? Оно просто стирается. Поскольку переменная может хранить только одно число, то выполнение оператора присваивания приводит к потере предыдущего значения переменной. Переменная всегда содержит результат последнего оператора присваивания.

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

signed char ==> short ==> int ==> long float ==> double ==> long double

unsigned char ==> unsigned short ==> unsigned int ==> unsigned long

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

Вязыке С считается, что все арифметические операции выполняются

сдвойной точностью. Поэтому всякий раз, когда в выражении появляются значение с плавающей точкой, его «удлиняют» до удвоенной точности, добавляя к дробной части нули. При преобразовании значения с двойной точностью к одинарной, например, при присваивании, прежде чем отбросить лишни для обычной точности разряды, происходит округление.

56

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

(имя_типа) операнд

или

имя_типа (операнд).

Во второй форме не может использоваться составное наименование типа (например, unsigned short). Как и при автоматическом преобразовании типов, ответственность за сохранение значения и точности результата лежит на разработчике программы.

Пример pr2 демонстрирует, какие последствия можно иметь от преобразования типов:

//Пример pr2 #include <stdio.h> #include <conio.h> void main ()

{

long a=123456789; float b; int result1, result2; result1=1.6+1.7;

result2 = (int)1.6+(int)1.7; printf("\nresult1=%d»,result1);//Печатает result1=3 printf("\nresult2=%d»,result2);//Печатает result2=2 b = (float)a;

printf ("\n a=%ld»,a); //Печатает a=123456789 printf ("\n b=%e»,b); //Печатает b=1.2345689e+08 a = (long)b;

printf ("\n a=%ld»,a); //Печатает a=123456792 b = 2.222222e+2;

result1 = (int)b;

printf ("\n b=%f», b); //Печатает b=222.222198 printf("\nresult1=%d»,result1);//Печатает result1=222 b = (float)result1;

printf ("\n b=%f», b); //Печатает result1=222.000000 getch();

}

Кроме классической записи оператора присваивания, в языке С++ используются операции увеличения ++ и уменьшения --. Операция увеличения увеличивает свой операнд на 1, а операция уменьшения уменьшает свой операнд на 1. Существует две формы этих операций: постфиксная и префиксная. Разница между ними заключается в том, что они показывают, в какой момент осуществляется увеличение или уменьшение операнда:

x++, x-- постфиксная запись;

57

++x, --x префиксная запись.

Вданных примерах форма записи никак не отражается на результате,

апример pr3 иллюстрирует разницу:

//Пример pr3 #include <stdio.h> #include <conio.h> void main()

{

int a, b, x; x = 0;

a = 5+x++; b = 5+ ++x;

printf ("a = %d\n b = %d», a, b); getch();

}

Результатом работы этой программы будет вывод значений: a = 5

b = 7

При вычислении а к числу 5 добавляется х равное нулю, а потом х увеличивается на единицу. При вычислении b сначала х увеличивается на 1 и становится равным 2, а затем значение х добавляется к числу 5.

В операторах присваивания можно использовать укороченную форму записи, например, запись a+=5 эквивалентна записи a=a+5:

//Пример pr4 #include <stdio.h> #include <conio.h> void main ()

{

float a, b, x; a = b = x = 1;

a+ = 5; //Эквивалентно a = a+5

b/ = 5+x; //Эквивалентно b = b/(5+x) printf ("\na=%f\n b=%f», a, b);

a- = 5; //Эквивалентно a = a-5

b* = 5+x; //Эквивалентно b = b*(5+x) printf ("\n a = %f\n b = %f», a, b); getch();

}

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

58

Соседние файлы в папке книги