数据结构大作业……
发出来大家乐呵乐呵……
一、问题描述
给出N个多项式,求他们的和与积
二、解题报告
(1)建立存储结构
1 struct _Poly2 {3 double Data[MAXTIMES+1];4 int Times;5 };6 struct _Poly Poly[N+1];
(2)主程序架构
1 int main()2 {3 int Sum;4 cout<<"请输入要做运算的多项式数量"<>Sum;6 for (int i=1;i<=Sum;++i)7 Input_Poly(i);8 return 0;9 }
俗话(WANGJIANDE)说的好,“主程序很短,写起来很爽”
(3)初始化模块Init_Poly(_Poly Poly0);
1 void Init_Poly(struct _Poly &Poly)2 {3 for (int i=0;i<=Poly.Times;++i)4 Poly.Data[i]=0;5 Poly.Times=0;6 }
(4)输入模块Input_Poly(int i);
1 P.S.对输入的声明 2 3 cout<<"本程序支持两种读入方式,请根据您的需要选择:"<
1 void Input_Poly(int i) 2 { 3 /*初始化多项式*/ 4 Poly[i].Times=MAXTIMES; 5 Init_Poly(Poly[i]); 6 7 /*输入*/ 8 cout<<"即将输入第"<<<"个多项式……"<>Point;12 if (Point==2)13 {14 while (1)15 {16 cout<<"请输入本多项式的次数"< >Poly[i].Times;18 if (Poly[i].Times<0) cout<<"Are U Kidding ME?"< =0;--j)24 cin>>Poly[i].Data[j];25 }26 else if (Point==1)27 {28 int K;29 cout<<"请依次输入非零幂次及对应系数,全部输入完成后请输入-1."< >K;33 if (K>Poly[i].Times) Poly[i].Times=K;34 if (K==-1) break;35 /* if (Poly[i].Times>MAXTIMES)36 {37 cout<<"Sorry,The Number is too large!I Cannot Solve it."< >Poly[i].Data[K];41 }42 43 }44 /*测试输入正确性*/45 cout<<"您输入的多项式为:";46 Output_Data(Poly[i]);47 }
(5)输出模块Output_Data(_Poly Poly0);
没什么特别需要说明的,就是判断的各种情况输出。
1 Void Output_Data(struct _Poly Poly) 2 { 3 cout<<"f(x)="; 4 bool flag=false;///判断是否已经出现过非零输出 5 /*下输出最高次数项到二次项*/ 6 for (int i=Poly.Times;i>=2;--i) 7 { 8 if (fabs(Poly.Data[i])>1e-7) 9 {10 if (!flag)///如果这是第一个输出11 {12 if (Poly.Data[i]!=1) cout<0) ///不是第一次输出,正系数前应该有加号16 {17 cout<<'+';18 if (Poly.Data[i]!=1) cout< 0) ///如果曾经输出过数字,并且一次项系数为正,需要输出加号28 {29 cout<<'+';30 if (Poly.Data[1]!=1) cout< 1e-7)///else if (Poly.Data[1]!=0) 此处等价为(Poly.Data[1]<0 || !flag),即非负或者这是第一个可输出系数,只需输出系数即可36 { 37 if (Poly.Data[1]!=1) cout< 1e-7 && flag )44 cout<<'+'< <
(6)加法模块Init_Poly(_Poly Poly0);
1 /*------------Sum个多项式相加,答案存储在Ploy0中------------*/ 2 void Plus_Poly(int Sum) 3 { 4 struct _Poly Poly0; 5 Init_Poly(Poly0); 6 for (int i=1;i<=Sum;++i) 7 if (Poly[i].Times>Poly0.Times) 8 Poly0.Times=Poly[i].Times; ///寻找最大次数 9 for (int i=1;i<=Sum;++i)10 for (int j=0;j<=Poly0.Times;++j)11 Poly0.Data[j]+=Poly[i].Data[j];///多项式系数相加,得到最终答案12 cout<<"和为:";13 Output_Data(Poly0);14 }
(7)乘法模块Multiply_Poly(int Sum);
1 /*------------Sum个多项式相乘,答案存储在Ploy0中------------*/ 2 void Multiply_Poly(int Sum) 3 { 4 struct _Poly Poly0;//临时空间Poly0存放结果 5 Poly0=Poly[1]; 6 //Output_Data(Poly0); //TEST 7 struct _Poly PolyTmp; 8 for (int i=2;i<=Sum;++i) 9 {10 Init_Poly(PolyTmp);11 PolyTmp.Times=Poly0.Times+Poly[i].Times;///Poly的最高次项系数一定不减少12 // Output_Data(PolyTmp);13 for (int j=Poly[i].Times;j>=0;--j)///第i个多项式的各项14 for (int k=Poly0.Times;k>=0;--k)///Answer多项式的各项15 {16 // cout<<<'='< <
(8)完整代码
1 /*0 2 By 3 Iris.Catch-22.S、` 4 Dept. of Mathematics, 5 School of Science, 6 HIT 7 November,2015 8 */ 9 #define MAXTIMES 101 10 #define N 10 11 #include12 #include 13 using namespace std; 14 15 void CopyRight() 16 { 17 cout<<"---------By ICS,HIT,2015/11----------"< =2;--i) 44 { 45 if (fabs(Poly.Data[i])>1e-7) 46 { 47 if (!flag)///如果这是第一个输出 48 { 49 if (Poly.Data[i]!=1) cout< 0) ///不是第一次输出,正系数前应该有加号 53 { 54 cout<<'+'; 55 if (Poly.Data[i]!=1) cout< 0) ///如果曾经输出过数字,并且一次项系数为正,需要输出加号 65 { 66 cout<<'+'; 67 if (Poly.Data[1]!=1) cout< 1e-7)///else if (Poly.Data[1]!=0) 此处等价为(Poly.Data[1]<0 || !flag),即非负或者这是第一个可输出系数,只需输出系数即可 73 { 74 if (Poly.Data[1]!=1) cout< 1e-7 && flag ) 81 cout<<'+'< < >Point; 97 if (Point==2) 98 { 99 while (1)100 {101 cout<<"请输入本多项式的次数"< >Poly[i].Times;103 if (Poly[i].Times<0) cout<<"Are U Kidding ME?"< =0;--j)109 cin>>Poly[i].Data[j];110 }111 else if (Point==1)112 {113 int K;114 cout<<"请依次输入非零幂次及对应系数,全部输入完成后请输入-1."< >K;118 if (K>Poly[i].Times) Poly[i].Times=K;119 if (K==-1) break;120 /* if (Poly[i].Times>MAXTIMES)121 {122 cout<<"Sorry,The Number is too large!I Cannot Solve it."< >Poly[i].Data[K];126 }127 128 }129 /*测试输入正确性*/130 cout<<"您输入的多项式为:";131 Output_Data(Poly[i]);132 }133 134 /*------------Sum个多项式相乘,答案存储在Ploy0中------------*/135 void Multiply_Poly(int Sum)136 {137 struct _Poly Poly0;138 Poly0=Poly[1];139 //Output_Data(Poly0); //TEST140 struct _Poly PolyTmp;141 for (int i=2;i<=Sum;++i)142 {143 Init_Poly(PolyTmp);144 PolyTmp.Times=Poly0.Times+Poly[i].Times;///Poly的最高次项系数一定不减少145 //cout<<"HAHAHA"< =0;--j)///第i个多项式的各项147 for (int k=Poly0.Times;k>=0;--k)///Answer多项式的各项148 {149 // cout< <<'='< <
---Done By Iris.Catch-22.S、`
这个A版完全是水出来的……我主要功夫花在输入输出的修正上了。然而一坨if还是很讨人厌、
没有比数组更自然、更简便的存储结构了、、、
链表是逻辑自然书写不自然……
嗯、下一个B版是链表的