写点什么

一元稀疏多项式计算器 【 数据结构课设作业 】 带界面

用户头像
极客good
关注
发布于: 刚刚

在建立多项式的过程中,使用系数数组和指数数组进行多项式的建立。 使用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


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


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;


}


}


}

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
一元稀疏多项式计算器  【 数据结构课设作业 】 带界面