C语言 | chap4 流程控制语句

C语言中的流程控制语句

  • C语言中常见语句:表达式语句、复合语句、条件语句、开关语句、循环语句、break语句、continue语句、goto语句、空语句。

一、顺序结构

1.1表达式语句

  • 表达式后面加上分号;,就构成了表达式语句
  • a = b + c ; (赋值表达式后面加上分号,构成赋值语句)
  • ++ I ;(自增语句)

1.2复合语句

  • 复合语句就是由一对大括号的0~N条语句组成语句。

  • 复合语句可以将多条语句复合成为一条语句。

  • eg:

    {
    	int num = 10 ;
    	num = num / 2;
    	printf("%d\n" , num );
    }
    

1.3return语句

  • return语句表示结束当前函数的执行,并返回结果。
  • main ()中return语句代表程序执行结束

二、分支语句

2.1 if…else语句(分支语句)

  • 一般形式:

    if (条件表达式)
    {
    	分支代码语句;
    }
    else
    {
    	else的分支代码语句;
    }
    
  • 一个if语句中,if分支只允许存在一个,else…if分支允许存在0~N个,else分支允许存在0个或1个。

    • 代码
      if (条件1)
      {
      	分支1}
      else if (条件2)
      {
      	分支2}
      else if (条件2)
      {
      	分支2}
      .
      .
      .
      else
      {
      	else分支;  
      }
      
  • C语言中if语句的每一个分支只允许

  • 练习1:

    // 输入一个整数,判断其是 
    
    // 正偶数、正奇数、负偶数、负奇数 
    
    // 中的哪一种
    #include <stdio.h>
    int main (void)
    {
      int a;
      printf("输入一个整数:");
      scanf("%d",&a);
      if(a > 0 && a % 2 == 0)
      {
        printf("该数为正偶数\n");
      }
      else if (a > 0 && a % 2 != 0)
      {
        printf("该数为正奇数\n");
      }
      else if (a < 0 && a % 2 == 0)
      {
        printf("该数为负偶数\n");
      }
      else if (a < 0 && a % 2 != 0)
      {
        printf("该数为负奇数\n");
      }
      return 0;
    }
    
  • 注意

    • if 和 else 如果不加上大括号,只会认为第一条语句是从属于它

      • 例子1:注意
        int num; 
        scanf("%d", &num); 
        if (num > 0) 
           if (num % 2 == 0) 
           	printf("正偶数\n"); 
        else 
           if (num % 2 == 0) 
           	printf("负偶数\n"); 
        else 
           printf("负奇数\n"); 
           
           
           // -10 无输出 
           // -11 无输出 
           // 10 正偶数 
           // 11 负奇数
        
    • 尽量在每一个分支后面使用符合语句

      • 尽量在每一个分支后面使用复合语句
  • 练习2:

    • 代码:

      // 输入一个0~100之间的整数表示成绩
      // 输出对应评级,成绩一定合法
      // [90, 100] 优
      // [80, 90) 良
      // [60, 80) 中
      // [0, 60) 差
      int num;
      scanf("%d", &num);
      if (num >= 90 && num <= 100)
      printf("优\n");
      else if (num >= 80 && num < 90)
      printf("良\n");
      else if (num >= 60 && num < 80)
      printf("中\n");
      else
      printf("差\n");
      -------------------------------
      int num;
      scanf("%d", &num);
      if (num >= 90)
      printf("优\n");
      else if (num >= 80)
      printf("良\n");
      else if (num >= 60)
      printf("中\n");
      else
      printf("差\n");
       
      

2.2switch 语句(开关语句、多路分支语句)

  • 一般形式
    代码:

    switch (表达式)
    {
    case 整型字面值1:语句1(语句集合);break;
    case 整型字面值2:语句2(语句集合);break;
    ...
    case 整型字面值n:语句n(语句集合);break;
    default:语句n+1(语句集合);break;
    }
     
    
  • 获取switch中表达式的值,然后根据表达式的值匹配switch中case分支,如果匹配到了则跳转到相应case位置进行执行(从case位置开始逐行往下依次执行每一条可执行语句,如果遇到break则跳出switch语句如果没有遇到break,一直往下执行,直到执行完switch中所有语句), 如果没有匹配到则跳转到default 位置执行,如果没有default,则跳出switch语句。

  • break在switch语句中起到隔断不同case分支语句的作用

  • switch****语句判断的是表达式的值,if语句判断的是表达式的真假

  • default****不是必须的,可以根据情况进行省略不写

  • 练习:

    • 代码:

      int num;
      scanf("%d", &num);
      num /= 10;
      switch(num)
      {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5: printf("差\n"); break;
      case 6:
      case 7: printf("中\n"); break;
      case 8: printf("良\n"); break;
      case 9:
      case 10: printf("优\n"); break;
      }
       
      

三、循环语句

