第一篇:數據結構24點游戲源代碼
#include
eOperator = 1 //算子 };
int oper[7]={43,45,42,47,40,41,35};
char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
typedef struct sqlist{ int bol;//bol 是 0 時,num-ch是一個數字;bol 是 1 時 num_ch 運算符
int num_ch;struct sqlist *next;}sqlist;//線性表
typedef struct sqstack{ int *base;int *top;int stacksize;}sqstack;//棧的定義
unsigned char Prior[7][7] = {// 課本 表3.1 算符間的優先關系
'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','=' };
int init_sq(sqlist *l){//初始化鏈表
l=(sqlist*)malloc(sizeof(sqlist));if(l==NULL){
exit(-2);} l->next=NULL;return 1;}
int insert_sq(sqlist **p,int e,int bl){//鏈表插入操作
sqlist *q;q=(sqlist*)malloc(sizeof(sqlist));q->num_ch=e;q->bol=bl;q->next=NULL;(*p)->next=q;(*p)=(*p)->next;return 1;}
int check(sqlist l)//保證輸入的數字是給出的四個數字 { int right=1,find=0,i;sqlist *q=&l;q=q->next;for(;q->next!=NULL;q=q->next){
if(q->bol==1){
if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){
right=0;
printf(“%c不是有效的運算符!n”);
}
}
else {
find=0;
for(i=0;i<4;i++){
if(number[1][i]==0&&number[0][i]==q->num_ch){
number[1][i]=1;
find=1;
break;
}
}
if(find==0){
printf(“%d 不在給出的四個數字中!n”,q->num_ch);
right=0;
}
} }//end for for(i=0;i<4;i++){
if(number[1][i]==0){
printf(“%d沒有用上!n”,number[0][i]);
right=0;
} } return right;}
int chang(char *s,sqlist *l){//將用戶的輸入轉化為單鏈表
int t=0;unsigned int i=0;int bl,ch;int a1,a2,a;sqlist *p=l;for(;i if(s[i]>47&&s[i]<58&&t==0){ a1=(int)s[i]-48; t++; } else if(s[i]>47&&s[i]<58&&t==1){ a2=(int)s[i]-48; a=a1*10+a2; t++; } else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){ if(t==1){ bl=0; insert_sq(&p,a1,bl); t=0; } else if(t==2){ bl=0; insert_sq(&p,a,bl); t=0; } bl=1; ch=(int)s[i]; insert_sq(&p,ch,bl); t=0; } else { printf(“%c不是有效的運算符!n”,s[i]); } } //end for i=strlen(s)-1;if(s[i]>47&&s[i]<58){ if(s[i-1]>47&&s[i-1]<58){ bl=0; insert_sq(&p,a,bl); } else { bl=0; insert_sq(&p,a1,bl); } } bl=1;a=35;insert_sq(&p,a,bl);return(check(*l));} int Operate(int a,int theta, int b){//計算 switch(theta){ case 43: return a+b;case 45: return a-b;case 42: return a*b;case 47: { if(b==0){ return-2000; } if(a%b==0){ return a/b; } else {//printf(“不能為小數n”); return-10000; } } default : return 0;} } int ReturnOpOrd(char op,char* TestOp)// precede()函數調用求優先級 { int i;for(i=0;i< OPSETSIZE;i++){ if(op == TestOp[i])return i;} return 0;} char precede(char Aop, char Bop){ return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];} int initstack(sqstack *s){(s)->base =(int*)malloc(STACK_INIF_SIZE*sizeof(int));if((s)->base==NULL)exit(-2);(s)->top=(s)->base;(s)->stacksize = STACK_INIF_SIZE;return 1;} int gettop(sqstack *s){ //取得棧頂元素 int e;if(s->top==s->base){ printf(“棧空,無法取得棧頂元素!n”); return 0;} e=*(s->top-1);return e;} int push(sqstack *s,int e){ //壓棧 if(s->top-s->base>=s->stacksize){ s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int)); if(!s->base)exit(-2); s->stacksize+= STACKINCREMENT;} *(s->top++)=e;return 1;} int pop(sqstack *s,int *e){ //出棧 if(s->top==s->base){ printf(“棧空,出棧錯誤!n”); return 0;} *e=*(--s->top);return 1;} int EvaluateExpression(char* MyExpression){ // 算法3.4----計算表達式的值 // 算術表達式求值的算符優先算法。 // 設OPTR和&&OPND分別為運算符棧和運算數棧 int result;sqstack OPTR; // 運算符棧,字符元素 sqstack OPND; // 運算數棧,實數元素 int c,bl,a,b,theta,top;sqlist *q,l;char *s=MyExpression;init_sq(&l);if(chang(s,&l)!=0){ q=&l; initstack(&OPTR); push(&OPTR, 35); initstack(&OPND); q=q->next; c=q->num_ch; bl=q->bol; while((c!= 35 || gettop(&OPTR)!=35)){ if(bl!=1){ push(&OPND, c); q=q->next; c=q->num_ch; bl=q->bol; } // 不是運算符則進棧 else{ top=gettop(&OPTR); switch(precede((char)top,(char)c)){ case '<': // 棧頂元素優先權低 push(&OPTR, c); q=q->next; c=q->num_ch; bl=q->bol; break; case '=': // 脫括號并接收下一字符 pop(&OPTR, &c); q=q->next; c=q->num_ch; bl=q->bol; break; case '>': // 退棧并將運算結果入棧 pop(&OPTR, &theta); pop(&OPND, &b); pop(&OPND, &a); push(&OPND, Operate(a, theta, b)); break; default : printf(“沒有這個運算符!n”); return 0; } // switch }//else } // while result=gettop(&OPND); return result;} else { printf(“你的輸入有錯誤!n”); return 0;} } int randomm()//產生四個隨機數 { int i=0;srand((unsigned)time(NULL));for(;i<4;i++){ number[0][i]=0; number[0][i]=rand(); number[0][i]%=13; number[0][i]++; number[1][i]=0;} return number[2][4];} int CalcOneExpress(int expression[][2])// 計算表達式 { // 算術表達式求值的算符優先算法。 // 設OPTR和&&OPND分別為運算符棧和運算數棧,OP為運算符集合。int index=0,result,c,theta,a,b;sqstack OPTR; // 運算符棧,字符元素 sqstack OPND; // 運算數棧,實數元素 initstack(&OPTR);push(&OPTR, 35);initstack(&OPND);c=expression[index][0];while(c!= 35 || gettop(&OPTR)!=35){ if(expression[index][1]!=1){ push(&OPND, c); index++; c=expression[index][0];} // 不是運算符則進棧 else { switch(precede((char)gettop(&OPTR),(char)c)) { case '<': // 棧頂元素優先權低 push(&OPTR, c); index++; c=expression[index][0]; break; case '=': // 脫括號并接收下一字符 pop(&OPTR, &c); index++; c=expression[index][0]; break; case '>': // 退棧并將運算結果入棧 pop(&OPTR, &theta); pop(&OPND, &b); pop(&OPND, &a); push(&OPND, Operate(a, theta, b)); break; default : printf(“沒有這個運算符n”); return 0; } // switch }//else } // while result=gettop(&OPND);return result;} int Equal24(int n){ if(n==24){ return 1;} else return 0;} //括號的幾種情況 //1 無括號 //2(a b)c d 同a b(c d), 下省略 //3(a b c)d //4(a b)(c d)//5((a b)c)d int CalcArray1(int iNumInput[2][4]){ // a * b * c * d 7 個字符 int expression[8][2],ii,jj,kk;int i,j,k,l,dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[0][0]=iNumInput[0][i]; expression[2][0]=iNumInput[0][j]; expression[4][0]=iNumInput[0][k]; expression[6][0]=iNumInput[0][l]; expression[0][1]=eNumber; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[6][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[1][0] = oper[ii]; expression[1][1] = eOperator; expression[3][0] = oper[jj]; expression[3][1] = eOperator; expression[5][0] = oper[kk]; expression[5][1] = eOperator; expression[7][0] = oper[6]; expression[7][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以這樣運算:%d%c%d%c%d%c%dn”,expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray2(int iNumInput[2][4]){ //(a * b)* c * d //9 number int expression[10][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[6][0]=iNumInput[0][k]; expression[8][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[6][1]=eNumber; expression[8][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[2][0] = oper[ii]; expression[2][1] = eOperator; expression[4][0] = oper[5]; expression[4][1] = eOperator; expression[5][0] = oper[jj]; expression[5][1] = eOperator; expression[7][0] = oper[kk]; expression[7][1] = eOperator; expression[9][0] = oper[6]; expression[9][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以這樣運算:%c%d%c%d%c%c%d%c%dn”,oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],expression[6][0],oper[kk],expression[8][0]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray3(int iNumInput[2][4]){ //(a * b * c)* d //9 number int expression[10][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[5][0]=iNumInput[0][k]; expression[8][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[5][1]=eNumber; expression[8][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[2][0] = oper[ii]; expression[2][1] = eOperator; expression[4][0] = oper[jj]; expression[4][1] = eOperator; expression[6][0] = oper[5]; expression[6][1] = eOperator; expression[7][0] = oper[kk]; expression[7][1] = eOperator; expression[9][0] = oper[6]; expression[9][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以這樣運算:%c%d%c%d%c%d%c%c%dn”,oper[4],expression[1][0],oper[ii],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray4(int iNumInput[2][4]){ //(a * b)*(c * d)//11 numbers int expression[12][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[7][0]=iNumInput[0][k]; expression[9][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[7][1]=eNumber; expression[9][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[2][0] = oper[ii]; expression[2][1] = eOperator; expression[4][0] = oper[5]; expression[4][1] = eOperator; expression[5][0] = oper[jj]; expression[5][1] = eOperator; expression[6][0] = oper[4]; expression[6][1] = eOperator; expression[8][0] = oper[kk]; expression[8][1] = eOperator; expression[10][0] = oper[5]; expression[10][1] = eOperator; expression[11][0] = oper[6]; expression[11][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以這樣運算:%c%d%c%d%c%c%c%d%c%d%cn”,oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],oper[4],expression[7][0],oper[kk],expression[9][0],oper[5]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray5(int iNumInput[2][4]){ //((a * b)* c)* d //11 numbers int expression[12][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[2][0]=iNumInput[0][i]; expression[4][0]=iNumInput[0][j]; expression[7][0]=iNumInput[0][k]; expression[10][0]=iNumInput[0][l]; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[7][1]=eNumber; expression[10][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[1][0] = oper[4]; expression[1][1] = eOperator; expression[3][0] = oper[ii]; expression[3][1] = eOperator; expression[5][0] = oper[5]; expression[5][1] = eOperator; expression[6][0] = oper[jj]; expression[6][1] = eOperator; expression[8][0] = oper[5]; expression[8][1] = eOperator; expression[9][0] = oper[kk]; expression[9][1] = eOperator; expression[11][0] = oper[6]; expression[11][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以這樣運算:%c%c%d%c%d%c%c%d%c%c%dn”,oper[4],oper[4],expression[2][0],oper[ii],expression[4][0],oper[5],oper[jj],expression[7][0],oper[5],oper[kk],expression[10][0]); return 1; } } } }//end of for oper } } } } return 0;} int Calc24(int number[2][4]){ int find=0;//括號的 5 種情況 //1 a b c d //2(a b)c d 同 a b(c d)和 a(b c)d //3(a b c)d //4(a b)(c d)//5((a b)c)d 同(a(b c))d if(CalcArray1(number)){ find=1; return 1;} if(CalcArray2(number)){ find=1; return 1;} if(CalcArray3(number)){ find=1; return 1;} if(CalcArray4(number)){ find=1; return 1;} if(CalcArray5(number)){ find=1; return 1;} if(find==0){ printf(“這四個數字算不出24點.n”); return 0;} return 0;} void gameinformation(){ printf(“┌────────────────────────┐n”);printf(“│ 點 游 戲 │n”);printf(“│ 學號: │n”);printf(“│ 設計人:XXX │n”);printf(“│ 完成時間:2015年7月20日 │n”);printf(“└────────────────────────┘nn”);} void menu(){ char s[40],ch,mood;int result,t=1,t0=1,nall=0,nright=0,t1=1;double right;while(t==1){ printf(“本游戲有以下三種模式可選擇↓n”); printf(“┌────────────────────────┐n”); printf(“│→ 0.開始游戲 │n”); printf(“│◇ 1.游戲規則 │n”); printf(“│→ 2.退出游戲 │n”); printf(“└────────────────────────┘nn”); printf(“請輸入選項所對應的數字↑:”); scanf(“ %c”,&mood); if(mood=='0'){ //計算機成四個數字,游戲者求表達式 nall=0; nright=0; t0=1; while(t0==1) { number[2][4]=randomm(); printf(“這四個數是: %d %d %d %dn”,number[0][0],number[0][1],number[0][2],number[0][3]); printf(“請輸入算式n”); printf(“如果你認為這四個數算不出24點,請輸入'?'n”); printf(“計算機將會給出答案,算不出也是一種答案!n”); printf(“你的算式是:”); scanf(“%s”,s); if(s[0]=='?'){ if(Calc24(number)==0){ nright++; } nall++; } else { result=EvaluateExpression(s); printf(“你輸入的算式的結果是: %d n”,result); if(result==24) { printf(“你贏了!n”); nright++; nall++; } else { 字 printf(“你輸了!n”); nall++; } }//else right=(double)nright/nall; printf(“你共做了 %d 道,做對了 %d 道,正確率為:%.2f%%n”,nall,nright,right*100); printf(“繼續這個模式嗎?請選擇: 'y':繼續 'n':退出?n”); scanf(“ %c”,&ch); if(ch=='n'||ch=='N'){ t0=0; } else if(ch=='Y'||ch=='y')t0=1; else{ printf(“你的選擇(輸入)有誤!n”); t0=0; } } }//end mood 0 else if(mood=='1'){ //游戲規則說明 printf(“ 規則其實很簡單: n”); printf(“ 只能使用+,-,*,/,(,)這6種符號完成表達式 printf(” 當然也允許改變數字順序n“); printf(” 下面請看示例:n“); printf(” 系統給出的數字為:1 5 5 5n“); printf(” 你只要輸入(5-1/5)*5 即可n“); printf(”n“); printf(”n“); printf(”n“); }//end mood 1 else if(mood=='2'){//退出游戲 printf(”游戲結束!n“); t=0; } else { printf(”mood =%cn“,mood); printf(”您的輸入有誤,游戲結束!n“); t=0; } }//end big while n”);} void main(){ gameinformation();//輸出作者信息 menu();//輸出功能菜單,游戲開始 } #include gets(str); if(strlen(str)>100) { printf(“每行最多輸入100字符”); break; } if(str[0]==64) { str[0]='
主站蜘蛛池模板:
免费不卡无码av在线观看|
久久精品水蜜桃av综合天堂|
2019日韩中文字幕mv|
少妇的肉体aa片免费|
国产精品女人呻吟在线观看|
日韩一卡2卡3卡4卡新区亚洲|
亚洲综合网站精品一区二区|
无套内射极品少妇chinese|
国产乱辈通伦影片在线播放亚洲|
成年女人a级毛片免费观看|
亚洲一区二区三区av激情|
欧美日韩中文字幕视频不卡一二区|
日韩a片无码毛片免费看|
国内露脸中年夫妇交换|
精品无码一区二区三区水蜜桃|
精品国品一二三产品区别在线观看|
日韩精品一区二区大桥未久|
中文字幕 人妻熟女|
久久日韩乱码一二三四区别|
久久久婷婷五月亚洲97色|
国产精品高清一区二区三区|
国产成人精品视频ⅴa片软件竹菊|
好爽毛片一区二区三区四|
国产精品久久久久久tv|
欧美国产成人精品二区芒果视频|
日韩区欧美国产区在线观看|
亚洲欧美成人一区二区在线电影|
久爱无码精品免费视频在线观看|
三上悠亚精品一区二区久久|
色欲久久综合亚洲精品蜜桃|
国产成人精品无码专区|
一本大道东京热无码|
五月丁香啪啪|
欧美牲交黑粗硬大|
欧美放荡的少妇|
日韩人妻无码中文字幕一区|
欧美va亚洲va在线观看|
国产精品扒开腿做爽爽爽视频|
免费99精品国产自在现线|
久久亚洲精品久久国产一区二区|
又湿又紧又大又爽a视频国产|
第二篇:數據結構課程設計 文章編輯 源代碼