C语言-3.判断

93 阅读7分钟

@TOC

3.1.1做判断:if语句根据条件决定做还是不做

计算时差 输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分钟表示 int hour1,minute1; int hour2,minute2; scanf("%d %d",&hour1,&minute1); scanf("%d %d",&hour2,&minute2); 如果直接分别减,会出现分钟借位的情况。 如果 就用分别减的方案,然后判断有没有出现借位行不行? 借位的表现是,分钟减的结果小于0 int im=minute2-minute1; if(im<0){ .... } 代码:

#include<stdio.h>
int main()
{
	int hours1,min1;
	int hours2,min2;
	scanf_s("%d %d",&hours1,&min1);
	scanf_s("%d %d",&hours2,&min2);
	int hours = hours1 - hours2;
	int min = min1 - min2;
	if (min < 0)
	{
		min = min + 60;
		hours--;
	}
	printf("相差%d时%d分",hours,min);
}

如果 if(条件成立){ ... }

3.1.2判断的条件:关系运算,做比较的运算符

条件 计算两个值之间的关系,所以叫做关系运算

运算符意义
==相等
!=不相等
大于
>=大于等于
<小于
<=小于等于

关系运算的结果 当两个值的关系符合关系运算符的预期时,关系运算的结果为整数1,否则为整数0 printf("%d\n",5==3); printf("%d\n",5>3); printf("%d\n",5<=3); 优先级 所有的关系运算符的优先级比算数运算的低,但是比赋值运算的高 7>=3+4; int r = a > 0; 优先级 判断是否相等的 ==和!=的优先级比其他的低,而连续的关系运算符是从左到右进行的 5>3 ==6>4 6>5>4 a ==b= =c a= =b>0

3.1.3找零计算器

找零计算器需要用户做两个操作:输入购买的金额,输入支付的面票,而找零计算器则根据用户的输入做出相应的动作:计算并打印找零,或告知用户余额不足以购买。 从计算机程序的角度看,这就是意味着程序需要读用户的两个输入,然后进行一些计算和判断,最后输出结果。 代码:

#include<stdio.h>
int main()
{
	//初始化
	int price;
	int bill;
	//读入金额和面票
	printf("请输入金额:");
	scanf_s("%d",&price);
	printf("请输入面票:");
	scanf_s("%d",&bill);
	//计算找零
	if (bill>=price)
	{
		printf("找您%d元",bill-price);
	}
}

注释 以两个斜杠“//”开头的语句把程序分成了三个部分: 1.初始化 2.读入金额和票面 3.计算并打印找零 多行注释 延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列“/*”开始,而以" */"结束。也可以用于一行内的注释 int ak=47/*36 */,y=9;

3.1.4否则的话如果条件不成立呢?

else else=否则的话 代码:

#include<stdio.h>
int main()
{
	//初始化
	int price;
	int bill;
	//读入金额和面票
	printf("请输入金额:");
	scanf_s("%d",&price);
	printf("请输入面票:");
	scanf_s("%d",&bill);
	//计算找零
	if (bill>=price)
	{
		printf("找您%d元",bill-price);
	}
	else 
		printf("您还需要给我%d元",price-bill);
		
}

比较数的大小

#include <stdio.h>
int main()
{
	printf("请输入两个整数:");
	scanf("%d %d",&a,&b);
	int max=0;
	if(a>b)
	{
		max=a;
	}else
	{
		max=b;	
	}
	printf("大的那个数是%d\n",max);
}

3.1.5if语句再探:if和else后面也可以没有{}而是一句话

if语句 一个基本是if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号"{}"之间的若干条语句。如果表示条件的逻辑表达式的结果不是零,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。 if(total>amount) total+=amount+10; if语句这一行结束的时候并没有表示语句结束的";",而后面的赋值语句写在if的下一行,并且缩颈了,在这一行结束的时候有一个表示语句结束的";"。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定它是否要被执行。 计算薪水 代码:

#include<stdio.h>
int main()
{
	const RATE = 8.25;
	const STANDARD = 40;
	double pay = 0.0;
	int hours;
	printf("请输入工作时间:");
	scanf_s("%d",&hours);
	if (hours > STANDARD)
	{
		pay = STANDARD * RATE + (hours - STANDARD) * (RATE * 1.5);
	}
	else
		pay = hours * RATE;
	printf("应付工资:%lf",pay);
}

