C流程控制语句

流程控制语句

1.介绍

  • 在程序中,程序运行的流程控制决定程序是如何执行的,是必须掌握的,主要有三大流程控制语句
    • 顺序控制
    • 分支控制
    • 循环控制

2.顺序控制

1)介绍

  • 程序从上到下逐行的执行,中间没有任何判断和跳转
  • 执行语句1--执行语句2--。。。。。--执行语句n

2)顺序控制举例和注意事项

  • Java C中定义变量时采用合法的向前引用的原则;如
void main(){
    int num1 = 12;
    int num2 = num1 +2;
}

3.分支控制if--else

1 .介绍

  • 让程序有选择的执行,分支控制有三种
    • 单分支
    • 双分支
    • 多分支

2.单分支

  • 基本语法

if(条件表达式){

​ 执行代码块

}

  • 说明:当条件表达式为真(非零)时,就会执行{}的代码,返回假(0)时,不会执行{}的代码

  • 案例说明

//编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出“你的年龄大于18,要对自己的行为负责”

#include <stdio.h>

void main(){
    
    /*分析
        1.int age 接收输入的年龄
        2.使用if单分支来判断,进行相应的处理
        */
    int age = 0;
    printf("请输入年龄:");
    scanf("%d",&age);
    
    if(age>18){
        printf("你的年龄大于18,要对自己的行为负责");
    }
    printf("OK~~~");
    getchar();//接收回车
    getchar();//暂停控制台
}

3.双分支

  • 基本语法

if(条件表达式){

​ 执行代码块1;

}else{

​ 执行代码块2;

}

  • 说明:当条件表达式成立(为真),执行代码块1,否则执行代码块2
  • 案例演示
#include <stdio.h>
void main(){
    int age = 0;
    printf("请输入年龄:");
    scanf("%d",&age);
    
    if(age>18){
        printf("你的年龄大于18,要对自己的行为负责");
    }else{
        printf("你的年龄不大这次就放过你了");
    }
    printf("OK~~~");
    getchar();
    getchar();
}
  • 练习
//对下面代码,若有输出,指出输出结果
int x = 4;
int y = 1;
if(x>2){
    if(y>2){
        printf("x+y=%d",x+y);
    }
    printf("atguigu");
}else{
    //如果if -- else 中的代码块,只有一条语句,则可以省略{}
    printf("x is = %d",x);
}
void main(){
    //编写程序,声明2个double类型变量并赋值,判断第一个数大于10.0,且第二个数小于20.0,打印两数之和
    //分析
    //1.定义2个double d1  d2
    //2.使用逻辑与
    //3.使用if
    double d1 = 146.7;
    double d2 = 23.3;
    
    if(d1>10.0&&d2<20.0){
        printf("d1+d2=%.2f",(d1+d2));
    }
}
//判断一个年份是否为闰年 ,闰年的条件时符合下面二者之一
//1.年份能被4整除,但不能被100整除 2.能被400整除
//分析
//1.定义变量year
//2.有逻辑与和逻辑或的综合使用
//3.if--else
void main(){
    int year = 2020;
    if( (year%4==0&&year%100!=0) || year%400 ==0){
        printf("%d年是闰年",year);//闰年366天 平年 365
    }else{
        printf("%d不是闰年",year);
    }
    
    getchar();
}

4.多分支

  • 基本语法

if(条件表达式1){

​ 执行代码块1;

}else if(条件表达式2){

​ 执行代码块2;

}

........

else{

​ 执行代码块n;

}

  • 多分支流程图

    • 当条件表达式1成立时,即立即执行代码块1

    • 如果表达式不成立,采取判断表达式2是否成立

    • 如果表达式2成立,就执行代码块2

    • 以此类推如果所有的表达式都不成立,则执行else的代码块

    • 注意:只有有一个执行入口

#include<stdio.h>

void main(){
    double score = 0.0;
    printf("请输入成绩:");
    scanf("%lf",&score);
    
    if(score==100){
        printf("奖励一辆BMW");
    }else if(score>80&&score<=99){
        printf("奖励一台iphone 7plus");
    }else if(score >=60&score<=80){
        printf("奖励一台ipad");
    }else{
        printf("没有奖励");
    }
    
    getchar();
    getchar();
}
int b = 1;
if(b=0){
    printf("a");
}else if(b){
    printf("b");
}else if(!b){
    printf("c");
}else{
    printf("d");
}
#include <stdio.h>
#include <math.h>

