Задача 1. Найти значение и производную многочлена, коэффициенты которого расположены в файле input.txt по возрастанию степеней, в точке, значение которой находится в начале того же файла. Результат записать в файл output.txt.
#include <stdio.h>
int func(FILE *IN, double *p, double *d);
int main(void) {
double p; /* Переменная для значения многочлена */
double d; /* Переменная для значения производной */
FILE *IN, *OUT;
IN = fopen(“input.txt”, “r”);
if (IN == NULL) {
printf(“File input.txt not opened\n”);
return -1;
}
res = func(IN, &p, &d); /* Вызываем функцию, которая вычисляет p и d */
fclose(IN);
if (res != 0)
return -1;
OUT = fopen(“output.txt”, “w”);
if (OUT == NULL) {
printf(“File output.txt not opened\n”);
return -1;
}
fprintf(OUT, “%f %f\n”, p, d);
fclose(OUT);
return 0;
}
int func(FILE *IN, double *p, double *d) {
double x; /* Содержит точку, в который вычисляется значение многочлена */
int n = 0; /* Содержит степень x для текущего коэффициента */
double xn = 1; /* Содержит x в степени n */
if (fscanf(IN, “%lf”, &x) != 1) {
printf(“File empty\n”);
return -1;
}
if (fscanf(IN, “%lf”, &a) != 1) {
printf(“Missed polynom\n”);
return -1;
}
*p = a;
*d = 0;
while (fscanf(IN, “%lf”, &a) == 1) {
*d += n * xn + a;
xn *= x;
*p += a * xn;
++n;
}
return 0;
}
Задача 2. Найти значение и производную многочлена, коэффициенты которого расположены в файле input.txt по убыванию степеней, в точке, значение которой находится в начале того же файла. Результат записать в файл output.txt.
#include <stdio.h>
int func(FILE *IN, double *p, double *d);
int main(void) {
double p; /* Переменная для значения многочлена */
double d; /* Переменная для значения производной */
FILE *IN, *OUT;
IN = fopen(“input.txt”, “r”);
if (IN == NULL) {
printf(“File input.txt not opened\n”);
return -1;
}
res = func(IN, &p, &d);
fclose(IN);
if (res != 0)
return -1;
OUT = fopen(“output.txt”, “w”);
if (OUT == NULL) {
printf(“File output.txt not opened\n”);
return -1;
}
fprintf(OUT, “%f %f\n”, p, d);
fclose(OUT);
return 0;
}
int func(FILE *IN, double *p, double *d) {
double x, a;
if (fscanf(IN, “%lf”, &x) != 1) {
printf(“File empty\n”);
return -1;
}
*p = 0;
*d = 0;
while (fscanf(IN, “%lf”, &a) == 1) {
*d = d * x + *p;
*p = *p * x + a;
}
return 0;
}
Задача 3. Определить общее количество элементов в постоянных участках целой последовательности
#include <stdio.h>
int func(FILE *IN); /* Возвращает общее число элементов в постоянных участках */
int main(void) {
FILE *IN, *OUT;
IN = fopen(“input.txt”, “r”);
if (IN == NULL) {
printf(“File input.txt not opened\n”);
return -1;
}
res = func(IN);
fclose(IN);
if (res != 0)
return -1;
OUT = fopen(“output.txt”, “w”);
if (OUT == NULL) {
printf(“File output.txt not opened\n”);
return -1;
}
fprintf(OUT, “%d\n”, res);
fclose(OUT);
return 0;
}
int func(FILE *IN) {
int prev, cur; /* Предыдущий и текущий элементы последовательности */
int insideConst = 0; /* Внутри ли постояннного участка */
int numConst = 0; /* Общее количество элементов в постоянных участках */
if (fscanf(IN, “%d”, &prev) != 1) {
printf(“File empty\n”);
return -1;
}
while (fscanf(IN, “%d”, &cur) == 1) {
if (cur == prev) { /* Если текущий элемент равен предыдущему */
if (!insideConst) { /* Если постоянный участок начался на предыдущем */
insideConst = 1; /* Запомнить, что постоянный участок начался */
numConst = 1; /* Посчитать предыдущий элемент */
}
++numConst; /* Посчитать текущий элемент */
} else {
insideConst = 0; /* Запомнить, что не внутри постоянного участка */
}
prev = cur;
}
return numConst;
}
Задача 4. Определить, каких участков в последовательности больше — возрастающих или невозрастающих.
#include <stdio.h>
int func(FILE *IN); /* Возвращает 1, если больше возрастающих, и 0, если невозрастающих */
int main(void) {
FILE *IN, *OUT;
IN = fopen(“input.txt”, “r”);
if (IN == NULL) {
printf(“File input.txt not opened\n”);
return -1;
}
res = func(IN);
fclose(IN);
if (res != 0)
return -1;
OUT = fopen(“output.txt”, “w”);
if (OUT == NULL) {
printf(“File output.txt not opened\n”);
return -1;
}
fprintf(OUT, “%d\n”, res);
fclose(OUT);
return 0;
}
int func(FILE *IN) {
double prev, cur; /* Предыдущий и текущий элементы последовательности */
int insideIncreased = 0;
int numIncreased = 0, numNonIncreased = 0;
int lenNonIncreased;
if (fscanf(IN, “%lf”, &prev) != 1) {
printf(“File empty\n”);
return -1;
}
lenNonIncreased = 1;
while (fscanf(IN, “%lf”, &cur) == 1) {
if (cur > prev) {
if (!insideIncreased) {
insideIncreased = 1;
++numIncreased;
if (lenNonIncreased > 1)
++numNonIncreased;
}
} else {
if (insideIncreased) {
insideIncreased = 0;
lenNonIncreased = 0;
}
++lenNonIncreased;
}
prev = cur;
}
if (lenNonIncreased > 0)
++numNonIncreased;
return ((numIncreased > numNonIncreased) ? 1 : 0);
}