Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке Си. Учебно-методическое пособие
.pdf
101
Функцию только с необъявленными параметрами, в принципе,
определить можно, но выбрать параметры будет затруднительно, т. к.
макроопределения для работы с необъявленными параметрами используют имя
последнего объявленного формального параметра.
Внутри функции программист сам отвечает за выбор из стека
дополнительных параметров. Для работы с ними используются
макроопределения va_arg, va_start и va_end, определённые в файле stdarg.h.
Примеры
#include <stdio.h>
#include <conio.h>
#include <stdarg.h>
void print(char *format, ...);
int main() {
int a = 45, b = 65;
double f = 2.75;
print("dfc", a, f, b);
}
void print(char * format, ...) {
va_list ar; int n, i; double f;
va_start(ar, format);
for (i = 0; format[i]; i++)
switch(format[i]) {
case 'd': n = va_arg(ar, int); printf("%d\n", n); break;
case 'f': f = va_arg(ar, double); printf("%lf\n", f); break;
case 'c': n = va_arg(ar, int); printf("%c\n", n); break;
}
va_end(ar);
}
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
/*складывается k аргументов */
int sum1(int k,...)
{
va_list ar;
int s = 0;
va_start( ar, k );
while( k-- > 0 )
s += va_arg( ar, int );
va_end(ar);
return s;
}

102
/* складывается до 0 */
int sum2(int arg,...)
{
va_list ar;
int s = arg;
int n;
va_start( ar, arg );
while( n = va_arg( ar, int ) )
s += n;
va_end(ar);
return s;
}
int main(int argc, char *argv[])
{
int s1 = sum1( 10/*кол*/, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 );
int s2 = sum2( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0/*конец*/ );
printf( "s1 = %d; s2 = %d;\n", s1, s2 );
return 0;
}
Условные макрокоманды и макрокоманды с параметром
Макроопределение с параметром – может использоваться как замена функции.
#define max(a,b) ((a)>(b)?(a):(b))
cout<<max(x,y)<<endl;
Никаких вычислений не происходит, только подстановка.
Условные макроопределения #if, #else, #elif #endif #ifdef #ifndef
позволяют компилировать программу выборочно, в зависимости от некоторых
условий.
#define N_LAB 1
main() {
#if N_LAB == 1
puts(“lab1”);
….
#elif N_LAB== 2
puts(“lab2”);
….

103
#else
….
#endif
}
Пример
#define NAME "a.txt"
int main(){
#ifdef NAME
char name[]=NAME;
#else
char name[80];
cin>>name;
#endif
cout<<name<<endl;
}
пример
#define _VER_ "ver 1.0"
#define ZADANIE 1
#define pr(x) printf("rez = %6.3f\n",x)
#define N 11
float m[N];
main(){
#ifdef _VER_
printf("%s\n",_VER_);
#endif
for(int i=0; i<N; i++) m[i]=0.31415*i;
#if ZADANIE==1
puts("ZADANIE 1");
for(int i=0; i<N; i++) pr(sin(m[i]));
#elif ZADANIE==2
puts("ZADANIE 2");
for(int i=0; i<N; i++) pr(cos(m[i]));
#else
puts("invalid number task");
#endif
}

104
Контрольные вопросы
Для чего используется перегрузка функций?
Что такое шаблон функции?
Для чего используются макроопределения с параметром и условное
макроопределение?
Для чего используются указатели на функцию?
Что такое Array и Vector?

105
ЛИТЕРАТУРА
1. Поляков А.Ю. Программирование [Электронный ресурс]:
практикум/ Поляков А.Ю., Полякова А.Ю., Перышкова Е.Н. –
Электрон. текстовые данные. – Новосибирск: Сибирский
государственный университет телекоммуникаций и информатики,
2015. – 55 c. – Режим доступа: http://www.iprbookshop.ru/55494.–
ЭБС «IPRbooks».
2. Перцев И.В. Лабораторный практикум по дисциплине
«Программирование» / И. В. Перцев ; Сиб. гос. ун-т
телекоммуникаций и информатики. - Новосибирск : СибГУТИ,
2017. - 37 с.
3. Баженова И.Ю. Введение в программирование [Электронный
ресурс]: учебное пособие/ Баженова И.Ю., Сухомлин В.А.–
Электрон. текстовые данные. – М.: БИНОМ. Лаборатория знаний,
Интернет-Университет Информационных Технологий (ИНТУИТ),
2007. – 326 c. – Режим доступа: http://www.iprbookshop.ru/22400.–
ЭБС «IPRbooks».
4. Борисенко В.В. Основы программирования [Электронный ресурс]/
Борисенко В.В. – Электрон. текстовые данные. – М.: ИнтернетУниверситет Информационных Технологий (ИНТУИТ), 2016. –
323 c. – Режим доступа: http://www.iprbookshop.ru/52206. – ЭБС
«IPRbooks».
5. Устинов В.В. Основы алгоритмизации и программирование. Часть
2 [Электронный ресурс]: конспект лекций/ Устинов В.В.– Электрон.
текстовые данные. – Новосибирск: Новосибирский
государственный технический университет, 2013. – 32 c. – Режим
доступа: http://www.iprbookshop.ru/44675. – ЭБС «IPRbooks».

106
Учебное издание
Перцев Игорь Владимирович
Программирование на языке Си
Корректор И.Л. Гончарова
Подписано в печать 15.03.2022, заказ № 133
п. л. 6,3, 106 стр., электронная версия – 1,22 Мб
Отдел рекламы и PR СибГУТИ
630102, г. Новосибирск, ул. Кирова, 86, офис 105
тел. (383) 269-83-56
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
