В вашем коде есть несколько проблем:
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);
}
}