Лабы 1 курс 2 семестр / ЛР 2 Информатика 2 сем 2020
.pdf3Лабораторная работа №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