多个数字判断大小问题C语言超详解(小白超级易懂)
多个数字判断大小问题C语言超详解(小白超级易懂)
作者为编程新人水平有限,博客代码书写均为基础内容,比较便于新人理解。若有错误不严谨不合理之处,望各位大佬提出并给予意见,感谢各位!本博客是我真正意义上的一篇博客,虽然花费了不少时间,但是感觉写的不是很好,请各位看官见谅,谢谢!
目录
1.三个数字比较问题
问题具体导入
题目分析:首先题目给出的要求是输入三个整数,然后判断三个整数的大小,最后让我们从小到大依次打印出来。
具体代码书写(此处给大家介绍两种方法):
第一种:直接比较法
part 1:搭建一个基本框架
# include <stdio.h>
int main(){
//我们在这里书写代码哦
return 0;
}
刚入门的新人可以先搭建一个这样最简单的框架,如果题目要求用到别的东西,再添加即可!
part2:定义我们需要的变量
int a = 0;
int b = 0;
int c = 0;
从题目中我们很清晰的知道我们只需要定义a b c三个变量即可,一般情况下,我们定义变量为0!
part 3:读取a b c输入的值
scanf("%d %d %d", &a, &b, &c);
我们用scanf来读取输入的数,分别将第一个数存储到a,第二个数存储到b,第三个数存储到c。记住哦,一定要用取地址符号&哦!
part 4:运用 if 判断语句对多种情况分析
首先我们先总体分为a>b 和 a<b的情况
if(a>b){
//a>b的再具体细分内容
}
else{
//a<b的再具体细分内容
}
总体分完后我们先看 a>b 的再具体细分部分:
a和b的关系已经确定了,但是a和c以及a和b的关系是不确定的!
我们要分多种情况分析:1.如果c>a,那么只有一种情况:b<a<c
2.如果c<a,那么就要继续讨论c和b的关系:
(1) 若b>c 那么 c<b<a
(2) 若b<c 那么 b<c<a
对a>b的全部分析代码如下:
if(a>b){
if(c>a){
printf("%d->%d->%d", b, a, c);
} else if(b>c){
printf("%d->%d->%d", c, b, a);
} else {
printf("%d->%d->%d", b, c, a);
}
else(a<b){
//a<b的再具体细分内容
}
使用if语句时一定要带大括号哦,else if 中 else是承接上文并否定上一个if,if是启下并说明新的条件要求。一定要注意if else的对应!
同理,a<b的情况也是如此,此处不再具体详写!
本部分全部代码如下:
if(a>b){
if(c>a){
printf("%d->%d->%d", b, a, c);
} else if(b>c){
printf("%d->%d->%d", c, b, a);
} else {
printf("%d->%d->%d", b, c, a);
}
}
else{
if(c>b) {
printf("%d->%d->%d", a, b, c);
} else if(a>c) {
printf("%d->%d->%d", c, a, b);
} else {
printf("%d->%d->%d", a, c, b);
}
到这里我们的题目就已经完成了,我们把上面写的代码全部整合:
# include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d", &a, &b, &c);
if(a>b){
if(c>a){
printf("%d->%d->%d", b, a, c);
} else if(b>c){
printf("%d->%d->%d", c, b, a);
} else {
printf("%d->%d->%d", b, c, a);
}
}
else{
if(c>b) {
printf("%d->%d->%d", a, b, c);
} else if(a>c) {
printf("%d->%d->%d", c, a, b);
} else {
printf("%d->%d->%d", a, c, b);
}
}
return 0;
}
我们输入4 2 8 验证一下:
当然本题目还有别的方式可以解决
该题目没有运用到单一出口
运用了多个printf
下一种方法运用单一出口!!
即只有一个printf
第二种:交换法(本质上思路想法和法一 if 判断部分一样)
part1:搭建框架+定义变量+scanf读取(我们把这几步合在一起)
# include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
scanf("%d %d %d",&a ,&b ,&c);
//在这里继续敲写代码哦
return 0;
}
part2:
交换法最重要的一点就是要明白变量 a b c不仅仅拥有各自的大小,而且a b c还有不同的涵义:a 表示 最大值 ,b 表示中间值 , c表示最小值
我们要把a b c 每一个字母与其他对应字母的关系都讨论一遍
于是这里分为3组:a与b ,a与c,b与c
由于我们在比较两个数字后需要将最大值 中间值 最小值 分别赋予给相应的变量中去
所以我们需要一个中转站来临时存放一个变量的值
# include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
int x = 0; //这里的变量x为中转站
scanf("%d %d %d",&a ,&b ,&c);
//在这里继续敲写代码哦
return 0;
}
我们先来看a与b:
if(a<b)
{
x = a;
a = b;
b = x;
}
我们可以看到当a<b的时候,我们就需要把b的值赋给a,同时a的值赋给b。
那么我先把 a 赋值给 x
然后把 b 赋值给 a
这样b的值顺利赋给了a
而 a 原来的值暂时存放在了中转站
所以要想让 a 原来的值赋给b
我只需要 让中转站赋值给 b!!!
我们再来看a与c 以及 b与c:
if(a<c)
{
x = a;
a = c;
c = x;
}
if(b<c)
{
x = b;
b = c;
c = x;
}
思路其实都是相同的,就是比较后把 大的数字 赋予给代表 大的数字的变量(a)
中的数字 赋予给代表 中的数字的变量(b)
小的数字 赋予给代表 小的数字的变量(c)
part3:输出
printf("%d->%d->%d", c, b, a);
注意哦本题目要求从小到大打印 我们要把代表 小的数字的变量 放在前面,后面类推。
最后我们将本题目代码整合:
# include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
int x = 0;
scanf("%d %d %d",&a ,&b ,&c);
if(a<b)
{
x = a;
a = b;
b = x;
}
if(a<c)
{
x = a;
a = c;
c = x;
}
if(b<c)
{
x = b;
b = c;
c = x;
}
printf("%d->%d->%d", c, b, a);
return 0;
}
ok 我们来输入 4 2 8 来验证一下:
ok 我们的结果也是正确的!!
下面我们来看多个数字比较!!!
2.多个数字比较问题
现在不仅仅是要求对三个数字进行比较了
而是多个数字进行比较 如下面的题目:
本题要求在10个数字中求出最大值
倘若按照上面的方法 那么就会特别麻烦!!
所以下面我介绍一个方法来解决这类题目问题
具体的我们也需要一个中转站
part1:框架+定义
# include<stdio.h>
int main(){
int num = 0;
int num_max = 0;
//其他代码继续写在这里哦
return 0;
}
这里把要输入数字变量定义为 num
把这里最大数字变量定义为 num_max
part2: for循环多次输入
for(语句一;语句二;语句三){
循环体
}
for语句中
语句一是初始化内容(在循环中只执行一次)
语句二是进入循环条件
语句三是执行完循环体内容后再执行的语句
具体执行顺序如下: 语句一 ----->语句二 ------>循环体 ------>语句三
for(int count = 10; count>0 ; count--){
scanf("%d", &num);
//接下来的代码写在这里哦
}
由于题目要求输入10个整数
所以我在语句一初始化一个变量count 用来计数 给他赋值为10
我们进去循环的条件是count>0
我们每次执行完一次循环后,我们都让count减去1(count--实际上就是count = count - 1)
那么进行10次循环以后呢,count变成0,无法满足条件进入循环进行输入,那么我们的目的就达到
part 3:
接着我们需要运用三目操作符(也叫条件操作符)来解决问题
//举例用,和题目源代码无关
exp = exp1 ? exp2 : exp3
//假设exp已经初始化
那么此时exp 的值就是三目操作符的最终结果
介绍完三目操作符我们回到题目中来
此时我们就可以利用这个三目操作符来比较多个输入的数字并且得到最大值
num_max = num>num_max ? num : num_max;
num 表示输入的数值 num_max表示当前最大值
当num>num_max 成立时 num_max = num_max(当前最大值没变)
当num<num_max不成立时 num_max = num(当前最大值变化 num成为新的当前最大值)
也就是说如果输入的数(num)比当前最大值(num_max)要小
那么当前最大值不变
如果输入的数(num)比当前最大值(num_max)要大
那么输入的这个数(num)就变成当前的最大值(num_max)了
所以把num的值赋给num_max
如此反复,就可以得出输入多个数字中的最大值了
part4:输出
printf("最大值为:%d", num_max);
本题目全部代码整合如下:
# include<stdio.h>
int main(){
int num = 0;
int num_max = 0;
for(int count = 10; count>0 ; count--){
scanf("%d", &num);
num_max = num>num_max ? num : num_max;
}
printf("最大值为:%d", num_max);
return 0;
}
下面我们来随机输入10个数字 看看结果如何:
结果是正确的呢!!!!!
那么下面再来看别的情况
3.不确定无限个输入数字比较问题
这种题目没有具体要求输入多少个数字
那么这该怎么办呢?????
没有关系,下面将介绍一种方法解决这类问题
那就是 “循环输入”!!!
part 1:copy一下代码
# include<stdio.h>
int main(){
int num = 0;
int num_max = 0;
//接下来代码写在这里哦
printf("最大值为:%d", num_max);
return 0;
}
本问题难点就是输入的问题!!
如何让程序无论输入多少个数都可以判断最大值呢??
part 2:
实际上我们可以用“循环输入”的方法
首先我们来介绍一下scanf的返回值:
scanf 是读取数据用的
我们输入数字的类型是整形,如果scanf读取到一个不同类型的数字,此时就会返回一个0的值
那么此时我们可以利用scanf的返回值来解决问题
while(scanf("%d", &num)){
num_max = num>num_max ? num : num_max;
}
如图所示 这里while循环的条件判断上为一个scanf输入
也就是说如果scanf读取到非整形的类型数据 那么就会返回0
此时while(0)
0表示假 非0表示真 (真就执行 假就不执行)
当while后面条件等于0时 循环不会进行 就可以跳出循环
所以当我们想解决不确定数字个数的问题时,可以先输入多个数字。然后输入一个字母用来结束循环即可。
eg:
我们先输入一些数字,输入完成后随便输入一个字母就可以了!!
我们运行看看结果 是可以的!!!
全部代码整合如下:
# include<stdio.h>
int main(){
int num = 0;
int num_max = 0;
while(scanf("%d", &num)){
num_max = num>num_max ? num : num_max;
}
printf("最大值为:%d", num_max);
return 0;
}
END
感谢您的阅读!!!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)