C语言程序设计CAP——C语言学习笔记(三)下

 

嵌套的if

找三个数中的最⼤

int a,b;

printf("请输入两个整数:");
scanf("%d %d", &a, &b);

int max = 0;
if ( a > b ) {
    max = a;
} else {
    max = b;
}

printf("大的那个是%d\n", max);

•    如果要求输入三个整数,输出其中最大的,应该怎么做?

int a,b,c;

scanf("%d %d", &a, &b);

int max = 0;
if ( a > b ) {
    if ( a > c ) { 
        max = a;
    } else {
        max = c;
    }
}else {
    if ( b > c) {
        max = b;        
    }else {
        max = c;
    }
}

printf("The max is %d\n", max);

599618147aca4fc595439b81856c0c93.png

afced4df187744699bf6de8921114f02.png

 嵌套的判断

•    当if的条件满⾜足或者不满⾜足的时候要执⾏行的语句也可以是⼀一条if或if-else语句,这就是嵌套的if语句

if ( code == READY )
if ( count <20 ) 
      printf(“⼀一切正常\n");  
     else 
        printf(“继续等待\n");

else的匹配

•    else总是和最近的那个if匹配

if ( code == READY ) {
    if ( count <20 )
        printf("⼀一切正常\n");
} else
    printf("继续等待\n");

缩进

•    缩进格式不能暗示else的匹配

if ( code == READY )
    if ( count <20 )
        printf(“⼀切正常\n");
else
    printf(“继续等待\n");

嵌套的if
 

if ( gameover == 0 ) 
if ( player2move == 2 )

printf("Your turn\n");
if ( gameover == 0 )
 if ( player2move == 2 ) 
    printf("Your turn\n"); 
else 
    printf("My turn\n");
if ( gameover == 0 )
 if ( player2move == 2 ) 
   printf("Your turn\n"); 
else 
    printf("My turn\n"); 
else 
  printf("GAME OVER\n");
  if ( gameover == 0 )
if ( player2move == 2 )
    printf("Your turn\n"); 
else 
 printf("GAME OVER\n");
if ( gameover == 0 ) {
  if ( player2move == 2 )
    printf("Your turn\n"); 
} else 
 printf("GAME OVER\n");

tips

•    在if或else后面总是用{}
•    即使只有⼀一条语句的时候

 

级联的if-else if

分段函数

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

322faf2125144a368b49cfcef1282d73.png

 级联的if-else if

if ( exp1 ) 
  st1; 
else if ( exp2 ) 
  st2; 
else 
  st3;

527410bdb6bc4d0092ae7c21a5bca5f0.png

 if语句常见错误

•    忘了大括号
•    if后面的分号
•    错误使用==和=
•    使人困惑的else

忘了大括号

•    永远在if和else后⾯面加上大括号,即使当时后面只有一条语句

if后面的分号

if ( age > 60 );
 {
 
salary = salary * 1.2;  
 printf("%f",salay);
}

错误使用==和=

if只要求()里的值是零或非零

15f9f471d8224f42b767ec7450c0b903.png

 代码风格

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

4c4494f4607f4573a26d2e249e8bea2e.png

 多路分⽀

switch-case

if ( type==1 ) 
     printf("你好"); 
else if ( type==2) 
     printf("早上好"); 
else if ( type==3 ) 
     printf("晚上好"); 
else if ( type==4 ) 
     printf("再⻅见");
 else  
   printf("啊,什么啊?");



switch ( type ) {
  case 1:
    printf("你好");
    break; 
  case 2: 
    printf("早上好");   
    break; 
  case 3: 
    printf("晚上好"); 
    break; 
  case 4: 
    printf("再见");
    break; default: 
    printf("啊,什么啊?");
}

2c88dd0973774e389d13e6effdc4cce0.png

 •    控制表达式只能是整数型的结果
•    常量可以是常数,也可以是常数计算的表达式
•    根据表达式的结果,寻找匹配的case,并执行case后面的语句,一直到break为止
•    如果所有的case都不匹配,那么就执行default后⾯面的语句;如果没有default,那么就什么都不做

break

switch ( type ) 
{ 
case 1:  
case 2: 
  printf("你好\n");   
  break; 
case 3: 
  printf("晚上好\n");
case 4: 
   printf("再见\n");  
 break; 
default: 
   printf("啊,什么啊?\n");   
   break;
} 

•    switch语句可以看作是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后⾯面没有break,就会顺序执行到下面的case里去,直到遇到⼀一个break,或者switch结束为止。

//	max3.c
#include <stdio.h>

int main()
{
	int a,b,c;
	scanf("%d %d %d", &a, &b, &c);

	int max = 0;

	if ( a>b ) {
		if ( a>c ) {
			max = a;
		} else {
			max = c;
		}
	} else {
		if ( b>c ) {
			max = b;
		} else {
			max = c;
		}
	}

	printf("The max is %d\n", max);

	return 0;
}
#include <stdio.h>

int main()
{
	int x;
	scanf("%d", &x);
	int f=0;
	if ( x < 0 ) {
		f = -1;
	} else if ( x == 0 ) {
		f = 0;
	} else if ( x >5 ) {
		f = 2 * x;
	} else {
		f = 3*x;
	}

	printf("%d\n", f);

	return 0;
}
#include <stdio.h>

int main()
{
	printf("输入成绩(0-100)");
	int grade;
	scanf("%d", &grade);
	grade /=10;
	switch ( grade ) {
	case 10:
	case 9:
		printf("A\n");
		break;
	case 8:
		printf("B\n");
		break;
	case 7:
		printf("C\n");
		break;
	case 6:
		printf("D\n");
		break;
	default:
		printf("F\n");
		break;
	}

	return 0;
}
#include <stdio.h>

int main()
{

	printf("请输入月份:");
	int month;
	scanf("%d", &month);

	switch ( month )
	{

		case 1: printf("January\n"); break;
		case 2: printf("February\n"); break;
		case 3: printf("March\n"); break;
		case 4: printf("April\n"); break;
		case 5: printf("May\n"); break;
		case 6: printf("June\n"); break;
		case 7: printf("July\n"); break;
		case 8: printf("August\n"); break;
		case 9: printf("September\n"); break;
		case 10:printf("October\n"); break;
		case 11:printf("November\n"); break;
		case 12:printf("December\n"); break;
	}

	return 0;
}

课后思考题:

1、分段函数可以用switch-case吗?划算吗?

答:分段函数可以用switch-case,但不划算,因为switch需要整数型表达式,且case需要常数。分析如下:

1.x取值全部为特定值,很划算,但很少见;

swtich(x){

     case 0:      

     case 1:

}

2.x取值一般是>0.=0,<0三种情况,可以压缩成两种的情况,如视频中函数

switch(x<0){   

   case 0:    //x=0,f=0;  x>0,f=2*x;  可以合并为 x>=0, f=2*x;   

   case 1:        // 这样就转化为判断其中任意一个条件是否成立的结果0、1

}



3.3个条件的情况可以使用3目运算符,实现也不算麻烦:

int flag= x<0 ? -1 : (x>0)      //x<0,flag=-1;x>0,flag=1;x=0,flag=0;
switch(flag){

    case -1:

    case 0:

    case 1:

}

4.x分段更多的情况就很麻烦,不划算:

if (x<0) flag=0;               //搭配if-else使用,有点多此一举了:

if...

switch(flag){...}



inf flag = x<0 ? -1 : (x==0 ? 0  : (...) )         //多重嵌套三目表达式,麻烦

switch(flag){...}

2、switch-case是如何实现的?

1、case小于三,直接判断,索引表的方式进行直接跳转

2、case大于等于4,且每两个case之间的间隔之和不超过6时,按跳转表进行线性结构查找。

3、最大case值和最小case值之差大于255时,应该是先进行树形结构查找划分,直到小于等于3个数据的时候不再进行划分,然后进行索引表处理(?)。

4、switch变量大于(小于)最大(最小)值,直接走default分支。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值