Найти разницу двух многочленов - C (СИ)
Формулировка задачи:
Извиняюсь заранее за то, что может тема уже была.
Не могу врубится в сабж при заданном x=3
Сумму двух многочленов понимаю как сделать:
/* Найти разницу двух многочленов Pn(x) и Qm(x) при x=3 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <math.h> #define N 100 #define M 100 int main() { int n, m; /* степень P(x) и Q(x) */ float p[N+1], q[M+1]; /* коф P(x), коф Q(x) */ int s; /* степень R(x) */ float r[N+M+1]; /* коф R(x) */ int k, /* наименьший из степеней n и m */ i; /* индекс */ int error; /* признак ошибки при вводе */ /* =0, если нету ошибки, =1, если ошибка */ do { error=0; printf("Vvedite stepen' 1-go mnogochlena"); printf("(n>=0 i n<%d):\n", N); scanf("%d", &n); if ( n<0 || n>N ) { printf("Vi oshiblis! Povtorite vvod!\n"); error=1; } } while (error); printf("Vvedite koophicent 1-go mnogochlena:\n"); for(i=0; i<n+1; i++) { printf("\nP[%d]=", i); scanf("%f", &p[i]); } do { error=0; printf("Vvedite stepen' 2-go mnogochlena"); printf("(m>=0 i m<%d):\n", M); scanf("%d", &m); if ( m<0 || m>M ) { printf("Vi oshiblis! Povtorite vvod!\n"); error=1; } } while (error); printf("Vvedite koophicenti 2-go mnogochlena:\n"); for(i=0; i<m+1; i++) { printf("\nQ[%d]=", i); scanf("%f", &q[i]); } s = (n>m) ? n : m; k = (n*m); for(i=k+1; i<=s; i++) r[i] = p[i]; if (n<m) for(i=k+1; i<=s; i++) r[i] = q [i]; /* ============ Вывод результатов ========= */ printf ("Mnogochlen-rezultat stepeni=%d\n", s); for (i=0; i<s+1; i++) printf("r[%d]=%f\n", i, r[i]); getch(); }
Решение задачи: «Найти разницу двух многочленов»
textual
Листинг программы
#include <stdio.h> // библиотека стандартного ввода-вывода (для printf) #include <conio.h> // библиотека консольного ввода-вывода (для getch()) #include <math.h> // библиотека математических функций (для abs()) // подпрограмма выделения памяти под коэффициенты многочлена // входные переменные: нет // выходные переменные: // n - степень многочлена (целое неотрицательное) // возвращаемый результат: указатель на массив коэффициентов многочлена float* create_poly(int* n) { // переменные bool input_errors; // признак ошибок ввода float* K; // указатель на массив коэффициентов многочлена // ввод степени многочлена Р do { input_errors = true; // полагаем, что есть ошибка ввода printf("Input integer positive power of polynom: "); scanf("%d", n); if (n > 0) { input_errors = false; } } while (input_errors); // выделение памяти (n ячеек для вещественных чисел float) под коэффициенты многочлена Р K = new float[*n+1]; // возвращаем в основную программу указатель на массив коэффициентов многочлена return K; } // подпрограмма ввода коэффициентов многочлена // входные переменные: // n - степень многочлена (целое неотрицательное) // выходные переменные: // K - указатель на массив коэффициентов полинома // возвращаемый результат: нет void input_poly(int n, float* K) { // переменные int ix; // индекс i-го коэффициента многочлена // ввод коэффициентов многочлена printf("Input coeffs:\n"); for (ix = 0; ix <= n; ix++) { printf("for x^%-1d: ",ix); scanf("%f", &K[ix]); } } // подпрограмма вывода многочлена // входные переменные: // n - степень многочлена (целое неотрицательное) // K - указатель на массив коэффициентов полинома // выходные переменные: нет // возвращаемый результат: нет void output_poly(int n, float* K) { // переменные int ix; // индекс i-го коэффициента многочлена // вывод многочлена for (ix = n; ix >= 0; ix--) { // если выводим старший коэффициент if (ix == n) { // если полином 1-ой степени if (n == 1) { // выводим коэффициент без значка "^" // если старший коэффициент не отрицательный if (K[n] >= 0) // выводим его без знака printf("%5.3f*x ", K[n]); // иначе, старший коэффициент отрицательный else // и выводим его со знаком "-" printf("- %5.3f*x ", abs(K[n])); } else { // если старший коэффициент не отрицательный if (K[n] >= 0) // выводим его без знака printf("%5.3f*x^%-1d ", K[n], n); // иначе, старший коэффициент отрицательный else // и выводим его со знаком "-" printf("- %5.3f*x^%-1d ", abs(K[n]), n); } } else { switch (ix) { case 0: if (K[0] > 0) printf("+ %5.3f", K[0]); else printf("- %5.3f", abs(K[0])); break; case 1: if (K[1] > 0) printf("+ %5.3f*x ", K[1]); else printf("- %5.3f*x ", abs(K[1])); break; default: if (K[ix] > 0) printf("+ %5.3f*x^%-1d ", K[ix], ix); else printf("- %5.3f*x^%-1d ", abs(K[ix]), ix); } } } } // подпрограмма определения коэффициентов многочлена-разности двух многочленов // входные переменные: // n - степень многочлена-уменьшаемого (целое неотрицательное) // P - указатель на коэффициенты многочлена-уменьшаемого // m - степень многочлена-вычитаемого (целое неотрицательное) // Q - указатель на коэффициенты многочлена-вычитаемого // выходные переменные: // r - степень многочлена-разности (целое неотрицательное) // возвращаемый результат: указатель на массив коэффициентов многочлена-разности float* substract_poly(int n, float* P, int m, float* Q, int* r) { // переменные float* K; // указатель на массив коэффициентов многочлена-разности int ix; // индекс коэффициента многочлена-разности // если степень многочлена-уменьшаемого, больше либо равна степени многочлена-вычитаемого if (n >= m) { // выделение памяти (n ячеек для вещественных чисел float) под коэффициенты многочлена K = new float[n+1]; // рассчитываем значения коэффициентов как разность for (ix = 0; ix <= m; ix++) { K[ix] = P[ix] - Q[ix]; } // переписываем старшие коэффициенты без изменений for (ix = m+1; ix <= n; ix++) { K[ix] = P[ix]; } // задаем степень полинома-разности по степени полинома-уменьшаемого *r = n; } else { // выделение памяти (n ячеек для вещественных чисел float) под коэффициенты многочлена K = new float[m+1]; // рассчитываем значения коэффициентов как разность for (ix = 0; ix <= n; ix++) { K[ix] = P[ix] - Q[ix]; } // переписываем старшие коэффициенты с противоположным знаком for (ix = n+1; ix <= m; ix++) { K[ix] = -Q[ix]; } // задаем степень полинома-разности по степени полинома-вычитаемого *r = m; } // возвращаем в основную программу указатель на массив коэффициентов многочлена-разности return K; } // подпрограмма расчета значения многочлена при заданом аргументе // входные переменные: // n - степень многочлена(целое неотрицательное) // P - указатель на коэффициенты многочлена // x - значение аргумента // выходные переменные: нет // возвращаемый результат: значение многочлена float calc_poly(int n, float* P, float x) { // переменные int ix; // индекс коэффициента многочлена float res; // результат вычисления // выполняем вычисления res = 0; for (ix = 0; ix <= n; ix++) { res = res + P[ix] * pow(x, ix); } // возвращаем в основную программу результат расчетов return res; } // главная функция - точка входа в программу void main() { // переменные int n; // степень многочлена Р int m; // степень многочлена Q int d; // разность степеней многочленов P и Q (для корректного вывода) int r; // степень многочлена-разности int ix; // индекс float *P; // указатель на массив коэффициентов многочлена Р float *Q; // указатель на массив коэффициентов многочлена Q float *R; // указатель на массив коэффициентов многочлена R = P - Q float P3; // значение полинома Р при х=3 float Q3; // значение полинома Q при х=3 float R3; // значение полинома R при х=3 // --- ввод исходных данных --------------------------------------------- // ввод многочлена P P = create_poly(&n); input_poly(n, P); // ввод многочлена Q Q = create_poly(&m); input_poly(m, Q); // --- вычисление разности многочленов ---------------------------------------- // вывод многочленов для вычитания "столбиком" if (n >= m) { // вывод многочлена Р printf("\nPolynom P(x): "); output_poly(n, P); // определяем на сколько степень многочлена Р больше степени многочлена Q d = n - m; // вывод многочлена Q со сдвигом вправо printf("\nPolynom Q(x): "); for (ix = 0; ix < d; ix++) { // выводим пробелы printf(" "); } output_poly(m, Q); } else { // определяем на сколько степень многочлена Р больше степени многочлена Q d = m - n; // вывод многочлена Р со сдвигом вправо printf("\nPolynom P(x): "); for (ix = 0; ix < d; ix++) { // выводим пробелы printf(" "); } output_poly(n, P); // вывод многочлена Q printf("\nPolynom Q(x): "); output_poly(m, Q); } // вычисление разности полиномов P и Q и запись результата в R R = substract_poly(n, P, m, Q, &r); // вывод полинома-разности printf("\n\nR(x) = P(x)-Q(x): "); output_poly(r, R); // --- расчет и вывод значений полиномов при х=3 -------------------------------- // рассчитываем значения полиномов при х=3 P3 = calc_poly(n, P, 3); Q3 = calc_poly(m, Q, 3); R3 = calc_poly(r, R, 3); // выводим значения полиномов при х=3 printf("\n\nP(x=3) = %5.3f", P3); printf("\nQ(x=3) = %5.3f", Q3); printf("\nR(x=3) = %5.3f", R3); // проверяем корректность вычислений if (R3 = P3-Q3) { printf("\n\nSubstraction correct! (R(x=3) = P(x=3) - Q(x=3) = %5.3f - %5.3f = %5.3f)", P3, Q3, R3); } else { printf("\n\nSubstraction incorrect! (R(x=3) <> P(x=3) - Q(x=3) = %5.3f - %5.3f <> %5.3f)", P3, Q3, R3); } // освобождаем память, выделенную под коэффициенты многочлена-разности R delete[] R; // освобождаем память, выделенную под коэффициенты многочлена Q delete[] Q; // освобождаем память, выделенную под коэффициенты многочлена Р delete[] P; // задержка до нажатия любой клавиши (чтобы не закрывалось консольное окно) getch(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д