Методические указания к лабораторным работам по дисциплине «Технология и методы программирования». Карпеев Д.О., Куликов С.С
.pdfФГБОУ ВПО «Воронежский государственный технический университет»
Кафедра систем информационной безопасности
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторным работам по дисциплине «Технология и методы программирования» для студентов специальности
090303 «Информационная безопасность автоматизированных систем»
очной формы обучения
Воронеж 2014
Составители: канд. техн. наук Д.О. Карпеев, канд. техн. наук С.С. Куликов
УДК 004.056.5
Методические указания к лабораторным работам по дисциплине «Технология и методы программирования» для студентов специальности 090303 «Информационная безопасность автоматизированных систем» / ФГБОУ ВПО «Воронежский государственный технический университет»; сост. Д.О. Карпеев, С.С. Куликов. Воронеж, 2014. 33 с.
Методические указания содержат материал для студентов по выполнению 4 лабораторных работ по следующим темам: «Динамические массивы», «Структуры», «Односвязные списки», «Двусвязные линейные списки».
Методические указания подготовлены в электронном виде в текстовом редакторе MS Word 2013 и содержатся в файле Куликов_ЛР_Технология и методы программирования.pdf.
Библиогр.: 7 назв.
Рецензент д-р техн. наук, проф. А.Г. Остапенко
Ответственный за выпуск зав. кафедрой д-р техн. наук, проф. А.Г. Остапенко
Издается по решению редакционно-издательского совета Воронежского государственного технического университета
© ФГБОУ ВПО «Воронежский государственный технический университет», 2014
Лабораторная работа №1 Динамические массивы
Цель работы - научиться выделять и использовать динамическую память в процессе работы программы.
Задания для самостоятельной подготовки :
1. Изучить:
а) правила использования динамической памяти; б) указатель и его назначение; в) формат определения указателя;
г) способы инициализации указателя; д) операции над указателями; е) связь массива с указателем;
ж) способы доступа к элементам массива через указатель;
з) оператор косвенного доступа.
2.Разработать алгоритм решения в соответствии с за-
данием.
3.Составить программу решения задачи.
4.Подготовить тестовый вариант программы и исходных данных.
Контрольные вопросы :
1.Указать основные правила организации вложенных
циклов.
2.Указать способы выхода из внутреннего цикла.
3.Как организовать вывод матрицы в общепринятом
виде?
4.Как организовать вывод нижней треугольной матрицы в в общепринятом виде?
5.Как организовать ввод матрицы размером N x M эле-
ментов?
6.Что такое указатель?
7.Как объявить указатель заданного типа с именем p?
8.Можно ли инициализировать указатель кодом int *p
= 0 ?
9.Можно ли инициализировать указатель кодом int *p
=NULL ?
10.Дан код int *p. Объясните результат выполнение ди-
рективы p = new int;
11.Дан код int *p. Объясните результат выполнения ди-
ректив:
p = new int; p = new int; p = new int; p = new int; p = new int;
12.Дан код int *p. Можно ли записать следующий оператор: p = p + 5;
13.Дан код int *p. Объясните результат выполнения ди-
рективы cout << *p.
14.Чем отличается указатель типа int от указателя типа
float.
15.Дан код int x = 2; Можно ли записать директиву cout << *(&x) и если да, то какой результат появится на экране.
16.Дан код int x[10]. Объясните результат выполнения кода cout << x.
17.Дан код int x[10]. Можно ли записать выражение x – &x[5] и если да, чему равно значение данного выражения.
18.Дан код int *p, x[10]; Можно ли записать p = x.
19.Даны коды int *p, x[10]; p = x; Можно ли записать
p++, x++.
20.Дан код int x[10], i. Объясните результат выполне-
ния кода cout << (x+i).
21.Дан код int x[10], i. Чему равен результат выражения
*(x+i) == x[i].
22.Дан код int x[10], i. Чему равен результат выражения
*(x+i) < x[i]
2
23.Дан код int *p. Объясните результат выполнения ди-
рективы cout << p.
24.Дан код int x[10], i.Чему равен результат выражения
(x+i) < &x[i]
25.Дан код int *x[10]. Объясните результат выполнения данного кода.
26.Как связано понятие указателя с понятием косвенного доступа к информации?
27.Связь двумерного массива с указателем.
28.Дан код int a[9][9], i. Можно ли в тексте программы использовать выражение a < a[i].
29.Являются ли однотипными значения переменных *a[i] и a[i][k] при допустимых значениях i и k.
30.Дан код int a[5][5]. Можно ли использовать в тексте выражение a == a[0] и если да, чему равно значение данного выражения.
31.Дан код int a[5][5]. Можно ли записать выражение a < a[3] и если да чему равно значение данного выражения.
32.Дан код int a[9][9]. Что определяет код a[2]+7?
33.Дан код int a[9][9]. Что определяет код *(a[3]+5)?
34.Дан код int a[9][9]. Равны ли значения переменных
(a +3*9 +4), (a[3]+4), &a[3][4].
35.Дан код int a[9][9]. Можно ли записать выражение a[5]+4 -&a[6][4] и если да, чему будет равно значение этого выражения.
36.Дан код a[n][m]. Идентичны ли записи &a[i][j], a[i]+j, a+i*m+j?
37.Дан код a[n][m]. Что определяет значение перемен-
ной &a[i][j]?
38.Дан код a[n][m]. Что определяет значение перемен-
ной a[i] + j?
39.Дан код a[n][m]. Что определяет значение перемен-
ной a +m*i + j?
40.Дан код a[n][m]. Что определяет значение перемен-
ной *(a[i] + j)?
3
41.Дан код a[n][m]. Что определяет значение перемен-
ной *(a +m*i+ j)?
42.Дан код a[n][m]. Что определяет значение перемен-
ной a[i][j]?
Варианты заданий :
При выполнении заданий необходимо обязательно использовать динамическую память.
1.Дополнить матрицу строкой, содержащей максимумы по столбцам.
2.Дополнить матрицу столбцом, содержащим максимумы по строкам.
3.Вычислить произведение двух матриц.
4.Вычислить произведение матрицы на вектор.
5.Транспонировать матрицу.
6.Найти максимальный элемент матрицы.
7.По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующей строки.
8.По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующего столбца.
9.По заданной матрице составить вектор, элементы которого равны произведениям элементов соответствующей строки.
10.По заданной матрице составить вектор, элементы которого равны произведениям элементов соответствующего столбца.
11.Поменять местами строки матрицы с номерами i и j.
12.Поменять местами столбцы матрицы с номерами i и
j.
13.В матрице найти строку, состоящую только из отрицательных чисел.
14.Проверить матрицу на симметричность.
15.Проверить совпадение двух матриц.
16.Найти минимальный элемент матрицы.
4
17. Проверить, является ли матрица верхней треуголь-
ной.
18.Удалить из матрицы дублирующие строки.
19.Удалить из матрицы дублирующие столбцы.
20.Проверить, является ли матрица нижней треуголь-
ной.
21. Подсчитать количество различных элементов мат-
рицы.
22.В матрице найти столбец, состоящий только из отрицательных чисел.
23.Определить в матрице строку с наименьшей суммой элементов.
24.Определить в матрице столбец с наименьшей суммой элементов.
25.Заменить в матрице строку с номером i на сумму строк с номерами i и j. Строку с номером j удалить.
26.Определить номер строки матрицы, в которой находится максимальная сумма элементов столбцов с номером k и l.
27.Определить в матрице строки, элементы которых расположены по возрастанию.
28.Определить в матрице строки, в которых отрицательных элементов больше, чем положительных.
29.Определить в матрице строки, в которых есть одинаковые элементы.
30.Определить в матрице строки, в которых все элементы разные.
Решение задач с динамической памятью ничем не отличается от решения задач со статической памятью. Поэтому если студент не овладел навыками для выделения динамической памяти, то он совершено спокойно может решать задачу, не используя понятие динамической памяти. Перейти от одного вида памяти к другой простая формальность, которая почти не влияет на структуру программы.
5
Пример решения варианта задания:
Дана матрица, используя динамическую память, составить программу ввода элементов матрицы с клавиатуры и вывод ее на экран монитора.
Анализ задачи.
1. Начальные данные:
а) переменные n и m, которые задают размер матрицы; б) переменная a, которая является указателем на ука-
затель для выделения динамической памяти;
в) переменные i и j для индексов строк и столбцов матрицы.
2. Результаты вычисления:
а) для матрицы выделяется динамическая память; б) в память для матрицы с клавиатуры введены числа.
3. Решаем данную задачу для матрицы с заранее определенного размера.
Программа 1. void main()
{
const n = 4, m = 5; int a[n][m];
int i,j; clrscr();
cout << “Введи элементы матрицы:\n”; for ( i = 0; i <= n-1; i++ )
for ( j = 0; j <= m-1; j++)
{ printf("a[ %d, %d ]= ", i, j); // Поясняющий текст. scanf( " %d", &a[i][j] ); }
cout << “Введена матрица:\n”; for ( i = 0; i <= n-1; i++ )
{for ( j = 0; j <= m-1; j++)
printf("%d ",a[i][ j]); // Вывод элемента i-той строки
// матрицы.
6
printf(“\n”); // Перевод курсора на новую строку монитора.
}
getch(); }
4. Решаем задачу для матрицы, размер которой определяется во время работы программы (для динамической матрицы). void main()
{
int n, m; int **a;
int i,j; clrscr();
cout << “Введи количество строк и количество столбцов матрицы: ”;
cin >> n >> m; // Вводится размер матрицы.
a = new int *[n]; // Выделяется память под массив указателей. for ( i = 0; i < n; i++)
a[i] = new int[m]; // Выделяется память под элементы i-той строки
cout << “Введи элементы матрицы:\n”; for ( i = 0; i <= n-1; i++ )
for ( j = 0; j <= m-1; j++)
{ printf("a[ %d, %d ]= ", i, j); // Поясняющий текст. scanf( " %d", &a[i][j] ); }
cout << “Введена матрица:\n”; for ( i = 0; i <= n-1; i++ )
{ for ( j = 0; j <= m-1; j++)
printf("%d ",a[i][ j]); // Вывод элемента i-той строки
// матрицы.
printf(“\n”); // Перевод курсора на новую строку монитора.
}
getch(); }
Комментарий. Сравним решения одной и той же задачи, которые отличаются друг от друга технологией выделения
7
памяти. В программах жирным шрифтом обозначены коды, по которым эти программы не совпадают. Из сравнения видно, что никакой принципиальной разницы между программами не существует. Несколько иначе обстоит дело, если динамическая память выделяется под матрицу как под одномерный массив (см. лекции методического комплекса). В этом случае принципиальной разницы между кодами программ также не существует, но изменяется формат доступа к элементам матрицы. Это означает, что для того чтобы перейти от программы 1 к программе с динамической памятью, надо все коды a[i][j] заменить на коды *(a + i*m + j), здесь a – указатель на первый элемент матрицы, а i*m + j – порядковый номер элемента матрицы (см. лекции методического комплекса).
8