一元稀疏多项式计算器 【 数据结构课设作业 】 带界面,无bug,可以直接运行

一元稀疏多项式计算器


问题描述

设计一个一元稀疏多项式简单计算器。

基本要求

(1)输入并建立多项式。

2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci,ei分别是第i 项的系数和指数,序列按指数降序排列。

(3)实现多项式a和b相加,建立多项式a+b。

(4)实现多项式a和b相减,建立多项式a-b。

(5)计算多项式在x处的值。

(6)计算器的仿真界面。

测试数据

在这里插入图片描述
第一组:
5x^8-3.1x^11+2x
11x^9-5x^8+7
第二组:
6x^-3-x+4.4x^2-1.2x^9
-6x^-3+5.4x^2-x^2+7.8x^15
第三组:
x+x^3
-x-x^3
第四组:
x+x^2+x^3
0
可以直接粘贴运行。

界面开发

在这里插入图片描述

设计思想

首先使用定义的两个函数get_coef()getNums()将读入的字符串如6x^-3-x+4.4x^2-1.2x^9,进行分割得到每一项的系数和指数,然后将其存入系数数组coefs[]和指数数组expns[]中。

在建立多项式的过程中,使用系数数组和指数数组进行多项式的建立。 使用C 扩充函数库 conio.h 中声明的一个函数gotoxy(int x, int y),利用它将光标移动到指定位置的功能,进行界面的显示和输出。

使用system("cls")函数对程序进行清屏操作,利用此函数实现了程序的反复读入和输出。

界面参考大佬博客:一元稀疏多项式简单计算器 十分感谢。

内部数据结构代码自己实现,相比于网上的大多相关博客,代码简洁明了。

内部数据结构代码详解:一元稀疏多项式计算器 【 数据结构课设 】 仿真界面 + 代码详解

void goto_xy(int x, int y)
{
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { x,y };
	SetConsoleCursorPosition(hOut, pos);
}
void show(Polyn a, Polyn b, Polyn c)
{
	goto_xy(0, 0); 	 printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	goto_xy(0, 1);   printf("┃            一元稀疏多项式简单计算器             ┃\n");
	goto_xy(0, 2);   printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┫");
	goto_xy(0, 3);   printf("┃\n"); goto_xy(50, 3);                     printf("┃\n");
	goto_xy(0, 4);   printf("┃\n"); goto_xy(50, 4);                     printf("┃\n");
	goto_xy(0, 5);   printf("┃\n"); goto_xy(50, 5);                     printf("┃\n");
	goto_xy(0, 6);   printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 7);   printf("┃★ A :"); goto_xy(7, 7); printPoLlyn(a);  goto_xy(50, 7);  printf("┃");
	goto_xy(0, 8);   printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 9);   printf("┃★ B :"); goto_xy(7, 9); printPoLlyn(b);  goto_xy(50, 9);  printf("┃");
	goto_xy(0, 10);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 11);  printf("┃★ C :"); goto_xy(7, 11); printPoLlyn(c);  goto_xy(50, 11);  printf("┃");
	goto_xy(0, 12);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 13);  printf("┃   按7进行多项式相加     ┃   按8进行多项式相减   ┃\n");
	goto_xy(0, 14);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 15);  printf("┃   按0进行多项式输入     ┃   按enter执行确定换行 ┃\n");
	goto_xy(0, 16);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 17);  printf("┃   按1计算多项式A的值    ┃   按2计算多项式B的值  ┃\n");
	goto_xy(0, 18);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 19);  printf("┃   按3计算多项式C的值    ┃   按t退出多项式计算器 ┃\n");
	goto_xy(0, 20);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 21);  printf("┃                                                 ┃\n");
	goto_xy(0, 22);  printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
	goto_xy(1, 23);  printf("【 一元稀疏多项式简单计算器】");
	goto_xy(2, 3);
}

代码

