【語法篇】13充石、函數(shù)

一莫换、函數(shù)是什么

我們從函數(shù)的產(chǎn)生來看,其實(shí)很好理解骤铃,因?yàn)槟承┐a或運(yùn)算需要反復(fù)使用拉岁,作為一名志向遠(yuǎn)大(懶癌后期)的OIer,我們往往不想反反復(fù)復(fù)地寫同樣的代碼(有些可能要改一些數(shù)據(jù))惰爬,所以我們想要有一個“東西”來專門實(shí)現(xiàn)我們的運(yùn)算喊暖,我們期待只需要寫一遍代碼,以后要使用的時候补鼻,直接調(diào)出來就可以哄啄,這個“東西”雅任,在C++和很多語言中,都叫做函數(shù)咨跌。因?yàn)楹芏鄷r候需要改動一些數(shù)據(jù)沪么,我們在調(diào)用的時候也往往要帶上這寫改動的數(shù)據(jù),這些數(shù)據(jù)就是我們函數(shù)中的參數(shù)了锌半,當(dāng)然也有一些函數(shù)根本就不用改數(shù)據(jù)禽车,也可以不帶參數(shù)。

舉個例子說明一下:

我們要求:1刊殉!+2殉摔!+3!+4记焊!+5逸月!+6!+...+20!=?

很顯然遍膜,用前面的知識碗硬,我們可以輕易地用兩重循環(huán)來實(shí)現(xiàn)求和。


int sum=0;

for(int i=1; i<=20; i++){

  int jc=1;

 for(int j=1; j<=i; j++)

  jc*=i;

sum+=jc;

}
// sum即是結(jié)果

但有時瓢颅,我們又會覺得它并不是特別方便恩尾,因?yàn)橛袝r我們求階乘的時候,不一定是像現(xiàn)在這么規(guī)律挽懦,從1到n的階乘翰意,譬如:
求:3!+10信柿!+13冀偶!=?
我們總不希望把階乘這樣一個過程重復(fù)地寫幾遍吧渔嚷。這時候蔫磨,我們不妨換一個思路來看,在前面的經(jīng)驗(yàn)中圃伶,我們已經(jīng)使用過cmath庫中的sqrt()堤如,其實(shí)這就是一個數(shù)學(xué)庫的函數(shù),既然有開平方的函數(shù)窒朋,那有沒有一個階乘的函數(shù)呢搀罢?我們暫且假設(shè)有階乘的函數(shù),并且設(shè)它為jc()侥猩,那么我們可以這樣來實(shí)現(xiàn)榔至。

#include <iostream>
#include <cmath>
using namespace std;
  int main(){
  int sum=0;
  sum+=jc(3);
  sum+=jc(10);
  sum+=jc(13);
  cout<<sum<<endl;
  return 0;
}

但是遺憾的是,在數(shù)學(xué)庫中欺劳,并沒有這樣一個函數(shù)唧取。一般庫函數(shù)中都是包含了最基礎(chǔ)铅鲤、最常用的函數(shù),在數(shù)學(xué)庫的設(shè)計(jì)者眼中和實(shí)踐中枫弟,階乘并不算特別常用的函數(shù)邢享,因此并沒有收錄到數(shù)學(xué)庫中。但是也沒有關(guān)系淡诗,我們完全可以自己定義一個函數(shù)骇塘,譬如就定義為jc(),那么我們的程序就可以這樣寫了。

#include <iostream>
using namespace std;
// 注意:這是jc的函數(shù)
int jc(int x){ 
  int t=1;
  for(int i=1; i<=x; i++)
    t*=i;
  return t;//返回結(jié)果
}  //函數(shù)結(jié)束

  int main(){
  int sum=0;
  sum+=jc(3);
  sum+=jc(10);
  sum+=jc(13);
  cout<<sum<<endl;
  return 0;
}

