Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
YaP_laby.pdf
Скачиваний:
157
Добавлен:
31.05.2015
Размер:
915.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 7 ДИНАМИЧЕСКИЕ МАССИВЫ

Цель работы – научиться выделять и использовать динамическую память в процессе работы программы.

Заданиядлясамостоятельнойподготовки

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.

Языки программирования. Метод. указания по лаб. работам

-36-

ЛАБОРАТОРНАЯ РАБОТА № 7 ДИНАМИЧЕСКИЕ МАССИВЫ

Контрольные вопросы

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]

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)?

41.Дан кодa[n][m]. Что определяет значение переменной*(a +m*i + j)?

42.Дан код a[n][m]. Что определяет значение переменной a[i][j]?

Вариантызаданий

Обязательно использовать динамическую память.

1.Дополнить матрицу строкой, содержащей максимумы по столбцам.

2.Дополнить матрицу столбцом, содержащим максимумы по строкам.

3.Вычислить произведение двух матриц.

Языки программирования. Метод. указания по лаб. работам

-37-

ЛАБОРАТОРНАЯ РАБОТА № 7 ДИНАМИЧЕСКИЕ МАССИВЫ

Варианты заданий

4.Вычислить произведение матрицы на вектор.

5.Транспонировать матрицу.

6.Найти максимальный элемент матрицы.

7.По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующей строки.

8.По заданной матрице составить вектор, элементы которого равны суммам элементов соответствующего столбца.

9.По заданной матрице составить вектор, элементы которого равны произведениям элементов соответствующей строки.

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

11.Поменять местами строки матрицы с номерами i и j.

12.Поменять местами столбцы матрицы с номерами i и j.

13.В матрице найти строку, состоящую только из отрицательных чи-

сел.

14.Проверить матрицу на симметричность.

15.Проверить совпадение двух матриц.

16.Найти минимальный элемент матрицы.

17.Проверить, является ли матрица верхней треугольной.

18.Удалить из матрицы дублирующие строки.

19.Удалить из матрицы дублирующие столбцы.

20.Проверить, является ли матрица нижней треугольной.

21.Подсчитать количество различных элементов матрицы.

22.Вматриценайти столбец, состоящий только из отрицательных чисел.

23.Определить в матрице строку с наименьшей суммой элементов.

24.Определить в матрице столбец с наименьшей суммой элементов.

25.Заменить в матрице строку с номером i на сумму строк с номерами

iи j. Строку с номером j удалить.

26.Определить номер строки матрицы, в которой находится максимальная сумма элементов столбцов с номером k и l.

27.Определить в матрице строки, элементы которых расположены по возрастанию.

28.Определить в матрице строки, в которых отрицательных элементов больше, чем положительных.

29.Определить в матрице строки, в которых есть одинаковые элемен-

ты.

30.Определить в матрице строки, в которых все элементы разные.

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

Языки программирования. Метод. указания по лаб. работам

-38-

ЛАБОРАТОРНАЯ РАБОТА № 7 ДИНАМИЧЕСКИЕ МАССИВЫ

Примеррешениявариантазадания

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

Анализ задачи.

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-той строки матрицы.

printf(“\n”);

// Переводкурсоранановуюстрокумонитора.

}

 

getch(); }

 

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

void main()

{

int n, m; // Переменные для размера матрицы не определены.

Языки программирования. Метод. указания по лаб. работам

-39-

ЛАБОРАТОРНАЯ РАБОТА № 7 ДИНАМИЧЕСКИЕ МАССИВЫ

Пример решения варианта задания

int **a; // Определяем 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(); }

 

 

 

 

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

Несколько иначе обстоит дело, если динамическая память выделяется под матрицу как под одномерный массив (см. лекции методического комплекса). В этом случае принципиальной разницы между кодами программ также не существует, но изменяется формат доступа к элементам матрицы. Это означает, что для того чтобы перейти от программы 1 к программе с динамической памятью, надо все коды a[i][j] заменить на коды *(a + i*m + j), здесь a – указатель на первый элемент матрицы, а i*m + j – порядковый номер элемента матрицы (см. лекции методического комплекса).

Языки программирования. Метод. указания по лаб. работам

-40-

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]