3.2分支

3.2.1嵌套的if-else:在if或else后面要执行的还是if语句,就成了嵌套

找三个数中最大的 代码:

#include<stdio.h>
int main()
{
	int a, b, c, max;
	scanf_s("%d %d %d",&a,&b,&c);
	if (a > b)
	{
		if (a > c)
		{
			max = a;
		}
		else
		{
			max = c;
		}
	}
	if (a < b)
	{
		if (b > c)
		{
			max = b;
		}
		else max = c;
	}
	printf("最大的数是:%d",max);
}

当if的条件满足或者不满足的时候要执行的语句也可以是一条if或if-else语句,这就是嵌套的if语句 if(code == READY) if(count<20) else printf("继续等待"); else的匹配 else总是和我最近的那个if匹配 if(code==READY){ if(counr<20) printf("一切正常"); }else printf("继续等待"); 缩进 if(code ==READY) if(count<20) printf("一切正常"); else printf("继续等待"); 上面的代码中else虽然个第一个if对齐,但是在计算机运行的过程中是和第二个if关联的,因此缩进和if的配对没有关系。 tips 在if或else后面总是用{} 即使只有一条语句的时候。

3.2.2级联的if-else if像分段函数这样的程序就可以写成这样的if

分段函数

if(x<0)
{
	f=-1;
}else if(x == 0)
{
	f=0;
}else 
{
	f=2*x;
}

级联的if-else if if(exp1) st1; else if(exp2) st2; else st2; 像这样的有的人会有下面一种写法:

if(x<0){
	printf("%d",-1);
}else if(x == 0){
	printf("%d",0);
}else{
	printf("%d",2*x);
}

一般不推荐这样写,最好写为单一出口。

3.2.3if语句常见的错误:没有{},多了;,=和==这些都是常见的错误

if语句的常见的错误 忘了大括号 if后面的分号 错误使用==和= 使人困惑的else 忘了大括号 错误代码: if(age>60) salary=salary1.2; printf("%f",salary); 这个代码的本意是如果age大于60,就乘1.2再输出,但是因为忘记加大括号所以无论age是否大于60都会输出age, 修改代码: if(age>60){ salary=salary1.2; printf("%f",salary); } 永远在if和else后面加上大括号,即使当时后面只有一条语句 if后面的分号 如果if后面加分号,计算机就不会进行判断,会直接运行if下面的语句。 **错误使用 ==和= id只要求()里的值是非零或零 如果()里面只有一个等号,例如: if(A=B) { printf("A=B"); } 这样的话,计算机会自动帮你将B赋值给A然后判断A是不是为零,再执行大括号里的值。

代码风格 在if和else之后必须加上大括号形成语句块; 大括号内的语句缩进一个tab的位置

3.2.4多路分支

switch-case

switch(type)(
	case 1:
		printf("你好");
		break;
	case 2:
		printf("早上好");
		break;
	case 3:
		printf("晚上好");
		break;
	case 4:
		printf("再见");
		break;
	default:
		printf("?");

switch-case switch(控制表达式) { case 常量: 语句 。。。 case 常量: 语句 。。。 default: 语句 。。。 } 控制表达式只能是整数型的结果 常量可以是常数,也可以是常数计算的表达式 根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止 如果所有的case都不匹配,那么就执行default后面的语句; 如果没有default,那么就什么都不做。 break switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支语句)处。 分支标号只是说明switch内部位置的路标,在执行完分支的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。 练习 题目:当成绩大于90为A 当成绩小于90且大于等于80为B 当成绩小于80且大于等于70为C 当成绩小于70且大于等于60为D 当成绩小于60为E 代码:

#include<stdio.h>
int main()
{
	printf("请输入分数:");
	int scour;
	scanf_s("%d",&scour);
	int scour1 = scour / 10;
	switch (scour1)
	{
		case 10:
		case 9:
			printf("A");
			break;
		case 8:
			printf("B");
			break;
		case 7:
			printf("C");
			break;
		case 6:
			printf("D");
			break;
		default:
			printf("E");
			break;
	}
	return 0;
}