#define _CRT_SECURE_NO_WARNINGS   
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include <conio.h>
#include <windows.h>
double coefs[80];  //存系数 
int expns[80];  //存指数 
int cnt, m;
double get_coef(char *str)  //在输入的字符串中提取系数
{
	double s = 0.0;
	double d = 10.0;
	bool flag = false;
	while (*str == ' ')  str++;
	if (*str == '-')//记录数字正负  
	{
		flag = true;  str++;
		if (*str == 'x') 	return -1.0;
	}
	else if ((*str == '+'&&*(str + 1) == 'x') || (*str == 'x')) return 1.0;
	if (*str == '+' && (*(str + 1) >= '0'&&*(str + 1) <= '9'))str++;
	if (!(*str >= '0'&&*str <= '9'))     return s; //如果一开始非数字则退出,返回0.0     
	while (*str >= '0'&&*str <= '9'&&*str != '.')//计算小数点前整数部分  
	{
		s = s * 10.0 + *str - '0';
		str++;
	}
	if (*str == '.')    str++;         //以后为小数部分      
	while (*str >= '0'&&*str <= '9')  //计算小数部分  
	{
		s = s + (*str - '0') / d;
		d *= 10.0;
		str++;
	}
	return s * (flag ? -1.0 : 1.0);
}
void getNums() //在输入的字符串中提取系数和指数
{
	int i = 0;
	cnt = 0;
	double coef;
	int expn;
	char str[80];
	scanf("%s", str);
	while (*(str + i))
	{
		coef = get_coef(str + i);
		if (*(str + i) != 'x') i++;
		while ((*(str + i) >= '0'&&*(str + i) <= '9') || (*(str + i) == '.'))  	i++;
		if (*(str + i) == '+' || *(str + i) == '-' || *(str + i) == '\0')            expn = 0;
		else if (*(str + i) == 'x')
		{
			i++;
			if (*(str + i) == '+' || *(str + i) == '-' || *(str + i) == '\0') expn = 1;
			else if (*(str + i) == '^')
			{
				i++;
				expn = (int)get_coef(str + i);
				while ((*(str + i) >= '0'&&*(str + i) <= '9') || (*(str + i) == '.'))i++;
			}
		}
		coefs[cnt] = coef;
		expns[cnt] = expn;
		cnt++;
	}
}
typedef struct Polynomial //多项式
{
	double coef; //系数
	int expn;   //指数
	struct Polynomial *next;//指针
} Polynomial, *Polyn;
//创建一个头指针为head,项数为m的一元多项式
void CreatPolyn(Polyn head, int m)  //建立链表,在插入过程中实现单链表有序
{
	for (int i = 0; i < m; i++)
	{
		Polyn p = (Polyn)malloc(sizeof(struct Polynomial));
		p->coef = coefs[i];
		p->expn = expns[i];
		if (p->coef == 0) free(p);
		else
		{
			Polyn q1, q2;
			q1 = head;
			q2 = head->next;
			while (q2 != NULL && p->expn < q2->expn)
			{
				q1 = q2;
				q2 = q2->next;
			}
			if (q2 != NULL && p->expn == q2->expn)
			{
				q2->coef += p->coef;
				if (q2->coef == 0)
				{
					q1->next = q2->next;
					free(q2);
				}
				free(p);
			}
			else
			{
				p->next = q2;
				q1->next = p;
			}
		}
	}
}
void printPoLlyn(Polyn head) //进行格式化打印输出
{
	Polyn q = head->next;
	int flag = 0;     //记录是否为第一项
	if (!q)
	{
		puts("NULL(0)\t");
		return;
	}
	while (q)
	{
		if (q->coef > 0 && flag == 1)
		{
			printf("+");
		}
		flag = 1;
		if (q->coef != 1 && q->coef != -1)
		{
			printf("%g", q->coef);

			if (q->expn == 1) printf("x");
			else if (q->expn != 0) printf("x^%d", q->expn);
		}
		else
		{
			if (q->coef == 1)
			{
				if (q->expn == 0) printf("1");
				else if (q->expn == 1) printf("x");
				else printf("x^%d", q->expn);
			}
			if (q->coef == -1)
			{
				if (q->expn == 0) printf("-1");
				else if (q->expn == 1) printf("-x");
				else printf("-x^%d", q->expn);
			}
		}
		q = q->next;
	}
	printf("\t\t");
}
int compare(Polyn a, Polyn b)//比较两个多项式的大小
{
	if (a&&b)  // 多项式a和b均不为空
	{
		if (a->expn > b->expn) return 1;// a的指数大于b的指数
		else if (a->expn < b->expn) return -1;
		else return 0;
	}
	else if (!a&&b) return -1; //a为空,b不为空
	else if (a && !b) return 1;  //b为空,a不为空 
	else if (!a && !b)return 0;  //a,b均为空
}
void clear(Polyn c)
{
	Polyn p, q;
	p = c;
	while (p->next != NULL)
	{
		q = p->next;
		p->next = q->next;
		free(q);
	}
	c->next = NULL;
}
void addPolyn(Polyn a1, Polyn b1, Polyn c1)  //求解a+b
{
	Polyn a = a1;
	Polyn b = b1;
	Polyn c = c1;
	clear(c1);
	Polyn head, qc;
	Polyn qa = a->next;
	Polyn qb = b->next;
	head = c;
	while (qa || qb)
	{
		qc = (Polyn)malloc(sizeof(Polynomial));
		if (compare(qa, qb) == 1)
		{
			qc->coef = qa->coef;
			qc->expn = qa->expn;
			qa = qa->next;
		}
		else if (compare(qa, qb) == 0) //指数相同,直接相加
		{
			qc->coef = qa->coef + qb->coef;
			qc->expn = qa->expn;
			qa = qa->next;
			qb = qb->next;
		}
		else
		{
			qc->coef = qb->coef;
			qc->expn = qb->expn;
			qb = qb->next;
		}

		if (qc->coef != 0) //将该节点插入链表中
		{
			qc->next = c->next;
			c->next = qc;
			c = qc;
		}
	}
}
void subPolyn(Polyn a, Polyn b, Polyn c)// a-b可以用a+b来求解,把b改成-b
{
	Polyn h = b;
	Polyn p = b->next;
	while (p)
	{
		p->coef *= -1;
		p = p->next;
	}
	addPolyn(a, h, c);
	for (Polyn i = h->next; i != 0; i = i->next)
	{
		i->coef *= -1;
	}
}
void goto_xy(int x, int y)
{
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos = { x,y };
	SetConsoleCursorPosition(hOut, pos);
}
void value(Polyn head, int flag)  //计算x的值
{
	goto_xy(2, 3); printf(" x = ");
	double sum = 0, x;
	scanf("%lf", &x);
	for (Polyn p = head->next; p != 0; p = p->next)
	{
		double tmp = 1;
		int expn = p->expn;
		while (expn != 0) //指数不为0
		{
			if (expn < 0)      tmp /= x, expn++;
			else if (expn > 0) tmp *= x, expn--;
		}
		sum += p->coef*tmp;
	}
	goto_xy(2, 4);
	if (flag == 1) printf(" A( %g )的值 = %g", x, sum);
	if (flag == 2) printf(" B( %g )的值 = %g", x, sum);
	if (flag == 3) printf(" C( %g )的值 = %g", x, sum);
}
void show(Polyn a, Polyn b, Polyn c) //界面实现
{
	goto_xy(0, 0); 	 printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
	goto_xy(0, 1);   printf("┃            一元稀疏多项式简单计算器             ┃\n");
	goto_xy(0, 2);   printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ┫");
	goto_xy(0, 3);   printf("┃\n"); goto_xy(50, 3);                     printf("┃\n");
	goto_xy(0, 4);   printf("┃\n"); goto_xy(50, 4);                     printf("┃\n");
	goto_xy(0, 5);   printf("┃\n"); goto_xy(50, 5);                     printf("┃\n");
	goto_xy(0, 6);   printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 7);   printf("┃★ A :"); goto_xy(7, 7); printPoLlyn(a);  goto_xy(50, 7);  printf("┃");
	goto_xy(0, 8);   printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 9);   printf("┃★ B :"); goto_xy(7, 9); printPoLlyn(b);  goto_xy(50, 9);  printf("┃");
	goto_xy(0, 10);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 11);  printf("┃★ C :"); goto_xy(7, 11); printPoLlyn(c);  goto_xy(50, 11);  printf("┃");
	goto_xy(0, 12);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 13);  printf("┃   按7进行多项式相加     ┃   按8进行多项式相减   ┃\n");
	goto_xy(0, 14);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 15);  printf("┃   按0进行多项式输入     ┃   按enter执行确定换行 ┃\n");
	goto_xy(0, 16);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 17);  printf("┃   按1计算多项式A的值    ┃   按2计算多项式B的值  ┃\n");
	goto_xy(0, 18);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 19);  printf("┃   按3计算多项式C的值    ┃   按t退出多项式计算器 ┃\n");
	goto_xy(0, 20);  printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┫");
	goto_xy(0, 21);  printf("┃                                                 ┃\n");
	goto_xy(0, 22);  printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
	goto_xy(1, 23);  printf("【 一元稀疏多项式简单计算器】");
	goto_xy(2, 3);
}
void create(Polyn a1, Polyn b1)
{
	Polyn a = a1;
	Polyn b = b1;
	clear(a1);
	clear(b1);
	goto_xy(2, 3); printf("请输入多项式a :  ");   getNums();
	m = cnt;
	CreatPolyn(a, m);
	goto_xy(2, 4); printf("请输入多项式b :  ");	  getNums();
	m = cnt;
	CreatPolyn(b, m);
}
int main()
{
	Polyn a = (Polyn)malloc(sizeof(struct Polynomial)); a->next = NULL;
	Polyn b = (Polyn)malloc(sizeof(struct Polynomial)); b->next = NULL;
	Polyn c = (Polyn)malloc(sizeof(struct Polynomial)); c->next = NULL;
	system("一元多项式计算器 ");
	system("mode con cols=52 lines=25");
	system("color e0");
	char ch, ch1;
	while (1)
	{
		system("cls");
		show(a, b, c);
		ch = _getch();
		if (ch == '0')
		{
			create(a, b);
		}
		else if (ch == '7')
		{
			addPolyn(a, b, c);
		}
		else if (ch == '8')
		{
			subPolyn(a, b, c);
		}
		else if (ch == 't')
		{
			exit(0);
		}
		else if (ch == '1')
		{
			value(a, 1);
			ch1 = _getch();
		}
		else if (ch == '2')
		{
			value(b, 2);
			ch1 = _getch();
		}
		else if (ch == '3')
		{
			value(c, 3);
			ch1 = _getch();
		}
	}
	return 0;
}


  • 16
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林小鹿@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值