void main(){
    /*
    求ax^2+bx+c=0方程的根,a,b,c分别为函数的参数,如果:b^2-4ac>0,则有两个解
    b^2-4ac=0,则有一个解,b^2-4ac<0,则无解
    提示:1. x1=(-b+sqrt(b^2-4ac))/2a
    	2.x2=(-b-sqrt(b^2-4ac))/2a
    	3.sqrt(num),需要#include<math.h>
    	分析:
    	1.定义三个doble a,b,c,x1,x2
    	2.b^2-4ac的值在程序中使用很多次(>=3),因此我们可以使用一个变量来保存,从而避免重复计算
    	3.sqrt(num)
    	4.使用多分支
    	*/
    double a = 3,b=2,c=6,x1=0,x2=0;
    double t = b*b - 4*a*c;
    if(t>0){
        x1=(-b+sqrt(t))/(2*a);
        x2=(-b-sqrt(t))/(2*a)
            printf("x1=%.2f",x1);
        	printf("x2=%.2f",x2);
    }else if(t==0){
        x1=(-b+sqrt(t))/(2*a);
        printf("x1=%.2f",x1);
    }else{
        printf("无解");
    }
    getchar();
}

5.嵌套分支

5.1 基本介绍

  • 在一个分支结构中又完整的嵌套了另一个分支结构,里面的分支的结构称为内层分支,外面的分支结构称为外层分支,嵌套分支不适合过多,最多不要超过3层

5.2 基本语法

if(){

​ if(){

//被包含的可以是单分支,双分支,多分支

}else{

}

}

5.3 应用案例

#include <stdio.h>
void main(){
    /*
    参加百米运动会,如果用时8秒以内进入决赛,否则提前淘汰。并且根据性别提示进入男子组或女子组,输入成绩和性别,进行判断
    分析
    1.变量double time 保存时间
    2.变量char gender 保存性别
    3.使用嵌套分支
    */
    
    double time = 0.0;
    char gender ='';
    printf("请输入跑步成绩(s):");
    scanf("%lf",&time);
    
    if(time<=8){
        printf("请输入性别:");
        scanf("%c",&gender);//接收到上次回车
        scanf("%c",&gender);//接收性别
        if(gender=='m'){
            printf("请进入男子组");
        }else{
            printf("请进入女子组");
        }
        
    }else{
        printf("你被淘汰");
    }
    getchar();//回车
    getchar();//暂停
   
}

5.4 应用案例2

//出票系统:根据旺季的月份和年龄,打印票价

4 . switch分支结构

4.1 基本语法和流程图

switch(表达式){

​ case 常量1://当表达式值等于常量1

​ 语句块1;

​ break;//退出switch

​ case 常量2://当表达式值等于常量1

​ 语句块2;

​ break;//退出switch

​ case 常量n://当表达式值等于常量1

​ 语句块n;

​ break;//退出switch

​ default:

​ default语句块;

​ break;

}

4.2 快速入门

#include <stdio.h>

void main(){
    
    char c1 = '';
    char c2 = '';
    printf("请输入一个字符:");
    scanf("%c",&c1);
    //表达式:任何值都可以看成是一个表达式
    switch(c1){
        case 'a':
            printf("今天星期一,猴子穿新衣");
            break;
        case 'b':
            printf("今天星期二,猴子当小二");
            break;  
        case 'c':
            printf("今天星期三,猴子爬雪山");
            break; 
        case 'd':
            printf("今天星期四,猴子有急事");
            break;
        default://default是可选择,不是必须的
            printf("没有匹配到任何值");
    }
    printf("switch结束");
    getchar();
    getchar();
}

4.3 switch细节讨论

  • switch 语句中的expression 是一个常量表达式,必须是一个整型(char short int long )或枚举类型
  • case语句中的值必须是常量,而不能是变量
  • default子句是可选的,当没有匹配到case时,执行default
  • break语句用在执行完一个case分支后程序跳出switch语句块
  • 如果没有写break,会执行下一个case语句块,知道遇到break或者执行到switch结尾,这个现象称为穿透

4.4 练习

#include <stdio.h>
void main(){
    //使用switch把小写的char型转为大写,只转换a , b , c , d , e 其他的输出 other
    
    char c1 = 'u';
    switch(c1){
        case 'a':
            printf("A");
            break;
        case 'b':
            printf("B");
            break; 
        case 'c':
            printf("C");
            break;
        case 'd':
            printf("D");
            break;  
        case 'e':
            printf("E");
            break;
        default:
            printf("other");
    }
    getchar();
}
//对学生成绩大于60分的,输出合格,低于60分的,输出不合格

