Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Опорный конспект

.pdf
Скачиваний:
41
Добавлен:
28.03.2015
Размер:
1.95 Mб
Скачать

О к о н ч а н и е т а б л . 3

1

2

3

 

4

 

 

5

6

 

 

 

 

 

 

 

=

бинарная

левая

присваивание

 

значение=выраже-

2

 

 

 

 

 

 

 

ние

 

 

 

 

 

 

 

 

 

*=

бинарная

левая

умножение

 

и

значение*=выраже-

2

 

 

 

присваивание

 

ние

 

 

 

 

 

 

 

 

 

 

/=

бинарная

левая

деление

 

 

и

значение/=выраже-

2

 

 

 

присваивание

 

ние

 

 

 

 

 

 

 

 

%=

бинарная

левая

вычисление

остатка

значение%=выраже-

2

 

 

 

от

деления

и

ние

 

 

 

 

присваивание

 

 

 

 

 

 

 

 

 

 

 

+=

бинарная

левая

сложение

 

и

значение+=выраже-

2

 

 

 

присваивание

 

ние

 

 

 

 

 

 

 

 

 

-=

бинарная

левая

вычитание

 

и

значение-=выраже-

2

 

 

 

присваивание

 

ние

 

 

 

 

 

 

 

 

 

<<=

бинарная

левая

сдвиг

влево

и

значение<<=выраже

2

 

 

 

присваивание

 

ние

 

 

 

 

 

 

 

 

 

>>=

бинарная

левая

сдвиг

вправо

и

значение>>=выраже

2

 

 

 

присваивание

 

ние

 

 

 

 

 

 

 

 

 

&=

бинарная

левая

логическое

 

 

значение&=выраже-

2

 

 

 

побитовое

И

и

ние

 

 

 

 

присваивание

 

 

 

|=

бинарная

левая

логическое

 

 

значение|=выраже-

2

 

 

 

побитовое

ИЛИ

и

ние

 

 

 

 

присваивание

 

 

 

 

 

 

 

 

 

 

 

^=

бинарная

левая

логическое

 

 

значение^=выраже-

2

 

 

 

побитовое

 

 

ние

 

 

 

 

исключающее ИЛИ и

 

 

 

 

 

присваивание

 

 

 

 

 

 

 

 

 

 

 

,

бинарная

левая

запятая

 

 

выражение,выраже-

1

 

 

 

 

 

 

 

ние

 

 

 

 

 

 

 

 

 

 

23

Мультипликативные операции

В С++ операция деления определена таким образом, что при делении целого числа всегда получается целое число.

Задача. Получить от пользователя радиус сферы и вывести на экран ее объем.

#include <iostream> using namespace std;

int main()

{

float radius;

cout<<"Enter a radius"<<endl; cin>>radius;

cout<<"Volume is:"<<(float)4/3*3.14*radius*radius*radius << endl;

return 0;

}

Рис. 2.4 Вычисление объема сферы

Для получения от пользователя значения используется операция >> (―взять из потока‖). Слева от нее указывается поток, в данном случае, это стандартный поток ввода cin, а справа – переменная, в которую следует сохранить значение.

Объем сферы вычисляется по формуле:

43 * radius3

В С++ нет встроенной операции возведения в степень, поэтому в задаче радиус дважды умножен на самого себя (на практике при возведении в степень используется библиотечная функция pow, которая определена в библиотеке math.h). А перед операцией деления используется операция явного приведения типа. Число 4 из типа int временно превращается в тип float. Теперь в операции деления будет участвовать число с плавающей точкой, это значит, что результатом деления также будет число с плавающей точкой.

При радиусе сферы 8.5 получаемый объем равен 2571.14.

Если программист забудет использовать операцию приведения типа, то результат будет сильно отличаться: при таком же радиусе полученный объем будет 1928.35. Это объясняется тем, что при целочисленном делении 4/3 получится единица.

В данном случае правильный результат можно получить, если записать в формуле не 4/3, а 4.0/3 – тогда делимое будет нецелым числом.

24

Результат на экран выводит с помощью объекта cout, при этом будет выведена не формула, а сосчитанный результат.

В С++ существует операция получения остатка от деления (%), которая применяется только к целым числам. Эта операция определена таким образом, что всегда справедливо равенство [3]:

a = (a/b)*b + a%b

Операции сравнения

Использование операций сравнения в С++ отличается от привычного их использования в математике.

Например, часть программы, представленная на рис. 2.5, четыре раза использует операцию сравнения и получает результаты, показанные на рис. 2.6.

int x = 40; if(30<x<50)

cout<<"TRUE"<<endl;

else

cout<<"FALSE"<<endl;

if(45<x<60)

cout<<"TRUE"<<endl;

else

cout<<"FALSE"<<endl; x = -20;

if(-30<x<-10) cout<<"TRUE"<<endl;

else

cout<<"FALSE"<<endl; if(-10<x<1)

cout<<"TRUE"<<endl;

else cout<<"FALSE"<<endl;

