Приклад 3.2
/* The program below illustrates passing a variable number of arguments using the following macros: va_start, va_arg, va_end, va_list */ #include <stdio.h> #include <conio.h> #include <stdarg.h> float average( int first, ... ); #include <varargs.h> float average( va_list ); //================= головна програма ================== int main( void ) { puts("function with a variable number of arguments"); /* Call with 3 integers (-1 is used as terminator). */ printf( "Average (2, 3, 4, -1) is: %f\n", average( 2, 3, 4, -1 ) ); /* Call with 4 integers. */ printf( "Average (5, 7, 9, 12, -1) is: %f\n", average( 5, 7, 9, 12, -1 ) ); /* Call with just -1 terminator. */ printf( "Average (-1 ) is: %f\n", average( -1 ) ); while(!kbhit()); //затримка зображення поки не натиснута будь-яка клавіша }
//======= Returns the average of a variable list of integers============ float average( int first, ... ) { //first - перший аргумент int count = 0; int sum = 0, i = first; va_list marker; va_start( marker, first ); /* Initialize variable arguments. */ while( i != -1 ) { sum += i; //накопичення суми аргументів count++; //розрахунок кількості аргументів i = va_arg( marker, int); //визначення наступного аргументу } va_end( marker ); /* Reset variable arguments. */ float rez=(float) sum / count; return ( sum ? rez : 0 ); }
Рис.3.2. Результати роботи програми застосування макросів обробки змінного числа параметрів
3.3. Варіанти завдань
Використовуючи директиви умовної компіляції, макровизначення, включення власних заголовних файлів для необхідних оголошень та інші директиви, скласти програму обчислення таких виразів. Функції max(), min(), визначення модуля виразів, виведення результатів, логічних виразів, піднесення до степеня, визначення коренів задати у вигляді макросів. Значення змінних задаються користувачем.
Самостійно визначити умови вибору такого виразу:
Самостійно визначити умови вибору такого виразу:
Самостійно визначити умови вибору такого виразу:
Самостійно визначити умови вибору такого виразу:
Використовуючи макроси обробки змінного числа параметрів, скласти програму введення-виведення та визначення суми довільної кількості чисел різних типів.
Використовуючи один і той самий ідентифікатор, оголосити масиви чисел і символів. Для масиву чисел визначити кількість повторень кожного числа. Для масиву символів знайти позицію і значення символа за заданим кодом символа. Передбачити умовну компіляцію. Початок і кінець функцій та блоків оформити у стилі мови Pascal, використовуючи begin і end.
Використовуючи макроси класифікації символів ASCII, визначити кількість кожних типів символів (алфавітні, цифрові, керуючий, знаки пунктуації та ін.) у процесі читання текстового файлу. Виділити цифрові символи із заданого користувачем діапазону за допомогою макросів assert().
Використовуючи макроси, задати три числа. Визначити площу трикутника, якщо виконується умова його існування, інакше обчислити площу трапеції, задавши її основу та висоту за умови існування трапеції, інакше видати повідомлення про помилку.
Довести, що катети і висота, проведена до гіпотенузи, пов'язані співвідношенням: 1/H2 = 1/a2 + 1/b2, де H - висота, a, b - катети. Попередньо перевірити, чи є трикутник прямокутним. Необхідні обчислення і початкові дані задати самостійно.
Організувати діагностику роботи програми за допомогою наперед визначених макросів FILE, LINE та макросів виведення повідомлень.
Використовуючи макроси умовної компіляції та оператор defined, перевірити правильність встановлених опцій компілятора і видати відповідні повідомлення.
Довести, що для будь-якого трикутника ABC виконується нерівність: cosA + cosB + cosC <=3/2
Перевірити введені числа на парність і додатність. Оформити у вигляді макросів визначення парності, додатності чисел, виведення діагностичних повідомлень. Шляхом умовної компіляції поділити процеси визначення парності та додатності чисел.
Використовуючи допомогою наперед визначені макроси DATE, FILE, LINE, STDC, TIME, вивести повідомлення про дату, час, ім'я файлу тощо. Передбачити повідомлення про програмні помилки. Здійснити передачу параметрів у програму і блокування їх передачі за допомогою директиви #pragma.
Скласти довідник операцій над множинами: об'єднання, перетинання, входження, рівності, різниці, доповнення тощо, задавши необхідні визначення у вигляді макросів і надрукувавши їх.
Використовуючи макроси класифікації символів ASCII, визначити алфавітні та цифрові символи у процесі введення рядка з клавіатури. З цифрових символів побудувати матрицю вимірності, яку визначають за таким правилом: кількість рядків дорівнює значенню першого цифрового символа, відмінного від нуля, кількість стовпчиків дорівнює коду першого алфавітного символа, зменшеного у n разів. Необхідні константи задати макросами.
Використовуючи макроси обробки змінної кількості параметрів, скласти програму обчислення найбільшого спільного дільника довільної кількості цілих чисел.
Використовуючи макроси обробки змінної кількості параметрів, скласти програму генерації повідомлень про помилки по її коду за допомогою передачі кожного слова як окремого рядкового параметра. Відповідність коду помилки і повідомлення з контексту задачі визначає користувач.
Використовуючи макроси обробки змінної кількості параметрів, скласти програму сортування чисел (використати алгоритм швидкого сортування).
Використовуючи директиви умовної компіляції, на вимогу автора забезпечити виключення деяких частин коду. Продемонструвати застосування умовної компіляції на прикладі будь-якої раніше складеної програми.
Використовуючи макроси класифікації символів ASCII, визначити алфавітні, цифрові символи, символи пунктуації та інші під час читання текстового файлу. Вивести на екран символи за порядком: цифровий, алфавітний, символ пунктуації, цифровий, алфавітний. На випадок неоднакової кількості символів різних типів вказати кількість символів, яких немає. Всі виведення оформити у вигляді макросів.
Написати програму, що імітує роботу калькулятора (елементарні арифметичні функції), використовуючи макроси.
