Как сделать, чтобы макрос передавал значения (нужно вывести максимум через переменную)? - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <malloc.h>
#define MAX_ELEM(count, array) int max=array[0]; for(int j = 0; j < n; ++j){if (array[j] > max){max = array[j];}}
int main()
{
int *a;
int n, i;
printf("Input number of array:\n");
scanf("%d", &n);
a = (int*)malloc(n * sizeof(int));
for (i = 0; i<n; i++)
{
printf("a[%d] =", i);
scanf("%d", &a[i]);
}
int r = MAX_ELEM(n, a)
printf("Max=%d\n", r);
}Решение задачи: «Как сделать, чтобы макрос передавал значения (нужно вывести максимум через переменную)?»
textual
Листинг программы
//gcc 5.4.0
#include <stdio.h>
#define N 7
#define MAX_ELEM(arr, size, max) do { \
max=arr[0]; \
for(int i = 1; i < size; ++i) \
if (arr[i] > max) \
max = arr[i]; \
} while(0)
int main(void)
{
int r=0;
int a[N] = {1, 4, 3, 25, 6, 77, 8};
MAX_ELEM(a, N, r);
printf("Max=%d\n", r);
}
Объяснение кода листинга программы
- Включаем файл stdio.h для работы с функциями ввода-вывода
- Объявляем макрос N со значением 7
- Объявляем макрос MAX_ELEM, который принимает три аргумента: arr (массив), size (размер массива) и max (переменная для хранения максимального элемента)
- В теле макроса присваиваем переменной max значение первого элемента массива arr
- С помощью цикла for проходим по всем элементам массива, начиная со второго
- Внутри цикла сравниваем текущий элемент массива с переменной max и если он больше, то присваиваем max значение текущего элемента
- В конце макроса ничего не делаем, поэтому выходим из него с помощью оператора return
- В функции main создаем массив a с семью элементами
- Вызываем макрос MAX_ELEM, передавая в качестве аргументов массив a, его размер N и переменную r
- Значение переменной r будет содержать максимальное значение из массива a
- Выводим значение переменной r на экран с помощью функции printf
- Значение переменной r будет 8, так как это максимальный элемент в массиве a