Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Возврат значений из функций




 

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

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

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

 

void FillArray(double A[], int nA, double val)

{

int i;

for (i=0; i<nA; i++) A[i] = val;

}

 

void main (void)

{

double B[100];

FillArray(B, 40, 35.4);

/*... */

FillArray(&B[60], 20, 15.4);

/*... */

}

 

Первый вызов FillArray() заполняет 40 первых элементов массива B значением 35.4, второй вызов заполняет 20 элементов массива B, начиная с элемента B[60], значением 15.4. При возврате из функции массив будет изменен, т. к. занесение значения val происходит непосредственно по нужному адресу.

Эту же функцию можно использовать для заполнения строк двумерного массива:

 

void main (void)

{

double a[10][20];

int n = sizeof(a) / sizeof(a[0]);

int m = sizeof(a[0]) / sizeof(a[0][0]);

int i;

/*... */

for(i=0; i<n; i++)

FillArray(a[i], m, 14.6);

/*... */

}

 

В примере следует обратить внимание на соответствие типов передаваемых параметров и на способ вычисления числа строк и числа столбцов двумерного массива.

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

 

void Decart(double *px, double *py, double r, double f)

{

(*px) = r * cos(f);

(*py) = r * sin(f);

}

При обращении к данной функции для параметров px и py нужно передавать адреса:

void main(void)

{

double x, y, r=5, f=0.5;

/*... */

Decart(&x, &y, r, f);

/*... */

}

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

 

Рекурсия

В языке Си функция может вызывать сама себя. При рекурсивном обращении функции к самой себе в каждом вызове создается новый экземпляр всех автоматических пременных, и он совершенно не зависит от предыдущего. Следующий пример использует рекурсию для вычисления к!. При первом вызове fact(i), если не равно 0, функция порождает выражение i*fact(i-1); в свою очередь вызов fact(i-1) производит (i-1)*fact(i-2), что вместе с ранее полученным результатом дает i*(i-1)*fact(i-2). Рекурсия закончится, как только очередной вызов функции получит аргумент, равный единице. Нетрудно сообразить, что в конечном счете мы получим требуемое произведение.


long fact(int k)
{

if (k==0)

return 1;
else
return(k*fact(k-1));
}

Задание

 

1) Из заданных N предметов выбрать такие, чтобы суммарный вес был менее 30 кг, а стоимость – наибольшей. Напечатать суммарную стоимость.

Дополнительно – напечатать номера выбранных предметов. Учесть случаи, когда один и тот же вид предмета можно брать несколько раз, и когда каждый предмет должен быть представлен в единичном варианте.

 

 

2) Дан лабиринт размером NxN. Каждая клетка лабиринта может быть пуста (значение элемента A[i][j]=0) или занята (значение 1). Ходить по лабиринту можно только вверх, вниз, влево, вправо, если соответствующая клетка не занята. Требуется найти кратчайший путь (число ходов) из точки (1;1) в точку (N;N).

Дополнительно – напечатать последовательность ходов.

 

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных