Траблы с функциями с переменным количеством аргументов на C

Рейтинг: 0Ответов: 1Опубликовано: 12.05.2023

Задача такая - написать функции максимума, минимума и среднего значения. Но при условии, что мы не задаем количество переменных при активации функции. Написал программу - максимум находит хорошо, но вот минимум и среднее значение - плохо. Пока искал проблему, выяснил, что функция берет из неоткуда нули. Искал инфу как правильно сделать, ниче не мог найти. Прошу подсказать, что я делаю не так.

#include <stdio.h>
#include <math.h>
#include <stdarg.h>


double max(double n, ...){
    va_list factor;
    va_start(factor, n);
    double result = n, a;
    printf("%lf\n", result);
    while ((a = va_arg(factor, double))){
        if (a > result) result = a;
        printf("%lf 1\n", result);
    }
    va_end(factor);
    return result;
}

double min(double n, ...){
    va_list factor;
    va_start(factor, n);
    double result = n, a;
    printf("%lf\n", result);
    while ((a = va_arg(factor, double))){
        if (a < result) result = a;
        printf("%lf 1\n", result);
    }
    va_end(factor);
    return result;
}
double sred(int n, ...){
    va_list factor;         //указатель va_list
    va_start(factor, n);
    double a;
    int count = 0;
    double result = 0;// устанавливаем указатель
    while ((a = va_arg(factor, double))){// получаем значение текущего параметра типа int
        result += a;
        count++;
        printf("%lf %d 3\n", result, count);
    }
    va_end(factor); // завершаем обработку параметров
    return result/count;
}







int main() {
    double a = max(54.0, 32.0, 45.0, 3.0);
    double s = min(56.0, 32.0, 45.0, 33.0);
    double k = sred(56.0, 32.0, 45.0, 33.0);
    printf("%lf, %lf, %lf", a, s, k);
    return 0;
}

Ответы

▲ 2

sred у вас написана совершенно отвратно, не с теми типами и т.д.

Рекомендую завершать ввод каким-то флагом того, что на этом все. У вас такого флага просто нет, и читает ваш код стек до тех пор, пока на ноль не наткнется...

Для double мне представляется естественным использование в качестве ограничителя NAN:

double max(double n, ...)
{
    va_list factor;
    va_start(factor, n);
    double result = n, a;
    printf("%lf\n", result);
    while(!isnan(a = va_arg(factor, double))){
        if (a > result) result = a;
        printf("%lf 1\n", result);
    }
    va_end(factor);
    return result;
}

double min(double n, ...)
{
    va_list factor;
    va_start(factor, n);
    double result = n, a;
    printf("%lf\n", result);
    while(!isnan(a = va_arg(factor, double))){
        if (a < result) result = a;
        printf("%lf 1\n", result);
    }
    va_end(factor);
    return result;
}
double sred(double n, ...)
{
    va_list factor;
    va_start(factor, n);
    double a;
    int count = 1;
    double result = n;
    while(!isnan(a = va_arg(factor, double))){
        result += a;
        count++;
        printf("%lf %d 3\n", result, count);
    }
    va_end(factor);
    return result/count;
}

int main() {
    double a = max(54.0, 32.0, 45.0, 3.0, NAN);
    double s = min(56.0, 32.0, 45.0, 33.0, NAN);
    double k = sred(56.0, 32.0, 45.0, 33.0, NAN);
    printf("%lf, %lf, %lf", a, s, k);
    return 0;
}

Заодно подправил вашу sred.