Variadic functions in C

Variadic functions are functions that take a variable number of arguments. In C programming, a variadic function will contribute to the flexibility of the program that you are developing.

The declaration of a variadic function starts with the declaration of at least one named variable and uses an ellipsis as the last parameter, e.g.

int printf(const char* format, ...);

In this problem, you will implement three variadic functions named sum(), min() and max() to calculate sums, minima, maxima of a variable number of arguments. The first argument passed to the variadic function is the count of the number of arguments, which is followed by the arguments themselves.

Example:

Input: 1

Output:

Sending following three elements: 15718 14246 21420 Your output is: Elements sum is 51384 Minimum element is 14246 Maximum element is 21420 Correct Answer Sending following five elements: 15718 14246 21420 23861 28151 Your output is: Elements sum is 103396 Minimum element is 14246 Maximum element is 28151 Correct Answer Sending following ten elements: 15718 14246 21420 23861 28151 8461 20332 18010 4253 17693 Your output is: Elements sum is 172145 Minimum element is 4253 Maximum element is 28151 Correct Answer

Approach

C

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MIN_ELEMENT 1
#define MAX_ELEMENT 1000000
int sum(int count, ...)
{
    int sum = 0;
    va_list values;
    va_start(valuescount);
    for (int i = 0i < counti++)
    {
        sum += va_arg(valuesint);
    }
    va_end(values);
    return sum;
}

int min(int count, ...)
{
    int min = MAX_ELEMENTtest;
    va_list values;
    va_start(valuescount);
    for (int i = 0i < counti++)
    {
        test = va_arg(valuesint);
        if (min > test)
        {
            min = test;
        }
    }
    va_end(values);
    return min;
}

int max(int count, ...)
{
    int max = MIN_ELEMENTtest;
    va_list values;
    va_start(valuescount);
    for (int i = 0i < counti++)
    {
        test = va_arg(valuesint);
        if (max < test)
        {
            max = test;
        }
    }
    va_end(values);
    return max;
}

int test_implementations_by_sending_three_elements()
{
    srand(time(NULL));

    int elements[3];

    elements[0] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[1] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[2] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;

    fprintf(stderr"Sending following three elements:\n");
    for (int i = 0i < 3i++)
    {
        fprintf(stderr"%d\n"elements[i]);
    }

    int elements_sum = sum(3elements[0], elements[1], elements[2]);
    int minimum_element = min(3elements[0], elements[1], elements[2]);
    int maximum_element = max(3elements[0], elements[1], elements[2]);

    fprintf(stderr"Your output is:\n");
    fprintf(stderr"Elements sum is %d\n"elements_sum);
    fprintf(stderr"Minimum element is %d\n"minimum_element);
    fprintf(stderr"Maximum element is %d\n\n"maximum_element);

    int expected_elements_sum = 0;
    for (int i = 0i < 3i++)
    {
        if (elements[i] < minimum_element)
        {
            return 0;
        }

        if (elements[i] > maximum_element)
        {
            return 0;
        }

        expected_elements_sum += elements[i];
    }

    return elements_sum == expected_elements_sum;
}

int test_implementations_by_sending_five_elements()
{
    srand(time(NULL));

    int elements[5];

    elements[0] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[1] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[2] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[3] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[4] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;

    fprintf(stderr"Sending following five elements:\n");
    for (int i = 0i < 5i++)
    {
        fprintf(stderr"%d\n"elements[i]);
    }

    int elements_sum = sum(5elements[0], elements[1], elements[2], elements[3], elements[4]);
    int minimum_element = min(5elements[0], elements[1], elements[2], elements[3], elements[4]);
    int maximum_element = max(5elements[0], elements[1], elements[2], elements[3], elements[4]);

    fprintf(stderr"Your output is:\n");
    fprintf(stderr"Elements sum is %d\n"elements_sum);
    fprintf(stderr"Minimum element is %d\n"minimum_element);
    fprintf(stderr"Maximum element is %d\n\n"maximum_element);

    int expected_elements_sum = 0;
    for (int i = 0i < 5i++)
    {
        if (elements[i] < minimum_element)
        {
            return 0;
        }

        if (elements[i] > maximum_element)
        {
            return 0;
        }

        expected_elements_sum += elements[i];
    }

    return elements_sum == expected_elements_sum;
}

int test_implementations_by_sending_ten_elements()
{
    srand(time(NULL));

    int elements[10];

    elements[0] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[1] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[2] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[3] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[4] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[5] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[6] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[7] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[8] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;
    elements[9] = rand() % (MAX_ELEMENT - MIN_ELEMENT + 1) + MIN_ELEMENT;

    fprintf(stderr"Sending following ten elements:\n");
    for (int i = 0i < 10i++)
    {
        fprintf(stderr"%d\n"elements[i]);
    }

    int elements_sum = sum(10elements[0], elements[1], elements[2], elements[3], elements[4],
                           elements[5], elements[6], elements[7], elements[8], elements[9]);
    int minimum_element = min(10elements[0], elements[1], elements[2], elements[3], elements[4],
                              elements[5], elements[6], elements[7], elements[8], elements[9]);
    int maximum_element = max(10elements[0], elements[1], elements[2], elements[3], elements[4],
                              elements[5], elements[6], elements[7], elements[8], elements[9]);

    fprintf(stderr"Your output is:\n");
    fprintf(stderr"Elements sum is %d\n"elements_sum);
    fprintf(stderr"Minimum element is %d\n"minimum_element);
    fprintf(stderr"Maximum element is %d\n\n"maximum_element);

    int expected_elements_sum = 0;
    for (int i = 0i < 10i++)
    {
        if (elements[i] < minimum_element)
        {
            return 0;
        }

        if (elements[i] > maximum_element)
        {
            return 0;
        }

        expected_elements_sum += elements[i];
    }

    return elements_sum == expected_elements_sum;
}

int main()
{
    int number_of_test_cases;
    scanf("%d", &number_of_test_cases);

    while (number_of_test_cases--)
    {
        if (test_implementations_by_sending_three_elements())
        {
            printf("Correct Answer\n");
        }
        else
        {
            printf("Wrong Answer\n");
        }

        if (test_implementations_by_sending_five_elements())
        {
            printf("Correct Answer\n");
        }
        else
        {
            printf("Wrong Answer\n");
        }

        if (test_implementations_by_sending_ten_elements())
        {
            printf("Correct Answer\n");
        }
        else
        {
            printf("Wrong Answer\n");
        }
    }

    return 0;
}


No comments:

Post a Comment