C語言--循環結構


知識內容總結

for循環語句

使用該語句可以實現C語句的重復執行,一般形式為:

	for ( 表達式1; 表達式2; 表達式3)
	{
             循環體語句;
	}

for語句的執行流程是:先計算表達式1,再判斷表達式2,若為“真”,則執行循環體語句,並接着計算表達式3,然后繼續循環,若值為“假”,則結束循環,繼續執行for的下一條語句。

  • 表達式1:初值表達式,對循環變量賦初值,從而指定循環的起點。
  • 表達式2:條件表達式,給出循環繼續的條件。
  • 表達式3:步長表達式,這個表達式是單次循環結束后需要執行的語句。
  • 循環體語句:每一次循環需要執行的語句。
    應用舉例:

while循環

我們已經學習了for循環語句,現在我們學習的while語句也可以實現循環,而且使用范圍更廣泛。該語句的一般形式為

while ( 表達式 )
{
      循環體語句;
}

while語句的執行流程為:當表達式的值為“真”時,循環執行,直到表達式的值為“假”,循環中止並繼續執行while的下一條語句。

while循環的特點:

  1. while語句中的表達式可以是任意合法的表達式;
  2. while語句的構成簡單,只有一個表達式和循環體語句,分別對應循環的兩個核心要素:循環條件和循環體,可以直接把循環問題的分析設計轉換為語句實現;
  3. while的循環體語句中必須包含能最終改變循環條件真假性的操作;
  4. while語句是在循環前先判斷條件,只有條件為“真”才進入循環。
    應用舉例:

do-while循環

for語句和while語句都是在循環前先判斷條件,只有條件滿足才會進人循環,如果一開始條件就不滿足,則循環一次都不執行。do-while循環語句與上述兩種循環語句略有不同,它先執行循環體,后判斷循環條件。所以無論循環條件的值如何,至少會執行一次循環體。
一般形式為:

do
{
      循環體語句;
}while ( 表達式 );

do-while語句的執行流程為:第一次進入循環時,首先執行循環體語句,然后再檢查循環控制條件,即計算表達式,若值為“真”,繼續循環,直到表達式的值為“假”,循環結束,執行do-while的下一條語句。

do-while循環的特點:

  1. 語句中的表達式可以是任意合法的表達式;
  2. 使用時要另加初始化部分,循環體語句必須包含能最終改變條件真假性的操作;
  3. 該語句先循環、后判斷循環條件,一般在循環體的執行過程中明確循環控制條件;
  4. 它每執行一次循環體后,再判斷條件,以決定是否進行下一次循環。
    應用舉例:

三種循環語句小結

for循環與while循環的區別:

循環的實現一般包括4個部分,即初始化、條件控制、重復的操作以及通過改變循環變量的值最終改變條件的真假性,使循環能正常結束。這4個部分可以直接和for語句中的4個成分(表達式1、表達式2、循環體語句和表達式3)相對應。當使用while語句時,由於它只有2個成分(表達式和循環體語句),這時就需要另加初始化部分,至於第4個部分,while語句的循環體語句可包含for語句的循環體語句和表達式3, 所以while的循環體語句中必須包含能最終改變循環條件真假性的操作。
應用舉例:

for循環語句:

while循環語句:

while循環與do-while循環的異同:

  1. while循環是先判斷后運行,do-while循環是先執行后判斷,因此無論是否符合條件,do-while循環至少執行一次。
    例如:


    圖二的代碼由於變量i不符合(i <= 10)的條件,無法進入循環,但是圖一的代碼會先循環一次,再進行判斷。
  2. 當循環需要執行兩次以上時,兩種循環的運行效果相同。
    例如:用代碼求1+2+……+9+10的和


    圖一的代碼循環了10次,在第十次結束時,由於i=11,就此結束了循環,圖二的代碼也執行了10次,在第11次循環開始時,由於i=11,因此第11次循環沒有被運行。

循環語句的選擇:

  • 循環有固定的次數,使用for循環語句;
  • 循環必須執行一次,使用do-while循環語句;
  • 其他情況,使用while循環語句。

4.循環控制:break語句和continue語句


當循環結構中出現多個循環條件時,可以由循環語句中的表達式和break語句共同控制。break語句強制循環結束,一旦執行了break語句,循環提前結束,不再執行循環體中位於其后的其他語句。break語句應該和if語句配合使用,即條件滿足時,才執行break跳出循環;否則,若break無條件執行,意味着永遠不會執行循環體中break后面的其他語句。continue語句的作用是跳過循環體中continue后面的語句,繼續下一次循環,該語句一般也需要與if語句配合使用。
兩個語句的區別在於:break語句用於結束循環,而continue語句只是跳過后面的語句繼續循環。break除了可以中止循環外,還應用與switch語句,而continue語句只能用於循環結構。

  • break語句只能跳出其所在的一個循環,在嵌套循環結構中,不能跳出所有循環。

5.goto語句

goto語句也稱為無條件轉移語句,其一般格式如下:goto 語句標號; 其中語句標號是按標識符規定書寫的符號,放在某一語句行的前面,標號后加冒號。語句標號起標識語句的作用,與goto 語句配合使用。
例如:輸入一行字符串,用代碼實現字符數量統計:

編譯器不限制程序中使用標號的次數,但各標號不得重名。goto語句能實現跳轉功能,轉去執行語句標號所標識的語句, goto語句通常與條件語句配合使用,可用來實現條件轉移, 構成循環,跳出循環體等功能。 但是,我們一般不主張使用goto語句,因為使用該語句容易造成程序流程的混亂,容易破壞程序的嚴謹性、結構性,使理解和調試程序都產生困難。

