黑马程序员——C语言基础学习(二)---分支结构和循环结构

本文深入探讨Java编程中的分支结构(if语句、switch语句)与循环结构(while循环、do-while循环、for循环),详细解析各部分概念、使用方法及常见注意事项,并通过实例代码展示应用。

 


------  <a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a> 期待与您交流! -------



                      分支结构和循环结构



一.程序结构


    1.程序结构的概念

          要求程序设计者不能随心所欲地编写程序,而要按照一定 的结构形式来设计和编写程序.它的一个重要目的是使程序具有良好的结构,使程序易于设计,易于 理解,易于调试修改,以提高设计和维护程序工作的效率.


    2.程序结构的三种类型:

1)顺序结构


2)分支结构

      if    if-else   if-else-if    switch  


3)循环结构

       while   do-while    for 


二.分支结构 

    1.if语句 

      if语句实现分支控制

            一般形式:表示如果表达式为真,执行语句块1,否则不执行。

if(表达式)

{

语句块1

}后续语句;

例 if(a==5){ 

     

printf("恭喜你"); 

}

    2.if...else语句

       

             如果表达式为真,则执行语句块1,否则执行语句块2

if(表达式)

{

语句块1

}else{

语句块2


};


    3.if语句嵌套 

if(表达式1) 

{

......

if(表达式2){}else{

}

......}else {

    4.if...else if...else语句

           如果表达式1为真,则执行语句块1,否则判断表达式2,如果为真执行语句块2,否则再判断表达式3,如果真执行语句块3, 当表达式1、2、3都不满足,会执行最后一个else语句。

if(表达式1)

{

语句块1

}else if(表达式2){



语句块2

}else if(表达式3){



语句块3

}else{



语句块4

    5.if 语句使用注意点

1)if(条件) 可以直接写分号 “;” 表示什么也不干 “;” 空语句

2)if(条件) return 0; 程序不会往下执行了,直接退出

3)if(1)、if(-1) 表示永真 if(0) 表示为永假

4)if语句的作用域问题

5)if语句的作用域紊乱 

6)遇到省略大括号的if 


6.Switch分支语句 

     

      使用格式

switch(表达式){

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

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

...

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

default: 语句n+1;

}

注:其语义是:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。 


7.switch使用注意事项 

    case后面的大括号的问题 

1) 表达式的类型(case语句后的值)必须是整型或可以转变为整型的值 (byte、short、char和int类型)。

2) 功能代码部分可以写任意多句。

3) case语句可以有任意多句,可以不用加括号“{}”

4) break关键字的意思是中断,指结束switch语句,break语句为可选。


 

   case值的规定 

1)case的值1、值2...值n只能为常数或常量,不能为变量

2)case的值必须是整数,不能为浮点数

3)case后面不可以直接定义变量

4)如果在case后面定义的变量必须加上大括号

5)default语句可以写在switch语句中的任意位置,功能类似于if语句中的else(就算是写在最前面,也会最后判断) 



8.分支结构的应用举例

 例1

/*题目6.输入一个整数score代表分数,根据分数输出等级A-E(C语言编程题)
 
 A:90~100
 B:80~89
 C:70~79
 D:60~69
 E:0~60
 */

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    //输入一个整数score的分数
    int score;
    printf("请输入一个分数:");
    scanf("%d",&score);
    while (getchar() != '\n');
    
    //判断
    if(score >= 0 && score <= 100){
        if (score >= 90) {
            
            printf("A\n");
            
        }else if (score >= 80){
            
            printf("B\n");
            
        }else if (score >= 70){
            
            printf("C\n");
            
        }else if (score >= 60){
            
            printf("D\n");
        }else{
            
            printf("E\n");
        }
    }else{
        
        printf("输入的分数范围不正确!\n");
    }
    
    return 0;
}

  例2

// 题目:使用switch-case编写石头剪刀布的输入


#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
    // 将布用   0  来表示
    // 将剪刀用 1  来表示
    // 将石头用 2  来表示
    
    // 电脑输入
    int computer = arc4random_uniform(3); // 0 1 2
    printf("计算机出的是");
    switch (computer) {
        case 0: printf("布\n"); break;
        case 1: printf("剪刀\n"); break;
        default: printf("石头\n"); break;
    }
    
    // 玩家输入
    printf("请玩家出拳: 0布, 1剪刀, 2石头\n");
    int player;
    scanf("%d", &player);
    printf("玩家出的是");
    switch (player) {
        case 0: printf("布\n"); break;
        case 1: printf("剪刀\n"); break;
        default: printf("石头\n"); break;
    }
    
 
    
    switch((player - computer + 3) % 3) {
        case 0: printf("平局"); break;
        case 1:printf("玩家赢"); break;
        default: printf("计算机赢"); break;
    }
    
    
    printf("\n");
    
    
    return 0;
}


三.循环结构

    1、循环结构概述

              循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。

给定的条件称为循环条件,反复执行的程序段称为循环体。


    2、构成循环结构的几个条件:

一般来说一个循环需要以下几部分构成:

1)循环控制条件

循环退出的主要依据,来控制循环到底什么时候退出

2)循环体循环的过程中重复执行的代码段

3)能够让循环结束的语句(递增、递减、真、假等)能够让循环条件为假的依据,否则退出循环 


   3.while循环 

        1)while循环的格式:

while ( 条件表达式 ){

语句1;

语句2; ....}

        2)while循环使用方法:

