逻辑操作符及二维数组的小练习

  1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
    A选手说:B第二,我第三;
    B选手说:我第二,E第四;
    C选手说:我第一,D第二;
    D选手说:C最后,我第三;
    E选手说:我第四,A第一;
    比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。

分析题目条件,可以知道A,B,C,D,E都可以取五种状态,即第一、第二、第三、第四、第五,在程序中用1,2,3,4,5来表示,首先可以利用for循环将五名选手的所有可能都表示出来,再利用if条件语句,将所有人说的话进行条件判断从而得到结果。这种方法的代码如下:

#include <stdio.h>
#include <stdlib.h>
int main() {
	int a,b,c,d,e;
	//利用for循环将五名选手可能的比赛名次都表示出来
	for(a=1;a<6;++a) {
		for(b=1;b<6;++b) {
			for(c=1;c<6;++c) {
				for(d=1;d<6;++d) {
					for(e=1;e<6;++e) {
						//利用if语句将五名选手所说的情况进行判断
						if((b==2&&a!=3)||(b!=2&&a==3)) {
							if((b==2&&e!=4)||(b!=2&&e==4)) {
								if((c==1&&d!=2)||(c!=1&&d==2)) {
									if((c==5&&d!=3)||(c!=5&&d==3) {
										if(e==4&&a!=1)||(e!=4&&a==1) {
										//判断a,b,c,d,e的顺序,即a,b,c,d,e互不相等,且相乘为120
											if(a*b*c*d*e==120) {
												printf("a=%d b=%d c=%d d=%d e=%d\n",a,b,c,d,e);
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	system("pause");
	return 0;
}

上述代码中利用了多个for循环和if语句,代码结构及其复杂繁琐,并且在if条件语句中,极容易将等于写成=,导致代码出错。不建议使用上述代码上述代码。
我们可以再对本题进行细致的分析,可以发现a的值只能取1或3,c的值只能取1或5,d的值只能取2或3。得到了这些条件后,再进行逻辑分析,可以发现当e!=4时,a取1,否则a取3;当a等于2,d取2,否则d取3;当d==2时,c取5,否则c取1。这样对条件进行梳理,就简化了代码的量,结合上述条件,利用以下代码即可实现:

#include <stdio.h>
#include <stdlib.h>
int main() {
	int b = 0;
	int e = 0;
	for(b=1;b<6;++b) {
		for(e=1;e<6;++e) {
			int a = e != 4 ? 1 : 3;
			int d = a == 3 ? 2 : 3;
			int c = d == 2 ? 5 : 1;
			if(a*b*c*d*e==120) {
				printf("a=%d b=%d c=%d d=%d e=%d\n");
			}
		}
	}
	system("pause");
	return 0;
}			
  1. 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个
    嫌疑犯的一个。以下为4个嫌疑犯的供词。
    A说:不是我。
    B说:是C。
    C说:是D。
    D说:C在胡说
    已知3个人说了真话,1个人说的是假话。
    现在请根据这些信息,写一个程序来确定到底谁是凶手。

先进行逻辑分析,从四个嫌疑犯的话中,可知A、B不是凶手,凶手在C、

#include <stdio.h>
#include <stdlib.h>
int main() {
	//假设好人说的话为0  凶手说的话为1
	int b = 0;
	//B说的话有真假两种情况
	for(b=0;b<2;++b) {
		int a = 0;  //A说的是真的
		int c = b == 0 ? 1 : 0;//如果B说的是对的,那C是凶手,反之C不是凶手
		int d = c == 0 ? 1 : 0;//如果C说的是对的,那D是凶手,反之D不是凶手
		if(a+b+c+d==1) {		//条件判断  三个好人,一个凶手  和为1
			printf("a=%d b=%d c=%d d=%d\n",a,b,c,d);
		}
	}
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述

  1. 在屏幕上打印杨辉三角。
    1
    1 1
    1 2 1
    1 3 3 1
#include <stdio.h>
#include <stdlib.h>
#define n 10
int arr[n][n];
int main() {
	int i,j;
	for(i=0;i<n;++i)
		for(j=0;j<=i;++j) {
			if(i==0||i==j) {
				arr[i][j] = 1;
				printf("%d ",arr[i][j]);
				printf("\n");
			}
			else {
				arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
				printf("%d ",arr[i][j]);
			}
		}
		system("pause");
		return 0;
}			 

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值