《数据结构课程设计》
5 结束语
通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计题目----计算24点,通过用for的多重循环,结合if判断,舍弃多余的循环,提高了程序的运行效率。
在编写这个程序的过程中,我服习了之前学的基本语法,更加深刻的认识到循环是大部分程序的基本要素。结合了这学期学的数据结构,分析算法的时间复杂度,不断改进算法,更加巩固了之前学的知识,比以前更能灵活运用。 此次写的程序还有很大的发展空间,可以通过循环,重复输入数据,多次计算24点。还可以通过设计,让程序能计算出任意结果,不单是 24。在输出方面,为提高运行效率,可以设计只输出一组解。在输入方面,放宽数据类型,例如,可以运算负数,小数等。还可以输入多个数,不局限在4个数。随着数量增加,循环增加,为提高运行效率,可以考虑更改数据类型。
此次课程设计,我受益匪浅,巩固旧知识的同时,学习了新的知识。更重要的是,它使我对数据结构产生了浓厚的兴趣,对编写程序更有信心。
6
《数据结构课程设计》
附录
F1 源代码
#include
int check; //标志能否运算出24
float arithmetic(int flag,float m,float n) //进行四则运算 {
switch(flag) //判断运算符号,返回相对应的运算结果 {
case 0:return (m+n); case 1:return (m-n); case 2:return (m*n); case 3:
if (n==0)
return 10000; //除数为0,则返回10000,使之不能运算出24 else
return (m/n); case 4:return (n-m);
case 5:
if (m==0)
return 10000; //除数为0,则返回10000,使之不能运算出24 else
return (n/m); }
}
default:return 0;
7
《数据结构课程设计》
void show(int type,int i,int j,int k,float a,float b,float c,float d)
//利用参数type选择输出形式,利用参数i,j,k确定输出的运算符号 {
char sign[6]; //定义运算符号数组 sign[0]='+'; sign[1]='-'; sign[2]='*'; sign[3]='/';
sign[4]='-'; //减法不符合交换律 sign[5]='/'; //除法不符合交换律
if (type==1) //根据括号的类型做不同的输出 {
if(j==4 || j==5) //减法和除法
{
if (k==4 || k==5) // a*(b*(c+d)) 形式
cout< cout<<\ } else if (k==4 || k==5)// a*((b+c)*d) 形式 { cout< } else // ((a+b)*c)*d 形式 cout<<\ } if (type==2 || type==3)// (a+b)*(c+d) 形式 { cout<<\ } 8 《数据结构课程设计》 } void calculate(float a,float b,float c,float d) //进行加、减、乘、除运算 { int i,j,k; float sum1,sum2,sum3; //储存 3 次两两运算的结果 for (i=0;i<4;i++) // \个运算符号选3个,有4*4*4=64种 for (j=0;j<6;j++) // 3种运算符排列 有 3!=6 种 for (k=0;k<6;k++) { if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0))) // 括号的类型为(()) { // 3为做除法运算的标志,除数为 0 时,跳过 sum1=arithmetic(i,a,b); //a,b做 以 i 为标志的运算,然后把值赋给sum1 sum2=arithmetic(j,sum1,c); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2 sum3=arithmetic(k,sum2,d); //sum2,d做 以 k 为标志的运算,然后把值赋给sum3 if (fabs(sum3-24)<0.001)//判断能否运算出24,出现小数时,能够包含在内 { check++; //标志能运算出24 show(1,i,j,k,a,b,c,d); // 输出运算出 24 的表达式 } } if (k==2)// ()*() { sum1=arithmetic(i,a,b); //a,b做 以 i 为标志的运算,然后把值赋给sum1 sum2=arithmetic(j,c,d); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2 sum3=sum1*sum2; 9 《数据结构课程设计》 if (fabs(sum3-24)<0.001)//出现小数时,能够包含在内 { check++; //标志能运算出24 show(2,i,j,k,a,b,c,d); // 输出运算出 24 的表达式 } } if (k==3)// 括号的类型为()() { sum1=arithmetic(i,a,b); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2 sum2=arithmetic(j,c,d); //sum1,c做 以 j 为标志的运算,然后把值赋给sum2 if (sum2!=0) { sum3=sum1/sum2; if (fabs(sum3-24)<0.001)//出现小数时,能够包含在内 { check++; //标志能运算出24 show(3,i,j,k,a,b,c,d); // 输出运算出 24 的表达式 } } } } } void main() { int i,j,k,l,m=0; float a[4]; //储存所输入的 4个 整数 while(m==0) 10