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)就是一對孿生素數,將其打印輸出便可。

 

算法設計:

在算法設計中須要採用循環結構。

相關文章
相關標籤/搜索