C语言问题
问题楼下为给定求24点的源代码
[ 本帖最后由 流光丶溢彩 于 2015-6-23 22:53 编辑 ]
#include<stdio.h> #include<string.h> #include<stdlib.h> int input0() { int m; int flag,i; char t[100]; //先采用字符串输入 限定输入的每一位都在0~9之间,保证输入的是数字、避免输入的是字母或者其他字符 do{ flag=0; fflush(stdin); re: gets(t); for(i=0;(size_t)i<strlen(t);i++) { if(t[i]<'0' ||t[i]>'9') flag=1; } if(flag) { printf("输入有误,请重新输入\n>> ①:"); flag=0; //(这一步要重置flag为0,当做无误的再作判断) goto re; } }while(flag); m=atoi(t);//C语言库函数名atoi功能: 把字符串转换成整型数得到全局n的值 if(m<=0||m>=10) { printf("输入有误,请重新输入\n>> ①:"); flag=0; //(这一步要重置flag为0,当做无误的再作判断) goto re; } return m; } int input1() { int m; int flag,i; char t[100]; do{ flag=0; fflush(stdin); re: gets(t); for(i=0;(size_t)i<strlen(t);i++) { if(t[i]<'0' ||t[i]>'9') flag=1; } if(flag) { printf("输入有误,请重新输入\n>> ②:"); flag=0; // goto re; } }while(flag); m=atoi(t); if(m<=0||m>=10) { printf("输入有误,请重新输入\n>> ②:"); flag=0; goto re; } return m; } int input2() { int m; int flag,i; char t[100]; do{ flag=0; fflush(stdin); re: gets(t); for(i=0;(size_t)i<strlen(t);i++) { if(t[i]<'0' ||t[i]>'9') flag=1; } if(flag) { printf("输入有误,请重新输入\n>> ③:"); flag=0; goto re; } }while(flag); m=atoi(t); if(m<=0||m>=10) { printf("输入有误,请重新输入\n>> ③:"); flag=0; goto re; } return m; } int input3() { int m; int flag,i; char t[100]; do{ flag=0; fflush(stdin); re: gets(t); for(i=0;(size_t)i<strlen(t);i++) { if(t[i]<'0' ||t[i]>'9') flag=1; } if(flag) { printf("输入有误,请重新输入\n>> ④:"); flag=0; goto re; } }while(flag); m=atoi(t); if(m<=0||m>=10) { printf("输入有误,请重新输入\n>> ④:"); flag=0; goto re; } return m; } 输入输出定义 double cal(double a,double b,int op) // op: 0:+,1:-,2:*,3:/ { switch (op) // +-x/ 运算 { case 0: return(a+b); case 1: return(a-b); case 2: return(a*b); } if (b==0.0) // 分母为0 return(999.0); else return(a/b); } //在运算过程中除法的特殊性——除数不能为零。因为可能会用到除法,所以要考虑精度问题 //这里通过结果减去24取绝对值与一个接近0的小数(如0.001)比较,如小于它,即可判定结果是24。 int isEqual(double d1,double d2) // 两个浮点数是否近似相等 { double d=d1-d2; if (d<0) d=-d; // 求绝对值 return(d<=0.001); //返回为1或者0 取决于d<=0.001是否成立。若成立则返回1,即判定预算结果等于24 } /**************************计算24点***************/ void D24(int v0,int v1,int v2,int v3) // 穷举法求24点 { char op[4]={'+','-','*','/'}; // +:0 -:1 *:2 /:3 int count=0;// 计数成功次数 int i1,i2,i3,i4; int f1,f2,f3; int v[4]; // 输入四整数 v[0]=v0; v[1]=v1; v[2]=v2; v[3]=v3; //-----------四重循环开始穷举四个数字的位置: 4!=24 种 A44-------------------------- for (i1=0;i1<4;i1++) //i表示v[i]下标的位置 i1 i2 i3 i4不能相等(分别为0 1 2 3) 表示4个数排列在数组4个不同的位置上 for (i2=0;i2<4;i2++) // 四重循环对四个数穷举 if (i2!=i1) for (i3=0;i3<4;i3++) if (i3!=i2 && i3!=i1) for (i4=0;i4<4;i4++) if (i4!=i3 && i4!=i2 && i4!=i1) { //-----------三重循环开始穷举三个运算符: 4X4X4=64 种 +-*/可以重复使用--------------------------- for (f1=0;f1<4;f1++) // 三重循环对运算符穷举,f表示op[f]中的元素 for (f2=0;f2<4;f2++) for (f3=0;f3<4;f3++) // 运算符 f1,f2,f3 { // 对运算优先级直接列举(5种) //-----------未用循环,直接穷举三个运算符的优先级: 3!-1=5种( 3*2-1=5)------------------- double t1,t2,t3; // 存放计算的中间值 两个两个按优先级进行计算 // 第1种情况 ((a 。b)。c)。d : t1=cal(v[i1],v[i2],f1); t2=cal(t1,v[i3],f2); t3=cal(t2,v[i4],f3); if (isEqual(t3,24)) // 运算后是否为24 { char *fs="((%d%c%d)%c%d)%c%d=24\n"; printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]); count++; } // 第2种情况(a 。b)。(c。 d) 开始计算 : t1=cal(v[i1],v[i2],f1); t2=cal(v[i3],v[i4],f3); t3=cal(t1,t2,f2); if (isEqual(t3,24)) // 运算后是否为24 { char *fs="(%d%c%d)%c(%d%c%d)=24\n"; printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]); count++; } // 第3种情况 (a。(b。c))。d 开始计算 : t1=cal(v[i2],v[i3],f2); t2=cal(v[i1],t1,f1); t3=cal(t2,v[i4],f3); if (isEqual(t3,24)) // 运算后是否为24 { char *fs="(%d%c(%d%c%d))%c%d=24\n"; printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]); count++; } // 第4种情况 a。((b。c)。d ) 开始计算: t1=cal(v[i2],v[i3],f2); t2=cal(t1,v[i4],f3); t3=cal(v[i1],t2,f1); if (isEqual(t3,24)) // 运算后是否为24 { char *fs="%d%c((%d%c%d)%c%d)=24\n"; printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]); count++; } // 第5种情况 a。(b。(c。d)) 开始计算: t1=cal(v[i3],v[i4],f3); t2=cal(v[i2],t1,f2); t3=cal(v[i1],t2,f1); if (isEqual(t3,24)) // 运算后是否为24 { char *fs="%d%c(%d%c(%d%c%d))=24\n"; printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4]); count++; } } } //-------------- 穷举结束: 共 24*64*5=7680 种表达式 --------------------------- if (count==0) printf("\n抱歉,无法算出24点\n\n\n"); else printf("\n共找到 %d 条算式\n\n\n",count); } void main() { int v0,v1,v2,v3; char c; repeat: printf("\t\t\t***********************\n "); printf("\t\t\t* welcome to 24点程序 *\n"); printf("\t\t\t***********************\n "); printf("输入四个整数(0,10)之间:\n"); printf(">> ①:"); v0=input0(); printf(">> ②:"); v1=input1(); printf(">> ③:"); v2=input2(); printf(">> ④:"); v3=input3(); printf("您所输入的四个整数分别为:%d %d %d %d\n",v0,v1,v2,v3); D24(v0,v1,v2,v3); printf("是否继续?y/n\n>>"); fflush(stdin); scanf("%c",&c); while(c!='y'&&c!='n') { printf("输入有误请选择y或者n\n>>"); fflush(stdin); scanf("%c",&c); } if(c=='y') goto repeat; else printf("--------------------------------再见--------------------------\n"); }
#include<stdio.h> #include<string.h> #include<stdlib.h> const char serial[][4] = {"①", "②", "③", "④"};//通过数组显示序号 int input(int x)//之前有4个input函数,函数体几乎一样,太累赘了 { int m; int flag,i; char t[100]; //先采用字符串输入 限定输入的每一位都在0~9之间,保证输入的是数字、避免输入的是字母或者其他字符 do{ flag=0; fflush(stdin); gets(t); for(i=0;(size_t)i<strlen(t);i++) { if(t[i]<'0' ||t[i]>'9') { flag=1; printf("输入有误,请重新输入\n>> %s:", serial[x]); break; } } if(!flag) { m=atoi(t);//C语言库函数名atoi功能: 把字符串转换成整型数得到全局n的值 if(m<=0||m>=1000) { printf("输入有误,请重新输入\n>> %s:", serial[x]); flag=1; } } }while(flag); return m; } //输入输出定义 double cal(double a,double b,int op) // op: 0:+,1:-,2:*,3:/ { switch (op) // +-x/ 运算 { case 0: return(a+b); case 1: return(a-b); case 2: return(a*b); } if (b==0.0) // 分母为0 return(999.0); else return(a/b); } //在运算过程中除法的特殊性——除数不能为零。因为可能会用到除法,所以要考虑精度问题 //这里通过结果减去24取绝对值与一个接近0的小数(如0.001)比较,如小于它,即可判定结果是24。 int isEqual(double d1,double d2) // 两个浮点数是否近似相等 { double d=d1-d2; if (d<0) d=-d; // 求绝对值 return(d<=0.001); //返回为1或者0 取决于d<=0.001是否成立。若成立则返回1,即判定预算结果等于24 } /**************************计算result***************/ void D24(int v[], int result) // 穷举法求结果,增加变量result { char op[4]={'+','-','*','/'}; // +:0 -:1 *:2 /:3 int count=0;// 计数成功次数 int i1,i2,i3,i4; int f1,f2,f3; //-----------四重循环开始穷举四个数字的位置: 4!=24 种 A44-------------------------- for (i1=0;i1<4;i1++) //i表示v[i]下标的位置 i1 i2 i3 i4不能相等(分别为0 1 2 3) 表示4个数排列在数组4个不同的位置上 for (i2=0;i2<4;i2++) // 四重循环对四个数穷举 if (i2!=i1) for (i3=0;i3<4;i3++) if (i3!=i2 && i3!=i1) for (i4=0;i4<4;i4++) if (i4!=i3 && i4!=i2 && i4!=i1) { //-----------三重循环开始穷举三个运算符: 4X4X4=64 种 +-*/可以重复使用--------------------------- for (f1=0;f1<4;f1++) // 三重循环对运算符穷举,f表示op[f]中的元素 for (f2=0;f2<4;f2++) for (f3=0;f3<4;f3++) // 运算符 f1,f2,f3 { // 对运算优先级直接列举(5种) //-----------未用循环,直接穷举三个运算符的优先级: 3!-1=5种( 3*2-1=5)------------------- double t1,t2,t3; // 存放计算的中间值 两个两个按优先级进行计算 // 第1种情况 ((a 。b)。c)。d : t1=cal(v[i1],v[i2],f1); t2=cal(t1,v[i3],f2); t3=cal(t2,v[i4],f3); if (isEqual(t3,result)) // 将24改成result { char *fs="((%d%c%d)%c%d)%c%d=%d\n"; //将24改成%d printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result); //增加resul参数 ,对应增加的%d count++; } // 第2种情况(a 。b)。(c。 d) 开始计算 : t1=cal(v[i1],v[i2],f1); t2=cal(v[i3],v[i4],f3); t3=cal(t1,t2,f2); if (isEqual(t3,result)) // 将24改成result { char *fs="(%d%c%d)%c(%d%c%d)=%d\n"; //将24改成%d printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d count++; } // 第3种情况 (a。(b。c))。d 开始计算 : t1=cal(v[i2],v[i3],f2); t2=cal(v[i1],t1,f1); t3=cal(t2,v[i4],f3); if (isEqual(t3,result)) // 将24改成result { char *fs="(%d%c(%d%c%d))%c%d=%d\n"; //将24改成%d printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d count++; } // 第4种情况 a。((b。c)。d ) 开始计算: t1=cal(v[i2],v[i3],f2); t2=cal(t1,v[i4],f3); t3=cal(v[i1],t2,f1); if (isEqual(t3,result)) // 将24改成result { char *fs="%d%c((%d%c%d)%c%d)=%d\n"; //将24改成%d printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d count++; } // 第5种情况 a。(b。(c。d)) 开始计算: t1=cal(v[i3],v[i4],f3); t2=cal(v[i2],t1,f2); t3=cal(v[i1],t2,f1); if (isEqual(t3,result)) // 运算后是否为result { char *fs="%d%c(%d%c(%d%c%d))=%d\n"; //将24改成%d printf(fs,v[i1],op[f1],v[i2],op[f2],v[i3],op[f3],v[i4],result);//增加resul参数 ,对应增加的%d count++; } } } //-------------- 穷举结束: 共 24*64*5=7680 种表达式 --------------------------- if (count==0) printf("\n抱歉,无法算出结果%d\n\n\n", result); else printf("\n共找到 %d 条算式\n\n\n",count); } int main() { int i, result, v[4]; char c; do{ printf("\t\t\t***********************\n "); printf("\t\t\t* welcome to 24点程序 *\n"); printf("\t\t\t***********************\n "); printf("输入四个整数(0,10)之间:\n"); for(i = 0; i < 4; i++) { printf(">> %s:", serial[i]); v[i] = input(i); } printf("您所输入的四个整数分别为:%d %d %d %d\n",v[0],v[1],v[2],v[3]); printf("输入想求得的结果:"); scanf("%d", &result); D24(v, result); printf("是否继续?y/n\n>>"); fflush(stdin); scanf("%c",&c); while(c!='y'&&c!='n') { printf("输入有误请选择y或者n\n>>"); fflush(stdin); scanf("%c",&c); } }while(c=='y'); printf("--------------------------------再见--------------------------\n"); return 0; }