Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен ОООП.docx
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

1) Типы данных

2) 1. Задача. Дана программа: Var st: string; Begin

St:='abcdef; St:=copy(st, 3,2); Writeln(st); End.

После выполнения программы на экран будет выведено

Ответ:

1. В данном разделе будут рассмотрены основные типы данных в С++, эти типы данных ещё называются встроенными. Язык программирования С++ является расширяемым языком программирования. Понятие расширяемый означает то, что кроме встроенных типов данных, можно создавать свои типы данных. Поэтому в С++ существует огромное количество типов данных. Мы будем изучать только основные из них.

Таблица 1 — Типы данных С++

Тип

байт

Диапазон принимаемых значений

целочисленный (логический) тип данных

bool

1

0   /   255

целочисленный (символьный) тип данных

char

1

0   /   255

 целочисленные типы данных

short int

2

-32 768    /    32 767

unsigned short int

2

0  /  65 535

int

4

-2 147 483 648   /   2 147 483 647

unsigned int

4

0     /     4 294 967 295

long int

4

-2 147 483 648    /    2 147 483 647

unsigned long int

4

0     /     4 294 967 295

типы данных с плавающей точкой

float

4

-2 147 483 648.0  / 2 147 483 647.0

long float

8

-9 223 372 036 854 775 808 .0   /   9 223 372 036 854 775 807.0

double

8

-9 223 372 036 854 775 808 .0   /   9 223 372 036 854 775 807.0

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

Тип данных bool

Первый в таблице — это тип данных bool - целочисленный тип данных, так как диапазон допустимых значений — целые числа от 0 до 255. Но как Вы уже заметили, в круглых скобочках написано — логический тип данных, и это тоже верно. Так какbool используется исключительно для хранения результатов логических выражений. У логического выражения может быть один из двух результатов true или false. true - если логическое выражение истинно, false - если логическое выражение ложно.

Но так как диапазон допустимых значений типа данных bool от 0 до 255, то необходимо было как-то сопоставить данный диапазон с определёнными в языке программирования логическими константами true и false. Таким образом, константе true эквивалентны все числа от 1 до 255 включительно, тогда как константе false эквивалентно только одно целое число — 0.  Рассмотрим программу с использованием типа данных bool.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// data_type.cpp: определяет точку входа для консольного приложения.

 

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int main(int argc, char* argv[])

{

    bool boolean = 25; // переменная типа bool с именем boolean

    if ( boolean ) // условие оператора if

        cout << "true = "  << boolean << endl; // выполнится в случае истинности условия

    else

        cout << "false = " << boolean << endl; // выполнится в случае, если условие ложно

    system("pause");

    return 0;

}

В строке 9 объявлена переменная типа bool, которая инициализирована значением 25. Теоретически после строки 9, в переменной boolean должно содержаться число 25, но на самом деле в этой переменной содержится число 1. Как я уже говорил, число 0 — это ложное значение, число 1 — это истинное значение. Суть в том, что в переменной типа bool могут содержаться два значения — 0 (ложь) или 1 (истина). Тогда как под тип данных bool отводится целый байт, а это значит, что переменная типа bool может содержать числа от 0 до 255. Для определения ложного и истинного значений необходимо всего два значения 0 и 1. Возникает вопрос: «Для чего остальные 253 значения?».

Исходя из этой ситуации, договорились использовать числа от 2 до 255 как эквивалент числу 1, то есть истина. Вот именно по этому в переменной boolean содержится число 25 а не 1. В строках 10 -13 объявлен оператор условного выбора if, который передает управление оператору в строке 11, если условие истинно, и оператору в строке 13, если условие ложно. Результат работы программы смотреть на рисунке 1.

CppStudio.comtrue = 1

Для продолжения нажмите любую клавишу . . .

Рисунок 1 — Тип данных bool

Тип данных char

Тип данных char - это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char. Для представления символов в C++ типу данных char отводится один байт, в одном байте — 8 бит, тогда возведем двойку в степень 8 и получим значение 256 — количество символов, которое можно закодировать. Таким образом, используя тип данных char  можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII. 

ASCII ( от англ. American Standard Code for Information Interchange) — американский стандартный код для обмена информацией.

Рассмотрим программу с использованием типа данных char.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

// symbols.cpp: определяет точку входа для консольного приложения.

 

