C语言 编程判断花瓶是谁打碎的,C语言解决是谁打碎花瓶的问题

逛贴吧偶遇一道很新颖的C语言编程题,想到自己的C语言荒废了很久,便决定花点时间解决一下练练手。

具体题目如下:

实验题目(4)【见实验教材实验五的题目6】:编写程序exp5_6.c,请判断花瓶是谁打碎的。教师花瓶碎了,班级只有四个小同学,老师询问小同学,已知是其中1人打碎的,还知道4人中每个人要么是诚实的,要么总是说谎的。

小同学回答老师的问题是:

甲说:“乙没有打碎,是丁打碎的。”

乙说:“我没有打碎,是丙打碎的。”

丙说:“甲没有打碎,是乙打碎的。”

丁说:“我没有打碎。”

根据四人回答判断谁打碎了花瓶。

**什么?书??我没有书啊?**硬着头皮写吧

#include

int a[4]={0,0,0,0};//数组a用来表示甲乙丙丁四个人的标志,若为1则表示是他打碎了花瓶

int b[4]={0,0,0,0};//数组b用来表示甲乙丙丁四个人陈述的命题的真否,1表示否命题

int check(int t[4])

{

//判断甲所陈述的命题

int flag=1; //FLAG标志判断是否运行以下程序

if(t[0]==1) //甲说谎

{

if(t[1]==1&&t[3]==0) //若甲说谎则乙说的是真话且丁说谎;以下同理

{

a[1]=1;

a[3]=0;

flag=0;

}

}

else{

if(t[2]==1&&t[3]==1)

{

a[1]=0;

a[3]=1;

flag=0;

}

}

if(flag){

return 0; //若该情况不可能满足,则返回主程序

}

flag=1;//判断乙说的话

if(t[1]==1){

if(t[0]==1&&t[2]==0){

a[1]=1;

a[2]=0;

flag=0;

}

}

else{

if(t[0]==0&&t[2]==1){

a[1]=0;

a[2]=1;

flag=0;

}

}

if(flag){

return 0;

}

flag=1;//判断丙说的话

if(t[2]==1){

if(t[1]==0&&t[0]==0){

a[0]=1;

a[1]=0;

flag=0;}

}

else{

if(t[0]==1&&t[1]==1){

a[0]=0;

a[1]=1;

flag=0;

}

}

if(flag){

return 0;

}

flag=1;//判断丁说的话

if(t[3]==1){

if(t[0]==0){

a[3]=1;

flag=0;

}

}

else{

if(t[0]==1){

a[3]=0;

flag=0;}

}

if(flag){

return 0;

}

return 1;//判断程序正确执行,返回标志1

}

int main()

{

for(int i=0;i<16;i++)

{

int m=3;

int n=i;

while(n)

{

b[m]=n%2;

n=n/2;

m--;

}

for(int k=0;k<4;k++)

{

printf("%d",b[k]);

} //将16种可能情况一一遍历

printf("\n");

int c=check(b);

if(c&&(a[0]+a[1]+a[2]+a[3])==1)//判断完毕且得到一个人打碎了花瓶

{

printf("it is ");

for(int t=0;t<4;t++)

{

printf("%d",a[t]);//输出标志数组

}

printf("\n");

}

}

return 0;

}

程序运行后结果如下

98658f0bbdb131ac10aac4dc70308606.png

由此可以判断是乙打碎了花瓶

C语言新手,如有错误欢迎指正

程序还可进行优化,学业繁重,告辞。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值