3.分支结构

c程序设计结构
顺序结构
一条一条指针执行。
a = 3;
b = 4;

分支结构(选择结构)
	if 
	switch
	
循环结构
	while 
	for 
	do ... while 
	goto ... if ...
  1. if 语句
    有三种形式:
    (1)
    if(表达式)
    语句(指令)

     表达式 : 进行选择是否执行“语句”的条件。
     	任意C语言中合法的表达式都OK。
     	只要是一个合法的表达式,那么它都有一个确定的值,
     	只需要去判断这个值是 0 还是 非0。
     	
     语句(指令) : 在满足条件下要执行的语句或指令。
     	单语句 : 一个 ; 号的语句
     	复合语句: 用{}括起来的,里面可能含有 if/switch/for/while ....
     			组合而成的语句。
     		
     执行顺序: 
     	先判断"表达式"的值是否为真,
     		if(如果)为真,那么就执行“语句”,
     			否则就不执行“语句”。
     			
     例子: 
     	
     	int main()
     	{
     		int a, b;
     		if(3 < 2);
     			a = 3;
     			b = 4;
     		printf("%d\n", a); //3
     		printf("%d\n", b); //4
     	}
     	
     	
     编程建议: 
     	不管if后面有没有语句,先打一对{}, 以示主权,确定其管辖范围。
     	if()
     	{
     	
     	}
    

    (2)
    if(表达式)
    语句1
    else
    语句2

     else : 否则。
    
     表达式: C语言中任意合法的表达式都OK.
    
     语句1/2 : 可以是 “单语句”,也可以是“复合语句”
     
     执行顺序: 
     	先判断“表达式”的值,
     		if(如果)"表达式"的值是否为真,
     			那么就执行“语句1”;
     		else(否则)就执行“语句2”.
     		
     		 
     例子: 
     	 if(5 > 3)
     		//a = 1;
     		b = 2;
     	 else  
     		a = 2;
     		b = 3
     	 
     	 ERROR : else 前面没有匹配的 if 
     	 
     	 => 
     		if(5 > 3)
     		{
     			a = 1;
     			b = 2;
     		}
     		else 
     		{
     			a = 2;
     			b = 3;
     		}
     编程建议: 
     	不管if, else后面有没有语句,先打一对{}, 以示主权,确定其管辖范围。
     	if()
     	{
     	
     	}
     	else			
     	{
     	
     	}
    

    (3)
    if(表达式1)
    语句1
    else if(表达式2)
    语句2


    else if(表达式i)
    语句i
    else
    语句n

     表达式1 .... n : 任意C语言中合法的表达式都OK。 
     
     语句: 可以是“单语句”,也可以是“复合语句”
     
     例子:  先打括号
     	if(5 > 3)
     		a = 1;
     		b = 2;
     	else if(5 < 3)
     		c = 3;
     		d = 4;
     	else 
     		e = 5;
     		
     例子: 
     	根据num与cost之间的数学函数关系式, 写出关系代码段。
     	
     		if(num > 500)
     		{
     			cost = 0.15;
     		}
     		else if(num > 300)
     		{
     			cost = 0.10;
     		}
     		....
     		....
     		else 
     		{
     			cost = 0;
     		}
    

    练习:
    1. 从键盘输入两个整数a,b ,按照从小到大的顺序输出。

#include <stdio.h>

int main()
{
	int a;
	int b;
	
	scanf("%d %d", &a, &b);
	
	//printf("%d %d\n", a > b ? b : a , a > b ? a : b );
	
	if(a > b)
	{
		printf("%d %d\n", b , a );
	}
	else 
	{
		printf("%d %d\n", a,  b );
	}
}
  1. 从键盘输入三个整数a,b ,c, 按照从小到大的顺序输出。

     	int a, b , c;
     	scanf("%d%d%d", &a, &b , &c);
     	
     	思路: 
     		S1 : 想办法确保 a < b < c 
     			1.1 确保 a<b , 如果 a > b ,则交换它们
     				if(a > b)
     					a <-> b
     			
     			1.2 确保 a<c  如果 a > c ,则交换它们
     				if(a > c)
     					a <-> c
     				
     			
     			1.3 确保 b<c  如果 b > c ,则交换它们
     				if(b > c)
     					b <-> c
    
     		printf("%d %d %d\n", a , b ,c);
     		
     	代码: 
    
				int main()
				{
					int a, b , c;
					scanf("%d%d%d", &a, &b , &c);
					int temp;
					if(a > b)
					{
						temp = a;
						a = b;
						b = temp
					}
					
					if(a > c)
					{
						temp = a;
						a = c;
						c = temp;
					}
					
					if(b > c)
					{
						temp = b;
						b = c; 
						c = temp;
					}
					
					printf("%d %d %d\n", a, b ,c);
				}
  1. 从键盘输入三个整数a,b ,c.判断由这三个数为边,
    能否组成一个三角形。

     	三角形: 
     		任意两边之和 大于 第三边。
     		a + b > c 
     		a + c > b 
     		b + c > a
     		
     	if(a+b>c && a+c>b && b+c>a)//任意两边之和 大于 第三边
     	{
     		YES
     	}
     	else 
     	{
     		NO
     	}
    
  2. 从键盘输入一个字符,如果他是小写字母,则转换成大写
    如果他是大写字母,则转换成小写
    其他字符,保持不变
    然后再输出字符形状。

