一元稀疏多项式计算器 【 数据结构课设作业 】 带界面
在建立多项式的过程中,使用系数数组和指数数组进行多项式的建立。 使用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->nex
t = 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;
}
}
}
评论