Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania_po_C.pdf
Скачиваний:
48
Добавлен:
07.03.2015
Размер:
2.9 Mб
Скачать

имя_указателя_на_структуру -> имя_поля

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

typedef struct

 

 

 

{

//

Высота

прямоугольника.

int A;

int B;

//

Ширина

прямоугольника.

} ExampleStructType;

 

 

 

Функция должна умножить высоту прямоугольника на его ширину и вернуть результат. Исходный текст функции имеет следующий вид:

int ExampleFunc ( ExampleStructType *ExampleStruct)

{

return ExampleStructType->A * ExampleStructType->B;

}

9.1.7.Создание функции, выполняющей поиск линейного отрезка, на котором находится аргумент линеаризуемой функции, и вычисление ее (линеаризуемой функции) значения

Для для определения отрезка, на котором находится аргумент линеаризуемой функции, предполагается использовать одномерный константный массив, состоящий из элементов - структур типа LinearArrayType, содержащих параметры граничных точек отрезков линеаризации функции в порядке возрастания ее аргументов. Процесс создания такого массива рассмотрен далее в разделе 9.1.9. методических указаний.

Для передачи функции в качестве аргумента массива модно использовать следующее свойство массива - имя массива является указателем на первый элемент массива. Поэтому имя функции при его определении может иметь следующий вид (в случае, если тип используемых данных имеет тип float):

float MultyLinearFuncCalc ( float X, \

LinearArrayType const *PFuncArray, \

unsigned int FuncArraySize)

где:

Xаргумент линеаризуемой функции, для которой требуется вычислить ее значение;

PFuncArray

указатель на первый элемент массива - в него подставляется имя массива,

 

содержащего значения точек линеаризуемой функции;

FuncArraySize

размер (количество элементов) массива PFuncArray.

Массив, передаваемый функции в качестве аргумента, должен содержать значения граничных точек линейных отрезков линеаризуемой функции, взятые из таблиц 10 - 17 в соответствии с Вашим вариантом работы. Значения должны размещаться в массиве в порядке возрастания аргументов функции (то есть в том же порядке, в котором они приведены в таблице).

69

Определение отрезка, на котором находится аргумент функции, может быть выполнено простым перебором. Выполняется последовательное сравнение верхних границ линейных отрезков (то есть значений X полей входного массива, начиная с элемента массива с индексом 1) до

тех пор, пока не будет найден элемент, в котором значение поля X превышает значение аргумента

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

Для выполнения последовательного просмотра элементов массива необходимо использовать один из операторов цикла C. В C поддерживаются следующие операторы цикла:

1.Оператор итерационного цикла for.

2.Оператор цикла с предусловием while.

3.Оператор цикла с предусловием do while.

9.1.7.1. Оператор итерационного цикла for

Имеет следующую структуру:

for (инициализация_цикла; выражение_условие; список_выражений)

{

тело_цикла

}

где:

инициализация_цикла

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

выражение_условие

условие продолжения цикла. Если его результат не равен нулю

 

(истинен), выполняется очередной шаг цикла, если нет - цикл

 

завершается;

список_выражений

выражения, выполняемые на каждом шаге цикла после

 

выполнения тела цикла. Обычно используется для приращения

 

счетчика цикла.

тело_цикла

Операции, выполняемые на каждом шаге цикла.

Рассмотрим пример использования итерационного цикла. Имеется массив ExampleArray, определенный в пункте 9.1.9. Количество его элементов содержит переменная ArraySize (см. пункт 9.1.10.). Требуется просмотреть этот массив и найти элемент, значение поля A которого превышает значение переменной A1, определенной ранее и имеющей тип int.

...

// Счетчик циклов поиска.

unsigned int i;

for (i = 1; A1 > ExampleArray [i].A; )

// Цикл просмотра элементов массива. // Условием завершения цикла // является то, что значение

// очередной граничной точки отрезка // стало меньше, чем аргумент // функции в искомой точке.

70

 

//

Поиск выполняется не с элемента

 

//

0, а с элемента 1 массива -

 

//

верхней границы первого отрезка.

 

//

Никаких действий по

 

//

инкрементированию счетчика здесь

{

//

не выполняется.

 

 

// Тело цикла.

 

Приращение счетчика элементов

if (i < (ArraySize - 1)) i++; //

 

//

массива, если верхняя граница

 

//

последнего отрезка еще не

else break;

//

достигнута.

//

Завершение цикла, если выполнена

 

//

проверка верхней границы

}

//

последнего отрезка.

 

 

...

 

 

По завершении этого цикла переменная i будет содержать индекс элемента массива ExampleArray, поле A которого превышает значение переменной A1, либо максимально возможный индекс отрезка.

9.1.7.2. Оператор цикла с предусловием while

Имеет следующую структуру:

while (выражение_условие)

{

тело_цикла

}

Вначале проверяется выражение_условие. Если его результат не равен 0 (истенен), выполняется тело_цикла, в противном случае цикл завершается. По завершении выполнения тела цикла вновь проверяется выражение_условие.

Рассмотрим выполнение с помощью данного оператора того же примера, что и для оператора for (см. раздел 9.1.7.1.).

...

//

Определение переменной — счетчика

unsigned int i = 1;

 

//

циклов и присвоение ей начального

 

//

значения - индекса элемента

 

//

массива, содержащего верхнюю

 

//

границу первого линейного

while (A1 > ExampleArray [i].A)

//

отрезка.

//

Проверка условия завершения цикла

 

//

- обнаружения элемента массива,

 

//

значение поля A которого

{

//

превышает значение переменной A1.

 

 

// Тело цикла.

 

Приращение счетчика элементов

if (i < (ArraySize - 1)) i++; //

 

//

массива, если верхняя граница

 

//

последнего отрезка еще не

else break;

//

достигнута.

//

Завершение цикла, если выполнена

71

// проверка верхней границы // последнего отрезка.

}

...

9.1.7.3. Оператор цикла с постусловием do while

Имеет следующую структуру:

do

{

тело_цикла

} while (выражение_условие);

Цикл будет выполняться до тех пор, пока выражение условие не равно 0 (истинно).

Рассмотрим для данного оператора выполнение того же примера, что и для двух предыдущих операторов цикла (см. разделы 9.1.7.1., 9.1.7.2.).

...

//

Определение переменной — счетчика

unsigned int i = 0;

 

//

цикла, и присвоение ей начального

 

//

значения, на 1 меньшего индекса

 

//

массива для верхней точки первого

do

//

линейного отрезка.

 

 

{

 

 

// Тело цикла.

 

Приращение счетчика элементов

if (i < (ArraySize - 1)) i++; //

 

//

массива, если верхняя граница

 

//

последнего отрезка еще не

else break;

//

достигнута.

//

Завершение цикла, если выполнена

 

//

проверка верхней границы

 

//

последнего отрезка.

} while (A1 > ExampleArray [i].A); //

Проверка условия завершения цикла

 

//

- обнаружения элемента массива,

 

//

значение поля A которого

...

//

превышает значение переменной A1.

 

 

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

После определения отрезка, на котором находится аргумент линеаризуемой функции, исходный код функции MultyLinearFuncCalc должен вызвать функцию LinearFuncCalc

(см. пункт 5. задания, раздел 9.1.6. методических указаний). При вызове функции ей неободимо передать в качестве параметров указатели на структуры типа LinearArrayType (см. пункт 3.

задания) - элементы массива PFuncArray (см. пункт 6. задания), являющиеся крайними точками

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

имеющей следующий вид:

&переменная

72

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