【語法篇】4、for循環(一)

一、循環

大部分人孩提時的數學啟蒙都是從數數開始的,如果要我們編程讓計算機從1數到10,我們用輸出來替代數數,即是要將1到10依次打印出來,我們可以怎么實現呢?這當然很簡單了,我們最直接樸素的方法,就是逐個將這些數打印出就可以了。

#include <iostream>
using namespace std;
int main(){
    cout << "1" << endl;
    cout << "2" << endl;
    cout << "3" << endl;
    cout << "4" << endl;
    cout << "5" << endl;
    cout << "6" << endl;
    cout << "7" << endl;
    cout << "8" << endl;
    cout << "9" << endl;
    cout << "10" << endl;
    return 0;
}

這肯定難不倒大家,可是如果我們要計算機從1數到100呢?從1數到10000呢?從10000到100000000呢?隨著數據規模的急劇增大,我們不難想象,逐個地將這些數cout輸出是一件多人令人難受的事情。
但是我們用另外一個角度來考慮一下問題,計算機不是很擅長做這種機械、又很有規律的事情嗎?為什么我們不能將這種機械、重復的事情,用某種方式去實現呢?編程語言設計人員也充分考慮到了這樣的問題,因此他們設計了一種叫做『循壞結構』的東西,循環結構和選擇結構、順序結構一樣都普遍存在不同的編程語言中,它們的思想和作用都是一樣的,區別僅僅在于語法的表達不同而已。

二、for循壞

以下代碼,我們可能暫時還不太理解,不妨先看看,再通過幾個案例進行模仿,慢慢我們就能抓住它的規律。

1~10
#include <iostream>
using namespace std;
int main(){  // 從1到10 
    for(int i=1; i<=10; i++){ 
        cout << i << endl;
    }
    return 0;
}

代碼的關鍵在于for(int i=1; i<=10; i++)這一句。我們首先要來解釋一下i++是什么意思,i++其實就是相當于是i=i+1。

既然有i++,且i++相當于i=i+1,那么有沒有對應的+、-、* 、/呢?
類似于上面的做法,我們可以大膽猜測一下:
i -- 相當于 i = i - 1
i ** 相當于 i = i * 1
i // 相當于 i = i / 1
等一下, i乘以1和i除以1,不都是它本身嗎?那這本身就沒有意義了,所以在并不存在『 i**』和『i//』,并且『//』代表的是注釋,只存在i++與i--。

另外除了 i++、i--,還有一種++i、--i,他們的意思也是『自加1』和『自減1』,i++與++i,i--與--i,本身代表的意思都是i = i + 1 和 i = i - 1,但是還是有一點點區別,大家不妨自己去探究一下區別在哪里。
還有另外一種寫法 i += 2 ,這也是一種簡寫,實際上相當于 i = i+2,其他運算也是可以這樣簡寫,譬如 i = i/2,可以簡寫成 i /= 2,包括求余%也可以這樣簡寫。簡寫的目的只是為了少寫點,方便我們書寫得更高效,本質上和全寫并沒有優劣之分,我們習慣如何書寫都沒有問題。

理解了上面的問題,我們再把目光集中到for語句中,如果我們需要從1開始,數到100呢?如果是其他呢?

從1到10,每次增加1: for(int i=1; i<=10; i++)
從1到100,每次增加1:for(int i=1; i<=100; i++)
從10到1,每次減少1:for(int i=10; i>=1; i--)
從1到100,每次增加5:for(int i=1; i<=100; i+=5)
從50到0,每次減少2:for(int i=50; i>=0; i-=2)

相信大家通過上面的案例,可以大致得出這個循環(for循環)的規律,我們不妨一起來總結一下。

特別需要大家注意的是:小括號里面有兩個分號,小括號后面沒有分號,大括號后面不需要分號,循環體里面可以有多個語句,每個語句后面都需要有結束語句的分號。

循環結構

for循環結構的運行思路是這樣的:我們先假定for循環里面的語句,分別是A、B、C,循環體語句是D。那么首先運行A,即初始化條件;接著判斷B,即條件語句,如果是true,那么運行循環體D,否則跳出循環;剛才如果運行了循環體D,接著會運行C,即變化語句,變化完后再進行判斷B,如果是true,運行D,否則跳出循環,一直重復,直到B為false,跳出循環。


運行順序

三、累加器和累乘器

1、累加器

前面我們嘗試著讓計算機輸出1~100,現在我們不妨讓計算機將1~100累加起來。即求:1+2+3+...+99+100的結果。

如果我們想象一下,有一條『貪吃蛇』,一開始是一個點,吃完一個數,那個數又變成了它自身的一部分,又繼續吃下一個數,直到吃完所有數。那么我們可以假定一個變量sum(蛇),給它賦一個初始值,即開始是一個點。因為是累加,初始值應該不影響最終的結果,那么初始值應該設為0,因為0加任何數都等于它本身。那么我們就會有以下式子。

sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
...
sum = sum + i;
...
sum = sum + 100;

那么其實 sum = sum + i,就是剛才一直在反復做的事情,變化的是i的數值,它們的值是從1~100,每次變化為增加1。

#include <iostream>
using namespace std;
int main(){
    int sum = 0;  //初始化 
    for(int i=1; i<=100; i++){ 
        sum = sum + i;
    }
    cout << sum;  // 最后輸出結果 
    return 0;
}

2、累乘器

數學中有一個階乘的計算,我們用『!』來表示。如4!=1×2×3×4,6!=1×2×3×4×5×6,n!=1×2×3×...×(n-1)×n。現在輸入一個整數n(n<20),求n!。

很顯然,也可以同樣參照上面的『貪吃蛇』做法,只是初始化應該為1,因為1乘以任何數都還是它本身。另外需要注意的是,20!顯然是一個比較大的數,明顯已經超出了int的范圍(-21億多<int<21億多),因此我們需要使用更大范圍的long long。當然如果n的數據更大,可能也會超過long long 的范圍,那么這個就需要用到『高精度計算』,我們后面會再提到,現在大家只需要知道就可以了。

#include <iostream>
using namespace std;
int main(){
    int n;
    cin >> n; 
    int s = 1;  //初始化 
    for(int i=1; i<=n; i++){ 
        s = s * i;
    }
    cout << s;  // 最后輸出結果 
    return 0;
}

四、練習

1、編程計算12+22+32+……+1002

2、編程計算并輸出1+1/2+1/3+……+1/100的和

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容