C语言之基本语句

5.1 C语言基本语句结构分类

C语言的结构分为:顺序结构,选择结构,循环结构,跳转结构。linux

C语言顺序结构就是让程序按照从头至尾的顺序依次执行每一条C语言代码,不重复执行任何代码,也不跳过任何代码。程序员

C语言选择结构也称分支结构,能够有选择性的执行代码;换句话说,能够跳过没用的代码,只执行有用的代码。算法

C语言循环结构就是让程序不断地重复执行同一段代码。编程

C语言跳转结构可让程序在一个函数范围内随意指定位置执行代码,在多层循环里用跳转结构跳出循环结构很是方便。app

5.2 C语言选择结构

选择语句是指编程语言中用来断定所给定的条件是否知足,根据断定的结果执行给出的操做之一。编程语言

if语句是C语言经常使用语句之一,if语句中的“表达式”能够是关系表达式、逻辑表达式,甚至是数值表达式。ide

其中最直观、最容易理解的是关系表达式,所谓关系表达式就是两个数值进行比较的式子。函数

C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false。oop

C 语言提供了如下类型的判断/选择类型的语句:测试

语句

描述

if 语句

一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。

if...else 语句

一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。

嵌套 if 语句

能够在一个 if 或 else if 语句内使用另外一个 if 或 else if 语句。

switch 语句

一个 switch 语句容许测试一个变量等于多个值时的状况。

嵌套 switch 语句

能够在一个 switch 语句内使用另外一个 switch 语句。

5.2.1 if语句

一个 if 语句由一个布尔表达式后跟一个或多个语句组成。

if语句的返回值为真或假。

C 语言中 if 语句的语法:

if(<断定条件>)

   {

      /* 若是断定条件为真将执行的语句 */

   }

 

若是判断条件为真,则 if 语句内的代码块将被执行。若是判断条件为假,则 else语句代码块被执行。

示例:

#include <stdio.h>

int main(int argc,char **argv)

{

   int a=300;

   int b=200;

   if(a>b)

   {

      printf("a>b\n");

   }

   return 0;

}

输出结果:

a>b

5.2.2 if...else 语句

一个if语句后可跟一个可选的 else 语句,else语句在布尔表达式为假时执行。

if 和 else 是两个新的关键字,if 意为“若是”,else 意为“不然”,根据判断结果执行不一样的语句。

总结起来,if else 的结构为:

if(判断条件)

{

    语句块1

}

else

{

    语句块2

}

意思是,若是判断条件成立,那么执行语句块1,不然执行语句块2 。

其执行过程可表示为下图:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。若是语句块中只有一个语句,也能够省略{ }。

因为if else 语句能够根据不一样的状况执行不一样的代码,因此也叫分支结构或选择结构,上面的代码中,就有两个分支。

示例代码:求两个数中的最大值

#include <stdio.h>

int main()

{

    int a, b, max;

    printf("输入两个整数:");

    scanf("%d %d", &a, &b);

    if(a>b) max=a;

    else max=b;

    printf("%d和%d的较大值是:%d\n", a, b, max);

return 0;

}

运行结果:

输入两个整数:34 28

34和28的最大值是:34

多个if else语句语法示例:

if else 语句也能够多个同时使用,构成多个分支,形式以下:

if(判断条件1)

{

    语句块1

} else  if(判断条件2){

    语句块2

}else  if(判断条件3){

    语句块3

}else  if(判断条件m){

    语句块m

}else{

     语句块n

}

意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,而后跳到整个 if else 语句以外继续执行其余代码。若是全部判断条件都不成立,则执行语句块n,而后继续执行后续代码。

也就是说,一旦遇到可以成立的判断条件,则再也不执行其余的语句块,因此最终只能有一个语句块被执行。

5.2.3 嵌套 if 语句

在C语言中, if-else 语句是支持嵌套的,这意味着能够在一个 if 或 else if 语句内使用另外一个 if 或 else if 语句。

C 语言中嵌套 if 语句的语法:

if(<表达式 1>)

{

   /* 当表达式 1 为真时执行 */

   if(表达式 2)

   {

      /* 当表达式 2 为真时执行 */

   }

}

也能够嵌套 else if...else,方式与嵌套 if 语句类似。

示例代码:

#include <stdio.h>

int main ()

