C语言学习——if 、 swich、 while和for的用法

C语言基础知识 专栏收录该内容
13 篇文章 1 订阅

C语言学习——if、swich、while和for的用法

顺序结构程序不能满足实际问题的要求。有时需要在满足某一条件的情况下才去执行一些语句,如果条件不满足的时候,程序会执行另一些语句;有时会在满足某一条件的情况下反复执行一些语句。C 语言提供了if~else 语句实现条件选择结构,switch~case 语句实现等值选择结构,while、do~while 和for语句实现重复执行循环体。

一、if语句

1、if~else 结构

语法:

在这里插入图片描述
if~else 结构的执行过程: 首先要对给定的条件表达式进行计算,如果计算结果是 1,则执行语句 1,语句 1 通常被称为 if分支(真分支) ;否则执行语句2,语句2 通常被称为 else 分支(假分支)。
其中,条件表达式既可以是逻辑表达式、关系表达式,也可以是任何合法的 C 语言表达式。

/* Description: 输入一个五位正整数, 要求顺序打印出各位数字。 */ 
#include <stdio.h> 
void main( void ) 
{ 
      int num;  
      int a, b, c, d, e; 
      printf("Input a integer number (10000-99999):"); 
      scanf("%d", &num); 
      if( num > 99999 || num < 10000 ) 
             printf("Error input!\n"); 
      else 
      { 
             e = num % 10;  num /= 10; 
             d = num % 10;  num /= 10; 
             c = num % 10;  num /= 10; 
             b = num % 10;  num /= 10; 
             a = num; 
             printf("Each digit is %2d%2d%2d%2d%2d\n",a, b, c, d, e); 
      } 
}
/* Description: 从键盘输入一个年份, 要求判断出它是否是平年 */ 
 
#include <stdio.h> 
 
void main( void ) 
{ 
      int year;  
 
      printf("请输入一个年份:"); 
      scanf("%d", &year ); 
 
      if( ( ( year % 100 != 0 ) && ( year % 4 != 0 ) ) || 
        ( ( year % 100 == 0 ) && ( year % 400 != 0 ) ) ) 
                 printf("%d 年是平年。\n", year ); 
      else 
                 printf("%d 年是闰年。\n", year ); 
 
} 

