Для l oop в C языке - PullRequest
       0

Для l oop в C языке

0 голосов
/ 15 марта 2020

У меня есть две функции, одна для вычисления минимума и максимума массива, вторая для вычисления среднего значения этого массива:

void find_min_max(double *tab, int nb, double *pmin, double *pmax) {
    double val_min, val_max;
    int i;
    val_min = tab[0];
    val_max = tab[0];
    for (i = 0; i < nb; i++) {
        if (tab[i] < val_min) {
            val_min = tab[i];
        } else
        if (tab[i] > val_max) {
            val_max = tab[i];
        }
    }
    *pmin = val_min;
    *pmax = val_max;
}

double find_average(double *tab, int nb) {
    double average, sum;
    int i;
    sum = 0;
    for (i = 0; i < nb; i++) {
        sum = sum + tab[i];
    }
    average = sum / nb;
    return average;
}

массива, который я хочу найти мин, максимальное и среднее значение - это текстовый файл, который содержит числа с плавающей запятой:

int main() {
    int i, j;
    float tab[100] max, min, avg = 0;
    FILE *mydata;
    FILE *data_res;

    f = fopen("data.txt", "r");
    new_f = fopen("data_res.txt", "w");

    if (mydata == NULL)
        printf("Error");
    else {
        for (i = 0; i < n; i++)
            fscanf(mydata, "%f", &tab[i]);
        }
        for (i = 0; i < 100; i++) {
            for (j = i; j < 5; j++) {
                fprintf(data_res, "%f  ", tab[j]);
                avg = find_average(tab);
                find_min_max(tab, nb, &min, &max);
            }

            fprintf(new_f, "MAX = %lf\n", max);
            fprintf(new_f, "MIN  = %lf\n", min);
        }
    }
}

Но проблема в том, что он не вычисляет правильный максимум и правильный минимум

Ответы [ 3 ]

1 голос
/ 15 марта 2020

В find_min_max попробуйте использовать это:

if (tab[i] > val_max)
    {
    val_max = tab[i];
    }

вместо

else if (tab[i] > val_max)
        {
            val_max = tab[i];
        }
0 голосов
/ 15 марта 2020

В вашем коде есть несколько проблем:

  • n не определено, чтение l oop не компилируется
  • вы должны проверить возвращаемое значение fscanf(), чтобы обнаружить ошибки преобразования и избежать неопределенного поведения.
  • Вы передаете адрес float переменных функциям, которые ожидают double указателей. Вы должны использовать double для всех значений.
  • неясно, почему вы используете 1196 для вычисления l oop
  • , неясно, почему вы хотите вычислить средние 5 значений за раз.
  • вы не передаете размер массива в avg = find_average(tab);
  • , вы всегда вычисляете минимальное и максимальное из первых 5 значений в find_min_max(tab, 5, &min, &max);
  • tab_C и b не определены.

Вы должны объяснить, что вы хотите, чтобы код делал с этими значениями. Как уже было сказано, неясно, что вы намерены читать из кода.

Чтобы вычислить скользящее среднее, минимальное и максимальное, вы должны изменить свой код следующим образом: // вычислить среднее из 5 элементов, начиная с tab [i] avg = find_average (tab + i, 5); find_min_max (tab + i, 5, & min, & max);

Вот модифицированная версия:

#include <stdio.h>

void find_min_max(const double *tab, int nb, double *pmin, double *pmax) {
    double val_min, val_max;
    val_min = val_max = tab[0];
    for (int i = 1; i < nb; i++) {
        if (tab[i] < val_min) {
            val_min = tab[i];
        } else
        if (tab[i] > val_max) {
            val_max = tab[i];
        }
    }
    *pmin = val_min;
    *pmax = val_max;
}

double find_average(const double *tab, int nb) {
    double sum = 0.0;
    for (int i = 0; i < nb; i++) {
        sum += tab[i];
    }
    return sum / nb;
}

int main() {
    int i, j;
    double tab[1200], tab_C[1200], max, min, avg = 0, H, L, x = 0.2;
    FILE *mydata;
    FILE *data_res;

    file = fopen("data.txt", "r");
    data_res = fopen("data_res.txt", "w");

    if (mydata == NULL || data_res == NULL) {
        fprintf(stderr, "Cannot open files\n");
        return 1;
    } else {
        for (i = 0; i < 1200; i++)
            if (fscanf(mydata, "%lf", &tab[i]) != 1) {
                fprintf(stderr, "Input error at index %d\n", i);
                return 1;
            }
        }
        for (i = 0; i < 1196; i++) {
            //this loop is for taking 5 elements by 5
            for (j = i; j < i + 5; j++) {
                fprintf(data_res, "%f  ", tab[j]);
            }
            fprintf(data_res, "\n");
            avg = find_average(tab + i, 5);
            find_min_max(tab + i, 5, &min, &max);
            L = avg - ((avg - min) * b);
            H = avg + ((max - avg) * b);

            fprintf(data_res, "MAX = %f\n", max);
            fprintf(data_res, "MIN = %f\n", min);
            fprintf(data_res, "the average = %f\n", avg);
            fprintf(data_res, "low value = %f\n", L);
            fprintf(data_res, "High value = %f\n", H);
        }
        fclose(mydata);
        fclose(data_res);
    }
}
0 голосов
/ 15 марта 2020

Удалите остальное, чтобы разделить 2, если.

void find_min_max (double *tab, int nb, double *pmin, double *pmax)
{
    double val_min, val_max;
    int i;
    val_min = tab[0];
    for (i=0; i<nb; i++)
    {
        if (tab[i] < val_min)
        {
            val_min = tab[i];
        }

    }

        val_max = tab[0];
    for (i=0; i<nb; i++)
        {

        if (tab[i] > val_max)
            {
                val_max = tab[i];
            }

        }
    *pmin = val_min;
    *pmax = val_max;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...