1.算數(shù)函數(shù)
成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,先為子洲等服務(wù)建站,子洲等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為子洲企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
1.1產(chǎn)生隨機(jī)數(shù)
rand()
1.2取絕對(duì)值
fabs()
1.3取復(fù)數(shù)的絕對(duì)值
cabs(struct complex i)
1.4浮點(diǎn)數(shù)的絕對(duì)值
fabs()/fabsf()/fabsl()
1.5取余
fmod(double, double)
1.6向上取整
ceil()/ceilf()/ceill()
1.7向下取整
floor()/floorf()/floorl()
1.8求最大值
fmax()/fmaxf()/fmaxl()
1.9求最小值
fmin()/fminf()/fminl()
1.10四舍五入
round()/roundf()/roundl()
2.指數(shù)與對(duì)數(shù)
2.1求 n 的 m 次方的值
pow(n, m)/powf(n, m)/powl(n, m)
2.2求 e 的 x 次方
exp(x)/expf(x)/expl(x)
2.3以 e 為底的對(duì)數(shù)值
log()/logf()/logl()
2.4以10為底的對(duì)數(shù)
log10()/log10f()/log10l()
2.5開(kāi)平方(根號(hào))
sqrt()
3.三角函數(shù)
3.1正弦值
sin()/sinf()/sinl()
3.2余弦值
cons()/cosf()/cosl()
3.3正切值
tan()/tanf()/tanl()
3.4雙曲線正弦值
sinh()/sinhf()/sinhl()
3.5雙曲線余弦值
cosh()/coshf()/coshl()
3.4雙曲線正切值
tanh()/tanhf()/tanhl()
4.反三角函數(shù)
4.1反正弦值
asin()/asinf()/asinl()
4.2反余弦值
acos()/acosf()/acosl()
4.3反正切值
atan()/atanf()/atanl()
4.4反雙曲線正弦值
asinh()/asinhf()/asinhl()
4.5反雙曲線余弦值
acosh()/acoshf()/acoshl()
4.6反雙曲線正切值
atanh()/atanhf()/atanhl()
我自學(xué)C語(yǔ)言的時(shí)候的筆記只記程序,然后在程序旁邊寫(xiě)下程序中新學(xué)的知識(shí),比如
剛學(xué)的時(shí)候
#include stdio.h
main()
{
printf("Hello!");
}
每個(gè)C程序的基本格式是:
#include stdio.h
main()
{
printf("Hello!");
}
后來(lái)學(xué)到
#include stdio.h
main()
{
int x;-----要用的變量,先聲明,
x=1;
printf("x=%d",x);----^.....
}
如此類推了,這樣不了解就可以運(yùn)行程序式式,我自己感覺(jué)還不錯(cuò),就是有時(shí)候,要寫(xiě)太多了.
成員表列由若干個(gè)成員組成,每個(gè)成員都是該結(jié)構(gòu)的一個(gè)組成部分。
對(duì)每個(gè)成員也必須做類型聲明。
其形式為:
類型聲明符 成員名;
例如:
注意, 最后括號(hào)外面的;分號(hào)是不可少的 。
結(jié)構(gòu)定義之后,才可以進(jìn)行變量聲明。
凡聲明為結(jié)構(gòu) stu 的變量都由上述4個(gè)成員組成。
由此可見(jiàn),結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類型,是數(shù)目固定,類型不同的若干有序變量的集合。
聲明結(jié)構(gòu)變量 有以下三種方法。
使用上面定義的stu為例:
如:
也可以用宏定義使一個(gè)符號(hào)常量來(lái)表示一個(gè)結(jié)構(gòu)類型。例如:
例如:
這種形式的聲明的一般形式為:
例如:
這種聲明的一般形式為:
第三種方法與第二種方法的區(qū)別在于第三種方法中省去了結(jié)構(gòu)名,而直接給出結(jié)構(gòu)變量。
在程序中使用結(jié)構(gòu)變量時(shí),往往不把她作為一個(gè)整體來(lái)使用。
在ANSI C中除了允許有相同類型的結(jié)構(gòu)變量相互賦值以外,一般對(duì)結(jié)構(gòu)變量的使用,包括 賦值、輸入、輸出、運(yùn)算 等都是通過(guò)結(jié)構(gòu)變量的成員來(lái)實(shí)現(xiàn)的。
表示結(jié)構(gòu)變量成員的一般形式為:
結(jié)構(gòu)變量名.成員名
例如: boy1.num boy2.sex
如果成員本身又是一個(gè)結(jié)構(gòu),則必須逐級(jí)找到最低級(jí)的成員才能使用。如: boy1.birthday.month
結(jié)構(gòu)變量的賦值就是給各成員賦值。
數(shù)組的元素也可以是結(jié)構(gòu)類型的。
因此可以構(gòu)成結(jié)構(gòu)型數(shù)組。
初始化賦值:
當(dāng)然也可以在定義 stu結(jié)構(gòu) 時(shí)同時(shí)聲明 pstu。
賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量。
如果 boy 是被聲明為 stu類型 的結(jié)構(gòu)變量。
則:
有了結(jié)構(gòu)指針變量,就能更方便地訪問(wèn)結(jié)構(gòu)變量的各個(gè)成員。
其訪問(wèn)的一般形式為:
(*結(jié)構(gòu)指針變量).成員名
或
結(jié)構(gòu)指針變量-成員名
例如: (*pstu).num 或 pstu-num
例如:
介紹數(shù)組的時(shí)候,曾介紹過(guò)數(shù)組的長(zhǎng)度是預(yù)先定義好的,在整個(gè)程序中固定不變。
C語(yǔ)言中不允許動(dòng)態(tài)數(shù)組類型。
例如:
但是又有此需求,為了解決這個(gè)問(wèn)題,C語(yǔ)言提供了一些內(nèi)存管理函數(shù),這些內(nèi)存管理函數(shù)可以按需要?jiǎng)討B(tài)地分配內(nèi)存空間,也可把不再使用的空間回收待用,為有效地利用內(nèi)存資源提供了手段。
常用的內(nèi)存管理函數(shù)有3個(gè):
例子:分配一塊區(qū)域,輸入一個(gè)學(xué)生數(shù)據(jù)
上面的例子采用了動(dòng)態(tài)分配的辦法為一個(gè)結(jié)構(gòu)分配內(nèi)存空間。
每一次分配一塊空間可用來(lái)存放一個(gè)學(xué)生的數(shù)據(jù),我們可稱之為一個(gè)節(jié)點(diǎn)。
有多少個(gè)學(xué)生就應(yīng)該申請(qǐng)分配多少塊內(nèi)存空間,也就是說(shuō)要建立多少個(gè)節(jié)點(diǎn)。
當(dāng)然用結(jié)構(gòu)數(shù)組也可以完成上述工作,但如果預(yù)先不能準(zhǔn)確把握學(xué)生人數(shù),也就無(wú)法確定數(shù)組大小。
而且當(dāng)學(xué)生留級(jí)、退學(xué)之后也不能把該元素占用的空間從數(shù)組中釋放出來(lái)。
用動(dòng)態(tài)存儲(chǔ)的方法可以很好地解決這些問(wèn)題。
有一個(gè)學(xué)生就分配一個(gè)節(jié)點(diǎn),無(wú)須預(yù)先確定學(xué)生的準(zhǔn)確人數(shù),某學(xué)生退學(xué),可刪去該節(jié)點(diǎn),并釋放該節(jié)點(diǎn)占用的存儲(chǔ)空間,從而節(jié)約了寶貴的內(nèi)存資源。
另一方面,用數(shù)組的方法必須占用一塊連續(xù)的內(nèi)存區(qū)域。
而使用動(dòng)態(tài)分配時(shí),每個(gè)節(jié)點(diǎn)之間可以是不連續(xù)的(節(jié)點(diǎn)內(nèi)是連續(xù)的)。
節(jié)點(diǎn)之間的關(guān)系可以用指針實(shí)現(xiàn)。
即在節(jié)點(diǎn)結(jié)構(gòu)中定義一個(gè)成員項(xiàng)來(lái)存放下一節(jié)點(diǎn)的首地址,這個(gè)用于存放地址的成員,常把他稱為指針域。
可在第一個(gè)節(jié)點(diǎn)的指針域內(nèi) 存入第二個(gè)節(jié)點(diǎn)的首地址,在第二個(gè)節(jié)點(diǎn)的指針域內(nèi) 又存入第三個(gè)節(jié)點(diǎn)的首地址,如此串聯(lián)下去直到最后一個(gè)節(jié)點(diǎn)。
最后一個(gè)節(jié)點(diǎn)因無(wú)后續(xù)節(jié)點(diǎn)連接,其指針域可賦值 0
這種連接方式,在數(shù)據(jù)結(jié)構(gòu)中稱為“鏈表”。
鏈表的基本操作主要有以下幾種:
例子:建立一個(gè)三個(gè)節(jié)點(diǎn)的鏈表,存放學(xué)生數(shù)據(jù)。為簡(jiǎn)單起見(jiàn),我們假定學(xué)生數(shù)據(jù)結(jié)構(gòu)中只有學(xué)號(hào)和年齡兩項(xiàng)??删帉?xiě)一個(gè)建立鏈表的函數(shù)create。程序如下:
create函數(shù) 用于建立一個(gè)有 n個(gè)節(jié)點(diǎn) 的鏈表,他是一個(gè)指針函數(shù),他返回的指針指向 stu結(jié)構(gòu)。
在create函數(shù)內(nèi)定義了三個(gè) stu結(jié)構(gòu) 的指針變量。
head為頭指針,pf為指向兩相鄰節(jié)點(diǎn)的前一節(jié)點(diǎn)的指針變量。
pb為后一節(jié)點(diǎn)的指針變量。
枚舉是一種 基本數(shù)據(jù)類型 ,而不是一種 構(gòu)造類型 ,因?yàn)樗荒茉俜纸鉃槿魏位绢愋汀?/p>
enum 枚舉名{ 枚舉值表 };
例如: enum weekday { sun,mou,tue,wed,thu,fri,sat };
enum weeakday a,b,c;
或者為:
enum weekday { sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者為:
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
例子:
說(shuō)明:
只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量。如:
a=sun;b=mon; 是正確的
a=0;b=1; 是錯(cuò)誤的。
如果一定要把數(shù)值賦予枚舉變量,則必須使用強(qiáng)制類型轉(zhuǎn)換。
如: a=(enum weekday)2;
還應(yīng)該說(shuō)明的是枚舉元素不是字符常量也不是字符串常量,使用時(shí)不要加單、雙引號(hào)。
例子:
typedef定義的一般形式為:
typedef 原類型名 新類型名
其中原類型名中含有定義部分,新類型名一般用大寫(xiě)表示,一般用大寫(xiě)表示,以便于區(qū)別。
有時(shí)也可用 宏定義 來(lái)代替 typedef 功能,但是 宏定義 是由 預(yù)處理 完成的,而 typedef 則是 在編譯時(shí) 完成的,后者更為靈活方便。
使用 typedef 定義數(shù)組、指針、結(jié)構(gòu)等類型將帶來(lái)很大的方便,不僅使書(shū)寫(xiě)簡(jiǎn)單而且使意義更加明確,因而增強(qiáng)了可讀性。
例如:
又如:
學(xué)習(xí)任何知識(shí),循序漸進(jìn)總是最好的方式。不幸的是,很多人明知這個(gè)道理,卻總是想走所謂的捷徑。如果你是一個(gè)剛剛開(kāi)始學(xué)習(xí)編程的中學(xué)生,或者你是一個(gè)剛剛進(jìn)入計(jì)算機(jī)學(xué)院的本科生,又或者你是一個(gè)決心在計(jì)算機(jī)領(lǐng)域有所建樹(shù)的初學(xué)者,你一定迫切地想知道,學(xué)習(xí)計(jì)算機(jī)技術(shù),究竟應(yīng)該從哪里下手。
我的建議是:數(shù)學(xué)、英語(yǔ)、C語(yǔ)言。
數(shù)學(xué)和英語(yǔ)的重要性已經(jīng)不需要我來(lái)強(qiáng)調(diào),大家也許從幼兒園就開(kāi)始學(xué)習(xí)它們了,請(qǐng)時(shí)刻把它們放在最重要的位置,無(wú)論你是否學(xué)習(xí)計(jì)算機(jī)。
為什么C語(yǔ)言如此重要?我們從學(xué)習(xí)方法開(kāi)始說(shuō)起。書(shū)本上描述的東西,倘若不經(jīng)過(guò)我們的親自實(shí)踐,是難以被徹底消化吸收的。計(jì)算機(jī)組成原理講解了浮點(diǎn)數(shù)的格式,如果我們能看到并分析內(nèi)存或寄存器中某個(gè)浮點(diǎn)數(shù)的表示,那比單純的紙上談兵要強(qiáng)一千倍;數(shù)據(jù)結(jié)構(gòu)與算法似乎很難,如果你能把書(shū)上的例子實(shí)現(xiàn)出來(lái),然后把習(xí)題做完,只需啃完一本好書(shū),你也可以是算法高手;操作系統(tǒng)原理其實(shí)不僅僅是原理,只有做一些內(nèi)核方面的實(shí)驗(yàn)才能真正有深刻理解;還有許多新潮的技術(shù),比如JavaEE、PHP、Ajax、.NET等等等等,很多高手學(xué)習(xí)這些技術(shù)只需要很短的時(shí)間,不必說(shuō),他們肯定是C語(yǔ)言的高手。C語(yǔ)言幾乎是一切計(jì)算機(jī)技術(shù)的通用工具,包括計(jì)算機(jī)的各種基本理論。沒(méi)有精通C語(yǔ)言的決心,就不要涉足計(jì)算機(jī)領(lǐng)域。
為什么是C語(yǔ)言而不是C++不是Java不是其它?因?yàn)镃語(yǔ)言最簡(jiǎn)單。你需要掌握一個(gè)語(yǔ)言工具,但也許并不需要“面向?qū)ο蟆?、“模板”、“函?shù)重載”等等一大堆概念。C語(yǔ)言足夠低級(jí),非常非常地貼近計(jì)算機(jī)的底層結(jié)構(gòu),不會(huì)讓你迷失在概念的汪洋大海。除了“指針”,C語(yǔ)言沒(méi)有真正意義上的難點(diǎn),而“指針”,恰恰是理解計(jì)算機(jī)底層結(jié)構(gòu)精髓的關(guān)鍵所在。
不必思考應(yīng)該學(xué)什么,等把C語(yǔ)言精通了,你自己便會(huì)知道下一步如何去走。如果你對(duì)操作系統(tǒng)內(nèi)部感興趣,你便可以試著研究一下Unix的內(nèi)核,除了C語(yǔ)言,你還需要一些匯編語(yǔ)言和保護(hù)模式的知識(shí);如果你對(duì)算法感興趣,那么恭喜你,C語(yǔ)言足夠使用了;如果你對(duì)Windows編程感興趣,去看看《Windows程序設(shè)計(jì)》吧,作者清楚的告訴你“只需要C語(yǔ)言的基礎(chǔ)”;如果你對(duì)任何其它語(yǔ)言感興趣,盡管去學(xué)吧,不過(guò)還是建議先學(xué)C++,因?yàn)槟阈枰恍懊嫦驅(qū)ο蟆钡闹R(shí)。
學(xué)習(xí)C語(yǔ)言不是一朝一夕的事情,但也不需要花費(fèi)十年時(shí)間才能精通。如何以最小的代價(jià)學(xué)習(xí)并精通C語(yǔ)言是本文的主題。請(qǐng)注意,即使是“最小的代價(jià)”,也絕不是什么捷徑,而是以最短的時(shí)間取得最多的收獲,同時(shí)也意味著你需要經(jīng)歷艱苦的過(guò)程。
一、要讀就讀好書(shū),否則不如不讀
所有初學(xué)者面臨的第一個(gè)問(wèn)題便是:如何選擇教材。好的開(kāi)始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會(huì)幫你指定一本很差勁的C語(yǔ)言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語(yǔ)言程序設(shè)計(jì)》,據(jù)說(shuō)發(fā)行量有超過(guò)400萬(wàn),據(jù)我所知,很多學(xué)校都會(huì)推薦這本書(shū)作為C語(yǔ)言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無(wú)比堅(jiān)定地黑他這本書(shū)的。這本書(shū)不是寫(xiě)給計(jì)算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計(jì)算機(jī)等級(jí)考試的其它專業(yè)學(xué)生看的。這本書(shū)的主要缺點(diǎn)是:例子程序非常不專業(yè),不能教給你程序設(shè)計(jì)應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓茫瑫?huì)讓你養(yǎng)成亂寫(xiě)代碼的惡習(xí);錯(cuò)誤太多,曾經(jīng)有人指出過(guò)這本書(shū)的上百個(gè)錯(cuò)誤,其中不乏關(guān)鍵的概念性錯(cuò)誤。好了,這本書(shū)我也不想說(shuō)太多了,有興趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計(jì)語(yǔ)言》)堪稱經(jīng)典中的經(jīng)典,不過(guò)舊版的很多內(nèi)容都已過(guò)時(shí),和現(xiàn)在的標(biāo)準(zhǔn)C語(yǔ)言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書(shū),也沒(méi)有辦法面面俱到,所以手邊常備一本《C語(yǔ)言參考手冊(cè)》是十分必要的。《C語(yǔ)言參考手冊(cè)》就是《C Reference Manual》,是C語(yǔ)言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫(kù)函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語(yǔ)言的工具書(shū)。順便提一句,最新的《C程序設(shè)計(jì)語(yǔ)言》是根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語(yǔ)言參考手冊(cè)》描述的是C99標(biāo)準(zhǔn),二者可能會(huì)有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫(xiě)得也是相當(dāng)?shù)夭诲e(cuò),英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書(shū)的一個(gè)特點(diǎn)吧。不過(guò)這本書(shū)并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過(guò)C語(yǔ)言,有那么一些C語(yǔ)言的基礎(chǔ)但又不是很扎實(shí),那么你可以嘗試一下這本書(shū)。我相信,只要你理解了指針,C語(yǔ)言便不再神秘。
如果你已經(jīng)啃完了一本C語(yǔ)言教材,想要更進(jìn)一步,那么有兩本書(shū)你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊(cè)子,內(nèi)容非常非常地有趣。要注意一點(diǎn),這本書(shū)是二十多年前寫(xiě)成的,里面提到的很多C語(yǔ)言的缺陷都已被改進(jìn),不過(guò)能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書(shū)如其名,這本書(shū)頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡(jiǎn)歷上寫(xiě)“精通C語(yǔ)言”了。
切記一個(gè)原則,不要讀自己目前還看不懂的書(shū),那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識(shí)。此時(shí),你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書(shū)店尋找講述的這些內(nèi)容的書(shū)籍。把基礎(chǔ)知識(shí)補(bǔ)充完畢再回頭來(lái)學(xué)習(xí),才會(huì)真正的事半功倍。
前面弄的那個(gè)格式錯(cuò)亂了!所以重新弄了一遍,這次應(yīng)該沒(méi)問(wèn)題了!
(1)無(wú)參函數(shù)的定義一般形式:
類型說(shuō)明符 函數(shù)名()
{
類型說(shuō)明符
語(yǔ)句
}
例如: void Hello()
{
printf("Hello,world");
}
(2)有參函數(shù)的定義一般形式:
類型說(shuō)明符 函數(shù)名(形式參數(shù)表)
{
類型說(shuō)明符
語(yǔ)句
}
例如: int max(int a,int b)
{
if(ab)
return a;
else
return b;
}
其中類型說(shuō)明符指明了本函數(shù)的類型,函數(shù)的類型實(shí)際上是函數(shù)返回值的類型,它們通常是C語(yǔ)言的
基本數(shù)據(jù)類型.