{

   /* 局部变量定义 */

   int a = 100;

   int b = 200;

 

   /* 检查条件 */

   if( a == 100 )

   {

       /* 若是条件为真,则检查下面的条件 */

       if( b == 200 )

       {

          /* 若是条件为真,则输出下面的语句 */

          printf("a 的值是 100,且 b 的值是 200\n" );

       }

   }

   printf("a 的准确值是 %d\n", a );

   printf("b 的准确值是 %d\n", b );

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值是 100,且 b 的值是 200

a 的准确值是 100

b 的准确值是 200

5.2.4 switch 语句

一个 switch 语句容许测试一个变量等于多个值时的状况。每一个值称为一个 case,且被测试的变量会对每一个 switch case 进行检查。

C 语言中 switch 语句的语法:

switch(选择参数)

{

    case 选项1  :

       /*code block*/

       break; /* 可选的 */

    case 选项2  :

       /*code block*/

       break; /* 可选的 */

    default : /* 默认选项 可选的 */

       /*code block*/

}

switch语句必须遵循下面的规则:

(1) switch 语句中的 选择参数 必须是一个整型或枚举类型(常量)。

(2) 在一个switch中能够有任意数量的 case 语句块。

(3) 每一个case后跟一个要比较的值和一个冒号。

(4)  case 后面的 选项 必须与 switch ()括号中的变量具备相同的数据类型,且必须是一个常量。

(5) 被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。

(6) 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。

(7) 不是每个 case 都须要包含 break。若是 case 语句不包含 break,控制流将会继续后续的 case,直到遇到 break 为止。

(8) 一个 switch 语句能够有一个可选的 default,出如今 switch的结尾。default可用于在上面全部 case 都不为真时执行一个任务。default 中的break 语句不是必需的。

示例代码:

#include <stdio.h>

int main ()

{

   /* 局部变量定义 */

   char data = 'B';

   switch(data)

   {

   case 'A' :

      printf("很棒!\n" );

      break;

   case 'B' :

   case 'C' :

      printf("作得好\n" );

      break;

   case 'D' :

      printf(" 经过了\n" );

      break;

   case 'F' :

      printf("最好再试一下\n" );

      break;

   default :

      printf("无效的成绩\n" );

   }

   printf("你的成绩是 %c\n", data);

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

作得好

你的成绩是 B

 

5.2.5 嵌套 switch 语句

 能够把一个 switch 做为一个外部 switch 的语句序列的一部分,便可以在一个 switch 语句内使用另外一个 switch 语句。即便内部和外部switch的 case 常量包含共同的值,也没有矛盾。

C 语言中嵌套 switch 语句的语法:

switch(ch1)

{

   case 'A': 

      printf("这个 A 是外部 switch 的一部分" );

      switch(ch2)

      {

         case 'A':

            printf("这个 A 是内部 switch 的一部分" );

            break;

         case 'B': /* 内部 B case 代码 */

      }

      break;

   case 'B': /* 外部 B case 代码 */

}

示例代码:

#include <stdio.h>

int main()

{

   /* 局部变量定义 */

   int a = 100;

   int b = 200;

 

   switch(a)

   {

      case 100: 

         printf("这是外部switch的一部分\n");

         switch(b) 

         {

            case 200:

               printf("这是内部 switch 的一部分\n");

         }

   }

   printf("a 的准确值是 %d\n", a);

   printf("b 的准确值是 %d\n", b); 

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

这是外部 switch 的一部分

这是内部 switch 的一部分

a 的准确值是 100

b 的准确值是 200

5.2.6 ? : 三目运算符

咱们已经在前面的章节中讲解了条件运算符,本章节的 ? :能够用来替代 if...else 语句。

它的通常形式以下:

<判断条件> ? <条件为真> : <条件为假>;

其中,<判断条件>、<条件为真>和 <条件为假> 是表达式。请注意,冒号的使用和位置。

? 表达式的返回值是由 <判断条件>决定的。

若是 <判断条件> 为真,则返回<条件为真>的值。

若是 <判断条件> 为假,则返回<条件为假>的值。

使用条件表达式时,还应注意如下几点:

1) 条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。所以

max=(a>b) ? a : b;

能够去掉括号而写为:

max=a>b ? a : b;

2) 条件运算符?和:是一对运算符,不能分开单独使用。

3) 条件运算符的结合方向是自右至左。例如:

a>b ? a : c>d ? c : d;

应理解为:

a>b ? a : ( c>d ? c : d );

这也就是条件表达式嵌套的情形,即其中的表达式又是一个条件表达式。

用条件表达式从新编程,输出两个数中的最大值:

