您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C语言课程设计(速算24)
《高级语言程序设计》课程设计报告题目:速算24专业:计算机科学与技术班级:姓名:指导教师:成绩:计算机与信息工程系二0一四年二月二十日目录1、该系统的功能描述........................................32、概要设计......................................33、各功能模块之间的衔接关系.........................44、执行程序时的界面.....................................45、附:源程序..................................................106、总结..................................................237、参考文献.........................................23速算24一、功能描述(对系统要实现的功能进行描述)a.一副牌54张牌,黑桃(SA,SK,SQ,SJ,S10,……,S2),红桃(HA,HK,HQ,HJ,H10,……,H2),方块(DA,DK,DQ,DJ,D10,……,D2),草花(CA,CK,CQ,CJ,C10,……,C2)以及大鬼Q1和小鬼Q2。其中,A,K,Q,J及Q1,Q2的点值分别为:1,13,12,11,1,1。其余点值就是牌值。b.由计算机随机出四张牌。c.用户输入能算出24的表达式(只能用加、减、乘、除及括号组成的四则运算)。d.计算机检验用户给出的表达式正确与否(包括是否用计算机所给出的四张牌),并根据该表达式计算出值,判断用户的方法是否正确。二、概要设计(根据功能描述,建立系统的体系结构,即将整个系统分解成若干子功能模块。)三、各功能模块之间的衔接关系。(并简要说明各模块的功能)。四、执行程序时的界面;主函数调用各子函数子函数:chupai()功能:由电脑随机出牌并显示对应点值。子函数:check()功能:用于检验用户输入的牌的点值是否是电脑出的牌的点值子函数:check()功能:用于检验用户输入的牌的点值是否是电脑出的牌的点值子函数:EvaluateExpression()功能:用于计算用户输入的表达式的值按1:看到电脑随机出的牌及其对应的点值,并出现一些操作提示信息按2:提示让用户输入表达式(表达式中只抱括+、-、*、÷和电脑所出牌的点值)按3:检验用户输入表达式中的值是否是电脑所出牌的点值,并提示找到的是第几张,若全部找出才进行运算。按4:对用户输入的表达式进行运算,看结果是否是24,如果不是,则担示重新输入或重新出牌,若是则完成。按5退出系统五、附上源代码:#includemath.h#includestdio.h#includetime.h#includestdlib.h#includestring.h#definetrue1#definefalse0#defineOPSETSIZE7typedefintStatus;unsignedcharPrior[7][7]={//表3.1算符间的优先关系'','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','=','','','','','','','','','','','','','','','=',};typedefstructStackChar{charc;structStackChar*next;}SC;typedefstructStackFloat{floatf;structStackFloat*next;}SF;SC*Push(SC*s,charc){SC*p=(SC*)malloc(sizeof(SC));p-c=c;p-next=s;returnp;}SF*Push(SF*s,floatf){SF*p=(SF*)malloc(sizeof(SF));p-f=f;p-next=s;returnp;}SC*Pop(SC*s){SC*q=s;s=s-next;free(q);returns;}SF*Pop(SF*s){SF*q=s;s=s-next;free(q);returns;}floatOperate(floata,unsignedchartheta,floatb){switch(theta){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;default:return0;}}charOPSET[OPSETSIZE]={'+','-','*','/','(',')','#'};StatusIn(charTest,char*TestOp){intFind=false;for(inti=0;iOPSETSIZE;i++){if(Test==TestOp[i])Find=true;}returnFind;}intReturnOpOrd(charop,char*TestOp){for(inti=0;iOPSETSIZE;i++)if(op==TestOp[i])returni;}charprecede(charAop,charBop){returnPrior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}floatEvaluateExpression(char*MyExpression){SC*OPTR=NULL;//运算符栈,字符元素SF*OPND=NULL;//运算数栈,实数元素charTempData[20];floatData,a,b;chartheta,*c,Dr[]={'#','\0'};OPTR=Push(OPTR,'#');c=strcat(MyExpression,Dr);strcpy(TempData,\0);//字符串拷贝函数while(*c!='#'||OPTR-c!='#'){if(!In(*c,OPSET)){Dr[0]=*c;strcat(TempData,Dr);//字符串连接函数c++;if(In(*c,OPSET)){Data=atof(TempData);//字符串转换函数(double)OPND=Push(OPND,Data);strcpy(TempData,\0);}}else{//不是运算符则进栈switch(precede(OPTR-c,*c)){case''://栈顶元素优先权低OPTR=Push(OPTR,*c);c++;break;case'='://脱括号并接收下一字符OPTR=Pop(OPTR);c++;break;case''://退栈并将运算结果入栈theta=OPTR-c;OPTR=Pop(OPTR);b=OPND-f;OPND=Pop(OPND);a=OPND-f;OPND=Pop(OPND);OPND=Push(OPND,Operate(a,theta,b));break;}}}returnOPND-f;}int*chupai()//出牌函数{intls[10];int*p;inti,j,q;charmm[54][4]={SA,S2,S3,S4,S5,S6,S7,S8,S9,S10,SJ,SQ,SK,HA,H2,H3,H4,H5,H6,H7,H8,H9,H10,HJ,HQ,HK,DA,D2,D3,D4,D5,D6,D7,D8,D9,D10,DJ,DQ,DK,CA,C2,C3,C4,C5,C6,C7,C8,C9,C10,CJ,CQ,CK,Q1,Q2};srand((unsigned)time(NULL));for(i=0;i4;i++){q=rand()%54;if(i==0){ls[0]=q;printf(%s\n,mm[q]);}else{for(j=0;ji;j++)if(ls[j]==q)break;if(j==i){ls[j]=q;printf(%s\n,mm[q]);}elsei--;}}for(i=0;i4;i++)//将出的牌转换成对应的点值{if(ls[i]==52||ls[i]==53)ls[i]=1;else{ls[i]=ls[i]%13+1;if(ls[i]==0){ls[i]=13;}}}p=ls;returnp;}voidcheck(char*s,int*t)//检验函数{inti,j,c=0,d=4,qw[5]={0};for(i=0;i4;i++)qw[i]=t[i];intdr[20]={0},a[7],count=0,n=3;charOPSET[7]={'+','-','*','/','(',')'};for(i=0;istrlen(s);i++)//将用户输入的表达式中的数值提出{for(j=0;j6;)if(s[i]!=OPSET[j])j++;elsebreak;if(j==6){dr[c]=s[i]-'0';a[c]=i;if(a[c]==a[c-1]+1){dr[c-1]=(s[i-1]-'0')*10+s[i]-'0';c--;}c++;}}for(i=0;istrlen(s);i++){if(dr[i]!=0)printf(%d\n,dr[i]);}for(i=0;istrlen(s);i++)//将用户出的数值和电脑出的牌的点值作比较{for(j=0;j4;j++){if(dr[i]==qw[j]&&dr[i]!=0){for(intm=j;m4;m++)qw[m]=qw[m+1];printf(找到第%d张了%d\n,i,dr[i]);count++;break;}}}if(count==4)printf(经过检验你使用的全是电脑出的牌,谢谢合作!可以进行运算了\n);if(count4){printf(经过检验你使用的不全是电脑出的牌,请重来一次\n);}printf(\n);}voidmain(){printf(\n);printf(\n);printf(请注意:此程序请按1、2、3、4、的步骤及提醒执行,否则将出错...\n);printf(\n);printf(\n);chart[128],c,a;int*ls,qq[4],i;intselect;while(1){printf(1.请出牌\n);printf(2.请输入表达式\n);printf(3.检查表达式是否正确和是否是电脑所出的牌对应的值\n);printf(4.如果正确就请计算表达式的值\n);printf(5.退出系统\n);printf(请选择:);scanf(%d,&select);switch(select){case1:ls=chupai();for(i=0;i4;i++)qq[i]=*(ls+i);printf(%d,%d,%d,%d\n,qq[0],qq[1],qq[2],qq[3]);printf(如果你认为有可以计算出24的可能性,请执行第二步,输入你认为能算出24的表达式,否则重新出牌\n);printf(\n);break;case2:printf(请输入算术表达式\n);gets(t);gets(t);break;case3:check(t,qq);break;case4:printf(%s\b=%g\n,t,EvaluateExpression(t));if(EvaluateExpression(t)==24)printf(youareveryclever!!!!\n);if(EvaluateExpression(t)!=24){printf(请重新输入表达式或重新出牌!!!!\n);}printf(\n
本文标题:C语言课程设计(速算24)
链接地址:https://www.777doc.com/doc-4598989 .html