#include "stdafx.h"

#include <iostream>

using namespace std;

 

int main(int argc, char* argv[])

{

    char symbol = 'a'; // объявление переменной типа char и инициализация её символом 'a'

    cout << "symbol = " << symbol << endl; // печать символа, содержащегося в переменной symbol

    char string[] = "cppstudio.com"; // объявление символьного массива (строки)

    cout << "string = " << string << endl; // печать строки

    system("pause");

    return 0;

}

Итак, в строке 9 объявлена переменная с именем symbol, ей присвоено значение символа 'a' (ASCII код). В строке 10 оператор cout печатает символ, содержащийся в переменной symbol. В строке 11 объявлен строковый массив с именем string, причём размер массива задан неявно. В строковый массив сохранена строка "cppstudio.com". Обратите внимание на то, что, когда мы сохраняли символ в переменную типа char, то после знака равно мы ставили одинарные кавычки, в которых и записывали символ. При инициализации строкового массива некоторой строкой, после знака равно ставятся двойные кавычки, в которых и записывается некоторая строка. Как и обычный символ, строки выводятся с помощью оператора cout, строка 12. Результат работы программы показан на рисунке 2.

CppStudio.com

symbol = a

string = cppstudio.com

Для продолжения нажмите любую клавишу . . .

Рисунок 2 — Тип данных char

Целочисленные типы данных

Целочисленные типы данных используются для представления чисел. В таблице 1 их аж шесть штук: short int, unsigned short int, int, unsigned int, long int, unsigned long int. Все они имеют свой собственный размер занимаемой памяти и  диапазоном принимаемых значений. В зависимости от компилятора, размер занимаемой памяти и диапазон принимаемых значений могут изменяться. В таблице 1 все диапазоны принимаемых значений и размеры занимаемой памяти взяты для компилятора MVS2010. Причём все типы данных в таблице 1 расположены в порядке возрастания размера занимаемой памяти и диапазона принимаемых значений. Диапазон принимаемых значений, так или иначе, зависит от размера занимаемой памяти. Соответственно, чем больше размер занимаемой памяти, тем больше диапазон принимаемых значений. Также диапазон принимаемых значений меняется в случае, если тип данных объявляется с приставкой unsigned - без знака. Приставка unsigned говорит о том, что тип данных не может хранить знаковые значения, тогда и диапазон положительных значений увеличивается в два раза, например, типы данных short int и unsigned short int.

Приставки целочисленных типов данных:

short - приставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;

long - приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти;

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

Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел — это тип данных int. Благодаря приставкам short, long, unsigned появляется некоторое разнообразие типов данных int, различающихся размером занимаемой памяти и (или) диапазоном принимаемых значений.

Типы данных с плавающей точкой

В С++ существуют два типа данных с плавающей точкой: float и double. Типы данных с плавающей точкой предназначены для хранения чисел с плавающей точкой. Типы данных float и double могут хранить как положительные, так и отрицательные числа с плавающей точкой. У типа данных float размер занимаемой памяти в два раза меньше, чем у типа данных double, а значит и диапазон принимаемых значений тоже меньше. Если тип данных float объявить с приставкой long, то диапазон принимаемых значений станет равен диапазону принимаемых значений типа данных double. В основном, типы данных с плавающей точкой нужны для решения задач с высокой точностью вычислений, например, операции с деньгами.

Итак, мы рассмотрели главные моменты, касающиеся основных типов данных в С++. Осталось только показать, откуда взялись все эти диапазоны принимаемых значений и размеры занимаемой памяти. А для этого разработаем программу, которая будет вычислять основные характеристики всех, выше рассмотренных, типов данных.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

// data_types.cpp: определяет точку входа для консольного приложения.

 

#include "stdafx.h"

#include <iostream>

// библиотека манипулирования вводом/выводом

#include <iomanip>

// заголовочный файл математических функций

#include <cmath>

using namespace std;

 

int main(int argc, char* argv[])

