目录
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