最详细的一元稀疏多项式计算器C语言实现

目录

1.程序设计思路

1.框架构想

2.数据结构的选择

2.相应功能的函数实现及程序变量解释

1.处理读入的字符串并将其转换成链表存储多项式信息

2.多项式加减法的实现

 3.多项式升序和降序结果显示

4.计算器界面的实现

5.所用库和宏定义

3.源程序代码


1.程序设计思路

1.框架构想

        本程序的设计目的旨在使用C语言设计一个一元稀疏多项式计算器,其具有计算器可视化界面,多项式的加减法计算功能和自然语言的输入输出方式的功能,计算器根据用户输入的多项式和指定的功能来进行计算,最后输出计算结果。

2.数据结构的选择

        由于多项式是稀疏多项式,故不应该使用数组的形式存储多项式,而应该使用链表存储多项式。

typedef struct 
{
    double coef;                //多项式系数
    int index;                  //多项式指数
}term;

typedef struct poly             //多项式链表存储结构,稀疏多项式所以用链表存储结构
{
    term data;
    poly* next;
}poly_list;

2.相应功能的函数实现及程序变量解释

1.处理读入的字符串并将其转换成链表存储多项式信息

        为了更加贴合日常使用的要求,该程序实现了自然语言读入的方式来进行多项式的输入。为了实现该功能需要将多项式中每项的系数和指数提取出来存入到数组里面,为此设计了Get_coef函数来从字符串当前位置获取一个数字,Getnum函数来处理整个字符串实现多项式信息的转换。

double Get_coef(char *str)  					//在输入的字符串中提取系数
{
	double s = 0.0;
	double d = 10.0;							//处理大于10的系数
	bool flag = false;							//flag为false即为正数
	while (*str == ' ')  
		str++;
	if (*str == '-')							//记录数字正负  
	{
		flag = true;  
		str++;					
		if (*str == 'x' || *str == 'X') 		//如果系数为-1则直接返回
			return -1.0;
	}
	else if ((*str == '+'&& (*(str + 1) == 'x' || *(str + 1) == 'X')) || (*str == 'x')) 		//系数为1则直接返回
		return 1.0;		
	if (*str == '+' && (*(str + 1) >= '0' && *(str + 1) <= '9'))
		str++;
	if (!(*str >= '0' && *str <= '9'))     		//如果一开始非数字则退出,返回0.0 
		return s;     
	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);             //根据flag值返回相应的正负数
}

/*GetNums函数说明:
    该函数实现将输入的字符串中的系数和指数提取存储到数组里面*/
void GetNums(int &cnt, double* coefs, int* indexs) 					
{
	int i = 0;
	cnt = 0;
	double coef;
	int expn = 0;
	char str[80];
	gets (str);														//存放输入的字符串
	while (*(str + i))
	{
		coef = Get_coef(str + i);
		if (*(str + i) != 'x' && *(str + i ) != 'X') 
			i++;
		while ((*(str + i) >= '0' && *(str + i) <= '9') || (*(str + i) == '.') || (*(str + i) == '-'))  	
			i++;
		if (*(str + i) == '+' || *(str + i) == '\0')      									//如果没有X则直接将指数赋值为零      
			expn = 0;
		else if (*(str + i) == 'x' || *(str + i) == 'X') 
		{
			i++;
			if (*(str + i) == '+' || *(str + i) == '\0' || *(str + i) == '-') 				//只有x没有数字说明指数为1			
				expn = 1;							
			else if (*(str + i) == '^')
			{
				i++;
				expn = (int)Get_coef(str + i);
				if (*(str + i) == '-')
					i++;
				while ((*(str + i) >= '0'&&*(str + i) <= '9') || (*(str + i) == '.'))
					i++;
			}
		}
		coefs[cnt] = coef;
		indexs[cnt] = expn;
		cnt++;
	}
}

        在执行完Getnum函数后,从字符串中获得的多项式信息已经存储在coefs和indexs两个数组中,再使用create_poly函数实现将数组信息转化成链表。

/*Create_poly函数说明:
    通过GetNums函数得到的系数和指数生成多项式链表*/
poly_list* Create_poly()                             
{
	double coefs[80];  								//存系数 
	int indexs[80];     							//存指数 
	int count;
	GetNums(count, coefs, indexs);
    poly_list* head;
    head = (poly_list*)malloc(sizeof(poly_list));
    head->next
  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值