diff --git a/Sixth/exp_weigh_avg.c b/Sixth/exp_weigh_avg.c new file mode 100644 index 0000000..d9d858f --- /dev/null +++ b/Sixth/exp_weigh_avg.c @@ -0,0 +1,24 @@ +#include "exp_weigh_avg.h" + +int betweenZeroOne(double lambda) { + if ((lambda < FAULT) || ((1 - lambda) <= FAULT)) return 0; + return 1; +} + +double expWeigthAvg(FILE * file, double lambda) { + double current, i, eavg, lambda_n; + if (fscanf(file, "%lf", ¤t) != 1) { + printf("File is empty!\n"); + return -1.; + } + + i = 1.; + eavg = 0.; + + do { + eavg += current * pow(lambda, -i); + i++; + } while (fscanf(file, "%lf", ¤t) == 1); + lambda_n = pow(lambda, i - 1); + return (eavg * lambda_n) * ((1 - lambda) / (1 - lambda_n)); +} diff --git a/Sixth/exp_weigh_avg.h b/Sixth/exp_weigh_avg.h new file mode 100644 index 0000000..4876368 --- /dev/null +++ b/Sixth/exp_weigh_avg.h @@ -0,0 +1,13 @@ +#ifndef EXP_WEIGH_AVG +#define EXP_WEIGH_AVG + +#include +#include + +#define FALSE 0 +#define FAULT 1.e-10 + +int betweenZeroOne(double lambda); +double expWeigthAvg(FILE * file, double lambda); + +#endif // EXP_WEIGH_AVG diff --git a/Sixth/input.txt b/Sixth/input.txt new file mode 100644 index 0000000..8fbd720 --- /dev/null +++ b/Sixth/input.txt @@ -0,0 +1,5 @@ +5 +4 +3 +2 +1 \ No newline at end of file diff --git a/Sixth/main.c b/Sixth/main.c new file mode 100644 index 0000000..7de9e58 --- /dev/null +++ b/Sixth/main.c @@ -0,0 +1,25 @@ +#include +#include "tools.h" +#include "exp_weigh_avg.h" + +/* +Задание 38 +Пример: +5 4 3 2 1 и лямбда: 0.5 +Ответ: 1.83... +*/ + +int main(void) { + double lambda; + FILE * file = getFile(); + + printf("Enter lambda: "); + scanf("%lf", &lambda); + if (betweenZeroOne(lambda) == FALSE) { + printf("Lambda is not between 0 to 1!"); + return -1; + } + + printf("The exponentially weighted average is %lf\n", expWeigthAvg(file, lambda)); + return 0; +} diff --git a/Sixth/makefile b/Sixth/makefile new file mode 100644 index 0000000..c9a9430 --- /dev/null +++ b/Sixth/makefile @@ -0,0 +1,11 @@ +all: main.o exp_weigh_avg.o tools.o + gcc main.o exp_weigh_avg.o tools.o && del *.o + +main.o: main.c + gcc -c main.c + +exp_weigh_avg.o: exp_weigh_avg.c + gcc -c exp_weigh_avg.c + +tools.o: tools.c + gcc -c tools.c \ No newline at end of file diff --git a/Sixth/tools.c b/Sixth/tools.c new file mode 100644 index 0000000..3900212 --- /dev/null +++ b/Sixth/tools.c @@ -0,0 +1,23 @@ +#include "tools.h" + +FILE * getFile(void) +{ + FILE * file; + char filename[50]; + + printf("Enter filename: "); + if (scanf("%s", filename) == 1) + { + file = fopen(filename, "r"); + if (file == NULL) { + printf("Error file!\n"); + return NULL; + } else { + return file; + } + } else + { + printf("Empty name!\n"); + return NULL; + } +} diff --git a/Sixth/tools.h b/Sixth/tools.h new file mode 100644 index 0000000..860a2a7 --- /dev/null +++ b/Sixth/tools.h @@ -0,0 +1,8 @@ +#ifndef TOOLS +#define TOOLS + +#include + +FILE * getFile(void); + +#endif