判断闰年:年份能被4整除但不能被100整除;或者能被400整除。
((year % 100 !=0) && (year%4 ==0)) || (year%400 ==0) 
或者:
((year % 100 !=0) && (!(year%4)) || (!(year%400))

判断平年:年份不能被4整除;或者能被100整除但不能被400整除。
(year%4 != 0 ) || (( year%100==0)&&( year%400!=0))
或者
(year%4) || !( year%100) && (year%400)

2、if嵌套

语法:

if(条件表达式1) 
    if(条件表达式2) 
         语句1; 
    else 
         语句2; 
else 
    if(条件表达式3) 
         语句3; 
    else 
         语句4; 

C 语言规定:else 总是与它前面最近的且无 else 配对的 if 配对。

在这里插入图片描述
例如:用 C 语言的选择结构实现符号函数 sign(x):从键盘输入一个浮点数 x,要求输出它的符号。 sign(x)是一个分段函数:

#include <stdio.h>  
void main( void ) 
{  
    double x; 
    short sign;  
    printf("Input x:"); 
    scanf("%lf", &x); 
    if( x>=0  ) 
         if( x>0  ) 
               sign =1; 
         else 
               sign =0; 
    else 
         sign =-1; 
    printf("sign(%lf)=%d\n", x, sign); 
} 

例如:用 else 分支嵌套 if-else 结构实现下述功能,从键盘输入一个一元二次方程ax2+bx+c=0的三个系数a、b、c,要求计算并打印出方程的实数根:

#include <stdio.h> 
#include <math.h>  //需要调用到sqrt( )函数
void main( void ) 
{ 
      double a, b, c, deta, deta2, root1, root2; 
      printf("请输入一元二次方程的三个系数a, b, c:"); 
      scanf("%lf,%lf,%lf", &a, &b, &c ); 
      deta = b*b-4*a*c; 
      if(deta<0) 
              printf("方程没有实数根。\n"); 
      else if(deta==0) 
              printf("方程有两个相等的根: %lf\n", -b/2/a ); 
      else 
      { 
              deta2 = sqrt( deta ); 
              root1 = ( - b + deta2 ) / 2 / a; 
              root2 = ( - b - deta2 ) / 2 / a; 
              printf("Root1= %lf Root2=%lf\n", root1, root2 ); 
      } 
} 

二、switch~case 结构

语法:

switch(整型表达式) 
{ 
     case 常量表达式 1: 
                 [语句组 1; 
                 [break;]] 
     case 常量表达式 2: 
                 [语句组 2; 
                 [break;]]case 常量表达式 n: 
                 [语句组 n; 
                 [break;]] 
     default: 
                 [语句组 n;] 
} 

switch~case 结构的执行过程:
计算整型数值表达式的值,并逐个与其后的各常量表达式的值进行比较,当表达式的值与某个常量表达式的值相等时,先执行其后的语句组,若该 case 分支最后有 break 语句,则中止 switch~case 结构,转到switch~case 结构后的程序顺序执行;

若该case 分支没有break语句,则继续执行下一个case 分支。若整型数值表达式的值与所有case 后的常量表达式的值均不相等,则执行default分支。

其中各常量表达式的值必须是整型,字符型或者枚举类型。

各语句组允许有多条语句,不需要加“{}” 。若语句组 i为空,该case 分支又没有break 语句,则直接执行下一个case 分支。

例如:用 switch~case 结构编写一个能进行四则运算的计算器程序:用户输入运算数和四则运算符,程序计算并输出结果:

#include <stdio.h>  
void main( void ) 
{ 
     float a, b;  char op; 
     printf("请输入一个四则运算表达式(eg:1.5/2.5):"); 
     scanf("%f%c%f", &a, &op, &b );  
    switch(op) 
    {
       case '+': 
                printf("%f + %f =%f\n", a, b, a + b); break; 
       case '-': 
                printf("%f - %f =%f\n", a, b, a - b); break; 
       case '*': 
                printf("%f * %f =%f\n", a, b, a * b); break; 
       case '/': 
                if(b)   //相当于if(b!=0) 
                      printf("%f / %f =%f\n", a, b, a / b); 
                else 
                      printf("除数不能为0\n"); break; 
       default: 
                 printf("错误的运算符!\n"); 
     } 
}

例如:用 switch~case 结构编程实现输入一个百分制成绩,将其转换成五级记分制成绩并输出结果。具体转换标准为:100~90 分→等级A,80~89 分→等级B,70~79 分→等级C,60~69 分→等级D,60 分以下→等级E。

#include <stdio.h> 
void main( void ) 
{ 
      int score; 
      printf("请输入一个百分制成绩:"); 
      scanf("%d", &score ); 

      switch(score / 10 ) 
      { 
              case 10: 
              case 9: 
                        printf("A\n"); 
                        break; 
              case 8: 
                        printf("B\n"); 
                        break; 
              case 7: 
                        printf("C\n"); 
                        break; 
                         case 6: 
                        printf("D\n"); 
                        break; 
              case 5: 
              case 4: 
	case 3: 
              case 2: 
              case 1: 
              case 0: 
                        printf("E\n"); 
                        break; 
              default: 
                        printf("输入的成绩错误!\n"); 
      } 
} 

三、while语句

while 语句先判断给定的条件是否成立,在条件成立的前提下重复执行循环体,所以被称为“当型”循环控制语句。
while 语句的一般形式为:

while( 条件表达式 ) 
    语句;  

其中被称为循环体的语句部分是一条语句。如果需要在循环体内执行多条
语句,可使用复合语句:

while( 条件表达式 ) 
{ 
    语句;} 

while 语句的执行过程: 先计算while 后面的条件表达式,如果其值为真,则执行一次循环体;再次计算 while 后面的条件表达式,如果其值仍然为真,则再执行一次循环体;如此反复,直到while 后面的条件表达式的值为假,结束while 语句,程序开始顺序执行循环结构后面的语句。

while 语句的特点是: 先判断,后执行,若一开始条件表达式就不成立,则循环体一次也不执行。

【例 】 用while 循环结构编程求 1+2+…+100 的和。

 #include <stdio.h> 
void main( void ) 
{ 
    int i, sum; 
    i=1, sum=0; 
while( i <= 100 ) 
     sum = sum+i, i++; 
    printf("1+2+…+100=%d\n", sum); 
} 

四、do~while 语句

do~while 语句也是 C 语言的 “当型” 循环控制结构, 不过它和 while 语句有所不同, do~while 语句先执行一次循环体,然后才判断给定的条件是否成立,在条件成立的前提下重复执行循环体。

do~while 语句的一般形式为:

do 
   语句; 
while( 条件表达式 ) 

循环体只能是一条语句。如果需要在循环体内执行多条语句,可使用复合语句:

do 
{ 
    语句; 
    …… 
} while( 条件表达式 ) 

执行过程: 先执行一次循环体,再计算 while后面的条件表达式,如果其值为真,则重复执行一次循环体;然后再次计算 while 后面的条件表达式,如此反复,直到条件表达式不再成立,结束 do~while 语句,程序开始顺序执行循环结构后面的语句。
do~while 语句的特点 是先执行,后判断,若一开始条件表达式就不成立,则循环体也要执行一次。

例如:用 do~while循环结构编程求 300 以内所有能被 9 整除的数。程序的输出格式如下:

 #include <stdio.h> 
void main( void ) 
{ 
     int i=1, j=0; 
     printf(" 300以内能被9整除的数有:\n"); 
     do 
     { 
          if( !(i%9) )   // 等价 if( i%9==0 ) 
          { 
                 printf("%5d,", i); 
                 j++; 
                 if( !(j%6) ) 
                        printf("\n"); 
          } 
     }while( ++i<300 ); 
     printf("\n"); 
} 

for 语句

for 语句是循环控制结构中使用最为灵活、最为广泛的一种循环控制语句。for 语句既适用于已知循环次数的情况,也可以用于只知循环结束条件不知道循环次数的情况。for语句可以完全取代前两种循环控制语句。

for语句的一般形式为:

for(初始化表达式1; 条件表达式2; 增量表达式3) 
       语句4; 

for语句其执行过程如下:
(1)首先计算初始化表达式1;
(2)然后计算条件表达式2,若条件表达式为真,则转到第3步执行;否则转到第5步执行;
(3)执行循环体3;
(4)计算增量表达式4,然后转到第2步,进行循环;
(5)退出循环,顺序执行 for循环后的下一条语句。

例题:for循环实现求 1+2+……+100的和!

#include <stdio.h> 
void main( void ) 
{ 
 int i, sum=0; 
 for(i=1;i<=100;i++) 
    sum=sum+i;

printf("%d\n", sum); 
} 


【例 】 用 for循环结构编程打印出所有的“水仙花数” 。

#include <stdio.h>  
void main( void ) 
{ 
    short a, b, c, i; 
    printf("水仙花数:"); 
    for(i=100; i<=999; i++) 
    { 
        a=i%10;       //个位 
        b=i%100/10;   //十位 
        c=i/100;       //百位 
        if(i==a*a*a+b*b*b+c*c*c) 
              printf("%5d,",i); 
    } 
   printf("\n"); 
} 

五、小结

C 语言中三种循环控制语句 while、do~while 和 for。三者基本上可以互相替代,但在实际应用中还是存在一些细微的差别。

(1)循环变量赋初值:使用 while、do~while 语句编程,必须保证在 while、do~while语句之前完成循环变量赋初值;for语句可以在初始化表达式中给循环变量赋初值。

(2)循环条件:while、do~while 语句均在 while 后面指定循环条件;for 语句在条件表达式中指定。

(3)循环体的执行:while 和 for语句都是先判断后执行,在条件不成立的情况下,循环体一次也不执行;do~while 语句是先执行后判断,循环体至少执行一次。

(4)循环变量递增:while、do~while 语句一般在循环体内增减循环变量,最终导致循环结束;for语句在增量表达式中改变循环变量的值。

(5)退出循环,顺序执行循环语句后的下一条语句。

在实际应用中,可根据具体情况选用不同的语句:

(1)如果是计数型循环或循环次数在执行循环之前就已确定,一般选用 for 语句;如果循环次数不确定,或是由循环体的执行情况方能确定的,一般选用 while 语句或者do~while语句,此时的循环条件表达式往往比较复杂,使用 for语句会导致程序晦涩难懂。

(2)当循环体至少要执行一次时,选用 do~while 语句;反之,如果循环体可能一次也不执行,选用 while 语句或者 for语句。

  • 3
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值