Рис. 2.5. Неправильное использование операции сравнения

TRUE

TRUE

FALSE

TRUE

Рис. 2.6. Результат работы программы на рис. 2.5

Видно, что истинные условия дают неправильный результат, и наоборот. Это происходит потому, что результатом работы операции сравнения является истина (1) или ложь(0). И в следующей операции сравнения уже участвует не значение переменной x, а результат предыдущей операции – 1 или 0. Для по-

25

лучения правильного результата необходимо двойные сравнения разделять на два одиночных и объединять их логическими операциями И либо ИЛИ:

45<x&&x<60

Побитовые логические операции

Побитовые операции применяются только к целым числам. В них целое число рассматривается как строка битов (нулей и единиц при записи числа в двоичной системе счисления или разрядов машинного представления).

Т а б л и ц а 4

 

 

 

Побитовые операции

 

 

 

 

Операция

Результат

 

Объяснение операции

 

 

 

 

 

3

| 1

3

 

побитовое ИЛИ

4

& 7

4

 

побитовое И

4

^ 7

3

 

побитовое исключающее ИЛИ

0

& 0xF

0

 

побитовое И

~0x00F0

0xFF0F

 

поразрядное дополнение (отрицание)

8<<2

32

 

побитовый сдвиг влево

192>>4

12

 

побитовый сдвиг вправо

Поразрядная операция ИЛИ, обозначаемая знаком |, выполняет операцию ИЛИ над каждым индивидуальным битом двух своих операндов. В результате выполнения этой операции получается 0, если в обоих разрядах записаны нули, и 1 во всех остальных случаях (логическое сложение). Например, 10 | 7 даст 15, поскольку в двоичном виде 10 это 1010, 7 – это 111, соответственно операция ИЛИ дает 1111 или 15 в десятичной системе (нули слева опущены).

Поразрядная операция И (&) выполняется над каждым битом своих операндов. В результате выполнения операции получается 1, если в обоих разрядах стоит 1, и 0 во всех остальных случаях (логическое умножение). В предыдущем примере 10 & 7 в результате даст 2 (10 в двоичном виде).

Побитовое исключающее ИЛИ (^) в результате выпонения над каждым битом операндов даст 1, если значения в разрядах разные, и 0, если значения в разрядах совпадают (операция XOR). Тот же пример 10 ^ 7 даст 5 (101 в двоичном представлении).

Побитовое дополнение до единицы или побитовое отрицание – это унарная операция. В результате ее выполнения число в двоичном виде «инвертируется» - единицы становятся нулями и наоборот. Например, в результате операции ~7 получится число -8. При хранении знаковых целых чисел крайний левый разряд резервируется под знак числа. Если в нем стоит 0, то число положительное, а если 1 – отрицательное. Поэтому в результате побитового отрицания число поменяет знак.

На рис. 2.7 и 2.8 показано, как хранятся и как вычисляются отрицательные целые числа.

26

+ 00011111 10000

Отсекаем «лишнюю» единицу – у нас 4 разряда на число

Рис. 2.7. Хранение отрицательных чисел

-

10000

-

10000

1111

101

 

0000

 

1011

Добавляем единицу – до этого мы ее отсекли

Рис. 2.8. Получение отрицательных чисел

Операция сдвига (<< - сдвиг влево или >> - сдвиг вправо) перемещает двоичное представление левого операнда на количество битов, соответствующее значению правого операнда. Например, двоичное представление короткого целого числа 3 0000000000000011. Результатом операции 3 << 2 (сдвиг влево) будет двоичное число 0000000000001100 или, в десятичной записи, 12. Аналогично, сдвинув число 9 (в двоичном виде 0000000000001001) на 2 разряда вправо (записывается 9 >> 2) получим 0000000000000010, т.е. 2.

При сдвиге влево число дополняется нулями справа. При сдвиге вправо бит, которым дополняется число, зависит от того, знаковое оно или беззнаковое. Для

27

беззнаковых чисел при сдвиге вправо они всегда дополняются нулевым битом. Если же число знаковое, то значение самого левого бита числа используется для дополнения. Это объясняется тем, что самый левый бит как раз и является знаком — 0 означает плюс и 1 означает минус. Таким образом, если

short x = 0xFF00; unsigned short y = 0xFF00;

то результатом x >> 2 будет 0xFFC0 (двоичное представление 1111111111000000), а результатом y >> 2 будет 0x3FC0 (двоичное пред-

ставление 0011111111000000).

Операция сдвига влево аналогична умножению на соответствующую степень двойки [19], а сдвиг влево – делению.

Комментарии

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

Однострочные комментарии начинаются с символа «//» и заканчиваются в конце текущей строки.

Многострочные комментарии начинаются с символов «/*» и заканчиваются парой «*/». Вложенных комментариев не бывает. Независимо от количества символов «/*», следующих друг за другом, их действие заканчивается на ближайшем символе «*/».

28

Тема 3