1)while循环的特点:如果while中的条件一开始就不成立,那么循环体中的语句永远不会被执行

2)while语句的语义是:如果条件成立,就会执行循环体中的语句(“循环体”就是while后面大括号{}中的内

容)。然后再次判断条件,重复上述过程,直到条件不成立就结束while循环 


      3).while循环使用注意

  1、死循环:任何数值都真假性

while (-1) {


printf("死循环\n");


}

  2、当一个变量与一个常量进行== 或 != 的时候,通常把常量写在前面

int num = 3;

while (3 == num) {


printf("num = %d\n",num);num++;


}

 3、while 后如果只有一条语句它可以省略大括号

1)空语句它也是一条语句 

2)while小阔号后面不可以直接写分号

int num = 0;while (num < 3); {


printf("num = %d\n",num);

num++;


}

4、作用域:内部代码块中定义的变量不可以在外边代码块中访问

while (1 < 3)

{

int a = 0;

}

printf("a = %d\n",a);

5、作用域紊乱while (1 < 3)

int num = 5;

6、最简单死循环

while (1); 


  

  4.do...while循环

     1)do ... while循环的基本格式

do {

语句1;

语句2; 

....

} while ( 条件 );

             直到型循环:先执行循环体,然后判断条件,直到条件为假就结束

     2)do...while语句用法

(1)do...while语句的语义是:

    当执行到do-while循环时,首先会执行一遍循环体中的语句.接着判断while中的条件,如果条件成立,就执行循环体中的语句。 如此循环

(2)do-while循环的特点:

         

         不管while中的条件是否成立,循环体中的语句至少会被执行一遍 

    

    3)do...while和while的对比

while 是先判断再执行

do-while 是先执行再判断 


  5.for循环

    1)for循环的语法格式一般形式:

for(表达式1;表达式2;表达式3) {


     语句;

}

    2)for循环执行过程:

表达式1 ---> 表达式2 ---> 语句 ---> 表达式3 ---> 

表达式2 ----> 语句 ---> 表达式3 --->表达式2........ 

3)for循环使用


       for语句常见的形式:

 for(循环变量赋初值;循环条件;循环变量增值


4)for循环的其他形式


      1)表达式省略(三个表达式都可以省略)for(; ;) 死循环

2)循环控制无关的任意表达式
表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。
for(sum=0,i=1;i<=100;i++)sum=sum+i;或 for(i=0,j=100;i<=j;i++,j--)k=i+j; 


5)for循环的嵌套


    (num1>num2?num1:num2)>num3?(num1>num2?num1:num2):num3

      if(表达式1){

      if(表达式2){

      if...

          }

      } 


   6.break语句 

         

break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳

出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。


 7.continue语句

continue语句的作用是跳过循环体中剩余的语句而继续下一次。continue语句只

用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。 


 8.循环结构应用举例

  例1

//  题目:输入5个数,统计数据(求最大值,最小值,平均值,和)
//


#include <stdio.h>

int main1(int argc, const char * argv[]) {
    
    // 求和
    int i = 0, input, sum = 0;
    while (i < 5) {
        printf("请输入第 %d 个数字\n", i + 1);
        scanf("%d", &input);
        sum += input;
        i++;
    }
    printf("这五个数字的和为 %d\n", sum);
    
    
    return 0;
}


int main(int argc, const char * argv[]) {
    // 让用户输入 5 个数字, 然后统计数字的最大数, 最小数, 和与平均值
    int i = 0, min = 0, max = 0, sum = 0;
    double avg = 0;
    int input;
    while (i < 5) {
        // 提示输入
        printf("请输入第 %d 个数字\n", i+1);
        scanf("%d", &input);
        
        
        // 求和
        sum += input;
        
        
        // 求最大小
        if( i == 0 ) {
            min = max = input;
        } else {
            // 判断后面的几次大小
            if( input < min ) {
                min = input;
            }
            
            if( input > max ) {
                max = input;
            }
        }
        
        i++;
    }
    
    
    // 计算平均数
    avg = sum * 1.0 / 5;
    
    printf("5 个数字求和为: %d\n", sum);
    printf("5 个数字求平均为: %lf\n", avg);
    printf("5 个数字中最大的为: %d\n", max);
    printf("5 个数字中最小的为: %d\n", min);
    
    return 0;
}

 例2

//  题目:求100-1000内的水仙花数
//


#include <stdio.h>
#include <math.h>

int main(int argc, const char * argv[]) {
    
    
    for(int i = 100; i < 1000; i++) {
        // 判断 i 是不是水仙花数
        int gewei = i % 10;
        int shiwei = i / 10 % 10;
        int baiwei = i / 100;
        
        
        
        if(pow(gewei, 3) + pow(shiwei, 3) + pow(baiwei, 3) == i) {
            
            printf("%d\n", i);
        }
        
    }
    
    
    return 0;
}


 例3


//  题目:利用for循环打印等腰三角形
//


#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    int rows = 10;
    
    
    for (int i = 0; i < rows; i++) {
        // 加空格
        for (int j = 0; j < rows - 1 - i; j++) {
            printf(" ");
        }
        
        
        for (int j = 0; j < 2 * i + 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    
    for (int i = rows - 1 - 1 ; i >= 0; i--) {
        // 加空格
        for (int j = 0; j < rows - 1 - i; j++) {
            printf(" ");
        }
        
        
        for (int j = 0; j < 2 * i + 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    
    return 0;
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值