Programmirovanie_-_1_kurs / Методические указания к лабораторным работам 3-4
.pdfФГБ ОУ ВПО «Московский государственный университет путей сообщения»
Кафедра «Автоматизированные системы управления»
А.В. ВАРФОЛОМЕЕВ
ЯЗЫК 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