Sunday, January 19, 2020

Variadic functions in C - Hacker Rank Solution

Variadic functions in C - Hacker Rank Solution

There is no built in way for a variadic function to know how many parameters have been passed. You don't have to use them all, but if you request too many, you will get garbage. The variadic functions in this problem use a standard method of passing the number of parameters to follow as the first parameter of the function. At least one fixed parameter must precede the elipsis so two problems are solved with  variable.
So, how does one use the variable list of arguments? First declare a variable of type va_list which is called ap in the Tester's Code below. Next initialize the list with it's length (count) as va_start(ap, count). Call the generator va_arg(ap, int) telling it source and data type to retrieve the next argument in the list. Finally, when the list has been processed, it is good form to use va_end(ap).

include

include

include

include

define MIN_ELEMENT 1

define MAX_ELEMENT 1000000

int sum (int count,...) { va_list ap; int i, n; va_start(ap, count); n = 0; for (i=0;i
int min(int count,...) { va_list ap; int i, current, minimum; va_start(ap, count); minimum = 1000001; for (i=0;i
}
int max(int count,...) { va_list ap; int i, current, maximum; va_start(ap, count); maximum = 0; for (i=0;i if (current > maximum) maximum = current; } va_end(ap); return maximum;
} 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 = 0; i < 3; i++) {
    fprintf(stderr, "%d\n", elements[i]);
}

int elements_sum = sum(3, elements[0], elements[1], elements[2]);
int minimum_element = min(3, elements[0], elements[1], elements[2]);
int maximum_element = max(3, elements[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 = 0; i < 3; i++) {
    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 = 0; i < 5; i++) {
    fprintf(stderr, "%d\n", elements[i]);
}

int elements_sum = sum(5, elements[0], elements[1], elements[2], elements[3], elements[4]);
int minimum_element = min(5, elements[0], elements[1], elements[2], elements[3], elements[4]);
int maximum_element = max(5, elements[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 = 0; i < 5; i++) {
    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 = 0; i < 10; i++) {
    fprintf(stderr, "%d\n", elements[i]);
}

int elements_sum = sum(10, elements[0], elements[1], elements[2], elements[3], elements[4],
                       elements[5], elements[6], elements[7], elements[8], elements[9]);
int minimum_element = min(10, elements[0], elements[1], elements[2], elements[3], elements[4],
                       elements[5], elements[6], elements[7], elements[8], elements[9]);
int maximum_element = max(10, elements[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 = 0; i < 10; i++) {
    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;
}

1 comment:

Powered by Blogger.