数据结构课程设计---实现一元稀疏多项式计算器
課程設(shè)計(jì)課題:
設(shè)計(jì)一個(gè)一元稀疏多項(xiàng)式簡單計(jì)算器,能夠?qū)崿F(xiàn)五大基本功能:
(1)輸入并建立多項(xiàng)式;
(2)輸出多項(xiàng)式,輸出形式為整數(shù)序列:n,c1,e1,c2,e2,…,cn,en,其中n是多項(xiàng)式的項(xiàng)數(shù),ci,ei,分別是第i項(xiàng)的系數(shù)和指數(shù),序列按指數(shù)降序排序;
(3)多項(xiàng)式a和b相加,建立多項(xiàng)式a+b;
(4)多項(xiàng)式a和b相減,建立多項(xiàng)式a-b;
(5)計(jì)算多項(xiàng)式在x處的值;
控制臺輸出代碼
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> typedef struct Polynomial //多項(xiàng)式 {float coef; //系數(shù)int expn; //指數(shù)struct Polynomial *next;//指針 } Polynomial, *Polyn; //創(chuàng)建一個(gè)頭指針為head,項(xiàng)數(shù)為m的一元多項(xiàng)式 Polyn CreatPolyn(Polyn head, int m) {head = (Polyn)malloc(sizeof(struct Polynomial));head->next = NULL;for (int i = 1; i <= m; i++){Polyn p = (Polyn)malloc(sizeof(struct Polynomial));printf("請輸入第%d項(xiàng)的系數(shù)與指數(shù):", i);scanf("%f%d", &p->coef, &p->expn);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->next = q2->next;free(q2);}free(p);}else{p->next = q2;q1->next = p;}}}return head; } void printPoLlyn(Polyn head) {Polyn q = head->next;int flag = 0; //記錄是否為第一項(xiàng)if (!q){puts("0");puts("\n");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("\n"); } int compare(Polyn a, Polyn b)//比較兩個(gè)多項(xiàng)式的大小 {if (a&&b) // 多項(xiàng)式a和b均不為空{if (a->expn > b->expn) return 1;// a的指數(shù)大于b的指數(shù)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均為空 } Polyn addPolyn(Polyn a, Polyn b) //求解a+b,并返回頭結(jié)點(diǎn)head {Polyn head ,qc;Polyn qa = a->next;Polyn qb = b->next;Polyn hc=(Polyn)malloc(sizeof(Polynomial));hc->next = NULL;head = hc;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) //指數(shù)相同,直接相加{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) //將該節(jié)點(diǎn)插入鏈表中{qc->next = hc->next;hc->next = qc;hc = qc;}else free(qc); }return head; } Polyn subPolyn(Polyn a, Polyn b) {Polyn h = b;Polyn p = b->next;while(p){p->coef *= -1;p = p->next;}Polyn head = addPolyn(a, h);for (Polyn i = h->next; i != 0; i = i->next){ i->coef *= -1;} return head; } double value(Polyn head, int x) //計(jì)算x的值 {double sum = 0;for (Polyn p = head->next; p != 0; p = p->next){int tmp = 1;int expn = p->expn;while(expn != 0) //指數(shù)不為0{if (expn < 0) tmp /= x, expn++;else if(expn>0) tmp *= x, expn--;}sum += p->coef*tmp;} return sum; } int main() {int m;Polyn a = 0, b = 0;printf("請輸入a的項(xiàng)數(shù):");scanf("%d", &m);a = CreatPolyn(a, m);printPoLlyn(a);printf("請輸入b的項(xiàng)數(shù):");scanf("%d", &m);b = CreatPolyn(b, m);printPoLlyn(b);printf("輸出 a+b:");printPoLlyn(addPolyn(a, b));printf("輸出 a-b:");printPoLlyn(subPolyn(a, b));printf("請輸入x的值:");int x;scanf("%d", &x);printf("輸出a的多項(xiàng)式的值為:%.2lf", value(a,x));return 0; } /* 測試數(shù)據(jù): 3 2 1 5 8 -3.1 11 3 7 0 -5 8 11 9 1 */控制臺輸出的代碼沒有用戶界面,需要用戶自己輸入項(xiàng)數(shù)什么什么,總之是一個(gè)測試版。
具體參考課設(shè)參考
修改之后的代碼具有控制臺界面,代碼如下:
#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]; //存系數(shù) int expns[80]; //存指數(shù) int cnt, m; double get_coef(char *str) //在輸入的字符串中提取系數(shù) {double s = 0.0;double d = 10.0;bool flag = false;while (*str == ' ') str++;if (*str == '-')//記錄數(shù)字正負(fù) {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; //如果一開始非數(shù)字則退出,返回0.0 while (*str >= '0'&&*str <= '9'&&*str != '.')//計(jì)算小數(shù)點(diǎn)前整數(shù)部分 {s = s * 10.0 + *str - '0';str++;}if (*str == '.') str++; //以后為小數(shù)部分 while (*str >= '0'&&*str <= '9') //計(jì)算小數(shù)部分 {s = s + (*str - '0') / d;d *= 10.0;str++;}return s * (flag ? -1.0 : 1.0); } void getNums() //在輸入的字符串中提取系數(shù)和指數(shù) {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 //多項(xiàng)式 {double coef; //系數(shù)int expn; //指數(shù)struct Polynomial *next;//指針 } Polynomial, *Polyn; //創(chuàng)建一個(gè)頭指針為head,項(xiàng)數(shù)為m的一元多項(xiàng)式 void CreatPolyn(Polyn head, int m) //建立鏈表,在插入過程中實(shí)現(xiàn)單鏈表有序 {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->next = q2->next;free(q2);}free(p);}else{p->next = q2;q1->next = p;}}} } void printPoLlyn(Polyn head) //進(jìn)行格式化打印輸出 {Polyn q = head->next;int flag = 0; //記錄是否為第一項(xiàng)if (!q){puts("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)//比較兩個(gè)多項(xiàng)式的大小 {if (a&&b) // 多項(xiàng)式a和b均不為空{if (a->expn > b->expn) return 1;// a的指數(shù)大于b的指數(shù)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) //指數(shù)相同,直接相加{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) //將該節(jié)點(diǎn)插入鏈表中{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) //計(jì)算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) //指數(shù)不為0{if (expn < 0) tmp /= x, expn++;else 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) //界面實(shí)現(xiàn) {goto_xy(0, 0); printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");goto_xy(0, 1); printf("┃ 山東大學(xué):一元稀疏多項(xiàng)式簡單計(jì)算器 ┃\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進(jìn)行多項(xiàng)式相加 ┃ 按8進(jìn)行多項(xiàng)式相減 ┃\n");goto_xy(0, 14); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");goto_xy(0, 15); printf("┃ 按0進(jìn)行多項(xiàng)式輸入 ┃ 按enter執(zhí)行確定換行 ┃\n");goto_xy(0, 16); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");goto_xy(0, 17); printf("┃ 按1計(jì)算多項(xiàng)式A的值 ┃ 按2計(jì)算多項(xiàng)式B的值 ┃\n");goto_xy(0, 18); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━┫");goto_xy(0, 19); printf("┃ 按3計(jì)算多項(xiàng)式C的值 ┃ 按t退出多項(xiàng)式計(jì)算器 ┃\n");goto_xy(0, 20); printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┫");goto_xy(0, 21); printf("┃ ┃\n");goto_xy(0, 22); printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");goto_xy(1, 23); printf("【 一元稀疏多項(xiàng)式簡單計(jì)算器】");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("請輸入多項(xiàng)式a : "); getNums();m = cnt;CreatPolyn(a, m);goto_xy(2, 4); printf("請輸入多項(xiàng)式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("一元多項(xiàng)式計(jì)算器 ");system("mode con cols=52 lines=25");// system("color e3");system("color 0e");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; }最后出來的效果圖如下:
任務(wù)一 進(jìn)行多項(xiàng)式的輸入和建立
任務(wù)二進(jìn)行多項(xiàng)式的加減
(1)多項(xiàng)式相加
設(shè)計(jì)思想: 我們從頭到尾處理兩個(gè)多項(xiàng)式的每一項(xiàng)。如果兩項(xiàng)中,多項(xiàng)式a的項(xiàng)的指數(shù)大于多項(xiàng)式b的項(xiàng)的指數(shù),那么將a的此項(xiàng)直接作為多項(xiàng)式c的一項(xiàng)。如果多項(xiàng)式a的指數(shù)等于多項(xiàng)式b的指數(shù),將兩項(xiàng)合并作為多項(xiàng)式c的一項(xiàng)。如果多項(xiàng)式a的指數(shù)小于多項(xiàng)式b的指數(shù),那么將b的此項(xiàng)直接作為多項(xiàng)式c的一項(xiàng)。
2)多項(xiàng)式相減
設(shè)計(jì)思想:多項(xiàng)式相減的思路和多項(xiàng)式相加類似,A-B 就類似于 A+(-B)
,將多項(xiàng)式中每個(gè)系數(shù)取反之后建立新的多項(xiàng)式。
優(yōu)化后的界面:
總結(jié)
現(xiàn)在,時(shí)隔兩個(gè)星期了,我才來把總結(jié)寫一下,覺得自己技術(shù)水平十分的話,只有兩分。好像百廢待興,什么都需要重新來學(xué)一下,每一次課程設(shè)計(jì),因?yàn)榧夹g(shù)水平的不行加上自己先天的敏感體質(zhì),就會(huì)感受到情緒上的波動(dòng)。
菜,確實(shí)菜,創(chuàng)新能力和學(xué)習(xí)能力確實(shí)比不上大佬,很多時(shí)候努努力也只是趕上平均水平。很多源碼都是直接copyCSDN上很多大佬的,有的時(shí)候看不到自己的進(jìn)步是件非常沮喪的事情。
這學(xué)期如果有機(jī)會(huì)我想重新找一下學(xué)習(xí)的狀態(tài),君子慎獨(dú),往往在一個(gè)人的時(shí)候越容易禁不住誘惑。做好自我管理,做事情,做好風(fēng)險(xiǎn)與收益分析。珍惜好時(shí)間和感情,提高控制時(shí)間和情緒的能力,有的時(shí)候,忍一忍,有的時(shí)候,沖一沖。人生還長,貴在細(xì)水長流?,F(xiàn)在你就是要好好學(xué)習(xí),提高搞錢能力,提高自己的能力是重中之重,從高中到了大學(xué),才慢慢明白自己上大學(xué)的意義,就是有一段自己能夠安靜思考未來的世回見,五路你如何,能夠擁有這一段奮斗歲月是一種寶貴的財(cái)富。
編程是一種積累的過程,像是寫作文一樣,不僅需要很堅(jiān)定的基礎(chǔ)這也是必須首先學(xué)習(xí)的,還需要有厚實(shí)基礎(chǔ)后的創(chuàng)新和隨心,只有讓代碼實(shí)現(xiàn)自己的想法,才能夠?qū)崿F(xiàn)編碼的正反顧過程,讓自己能越來越愛上編程,愛上軟件開發(fā)。
當(dāng)然時(shí)間是不會(huì)等你的,如果你還有著高薪夢想,你就應(yīng)該盡早努力,思考未來,前路漫漫,互聯(lián)網(wǎng)風(fēng)向誰知道會(huì)在何方,還好自己已經(jīng)做了考研的打算,能夠給自己留有一定的上升空間,不過也要準(zhǔn)備好工作的準(zhǔn)備,能夠在有限的時(shí)間,提高自己的能力,保持核心競爭力。
時(shí)間時(shí)間,還是時(shí)間,縱向控制好時(shí)間段,橫向保證時(shí)間快為總體效率服務(wù)。
總結(jié)
以上是生活随笔為你收集整理的数据结构课程设计---实现一元稀疏多项式计算器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在解决prob中遇到的prob...
- 下一篇: 帝国cms插件支持7.0/7.2 7.5