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

Лабы 1 курс 2 семестр / ЛР 2 Информатика 2 сем 2020

.pdf
Скачиваний:
12
Добавлен:
15.01.2021
Размер:
916.51 Кб
Скачать

3Лабораторная работа №2. Типы данных и операторы языка «C++»

3.1Цели и задачи работы:

Цель данной лабораторной работы — научиться решать, тестировать и отлаживать на ЭВМ типовые программы вычислительного характера.

Задача данной лабораторной работы — выполнить выданные типовые задания вычислительного характера.

3.2Теоретическая часть

Данные, с которыми работает программа, хранятся в оперативной памяти. В языках программирования данные представлены переменными. Переменная – это именованная область памяти, к которой программа имеет доступ. В эту область можно помещать данные и затем извлекать их. Каждая переменная имеет определенный тип, который характеризует размер выделенной области памяти, диапазон значений, которые она может хранить, и набор операций, применимых к этой переменной. (В программе на языке «C++» узнать размер типа при выполнении программы можно с помощью оператора sizeof(), в круглых скобках которого указывается имя типа).

Основные стандартные типы данных, поддерживаемые компиляторами Visual C++, приведены в таблице:

Имя типа

Описание

Размер в байтах

Диапазон значений

 

 

 

 

int

целое число

4

от -2 147 483 648 до 2 147 483

647

 

 

 

unsigned int

целое беззнаковое

4

от 0 до 4 294 967 295

(неотрицательное) число

 

 

 

float

число с плавающей запятой

4

3,4E ± 38 (7 знаков)

 

 

 

 

double

число с плавающей запятой

8

1,7E ± 308 (15 знаков)

двойной точности

 

 

 

bool

логическая величина

1

false или true

 

 

 

 

char

коды символов (напр., ASCII)

1

от -128 до 127

 

 

 

 

Конкретные числа или символы, указанные в программе, называются литералами. Литералы, как и переменные, хранятся в оперативной памяти, но узнать адреса их хранения или изменить хранимые значения невозможно. Литералы, как и переменные, имеют типы. Так, 1 имеет тип int, 3.14159 - тип double, ‘a’ – тип char. Ключевые слова true и false являются литералами типа bool.

Литералы целых типов (int, unsigned int) можно записать в десятичном, восьмеричном и шестнадцатеричном виде. Если литерал начинается с 0, он трактуется как восьмеричный, если с 0х или 0Х - как шестнадцатеричный. Привычная запись рассматривается как десятичное число.

22

20 // десятичный

024 // восьмеричный

0х14 // шестнадцатеричный

По умолчанию все целочисленные литералы имеют тип int. Обозначить им тип unsigned int можно, добавив в конце букву U (или u).

20u // имеет тип unsigned int

Литералы-символы пишутся в одинарных кавычках, что бы отличать их от имѐн переменных:

a // имя переменной ‘a’ // символ

Имя (идентификатор) переменной может включать последовательность букв (предпочтительно латинских), цифр и символов подчеркивания. Имена переменных не могут совпадать с именами ключевых слов языка. Чтобы создать переменную, еѐ нужно объявить следующим образом:

int k; // Объявление целочисленной переменной k

Оперативная память

k

- имя переменной

 

- выделенное место в

 

оперативной памяти

Чтобы задать переменной какое-либо значение, нужно воспользоваться оператором присваивания «=»:

k = 4; // Задание объявленной переменной k значения 4

переменная литерал

k

4 = 4

23

Объявление переменной с заданием ей значения называется инициализацией:

char ch = ‘c’; // Инициализация символьной переменной ch символом «с»

Если объявить переменную, но не инициализировать, в ней будет находиться «мусор». Результат задания целочисленной переменной дробного значения не определѐн стандартом и зависит от настроек используемого компилятора.

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

const float Pi = 3.14; // Инициализация константы Pi

значением 3.14

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

{

int i;

}

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

Любое имя, объявленное за пределами всех блоков, имеет область файлов. Она доступна в любом месте файла после объявления. В терминах языка C++ область файлов также называется областью пространства имен.

Область видимости определяет время существования имени переменной, за исключением переменных объявленных с ключевым словом static - статических переменных. После выхода из блока к такой переменной так же нельзя обратиться по еѐ имени, но при повторном заходе в блок - это снова станет возможно. В отличие от нестатической переменной, статическая заново создаваться не будет, и сохранит своѐ значение.

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

24

Оператор

Описание

Пример

Примечания

использования

+

Cложение

c = a + b

 

-

Вычитание

c = a - b

 

-

Изменение

c = -a

 

знака

 

 

 

 

*

Умножение

c = a * b

 

 

 

 

при целых

/

Деление

c = a / b

аргументах –

результат

 

 

 

 

 

 

целый

 

Деление по

 

аргументы

 

модулю

 

%

c = a % b

должны быть

(нахождение

 

 

целыми

 

остатка)

 

 

 

 

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

а b

1 2

+

с

3 = 3

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

Оператор

Описание

Пример

Эквивалентная

Примечания

использования

запись

 

 

 

+=

Cложение с

a += b

а = а + b

 

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

 

 

 

 

 

-=

Вычитание с

a -= b

а = а - b

 

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

 

 

 

 

 

 

 

25

 

 

*=

Умножение с

a *= b

а = а * b

 

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

 

 

 

 

 

/=

Деление с

a /= b

а = а / b

 

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

 

 

 

 

 

 

Деление по

 

 

 

 

модулю

 

 

аргументы

%=

(нахождение

a %= b

а = а % b

должны быть

 

остатка) с

 

 

целыми

 

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

 

 

 

 

 

а

b

 

 

 

1

2

 

 

 

3

 

 