#include <stdio.h>

int main()
{
	//定义一个字符变量
	char ch;

	//从键盘给ch赋值
	scanf("%c", &ch);

	//判断
	if(ch >= 'a' && ch <= 'z') // ch >= 97 && ch <= 122
	{
		ch -= 32; //ch = ch - 32
		printf("%c -> %c\n", ch+32, ch );
	}
	else if(ch >= 'A' && ch <= 'Z')
	{
		ch += 32;
		printf("%c -> %c\n", ch-32, ch );
	}
	else 
	{
		printf("%c -> %c\n", ch, ch );
	}

	


}
  1. 有几个需要注意的地方

    (1) 语句 : C语言中的指令

     表达式语句 : 
     	表达式 ; 
     	
     	例子: 
     		a = 3   -> 表达式 
     		a = 3 ; -> 表达式语句
     		
     		
     		
     if语句 : 分支语句 
     循环语句 : 
     	while 
     	do ... while 
     	for 
     goto 语句 
     return 语句 
     switch 语句 
     .....
    

    (2) 条件

     并列条件 : 会一一判断 
     	
     	例子: 
     		if(条件1) 
     		{}
     		
     		if(条件2) 
     		{}
     		
     		....
     
     互斥条件 : 有你没我,有我没你
     	
     	例子: 
     		if(条件1) 
     		{}
     		else if(条件2) 
     		{}
     		...
    

    (3) if语句的嵌套
    “条件里面分条件”
    在if语句中又包含一个 或 多个if语句 称为if语句的嵌套。

     if(expression)
     	if() 语句1 
     	else 语句2 
     else 
     	if() 语句3 
     	else 语句4
     
     
     => 
     	if(expression)
     	{
     		if()
     		{
     			语句1
     		}
     		else 
     		{
     			语句2
     		}
     	}
     	else 
     	{
     		if()
     		{
     			语句3
     		}
     		else 
     		{
     			语句4
     		}
     	}
     
     关键: else匹配问题 
     	else 总是和上面的、最近的、未匹配的if进行配对。
    
  2. switch 语句

    switch(表达式)
    {
    case 常量表达式1 :
    语句1;
    case 常量表达式2 :
    语句2;


    case 常量表达式n :
    语句n;

     default : 
     	语句m;
    

    }

    switch 语句:
    拿“表达式”的值,和case后面的“常量表达式”的值进行匹配,
    一旦匹配成功,则从那个case后面开始执行,直到遇到 break 或
    switch结束。
    如果一个case都没有匹配成功,则匹配default.

     例子: 
     	
     	scanf("%d", &a); //3
     	switch(a)
     	{
     		default : 
     			b = 250;
     		
     		case 0: 
     			b = 0;
     		case 1 : 
     			b = 1;
     			break;
     		case 2 : 
     			b = 2;
     	}
     	printf(b) // 1
     	
     	
     	
     关于switch : 
       (1) switch后面的"表达式" 必须是一个可以列举的值。
       必须为一个整数值: 整型、字符型、枚举。
     		
        (2) case后面的“常量表达式”也必须是一个整数值,
     		并且每个case后面的“常量表达式”的值必须互不相同。
     		
     	 (3) 各个case和default出现次序不影响匹配的结果,
     		一旦匹配成功,就从此处往下面执行。
    
    
     	(4) “语句”可以省略,意思是说,多个case可以共用一组语句。
     
     	例子: 
     		switch(a) // 4 
     		{
     			case 0:
     			case 1: 
     			case 2: 
     				b = 2;
     				break;
     			case 3: 
     			case 4:
     			case 5: 
     				b = 5;
     				break;
     		}
    
     (5) switch 中的 break 用来跳出它(break)所属的switch语句的。
     
     	例子: 
     		
     		switch(m)
     		{
     			csae 1 : 
     				a = 1;
     				break;
     			case 2 : 
     				switch(n)
     				{
     					case 5 : 
     						a = 5;
     						break;
     					case 6 : 
     						a = 6;
     				}
     				
     			case 3 : 
     				a = 3;
     		}
    

练习:

  1. 从键盘输入一个十六进制的字符[0-9a-fA~F],输出其对应的十进制数值。
#include <stdio.h>

