Найти разницу двух многочленов - 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();
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы