단항 다항식 계산기(데이터 구조 실험)

목적

  1. 순차 목록 및 단일 연결 목록의 저장 특성과 삽입 및 삭제와 같은 알고리즘을 마스터합니다.
  2. 순차 목록 및 단일 연결 목록의 관련 알고리즘을 유연하게 사용하여 일변수 다항식 계산을 실현합니다.

실험적인 콘텐츠

일 변량 다항식 Am(x)합 , 다항식 합의 덧셈, 뺄셈 및 곱셈 Bn(X)을 실현하는 프로그래밍을 갖추고 있습니다. 여기서 다항식은 다음과 같이 설명됩니다.Am(x)Bn(x)

Am(x)=A0+A1x1+A2x2+A3x3+….+Amxm;

Bn(x)=B0+B1x1+B2x2+B3x3+….+Bnxn。

실험 설명

  1. 입력과 출력:
    1. 입력하다
      • 키보드에서 조작 명령(더하기, 빼기, 곱하기)을 입력하고 조작 명령에 따라 해당 연산을 수행합니다.
      • 키보드에서 두 다항식의 계수와 지수를 입력합니다.
      • 계수와 지수는 유형이며 연산 결과는 값 범위 int를 초과하지 않습니다 .int
    2. 산출
      • 각 연산의 결과는 다항식으로 출력되며, 오름차순과 내림차순 2가지 경우가 출력된다.
      • 결과 다항식에는 반복되는 차수 항과 0 계수 항이 없습니다. 다항식을 출력할 때 다음 읽기 쉬운 형식을 사용하십시오(1변수 다항식, 총 변수는 x): x^4 - 3 x^2 + 5
  2. 실험 요구 사항:
  • 시스템 메뉴, 입력 프롬프트 등을 포함한 간단한 대화형 인터페이스를 구현합니다.
  • 다항식 연산 전에 먼저 다항식의 특성을 결정하고 다항식이 희소한지 여부에 따라 적절한 저장 구조를 선택합니다.
  • 다항식의 다양한 작업 요구 사항에 따라 적절한 저장 구조를 선택합니다.
  • 덧셈, 뺄셈, 곱셈 연산을 포함하여 컴퓨터에서 완전하고 정확한 프로그램을 편집하고 디버그합니다.

시험 결과

여기에 이미지 설명 삽입

구현 코드

연결 목록을 사용하여 구현합니다.

/*
 * File name:main.cpp
 * Version:V1.0
 * Description:一元多项式计算器
 * Others:无
 * Log:2021/5/16
 */
#include <iostream>

using namespace std;

//创建了多项式结构体,包含系数和指数信息
typedef struct polynomial
{
    
    
    float Coef; //系数
    int Index;   //指数
    struct polynomial *next;
} polynomial;

//功能函数声明
void CreatePolyn(polynomial **p, int m);
void AddPolyn(polynomial **pa, polynomial **pb);
void SubtractPolyn(polynomial **pa, polynomial **pb);
void MultiplyPolyn(polynomial **pa, polynomial **pb);
void CopyPolyn(polynomial **pa, polynomial *pb);
void MultiplyOperate(polynomial *pa, polynomial *pb);
void PrintPolyn(polynomial *p);

/*
 * @Description : 主函数
 * @param       : 无
 * @return        : 无
 */
