一辆亏、循環(huán)
大部分人孩提時(shí)的數(shù)學(xué)啟蒙都是從數(shù)數(shù)開始的风秤,如果要我們編程讓計(jì)算機(jī)從1數(shù)到10,我們用輸出來替代數(shù)數(shù)扮叨,即是要將1到10依次打印出來缤弦,我們可以怎么實(shí)現(xiàn)呢?這當(dāng)然很簡(jiǎn)單了彻磁,我們最直接樸素的方法碍沐,就是逐個(gè)將這些數(shù)打印出就可以了狸捅。
#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;
}
這肯定難不倒大家,可是如果我們要計(jì)算機(jī)從1數(shù)到100呢累提?從1數(shù)到10000呢尘喝?從10000到100000000呢?隨著數(shù)據(jù)規(guī)模的急劇增大刻恭,我們不難想象瞧省,逐個(gè)地將這些數(shù)cout輸出是一件多人令人難受的事情扯夭。
但是我們用另外一個(gè)角度來考慮一下問題鳍贾,計(jì)算機(jī)不是很擅長(zhǎng)做這種機(jī)械、又很有規(guī)律的事情嗎交洗?為什么我們不能將這種機(jī)械骑科、重復(fù)的事情,用某種方式去實(shí)現(xiàn)呢构拳?編程語言設(shè)計(jì)人員也充分考慮到了這樣的問題咆爽,因此他們?cè)O(shè)計(jì)了一種叫做『循壞結(jié)構(gòu)』的東西,循環(huán)結(jié)構(gòu)和選擇結(jié)構(gòu)置森、順序結(jié)構(gòu)一樣都普遍存在不同的編程語言中斗埂,它們的思想和作用都是一樣的,區(qū)別僅僅在于語法的表達(dá)不同而已凫海。
二呛凶、for循壞
以下代碼,我們可能暫時(shí)還不太理解行贪,不妨先看看漾稀,再通過幾個(gè)案例進(jìn)行模仿,慢慢我們就能抓住它的規(guī)律建瘫。
#include <iostream>
using namespace std;
int main(){ // 從1到10
for(int i=1; i<=10; i++){
cout << i << endl;
}
return 0;
}
代碼的關(guān)鍵在于for(int i=1; i<=10; i++)這一句崭捍。我們首先要來解釋一下i++是什么意思,i++其實(shí)就是相當(dāng)于是i=i+1啰脚。
既然有i++殷蛇,且i++相當(dāng)于i=i+1,那么有沒有對(duì)應(yīng)的+、-橄浓、* 粒梦、/呢?
類似于上面的做法贮配,我們可以大膽猜測(cè)一下:
i -- 相當(dāng)于 i = i - 1
i ** 相當(dāng)于 i = i * 1
i // 相當(dāng)于 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嘀略,但是還是有一點(diǎn)點(diǎn)區(qū)別洼哎,大家不妨自己去探究一下區(qū)別在哪里。
還有另外一種寫法 i += 2 ,這也是一種簡(jiǎn)寫饥瓷,實(shí)際上相當(dāng)于 i = i+2颂碧,其他運(yùn)算也是可以這樣簡(jiǎn)寫窟却,譬如 i = i/2剖笙,可以簡(jiǎn)寫成 i /= 2,包括求余%也可以這樣簡(jiǎn)寫涧窒。簡(jiǎn)寫的目的只是為了少寫點(diǎn)心肪,方便我們書寫得更高效,本質(zhì)上和全寫并沒有優(yōu)劣之分纠吴,我們習(xí)慣如何書寫都沒有問題硬鞍。
理解了上面的問題,我們?cè)侔涯抗饧械絝or語句中呜象,如果我們需要從1開始膳凝,數(shù)到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)
相信大家通過上面的案例拴疤,可以大致得出這個(gè)循環(huán)(for循環(huán))的規(guī)律永部,我們不妨一起來總結(jié)一下。
特別需要大家注意的是:小括號(hào)里面有兩個(gè)分號(hào)呐矾,小括號(hào)后面沒有分號(hào)苔埋,大括號(hào)后面不需要分號(hào),循環(huán)體里面可以有多個(gè)語句蜒犯,每個(gè)語句后面都需要有結(jié)束語句的分號(hào)组橄。
for循環(huán)結(jié)構(gòu)的運(yùn)行思路是這樣的:我們先假定for循環(huán)里面的語句荞膘,分別是A、B玉工、C羽资,循環(huán)體語句是D。那么首先運(yùn)行A遵班,即初始化條件屠升;接著判斷B,即條件語句狭郑,如果是true腹暖,那么運(yùn)行循環(huán)體D,否則跳出循環(huán)愿阐;剛才如果運(yùn)行了循環(huán)體D微服,接著會(huì)運(yùn)行C,即變化語句缨历,變化完后再進(jìn)行判斷B,如果是true糙麦,運(yùn)行D辛孵,否則跳出循環(huán),一直重復(fù)赡磅,直到B為false魄缚,跳出循環(huán)。
三焚廊、累加器和累乘器
1冶匹、累加器
前面我們嘗試著讓計(jì)算機(jī)輸出1~100,現(xiàn)在我們不妨讓計(jì)算機(jī)將1~100累加起來咆瘟。即求:1+2+3+...+99+100的結(jié)果嚼隘。
如果我們想象一下,有一條『貪吃蛇』袒餐,一開始是一個(gè)點(diǎn)飞蛹,吃完一個(gè)數(shù),那個(gè)數(shù)又變成了它自身的一部分灸眼,又繼續(xù)吃下一個(gè)數(shù)卧檐,直到吃完所有數(shù)。那么我們可以假定一個(gè)變量sum(蛇)焰宣,給它賦一個(gè)初始值霉囚,即開始是一個(gè)點(diǎn)。因?yàn)槭抢奂迂盎跏贾祽?yīng)該不影響最終的結(jié)果盈罐,那么初始值應(yīng)該設(shè)為0逻澳,因?yàn)?加任何數(shù)都等于它本身。那么我們就會(huì)有以下式子暖呕。
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
...
sum = sum + i;
...
sum = sum + 100;
那么其實(shí) sum = sum + i斜做,就是剛才一直在反復(fù)做的事情,變化的是i的數(shù)值湾揽,它們的值是從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; // 最后輸出結(jié)果
return 0;
}
2库物、累乘器
數(shù)學(xué)中有一個(gè)階乘的計(jì)算霸旗,我們用『!』來表示戚揭。如4诱告!=1×2×3×4,6民晒!=1×2×3×4×5×6精居,n!=1×2×3×...×(n-1)×n。現(xiàn)在輸入一個(gè)整數(shù)n(n<20)潜必,求n!靴姿。
很顯然,也可以同樣參照上面的『貪吃蛇』做法磁滚,只是初始化應(yīng)該為1佛吓,因?yàn)?乘以任何數(shù)都還是它本身。另外需要注意的是垂攘,20维雇!顯然是一個(gè)比較大的數(shù),明顯已經(jīng)超出了int的范圍(-21億多<int<21億多)晒他,因此我們需要使用更大范圍的long long吱型。當(dāng)然如果n的數(shù)據(jù)更大,可能也會(huì)超過long long 的范圍仪芒,那么這個(gè)就需要用到『高精度計(jì)算』唁影,我們后面會(huì)再提到,現(xiàn)在大家只需要知道就可以了掂名。
#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; // 最后輸出結(jié)果
return 0;
}
四据沈、練習(xí)
1、編程計(jì)算12+22+32+……+1002
2饺蔑、編程計(jì)算并輸出1+1/2+1/3+……+1/100的和