int main()
{
	char ch;
	scanf("%c", &ch);

	int num;

	switch(ch)
	{
		case 'a': 
		case 'b': 
		case 'c':
		case 'd':
		case 'e':
		case 'f':
			num = ch - 87;
			break;
		case 'A': 
		case 'B': 
		case 'C':
		case 'D':
		case 'E':
		case 'F':
			num = ch - 55;
			break;
		default : 
			num = ch - 48;

	}

	printf(" %c -> %d\n", ch , num);


}
  1. 从键盘输入一个成绩值(整型), 把这个成绩值对应的
    等级输出。
    ‘A’ : [90,100]
    ‘B’ : [80, 90)
    ‘C’ : [70, 80)
    ‘D’ : [60, 70)
    ‘E’ : [0, 60)
#include <stdio.h>

int main()
{
	int score; 
	char dengji;

	scanf("%d", &score);

	switch(score / 10)
	{
		case 10 : 
		case 9 :
			dengji = 'A';
			break;
		case 8 : 
			dengji = 'B';
			break;
		case 7 : 
			dengji = 'C';
			break;
		case 6 : 
			dengji = 'D';
			break;
		default : 
			dengji = 'E';
	}

	printf("%d => %c\n", score, dengji);
}

习题:
1. 输入一个日期(年,月,日),求该日期至当年年末有多少天?

#include<stdio.h>
int main()//求某天到年某的函数
{
	int year , month, day;
	printf("请输入日期:");
	scanf("%d%d%d",&year,&month,&day);
	int d1 = 0;
	switch(month)
	{
		case 1: 
			d1 += 31;
		case 2: 
			if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
			{
				d1 += 29;
			}
			else 
			{
				d1 += 28;
			}
		case 3: 
			d1 += 31;
		case 4: 
			d1 += 30;
		case 5: 
			d1 += 31;
		case 6: 
			d1 += 30;
		case 7: 
			d1 += 31;
		case 8: 
			d1 += 31;
		case 9: 
			d1 += 30;
		case 10: 
			d1 += 31;
		case 11: 
			d1 += 30;
		case 12: 
			d1 += 31;	
	}
	d1 = d1 - day;
	printf("%d",d1);
	return 0;
}

2.公司决定发放奖金,根据公司的当年利润决定。

	当年利润I低于或等于100000元时,奖金可提成10%,
	利润大于100000元,小于200000元时(100000 < I <= 200000)时
		低于100000的部分按10%提成,高于100000部分可提成7.5%;
	利润大于200000元,小于400000元时(200000 < I <= 400000)
		低于200000的部分按上述方法提成(同下),高于200000部分可提成5%
	
		(400000 < I <= 600000) 低于400000按上述方案提成,
		高于400000部分提成3%。
		(600000 < I <= 1000000) 低于600000按上述方案提成,
		高与600000部分提成1.5%
		(I > 1000000) 低于1000000按上述方案提成,
		高于1000000部分提成1%.
		
	(1)用if来编程实现。
#include<stdio.h>
int main()
{
    int i,m;
    printf("请输入利润:");
    scanf("%d",&i);
    if(i<=100000)
    m=i*0.1;

    else if(100000<i&&i<=200000)
    m=100000*0.1+(i-100000)*0.075;

    else if(200000<i&&i<=400000)
    m=100000*0.1+100000*0.075+(i-200000)*0.05;

    else if(400000<i&&i<=600000)
    m=100000*0.1+100000*0.075+200000*0.05+(i-400000)*0.03;

    else if(600000<i&&i<=1000000)
    m=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(i-600000)*0.015;

    else
    m=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(i-1000000)*0.01;
    
    printf("%d",m);
    return 0;
}
	(2)用switch来编程实现。
    #include<stdio.h>
	#include<stdlib.h>
	int main()
	{
		double I;
		double p = 0;
		scanf("%lf",&I);

		
		int c=I/100000;
		switch(c)
		{
			default : 
			case 10 : 
				p += (I - 1000000) * 0.01;
			
				I = 1000000;
			
			case 9:
			case 8:
			case 7: 
			case 6: 
				p += (I - 600000) * 0.015;
				I = 600000;
			
			case 5 : 
			case 4 : 
				p += (I - 400000) * 0.03;
				I = 400000;
			case 3 :
			case 2 :
				p += (I - 200000) * 0.05;
				I = 200000;
			case 1 :
				p += (I - 100000) * 0.075;
				I = 100000;
			case 0 :
				p += I * 0.1;

		}
		printf("%0.2lf",p);
		system("pause");

	}
  1. 输入一个形式如 “操作数 运算符 操作数” 的四则运算表达式,
    输出运算结果 。(+ - * / %)
    例子:
    输入 :
    5 + 3
    输出 :
    5 + 3 = 8
#include<stdio.h>
int main()
{
	int a,c,x;
	char b;
	scanf("%d %c %d",&a,&b,&c);
	switch(b)
	{
		case '+' : x=a+c;break;
		case '-' : x=a-c;break;
		case '*' : x=a*c;break;
		case '/' : x=a/c;break;
		case '%' : x=a%c;break;
		default : printf("error");
	}
	printf("%d %c %d = %d",a,b,c,x);
	return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaowuguiya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值