C语言学习 --- 流程控制语句

分类

  1. 顺序结构
  2. 选择结构
  3. 循环结构
  4. 跳转结构

顺序结构

程序从main函数第一句开始执行,执行到最后一句

等待上一句执行完成后才能执行下一句。

选择结构

根据不同的条件执行不同的代码块

if-else         switch-case

if-else结构

1、单个if

if(条件表达式)
{
    条件表达式为真的时候执行语句
}

2、if-else        二选一组合

if(条件表达式)
{
    条件表达式为真的时候执行语句
}
else
{
    条件表达式为假的时候执行语句
}

3、if -- else if -- ..... else 多选一

if(条件表达式1)
{
    条件表达式为真的时候执行语句
}
else if(条件表达式2)
{
    条件表达式1为假,条件表达式2为真的时候执行语句
}
else if(条件表达式3)
{
    条件表达式1、2为假,条件表达式3为真的时候执行语句
}
....
else
{
    上述条件表达式都为假,执行的语句
}

switch - case结构

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

    // ....
    
    default:
        语句块3;
        break;
}

执行流程:

        1、先计算条件表达式的结果

        2、拿结果和常量数据进行等值判断(==),如果不等继续拿下面的常量判断,如果相等执行case后面的语句,遇到break结束switch-case结构。

        

注意:     

        break结束匹配。

        switch-case结构中可以让多个case共用同一段代码

题目1:用switch-case结构输入年份和月份,输出这个月有多少天

#include<stdio.h>
 int main()
 {
	int year;
	int month;
	printf("请输入一个月份:");
	scanf("%d",&month); //先判断月份再判断年份,防止代码冗余 
	printf("请输入一个年份:"); 
	scanf("%d",&year);
	switch(month)
	{
	 case 1:
	 case 3:
	 case 5:
	 case 7:
	 case 8:
	 case 10:
	 case 12:
	 	printf("你输入的这个月有31天");
	 	break;
	 case 4:
	 case 6:
	 case 9:
	 case 11:
		 printf("你输入的这个月有30天");
		 break;
	case 2:
	if((year % 4 == 0 && year % 100 != 0) | (year % 400 == 0))
	{
	 	printf("你输入的2月在这一年有29天");
	}
	else
	{
	 	printf("你输入的2月在这一年有28天");
	}
		 break;
		 default:
	 	printf("没有这个月份");
	}
	 return 0;
 }

题目2:输入星期的整数,输出星期

#include <stdio.h>
int main(void)
{
    int a;
    printf("请输入一个星期数字:");
    scanf("%d",&a);

    switch(a)
    {
        case 1:  printf("星期一");  break;
        case 2:   printf("星期二");  break;
        case 3:   printf("星期三");  break;
        case 4:   printf("星期四");  break;
        case 5:   printf("星期五");  break;
        case 6:   printf("星期六");  break;
        case 7:   printf("星期日");  break;
        default:  printf("输入有误");  break;
    }

    printf("结束");
}

if-else和switch-case的区别

if-else 比较适合做范围区间

switch-case 等值判断,不适合大量范围的划分

循环结构

       循环:重复执行一段代码,一般有限次,程序执行的时候(记录循环的次数)。 

for循环

格式

         定义一个循环变量

循环条件表达式

        如果这个点表达式的结果为真,则执行循环体,如果为假,循环结束

执行步骤:

        1、循环变量赋初值

        2、计算循环条件表达式,如果假,结束循环

        如果为真,执行循环体,循环变量改变

for(循环变量赋初值;循环条件表达式;循环变量的改变)
{
    // 循环体
}

题目:求u8的二进制数中1的个数。

#define u8 unsigned char
int main()
{
    u8 a;
    printf("请输入一个十六进制的数据:");
    scanf("%x",&a);
    
    //  a & (1 << n)
    
    // 定义一个计数变量
    int count = 0;
    
    int n;
    for(n=0;n<=7;n++)
    {
        if((a & (1 << n)) != 0)
        {
            count++;
        }
    }
    
    printf("%d",count);
    
    return 0;
}

while循环

格式:循环变量初始化 --- 定义+赋值

while(循环条件表达式)
{
    // 循环体
    
    // 循环变量的改变
}

题目:求一个整数中出现2的次数

int a;
printf("请输入一个整数:");
scanf("%d",&a);
int count = 0;
while(a!=0)
{
    int res = a % 10;
    if(res == 2)
    {
        count++;
    }
    a = a / 10;
}
printf("%d",count);

for循环与while循环的区别

for循环:知道循环次数

while循环:知道结束条件

写while循环的时候 循环条件表达式要写成 结束条件的反面

do-while循环

do
{
    //循环体
}while(循环条件表达式);

执行流程:

先执行循环体,在判断循环条件表达式,如果为真继续,如果为假结束循环

while循环和do-while循环的区别:

while循环 先判断再决定是否执行循环体 执行次数>=0

do-while循环:先执行循环体再判断 执行次数>=1

题目:输出100 ~ 999内的每一个数

int i = 100;

do
{
    printf("%d ",i);
    i++;
}while(i <= 999);

if-goto

跳转的目的地设置一个标识符:格式 “标识符:”

满足条件需要 跳转语句: goto 标识符名;

注意: 标识符的定义位置和 goto 语句必须在同一个函数内部

题目:输出1 ~ 3

int i = 1;

A:
printf("%d ",i);
i++;

if(i <= 3)
{
    goto A;
}

printf("end");

//注意: 标识符的定义位置和 goto 语句必须在同一个函数内部。

跳转结构

break

跳出离它最近的一层循环

题目:输出1 ~ 10,如果数据能被3整除结束循环

int a;

for(a=1;a<=10;a++)
{
    if(a % 3 == 0)
    {
        break;
    }
    else
    {
        printf("%d ",i);
    }
}

continue

跳出本次循环,循环内部continue下面的语句不执行,循环还在继续。

题目:输出1 ~ 10,如果数据能被3整除跳过这个数据

int a;

for(a=1;a<=10;a++)
{
    if(a % 3 == 0)
    {
        continue;
    }
    else
    {
        printf("%d ",a);
    }
    
    printf("xxxxxx");
}

goto

跳出多层循环

#include<stdio.h>

int main(void)
{
    // int i;  1 ~ 9
    // int j;  1 ~ 9
    // 如果 i > j  终止所有循环
    
    int i,j;
    for(i=1;i<=9;i++)
    {
        printf("---start---%d---\n",i);
        
        for(j=1;j<=9;j++)
        {
            if(i > j)
            {
                // break;
                goto L;
                
                // return 0;
            }
            else
            {
                printf("%d ",j);
            }
            
        }	
        
        printf("---end---%d---\n",i);	
    } 
    
    
    L:
    printf("结束");
    
    // i=1;1<=9成立,执行循环体 
    //	    输出 start 
    //      j=1  1<=9
    //         printf 1    j++ j=2
    //           2<=9
    //         printf 2    j++ j=3
    // ........
    //           9<=9
    //         printf 9    j++ j=10
    //           10<=9 不成立  j循环结束 
    //      输出 end  ---------------------------i++  i=2
    //     2<=9成立,执行循环体 
    //	    输出 start 
    //      j=1  1<=9
    //         printf 1    j++ j=2
    //           2<=9
    //         printf 2    j++ j=3
    // ........
    //           9<=9
    //         printf 9    j++ j=10
    //           10<=9 不成立  j循环结束 
    //      输出 end  ---------------------------i++  i=2
    
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值