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

Programmirovanie_-_1_kurs / Методические указания к лабораторным работам 3-4

.pdf
Скачиваний:
58
Добавлен:
09.06.2015
Размер:
700.69 Кб
Скачать

ФГБ ОУ ВПО «Московский государственный университет путей сообщения»

Кафедра «Автоматизированные системы управления»

А.В. ВАРФОЛОМЕЕВ

ЯЗЫК C++

СТРУКТУРЫ ДАННЫХ И ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ

Методические указания к лабораторным работам по дисциплине «Алгоритмические языки и программирование»

МОСКВА – 2011

ФГБ ОУ ВПО «Московский государственный университет путей сообщения»

Кафедра «Автоматизированные системы управления»

А.В. ВАРФОЛОМЕЕВ

ЯЗЫК C++

СТРУКТУРЫ ДАННЫХ И ДИНАМИЧЕСКОЕ ВЫДЕЛЕНИЕ ПАМЯТИ

Рекомендовано редакционно-издательским советом университета в качестве методических указаний для студентов по направлениям 230100.62 и 230400.62

МОСКВА – 2011

УДК 004 В 18

Варфоломеев А.В. Язык С++. Структуры данных и динамическое выделение памяти: Методические указания.

М.: МИИТ, 2011, — 59с.

Вметодических указаниях приводятся рекомендации по работе с массивами, строками и пользовательскими типами данных в языке С++, рассказывается о работе с памятью и указателями, представлены варианты заданий для выполнения лабораторных работ №3 и №4 по дисциплине «Алгоритмические языки и программирование».

ФГБ ОУ ВПО «Московский государственный университет путей сообщения», 2011

 

СОДЕРЖАНИЕ

 

1.

МАССИВЫ...............................................................................

4

 

1.1. Объявление и инициализация массива.....................................

4

 

1.2. Доступ к элементам массива.....................................................

5

 

1.3. Рабочий размер массива............................................................

6

 

1.4. Многомерные массивы..............................................................

8

 

1.5. Упорядочивание массива ........................................................

10

2.

ПОЛЬЗОВАТЕЛЬСКИЕ ТИПЫ ДАННЫХ............................

12

 

2.1. Перечисления ...........................................................................

12

 

2.2. Структуры.................................................................................

14

 

2.3. Объявление новых типов данных (typedef) ...........................

18

 

2.4. Оператор sizeof.........................................................................

19

3.

УКАЗАТЕЛИ ...........................................................................

20

 

3.1. Понятие адреса переменной....................................................

20

 

3.2. Понятие указателя....................................................................

21

 

3.3. Операции с указателями..........................................................

23

 

3.4. Особенности применения указателей ....................................

28

 

3.5. Ссылки ......................................................................................

30

4.

РАБОТА С ПАМЯТЬЮ...........................................................

31

 

4.1. Области памяти........................................................................

31

 

4.2. Динамическое выделение памяти...........................................

32

5.

СТРОКИ...................................................................................

35

 

5.1. Представление строк в памяти................................................

35

 

5.2. Использование служебных символов в строках....................

36

 

5.3. Работа со строками...................................................................

36

6.

ЛАБОРАТОРНАЯ РАБОТА №3. Массивы............................

44

 

6.1. Цель работы..............................................................................

44

 

6.2. Постановка задачи....................................................................

44

 

6.3. Требования к оформлению отчета..........................................

49

 

6.4. Рекомендации по выполнению работы..................................

50

7.

ЛАБОРАТОРНАЯ РАБОТА №4. Работа со строками...........

53

 

7.1. Цель работы..............................................................................

53

 

7.2. Постановка задачи....................................................................

53

 

7.3. Требования к оформлению отчета..........................................

56

8.

КОНТРОЛЬНЫЕ ВОПРОСЫ..................................................

57

9.

ЛИТЕРАТУРА.........................................................................

58

3

1. МАССИВЫ

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

Отдельная единица данных, входящая в состав массива, называется элементом массива. Доступ к элементам массива осуществляется по их порядковому номеру. Все элементы массива относятся к одному типу данных и имеют одинаковый размер.

1.1. Объявление и инициализация массива

Использованию массива в программе предшествует его объявление, резервирующее под массив определенное количество памяти. При объявлении массива следует указать его имя, размер (количество элементов) и тип элементов:

тип_данных имя_массива[количество_элементов];

Следует отметить, что размер массива не может быть изменен в процессе работы программы.

В следующем примере объявляется массив, состоящий из 10 элементов типа int:

int M[10];

Размер массива определяется некоторой целочисленной константой. Переменные величины не могут использоваться для задания размера массива (допускается лишь использование именованных констант).

