Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 2 (СПбГУТ).doc
Скачиваний:
47
Добавлен:
10.09.2019
Размер:
801.79 Кб
Скачать

2.7.4. Создание нового массива копированием положительных элементов из исходного массива

Постановка задачи. Имеется массив in, состоящий из n элементов типа double. Требуется создать новый массив out, скопировав в него все положительные элементы массива in.

Решение. Выберем для функции имя copy_pos_elems_arr. Входными данными для функции являются: неизменяемый массив in и количество его элементов n. Выходными данными должны быть: создаваемый массив out и его количество элементов. Массив придется возвращать через параметр функции, а количество элементов выходного массива можно вернуть через возвращаемое значение функции. Входные данные следует передать в функцию через ее параметры. В теле функции нужно объявить счетчик положительных элементов и организовать арифметический цикл. В цикле должна присутствовать инструкция if для выделения положительных элементов, их копирования и подсчета.

Программный код разработанной функции.

int copy_pos_elems_arr(const double in[], int n, double out[]) { int n_pos = 0;//n_pos – счетчик положительных элементов for(int i = 0; i < n; i++) { if(in[i] > 0) { out[n_pos++] = in[i];//требуется постинкремент } } return n_pos; }

2.7.5. Значения наибольшего и наименьшего элементов массивов

Постановка задачи. Имеется одномерный массив, состоящий из n элементов типа double. Требуется вычислить максимальное и минимальное значения элементов этого массива.

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

Вариант 1. Две пользовательские функции.

Интерфейс функций. Имена функций, отражающие целевое назначение функций: max_arr и min_arr. Входные данные – неизменяемый массив и количество элементов массива. Для каждой функции результат вычислений является скаляром, его можно вернуть в точку вызова через возвращаемое значение функции.

Реализация функций. В теле каждой из функций должен быть организован арифметический цикл для просмотра элементов массива. До входа в цикл необходимо объявить вспомогательную переменную. Назовем ее max для первой функции (min – для второй). Эта переменная после просмотра всех элементов массива должна содержать искомый результат. При своем объявлении эта переменная может быть инициализирована значением первого элемента массива, тогда начальным значением счетчика цикла должна быть 1. В теле цикла переменная max (min) должна сравниваться со значением текущего элемента массива. Если ar[i] > max (ar[i] < min), необходимо выполнить присваивание max = ar[i] (min = ar[i]). В конце тела функции надо вернуть окончательное значение переменной max (min)

Программный код разработанных функций.

double max_ar(const double ar[], int n) { double max = ar[0]; for(int i =1; i < n; i++) if(ar[i] > max) max = ar[i]; return max; }

double min_ar(const double ar[], int n) { double min = ar[0]; for(int i =1; i < n; i++) if(ar[i] < min) min = ar[i]; return min; }

Вариант 2. Одна пользовательская функция, для вычисления максимального и минимального значений элементов массива.

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

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

double max_min_arr(const double ar[], int n, double* pmin) { double max = ar[0]; *pmin = ar[0];

for(int i = 1; i < n; i++) { if(ar[i] > max) max = ar[i]; if(ar[i] < *pmin) *pmin = ar[i]; } return max; }

Программный код тестовой программы

#define MSIZE 20 int main(void) { double x[MSIZE] = {1, -2, 100, 50}; double mn; double mx = max_min_arr(x, 4, &mn); printf(“max = %0.4g min = %0.4g\n”, mx, mn); return 0;

}

Программа выводит ожидаемый результат:

max = 100 min = -2

Недостатком второго варианта решения является ухудшение повторного использования кода. Предположим, что у программиста в дальнейшем могут встречаться ситуации, когда необходимо будет вычислять либо только минимальное, либо только максимальное значение. Возникает вопрос, легко ли будет приспособить функцию max_min_arr() для таких вычислений. Если окажется ненужным максимальное значение, его можно игнорировать, т.е. работать с функцией, как будто она не имеет возвращаемого значения. Сложнее обстоит дело в том случае, когда ненужным будет минимальное значение. Дело в том, то игнорировать «ненужный» аргумент в вызове функции нельзя. Представляется, что программисту, который часто встречается с необходимостью вычислять максимальное и минимальное значения элементов массива целесообразно иметь все три варианта пользовательских функций.