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

您所在的位置:网站首页 计算器基本功能是什么 一元稀疏多项式计算器 【 数据结构课设作业 】 带界面,无bug,可以直接运行

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

#一元稀疏多项式计算器 【 数据结构课设作业 】 带界面,无bug,可以直接运行| 来源: 网络整理| 查看: 265

一元稀疏多项式计算器 问题描述

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

基本要求

(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 #include #include #include #include #include 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) = '0'&&*str = '0'&&*str 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) i++; expn = (int)get_coef(str + i); while ((*(str + i) >= '0'&&*(str + i) for (int i = 0; i Polyn q1, q2; q1 = head; q2 = head->next; while (q2 != NULL && p->expn 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 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--; } 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; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3