随笔1:程序
什么是程序?
軟件還包括數(shù)據(jù)和文檔;軟件=程序+數(shù)據(jù)+文檔;
輸入設(shè)備:鍵盤(pán)鼠標(biāo);輸出設(shè)備:顯示器;存儲(chǔ)器:存代碼和設(shè)備;CPU(中央處理器):控制器(控制存取的一些指令層)和運(yùn)算器(進(jìn)行數(shù)據(jù)的處理);計(jì)算機(jī)把可執(zhí)行的代碼通過(guò)輸入設(shè)備讀到內(nèi)存里,然后CPU來(lái)運(yùn)行這些代碼,讀取這些相關(guān)的輸入數(shù)據(jù),然后再把這個(gè)計(jì)算出來(lái)的輸出數(shù)據(jù)輸出完成程序的預(yù)定功能。
CPU:相當(dāng)于人的大腦;存儲(chǔ)器:是一種記憶裝置;輸入輸出設(shè)備:相當(dāng)于人的眼睛和耳朵。
11/5=2;11.0/5=2.2;浮點(diǎn)數(shù)可以做除法運(yùn)算)但是求余比較特殊:只能用整數(shù)作為他的操作數(shù),也就是兩個(gè)數(shù)求余這兩個(gè)數(shù)必須是整數(shù)。
?
scanf("%lf",&a);//后邊為什么是取地址,因?yàn)槭亲x入函數(shù),我讀入a的值你要告訴我往哪存儲(chǔ)啊,所以告訴我一個(gè)地址。
程序中直接使用的常數(shù),稱為幻數(shù)。(我們不提倡直接在程序當(dāng)中直接使用常數(shù)的,因?yàn)槎啻涡薷幕蛘叨嗵幮薷目赡軙?huì)出錯(cuò)。)
解決辦法就是把這個(gè)幻數(shù)定義為常量,宏常量;或者說(shuō)是const常量。
宏常量定義:
#define 標(biāo)識(shí)符 字符串//標(biāo)識(shí)符是定義的宏常量的宏名,字符串是那個(gè)值
在程序中使用宏替換。
定義為const常量:?
單精度賦值給雙精度浮點(diǎn)數(shù):
?
雙精度浮點(diǎn)數(shù)賦值給單精度浮點(diǎn)數(shù):
雙精度浮點(diǎn)數(shù)他的精度高,也就是他的小數(shù)占的位數(shù)多,有效數(shù)字位數(shù)多;如果說(shuō)你的雙精度浮點(diǎn)數(shù)有效位數(shù)很多,你現(xiàn)在賦值給單精度,單精度浮點(diǎn)數(shù)他的有效位數(shù)不會(huì)超過(guò)7,所以多余的那些小數(shù)位信息就丟失了。
比如是一個(gè)雙精度的實(shí)型常數(shù),雙精度實(shí)型常數(shù)你賦值給雙精度實(shí)型變量,所以這個(gè)結(jié)果不會(huì)有問(wèn)題,精度不會(huì)損失;但是你把一個(gè)雙精度實(shí)型常量賦值給一個(gè)單精度實(shí)型的變量,因?yàn)?span style="color:#f33b45;">單精度實(shí)型變量他的有效位數(shù)不會(huì)超過(guò)7,那你多余的超過(guò)7位之后的那些數(shù)字,雖然也輸出了但是他是不可靠的,所以發(fā)生有精度損失。
解決辦法:用類型強(qiáng)轉(zhuǎn)可以消除類型轉(zhuǎn)換的警告。(意思就是把表達(dá)式的值轉(zhuǎn)換成你希望得到的那個(gè)類型)
//轉(zhuǎn)換方法
(類型)表達(dá)式;//把這個(gè)表達(dá)式的值轉(zhuǎn)換成我希望的類型
注意:類型強(qiáng)轉(zhuǎn)并不改變后面的這個(gè)變量的類型,他只是把變量的值轉(zhuǎn)換成你指定的這個(gè)類型,但是變量的類型并沒(méi)有改變,所以x的類型并沒(méi)有變化。
兩個(gè)整數(shù)相除得到的商只能是整數(shù),所以通過(guò)強(qiáng)轉(zhuǎn)來(lái)得到實(shí)數(shù):
此處雖然你的average聲明為實(shí)型而已,只不過(guò)是在后邊添加0而已。?
第一個(gè)輸出:m除2的結(jié)果是整數(shù)除法;
第二個(gè)輸出:是對(duì)m/2的結(jié)果進(jìn)行強(qiáng)轉(zhuǎn);因?yàn)榧恿艘粋€(gè)括號(hào),m/2的結(jié)果就是2,對(duì)2進(jìn)行強(qiáng)轉(zhuǎn)成flaot類型,只不過(guò)就是2.000000;
第三個(gè)輸出:是對(duì)m進(jìn)行強(qiáng)轉(zhuǎn),把5強(qiáng)轉(zhuǎn)成5.000000,之后與2進(jìn)行做除法就是2.5;
第四個(gè)輸出:驗(yàn)證m的值有沒(méi)有改變;沒(méi)有m的值打印出來(lái)還是5。
'\n'表示換行;如果加一個(gè)r‘\r’就表示回車(chē)不換行;回車(chē)不換行和換行的區(qū)別:輸出一行之后光標(biāo)停在末尾,如果用'\n'換一下行光標(biāo)移到下一行的起始位置;如果說(shuō)回車(chē)不換行的話,光標(biāo)移到依然是本行的起始位置,并不到下一行,再次輸出會(huì)把這一行給覆蓋掉。
以百分號(hào)開(kāi)始的是一個(gè)轉(zhuǎn)換說(shuō)明。
格式化輸出函數(shù):
前邊加上負(fù)號(hào)之后是左對(duì)齊,右補(bǔ)空格。
后邊是7位小數(shù),但是我們的f輸出只能輸出6位小數(shù),所以會(huì)對(duì)它進(jìn)行四舍五入取整。所以6位小數(shù)加上一個(gè)小數(shù)位再加上前面兩位,一共是占了9位,我們指定的寬度是10位,10大于你實(shí)際輸出的那個(gè)寬度,意味著我們要補(bǔ)空格,所以是右對(duì)齊左補(bǔ)空格。
自控制小數(shù)位數(shù):
實(shí)際寬度就是3位小數(shù),不需要補(bǔ)空格。
格式化輸入函數(shù):
輸出數(shù)據(jù)的時(shí)候是不區(qū)分單精度和雙精度都是%f,輸入數(shù)據(jù)的時(shí)候就要區(qū)分了,單精度實(shí)型就要%f,雙精度實(shí)型就要在f的前邊加上一個(gè)小寫(xiě)的字母l,即%lf。
提問(wèn):為什么用%lf來(lái)讀入雙精度實(shí)型數(shù),而用%f來(lái)輸出呢?
解釋:在調(diào)用可變長(zhǎng)度參數(shù)表的時(shí)候,這個(gè)編譯器會(huì)將單精度實(shí)型自動(dòng)轉(zhuǎn)化為double雙精度實(shí)型,所以這個(gè)printf沒(méi)有辦法區(qū)分這個(gè)是單精度還是雙精度的實(shí)型,因?yàn)樗褑尉葘?shí)型自動(dòng)轉(zhuǎn)化為雙精度實(shí)型來(lái)輸出;為什么輸入的時(shí)候就要指定單精度還是雙精度了呢?這是因?yàn)閟canf它后邊的不是一個(gè)輸出項(xiàng)表,而是一個(gè)輸入地址表,要指定的地址,就是我輸入某一個(gè)變量,我必須要指定這個(gè)變量的地址,所以它是通過(guò)這個(gè)地址來(lái)指向這個(gè)變量的,就是你輸入這個(gè)變量要存在哪里,它必須去指定這個(gè)地址,所以指定這個(gè)地址從這個(gè)起始地址開(kāi)始存的時(shí)候,那他必定要知道這個(gè)類型是什么,因?yàn)椴煌念愋退趦?nèi)存里邊占的字節(jié)數(shù)是不一樣的,所以說(shuō),你既然指定了地址,那我必須得知道你占多少個(gè)字節(jié),所以必須要知道他是什么類型,所以這個(gè)時(shí)候它能夠區(qū)分單精度還是雙精度,因?yàn)檎嫉淖止?jié)數(shù)可能是不一樣的;?
在第三個(gè)圖中,前邊有3個(gè)格式字符,但是我們的后面有兩個(gè)輸入項(xiàng),那中間輸入的數(shù)據(jù)哪去了呢?因?yàn)槲覀兗尤肓?號(hào),所以他讀入的數(shù)據(jù)被跳過(guò)了;從鍵盤(pán)輸入123456(中間是沒(méi)有空格的,他怎么沒(méi)有把他識(shí)別為一個(gè)數(shù)據(jù)呢?因?yàn)槲覀冎虚g使用了位寬的修飾符,所以有了位寬的修飾符它會(huì)自動(dòng)從你輸入的數(shù)據(jù)里面按照指定的位寬來(lái)截取輸入的數(shù)據(jù),像%2d我們就從輸入數(shù)據(jù)里面,截取兩個(gè)字符寬度的數(shù)據(jù)12賦值給a;然后又一個(gè)%2d,再截取兩個(gè)字符的寬度34,但是34沒(méi)有賦值給b,因?yàn)榍斑呌幸粋€(gè)*號(hào),他把這個(gè)輸入的數(shù)據(jù)項(xiàng)給跳過(guò)去了;然后再有一個(gè)%2d,這個(gè)56讀入送給b。所以最后輸出的是什么呢?因?yàn)橹虚g項(xiàng)被跳過(guò)了,輸出結(jié)果如上第三個(gè)圖)
??如果說(shuō)中間有了一個(gè)逗號(hào),意味著我們要以逗號(hào)作為分隔符,來(lái)分割這個(gè)輸入數(shù)據(jù)了。總結(jié)一下有幾種情況認(rèn)為輸入數(shù)據(jù)結(jié)束了。?
第一種情況:空格。(輸入一個(gè)數(shù)據(jù)按一個(gè)空格)Tab(也可以是輸入一個(gè)數(shù)據(jù)按一下tab鍵)回車(chē)(或者輸入一個(gè)數(shù)據(jù)按一個(gè)回車(chē)再輸入下一個(gè)數(shù)據(jù))(剛才那個(gè)什么也沒(méi)有輸入是因?yàn)槲覀冎付宋粚?#xff09;
第二種情況:達(dá)到輸出位寬。
第三種情況:遇到非法字符。(本來(lái)應(yīng)該輸入1234,可是我輸入123又輸入一個(gè)非法字符a,按回車(chē)鍵他真正讀進(jìn)去的是123,到a就認(rèn)為這個(gè)輸入數(shù)據(jù)結(jié)束了)
?scanf里邊寫(xiě)什么字符就得原樣輸入什么,但是換行不要輸入。
b里邊的數(shù)據(jù)沒(méi)有正確讀入,所以顯示的就是亂碼。
這個(gè)數(shù)據(jù)從鍵盤(pán)讀入內(nèi)存,他并不是直接讀入內(nèi)存的,而是中間經(jīng)過(guò)一個(gè)輸入緩沖區(qū),先把這個(gè)輸入數(shù)據(jù)存到輸入緩沖區(qū)里邊,然后才從輸入緩沖區(qū)里邊來(lái)把他讀到內(nèi)存里邊;也就是說(shuō)用戶從鍵盤(pán)輸入的時(shí)候,他并不是直接來(lái)讀用戶的輸入,來(lái)賦值給這個(gè)變量,存到這個(gè)變量指定的地址當(dāng)中去的,而是把用戶的輸入放到緩沖區(qū)里邊,然后我再?gòu)木彌_區(qū)里邊讀取這個(gè)數(shù)據(jù);也就是說(shuō)你前一個(gè)輸入函數(shù),沒(méi)有讀走的這個(gè)數(shù)據(jù),他可能仍然在緩沖區(qū)里邊,那有可能就被下一個(gè)輸入函數(shù)給讀取,所以說(shuō)你要遇到一些中間多輸入的一些數(shù)據(jù),這些數(shù)據(jù)可能會(huì)留在緩沖區(qū)里邊,由下一個(gè)函數(shù)來(lái)讀。
單個(gè)字符是單引號(hào);
總結(jié)
- 上一篇: PCL点云处理算法目录
- 下一篇: CloudComparer点云处理软件