关于c语言连续判断问题

目录

1.提出问题

2.解决问题

3.分析问题 


1.提出问题

看到了一个有意思的代码

#include<stdio.h>
int main()
{
	int score;
	scanf("%d",&score);
	if(60<=score<=100)
	{
		printf("及格\n");
	}
	if(0<=score<60)
	{
		printf("不及格\n");
	}
	return 0;
}

这是一个判断成绩是否及格的代码,乍一看彷佛没有什么问题,但是运行一下

2.解决问题

问题有点大,45分怎么既及格又不及格?其实问题就出现在60<=score<=100 这句话里,因为c语言是不可以这样连续判断的,如果想要连续判断,得使用逻辑运算符 且: &&

比如:60<=score<=100得写成0<=score && score<=100

 代码修改后结果如下:

3.分析问题 

为什么写出 if(60<=score<=100)  这种代码,还能正确编译不报错,代码还能正常运行,结果却不对?那就回到if的执行条件来。

我们知道:if(flag){代码}如果flag为true(真),将执行后面的代码,如果flag为false(假),则不执行。

一般true对应的整形值为1,false对应的为0

两个数做判断比较会返回一个bool类型的值(即ture或者false)

 如果三个数字连续作比较会发生什么?

由图可知:都为true ,为什么会这个样子?

因为c语言的连续判断,都是从左往右执行的!!!

a<x<b 先拿a<x比较是否成立,然后得到0或者1拿去和b作比较

比如 2<1<3

他会首先判断2<1,返回结果为false(即0)然后把结果再继续和后面作比较:0<3当然为真,所以返回true(即1)

实践是检验真理的唯一标准!为了验证这个猜想,我又做了以下及格测试

所以回到最开始的问题 :为什么输入45会输出及格

因为:if(60<=score<=100)

执行顺序如下:

首先输入45赋值给score

60<=45显然不成立,返回0,  拿0和100作比较0<=100显然成立返回1

所以if里的是真命题,代码执行输出及格。

同理0<=45为真返回1,1<60为真返回1,代码执行,输出不及格

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言连续邮资问题可以使用回溯法进行求解。该问题的具体描述为:给定一个数列,每个元素表示一种邮资,要求从中选出若干个元素,使得它们的和能够组成连续的邮资,且组成邮资的元素个数最少。 以下是该问题的回溯法实现过程: 1. 首先定义一个数组 postage 存储邮资数列,以及一个数组 used 存储每个邮资是否被使用过(初始都为0)。 2. 定义一个函数 dfs,该函数的参数为当前邮资和 cur、已选元素个数 cnt、当前搜索位置 pos。 3. 在 dfs 函数中,首先判断当前邮资和是否为连续的邮资(即 cur 是否为连续的邮资),如果是,则更新最小元素个数 min_cnt 为当前已选元素个数 cnt,并返回。 4. 然后从 pos 开始枚举邮资,对于每个未被使用过的邮资,将其加入 cur 中,并将 used 相应位置变为 1,然后递归调用 dfs 函数,搜索下一个邮资。 5. 递归返回后,将 cur 中的最后一个元素弹出,并将 used 相应位置变为 0,以便搜索其他可能的方案。 以下是该问题的 C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 int postage[MAXN], used[MAXN]; int min_cnt = MAXN; void dfs(int cur, int cnt, int pos, int n) { if (cur == n) { if (cnt < min_cnt) min_cnt = cnt; return; } if (cnt >= min_cnt) return; for (int i = pos; i < n; i++) { if (!used[i]) { cur += postage[i]; used[i] = 1; dfs(cur, cnt + 1, i + 1, n); cur -= postage[i]; used[i] = 0; } } } int main() { int n, sum = 0; printf("请输入邮资数列长度:"); scanf("%d", &n); printf("请输入邮资数列:"); for (int i = 0; i < n; i++) { scanf("%d", &postage[i]); sum += postage[i]; } memset(used, 0, sizeof(used)); dfs(0, 0, 0, n); if (min_cnt == MAXN) printf("无解\n"); else printf("最少邮票数为:%d\n", min_cnt); return 0; } ``` 该程序首先读入邮资数列,然后调用 dfs 函数进行搜索,最后输出最少邮票数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值