Передача в функции переменного числа параметров
Иногда в функции требуется передавать некоторое число фиксированных параметров плюс неопределенное число дополнительных параметров. В этом случае заголовок функции имеет вид:
тип_имя_функции(список аргументов,...)
В данном случае список аргументов включает в себя конечное число обязательных аргументов (этот список не может быть пустым), после которого ставится многоточие на месте неопределенного числа параметров. Для работы с этими параметрами в файле stdarg.h определен тип списка va_list и три макроса: va_start, va_arg и va_end.
Макрос va_start имеет синтаксис:
void va_start(va_list ар, lastfix)
Этот макрос начинает работу со списком, устанавливая его указатель ар на первый передаваемый в функцию аргумент из списка с неопределенным числом аргументов. Параметр lastfix — это имя последнего из обязательных аргументов функции.
Макрос va_arg имеет синтаксис:
type va_arg(va_list ар, type)
Макрос возвращает значение очередного аргумента из списка. Параметр type указывает тип аргумента. Перед вызовом va_arg значение ар должно быть установлено вызовом va_start или va_arg. Каждый вызов va_arg переводит указатель ар на следующий аргумент.
Макрос va__end имеет синтаксис:
void va_end(va_list ар)
Макрос завершает работу со списком, освобождая память. Он должен вызываться после того, как с помощью va_arg прочитан весь список аргументов. В противном случае могут быть непредсказуемые последствия.
Рассмотрим пример. Пусть требуется создать функцию average, которая рассчитывает и отображает в метке Label1 среднее значение передаваемых в нее целых положительных чисел. Функция принимает в качестве первого аргумента некоторое сообщение, которое должно отображаться перед результатами расчета. Список обрабатываемых чисел может быть любой длины и заканчиваться нулем. Такая функция может быть реализована следующим образом;
#include <stdarg.h>
void average(AnsiString mess,,..)
{
double A = 0;
int i = 0, arg;
va_list ap;
va_start(ap, mess);
while ((arg = va_arg(ap,int)) != 0)
{
i++;
A += arg;
}
Form1->Label1->Caption = mess + "N = " + IntToStr(i) + ", среднее = " + FioatToStr(A/i);
va_end(ap);
}
Вызов функции может быть, например, таким:
average("Результаты экзамена: ",4,2,3,5,4,0);
В результате функция выдаст в метку Label1 сообщение:
Результаты экзамена: N = 5, среднее = 3,6
Функцию average можно было бы организовать иначе, не вводя специальную конечную метку в список (в приведенном примере — 0), а предваряя список аргументов параметром N, указывающим размер списка:
void average (AnsiStrinq moss, int N, ...)
{
double A = 0;
va_list ар;
va_start (ар, N);
for(int i = 0; i < N; i++)
{
A += va_arg(ap,int);
}
Form1->Label1->Caption = mess + "N = " + IntToStr(N) + ", среднее = " + FloatToStr(A/N);
va_end(ap);
}
Вызов функции может быть, например, таким:
average("Результаты экзамена: ",5,4,2,3,5,4);
Задания для лабораторной работы №2.
Разработать алгоритм, интерфейс пользователя и написать программу решения указанного варианта задания. При разработке интерфейса предусмотреть размещение на форме информации для пользователя, ввод исходных данных и вывод результатов вычисления в текстовые окна и метки.
Вариант 1. Разработать алгоритм, интерфейс пользователя и программу вычисления величины z по формуле:
x3/y, если y !=0;
z = “делитель равен 0”,если y=0.
Вариант 2. Разработать алгоритм, интерфейс пользователя и программу вычисления величины z по формуле:
z = x3/y, где y = sin(n*x+0,5).
Вариант 3. Разработать алгоритм, интерфейс пользователя и программу вычисления величины z по формуле:
sin(x) , если x<=a;
z = cos(x), если a< x<b;
tg(x), если x>=b.
Вариант 4. Разработать алгоритм, интерфейс пользователя и программу упорядочивания трех чисел: a, b, c.
Вариант 5. Разработать алгоритм, интерфейс пользователя и программу вычисления величины y по формуле:
ln(x), если x >=1
y = 1 , если x = 0;
ex, если x <=-1.
Вариант 6. Разработать алгоритм, интерфейс пользователя и программу, позволяющую найти квадрат наибольшего из двух чисел a и b. Вывести признак N =1, если наибольшим является a и признак N=2 в противном случае.
Вариант 7. Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить можно ли построить треугольник из трех отрезков длиной a , иb, c, вывести результат.
Вариант 8. Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить совпадает - ли конец отрезка с полярными координатами R и φ с точкой с координатами x1,y1.
Вариант 9. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить момент инерции различных типов профилей, (используйте оператор множественного выбора)
При k=1 I = (B*H3)/12;
При k=2 I = (B*H- b*h)3/12;
При k=3 I = (B*H3- b*h3)/12;
Вариант 10. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить площадь одной из геометрических фигур по выбору пользователя:
треугольника - по заданным основанию и высоте;
прямоугольника - по заданным длине и ширине;
трапеции - по заданным основаниям и высоте;
круга - по заданному радиусу.
При разработке интерфейса для предоставления права выбора использовать переключатели.
Вариант 11. На каждый день недели запланированы определенные работы. Разработать алгоритм, интерфейс пользователя и программу, позволяющую по введенному признаку дня недели вывести запланированное на этот день задание.
Вариант 12. Известно расписание занятий на день. Разработать алгоритм, интерфейс пользователя и программу, позволяющую по введенной паре часовых занятий вывести наименование занятий и номер аудитории.
Вариант 13. Разработать алгоритм , интерфейс пользователя и программу, позволяющую вычислить значение величины z по формуле:
|
a – b, при b >a
Вариант 14. Разработать алгоритм , интерфейс пользователя и программу, позволяющую вычислить значение величины z по формуле:
|
a – b +c, при b >a и c >a - b/
Вариант 15. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины z по формуле:
|
arctg(x), при b -1 >x >1.
Вариант 16. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины z по формуле:
|
|
a – b – c, при a > b и с< a- b или c< 0.
Вариант 17. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины z по формуле:
|x| при x<=1;
|
4 в других случаях.
Вариант 18. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины y по формуле. Для выбора варианта расчета использовать переключатели.
sin(x);
|
ex
Вариант 19. Дана окружность радиуса R с центром в точке с координатами x0, y0 . Разработать алгоритм, интерфейс пользователя и программу позволяющую определить, лежит ли точка с координатами x1, y1 внутри окружности.
Вариант 20. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины y по формуле:
bx-lg(bx) при bx<1;
|
e-bx + lg(bx).
Вариант 21. Дан квадрат с центром в точке с координатами x0, y0 и длиной стороны, равной a. Стороны параллельны осям 0x и 0y. Разработать алгоритм, интерфейс пользователя и программу, определить находится ли точка с заданными координатами x, y внутри прямоугольника.
Вариант 22. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины y по выбранной пользователем формуле:
1,5*cos2x;
|
(x-2)2+6;
3*tg(x).
Вариант 23. Дано кольцо с центром в начале координат. Радиус внешней окружности R и внутренней r, Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить находится ли произвольно заданная точка с координатами x, y в кольце либо внутри кольца.
Вариант 24. Генератор случайных чисел выдает целое число в диапазоне от 1 до 100. Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить является это число четным или не четным.
Вариант 25. Генератор случайных чисел выдает целое число в диапазоне от 1 до 100. Разработать, интерфейс пользователя алгоритм и программу позволяющую определить является это число четным, или делится на 3 или не делится ни на 2, ни на 3.
Вариант 26. Разработать алгоритм , интерфейс пользователя и программу, позволяющую вычислить значение величины y по формуле:
|
sin2√|y-x| при x>=y
Вариант 27. Разработать алгоритм, интерфейс пользователя и программу, которая вычисляет частное двух чисел. Программа должна проверять правильность введенных пользователем данных и, если они неверные (делитель равен нулю), вы давать сообщение об ошибке. «Вы ошиблись. Делитель не должен быть равен нулю».
Вариант 28. Разработать алгоритм, интерфейс пользователя и программу вычисления площади кольца. Программа должна проверять правильность исходных данных. «Ошибка! Радиус отверстия не может быть больше радиуса кольца».
Вариант 29. Разработать алгоритм, интерфейс пользователя и программу, позволяющую вычислить значение величины y по выбранной пользователем формуле:
|
a*lgx +√(x+1) при a<0 и x>π.
Вариант 30.Дни недели пронумерованы от 1 до 7. на каждый день записано какое - либо задание. Разработать алгоритм, интерфейс пользователя и программу, позволяющую по введенному номеру дня недели вывести предписанное задание.
Вариант 31.В прямоугольной системе координат из начала координат проведена прямая под углом к оси ОХ , равно φ. Координаты точки А (x >0, y>o). Разработать алгоритм, интерфейс пользователя и программу, позволяющую определить находится –ли точка А выше или ниже линии.
Лабораторная работа №3