一、【理解】復(fù)習(xí)昨天內(nèi)容
二腾降、【掌握】函數(shù)的介紹和簡(jiǎn)單使用
思考:
如果你要做個(gè)表白的軟件,其中想打印9次愛(ài)心碎绎,代表你對(duì)妹紙濃濃的愛(ài)螃壤,怎么做呢?
打印表白
親筋帖!你需要一種更簡(jiǎn)單高效的編碼方式——函數(shù)<榍纭!
思考:
我們已經(jīng)學(xué)過(guò)的函數(shù)有哪些幕随?
函數(shù)的作用:
函數(shù)就相當(dāng)于是一個(gè)打包盒蚁滋,將一段代碼打包在這個(gè)盒子里,當(dāng)需要用這段代碼時(shí)赘淮,只要把這個(gè)盒子拿過(guò)來(lái)就行了辕录。
稍微專業(yè)點(diǎn)的說(shuō)法:
將一段需要被重用的代碼封裝在函數(shù)中,什么時(shí)候想要執(zhí)行這段代碼梢卸,只需要調(diào)用這個(gè)函數(shù)就行了走诞。
函數(shù)的定義:
返回值類型 函數(shù)名(參數(shù)列表){
函數(shù)體
}
例:
int main(){
}
void test(){
}
```
####函數(shù)定義的注意點(diǎn):
#####1、函數(shù)名可以任意寫蛤高,但最好符合標(biāo)識(shí)符命名規(guī)范:
1)函數(shù)的名稱一定要有意義蚣旱,盡量做到別人一看你函數(shù)名就知道你的函數(shù)內(nèi)部做什么事情
2)函數(shù)的名稱用駝峰命名法:如果有多個(gè)單詞,第一個(gè)單詞首字母小寫戴陡,后面的其他單詞字母首字母大寫
#####2塞绿、什么時(shí)候該使用函數(shù)?
如果你發(fā)現(xiàn)有1段代碼是在完成1個(gè)獨(dú)立的功能或者需要重用恤批,那么這個(gè)時(shí)候我們也可以將這段代碼封裝在函數(shù)之中.
#####3异吻、函數(shù)的好處:
1、減少代碼冗余喜庞,增強(qiáng)閱讀性
2诀浪、方便維護(hù)和修改
#####練習(xí):使用函數(shù)來(lái)打印九九乘法表
###三、【掌握】Xcode調(diào)試的使用
####一延都、斷點(diǎn)調(diào)試


下斷點(diǎn)有什么用雷猪?
當(dāng)你用Xcode編譯并啟動(dòng)程序時(shí),程序執(zhí)行到你下斷點(diǎn)的地方會(huì)卡住晰房,不再往下執(zhí)行求摇,如:

我們發(fā)現(xiàn)第43行代碼處有一行綠色的yin陰影,這代CPU執(zhí)行到這一行時(shí)停止了(此行還沒(méi)執(zhí)行)殊者,如果想繼續(xù)往下執(zhí)行与境,此時(shí)有三種方法:
#### 1、往下繼續(xù)執(zhí)行全部
繼續(xù)往下執(zhí)行幽污,直到遇到下一個(gè)斷點(diǎn)嚷辅、阻塞式函數(shù)、或者程序結(jié)束

調(diào)用完成直接執(zhí)行后面的結(jié)果距误,打印圖形和文字

####單行跳過(guò)執(zhí)行(step over)
一行一行地執(zhí)行簸搞,按一次執(zhí)行一次。但是使用這種模式會(huì)使當(dāng)前遇到的函數(shù)一下子就執(zhí)行完


按完后會(huì)執(zhí)行完printf准潭,停在drawHeart


####3趁俊、單行進(jìn)入執(zhí)行(step into)
一行一行地執(zhí)行,按一次執(zhí)行一次刑然。但是使用這種模式會(huì)使進(jìn)入到當(dāng)前遇到的函數(shù)寺擂,并在函數(shù)里一步一步運(yùn)行

此時(shí)CPU卡在drawHeart,當(dāng)我們?cè)侔磗tep into時(shí),發(fā)生了和step over不同的事情





總結(jié):
step over 和step into最大的不同在于:
step over一下子就執(zhí)行完函數(shù)怔软,不進(jìn)入函數(shù)的內(nèi)部
step into 會(huì)進(jìn)入到函數(shù)的內(nèi)部垦细,在內(nèi)部一行一行地執(zhí)行
###二、刪除斷點(diǎn):
1)直接按住斷點(diǎn)左鍵不動(dòng)往右邊一拖再松開即可刪除斷點(diǎn)
2)右鍵斷點(diǎn)陰影挡逼,在彈出的選項(xiàng)中左鍵單擊Delete Breakpoint即可刪除斷點(diǎn)

四括改、【掌握】全局變量和局部變量
-> 全局變量
直接定義在.c源文件中,函數(shù)的外部.就叫做全局變量
-> 局部變量
定義在函數(shù)內(nèi)部的變量,就叫做局部變量
####不同點(diǎn):
1)全局變量可以在任何函數(shù)中使用,而局部變量只能在被申明這個(gè)變量的函數(shù)里使用家坎。
2)全局變量直到程序結(jié)束時(shí)才會(huì)銷毀嘱能,而局部變量在函數(shù)結(jié)束后就會(huì)被銷毀
### 五、【掌握】函數(shù)的參數(shù)
思考:
如果想做一個(gè)函數(shù)虱疏,用來(lái)判斷一個(gè)數(shù)是不是偶數(shù)惹骂,怎么辦?
我們發(fā)現(xiàn)做瞪,很多時(shí)候函數(shù)要想完成某種功能对粪,也必須要接收外界傳入的值才能進(jìn)行處理,那么這時(shí)怎么辦呢穿扳?
我們可以使用全局變量解決這個(gè)問(wèn)題衩侥,但是,全局變量有個(gè)很不好的地方在于始終占據(jù)著我們的內(nèi)存空間矛物,除非程序退出才會(huì)釋放占用的空間茫死,那么這時(shí)怎么辦呢?
好在C語(yǔ)言為我們提供了一套十分好的解決方法:函數(shù)的參數(shù)履羞!
####1峦萎、什么是函數(shù)的參數(shù)?
在函數(shù)名右邊的小括號(hào)里申明的變量忆首,就叫參數(shù)爱榔。注意:沒(méi)有分號(hào)!
####2糙及、函數(shù)的參數(shù)的本質(zhì):
相當(dāng)于函數(shù)內(nèi)部的局部變量详幽,所以不能在函數(shù)內(nèi)部再定義一個(gè)同名的變量,并且在函數(shù)內(nèi)部可以直接使用參數(shù)的值

調(diào)用函數(shù)時(shí)需要給參數(shù)進(jìn)行賦值浸锨,否則會(huì)報(bào)錯(cuò)唇聘!如:

思考:什么時(shí)候該為函數(shù)寫參數(shù)呢?
建議:如果以后不知道要不要給函數(shù)寫參數(shù)柱搜,就先寫函數(shù)的功能迟郎,等發(fā)現(xiàn)需要接收外部傳入的值時(shí),再寫函數(shù)聪蘸!
####3宪肖、帶多個(gè)參數(shù)的函數(shù)
思考:如果我們需要做一個(gè)實(shí)現(xiàn)做加法運(yùn)算功能的函數(shù)表制,怎么做呢?
我們?cè)僖淮伟l(fā)現(xiàn)很多時(shí)候一個(gè)參數(shù)是完全不夠用的控乾,所以我們需要多個(gè)參數(shù)么介。多個(gè)參數(shù)怎么定義
呢?
定義方法:
返回值 函數(shù)名(參數(shù)類型 參數(shù)名1阱持,參數(shù)類型 參數(shù)名2…………參數(shù)類型 參數(shù)名n){
函數(shù)體夭拌;
}
使用注意:
1)實(shí)參的個(gè)數(shù)必須與形參的保持一致
2)實(shí)參的順序也必須與形參的保持一致
3)實(shí)參的類型必須與形參保持一致魔熏,否則會(huì)做類型轉(zhuǎn)換

###4衷咽、形參和實(shí)參
形參:全稱形式參數(shù)。在聲明函數(shù)右邊的小括號(hào)里寫的參數(shù)就叫形參蒜绽。
實(shí)參:全稱實(shí)際參數(shù)镶骗。在調(diào)用函數(shù)時(shí),給函數(shù)的形參賦值的值就叫實(shí)參躲雅。

使用注意:因?yàn)閷?shí)參的本質(zhì)就是在調(diào)用函數(shù)時(shí)為形參賦值鼎姊,所以當(dāng)我們調(diào)用一個(gè)帶參數(shù)的函數(shù)時(shí),會(huì)要求實(shí)參的類型與形參的類型一致相赁。如果類型不一致相寇,會(huì)將實(shí)參的數(shù)據(jù)類型轉(zhuǎn)換為形參的類型然后再賦值
例: int
a = 10.3 會(huì)先將10.3轉(zhuǎn)成int類型(即10)再賦值給變量a,所以變量a的值為10
在函數(shù)的實(shí)參中钮科,也是類似這樣的過(guò)程來(lái)給形參賦值
###六唤衫、【理解】課堂練習(xí)
1、用函數(shù)來(lái)實(shí)現(xiàn)判斷一個(gè)數(shù)是不是水仙花數(shù)
2绵脯、寫一個(gè)函數(shù)佳励,求指定某個(gè)數(shù)到某個(gè)數(shù)之間所有的整數(shù)的累加和
如:3到8,算出3+4+5+6+7+8 = 蛆挫?
3赃承、用函數(shù)來(lái)實(shí)現(xiàn)判斷一個(gè)年份是不是閏年(考點(diǎn))
###七、【掌握】return關(guān)鍵字
回憶:break 悴侵、 continue關(guān)鍵字的作用是什么瞧剖?
return關(guān)鍵字也有結(jié)束的作用,但效果比break可免、continue恐怖的多抓于,是直接結(jié)束整個(gè)函數(shù)。return關(guān)鍵字后面的語(yǔ)句不會(huì)被執(zhí)行
總結(jié):break continue return
break:用在循環(huán)或者switch case語(yǔ)句中巴元,用來(lái)結(jié)束其所在的循環(huán)或者switch
case語(yǔ)句
continue:用在循環(huán)中毡咏,用來(lái)結(jié)束其本次循環(huán),繼續(xù)下次循環(huán)
return:用在函數(shù)中逮刨,用來(lái)結(jié)束整個(gè)函數(shù)
練習(xí):
用函數(shù)實(shí)現(xiàn)判斷一個(gè)數(shù)是不是偶數(shù)呕缭,但函數(shù)內(nèi)部只能用if語(yǔ)句實(shí)現(xiàn)堵泽,不能用if else 或者if else if
###八、【掌握】函數(shù)的返回值
思考:寫一個(gè)函數(shù)實(shí)現(xiàn)計(jì)算出語(yǔ)文成績(jī)和數(shù)學(xué)成績(jī)的總分恢总。然后蒼老師叫小明和小王還有小軍分別去計(jì)算出他們的總分迎罗,然后蒼老師要統(tǒng)計(jì)他們?nèi)齻€(gè)人的總分,這時(shí)怎么做呢片仿?
####什么時(shí)候需要函數(shù)的返回值纹安?
當(dāng)函數(shù)執(zhí)行完畢能得出一個(gè)結(jié)果,但是函數(shù)內(nèi)部不知道怎么正確地處理這個(gè)結(jié)果砂豌,恰好這個(gè)結(jié)果又是調(diào)用者想用來(lái)得到的厢岂,就需要有函數(shù)的返回值!
####怎樣讓函數(shù)有返回值阳距?
1)確定要返回的值的類型
2)修改函數(shù)的返回值類型為你想要返回值的類型(如將之前的void改為int)
3)在函數(shù)內(nèi)使用 return
表達(dá)式
返回
####調(diào)用者如何拿到函數(shù)返回的數(shù)據(jù)塔粒?
申明一個(gè)與函數(shù)返回值相同類型的變量,并將返回值賦值給這個(gè)變量就可以了
####函數(shù)的其他注意點(diǎn):
1)如果函數(shù)有返回值筐摘,調(diào)用者可以接收卒茬,也可以不接收。但如接收咖熟,需要準(zhǔn)備對(duì)應(yīng)的類型來(lái)接收
2)void 代表沒(méi)有返回值圃酵,如果一個(gè)函數(shù)返回值是void的,調(diào)用者不需要接收馍管。如果強(qiáng)行接收會(huì)報(bào)錯(cuò)
3)返回的數(shù)據(jù)類型要與函數(shù)定義的返回值類型一致郭赐,如果不一致,會(huì)先將所返回的值轉(zhuǎn)換成定義的返回值類型再返回
4)如果函數(shù)定義了返回值咽斧,并且函數(shù)體里面有多個(gè)分支堪置,那么每個(gè)分支都必須要有返回值,否則會(huì)報(bào)錯(cuò)
###九张惹、【掌握】函數(shù)的申明
####1舀锨、為什么需要對(duì)函數(shù)進(jìn)行申明
編譯器很笨,只會(huì)從上到下依次將代碼翻譯成計(jì)算機(jī)可以識(shí)別的二進(jìn)制指令宛逗,所以如果當(dāng)函數(shù)的申明寫在它被調(diào)用之后坎匿,編譯器會(huì)報(bào)錯(cuò)!
為了解決這個(gè)問(wèn)題雷激,所以如果函數(shù)的實(shí)現(xiàn)寫在調(diào)用語(yǔ)句后面的話則需要先對(duì)函數(shù)進(jìn)行申明替蔬。代表告訴編譯器:有這個(gè)函數(shù),你只管編譯就好屎暇!
####2承桥、 完整的寫函數(shù)的兩個(gè)步驟
1). 函數(shù)的聲明
語(yǔ)法: 只寫函數(shù)頭 直接加1個(gè)分號(hào)結(jié)束.
作用: 告訴編譯器,這個(gè)函數(shù)是有的 只不過(guò)在后面.
2). 函數(shù)的實(shí)現(xiàn)(定義)
和我們之前講的函數(shù)的定義是一樣的.
表示真正的來(lái)實(shí)現(xiàn)這個(gè)函數(shù).
####3、函數(shù)申明的幾點(diǎn)注意
1). 如果被調(diào)用的函數(shù)在主調(diào)用函數(shù)之前,那么被調(diào)用函數(shù)可以不寫聲明直接寫實(shí)現(xiàn)
一般情況下,main函數(shù)是放在最前面的. 所以我們自定義的函數(shù)要在最前面寫聲明根悼,在后面寫實(shí)現(xiàn).

2). 函數(shù)的聲明可以在任意的地方但是至少應(yīng)該在函數(shù)調(diào)用之前聲明
即使是這樣. 但是一般情況下 函數(shù)的聲明我們都放在#include指令之后.
3). 函數(shù)的聲明必須要與函數(shù)實(shí)現(xiàn)的函數(shù)頭一樣,否則會(huì)出問(wèn)題.
所以,我們建議大家 先寫函數(shù)的實(shí)現(xiàn) 然后將函數(shù)實(shí)現(xiàn)的頭拷貝聲明.

4). 聲明函數(shù)的時(shí)候形參可以只寫類型不寫名稱

5). 如果函數(shù)的返回值類型是int類型的那么可以省略函數(shù)聲明
但是為了更好的代碼可移植性 以及可閱讀性十分的建議還是要把聲明寫上.

###十凶异、【掌握】函數(shù)的其他注意
1蜀撑、值傳遞:是指實(shí)參給形參賦值,傳遞的永遠(yuǎn)是值剩彬,而非實(shí)參的內(nèi)存空間(以后學(xué)指針后可以把空間地址傳過(guò)去)酷麦,所以在函數(shù)里給形參重新賦值不會(huì)影響到實(shí)參。
2喉恋、C語(yǔ)言中函數(shù)沒(méi)有重載沃饶。即:C語(yǔ)言中的函數(shù)不允許出現(xiàn)函數(shù)同名的情況,否則編譯器會(huì)報(bào)錯(cuò)
3轻黑、函數(shù)內(nèi)部不能定義一個(gè)新的函數(shù)糊肤,但是可以在函數(shù)內(nèi)部再調(diào)用函數(shù)
###十一【理解】函數(shù)練習(xí)
1. 寫1個(gè)函數(shù) 返回兩個(gè)整型數(shù)中的最大值.
2. 寫1個(gè)函數(shù),傳入1個(gè)人的年齡,判斷年齡是否成年
附加題:
1. 寫1個(gè)函數(shù),返回1個(gè)浮點(diǎn)數(shù)的四舍五入的整數(shù)
2.寫1個(gè)函數(shù),用來(lái)判斷3個(gè)整數(shù)的最大值苔悦,這個(gè)函數(shù)只能傳兩個(gè)參數(shù)
即申明成右邊的格式:int getMax(int num1,int num2);
###十二【理解】#include指令
####1轩褐、#include是一個(gè)預(yù)處理指令
#####1) 什么是與處理指令?
就是在源代碼編譯之前進(jìn)行的一系列操作玖详。其中預(yù)處理指令包含:文件包含、宏定義勤讽、條件編譯指令 等等
預(yù)處理指令的特點(diǎn):
A蟋座、所有的預(yù)處理指令都是以#開頭
B、沒(méi)有分號(hào)
C脚牍、在編譯之前執(zhí)行
##### 2)#include指令是一條文件包含預(yù)處理指令
作用:將指定文件的內(nèi)容拷貝到寫這條#include指令的地方
語(yǔ)法:
include "文件名稱"
include <文件名稱>
例:

使用注意:
1)被包含的文件里面的內(nèi)容必須符合C語(yǔ)言語(yǔ)法規(guī)范向臀,否則即使包含進(jìn)來(lái),編譯的時(shí)候也會(huì)報(bào)錯(cuò)诸狭!

2)如果要包含的文件就在當(dāng)前寫#include指令文件的同一目錄券膀,則包含路徑可以省略,只寫文件名驯遇。
例:

###2芹彬、#include指令的搜索順序
分兩種情況:
1)#include
"文件名稱"
a、如果指定了全路徑叉庐,則直接去對(duì)應(yīng)的路徑查找文件
b舒帮、如果沒(méi)有指定全路徑,則先去當(dāng)前代碼文件所在文件夾里查找陡叠,如果有就包含玩郊,沒(méi)有的話就會(huì)再去Xcode的編譯器目錄下去查找是否有這個(gè)文件,如果有則直接包含進(jìn)來(lái)枉阵,如果這時(shí)還沒(méi)有译红,則報(bào)錯(cuò)
Xcode編譯器目錄
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include
2)#include <文件名稱>
直接去Xcode編譯器目錄去查找這個(gè)文件,如果有就包含進(jìn)來(lái)兴溜,如果沒(méi)有就報(bào)錯(cuò)
###3侦厚、 #include<stdio.h>的分析
我們學(xué)過(guò)函數(shù)后知道反璃,如果要調(diào)用某個(gè)函數(shù),必須在調(diào)用之前對(duì)這個(gè)函數(shù)進(jìn)行申明假夺,而之前我們所用的printf("") scanf("")都是函數(shù)淮蜈,只不過(guò)這些是系統(tǒng)給我們寫好的函數(shù),如果沒(méi)有進(jìn)行申明直接調(diào)用會(huì)報(bào)錯(cuò)已卷,
所以我們需要對(duì)其進(jìn)行申明梧田,而這些函數(shù)申明的內(nèi)容,都包含在蘋果為我們提供的Xcode編譯器里的各種文件里了侧蘸,我們只要用#include指令包含進(jìn)來(lái)就行了裁眯!
###4、#include規(guī)范
如果是我們自己寫的文件讳癌,放在代碼文件里穿稳,并且用""包含
如果是編譯器提供的頭文件,則用<>包含
###十三【掌握】多文件開發(fā)
思考:實(shí)現(xiàn)微信搖一搖有哪些功能步驟晌坤?
我們實(shí)際開發(fā)中的項(xiàng)目逢艘,基本都是團(tuán)隊(duì)協(xié)作開發(fā),每人負(fù)責(zé)一個(gè)模塊(功能)骤菠,這樣比較利于項(xiàng)目的快速開發(fā)它改。
案例:
模塊:數(shù)學(xué)功能
將1個(gè)功能模塊的函數(shù)應(yīng)該單獨(dú)的寫在1個(gè)文件之中. 每1個(gè)模塊1個(gè)文件.
新建1個(gè).c文件.在這個(gè).c文件之中寫上相關(guān)的函數(shù). 在要調(diào)用的地方, 先聲明函數(shù)以后才能調(diào)用.
這么做可能存在的問(wèn)題:
1). 如果寫模塊的人 新增了1個(gè)函數(shù) 那么調(diào)用者就還要去聲明這個(gè)函數(shù).
2). 如果寫模塊的人 改了函數(shù)不通知調(diào)用者的話 也會(huì)出問(wèn)題.
正確的做法:
1). 寫模塊的人寫兩個(gè)文件 .c文件 .h文件. header頭文件.
.h文件中寫這個(gè)模塊中的函數(shù)的聲明.
.c文件中寫這個(gè)模塊中的函數(shù)的實(shí)現(xiàn).
2). 調(diào)用模塊功能的人 只需要包含頭文件就可以 調(diào)用模塊中的函數(shù).
4. 模塊.
1個(gè)模塊至少包含2個(gè)文件
.h文件
.c文件
###十四【理解】抽查問(wèn)題
1商乎、為什么需要使用函數(shù)央拖?
2、函數(shù)的基本格式
3鹉戚、全局變量和局部變量有什么不同鲜戒?
4、return抹凳、break遏餐、continue的異同
5、給形參重新賦值會(huì)影響實(shí)參嗎
6却桶、函數(shù)內(nèi)部可以再定義一個(gè)函數(shù)嗎境输?
7、函數(shù)可以重名嗎颖系?
8嗅剖、#include的本質(zhì)是什么?
9嘁扼、#include后面使用""和使用<>有什么不同信粮?