+=

3

В тех случаях, когда значение целочисленной переменной нужно увеличить или уменьшить на 1, используются операторы инкремент и

декремент. Эти операторы выполняются быстрее, чем «+=» и «-=».

Оператор

Название

 

Пример

Аналог

 

использования

 

 

 

 

 

 

префиксная

b = ++a

a += 1;

 

 

форма

b = a;

 

 

 

++

инкремент

постфиксная

 

c = a;

 

 

b = a++

a += 1;

 

 

форма

 

 

 

b = c;

 

 

 

 

 

 

префиксная

b = --a

a -= 1;

 

 

форма

b = a;

 

 

 

--

декремент

постфиксная

 

c = a;

 

 

b = a--

a -= 1;

 

 

форма

 

 

 

b = c;

 

 

 

 

В префиксной форме эти операторы изменяют значение переменной и возвращают новое полученное значение. В постфиксной форме эти операторы сначала запоминают текущее значение переменной, потом

26

изменяют значение переменной и возвращают запомненное (прежнее) значение переменной.

 

а

 

2

++_

1

2

а

2

 

1

_++

1

Для сравнения значений переменных, констант или литералов используются операторы отношения (логические операторы):

Оператор

Описание

Пример

Примечания

использования

>

больше

c = a > b

 

>=

больше либо равно

c = a >= b

 

==

равно

c = a == b

 

<=

меньше и равно

c = a <= b

 

<

меньше

c = a < b

 

!=

не равно

c = a != b

 

Если отношение, заданное соответствующим оператором, верно, оператор возвращает значение true, а если нет – false.

а b

7 5

>

true

27

Для работы с булевыми величинами используются логические операторы

Оператор

Описание

Пример

Примечания

использования

!

логическое НЕ

c = !a

 

&&

логическое И

c = a && b

 

||

логическое ИЛИ

c = a || b

 

а

b

а

b

5

0

true

false

&&

||

false

true

Если с логическим оператором использовать численную величину, она будет преобразована в логическую по следующему правилу: 0 соответствует false, все остальные значения – true.

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

Оператор

Описание

Пример

Примечания

использования

&

побитовое И

c = a & b

 

|

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

c = a | b

 

 

побитовое

 

 

^

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

c = a ^ b

 

 

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

 

 

<<

влево

c = a << b

 

 

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

 

 

>>

вправо

c = a >> b

 

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

28

общий результат операции. Например, возьмѐм двe целочисленных переменных: int a = 5; (1012) и int b = 14; (11102). Результат выражения a & b будет 4, см. рисунок. Аналогично результат выражения a | b будет 15, а выражения a ^ b будет 11.

№№ битов

31

...

6

5

4

3

2

1

0

a

0

...

0

0

0

0

1

0

1

b

0

...

0

0

0

1

1

1

0

a & b

0

...

0

0

0

0

1

0

0

a | b

0

...

0

0

0

1

1

1

1

a ^ b

0

...

0

0

0

1

0

1

1

Операторы сдвига вызывают сдвиг битов в первом аргументе на количество позиций, указанное вторым аргументом. Для чисел без знака позиции битов, освобожденные при операции сдвига, заполняются нулями, а непомещающиеся - отбрасываются. Например, возьмѐм целочисленную переменную int a = 5; (1012). Тогда результат выражения a << 1 будет 10, результат выражения a << 4 будет 80, результат выражения a >> 1 будет 2, результат выражения a >> 4 будет 0.

№№ битов

31

...

6

5

4

3

2

1

0

a

0

...

0

0

0

0

1

0

1

a << 1

0

...

0

0

0

1

0

1

0

a << 4

0

...

1

0

1

0

0

0

0

a >> 1

0

...

0

0

0

0

0

1

0

a >> 4

0

...

0

0

0

0

0

0

0

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

29

3.3Примеры решения задач

Задача А. Ввести с клавиатуры число N. Вычислить 3N2 + 3N + 3. Результат вывести на экран.

Решение:

Составим блок-схему алгоритма работы программы. В блок-схеме должно быть два блока «Данные»: один для ввода числа N, другой - для вывода результата вычислений. Выражение «3N2 + 3N + 3» достаточно простое, его вычисление можно обозначить одним блоком «Процесс». Ещѐ один такой блок понадобится для обозначения вспомогательных переменных.

Начало

Число N Число Result

Ввод значения числа N

Result = 3N2 + 3N + 3

Вывод Result

Конец

Проанализировав полученную блок-схему, видим, что переменная Result используется исключительно для временного хранения результата заданного выражения и в других вычислениях не участвует. Между блоками для вычисления результата выражения и для его вывода других блоков нет, значит, их возможно объединить, и переменная Result станет не нужна.

После оптимизации блок-схема примет вид:

30

Начало

Число N

Ввод значения числа N

Вывод 3N2 + 3N + 3

Конец

Для вычисления результата выражения в программе воспольземся операторами сложения и умножения, а для ввода значения числа N с клавиатуры и для вывода результата воспользуемя конструкцией std::cout<<.

#include <conio.h> #include <iostream>

void main()

{

float N; std::cout<<"vvedite N:"; std::cin>>N;

std::cout<<"\nresultat: "<< 3*N*N + 3*N + 3 << "\n\nPress any key to continue";

_getch();

}

Для проверки правильности работы программы запустим еѐ несколько раз, вводя различные значения N:

Вводимое значение

1

2

3

10

0

-2

0.1

-4.5

Полученный результат

9

21

39

333

3

9

3.33

50.25

Проверим результаты работы программы, пересчитав заданное выражение для ведѐнных значений N. Все полученные результаты соответствуют действительности, значит, можно предположить, что программа работает верно.

31