Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_C-09(args)-2015.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
85.5 Кб
Скачать

Передача в функцию двумерного массива

Почти все рассуждения, которые относятся к передаче одномерного массива в функцию, остаются справедливыми и для двумерных массивов.

Исключение составляет тип данных формального параметра, соответствующего массиву.

Замечание

Для двумерных массивов (т.е. матриц) важнейшей характеристикой является количество элементов в строке (или столбцов матрицы). Действительно, 20 чисел можно представить в виде двумерного массива многими способами: 20*1, 10*2, 5*4, и т.д. Так как элементы массивов располагаются в памяти по строкам, то для однозначного описания структуры массива достаточно указать количество элементов в строке.

В Си имя массива — это указатель на тип элемента массива. Двумерный массив — это одномерный массив строк матрицы (тоже одномерных массивов). Поэтому имя двумерного массива — это указатель на строку матрицы, т.е. на массив из конкретного числа элементов.

Пример

В функцию f нужно передать единственный аргумент — двумерный массив arr2 чисел типа int. Размеры массива: 6 строк и 8 столбцов.

Тогда прототип функции должен будет выглядеть следующим образом (с точностью до имени формального параметра):

void f(int (*a)[8]);

Можно использовать также более простую для понимания синтаксическую форму с квадратными скобками:

void f(int a[][8]);

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

Замечания

1. Если в типе аргумента задать первый размер, то ошибки компиляции не будет, но для него нет никакого применения.

2. Двумерный массив — это одномерный массив строк матрицы. Поэтому в функции информация о количестве строк переданного ей двумерного массива теряется.

3. Конструкция (*a)[8] читается, как "указатель на массив из 8 элементов". Запись без скобок *a[8] в данном случае будет неправильной, так как определяет другой тип: "массив из 8 указателей".

ЗАДАНИЕ 4 (передача в функцию двумерного массива)

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

1. Функция main.

1.1. В функции main определен двумерный числовой массив arr2[][3] со значениями типа int. Массив инициализирован так, чтобы в нем было 4 полных строки (т.е. размеры 4*3). Инициализация массива неструктурированная.

1.2. С помощью sizeof определяется размер объекта arr2.

Используя этот размер и известное количество столбцов (их 3), подсчитать количество строк в массиве. Вывести на экран оба результата.

1.3. Выполнить вызов функции total2, передав ей

а) массив arr2,

б) количество строк в массиве.

2. Функция total2.

В функции total2 выполняются следующие действия.

2.1. С помощью sizeof определяется размер объекта, соответствующего формальному параметру-массиву, и этот размер выводится на экран.

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

2.2. С помощью вложенного цикла подсчитывается сумма элементов двумерного массива, которая возвращается функцией в main. Необходимое одному из операторов цикла количество элементов в строке массива указать числом (т.е. 3). В следующем задании будет разработан более универсальная программа.

Замечание

Количество элементов в строке массива через аргумент не передается. В функции его можно вычислить следующим образом. Пусть a2 обозначает формальный параметр, через который в функцию передается двумерный массив. По своему смыслу — это указатель на строку массива (т.е. на одномерный массив). Если к a2 применить операцию разадресации, то мы получим сам массив.

Теперь количество элементов в строке можно найти, если объем памяти, занимаемый строкой, поделить на размер одного элемента (sizeof(*a2)/sizeof(int)).

2.3 Проверить работу программы.

ЗАДАНИЕ 5 (универсальный вариант программы)

Разрабатывается другой вариант программы для задачи предыдущего задания. Для преобразований программы, сохранить файл задания 3 под другим именем.

1. Чтобы сделать функцию total2 более универсальной, критический для массива размер (число колонок) везде, где он встречается (в определении массива arr2, в определениях функции и прототипа, граничное значение в операторе цикла), задать с помощью именованной константы COLUMNS.

Определение константы COLUMNS выполнить в начале файла с помощью директивы

#define COLUMNS 3

Проверить работу программы.

Замечание

Использование именованной константы COLUMNS не только делает функцию total2 применимой для массивов с любой длиной строки, но и избавляет от необходимости вычислять в функции количество элементов в строке массива (см. предыдущий пункт).

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

2. Чтобы убедиться, что внутри функции total2 обрабатываются непосредственно элементы массива arr2, добавить в total2 (перед оператором возврата) обнуление элементов первой строки массива.

В функции main добавить после вывода на экран подсчитанной вывод значений элементов первой строки массива arr2.

3. Изменить значение COLUMNS на 4, затем на 6 (это можно, в массиве 12 элементов!) Убедиться, что сумма подсчитывается правильно, а количество выведенных обнуленных элементов меняется соответственно размеру.

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