#include <stdio.h>

int main()

{

    int a, b;

    printf("请输入两个整数:");

    scanf("%d %d", &a, &b);

    printf("max=%d\n", a>b?a:b);

return 0;

}

输出结果:

PS D:\linux-share-dir\c_code> gcc .\app.c

PS D:\linux-share-dir\c_code> .\a.exe    

请输入两个整数:12 34

max=34

5.3 C语言循环结构

在C语言中,共有三大经常使用的程序结构:

顺序结构:代码从前日后按照顺序执行;

选择结构:也叫分支结构,重点要掌握 if else、switch 以及条件运算符;

循环结构:重复执行同一段代码。

所谓循环结构(Loop),就是重复地执行同一段代码,例如要计算 1+2+3+……+99+100 的值,就要重复进行99次加法运算。

C语言提供了如下几种循环类型。

循环类型

描述

while循环

当给定条件为真时,重复执行语句组。

for 循环

屡次执行一个语句序列,简化管理循环变量的代码。

do...while 循环

除了它是在循环主体结尾判断给定条件外,其余与 while 语句相似。

嵌套循环

能够在 while、for 或 do..while 循环内使用一个或多个循环。

5.3.1 while循环

while循环的通常形式为:

while(表达式)

{

语句块

}

先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,若是为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。

咱们一般将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。

示例代码:用 while 循环计算1加到100的值

int main()

{

    int i=1, sum=0;

    while(i<=100)

{

        sum+=i;

        i++;

    }

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

return 0;

}

运行结果:

5050

5.3.2 for 循环

for 循环容许编写一个执行指定次数的循环控制结构,通常用于已知循环。

for 循环的通常形式为:

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

{

语句块

}

运行过程:

1) 先执行“表达式1”。

2) 再执行“表达式2”,若是它的值为真(非0),则执行循环体,不然结束循环。

3) 执行完循环体后再执行“表达式3”。

4) 重复执行步骤 2) 和 3),直到“表达式2”的值为假,就结束循环。

for循环的执行过程可用下图表示:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

示例代码:计算从1加到100的和

#include <stdio.h>

#include <stdio.h>

int main()

{

    int i, sum=0;

    for(i=1; i<=100; i++)

    {

        sum+=i;

    }

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

    return 0;

}

运行结果:

5050

代码分析:

1) 执行到 for 语句时,先给 i 赋初值1,判断 i<=100 是否成立;由于此时 i=1,i<=100 成立,因此执行循环体。循环体执行结束后(sum的值为1),再计算 i++。

2) 第二次循环时,i 的值为2,i<=100 成立,继续执行循环体。循环体执行结束后(sum的值为3),再计算 i++。

3) 重复执行步骤 2),直到第101次循环,此时 i 的值为101,i<=100 不成立,因此结束循环。

由此咱们能够总结出for循环的通常形式:

for(初始化语句; 循环条件; 自增或自减)

{

语句块

}

for 循环中的三个表达式

for 循环中的“表达式1(初始化条件)”、“表达式2(循环条件)”和“表达式3(自增或自减)”都是可选项,均可以省略(但分号;必须保留)。

1) 修改“从1加到100的和”的代码,省略“表达式1(初始化条件)”:

int main()

{

    int i = 1, sum = 0;

    for( ; i<=100; i++)

    {

        sum+=i;

}

}

能够看到,将i=1移到了 for 循环的外面。

2) 省略了“表达式2(循环条件)”,若是不作其它处理就会成为死循环。

例如:

for(i=1; ; i++) sum=sum+i;

至关于:

i=1;

while(1)

{

    sum=sum+i;

i++;

}

所谓死循环,就是循环条件永远成立,循环会一直进行下去,永不结束。死循环对程序的危害很大,必定要避免。

3) 省略了“表达式3(自增或自减)”,就不会修改“表达式2(循环条件)”中的变量,这时可在循环体中加入修改变量的语句。

例如:

for( i=1; i<=100; )

{

    sum=sum+i;

i++;

}  

4) 省略了“表达式1(初始化语句)”和“表达式3(自增或自减)”。

例如:

for( ; i<=100 ; )

{

    sum=sum+i;

i++;

}

至关于:

while(i<=100)

{

    sum=sum+i;

i++;

}

5) 3个表达式能够同时省略。

例如:

for( ; ; )  语句

至关于:

while(1)  语句

6) “表达式1”能够是初始化语句,也能够是其余语句。

例如:

for( sum=0; i<=100; i++ )  sum=sum+i;

7) “表达式1”和“表达式3”能够是一个简单表达式也能够是逗号表达式。

for( sum=0,i=1; i<=100; i++ )  sum=sum+i;

或:

for( i=0,j=100; i<=100; i++,j-- )  k=i+j;

8) “表达式2”通常是关系表达式或逻辑表达式,但也但是数值或字符,只要其值非零,就执行循环体。

例如:

for( i=0; (c=getchar())!='\n'; i+=c );

又如:

for( ; (c=getchar())!='\n' ; )printf("%c",c);

5.3.3 do...while 循环

不像 for 和 while 循环,它们是在循环头部测试循环条件。在C语言中,do...while 循环是在循环的尾部检查它的条件。

do...while 循环与 while 循环相似,可是 do...while 循环会确保至少执行一次循环。

C 语言中 do...while 循环的语法:

do

{

   /*code block*/

}while( condition );

请注意,条件表达式出如今循环的尾部,因此循环中的代码块会在条件被测试以前至少执行一次。

若是条件为真,控制流会跳转回上面的 do,而后从新执行循环中的代码块。这个过程会不断重复,直到给定条件变为假为止。

示例代码:

#include <stdio.h>

int main()

{

   /* 局部变量定义 */

   int a = 10;

 

   /* do 循环执行 */

   do

   {

       printf("a 的值: %d\n", a);

       a = a + 1;

   }while( a < 20 );

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值:10

a 的值:11

a 的值:12

a 的值:13

a 的值:14

a 的值:15

a 的值:16

a 的值:17

a 的值:18

a 的值:19

5.3.4 C嵌套循环

C语言容许在一个循环内使用另外一个循环,下面演示几个实例来讲明这个概念。

C语言中嵌套 for 循环语句的语法:

for(初始化语句; 循环条件; 自增或自减)

{

   for(初始化语句; 循环条件; 自增或自减)

   {

     /*code block*/

   }

/*code block*/

}

C语言中嵌套 while 循环语句的语法:

while(condition)

{

   while(condition)

   {

      /*code blcok*/

   }

   /*code blcok*/

}

C 语言中嵌套do...while 循环语句的语法:

do

{

   /*code block*/

   do

   {

      /*code block*/

   }while( condition );

}while( condition );

关于嵌套循环有一点值得注意,能够在任何类型的循环内嵌套其余任何类型的循环。

好比,一个 for 循环能够嵌套在一个 while 循环内,反之亦然。

5.4 循环控制语句

使用while或for循环时,若是想提早结束循环(在不知足结束条件的状况下结束循环),可使用break或continue关键字提早结束。

C语言提供的循环控制语句

控制语句

描述

break 语句

终止循环或 switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。

continue 语句

告诉一个循环体马上中止本次循环迭代,从新开始下次循环迭代。

goto 语句

将控制转移到被标记的语句。可是不建议在程序中使用 goto 语句。

5.4.1 break 语句

C 语言中 break 语句有如下两种用法:

①用于循环语句中,当 break 语句出如今一个循环内时,循环会当即终止,且程序流将继续执行紧接着循环的下一条语句。

②用于switch结构中,它可用于终止 switch 语句中的一个 case。

若是使用的是嵌套循环(即一个循环内嵌套另外一个循环),break 语句会中止执行其所在的那层循环,而后开始执行该块以后的下一行代码。

C语言中 break语句的语法:

break;

示例代码:

#include <stdio.h> 

int main ()

{

   /* 局部变量定义 */

   int a = 10;

   /* while 循环执行 */

   while( a < 20 )

   {

      printf("a 的值: %d\n", a);

      a++;

      if( a > 15)

      {

         /* 使用 break 语句终止循环 */

          break;

      }

   }

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值:10

a 的值:11

a 的值:12

a 的值:13

a 的值:14

a 的值:15

5.4.2 continue 语句

C语言中的 continue 语句有点像 break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句执行后自增语句仍然会执行。

对于 while 和 do...while 循环,continue 语句会从新执行条件判断语句。

C 语言中 continue 语句的语法:

continue;

示例代码:

#include <stdio.h> 

int main ()

{

   /* 局部变量定义 */

   int a = 10;

   /* do 循环执行 */

   do

   {

      if( a == 15)

      {

         /* 跳过迭代 */

         a = a + 1;

         continue;

      }

      printf("a 的值: %d\n", a);

      a++;

   }while( a < 20 );

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值:10

a 的值:11

a 的值:12

a 的值:13

a 的值:14

a 的值:16

a 的值:17

a 的值:18

a 的值:19

5.4.3 goto 语句

C语言中的 goto语句容许把控制无条件转移到同一函数内的被标记的语句。

注意:在任何编程语言中,都不建议使用 goto 语句。由于它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序能够改写成不须要使用 goto 语句的写法。容易破坏本来的代码结构。

C语言中 goto 语句的语法:

goto label;

.....

.....

label:

在这里,label 能够是任何除 C 关键字之外的纯文本,它能够设置在 C 程序中 goto 语句的前面或者后面。

示例代码:

#include <stdio.h>

int main ()

{

   /* 局部变量定义 */

   int a = 10;

   /* do 循环执行 */

   LOOP:

do

   {

      if( a == 15)

      {

         /* 跳过迭代 */

         a = a + 1;

         goto LOOP;

      }

      printf("a 的值: %d\n", a);

      a++;

   }while( a < 20 );

   return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

a 的值:10

a 的值:11

a 的值:12

a 的值:13

a 的值:14

a 的值:16

a 的值:17

a 的值:18

a 的值:19

5.4.4 for语句实现无限循环

若是条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。因为构成循环的三个表达式中任何一个都不是必需的, 能够将某些条件表达式留空来构成一个无限循环。

#include <stdio.h>

int main ()

{

   for( ; ; )

   {

      printf("This loop will run forever.\n");

   }

   return 0;

}

当条件表达式不存在时,它被假设为真。可是通常状况下,C 程序员偏向于使用 while(1) 结构来表示一个无限循环。

注意:在linux下运行程序时,能够按 Ctrl + C 键终止一个无限循环。

 

5.5 课后练习做业

5.5.1 if语句练习做业

1. 判断某一年是不是闰年。(条件: 能整除4且不能整除100 或者能整除400 )

2. 输入一个很少于5位的正整数,判断他是几位数,并逆序输出(不使用循环)。

3. 输入一个华氏温度,输出摄氏温度,计算公式为 (华氏度-32)×5÷9 要求结果保留两位小数。

4. 输入任意三个数,按从小到大的顺序输出。

5. 判断回文数,从键盘上输入一个整数(不超过 5 位),判断是不是回文。

 

5.5.2 循环语句练习做业

1. 求100之内天然数中偶数之和。

2. 输出全部200-400之内能被3整除且个位数字为6的整数。

3. 打印全部水仙花数。所谓水仙花是指一个三位数,其个位数字的立方和等于该数

4. 编程计算1*2*3+3*4*5+。。。。+99*100*101的值。

5. 从键盘上输入0-255 范围内的整数,转成二进制数据输出

6. 输出 9*9 乘法口诀表

7. 回文判断

8. 素数判断

9. 可逆素数判断 

10.百元买百鸡问题:公鸡每只5元,母鸡每只3元,小鸡3只一元,问一百元买一百只鸡有几种买法。

11.求 n 的 m 次方。(n和m从键盘上输入)

12. 打印正三角的数字

   1

  121

 12321

1234321

 

13. 打印倒三角的数字

  1234321

   12321

121

1

 

14. 输出菱形图案

   *

  ***

 *****

*******

 *****

  ***

*

 

15. C语言求孪生素数

 

问题描述:

所谓孪生素数指的是间隔为2的两个相邻素数,由于它们之间的距离已经近的不能再近了,如同孪生兄弟同样,因此将这一对素数称为孪生素数。

显然,最小的一对孪生素数是(1,3)。咱们能够写出3?100之内的孪生素数,一共有8对,分别是(3,5),(5,7),(11,13),(17,19),(29,31),(41,43),(59,61)和(71,73)。随着数字的增大,孪生素数的分布也愈来愈稀疏,人工寻找孪生素数变得很是困难。

 

本题要解决的问题是:编程求出3~1000之内的全部孪生素数。

 

问题分析:

孪生素数是指:若a为素数,且a+2也是素数,则素数a和a+2称为孪生素数。

要编程求解的问题是找出3?1000之内的全部孪生素数,所以很天然的可使用穷举法对3?1000之内的每个整数n进行考察,先判断n是否为素数,再判断n+2是否为素数,若是n和n+2同时为素数,则(n,n+2)就是一对孪生素数,将其打印输出便可。

 

算法设计:

在算法设计中须要采用循环结构。

相关文章
相关标签/搜索