{

    cout << "     data type      "   << "byte"                      << "      "    << "    max value  " << endl // заголовки столбцов

             << "bool               =  " << sizeof(bool)                << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных bool*/                           << (pow(2,sizeof(bool) * 8.0) - 1)               << endl

         << "char               =  " << sizeof(char)                << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных char*/                           << (pow(2,sizeof(char) * 8.0) - 1)               << endl

         << "short int          =  " << sizeof(short int)           << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных short int*/                      << (pow(2,sizeof(short int) * 8.0 - 1) - 1)      << endl

             << "unsigned short int =  " << sizeof(unsigned short int)  << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных unsigned short int*/             << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl

             << "int                =  " << sizeof(int)                 << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных int*/                            << (pow(2,sizeof(int) * 8.0 - 1) - 1)            << endl

             << "unsigned int       =  " << sizeof(unsigned int)        << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных unsigned int*/                   << (pow(2,sizeof(unsigned int) * 8.0) - 1)       << endl

             << "long int           =  " << sizeof(long int)            << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных long int*/                       << (pow(2,sizeof(long int) * 8.0 - 1) - 1)       << endl

             << "unsigned long int  =  " << sizeof(unsigned long int)   << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных undigned long int*/              << (pow(2,sizeof(unsigned long int) * 8.0) - 1)  << endl

             << "float              =  " << sizeof(float)               << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных float*/                          << (pow(2,sizeof(float) * 8.0 - 1) - 1)          << endl

             << "double             =  " << sizeof(double)              << "         " << fixed << setprecision(2)

/*вычисляем максимальное значение для типа данных double*/                         << (pow(2,sizeof(double) * 8.0 - 1) - 1)         << endl;

    system("pause");

    return 0;

}

Данная программа выложена для того, чтобы Вы смогли просмотреть характеристики типов данных в своей системе. Не стоит разбираться в коде, так как в программе используются управляющие операторы, которые Вам, вероятнее всего, ещё не известны. Для поверхностного ознакомления с кодом программы, ниже поясню некоторые моменты. Операторsizeof() вычисляет количество байт, отводимое под тип данных или переменную. Функция pow(x,y) возводит значение х в степень y, данная функция доступна из заголовочного файла <cmath>. Манипуляторы fixed и setprecision() доступны из заголовочного файла <iomanip>. Первый манипулятор — fixed, передаёт в поток вывода значения в фиксированной форме . Манипулятор setprecision(n) отображает n знаков после запятой. Максимальное значение некоторого типа данных вычисляется по такой формуле:

1

2

3

4

5

6

7

8

9

max_val_type = 2^(b * 8 - 1) - 1; // для типов данных с отрицательными и положительными числами

// где, b - количество байт выделяемое в памяти под переменную с таким типом данных

// умножаем на 8, так как в одном байте 8 бит

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

// вычитаем 1 в конце, так как диапазон чисел начинается с нуля

 

// типы данных с приставкой unsigned

max_val_type = 2^(b * 8 ) - 1; // для типов данных только с положительными числами

// пояснения к формуле аналогичные, только в скобочка не вычитается единица

Пример работы программы можно увидеть на рисунке 3. В первом столбце показаны основные типы данных в С++, во втором столбце размер памяти, отводимый под каждый тип данных и в третьем столбце — максимальное значение, которое может содержать соответствующий тип данных. Минимальное значение находится аналогично максимальному. В типах данных с приставкой unsigned минимальное значение равно 0.

CppStudio.com

data type byte max value

bool = 1 255.00

char = 1 255.00

short int = 2 32767.00

unsigned short int = 2 65535.00

int = 4 2147483647.00

unsigned int = 4 4294967295.00

long int = 4 2147483647.00

unsigned long int = 4 4294967295.00

float = 4 2147483647.00

double = 8 9223372036854775808.00

Для продолжения нажмите любую клавишу . . .

Рисунок 3 — Типы данных С++

Если, например, переменной типа short int присвоить значение 33000, то произойдет переполнение разрядной сетки, так как максимальное значение в переменной типа short int  это 32767. То есть в переменной типа short int сохранится какое-то другое значение, скорее всего будет отрицательным. Раз уж мы затронули тип данных int, стоит отметить, что можно опускать ключевое слово int и писать, например, просто short. Компилятор будет интерпретировать такую запись как short int. Тоже самое относится и к приставкам long и unsigned. Например:

1

2

3

4

5

// сокращённая запись типа данных int

short a1; //  тоже самое, что и short int

long a1; // тоже самое, что и long int

unsigned a1; // тоже самое, что и unsigned int

unsigned short a1; // тоже самое, что и unsigned short int

2.

№14. Билет