Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке Си. Учебное пособие для СПО
.pdf
Функцию только с необъявленными параметрами, в принципе,
определить можно, но выбрать параметры будет затруднительно, т. к.
макроопределения для работы с необъявленными параметрами используют имя
последнего объявленного формального параметра.
Внутри функции программист сам отвечает за выбор из стека
дополнительных параметров. Для работы с ними используются
макроопределения 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;
}
101

/* складывается до 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”);
….
102

#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
}
103

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

ЛИТЕРАТУРА
1. Поляков, А. Ю. Программирование : практикум / А. Ю. Поляков,
А. Ю. Полякова, Е. Н. Перышкова. — Новосибирск : Сибирский
государственный университет телекоммуникаций и информатики,
2015. — 55 c. — Текст : электронный // Цифровой образовательный
ресурс IPR SMART : [сайт]. — URL: https://www.iprbookshop.ru/
55494.html.
2. Перцев, И. В. Лабораторный практикум по дисциплине «Программирование» / И. В. Перцев ; Сиб. гос. ун-т телекоммуникаций и
информатики. — Новосибирск : СибГУТИ, 2017. — 37 с.
3. Баженова, И. Ю. Введение в программирование : учебное пособие /
И. Ю. Баженова, В. А. Сухомлин. — 3-е изд. — Москва : ИнтернетУниверситет Информационных Технологий (ИНТУИТ), Ай Пи Ар
Медиа, 2020. — 326 c. — ISBN 978-5-4497-0652-2. — Текст :
электронный // Цифровой образовательный ресурс IPR SMART :
[сайт]. — URL: https://www.iprbookshop.ru/97539.html.
4. Борисенко, В. В. Основы программирования : учебное пособие /
В. В. Борисенко. — 3-е изд. — Москва : Интернет-Университет
Информационных Технологий (ИНТУИТ), Ай Пи Ар Медиа, 2020. —
322 c. — ISBN 978-5-4497-0678-2. — Текст : электронный //
Цифровой образовательный ресурс IPR SMART : [сайт]. — URL:
https://www.iprbookshop.ru/97568.html.
5. Устинов, В. В. Основы алгоритмизации и программирование.
Часть 2 : конспект лекций / В. В. Устинов. — Новосибирск :
Новосибирский государственный технический университет, 2013. —
32 c. — ISBN 978-5-7782-2337-0. — Текст : электронный // Цифровой
образовательный ресурс IPR SMART : [сайт]. — URL: https://
www.iprbookshop.ru/44675.html.
105
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