總結(jié)一下韩容,其實(shí)函數(shù)很簡單款违,就是我們不希望重復(fù)寫代碼,所以想借助函數(shù)來減少重復(fù)代碼群凶,通過函數(shù)來實(shí)現(xiàn)某個動能插爹。同時我們留意到,函數(shù)實(shí)現(xiàn)某些功能或計(jì)算请梢,很多時候會帶入一些數(shù)據(jù)递惋,也就是參數(shù),很多時候還需要得到一個結(jié)果溢陪,也就是返回值的問題。


二睛廊、函數(shù)在程序中的結(jié)構(gòu)和調(diào)用關(guān)系

函數(shù)定義形真,參照書本知識,舉個例子說明函數(shù)的結(jié)構(gòu)和使用方法超全。(要求實(shí)現(xiàn)最簡單的加法功能)

#include <iostream>
using namespace std;

int main(){
  int a, b;
  cin>>a>>b;
  int c=add(a, b);
  cout<<c;
  reuturn 0;
}

我們在寫簡單程序時(區(qū)別于工程型編程)咆霜,往往會先寫函數(shù)的主體結(jié)構(gòu)和框架,然后在去填充具體的功能嘶朱,表現(xiàn)在編程中蛾坯,其實(shí)就是先寫主程序main,然后要實(shí)現(xiàn)什么功能疏遏,先假設(shè)有一個函數(shù)脉课,可以實(shí)現(xiàn)那個功能,一路寫下來财异。然后再去完善具體的功能倘零,最后需要測試數(shù)據(jù)和考慮各種可能的bug。
函數(shù)寫法戳寸,有兩種呈驶,一種是寫在主程序前,不要事先聲明疫鹊;一種是寫在主程序后袖瞻,但是要在主程序前聲明函數(shù)司致。在這里,基于OI或ACM類型的比賽聋迎,建議大家把函數(shù)都寫在main前面脂矫,并且越先使用的函數(shù)寫在最上面,可以減少沒必要的函數(shù)聲明和定義砌庄。像上面的一個案例羹唠,假如我們要實(shí)現(xiàn)一個加法的功能,我們可以這樣寫娄昆。
在寫的時候佩微,我們就要考慮幾個問題:

1、函數(shù)需要返回值嗎萌焰?什么類型哺眯?
2、需要參數(shù)嗎扒俯?幾個參數(shù)奶卓?分別什么類型?
3撼玄、需要改變本身傳遞的數(shù)據(jù)嗎夺姑?即是考慮“傳值”還是“傳址”,還有全局變量與局部變量的考慮掌猛。
4盏浙、測試bug,特殊值

參照上面幾個問題荔茬,我們逐個考慮:要得出相加的結(jié)果废膘,顯然需要返回值,而且應(yīng)該是int類型慕蔚;參數(shù)的話丐黄,因?yàn)槭莾蓚€數(shù)相加,因此兩個加數(shù)就是參數(shù)孔飒,類型也是int灌闺;我們只是需要得到一個計(jì)算的結(jié)果,并需要去改變兩個加數(shù)的原始數(shù)字坏瞄,因此考慮"傳值"菩鲜,不涉及全局?jǐn)?shù)據(jù),局部變量即可惦积;特殊值考慮負(fù)數(shù)接校、零等的相加。
完整代碼如下:

#include <iostream>
using namespace std;

int add(int x, int y){
  return (x+y);  //建議加上括號
} 

int main(){
  int a,b;
  cin>>a>>b;
  int c=add(a, b);
  cout<<c;
  return 0;
}

