Лекция 12

Задачи на последовательности

Задача 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);

}