ОПЕРАТОРЫ И ВЫРАЖЕНИЯ

Понятие оператора

Пустой оператор состоит из одного символа – «;». Он не выполняет никаких действий. Используется как заполнитель в других, более сложных операторах. Операторы выражения представляют собой просто выражения, за которыми следуют точка с запятой, или запятая, или некоторый другой контекст. Составной оператор (блок) состоит из определений объектов (данных), за которыми следует последовательность операторов. Блок заключается в фигурные скобки.

Оператор return

Имеет две формы: return;

return выражение;

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

Вторая форма кроме этого еще и возвращает значение в место вызова. Тип выражения в операторе return и тип возвращаемого значения должны совпадать.

Оператор return может отсутствовать в функции, но лучше его явно указывать.

Оператор if (ЕСЛИ)

Этот оператор позволяет изменять порядок выполнения программы в зависимости от истинности условия [1]. Структура if является структурой с одним входом и одним выходом. Структура if/else (ЕСЛИ/ИНАЧЕ) предусматривает действия в случае ложного условия (см. рис. 3.1)

if (x>y)

cout << 1 << endl; else if (x>z)

cout << 2 << endl; else if (y>z)

cout << 3 << endl;

else

cout << 4 << endl;

Рис. 3.1 Использование структуры if/else

29

Структуры выбора if обычно предполагает наличие в своем теле только одного оператора. Чтобы включить несколько операторов в тело структуры, необходимо заключить их в фигурные скобки {}. Тогда оператор будет составным.

В С++ есть операция, аналогичная структуре if/else. Это единственная тернарная операция условия ?:. Использование ее выглядит следующим образом: x > y ? z = 1 : z = 0 ;

С использованием оператора if/else это же выражение можно записать так: if(x>y)

z = 1;

else

z = 0;

Оператор while (ПОКА)

Задача. Найти среднее арифметическое оценок группы по предмету. Пользователь вводит оценки с клавиатуры, признак конца ввода оценок - -1. (рис 3.2.)

#include <iostream > using namespace std;

int main()

{

int counter, grade, total; float average;

total = 0; counter = 0;

cout << "Enter the grade or -1 for stopping: "; cin >> grade;

while (grade != -1)

{

total = total + grade; counter++;

cout << "Enter the grade or -1 for stopping: ";

cin >> grade;

}

average = (float)total / counter;

cout << "The average grade is " << average << endl; return 0;

}

Рис. 3.2. Поиск среднего арифметического оценок

Средние значения не всегда выражаются целыми числами [1]. Часто среднее значение имеет величину типа 7,2 или -93,5. Подобные числа записываются как числа с плавающей точкой и представляются типом данных float. Переменная average объявлена как переменная типа float, чтобы учесть дробную часть результатов вычислений. Однако результат вычисления

30

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

average = (float)total / counter;

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

Оператор do/while (ВЫПОЛНЯТЬ/ПОКА)

Структура do/while похожа на структуру while. В структуре while условие продолжения цикла проверяется в начале цикла, до того, как выполняется тело цикла. В структуре do/while проверка условия продолжения циклов производится после того, как тело цикла выполнено, т.е. тело цикла будет выполнено по крайней мере один раз.

Задача. Определить количество цифр в числе, введенном пользователем. (рис. 3.3.)

#include <iostream> using namespace std;

int main()

{

int num =0, step = 0, del=1; cout<<"Введите число:\t"; cin>> num;

do

{

del*=10;

step++;

} while(num/del);

cout<<"Количество цифр:\t"<< step<<endl; return 0;

}

Рис. 3.3. Определение количества цифр в числе

31

Оператор for (ЦИКЛ)

Структура повторения for содержит все элементы, необходимые для повторения, управляемого счетчиком. Инструкция цикла состоит из трех операторов. Первый оператор задает начальное значение переменной цикла, второй содержит условие продолжения цикла, а третий - шаг цикла.

Задача. Вывести на экран значения степеней двойки от 0 до 16.

#include <iostream> using namespace std;

int main()

{

int step = 1; cout<<"Степень:\t\tЗначение:"<<endl; for(int i = 0; i<=16; i++)

{

cout<<i<<"\t\t"<<step<<endl;

step*=2;

}

return 0;

}

Рис. 3.4. Вывод на экран таблицы степеней двойки

Оператор множественного выбора switch

Программа в следующем примере осуществляет преобразование дюймов в сантиметры и сантиметров в дюймы; предполагается, что будут указаны единицы измерения вводимых данных, добавляя i для дюймов и c для сантиметров (через пробел). (рис. 3.5.)

#include <iostream> using namespace std; int main(){

const float fac = 2.54;

float x, in, cm; char ch = 0;

cout << "введите длину: "; cin >> x >> ch; switch (ch) {

case 'i': in = x;

cm = x*fac; break; case 'c':

in = x/fac;

cm = x; break; default:

in = cm = 0; break;}

}

Рис. 3.5. Программа, выполняющая преобразования дюймов в сантиметры и наоборот

32