Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
933 Кб
Скачать
☆

Передача скаляров Возвращаемое значение

C Указание типа в заголовке функции обязательно. В подпрограммах для указания типа возвращаемого значения (которого нет) используется ключевое слово void. См. выше.

Пример.

float max(float a, float b){

........................

}

Basic

Тип возвращаемого значения в функциях надо указывать всегда. Если он не указан, то функция возвращает тип Object, который будет рассмотрен в другом разделе. Синтаксис подпрограмм такого указания не требует.

Входные данные

C

Перед передачей входные аргументы, если требуется, преобразуются в соответствии с прототипом.

Пример.

Вызывающая процедура Вызываемая процедура

float a, max(float, float); float max(float a, float b){

int b; …………………………..

.................. }

y=2+3.5*max(a, b); // Целая переменная b преобразуется к типу float

Basic

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

Пример.

Function Max(ByVal a As Double, ByVal b As Double) As Double

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

Пример.

y=2+3.5*Max((a), (b))

Выходные данные

C

Поскольку в языках C и C++ по умолчанию реализована передача аргументов по значению, то для того, чтобы в вызываемой процедуре можно было изменять значение аргумента, туда необходимо передавать адрес области памяти, где хранится аргумент. При этом функция не может изменить этот адрес, а содержание может. Для получения адреса используется оператор &. Следовательно, соответствующий параметр – указатель!!!

Пример. Дана матрица {aij}, i,j=1...10. Найти max{aij} и его индексы.

float maxmatr(int m, int n, float a[ ][10], int *k, int *l){

float max;

int i, j;

max = a[0][0];

for(*k=*l=i=0; i<m; i++){

for(j=0; j<n; j++){

if(max<a[ i ][ j ]){max=a[ i ][ j ]; *k=i; *l=j; }

}

}

return max;

}// End maxmatr

Соответствующий фрагмент вызывающей процедуры имеет вид:

float maxmatr(int, int, float a[ ][10], int*, int* ), // Прототип

maxim, // Максимальный элемент

a[10][10]; // Исходная матрица

int m, n, // Ее размеры

str, col; // Индексы максимального элемента

..................................

maxim=maxmatr(m, n, a, &str, &col);

Употребление конструкции float a[ ][10] будет пояснено ниже.

Те же вычисления можно реализовать в виде подпрограммы.

void maxmatr( int m, int n,float a[ ][10], int *k, int *l, float *maxim){

.....................

Также надо изменить прототип, в определении процедуры везде заменить max на *max и убрать инструкцию return.

Пример.

Функция scanf: список данных – это выходные аргументы, поэтому при обращении надо использовать адреса (&), printf: список данных – входные аргументы, поэтому используются значения.

Basic

Перед выходными параметрами в заголовке процедуры надо записывать ключевое слово ByRef. Если изменить значение такого аргумента в вызываемой процедуре, то оно сохранится после возврата.

Пример.

Sub maxmatr(ByVal m As Integer, ByVal n As Integer, ByRef a( , ) As Single, _

ByRef k As Integer, ByRef l As Integer, ByRef max As Single)