3.1for循环

  • 一般形式

    for (初始表达式;条件表达式;循环表达式)
    {
    	循环体语句;
    }
    
  • 执行过程:
    1. 执行初始表达式
    2. 判断条件表达式的结果是否为真,若结果为真,执行循环体语句,若结果为假,跳出循环(循环结束);
    3. 循环体语句执行完成之后,执行循环表达式,然后跳转到步骤****b

  • 练习1:打印0~99的数

    int i;
    for (i=0; i<100; i++)
    {
    if (i % 2 == 0)
    printf("%d\n", i);
    }
    for (i=0; i<100; i++)
    {
    if (i % 2 != 0)
    continue;
    printf("%d\n", i);
    }
    for (i=0; i<100; i+=2)
    {
    printf("%d\n", i);
    }
    for (i=0; i<50; i++)
    {
    printf("%d\n", i*2);
    }
    
  • 练习2:水仙花数

    // 打印所有的水仙花数
    int i;
    for (i=100; i<1000; ++i)
    {
    int a = i%10;
    int b = i / 10 % 10;
    int c = i / 100;
    if (a*a*a+b*b*b+c*c*c==i)
    printf("%d\n", i);
    }
    
  • 练习3:打印32位二进制数(打印内存二进制数)

    // 输入一个int范围内的整数,
    // 输出其内存二进制。
    // 例如:输入 1
    // 输出 0000 0000 0000 .... 0001
    int n, i;
    scanf("%d", &n);
    for (i=0; i<32; ++i)
    {
    printf("%d", (n>>(31-i))&1);
    if (i%4==3)
    printf(" ");
    }
    
  • 练习4:统计二进制中由多少个1

    // 输入一个unsigned int范围内的正整数,
    // 输出其内存二进制中有多少位是1。
    // 例如:输入 10 输出 2
    // unsigned int n, i, ans = 0;
    // scanf("%u", &n);
    // for (i=0; i<32; ++i)
    // {
    // int b = (n>>(31-i))&1;
    // if (b==1)
    // ans++;
    // }
    // printf("%d\n", ans);
    unsigned int n, ans;
    scanf("%u", &n);
    for (ans=0; n!=0; ans++)
    {
    n &= n-1;
    }
    printf("%u\n", ans);
    
  • 练习5:求质因子

    // 输入一个正整数,输出其质因子
    // 90 : 2 3 3 5
    int n, i;
    scanf("%d", &n);
    for (i=2; n!=1; i++)
    {
    if (n % i == 0) {
    printf("%d ", i);
    n /= i;
    i = 1;
    }
    }
    

3.2while循环

  • 一般形式:

    while (条件)
    {
    	循环体语句;
    }
    
  • 执行过程:判断条件是否成立,条件成立则执行循环,条件不成立则跳出循环。

  • 确定循环次数的情况下建议使用for循环,不确定循环次数的情况下使用while循环

  • while(1):条件恒定成立,死循环,跳出方法只能使用break

  • for(;;):for条件为空代表条件恒定成立。死循环,跳出循环只能使用break

  • 例子:

    //用户输入大于1个正整数,求用户输入所有数的和,输入0表示输入结束。
    int n,sum = 0;
    scanf("%d",&n);
    while(n != 0)
    {
    sum += n;
    scanf("%d",&n);
    }
    printf("%d",sum);
    

3.3 do…while循环(直到型循环)

  • 一般形式

    do
    {
    	循环体语句;
     
    } while(条件);
    
  • 执行过程:先执行循环体,再判断条件,条件为真继续执行循环,条件为假跳出循环

  • do…while循环循环体至少执行1次,for,while循环循环体最少执行0次。

  • do…while循环末尾一定要加上分号;

  • 代码:

    	//用户输入大于1个正整数,求用户输入所有数的和,输入0表示输入结束。
    	
    	int n,sum = 0;
    	scanf("%d",&n);
    	do
    	{
    	 
    	scanf("%d",&n);
    	sum += n;
    	} while(n!=0);
    	printf("%d",sum);
    	 
    
    	//用户输入大于1个正整数,求用户输入所有数的和,输入-1表示输入结束。
    	//成立:代码与输入0停止有差别是因为+0与+(-1)有区别
    	int n,sum = 0;
    	scanf("%d",&n);
    	do
    	{
    	scanf("%d",&n);
    	if(n != -1)
    	sum += n;
    	} while(n!=-1);
    	printf("%d",sum);
    

提示

  • #include <stdlib.h> //C语言标准库
  • include<time.h> //C语言时间库
  • 旧版本的c语言标准要求所有变量定义语句放在执行语句之前。所以在使用rand()方法时,要放在定义变量语句后面

综合练习

  • 综合练习准备:随机数的使用

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    int main(void)
    {
    	int num;
    	//设置随机数种子,保证每次运行随机数不同
    	srand(time(0));
    	//rand()方法生成随机数
    	num = rand()%102;
    	printf(“2021012%d\n”,570 + num);
    
    }
    
  • 练习2:打印n以内的质数

    // 输入一个正整数n(n>2)
    // 输出n以内所有的质数
    // 质数是指在大于1的自然数中,
    // 除了1和它本身以外不再有其他
    // 因数的自然数。
    int n, i, j, flag;
    scanf("%d", &n);
    for (i=2; i<=n; ++i) 
    {
    	flag = 1;
    	// flag = 1 是质数 flag = 0 不是质数
    	for (j=2; j<i; ++j)
    	{
    		if (i % j == 0) 
    		{
    			flag = 0;
    			break;
    		}
    	}
    	if (flag == 1)
    	printf("%d ", i);
    }
    
  • 综合练习:猜数字

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    
    int main(void)
    {
    	int cmp,usr,I;
    	srand(time(0));
    	cmp = rand % 101;
    	for (I = 0; i<10;++i)
    	{
    		printf("请输入:");
    		scanf("%d",&usr);
    		if(usr == cmp)
    			break;
    		else if (usr> cmp)
    		printf("你猜大了!\n");
    		else
    		printf("你猜小了!\n")}
    	if (i<6)
    	printf("猜对了,你真聪明!\n");
    	else
    	printf("没机会了,你真2!\n");
    	return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

黑眼圈子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值