int main()
{
    
    
    //65001 是UTF-8代码页,防止出现中文乱码(看个人编译器情况)
    //system("chcp 65001 > nul");

    polynomial *pa, *pb;    //定义两个结构体指针
    int n,m;                //用来存放多项式的项数
    int choose;             //选择加减乘
    int Flag = 1;
    while (1) {
    
    
        if (Flag == 1) {
    
    
            cout << "***************** 一元多项式计算器 *****************" << endl;
            cout << "***** 本计算器只能计算两项一元多项式计算,请规范操作 *****" << endl;
            cout << "请输入第一个多项式的项数: ";
            cin >> n;
            CreatePolyn(&pa, n);
            cout << endl;
            cout << "请输入第二个多项式的项数 :";
            cin >> m;
            CreatePolyn(&pb, m);
            cout << endl;


            cout << "********************************" << endl;
            cout << "本计算器可以进行的计算方式:" << endl;
            cout << "1.相加" << endl;
            cout << "2.相减" << endl;
            cout << "3.相乘" << endl;
            cout << "********************************" << endl;
            cout << endl;
            cout << "请选择计算方式:";
            cin >> choose;

            if (choose == 1) {
    
    
                AddPolyn(&pa, &pb);         //加法
            } else if (choose == 2) {
    
    
                SubtractPolyn(&pa, &pb);    //减法
            } else {
    
    
                MultiplyPolyn(&pa, &pb);    //乘法
            }


            cout << "结果如下: " << endl;
            PrintPolyn(pa);
            cout << endl;
        } else {
    
    

            cout << "**********************************" << endl;
            cout << "           谢谢使用本系统!            " << endl;
            cout << "**********************************" << endl;
            return 0;
        }

        cout << endl;
        cout << "**********************************" << endl;
        cout << "           是否继续使用?            " << endl;
        cout << "1.是" << endl;
        cout << "2.否" << endl;
        cout << "**********************************" << endl;
        cin >> Flag;
    }
}

/*
 * @Description : 创建链表
 * @param **p   : 多项式结构体指针地址
 * @param m     : 多项式项数
 * @return        : 无
 */
void CreatePolyn(polynomial **p, int m)
{
    
    
    int i, data;
    polynomial *cp, *temp;
    (*p) = (polynomial *)malloc(sizeof(polynomial));
    (*p)->Coef = 0.0;
    (*p)->Index = -1;
    (*p)->next = NULL;
    for(i=1; i<=m; ++i){
    
    
        cp = *p;        //初始位置
        temp = (polynomial *)malloc(sizeof(polynomial));
        cout << "请输入第" << i << "项的系数: ";
        cin >> temp->Coef;
        cout << "请输入第" << i << "项的指数: ";
        cin >> temp->Index;

        while(cp->next && temp->Index > cp->next->Index)
        {
    
    
            cp = cp->next;
        }
        if(cp->next && temp->Index == cp->next->Index){
    
         // 如果已经存在相同指数的多项式,跳出循环
            continue;
        }
        temp->next = cp->next;
        cp->next = temp;
    }
}


/*
 * @Description : 加法,加法本质上就是合并链表
 * @param **pa  : 多项式一结构体指针地址
 * @param **pb  : 多项式二结构体指针地址
 * @return        : 无
 */
void AddPolyn(polynomial **pa, polynomial **pb)
{
    
    
    polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
    cpa = (*pa)->next;
    cpb = (*pb)->next;
    while(cpa && cpb)       //对每一项进行比较
    {
    
    
        if(cpa->Index < cpb->Index)
        {
    
    
            p->next = cpa;
            p = cpa;
            cpa = cpa->next;
        }
        else if(cpa->Index > cpb->Index)
        {
    
    
            p->next = cpb;
            p = cpb;
            cpb = cpb->next;
        }
        else
        {
    
    
            if(cpa->Coef + cpb->Coef == 0)
            {
    
    
                cpa = cpa->next;
                cpb = cpb->next;

            }
            else
            {
    
    
                cpa->Coef += cpb->Coef;
                p->next = cpa;
                p = cpa;
                cpa = cpa->next;
                cpb = cpb->next;
            }
        }
    }
    if(cpa)
        p->next = cpa;
    else
        p->next = cpb;
    free(*pb);          //*pb已经为空,释放空间
}

/*
 * @Description : 减法
 * @param **pa  : 多项式一结构体指针地址
 * @param **pb     : 多项式二结构体指针地址
 * @return        :*/
void SubtractPolyn(polynomial **pa, polynomial **pb)
{
    
    
    polynomial *cpa, *cpb, *temp, *ccpa, *p = (*pa);
    cpa = (*pa)->next;
    cpb = (*pb)->next;
    while(cpa && cpb)   //对每一项进行比较
    {
    
    
        if(cpa->Index < cpb->Index)
        {
    
    
            p->next = cpa;
            p = cpa;
            cpa = cpa->next;
        }
        else if(cpa->Index > cpb->Index)
        {
    
    
            p->next = cpb;
            p = cpb;
            p->Coef *= -1;  // 此时结果为负数,需改变符号
            cpb = cpb->next;
        }
        else                //  此时指数相等
        {
    
    
            if(cpa->Coef == cpb->Coef)  //如果两项系数相等,删除该节点
            {
    
    
                cpa = cpa->next;
                cpb = cpb->next;

            }
            else
            {
    
    
                cpa->Coef -= cpb->Coef;
                p->next = cpa;
                p = cpa;
                cpa = cpa->next;
                cpb = cpb->next;
            }
        }
    }

    if(cpa) {
    
    
        p->next = cpa;
    }
    if(cpb){
    
    
        p->next = cpb;
        while(cpb){
    
    
            cpb->Coef *= -1; // 改变系数的符号,将减数多项式的系数变为负的
            cpb = cpb->next;
        }
    }
    free(*pb);      //*pb已经为空,释放空间
}

