完美的24点运算与游戏程序
c语言吧
全部回复
仅看楼主
level 5
wyc890618 楼主
花了我好久好久的时间,若各位能找出错误,允许不回帖!
#include "stdio.h"#
include "math.h"#include "time.h"void main(){ void first(); void second(); int third(); time_t t; int close=0; char get; clrscr(); srand((unsigned) time(&t)); for(;;) { clrscr(); printf("24 POINTS SYSTEM v2.2\n"); printf("MADE BY DANTE WANG\n"); printf("Jul.28th 2006\n\n"); printf("Please choose mode!\n\n"); printf("1. Game Mode\n"); printf("2. Count Mode\n"); printf("3. Quit\n\n"); get=getch(); switch(get) { case '1': first(); break; case '2': second();break; case '3': close=third(); break; default: printf("Please input 1, 2 or 3!\n"); getch(); } if(close) break; }}void first(){ int jdgsgn(int a,int b,int c,int d); int n[4],i; char ch[100],ch1[100]; int check(char *p); int exam2(char *p,int a,int b,int c,int d); void sign(int a,int b,int c,int d); double figure(char *p); void draw(int *p); for(;;) { for(i=0;i<4;i++) { n[i]=rand()%13+1; } draw(n); if(!jdgsgn(n[0],n[1],n[2],n[3])) { printf("No answer!"); getch(); continue; } gets(ch); if(!strcmp(strlwr(ch),"quit")) break; else { strcpy(ch1,ch); if(!check(ch)&&!exam2(ch,n[0],n[1],n[2],n[3])&&fabs(figure(ch1)-24)<=0.000001) {printf("\nGood job!\n");getch(); } else {printf("\nWrong!\n\nAnswer: ");sign(n[0],n[1],n[2],n[3]);getch(); } } }}void second(){ int n[4],i; char c[4][10]; int exam(char *p); void sign(int a,int b,int c,int d); double recog(char *p); clrscr(); printf("Input 0 to leave.\n\n"); for(;;) { for(i=0;i<4;i++) { scanf("%s",&c[i]); if(exam(c[i])) {printf("GRAMMER ERROR!\n");i--;continue; } n[i]=(int)recog(c[i]); if(n[i]==0)break; } if(n[0]&&n[1]&&n[2]&&n[3]) sign(n[0],n[1],n[2],n[3]); else break; }}int third(){ printf("Thanks for using this software!\n\n"); printf("If you have any advices or suggestions,\n\n"); printf("welcome to send email to [email protected].\n\n"); getch(); return(1);}void sign(int a,int b,int c,int d){ char *change(int x); double figure(char *p); int i[4],n,n1,n2,n3,n4,s1,s2,s3,t,flag=0; char s[4][2]={"+","-","*","/"},p[64]={0},p1[64]={0}; i[0]=a; i[1]=b; i[2]=c; i[3]=d; for(n1=0;n1<4;n1++) { for(n2=0;n2<4;n2++) { if(n2==n1)continue; for(n3=0;n3<4;n3++) {if(n3==n2||n3==n1) continue;for(n4=0;n4<4;n4++){ if(n4==n3||n4==n2||n4==n1) continue; for(s1=0;s1<4;s1++) { for(s2=0;s2<4;s2++) { for(s3=0;s3<4;s3++) {strcat(p,change(i[n1]));strcat(p,s[s1]);strcat(p,change(i[n2]));strcat(p,s[s2]);strcat(p,change(i[n3]));strcat(p,s[s3]);strcat(p,change(i[n4]));
2006年08月07日 07点08分 1
level 5
wyc890618 楼主
strcpy(p1,p);if(fabs(figure(p1)-24)<=0.000001){ printf("%s\n",p); flag++; break;}*p='\0';if(s1/2==1&&(s2/2==0||s3/2==0)){ strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0';}if(s1/2==0&&s2/2==1){ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0';}if(s2/2==0&&s1/2==1){ strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0';}if((s1/2==0||s2/2==0)&&s3/2==1){ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0';}if(s1/2==0&&s2/2==1&&s3/2==0){ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,"("); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0';} } if(flag)break; } if(flag) break; } if(flag) break;}if(flag) break; } if(flag)break; } if(flag) break; } if(flag==0) printf("No answer!\n");}char *change(int x){ static char a[64]; char *c; c=a+63; *c='\0'; c--; for(;;c--) { if(x>=10) { *c=x%10+'1'-1; x=x/10; } else { *c=x+'1'-1; break; } } return(c);}double figure(char *p){ int judge(char *p); int judge2(char *p); void add(char *p); void pick(char *p); double recog(char *p); char *c=p,*c1,c2[64]; int sign,kuoh=0,flag2=0; double result,chu; add(p); for(sign=0;*c!='\0';c++) { if(*c=='+'||*c=='-'||*c=='*'||*c=='/'||*c=='('||*c==')') { sign++; break; }
2006年08月07日 07点08分 2
level 5
wyc890618 楼主
} if(sign==0) return(recog(p)); else { c=p; for(;*c!='\0';c++) { if(*c=='(')kuoh++; if(*c==')')kuoh--; if(!judge2(c)) {if(*c=='+'&&kuoh==0){ *c='\0'; result=figure(p)+figure(c+1); flag2++; break;}if(*c=='-'&&kuoh==0){ *c='\0'; result=figure(p)-figure(c+1); flag2++; break;} } if(!judge(c)) {if(*c=='*'&&kuoh==0){ *c='\0'; result=figure(p)*figure(c+1); flag2++; break;}if(*c=='/'&&kuoh==0){ *c='\0'; chu=figure(c+1); if(chu==0) { result=99999; } else { result=figure(p)/chu; } flag2++; break;} } } if(flag2) return(result+0); else { pick(p); result=figure(p); return(result+0); } }}int judge(char *p){ char *c=p; int kuoh=0,flag=0; for(c++;*c!='\0';c++) { if(*c=='(') kuoh++; if(*c==')') kuoh--; if(kuoh==0&&(*c=='+'||*c=='-'||*c=='*'||*c=='/')) { flag++; break; } } return(flag);}int judge2(char *p){ char *c=p; int kuoh=0,flag=0; for(c++;*c!='\0';c++) { if(*c=='(') kuoh++; if(*c==')') kuoh--; if(kuoh==0&&(*c=='+'||*c=='-')) { flag++; break; } } return(flag);}void add(char *p){ char *c=p,b[64]; int flag=0; for(;*c!='\0';c++) { if((*c=='-'||*c=='+')&&(*(c+1)>='0'&&*(c+1)<='9')) flag++; if((*c>='0'&&*c<='9'||*c=='.')&&(*(c+1)=='*'||*(c+1)=='/'||*(c+1)=='+'||*(c+1)=='-')) { flag++; break; } if((*c>='0'&&*c<='9'||*c=='.')&&*(c+1)==')') { break; } } if(flag==2) flag=1; else flag=0; if(flag) { c=p; for(;*c!='\0';c++) { if(*(c+1)>='0'&&*(c+1)<='9') {if(*c=='+'||*c=='-'){ strcpy(b,c); *c='('; strcpy(c+1,b);}break; } } c+=2; for(;*c!='\0';c++) { if((*c<'0'||*c>'9')&&*c!='.') {strcpy(b,c);*c=')';strcpy(c+1,b);break; } } }}void pick(char *p){ char *c=p; if(*c=='('&&*(c+strlen(c)-1)==')') { strcpy(c,c+1); *(c+strlen(c)-1)='\0'; }}double recog(char *p){ char *c=p; int flag=0,number; double quan,ans=0; for(;;c++) { if(*c=='.') { flag++; number=c-p; } if(*c!='.'&&(*c<'0'||*c>'9')) break; } if(flag==0) { for(quan=1,c--;c>=p;c--,quan*=10) ans+=(*c-'1'+1)*quan; } else { for(c--,quan=pow(10,number-(c-p));c>=p;c--) { if(*c=='.')continue; else {ans+=(*c-'1'+1)*quan;quan*=10; } } } return(ans);}int exam(char *p){ double recog(char *p); char *c=p; int number=0; for(;*c!='\0';c++) { if(*c>'9'||*c<'0') number++; if(number) break; } if(!number) { if(recog(p)>13||recog(p)<0)
2006年08月07日 07点08分 3
level 5
wyc890618 楼主
number++; } return(number);}void draw(int *p){ time_t t; int n; clrscr(); printf("Press \"quit\" to leave."); srand((unsigned) time(&t)); for(n=0;n<4;n++) { gotoxy(1+7*n,3); printf("\xda\xc4\xc4\xc4\xc4\xbf"); gotoxy(1+7*n,4); printf("\xb3%c \xb3",rand()%4+3); gotoxy(1+7*n,5); printf("\xb3 \xb3"); gotoxy(1+7*n,6); switch(*(p+n)) { case 1:printf("\xb3 A\xb3");break; case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:printf("\xb3%4d\xb3",*(p+n));break; case 11:printf("\xb3 J\xb3");break; case 12:printf("\xb3 Q\xb3");break; case 13:printf("\xb3 K\xb3"); } gotoxy(1+7*n,7); printf("\xc0\xc4\xc4\xc4\xc4\xd9"); gotoxy(1,9); }}int jdgsgn(int a,int b,int c,int d){ char *change(int x); double figure(char *p); int i[4],n,n1,n2,n3,n4,s1,s2,s3,t,flag=0; char s[4][2]={"+","-","*","/"},p[64]={0},p1[64]={0}; i[0]=a; i[1]=b; i[2]=c; i[3]=d; for(n1=0;n1<4;n1++) { for(n2=0;n2<4;n2++) { if(n2==n1)continue; for(n3=0;n3<4;n3++) {if(n3==n2||n3==n1) continue;for(n4=0;n4<4;n4++){ if(n4==n3||n4==n2||n4==n1) continue; for(s1=0;s1<4;s1++) { for(s2=0;s2<4;s2++) { for(s3=0;s3<4;s3++) {strcat(p,change(i[n1]));strcat(p,s[s1]);strcat(p,change(i[n2]));strcat(p,s[s2]);strcat(p,change(i[n3]));strcat(p,s[s3]);strcat(p,change(i[n4]));strcpy(p1,p);if(fabs(figure(p1)-24)<=0.000001){ flag++; break;}*p='\0';if(s1/2==1&&(s2/2==0||s3/2==0)){ strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { flag++; break; } *p='\0';}if(s1/2==0&&s2/2==1){ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { flag++; break; } *p='\0';}if(s2/2==0&&s1/2==1){ strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { flag++; break; } *p='\0';}if((s1/2==0||s2/2==0)&&s3/2==1){ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4]));
2006年08月07日 07点08分 4
level 5
wyc890618 楼主
strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { flag++; break; } *p='\0';}if(s1/2==0&&s2/2==1&&s3/2==0){ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,"("); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { flag++; break; } *p='\0';} } if(flag)break; } if(flag) break; } if(flag) break;}if(flag) break; } if(flag)break; } if(flag) break; } return(flag);}int exam2(char *p,int a,int b,int c,int d){ double recog(char *p); int number=0,num[4],flag=0,n,m; num[0]=a; num[1]=b; num[2]=c; num[3]=d; for(m=0;*p!='\0';p++,m++) { if(*p>='0'&&*p<='9'&&(*(p+1)>'9'||*(p+1)<'0')) number++; if(m>0&&*p>='0'&&*p<='9'&&*(p-1)>='0'&&*(p-1)<='9') continue; if(*p<='9'&&*p>='0') { if(recog(p)>13||recog(p)<1) {flag++;break; } else {for(n=0;n<4;n++){ if(recog(p)==num[n]) { num[n]=0; break; }} } } } if(!flag) { if(number!=4) flag++; else if(num[1]||num[2]||num[3]||num[0])flag++; } return(flag);}int check(char *p){ int kuoh=0,flag=0; for(;*p!='\0';p++) { if(*p==' ') { flag++; break; } if(kuoh<0) { flag++; break; } if(*p=='(') kuoh++; if(*p==')') kuoh--; if((*p=='+'||*p=='-'||*p=='*'||*p=='/')&&(*(p+1)=='*'||*(p+1)=='/'||*(p+1)=='+'||*(p+1)=='-')) { flag++; break; } if(*p=='('&&(*(p+1)>'9'||*(p+1)<'0'&&*(p+1)!='-')) { flag++; break; } if(*p==')'&&*(p+1)!='+'&&*(p+1)!='-'&&*(p+1)!='*'&&*(p+1)!='/'&&*(p+1)!='\0') { flag++; break; } } if(!flag) { if(kuoh!=0) flag++; } return(flag);}
2006年08月07日 07点08分 5
level 5
wyc890618 楼主
由于百度会将特定的字符组进行转换,比如,自动将“(c)”转换为©,请大家自行改正。可利用记事本替换功能。给大家带来的不便,请多包涵~~~!
2006年08月07日 07点08分 6
level 9
鼓励下,,
2006年08月07日 12点08分 7
level 1
着程序好长啊,你也真能编完,佩服~
2006年08月08日 07点08分 8
level 5
wyc890618 楼主
没啥。一小程序
2006年08月14日 23点08分 9
level 0
return();
2006年09月13日 13点09分 10
level 0
高手!!学C多久了!!!顶了!!!!!!!!!!!!!!!!!!!!!!!!!
2006年09月13日 13点09分 11
level 2
确实很强.24点看似简单其实牵扯的细节很多,楼主解决的很好.学习ing
2006年09月14日 05点09分 12
level 0
dabte.wang,你真行,有机会探讨一下,我很喜欢C的,很美
2006年09月14日 06点09分 13
level 5
wyc890618 楼主
谢谢大家对我的夸奖!所以决定把我的的c语言24点的升级版本给大家看看。为了方便阅读 我基本上都写了注释。如下;还是要提示下:由于百度会将特定的字符组进行转换,比如,自动将“(c)”转换为©,请大家自行改正。 可利用记事本替换功能。 给大家带来的不便,请多包涵~~~!
2006年09月17日 15点09分 14
level 5
wyc890618 楼主
/********************************************************//* 一个功能较全的24点程序 */ /********************************************************/ /* 有倒计时的游戏计算模式(电子词典上那种) */ /* 和直接计算模式 *//********************************************************//* Turbo C 3.0上编译通过 */ /********************************************************//* 作者:王煜城 */ /* Email:wyc890618 at 163 dot com */ /* QQ:398872223 *//********************************************************/
#include "stdio.h"/*调用函数库*/#
include "math.h"
#include "time.h"#
include "conio.h"
#include "string.h"#
include "stdlib.h"
#include "bios.h"#
define SECOND 20/*设定一秒钟长度*/#define TIMELEFTX 35/*定位TIME LEFT横坐标*/#define TIMELEFTY 3/*定位TIME LEFT纵坐标*/#define MAXTIME 60/*设定游戏模式的思考时间长度*/void main(){void first();/*游戏模式*/void second();/*计算模式*/void third();/*离开*/time_t t;/*作时间种子*/char get;/*存储选择模式时的按键*/srand((unsigned) time(&t));/*产生随机数的起始发生数据*/for(;;){clrscr();/*清屏*/printf("24 POINTS SYSTEM v2.3\n");/*输出信息*/printf("MADE BY DANTE WANG\n");printf("Oct.29th 2006\n\n");printf("Please choose mode!\n\n");printf("1. Game Mode\n");printf("2. Count Mode\n");printf("3. Quit\n\n");get=getch();/*记录按键*/switch(get){case '1': first(); break;/*调用函数first*/case '2': second(); break;/*调用函数second*/case '3': third(); break;/*调用函数third*/default:printf("Please input 1, 2 or 3!\n"); getch();/*提示只输入1,2,3*/}if(get=='3')/*判断是否退出循环*/break;}}void first()/*游戏模式*/{int getstring(char *p);/*游戏模式时输入函数*/int check(char *p);int exam2(char *p,int a,int b,int c,int d);int sign(int a,int b,int c,int d,int mode);double figure(char *p);int n[4],i;/*存储4张牌点数*/char ch[100],ch1[100];/*存储输入数据*/void draw(int *p);for(;;){for(i=0;i<4;i++){n[i]=rand()%13+1;/*随机产生4张牌的点数*/}draw(n);/*画出开局*/if(!sign(n[0],n[1],n[2],n[3],0))/*判断是否有解*/{printf("No answer!");/*无解输出No answer!*/getch();continue;/*循环重新进行*/}if(getstring(ch))/*判断是否在规定时间输入*/{if(!strcmp(strlwr(ch),"quit"))/*输入内容与quit比较*/break;/*相同即退出*/else{strcpy(ch1,ch);/*否则将ch值递给ch1*/if(!check(ch) &&/*检查输入数据符号格式*/ !exam2(ch,n[0],n[1],n[2],n[3]) &&/*检查输入数据数值格式*/ fabs(figure(ch1)-24)<=0.000001)/*判断答案是否为24*/{printf("\nGood job!\n");getch();/*输出Good job!*/}else{printf("\nWrong!\n\nAnswer: ");sign(n[0],n[1],n[2],n[3],1);getch();/*答案错输出Wrong!Answer:及答案*/}}}else{printf("\nTime Over!\n\nAnswer: ");sign(n[0],n[1],n[2],n[3],1);getch();/*超时间输出TimeOver!Answer:及答案*/
2006年09月17日 15点09分 15
level 5
wyc890618 楼主
}}}void second()/*计算模式*/{int n[4],i;/*储存输入4数数值*/char c[4][10];/*储存输入的数字字符*/int exam(char *p);int sign(int a,int b,int c,int d,int mode);double recog(char *p);clrscr();/*清屏*/printf("Input 0 to leave.\n\n");/*输出提示*/for(;;){for(i=0;i<4;i++){scanf("%s",&c[i]);/*输入4数字符*/if(exam(c[i]))/*检查4数数值范围*/{printf("GRAMMER ERROR!\n");/*输出错误*/i--;/*重新输入*/continue;}n[i]=(int)recog(c[i]);/*将字符转化数值*/if(n[i]==0)return ;/*值为0退出*/}sign(n[0],n[1],n[2],n[3],1);/*输出正解*/}}void third(){printf("Thanks for using this software!\n\n");printf("If you have any advices or suggestions,\n\n");printf("welcome to send email to [email protected].\n\n");getch();/*输出个人信息*/}int sign(int a,int b,int c,int d,int mode){/*mode=0为判断,=1为输出模式*/ char *change(int x);/*将数值转化成字符型数字*/ double figure(char *p);/*将字符型算数表达式求值*/ int i[4],n1,n2,n3,n4,s1,s2,s3,t,flag=0; char s[4][2]={"+","-","*","/"},p[64]={0},p1[64]={0}; i[0]=a;/*数组i用于存储4个数*/ i[1]=b;/*数组s用于存储4种符号*/ i[2]=c;/*n1-n4分别存储0-3对应数组i不同*/ i[3]=d;/*元素即四个求24点的数*/ for(n1=0;n1<4;n1++)/*s1-s3分别存储0-3对应数组s不同*/ {/*元素即四种不同的符号*/ for(n2=0;n2<4;n2++)/*数组p用于存储可能输出内容*/ {/*数组p1用于临时存储p判断值是*/ if(n2==n1)/*否24,因为figure函数会破坏p*/continue;/*因为i[n1]-i[n4]要代表不同数*/ for(n3=0;n3<4;n3++)/*所以n1-n4相等即continue*/ {if(n3==n2||n3==n1) continue;for(n4=0;n4<4;n4++){ if(n4==n3||n4==n2||n4==n1) continue; for(s1=0;s1<4;s1++)/*s1-s3为穿插在4数中的3个符号*/ { for(s2=0;s2<4;s2++)/*以下1代表1-13的数*/ {/* +代表+,- */ for(s3=0;s3<4;s3++)/* *代表*,/ */ {strcat(p,change(i[n1]));/*此为1+1+1+1类型*/strcat(p,s[s1]);strcat(p,change(i[n2]));strcat(p,s[s2]);strcat(p,change(i[n3]));strcat(p,s[s3]);strcat(p,change(i[n4]));strcpy(p1,p);if(fabs(figure(p1)-24)<=0.000001){ if(mode) printf("%s\n",p); flag++; return flag;}*p='\0';if(s1/2==1&&(s2/2==0||s3/2==0))/*此为1*(1+1+1)类型*/{ strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { if(mode) printf("%s\n",p); flag++; return flag; } *p='\0';}if(s1/2==0&&s2/2==1)/*此为(1+1)*1+1类型*/{ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { if(mode) printf("%s\n",p); flag++; return flag;
2006年09月17日 15点09分 16
level 5
wyc890618 楼主
} *p='\0';}if(s2/2==0&&s1/2==1)/*此为1*(1+1)+1类型*/{ strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { if(mode) printf("%s\n",p); flag++; return flag; } *p='\0';}if((s1/2==0||s2/2==0)&&s3/2==1)/*此为(1+1+1)*1类型*/{ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { if(mode) printf("%s\n",p); flag++; return flag; } *p='\0';}if(s1/2==0&&s2/2==1&&s3/2==0)/*此为(1+1)*1+1类型*/{ strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,"("); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { if(mode) printf("%s\n",p); flag++; return flag; } *p='\0';}/*以上几种类型可代表所有类型*/ }/*不重不漏*/ } }} } } } if(mode) printf("No answer!\n"); return flag;}char *change(int x)/*将数值转化成字符型数字*/{ static char a[64];/*存储字符数字*/ char *c;/*存储字符数字的首位*/ c=a+63; *c='\0'; c--; for(;;c--)/*通过每次的除10取余*/ {/*将十进制数每位转化成字符*/ if(x>=10) { *c=x%10+'1'-1; x=x/10; } else { *c=x+'1'-1; break; } } return(c);/*最后将字符数字的首位传出*/}double figure(char *p)/*此部分实现一计算器功能*/{int judge_sym(char sym);/*判断是否是+,-,*,/*/int judge(char *p);int judge2(char *p);void add(char *p);/*添加负数的括号*/void pick(char *p);/*摘除表达式两侧括号*/double recog(char *p);/*将字符型数转化为double型*/char *c=p,*c1,c2[64];int sign,kuoh=0,flag2=0;double result,chu;add(p);for(sign=0;*c!='\0';c++)/*判断表达式内是否还有符号*/{if(judge_sym(*c)||*c=='('||*c==')'){sign++;break;}}if(sign==0)/*没有符号,直接转化*/return(recog(p));else{c=p;for(;*c!='\0';c++){if(*c=='(')kuoh++;if(*c==')')kuoh--;if(!judge2(c))/*判断c后面是否有+,-*/{/*有则做后面的*/if(*c=='+'&&kuoh==0){*c='\0';result=figure(p)+figure(c+1);flag2++;break;}if(*c=='-'&&kuoh==0){*c='\0';result=figure(p)-figure(c+1);flag2++;break;}}if(!judge(c))/*判断c后面是否有+,-,*,/*/{/*有则做后面的*/if(*c=='*'&&kuoh==0){*c='\0';result=figure(p)*figure(c+1);flag2++;break;}if(*c=='/'&&kuoh==0){/*除法会溢出,注意!*/*c='\0';
2006年09月17日 15点09分 17
level 5
wyc890618 楼主
chu=figure(c+1);if(chu==0)result=99999; else result=figure(p)/chu; flag2++; break;} }/*解释一下为什么做后面的*/ }/*例:1-2-3就是分成1-2和3*/if(flag2)/*中间用-连接 就变成递归*/return(result+0);/*1-2和3 所以做后面的起*/else{pick(p);result=figure(p);return(result+0);}}}int judge(char *p)/*判断括号外是否有符号*/{/*有返回1,无返回0*/ int judge_sym(char sym); char *c=p; int kuoh=0,flag=0; for(c++;*c!='\0';c++) { if(*c=='(') kuoh++; if(*c==')') kuoh--; if(kuoh==0&&judge_sym(*c)) { flag++; break; } } return(flag);}int judge2(char *p)/*判断括号外是否有+,-*/{/*有返回1,无返回0*/ char *c=p; int kuoh=0,flag=0; for(c++;*c!='\0';c++) { if(*c=='(') kuoh++; if(*c==')') kuoh--; if(kuoh==0&&(*c=='+'||*c=='-')) { flag++; break; } } return(flag);}void add(char *p)/*这部分是给诸如-1+6-9这类式*/{/*前面的-1添加()成(-1)+6-9*/ int judge_num(char num);/*便于理解优先级*/int judge_sym(char sym);char *c=p,b[64];int flag=0;for(;*c!='\0';c++){if((*c=='-'||*c=='+')&&judge_num(*(c+1)))flag++;if((judge_num(*c)||*c=='.')&&judge_sym(*(c+1))){flag++;break;}if((judge_num(*c)||*c=='.')&&*(c+1)==')')break;}if(flag==2)flag=1;elseflag=0;if(flag){c=p;for(;*c!='\0';c++){if(*(c+1)>='0'&&*(c+1)<='9'){if(*c=='+'||*c=='-'){strcpy(b,c);*c='(';strcpy(c+1,b);}break;}}c+=2; for(;*c!='\0';c++){if((*c<'0'||*c>'9')&&*c!='.'){strcpy(b,c);*c=')';strcpy(c+1,b);break;}}}}void pick(char *p)/*函数功能:如果表达式两侧皆为括号*/{/*例:(1+1+1) 则将其两侧括号去除成1+1+1*/char *c=p;if(*c=='('&&*(c+strlen(c)-1)==')'){strcpy(c,c+1);*(c+strlen(c)-1)='\0';}}double recog(char *p)/*函数功能与函数change的相反*/{/*将字符数据转化成double型*/int judge_num(char num);char *c=p;int flag=0,number;double quan,ans=0;for(;;c++){if(*c=='.'){flag++;number=c-p;}if(*c!='.'&&!judge_num(*c))break;}if(flag==0){for(quan=1,c--;c>=p;c--,quan*=10)ans+=(*c-'1'+1)*quan;}else{for(c--,quan=pow(10,number-(c-p));c>=p;c--){if(*c=='.')continue;else{ans+=(*c-'1'+1)*quan;quan*=10;}}}return(ans);}int exam(char *p)/*检查输入数字是否在1-13之间*/{ int judge_num(char num); double recog(char *p); char *c=p; int number=0; for(;*c!='\0';c++) { if(!judge_num(*c)) number++; if(number) break; } if(!number) { if(recog(p)>13||recog(p)<0) number++; } return(number);}void draw(int *p)/*画出纸牌等物*/{ time_t t; int n; clrscr(); printf("Press \"quit\" to leave."); srand((unsigned) time(&t)); for(n=0;n<4;n++) { gotoxy(1+7*n,3); printf("\xda\xc4\xc4\xc4\xc4\xbf");
2006年09月17日 15点09分 18
level 5
wyc890618 楼主
gotoxy(1+7*n,4); printf("\xb3%c \xb3",rand()%4+3); gotoxy(1+7*n,5); printf("\xb3 \xb3"); gotoxy(1+7*n,6); switch(*(p+n)) { case 1:printf("\xb3 A\xb3");break; case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:printf("\xb3%4d\xb3",*(p+n));break; case 11:printf("\xb3 J\xb3");break; case 12:printf("\xb3 Q\xb3");break; case 13:printf("\xb3 K\xb3"); }gotoxy(1+7*n,7);printf("\xc0\xc4\xc4\xc4\xc4\xd9"); }gotoxy(TIMELEFTX-1,TIMELEFTY-2);printf("TIME");gotoxy(TIMELEFTX-1,TIMELEFTY-1);printf("LEFT");gotoxy(TIMELEFTX,TIMELEFTY);printf("60");gotoxy(1,9);}int exam2(char *p,int a,int b,int c,int d){/*检查输入的表达式中4数是否*/int judge_num(char num);/*与所求4数相同*/double recog(char *p);int number=0,num[4],flag=0,n,m;num[0]=a;num[1]=b;num[2]=c;num[3]=d;for(m=0;*p!='\0';p++,m++){if(judge_num(*p)&&!judge_num(*(p+1)))number++;if(m>0&&*p>='0'&&*p<='9'&&judge_num(*(p-1)))continue;if(*p<='9'&&*p>='0'){if(recog(p)>13||recog(p)<1){flag++;break;}else{for(n=0;n<4;n++){if(recog(p)==num[n]){num[n]=0;break;}}}}}if(!flag){if(number!=4)flag++;elseif(num[1]||num[2]||num[3]||num[0])flag++;}return(flag);}int check(char *p){/*检查输入表达式格式是否正确*/int judge_sym(char sym);/*涉及到方方面面*/int kuoh=0,flag=0;for(;*p!='\0';p++){if(*p==' '){flag++;break;}if(kuoh<0){flag++;break;}if(*p=='(')kuoh++;if(*p==')')kuoh--;if(judge_sym(*p)&&judge_sym(*(p+1))){flag++;break;}if(*p=='('&&(!judge_num(*(p+1))&&*(p+1)!='-')){flag++;break;}if(*p==')'&&!judge_sym(*(p+1))&&*(p+1)!='\0'){flag++;break;}}if(!flag){if(kuoh!=0)flag++;}return(flag);}int getstring(char *p){/*游戏模式中接受输入*/int countdown();/*以及倒计时部分*/int i=0,time=MAXTIME-1;for(;;){if(countdown()){if(!(time+1))return 0;gotoxy(TIMELEFTX,TIMELEFTY);printf("%2d",time--);}gotoxy(i+1,9);if(bioskey(1)){*(p+i)=getch();if((*(p+i)>=65&&*(p+i)<91||*(p+i)>=97&&*(p+i)<123||judge_num(*(p+i)))&&*(p+i)!=0x48&&*(p+i)!=0x4b&&*(p+i)!=0x4d&&*(p+i)!=0x50||*(p+i)==8||*(p+i)==13||judge_sym(*(p+i))||*(p+i)=='('||*(p+i)==')'){if(*(p+i)=='\x8'){*(p+i)=0;if(i){putchar('\b');putchar(' ');putchar('\b');i--;}continue;}if(*(p+i)=='\xd'){*(p+i)='\0';printf("\n");return 1;}putch(*(p+i));i++;}}}}int countdown(){static long new, old;new=biostime(0,0L);if(!old)old=new;if(new-old
='0'&&num<='9')return 1;elsereturn 0;}int judge_sym(char sym){if(sym=='+'||sym=='-'||sym=='*'||sym=='/')return 1;elsereturn 0;}
2006年09月17日 15点09分 19
level 5
wyc890618 楼主
啊,我可怜的Tab健啊全没了。唉~~~该版本提供了游戏和运算两种模式。并用了工学会的倒计时。
2006年09月17日 15点09分 20
1 2 3 尾页