Занятие 2: Типы данных C++, приведение типов

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

Литералом называется явно указанное в исходном коде программы значение определенного типа.

cout << 1024; // выводим на экран целочисленный литерал 
cout << "mir"; // выводим на экран строковый литерал

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

При создании любой переменной требуется указать её тип и задать имя.

Например:

int per1; // создали переменную типа int с именем per1
per1 = 25; // сохранили в переменную целое число 25 
int b; // создали переменную типа int с именем b
b = 3 + per1; // прочитали значение 25, сложили его с 3 и сумму записали в b
cout << b; // прочитали из переменной b значение 28 и вывели его на экран

Использованный в примере тип int позволяет хранить целочисленные значения из некоторого диапазона (диапазон будет представлен в таблице далее). Перед тем как использовать переменную (т.е. записывать в неё значение или читать из ней значение) её обязательно нужно объявить (указав её тип и задав имя). Изменить тип переменной или повторно создать переменную — невозможно.

Имена переменных составляются из латинских букв (строчных и заглавных), цифр, символов _ и $, но начинаться имя переменной обязано с латинской буквы.

В одной области программы не может существовать несколько переменных с одинаковыми именами, т.е. имя каждой переменной должно быть уникально.

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

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

const int k1 = 13; // создали константу типа int с именем k1 и записали в неё значение
cout << k1 = 12; // но нельзя изменить, это приведёт к ошибке

Типы данных

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

Название типа Описание Объём памяти Диапазон значений
char Для хранения кодов символов или маленьких целых чисел 1 байт signed: [-128;127]
unsigned: [0;255]
short int (или просто short) Короткие целые числа 2 байта signed: [-32768;32767]
unsigned: [0;65535]
int Целые числа 4 байта signed: [-2147483648;2147483647]
unsigned: [0;4294967295]
long int (или просто long) Длинные целые числа 4 байта signed: [-2147483648;2147483647]
unsigned: [0;4294967295]
bool Логические значения 1 байт true либо false
float Вещественные числа одинарной точности 4 байта ≈±3.4*10±38 (~7 цифр после запятой)
double Вещественные числа двойной точности 8 байт ≈±1.7*10±308 (~15 цифр после запятой)
long double Длинные вещественные числа 8 байт ≈±1.7*10±308 (~15 цифр после запятой)

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

Например:

signed short a = -30000; // можно хранить значения [-32768;32767]
unsigned short b = 50000; // можно хранить значения [0;65535]
short c = -30000; // можно хранить значения [-32768;32767]

По умолчанию, все целые типы являются знаковыми, т.е. signed перед ними можно не указывать.

Объём памяти, занимаемый переменными большинства перечисленных типов, зависит от конкретной архитектуры и компилятора, т.е. может различаться. Узнать сколько байт выделяется под каждый тип конкретно на вашей конфигурации можно с помощью функции typeof, передавая ей в качестве аргумента название интересующего типа.

#include <iostream>
using namespace std;
int main(void) {
	cout << "char: " << sizeof(char) << endl;
	cout << "short: " << sizeof(short) << endl;
	cout << "int: " << sizeof(int) << endl;
	cout << "long: " << sizeof(long) << endl;
	cout << "float: " << sizeof(float) << endl;
	cout << "double: " << sizeof(double) << endl;
	return 0;
}

Приведение типов

В C++ существует явное приведение типов и автоматическое (или неявное).

Явное приведение осуществляется с помощью указания целевого типа данных (того, к которому нужно привести) в круглых скобках перед выражением:

double s = 2.71;
int t = (int) s;
cout << t << endl; // 2
cout << (int) 3.14 << endl; // 3
cout << (int) (2.5 + t) << endl; // 4

Приведение к целым числам от вещественных осуществляется путём отбрасывания целой части (не округлением).

В C++ к тому же возможно приведение между логическим и числовыми типами.

Любое ненулевое число приводится к true, число 0 или 0.0 — к false. И, наоборот, false преобразуется в 0, а true — в 1.

bool b = true;
int t = (int) b;
cout << t << endl; // 1
cout << (int) false << endl; // 0
bool n = (bool) 42; // true
bool m =  (bool) (5 * 2 - 10); // false
bool k = (bool) 0.43; // true
double num1 = 2 + (double) (k || m); // 3.0

Автоматическое приведение возможно в том случае, когда значение преобразуется к более широкому типу, например, целое число к вещественному.

Ввод данных

Ввод данных в C++ осуществляется с помощью команды cin. Аргумент этой функции передаётся не в круглых скобках, а через оператор >> (аналог перенаправления в GNU/Linux).

Пример программы, выводящей на экран квадрат числа, введённого пользователем с клавиатуры:

#include <iostream>
using namespace std;
int main(void) {
	cout << "Vvedite chislo: ";
	int s;
	cin >> s;
	cout << "Kvadrat chisla: ";
	cout << s*s << endl;
	return 0;
}

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

#include <iostream>
using namespace std;
int main(void) {
	double num;
	cout << "Vvedite chislo: ";
	cin >> num;
	int ch = (int) num;
	cout << "Tselaya chast chisla: " << ch << endl;
	return 0;
}

Имейте в виду, что в зависимости от настроек системы, где вы будите запускать вашу программу, при вводе вещественных чисел может потребоваться указывать запятую в качестве десятичного разделителя (т.е. вводить не «5.23», а «5,23»). Какой именно формат ввода поддерживает ваша конфигурация вы сможете выяснить экспериментальным путём.

Задачи

  1. Создать программу, округляющую и выводящую на экран вещественное число, введенное пользователем с клавиатуры в переменную типа double. Подсказка: операцию округления числа можно получить как композицию операции приведения к целому типу и ещё одной арифметической операции.
  2. Создать программу, проверяющую, является ли число, введённое пользователем, положительным, отрицательным или нулём. Вывести соответсвующее сообщение на экран. Пример оформления программы:
    Vvedite chislo: 3.14
    Chislo polozhitelnoe
  3. Создать программу, проверяющую является ли целое число, введённое пользователем, чётным либо нечётным. Вывести соответсвующее сообщение на экран. Пример оформления программы:
    Vvedite chislo: 5
    Chislo nechetnoe
  4. Создать программу, проверяющую является ли число, введённое пользователем, целым или не является. Вывести соответсвующее сообщение на экран. Пример оформления программы:
    Vvedite chislo: 5.23
    Chislo ne tseloe
  5. Написать программу, выводящую на экран значение наибольшего из трёх целых чисел, введённых пользователем с клавиатуры. Пример оформления программы:
    Vvedite pervoe chislo: 5
    Vvedite vtoroe chislo: -2
    Vvedite tretie chislo: 3
    Naibolshee chislo: 5
  6. Пользователь вводит с клавиатуры три цифры (натуральных числа из [1;9]). Если хотя бы одно из чисел введено с ошибкой, то программа завершается, сообщая о допущенной ошибке. Если цифры введены корректно, то программа должна составить из цифр и вывести на экран трёхзначное число, наибольшее из возможных. Пример оформления программы (с ошибкой ввода):
    Vvedite pervoe chislo: 0
    Vvedite vtoroe chislo: -2
    Vvedite tretie chislo: 7
    Oshibka pri vvode
  7. Пример оформления программы:

    Vvedite pervoe chislo: 1
    Vvedite vtoroe chislo: 5
    Vvedite tretie chislo: 4
    Naibolshee chislo iz vvedennyh cifr: 541