void main(){
    
    double d1 = 0.0;
    printf("请输入成绩");
    scanf("%lf",&d1);
    switch((int)(d1/60)){
            //switch括号中,可以是一个复杂表达式
        case 0:
            printf("不合格");
            break;
        case 1:
            printf("合格");
            break;
        default:
            printf("输入成绩有误");
    }
    getchar();
    getchar();
   
}

//根据指定的月份,打印该月份所属的季节。3 4 5 春季 6 7 8 夏季 9 10 11 秋季 12 1 2 冬季

void main(){
    int month = 0;
    printf("请输入月份:");
    scanf("%d",&month);
    switch(month){
        case 3:  //switch穿透
        case 4:
        case 5:
            printf("春季");
            break;
        case 6:  //switch穿透
        case 7:
        case 8:
            printf("夏季");
            break;   
        case 9:  //switch穿透
        case 10:
        case 11:
            printf("秋季");
            break; 
        case 12:  //switch穿透
        case 1:
        case 2:
            printf("冬季");
            break;    
    }
    getchar();
    getchar();
}

5 .switch 和if的比较

  • 如果判断的具体数值不多,而且符合整型,枚举类型,虽然两个语句都可以使用,建议使用switch语句
  • 其他情况:对区间判断,对结果为真假的判断,使用if,if的使用范围更广

6. for循环控制

6.1 基本介绍

  • 听其名而知其意,就是让代码可以循环的执行

6.2 需求

编写一个程序,打印五句“你好,尚硅谷”

  • 传统解决方案
void main(){
    printf("你好,尚硅谷");
    printf("你好,尚硅谷");
    printf("你好,尚硅谷");
    printf("你好,尚硅谷");
    printf("你好,尚硅谷");
}

//如果不使用循环控制,代码的维护性很差 

6.3 基本语法

循环变量定义

for(循环变量初始化;循环条件;循环变量迭代){

​ 循环操作(多条语句)

}

6.4 循环执行流程分析

void main(){
    int i;
    for(i=1;i<=5;i++){
        printf("你好,尚硅谷 i=%d");
    }
}

6.5 注意事项和细节说明

  • 循环条件是返回一个表示真(非0)假(0)的表达式

  • for(;循环判断条件;)中的初始化和变量迭代可以不写(写道其他地方),但两边的分号不能省略

  • 循环初始值可以有多条初始化语句,但要求类型一样,并且用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开

    • for(i=0,j=0;j<count;i++,j+=2)
  • 代码演示

void main(){
    //可以将变量的迭代和初始化放在其他地方
    int i = 1;
    for(;i<=5;){
        printf("你好 尚硅谷");
        i++;
    }
    //循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开
    //循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
    int i;
    int j;
    for(i=0,j=0;i<=3;i++,j+=2){
        printf("i=%d j=%d",i,j);
    }
    printf("最后 i=%d j=%d",i,j);
    
    getchar();
}

6.6 练习

void main(){
    //打印1-100之间所有是9倍数的整数的个数及总和
    
    int i = 0;
    int count = 0;
    int sum = 0;
    for(i=1;i<=100;i++){
        //判断i是不是9的倍数
        if(i%9==0){
            count++;
            sum+=i;
        }
    }
    printf("count=%d sum=%d",count,sum);
}
void main(){
    int num = 10;
    int i = 0;
    for(i=0;i<=num;i++){
        printf("%d + %d = %d",i,num-i,num);
    }
    getchar();
}

7.while循环控制

7.1 基本语法

循环变量初始化;

while(循环条件){

​ 循环体

​ 循环变量迭代

}

7.2 while循环执行流程分析

#include <stdio.h>

void main(){
    int i = 1;
    while(i<=5){
        printf("你好 尚硅谷 i=%d",i);
        i++;
    }
    getchar();
    
}

7.3注意事项和细节说明

  • 循环条件是返回一个表示真假的表达式
  • while循环是先判断再执行语句

7.4 练习

void main(){
    //打印1--100之间所有能被3整除的数
    int i = 1;
    int max = 100;
    while(i<=max){
        if(i%3==0){
            printf("i=%d能被3整除",1);
        }
        i++;
    }
    getchar();
}
void main(){
    //打印40--200之间所有的偶数
    int i = 40;
    int max =200;
    while(i<=max){
        if(i%2==0){
        printf("i=%d是偶数",i);
    }
    i++;
    }
    getchar();
}
void main(){
    //不断输入姓名,直到输入exit为止
    //分析
    //1.需要接收用户的输入,字符串[字符数组]
    //2.<string.h>有一个strcmp函数,判断两个字符串是否相同
    //int strcmp(const char*str1,const char*str2) 返回0表示相等,非0表示不相等
    
    char name[10]="";
    while(strcmp(name,"exit")!=0){
        printf("请输入名字");
        scanf("%s",name);//这里不需要加&name 因为数组的名称就是地址
        printf("你输入的名字是%s",name);
    }
    printf("退出while");
    getchar();//过滤回车
    getchar();//暂停控制台
}

