日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构课程设计---实现一元稀疏多项式计算器

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构课程设计---实现一元稀疏多项式计算器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

課程設計課題:
設計一個一元稀疏多項式簡單計算器,能夠實現五大基本功能:
(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處的值;

控制臺輸出代碼

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> typedef struct Polynomial //多項式 {float coef; //系數int expn; //指數struct Polynomial *next;//指針 } Polynomial, *Polyn; //創建一個頭指針為head,項數為m的一元多項式 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項的系數與指數:", 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; //記錄是否為第一項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)//比較兩個多項式的大小 {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均為空 } Polyn addPolyn(Polyn a, Polyn b) //求解a+b,并返回頭結點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) //指數相同,直接相加{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 = 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) //計算x的值 {double sum = 0;for (Polyn p = head->next; p != 0; p = p->next){int tmp = 1;int expn = p->expn;while(expn != 0) //指數不為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的項數:");scanf("%d", &m);a = CreatPolyn(a, m);printPoLlyn(a);printf("請輸入b的項數:");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的多項式的值為:%.2lf", value(a,x));return 0; } /* 測試數據: 3 2 1 5 8 -3.1 11 3 7 0 -5 8 11 9 1 */

控制臺輸出的代碼沒有用戶界面,需要用戶自己輸入項數什么什么,總之是一個測試版。

具體參考課設參考

修改之后的代碼具有控制臺界面,代碼如下:

#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->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("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;}} } 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++;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) //界面實現 {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 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; }

最后出來的效果圖如下:

任務一 進行多項式的輸入和建立

任務二進行多項式的加減

(1)多項式相加

設計思想: 我們從頭到尾處理兩個多項式的每一項。如果兩項中,多項式a的項的指數大于多項式b的項的指數,那么將a的此項直接作為多項式c的一項。如果多項式a的指數等于多項式b的指數,將兩項合并作為多項式c的一項。如果多項式a的指數小于多項式b的指數,那么將b的此項直接作為多項式c的一項。


2)多項式相減
設計思想:多項式相減的思路和多項式相加類似,A-B 就類似于 A+(-B)
,將多項式中每個系數取反之后建立新的多項式。

優化后的界面:

總結

現在,時隔兩個星期了,我才來把總結寫一下,覺得自己技術水平十分的話,只有兩分。好像百廢待興,什么都需要重新來學一下,每一次課程設計,因為技術水平的不行加上自己先天的敏感體質,就會感受到情緒上的波動。

菜,確實菜,創新能力和學習能力確實比不上大佬,很多時候努努力也只是趕上平均水平。很多源碼都是直接copyCSDN上很多大佬的,有的時候看不到自己的進步是件非常沮喪的事情。

這學期如果有機會我想重新找一下學習的狀態,君子慎獨,往往在一個人的時候越容易禁不住誘惑。做好自我管理,做事情,做好風險與收益分析。珍惜好時間和感情,提高控制時間和情緒的能力,有的時候,忍一忍,有的時候,沖一沖。人生還長,貴在細水長流。現在你就是要好好學習,提高搞錢能力,提高自己的能力是重中之重,從高中到了大學,才慢慢明白自己上大學的意義,就是有一段自己能夠安靜思考未來的世回見,五路你如何,能夠擁有這一段奮斗歲月是一種寶貴的財富。

編程是一種積累的過程,像是寫作文一樣,不僅需要很堅定的基礎這也是必須首先學習的,還需要有厚實基礎后的創新和隨心,只有讓代碼實現自己的想法,才能夠實現編碼的正反顧過程,讓自己能越來越愛上編程,愛上軟件開發。

當然時間是不會等你的,如果你還有著高薪夢想,你就應該盡早努力,思考未來,前路漫漫,互聯網風向誰知道會在何方,還好自己已經做了考研的打算,能夠給自己留有一定的上升空間,不過也要準備好工作的準備,能夠在有限的時間,提高自己的能力,保持核心競爭力。

時間時間,還是時間,縱向控制好時間段,橫向保證時間快為總體效率服務。

總結

以上是生活随笔為你收集整理的数据结构课程设计---实现一元稀疏多项式计算器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。