Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Составные типы данных_лекция_161012.docx
Скачиваний:
2
Добавлен:
19.11.2019
Размер:
3.27 Mб
Скачать

Составные типы данных.

Для накопления больших объемов информации требуется нечто большее, чем простые базовые типы языка (int, float, char …). А именно составные типы – типы, состоящие из базовых целочисленных типов и типов с плавающей точкой.

Наиболее развитым составным типом является класс – объектно-ориентированное программирование.

Но С++ поддерживает и более скромные составные типы, которые взяты из языка С.

Массив например, может хранить множество значений одного и того же типа. Отдельный вид массива может хранить строки, которые являются последовательностью символов.

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

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

Массивы.

Массив- это структура данных, которая содержит множество значений, относящихся к одному и тому же типу.

Например, массив может содержать:

  • 60 значений типа int, которые представляют собой информацию об объемах продаж чего-либо за последние 2 месяца;

  • 12 значений типа short, представляющих количество дней в каждом месяце;

  • 365 значений типа float, которые указывают ежедневные расходы на питание в течение года.

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

Для создания массива используется оператор объявления. Объявление массива охватывает три аспекта:

  1. Тип значений каждого элемента;

  2. Имя массива;

  3. Количество элементов в массиве.

В С++ это достигается модификацией объявления простой переменной, к которому добавляются квадратные скобки, содержащие внутри количество элементов.

Например,

short months[12];

Каждый элемент – это переменная, которую можно трактовать как простую переменную. Так выглядит общая форма объявления массива:

имяТипа имяМассива [размерМассива];

Выражение размерМассива, представляющее количество элементов, должно быть целочисленной константой, например, 10, значением const, либо константным выражением типа 8*sizeof(int), в котором все значения известны на момент компиляции. РазмерМассива не может быть переменной, значение которой устанавливается во время выполнения программы.

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

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

Например, months[0] – первый элемент массива months, а

months[11] – последний элемент массива.

Правила инициализации массивов.

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

Использовать инициализацию можно ТОЛЬКО при объявлении массива.

Ее нельзя выполнить позже и нельзя присваивать один массив другому:

int card[4] = {3, 6, 8, 10}; // разрешено

int hand[4]; //разрешено

hand[4] = {5, 8, 3, 9}; //не допускается

hand = card; //не допускается

Но, можно использовать индексы и присваивать значения элементам массива индивидуально. При инициализации массива можно указывать меньше значений, чем в массиве объявлено элементов.

Например, float hotelTips[5] = {5.0, 2.5};

Если инициализировать массив частично, то компилятор присваивает остальным элементам нулевые значения. Это значит, что инициализировать весь массив нулями очень легко – для этого достаточно явно инициализировать нулем его первый элемент:

long totals[500] = {0};

Если инициализировать массив таким же образом, но с применением 1, вместо 0, только первый элемент будет установлен в 1, а остальные по-прежнему получат значение 0.

Если при инициализации массива оставить квадратные скобки пустыми, то компилятор самостоятельно пересчитает элементы. Предположим, например, что есть следующее объявление:

short totals[] ={1, 8, 4, 2};

Компилятор сделает totals массивом из пяти элементов.

Инициализация массивов в С++11

В С++11 форма инициализации с фигурными скобками (списковая инициализация) стала универсальной для всех типов. Массивы уже используют списковую инициализацию, но в версии с++11 появились дополнительные возможности.

  1. При инициализации массива можно отбросить знак =.

double earn[4] {1.3e5, 1.6e3, 1.1e4, 1.7e4};

  1. Можно использовать пустые фигурные скобки для установки всех элементов в 0.

unsigned int counts[10] = {}; // все элементы устанавливаются в 0

float balances[100] {}; // все элементы устанавливаются в 0

  1. Списковая инициализация защищает от сужения.

long plifs[] = {25, 92, 3.0}; // не разрешено

char slifs[4] = {‘h’, ‘u’, 1122011, ‘\0’}; // не разрешено

char plifs[] = {‘h’, ‘u’, 112, ‘\0’}; // разрешено

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

2)1122011 выходит за пределы диапазона значений типа char, предполагая, что char занимает 8 бит.

3)Выполняется успешно, несмотря на то, что 112 значение int, но оно находится в рамках диапазона типа char.

Программа 1.Массивы целых чисел.

// arrayone.cpp -- small arrays of integers

#include <iostream>

int main()

{

using namespace std;

int apple[3]; // creates array with three elements

apple[0] = 7; // assign value to first element

apple[1] = 8;

apple[2] = 6;

int applecosts[3] = {20, 30, 5}; // create, initialize array

cout << "Total apple = ";

cout << apple[0] + apple[1] + apple[2] << endl;

cout << "The package with " << apple[1] << " apple costs ";

cout << applecosts[1] << " cents per apple.\n";

int total = apple[0] * applecosts[0] + apple[1] * applecosts[1];

total = total + apple[2] * applecosts[2];

cout << "The total apple expense is " << total << " cents.\n";

getchar();

return 0;

}

Строки

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

  1. Унаследован от С и часто называется строки в стиле С.

  2. Основан на библиотечном классе string.

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

Строке в стиле С обладают специальной характеристикой: последним в каждой такой строке является нулевой символ. Этот символ, записываемый как \0, предоставляет собой символ с ASCII-кодом 0, который служит меткой конца строки. Например:

char dog[8] = {‘b’, ‘r’, ‘e’, ‘u’, ‘x’, ‘ ’, ‘R’, ‘E’ }; // это не строка

char cat[8] = {‘d’, ‘f’, ‘a’, ‘s’, ‘d’, ‘t ’, ‘T’, ‘\0’ }; // это строка

Обе эти переменные представляют собой массивы char, но только вторая из них является строкой.

Нулевой символ играет фундаментальную роль в строках стиля С.

Например, в С++ имеется множество функций для обработки строк, включая те, что используются cout. Все они обрабатывают строки символ за символом до тех пор, пока не встретится нулевой символ.

Если вы просите объект cout отобразить такую строку, как cat из примера, он выводит первых семь символов, обнаруживает нулевой символ и останавливается.

Однако если вывести с помощью cout массив dog, который не является строкой, то выведуется 8 символов, и будет продолжать двигаться по помяти байт за байтом, интерпретируя каждый их них, как символ, подлежащий выводу, пока не встретит нулевой символ.

Поскольку нулевые символы, которые по сути представляют собой байты, содержащие нули, встречаются в помяти довольно часто, ошибка быстро обнаружится. Но не стоит трактовать нестроковые символьные массивы как строки.

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

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

char bird[11] = “Mr. Cheeps”;

// наличие символа \0 подразумевается

char fish[] = “Bubbles”;

// компилятор сам подсчитывает количество элементов

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

Средства ввода С++ предназначенные для чтения строки с клавиатуры в массив char автоматически добавляют завершающий нулевой символ.

Инициализация массива строкой.