6.嵌套循環結構

通過對題目的分析,我們可以知道這道題的本質是求解二元一次方程“n = (98 * f - 199 * y)”,其中n為輸入的支票原始面額。同時我們也知道,計算機並不是那么聰明,它沒辦法直接解出f,y這兩個未知量的值,但是計算機擅長高速度的重復運算,因此我們就讓計算機發揮它的特長,用窮舉法來寫這道題。
代碼實現:

從這道例題中,我們就把在代碼中的循環形式稱為嵌套循環(或多重循環),簡單的說就是在循環結構里面還有循環結構。對於我們初學者而言,嵌套循環的寫法相對比較靈活,因此我們需要對內、外層循環有清晰的思路,特別是初始化語句,初學者容易因為混淆了內、外層循環的初始化,從而把循環的初始化語句放在了錯誤的位置上。

7.循環結構實際應用——打印日歷


這段代碼能實現1994~1999年的日歷打印,運行效果:

核心部分在於:

這段代碼控制着年份的准確輸入和第一個日期打印的位置。但是這段代碼只能打印區區6個年份的日歷,現在我要拓寬可打印的日歷年限,讓這個程序能夠成功地打印2019年。
代碼實現:

我們利用了剛學習的for循環結構成功地找出了輸入年份的第一個日期的位置,查詢1900年的日歷,1900年1月1日是星期一,接下來的年份的1月1日的position都會比上一年加上1,如果上一年是閏年就加上2,以7為最小正周期來變化。現在的代碼打印的年份下限是1900年,上限是多少呢?——int類型的上限有多大,年份上限就有多大!我們甚至可以把int統統改為double類型。
現在,我還想再加一段代碼進去:

運行效果:


例題講解

單詞長度

算法分析

定義變量ch存儲每次讀取的字符,定義變量sum存儲單個單詞的長度,定義變量flag用於使輸出時末尾不輸出空格。
輸入字符ch
while ch != '.' do   //如果讀取到“.”程序停止
    if ch != ' ' sum++   //過濾開頭的空格,遇到非空格開始計數
    else if sum != 0
         if flag == 0   //輸出第一個單詞長度
            輸出sum
             flag = 1
             sum = 0   //復位sum
          else   //輸出其他單詞長度
              輸出(空格)sum
              sum = 0
          end if
       end if
    end if
    輸入ch   //輸入下一個字符,開始下一輪循環 
end while
if sum != 0   //單獨輸出最后一個單詞
    if flag = 0
       輸出sum
    else
       輸出(空格)sum
    end if
end if

代碼截圖

測試數據

輸入數據 輸出數據 說明
It's great to see you here. 4 5 2 3 3 4 sample
I'm a vegetable chicken. 3 1 9 7 sample等價
(空格)(空格)I'm a vegetable chicken(空格)(空格). 3 1 9 7 開頭結尾多空格
. 只有句號
(空格)(空格)(空格)(空格)(空格). 空句子
Yeah. 4 一個單詞
!@# $%^ &() _+}{ }":?> </- + . 3 3 4 4 5 4 1 一個神秘的句子

求冪級數展開的部分和

算法分析

定義變量mol存放下一項的分子,定義變量den存放下一項的分母,定義變量x存放輸入的數字,定義變量sum存放冪級數部分和,定義變量next存放下一項,用於結束循環
輸入x
for i = 2;next >= 0.00001;i++
   sum = sum + mol * x / den
   next = mol * x / den
   mol = mol * x
   den = den * i
end for
輸出sum

代碼截圖

測試數據

輸入數據 輸出數據 說明
1.2 3.3201 sample
1.7 5.4739 sample等價
0.5 1.6487 輸入的x小於1大於0
1 2.7183 輸入的x等於1
0 1.0000 輸入的x取最小值
5 148.4132 輸入的x取最大值

龜兔賽跑

算法分析

定義變量T為輸入的時間,變量rabbit兔子跑過的路程,並初始化為0,變量tortoise烏龜跑過的路程,並初始化為0變量i經過的分鍾,變量rest休息時間,並初始化為0,變量flag用於表示兔子處於休息狀態,並初始化為0。
輸入變量T
for  i = 0;i< T ;i++   //循環的次數表示經過的分鍾數
    if flag == 1   //判斷兔子是否在休息
       rest++   //休息一分鍾
       if rest == 30   //判斷兔子是否休息好了
          flag = 0   //兔子結束休息
       end if
    else
       rabbit = rabbit + 9
       if i % 10 == 0   //判斷兔子是否回頭看
          if rabbit > tortoise   //如果兔子跑得遠,開始休息
          flag = 1
          rest = 0   //休息分鍾數復位為0
          end if
       end if
    end if
    tortoise = tortoise + 3   //烏龜不休息
end for
if rabbit == tortoise 
   輸出-_- 變量rabbit
else if rabbit > tortoise
      輸出@_@ 變量tortoise 
   else 輸出^_^ 變量rabbit
   end if 
end if

代碼截圖

測試數據

輸入數據 輸出數據 說明
242 @_@ 726 sample
0 -_- 0 沒出發
9 ^_^ 81 兔子贏
20 ^_^ 90 兔子躺贏
29 ^_^ 90 兔子贏臨界點
30 -_- 90 並駕齊驅
31 @_@ 93 烏龜贏臨界點
44 @_@ 132 烏龜贏臨界點
45 -_- 135 並駕齊驅
46 ^_^ 144 兔子贏臨界點
59 ^_^ 180 兔子贏臨界點
60 -_- 180 並駕齊驅
61 @_@ 183 烏龜贏臨界點
90 -_- 270 並駕齊驅


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM