C语言程序设计——流程控制(C语言第一个重点)

什么是流程控制

概念:程序代码执行的顺序

流程控制的分类

一、顺序执行

程序举例

  1. 交换两个数

    t=a;
    a=b;
    b=t;

  2. 后两位四舍五入

    原数乘100
    加上0.5
    取整
    除以100输出

     例如将2.437—>2.44
    
    double x;
    x=x*100;
    x=x+0.5;
    x=(int)x;	//x的接受类型任然是double类型
    x=x/100;	//x=2.44
    

二、选择执行

1.概念

某些代码可能执行,也可能不执行,有选择的执行某些代码

2.分类

2.1 if语句
  1. if最简单的用法

    格式:

    if(表达式)
    	语句
    

    功能:如果表达式为真,执行语句,反之不执行

    if的范围问题:

    1. if(表达式)
    		语句A;
    		语句B;
    	只控制A的执行或不执行,无法控制语句B一定会执行
    2. if(表达式)
    	{
    		语句A;
    		语句B;
    	}
    	if都控制
    
  2. if…else…用法
    是一个语句

    if(表达式){
    	A;
    }
    else{
    	B;
    }
    
  3. if…else if…else…用法
    一个语句

    if1)		成立执行A
    	A;
    else if21不成立,2成立执行B
    	B;
    else			1,2都不成立,执行C
    	C;
    
  4. if语句的嵌套

    if()
    	if()
    		语句1else()
    		语句2else		
    	if()
    		语句3else
    		语句4;
    注:ifelse的配对关系,else总是与它上面的最近的未佩对的if配对
    
    如果ifelse的数目不一样,为实现程序设计者的思想,可以加花括号来确定配对关系
    if()
    {
    	if()
    		语句1}
    else
    	语句2;
    这里的else就与第一个if进行配对了
    
  5. 举例

    • 90<=score<=100
      写法是错误的
      因为:90<=score逻辑值永远为1或0,那么1或0永远小于100,所以执行的结果永远为真(1)
      正确的写法:90<=score&&score<=100

    • 两个变量值得互换

      例:int a=3int b=5;
      方法:加一个另外变量	int t;
      	a,b互换如下 
      		t=a;
      		a=b;
      		b=t;
      
    • 对三个变量的值进行排序

        编写代码完成:a最大,b中间,c最小
        方法:定义一个中间变量t
      
      if(a<b)
      {
      	t=a;
      	a=b;
      	b=t;
      }
      if(a<c)
      {	
      	t=a;
      	a=b;
      	b=t;
      }
      if(b<c)
      {
      	t=b;
      	b=a;
      	a=t;
      }
      
  6. if的常见问题

    1. 空语句问题

      if(3>2);
      等价于
      if(3>2)
      	;		这是一个空语句
      
    2. 错误示范

      if(表达式1);			有一个空语句
      		A;				第二个语句
      else					else无法与第一个if语句匹配
      	B;
      
    3. 语句执行问题

      if(表达式1)
      	A;
      else if(表达式2)
      	B;
      else
      	C;
      即使表达式12都成立也只会执行A语句
      
    4. 语句逻辑上有漏洞(虽然不会出错)

      if(表达式1)
      	A;
      else if(表达式2)
      	B;
      else if(表达式3)
      	C;
      
    5. 不合法语句

      if(表达式1)
      	A;
      else(表达式2)		这样写法不正确:要么去掉(表达式2);要么在else后加if
      	B;
      
2.2 switch语句
  1. 一般形式:

    switch(控制表达式)
    {
    	case常量表达式1:
    		语句1breakcase常量表达式2:
    		语句2breakcase常量表达式3:
    		语句3break.......
    	default:
    		语句n;
    		break} 
    
  2. 举例

    scanf("%d",&val);
    switch(val)
    {
    	case 1:
    		printf("一层开\n");
    		break;
    	case 2:
    		printf("二层开\n");
    		break;
    	default :
    		printf("没有这一层\n")break;
    }break去掉后,输入1
    将输出:一层开和二层开
    因为:case1和case2都是程序的入口,先找到入口后再自上而下执行,不再进行判断。
    
    #include<stdio.h>
    
    int main(void){
    	char grade;
    	scanf("%c", &grade);
    	printf("Your score:");
    	switch(grade){
    		case 'A': printf("85-100\n"); break;
    		case 'B': printf("70-84\n"); break; 
    		case 'C':
    			printf("60-69\n");
    			break;
    		default:printf("data error\n");
    	}
    	
    	return 0;
    } 
    
    ------------------
    C
    Your score:60-69
    
    

    case后面的称为标签:常量表达式
    只能是:枚举常量、数值常量、字符、常变量、宏名

三、循环执行

1.定义

某些代码会被重复执行

2.分类

2.1 for语句
  1. 一般形式为:

    for(表达式1;表达式2;表达式3){
    	语句
    }
    
    表达式1:设置初始条件,只执行一次。可以是0,1个或者多个变量设置初值
    表达式2:循环条件表达式,判定是否继续循环。在每次执行循环体前先执行此表达式,决定是否继续执行循环体
    表达式3:作为循环的调整。执行完循环体之后才进行的
    

    注:for语句中的表达式可以部分或者全部省略,但是两个;不能省略。

    • 表达式2是一个逻辑表达式,当表达式2为假就跳出for循环
    #include <stdio.h>
    int main(void)
    {
    	int a=-1,b=2;
    	for(; a++,b--; )
    		printf("%d %d",a, b);
    }
    程序的输出结果为:-1 1 0 0
    
    注:for循环每次判断表达式a++,b--的值,这是逗号表达式,首先计算a++,再计算b--,
    	整个表达式的值是b--的值,若逗号表达式值不为0,则执行for循环
    
  2. 执行过程

    for(i=1; i<4; ++i)		表达式(1,2,3)
    	sum = sum + i;		表达式 4	
    printf("sum=%d\n", sum);
    
    先执行1,在执行22成立的话),执行4,再执行3, 3执行完表示一次循环结束。
    
    i=1,1<=4 	成立
    sum=1,i=2	第一次循环结束
    
    i=2,2<=4		成立
    sum=1+2=3,i=3	第二次循环结束
    
    i=3,3<=4		成立
    sum=1+2+3=6,	第三次循环成立
    
    i=4,4<=4			成立
    sun=1+2+3+4=10,i=5	第四次循环成立
    
    i=5,5<=4		不成立
    执行下一个语句
    i的最终值是5
    
  3. 多个for循环的嵌套使用

    for123for456)
    		A;
    		B;
    先执行:1->2(成立)->4->5(成立)->A->6		一次循环结束 
    例如:
    	内部:6->5(成立)->A->6->5(不成立)
    	外部:->3->2(成立)->4->5(成立)->A->6
    			   ->5(不成立)->3->2(不成立)->B		结束
    
2.2 while语句
  1. 一般形式

    while(表达式)
    {	
    	循环体
    }
    
  2. 执行顺序

    while(表达式)
    	语句;
    
    表达式成立执行下面语句,语句就是循环体,循环体只能是一个语句,可以是一个简单的语句,还可以是复合语句。
    
  3. 举例

    求回文数
    	int main(void)
    	{
    		int val;
    		int m;
    		int sum=0;
    		scanf("%d",&val);
    		m=val;
    		while(m);
    		{
    			sum=sum*10+m%10;
    			m=m/10;
    		}
    		if(sum==m)
    		printf("YES\n");
    	}
    	```
    	整数求逆
    	对一个整数做%10得到它的个位数
    	对一个整数做/10,去掉它的个位数
    
    
2.3 do…while语句
  1. 一般形式:

    do
    {
    	循环体语句
    }while(表达式);
    
    先执行循环体里面的语句,然后判断表达式是否成立,如果表达式成立继续执行循环体语句
    
    do...while并不等价于for,也不等价于while
    
    主要用于人机交互
    例如:
    char ch;
    do
    {	
    	...
    	...
    	printf("想继续吗?(Y/N)")scanf("%c",&ch);
    }while('Y'==ch||'y'==ch);
    
    
2.4 break语句和continue语句
  1. break语句作用:使流程跳到循环体之外,接着执行循环体下面的语句

     1. 如果用于循环是用来终止循环的
     2. 如果用于switch则用来终止switch
     	break不能直接用于if,除非if属于循环内部的一个字句
    
    举例:
    for(i=1;i<3;++i)
    {
    	if(3>2)
    	 break;		终止for循环,一次也不输出哈哈
    	printf("哈哈\n");
    }
    
    注:在多层循环中break只能终止距离它最近的循环
    
  2. continue语句的作用

    用于跳过本次循环余下的语句,转去判断是否需要执行下次循环

    例:
    for(1;2;3)
    {
    	A;
    	B;
    	continue;		执行完本语句后会执行语句3,C,D会被跳过去
    	C;
    	D;
    }
    
    while(表达式)
    {
    	A;
    	B;
    	continue;		C,D会被跳过去,继续判断表达式是否成立
    	C;
    	D;
    }
    

3. 几种循环语句的比较

  1. for循环与while循环的相互比较
    for( ;条件; ) == while(条件)

    for(1;2;3)
    	A;
    
    等价于
    
    1while(2)
    {
    	A;
    	3;
    }
    

    例子:

    for(i=1;i<101;++i)
    {
    	sum=sum+i;
    }
    等价于
    i=1;
    while(i<101)
    {
    	sum=sum+i;
    	++i;
    	
    }
    
  2. for while do…while使用时刻
    如果有固定次数使用for
    如果必须执行一次用do…while
    其他情况用while

  3. while和do…while,为了使循环正常结束,应在循环体中包含使循环趋于结束的语句i++,i—

  4. while、do while、for都可以使用break和continue语句结束循环

如何看懂一个程序

分三步:

  1. 流程

     知道程序的流程是如何运行的
    
  2. 每个语句的功能

  3. 试数

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值