ТОР 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). Рекурсия закончится, как только очередной вызов функции получит аргумент, равный единице. Нетрудно сообразить, что в конечном счете мы получим требуемое произведение.
if (k==0) return 1; Задание
1) Из заданных N предметов выбрать такие, чтобы суммарный вес был менее 30 кг, а стоимость – наибольшей. Напечатать суммарную стоимость. Дополнительно – напечатать номера выбранных предметов. Учесть случаи, когда один и тот же вид предмета можно брать несколько раз, и когда каждый предмет должен быть представлен в единичном варианте.
2) Дан лабиринт размером NxN. Каждая клетка лабиринта может быть пуста (значение элемента A[i][j]=0) или занята (значение 1). Ходить по лабиринту можно только вверх, вниз, влево, вправо, если соответствующая клетка не занята. Требуется найти кратчайший путь (число ходов) из точки (1;1) в точку (N;N). Дополнительно – напечатать последовательность ходов.
Не нашли, что искали? Воспользуйтесь поиском:
|