/*
 * @Description : 乘法
 * @param **pa  : 多项式一结构体指针地址
 * @param **pb     : 多项式二结构体指针地址
 * @return        :*/
void MultiplyPolyn(polynomial **pa, polynomial **pb)
{
    
    
    polynomial *cpa, *ccpa, *res;
    cpa = *pa;                      //保存着原pa的内容
    CreatePolyn(pa, 0);         //从新初始化pa为头结点
    (*pb) = (*pb)->next;
    while(*pb)                      //只要*pb不为NULL一直进行
    {
    
    
        CopyPolyn(&ccpa, cpa);      //将后者复制给前者
        MultiplyOperate(ccpa, *pb); //见下文注释
        AddPolyn(pa, &ccpa);        //将结果加入到pa中,直到得到最后的结果
        (*pb) = (*pb)->next;
    }

}

/*
 * @Description : 将pb复制到pa中
 * @param **pa  : 多项式一结构体指针地址
 * @param *pa      : 多项式二结构体指针
 * @return        : 无
 */
void CopyPolyn(polynomial **pa, polynomial *pb)
{
    
    
    CreatePolyn(pa, 0);
    polynomial *temp, *cpa;
    cpa = *pa;
    pb = pb->next; // 移动指针指向第一个节点
    while(pb)
    {
    
    
        //进行复制操作
        temp = (polynomial *)malloc(sizeof(polynomial));
        temp->Coef = pb->Coef;
        temp->Index = pb->Index;
        temp->next = NULL;
        cpa->next = temp;
        cpa = temp;
        pb = pb->next;
    }
}

/*
 * @Description : 相乘功能处理函数,将参数一与参数二的每一项分别相乘
 * @param *pa      : 多项式一结构体指针
 * @param *pa      : 多项式二结构体指针
 * @return        : 无
 */
void MultiplyOperate(polynomial *pa, polynomial *pb)
{
    
    
    pa = pa->next;
    while(pa)
    {
    
    
        pa->Coef *= pb->Coef;
        pa->Index += pb->Index;
        pa = pa->next;
    }
}

/*
 * @Description : 打印多项式
 * @param *p       : 结构体指针
 * @return        : 无
 */
void PrintPolyn(polynomial *p)
{
    
    
    polynomial *temp = p->next;
    int a[100000];
    double b[100000];
    int aid=0,bid=0;
    int cnt=0;
    cout << "升幂情况: " ;
    while(temp){
    
    
        if(cnt!=0&& temp->Coef > 0)printf("+");
        b[bid]=temp->Coef;
        a[aid]=  temp->Index;
        cout << b[bid] << "x^" << a[aid];
        aid++;
        bid++;
        cnt++;
        temp = temp->next;
    }
    if(cnt==0) {
    
        //如果是空的输出0
        cout << "0";
    }
    cout << endl;
    cout << "降幂情况: ";
    int ans=0;
    for(int i=aid-1; i>=0; i--){
    
    
        if(ans!=0&&b[i]>0) {
    
    
            cout << "+";
        }
        cout << b[i] << "x^" << a[i];
        ans++;
    }
}

기존 문제

구현되지 않은 기능:

다항식 연산 전에 먼저 다항식의 특성을 결정하고 다항식이 희소한지 여부에 따라 적절한 저장 구조를 선택합니다.

마침내

이 기사는 인터넷에 있는 많은 기사의 솔루션을 참조하지만 여전히 단점이 있습니다. 더 많은 포인터를 제공하십시오.

추천

출처blog.csdn.net/qq_45628620/article/details/116902127