8. do...while循环控制

8.1 基本语法

循环变量初始化

do{

​ 循环体(多条语句)

​ 循环变量迭代

}while(循环条件);

  • 注意:do --while后面有一个分号,不能省略
#include <stdio.h>
void main(){
    int i = 1;
    int max=5;
    do{
        printf("你好,尚硅谷 i=%d",i);
        i++;
    }while(i<=max);
    printf("i=%d",i);
    getchar();
}

8.2 注意事项和细节说明

  • 循环条件是返回一个表示真假的表达式
  • do...while循环是先执行,再判断
void main(){
    //统计1--200之间能被5整除但不能被3整除的个数
    int i = 1;
    int max = 200;
    int count = 0;
    do{
        if(i%5==0&&(i%3!=0)){
            count++;
        }
        i++;
    }while(i<=max);
    printf("1--100之间能被5整除但不能被3整除的个数count=%d",count);
    getchar();
}
void main(){
    
    char answer ='';
    do{
        printf("我可以继续购物吗");
        scanf("%c",&answer);
        getchar();//过滤回车
    }while(answer=='y');
    printf("退出购物");
    getchar();
}

9.多重循环控制

9.1 介绍

  • 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for,while do ... while 均可作为外层循环和内层循环,如果嵌套循环过多,会造成可读性降低
  • 实质上,嵌套循环就是把内层循环当成外层循环的循环体,当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当此循环,开始下一次的循环
  • 设外层循环次数为m次,内层为n次,则循环实质上需要执行m*n次
#include <stdio.h>
void main(){
    //统计三个班成绩情况,每个班有五名同学,求出各个班的平均分和所有班的平均分
    //分析
    //编程技巧:1.先死后活 2.先简单后复杂(分解) 3.根据需要增加或修改相应的大妈
    //1.各个班的平均分
    //2.所有班级的平均分,得到所有班级的总分allClassTotalScore
    //3.定义变量表示班级个数classNum,定义变量表示学生个数stuNum
    //4。定义变量classTotalScore每个班级总分
    //5.定义变量score,接收学生成绩
    //6.使用两层for循环
    
    int stuNum = 5;
    int classNUm = 3;
    double classTotalScore = 0.0;
    double score = 0.0;
    double allClassTotalScore = 0.0;
    int count = 0;
    int i,j;
    for(i=1;i<=classNum;i++){//控制班级循环次数
        //每次给一个班级输出成绩时,需要清零
        classTotalScore = 0.0;
        for(j=1;j<=stuNum;j++){
            //控制学生循环次数
            printf("请输入第%d个班级的第%d个学生的成绩",i,j);
            scanf("%lf",&score);
            if(score>=60){
                count++;
            }
            classTotalScore += score;
        }
        allClassTotalScore += classTotalScore;
        //当内层for循环结束后就得到了该班级的总成绩
        printf("第%d个班级得到平均分=%.2f",i,classTotalScore/stuNum);    
    }
    //输出所有班级的成绩
    printf("所有班级的平均分=%.2f",allClassTotalScore/(stuNum*classNum));
    printf("所有班级的及格人数=%d",count);
    getchar();
    getchar();
    
    
    
    
}
#include<stdio.h>
void main(){
    //打印九九乘法表
    //分析
    //1.先打印一列
    //2.再打印多列,注意分析
    //3.先死后活,功能逐步完成
    
    int i,j;
    for(i=1;i<=9;i++){
        //因为每一行都在增加算式,所以使用for循环控制
        for(j=1;j<=i;j++){
            printf("%d * %d = %d",j,i,i*j);
        }
        printf("\n");
    }
    getchar();
}

9.2 打印金字塔

  • 思路
    • 化繁为简,先死后活
    • 从矩形开始
#include<stdio.h>
void main(){
    //打印矩形
    //打印半个金字塔
    //打印整个金字塔
    int i,j,k,totalLeval=20;
    for(i=1;i<=totalLeval;i++){
        //输出空格,使用k控制空格的循环
        for(k=1;k<=totalLeval-i;k++){
            printf(" ");
        }
        for(j=1;j<=2*i-1;j++){
            if(j==1||j=2*i-1||i=totalLeval){
                printf("*");
            }else{
                printf(" ");
            }
        }
        printf("\n");
    }
    getchar();
}
posted @ 2021-01-24 22:36  mx_info  阅读(437)  评论(0)    收藏  举报