需要說明的是,main()本身就是函數(shù)蛛勉,并且是主函數(shù)鹿寻,所有程序都必須用main開始,并且遵循順序結(jié)構(gòu)的規(guī)則诽凌。那么涉及到函數(shù)的各種調(diào)用的時候毡熏,我們需要稍微加以理解。從main開始侣诵,從上往下痢法,從左往右,執(zhí)行杜顺,遇到函數(shù)f1财搁,就跳轉(zhuǎn)到函數(shù)f1處執(zhí)行,直到遇到f1中的return語句或f1函數(shù)結(jié)束躬络,才重新回到之前調(diào)用的地方尖奔。打個比方:我們來到學(xué)校上課,都是按照一定順序進(jìn)行的穷当,每次都是先過周一提茁、周二、周三...一直到放學(xué)馁菜。那么函數(shù)的引入茴扁,就像是我們在周二晚上,我們做了一個夢汪疮,夢見我們要去做一些事情峭火,做完夢之后,我們又重新回到做夢的那個時間點(diǎn)铲咨,也就是回到周二,再過周三蜓洪,一直下去纤勒。有點(diǎn)意思的是,夢里可能還會再有夢隆檀,實(shí)際上摇天,這就是在函數(shù)中再調(diào)用函數(shù)的意思,如果夢里繼續(xù)做了同樣的夢恐仑,那就是所謂的遞歸了泉坐。

基礎(chǔ)練習(xí)

1、求兩個正整數(shù)的最大公約數(shù)(輾轉(zhuǎn)相除法)
2裳仆、進(jìn)制的轉(zhuǎn)換(a.由十進(jìn)制轉(zhuǎn)二進(jìn)制腕让,b.由二進(jìn)制轉(zhuǎn)十進(jìn)制,c.m進(jìn)制轉(zhuǎn)n進(jìn)制)
3、更多練習(xí)纯丸,參見函數(shù)過關(guān)題和NOI官網(wǎng)題庫偏形。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市觉鼻,隨后出現(xiàn)的幾起案子俊扭,更是在濱河造成了極大的恐慌,老刑警劉巖坠陈,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萨惑,死亡現(xiàn)場離奇詭異,居然都是意外死亡仇矾,警方通過查閱死者的電腦和手機(jī)庸蔼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來若未,“玉大人朱嘴,你說我怎么就攤上這事〈趾希” “怎么了萍嬉?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長隙疚。 經(jīng)常有香客問我壤追,道長,這世上最難降的妖魔是什么供屉? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任行冰,我火速辦了婚禮,結(jié)果婚禮上伶丐,老公的妹妹穿的比我還像新娘悼做。我一直安慰自己,他們只是感情好哗魂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布肛走。 她就那樣靜靜地躺著,像睡著了一般录别。 火紅的嫁衣襯著肌膚如雪朽色。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天组题,我揣著相機(jī)與錄音葫男,去河邊找鬼。 笑死崔列,一個胖子當(dāng)著我的面吹牛梢褐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼利职,長吁一口氣:“原來是場噩夢啊……” “哼趣效!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猪贪,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跷敬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后热押,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體西傀,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年桶癣,在試婚紗的時候發(fā)現(xiàn)自己被綠了拥褂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡牙寞,死狀恐怖饺鹃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情间雀,我是刑警寧澤悔详,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惹挟,受9級特大地震影響茄螃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜连锯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一归苍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧运怖,春花似錦拼弃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吗购,卻和暖如春医男,著一層夾襖步出監(jiān)牢的瞬間砸狞,已是汗流浹背捻勉。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刀森,地道東北人踱启。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親埠偿。 傳聞我的和親對象是個殘疾皇子透罢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)冠蒋,斷路器羽圃,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • [TestFixture(arguments)]屬性標(biāo)記類為測試類,若沒有填寫參數(shù)抖剿,則測試類必須含有無參構(gòu)造函數(shù)朽寞,...
    皿卜土閱讀 596評論 0 0
  • 碰見三觀不同的人猶如秀才遇到兵脑融,有理說不清。話不投機(jī)半句多缩宜,永遠(yuǎn)無法在一個頻率上肘迎,雞同鴨講。雖近在咫尺锻煌,然遠(yuǎn)在天邊...
    閔語蘭心閱讀 772評論 6 7