c语言程序要求源代码有200行以上

2022-04-12 教育 57阅读

#include
#include
intzuheshu(floats[],intn);//组合数的函数
floatzuhe[4]={0};//暂时存放组合
intsum=0;//用于计数
//动态分配n个float变量的数组
float*fsz(intn)
{
return(float*)malloc(sizeof(float)*n);
}
intzuhefu();//符号组合
intyunsuan(floats[],charp[],intk0[],intk1[]);//算式组合
floatqiujie(floatsuanshi[],intn);//算式求解
inthefa(floatsuanshi[],intr);//算式正确性检查
floatjianjie(floatsuanshi[],intr);//算式简洁性检查
intfuhe=0;//计数符合算式数
intmain()
{
//输入四个数

inti;
floats[4]={3,3,3,3},shu[4]={0};
printf("请输入四个数(0-9):\n");
for(i=0;i<4;i++)
{
scanf("%f",&s[i]);
for(intj=i;j>0;j--)
{
if(s[j]<=s[j-1])
{
floats0=s[j-1];
s[j-1]=s[j];
s[j]=s0;
}
}
}
printf("四个数是:");
for(i=0;i<4;i++)
{
printf("%.0f",s[i]);
}
printf("\n");
zuheshu(s,4);
printf("有%d个算式符合\n",fuhe);
}
//组合数,并调用yunsuan
intzuheshu(floats[],intn)
{
if(n==1)
{
zuhe[4-n]=s[0];
zuhefu();
return1;
}
for(inti=0;i {
if(i==0)
{
//直接填入s[0],数组和候选数中去除该数,递归
zuhe[4-n]=s[i];
float*p=fsz(n-1);
into=0;
for(intk=0;k {
if(k!=i)
p[o++]=s[k];
}
zuheshu(p,n-1);
free(p);
}
elseif(s[i]!=s[i-1])
{
//直接填入s[0],数组和候选数中去除该数,递归
zuhe[4-n]=s[i];
float*p=fsz(n-1);
into=0;
for(intk=0;k {
if(k!=i)
p[o++]=s[k];
}
zuheshu(p,n-1);
free(p);
}
}
}
//组合运算符号,并调用yunsuan
intzuhefu()
{
//对操作符'+','—','*','/'组合
charopter[4]={'+','-','*','/'};
for(inth=0;h<4;h++)//第一个操作符
{
for(inti=0;i<4;i++)//第二个操作符
{
for(intj=0;j<4;j++)//第三个操作符
{
charop[3];//放置操作符
op[0]=opter[h];
op[1]=opter[i];
op[2]=opter[j];
//对括号组合

intkhzh[8][3]={{0,0,0},{0,0,1},{0,1,0},{1,0,0},{0,1,1},{1,0,1},{1,1,0},{1,1,1}};//正或反括号
for(intk=0;k<=3;k++)
{
switch(k)
{
case0://有0个括号
{
yunsuan(zuhe,op,khzh[0],khzh[0]);
}
break;
case1://有1个括号
{
for(intm=1;m<=3;m++)//正括号
{
for(intn=1;n<=3;n++)//反括号

{

if((m==2&&n==3)||(m==1&&n==2)||(m==3&&n==1)||(m==1&&n==3))
continue;
yunsuan(zuhe,op,khzh[m],khzh[n]);
}
}
}
break;
case2://有2个括号
{
//代码将算式组合,并判断正确性;其中(括号)*1*和1**为错误组合,**1和*1*为错误组合,应过滤(即正括号后接操作数,操作符,不能是操作数,反括号)同时出现1**和**1也应视为0**和**0
//正确括法只有一种即101和101
yunsuan(zuhe,op,khzh[5],khzh[5]);
}
break;
case3://有3个括号,不可能
//利用khzu[7]代码将算式组合,并判断正确性(不正确)
break;
}
}
}
}
}
return1;
}
//对s[]中的四个数按照p[]和k[]中的运算符进行组合并调用qiujie()函数运算判断结果是否为24
intyunsuan(floats[],charp[],intk0[],intk1[])
{
floatsuanshi0[13]={'0'};//合成等式
intr=0;//等式的长度
//组合等式
for(intq=0;q<13;q++)
{
switch(q)
{
case0:
{
if(k0[0]==1)
suanshi0[r++]='(';
}
break;
case1:
{
suanshi0[r++]=s[0];
}
break;
case2:
{
suanshi0[r++]=p[0];
}
break;
case3:
{
if(k0[1]==1)
suanshi0[r++]='(';
}
break;
case4:
{
suanshi0[r++]=s[1];
}
break;
case5:
{
if(k1[0]==1)
suanshi0[r++]=')';
}
break;
case6:
{
suanshi0[r++]=p[1];
}
break;
case7:
{
if(k0[2]==1)
suanshi0[r++]='(';
}
break;
case8:
{
suanshi0[r++]=s[2];
}
break;
case9:
{
if(k1[1]==1)
suanshi0[r++]=')';
}
break;
case10:
{
suanshi0[r++]=p[2];
}
break;
case11:
{
suanshi0[r++]=s[3];
}
break;
case12:
{
if(k1[2]==1)
suanshi0[r++]=')';
}
break;
}
}
float*suanshi=fsz(r);//动态空间申请
for(inti=0;i {
suanshi[i]=suanshi0[i];
}
//组合算式的正确性检查
floatf=hefa(suanshi,r);
if(f==0)
{
return0;
}
//组合算式的简洁性检查
f=jianjie(suanshi,r);
if(f==0)
{
return0;
}
//调用函数求解结果为24则输出等式
floatsum0=qiujie(suanshi,r);
if(sum0==24)
{
fuhe++;
for(intt=0;t {
if(suanshi[t]>10)
printf("%c",char(suanshi[t]));
else
printf("%0.0f",suanshi[t]);
}
printf("=%0.0f\n",sum0);
}
free(suanshi);
return1;
}
//算式正确性检查
inthefa(floatsuanshi[],intr)
{
float*p=&suanshi[0];//为当前指针
float*q=&suanshi[1];//为下一指针
intflag=1;//等式正确标记
while(1)
{
if(*p==40)//判断是否为'('
{
if((*q>=0)&&(*q<=9))
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
if((*p>=0)&&(*p<=9))//判断是否为数
{
if((p-suanshi)>=(r-1))
{
break;
}
if(*q==')'||((*q>41)&&(*q<48)))//'+','-','*','/'在次范围内
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
if(*p==41)//判断是否为')'
{
if((p-suanshi)>=(r-1))
{
break;
}
if((*q>41)&&(*q<48))//'+','-','*','/'在次范围内
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
if((*p>41)&&(*p<48))////判断是否为符号
{
if(*q==40||((*q>=0)&&(*q<=9)))
{
p++;
q++;
}
else
{
flag=0;
break;
}
}
}
returnflag;
}
//算式简洁性检查
floatjianjie(floatsuanshi[],intr)
{
floatre=1;//是否括号不影响算式求解
float*p=&re,*q=&re;
intk=0;//括号数目
intk1=0;//运算符的个数
floatr0=0;//'('前的运算符优先级
floatr2=1;//算式运算符优先级
floatr1=0;//')'后的运算符优先级
intr3=0;
for(inti=0;i {
if(suanshi[i]=='(')
{
k++;
if(*p!='('||k==1)
{
p=&suanshi[i];
if(i!=0)
{
if(*(p-1)=='+'||*(p-1)=='-')
{
r0=1;
}
elseif(*(p-1)=='*'||*(p-1)=='/')
{
r0=2;
}
if(*(p-1)=='-')
{
r0+=100;
}
elseif(*(p-1)=='/')
{
r0+=1000;
}
}
}
}
elseif(suanshi[i]==')')
{
if(k--==1)
{
q=&suanshi[i];
if(i!=r-1)
{
if(*(q+1)=='+'||*(q+1)=='-')
{
r1=1;
}
elseif(*(q+1)=='*'||*(q+1)=='/')
{
r1=2;
}
}
//递归
re=jianjie(p+1,q-p-1);//返回括号内的优先级
if(int(r0/100)>=1)//括号'('外出现减号或除号
{
if((int(r0/100))==1&&(int(re/100))==1)//括号'('外出现减号,括号内出现+或-
{
continue;
}
elseif((int(r0/1000))==1&&(int(re/1000))==1)//括号'('外出现除号,括号内出现*或/
{
continue;
}
}
if(int(re/100)==1)
re-=100;
if(int(re/1000)==1)
re-=1000;
if(int(r0/100)==1)
r0-=100;
elseif(int(r0/1000)==1)
r0-=1000;
if(re==0)
return0;
if(re>=r0&&re>=r1)
return0;
}
}
elseif(k==0)
{
if(suanshi[i]=='+'||suanshi[i]=='-')
{
r2=((r2*k1)+1)/(++k1);
r3=r3/10+1;
}
elseif(suanshi[i]=='*'||suanshi[i]=='/')
{
r2=(r2*k1+2)/(++k1);
r3=r3%10+10;
}
}
}
if(r3%10==1)
r2+=100;
if(r3/10==1)
r2+=1000;
returnr2;
}
//调用函数求解结果为24则输出等式
floatqiujie(floatsuanshi[],intn)
{
if(n==3)
{
floata=0;
switch(char(suanshi[1]))
{
case'+':
return(suanshi[0]+suanshi[2]);
case'-':
return(suanshi[0]-suanshi[2]);
case'*':
return(suanshi[0]*suanshi[2]);
case'/':
return(suanshi[0]/suanshi[2]);
}
}
//过滤掉括号项
floatpq='0';
float*p=&pq;//指向算式的第一个正括号
float*q=&pq;//指向算式的与第一个正括号配对的反括号
intk=0;
floatsuanshi1[7]={'0'};//除去括号后的算式
ints=0;//用来记录suanshi1数组的长度
floatsum=0;//算式的值
for(intm=0;m {
if(suanshi[m]=='(')
{
k++;
if((*p)!='(')
{
p=&suanshi[m];
}
continue;
}
if(suanshi[m]==')')
{
if(k--==1)
{
q=&suanshi[m];
suanshi1[s++]=qiujie(p+1,q-p-1);
p=&pq;
q=&pq;
}
continue;
}
if(k==0)
{
suanshi1[s++]=suanshi[m];
continue;
}
}
if(s==3)
{
sum=qiujie(suanshi1,s);
}
else
{
p=&suanshi1[0];//指向第一个数
q=&suanshi1[2];//只想第二个数
for(intm=0;m<(s-1)/2;m++)
{
switch(char(suanshi1[2*m+1]))
{
case'+':
if((s-1)/2!=1&&(suanshi1[2*(m+1)+1]=='*'||suanshi1[2*(m+1)+1]=='/'))
{
*q=qiujie(p+2,3);
intws=&suanshi1[s-1]-&suanshi1[2*(m+1)];
for(intw=1;w<=ws;w++)
{
if(((q+w+2)-(q+ws))>0)
{
*(q+w)=-1;
}
else
{
*(q+w)=*(q+w+2);
}
}
s=s-2;
m--;
}
else
{
if(m==0)
{
sum+=*p+*q;
}
else
{
sum+=*q;
}
p=p+2;
q=q+2;
}
break;
case'-':
if((s-1)/2!=1&&(suanshi1[2*(m+1)+1]=='*'||suanshi1[2*(m+1)+1]=='/'))
{
*q=qiujie(p+2,3);
intws=&suanshi1[s-1]-&suanshi1[2*(m+1)];
for(intw=1;w<=ws;w++)
{
if(((q+w+2)-(q+ws))>0)
{
*(q+w)=-1;
}
else
{
*(q+w)=*(q+w+2);
}
}
s=s-2;
m=-1;
}
else
{
if(m==0)
sum+=*p-*q;
else
sum-=*q;
p=p+2;
q=q+2;
}
break;
case'*':
if(m==0)
sum+=(*p)*(*q);
else
sum*=*q;
p=p+2;
q=q+2;
break;
case'/':
if(m==0)
{
sum+=(*p)/(*q);
}
else
{
sum/=*q;
}
p=p+2;
q=q+2;
break;
}
}
}
eturnsum;
}
这是我修改之后的程序,原有程序有一部分错误这个复制下来就可直接用,我用的是devc++但是可能没有缩进在后面复制以后添加缩进就好,楼主这个代码非常不错,很值得借鉴,24点这个游戏要比网上推箱子,贪吃蛇啥的都有创意,如果有简单一些的代码,请@我一下这个代码还是有些复杂,不过算法方面还是很给力。
声明:你问我答网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系fangmu6661024@163.com