int A[100]; // Допустимое объявление массива

const int b_size = 100;

int B[b_size]; // Допустимое объявление // массива

4

int c_size = 100;

int C[c_size]; // Ошибка!!!

// c_size не является константой

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

int Q[3] = {100, 200, 300};

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

int R[] = {100, 200, 300}; // 3 элемента

1.2. Доступ к элементам массива

Обращение к элементу массива осуществляется по имени массива и порядковому номеру элемента – индексу. Индекс указывается в квадратных скобках после имени массива. При этом нумерация элементов массива начинается с нуля.

Индекс элемента не должен превышать фактическое количество элементов в массиве. В противном случае, возможны непредсказуемые ошибки в процессе работы программы.

Элементы массива можно использовать в программе таким же образом, как и обычные переменные: они могут участвовать выражениях, указываться в качестве параметров при вызове функций, и изменять свое значение при помощи операторов присваивания, инкремента/декремента и т.п.

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

5

Пример 1:

int Q[] = {100, 200, 300}; cout << Q[0]; // 100

cout << Q[1]; // 200 cout << Q[2]; // 300

Пример 2:

int Q[3]; Q[0] = 100; Q[1] = 200; Q[2] = 300;

cout << Q[0]; // 100 cout << Q[1]; // 200 cout << Q[2]; // 300

Пример 3:

int Q[3] = {100, 200, 300}; for (int i=0; i<3; i++)

cout << Q[i] << " ";

В следующем примере мы вычислим сумму элементов массива M:

int M[5] = {1, 2, 3, 4, 5}; int sum = 0;

for (int i=0; i<5; i++) sum += M[i];

cout << sum; // 15

1.3. Рабочий размер массива

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

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

6

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

В следующей программе мы вычислим сумму элементов массива M, имеющего фактический размер 100 элементов. Рабочий размер массива и значения его элементов определяются пользователем в процессе работы программы.

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

using namespace std;

void main()

{

//Фактический размер массива М const int phys_size = 100;

//Рабочий размер массива М int work_size = 0;

//Массив M

int M[phys_size];

// Определяем рабочий размер массива cout << "Введите количество элементов: "; // Ввод значения work_size с клавиатуры cin >> work_size;

7

// Проверяем значение work_size

if (work_size<=0 || work_size>phys_size)

cout << "Ошибочный размер массива";

else

 

 

 

 

 

{

 

 

 

 

 

// Вводим значения элементов массива

for (int i=0; i<work_size; i++)

{

cout << "Введите значение элемента "

 

 

 

<< i+1 << ": ";

}

cin >> M[i];

 

 

 

 

 

 

// Определяем сумму элементов массива

int sum = 0;

 

 

for (int i=0; i<work_size; i++)

 

sum += M[i];

 

// Выводим результат на экран

cout << "СУММА ЭЛЕМЕНТОВ МАССИВА: " << sum;

}

 

 

 

 

 

getch(); // Ожидаем нажатия на любую клавишу

}

 

 

 

 

 

1.4. Многомерные массивы

Массивы, рассмотренные нами выше, являются

одномерными. В общем случае, массивы могут иметь

несколько измерений.

 

 

Многомерный массив – это массив, элементами

которого являются массивы.

Двумерный

массив

массив

 

одномерных

массивов

может

быть

представлен

как

матрица,

состоящая

из

строк

и

столбцов,

на

пересечении

которых

 

размещаются

значения (рис. 1).

 

 

Рисунок 1. Двумерный массив

 

 

 

 

 

8

Трехмерный

массив

 

массив двумерных массивов –

 

может быть

представлен

как

 

множество

 

одинаковых

 

матриц или как куб (рис. 2).

 

При

 

объявлении

 

многомерного

массива

в

 

отдельных

 

квадратных

Рисунок 2. Трехмерный

скобках

для

каждого

измерения

 

указывается

массив

 

 

количество элементов:

double A[3][5]; // Двумерный массив 3х5 int B[3][2][4]; // Трехмерный массив 3х2x4

char C[10][10][10][10][10]; // Пятимерный массив // 10х10х10х10х10

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

int A[3][5]; A[0][0] = 1; A[0][1] = 2; A[1][0] = 3;

При

объявлении

многомерного

 

массива

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

возможна

 

его

 

 

 

 

 

 

 

инициализация.

 

 

 

 

 

 

 

 

Многомерные

массивы

 

 

 

 

 

 

 

инициализируются

со

 

 

 

 

 

 

 

 

 

 

 

 

 

 

стороны

 

правой

 

 

размерности:

 

Рисунок 3. Двумерный

 

 

 

массив A[3][5]

9