C語(yǔ)言零基礎(chǔ)入門(mén)(1)
1. C語(yǔ)言簡(jiǎn)介
1.1 C語(yǔ)言發(fā)展史
C語(yǔ)言是一種廣泛使用的面向過(guò)程的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,既適合于系統(tǒng)程序設(shè)計(jì),又適合于應(yīng)用程序設(shè)計(jì)。C語(yǔ)言的發(fā)展歷程大致如圖1-1所示:
圖1-1 C語(yǔ)言的發(fā)展歷程
1.2 C語(yǔ)言的特點(diǎn)
C語(yǔ)言是一種通用的程序設(shè)計(jì)語(yǔ)言,語(yǔ)言本身簡(jiǎn)潔、靈活、表達(dá)能力強(qiáng),被廣泛用于系統(tǒng)軟件和應(yīng)用軟件的開(kāi)發(fā),并且具有良好的可移植性。
C語(yǔ)言的特點(diǎn)可概括如下:
(1)簡(jiǎn)潔、緊湊、靈活。C語(yǔ)言的核心內(nèi)容很少,只有32個(gè)關(guān)鍵字,9種控制語(yǔ)句;程序書(shū)寫(xiě)格式自由,壓縮了一切不必要的成分。
(2)表達(dá)方式簡(jiǎn)練、實(shí)用。C語(yǔ)言有一套強(qiáng)有力的運(yùn)算符,達(dá)44種,可以構(gòu)造出多種形式的表達(dá)式,用一個(gè)表達(dá)式就可以實(shí)現(xiàn)其他語(yǔ)言可能需要多條語(yǔ)句才能實(shí)現(xiàn)的功能。
(3)數(shù)據(jù)類(lèi)型豐富。數(shù)據(jù)類(lèi)型越多,數(shù)據(jù)的表達(dá)能力就越強(qiáng)。C語(yǔ)言具有多種數(shù)據(jù)類(lèi)型,如字符型、整型、實(shí)型、數(shù)組、指針、結(jié)構(gòu)體和共用體等,可以實(shí)現(xiàn)諸如鏈表、棧、隊(duì)列、樹(shù)等各種復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。其中的指針類(lèi)型使得參數(shù)的傳遞簡(jiǎn)單并且迅速,同時(shí)節(jié)省內(nèi)存空間。
(4)具有低級(jí)語(yǔ)言的特點(diǎn)。C語(yǔ)言具有與匯編語(yǔ)言相近的功能和描述方法,如地址運(yùn)算和二進(jìn)制數(shù)位運(yùn)算等,還可以對(duì)硬件端口等資源進(jìn)行直接操作,充分使用計(jì)算機(jī)的資源。C語(yǔ)言既具有高級(jí)語(yǔ)言便于學(xué)習(xí)和掌握的特點(diǎn),又具有機(jī)器語(yǔ)言或匯編語(yǔ)言對(duì)硬件的操作能力。因此,C語(yǔ)言既可以作為系統(tǒng)描述語(yǔ)言,又可以作為通用的程序設(shè)計(jì)語(yǔ)言。
(5)C語(yǔ)言是一種結(jié)構(gòu)化語(yǔ)言,適合于大型程序的模塊化設(shè)計(jì)。C語(yǔ)言提供了編寫(xiě)結(jié)構(gòu)化程序的基本控制語(yǔ)句,如if-else語(yǔ)句、switch語(yǔ)句、while語(yǔ)句和do-while語(yǔ)句等。C語(yǔ)言是函數(shù)的集合,函數(shù)是構(gòu)成C語(yǔ)言程序的基本單位,每個(gè)函數(shù)具有獨(dú)立的功能,函數(shù)之間通過(guò)參數(shù)傳遞數(shù)據(jù)。程序員可以編寫(xiě)自己的函數(shù)。同時(shí),不同操作系統(tǒng)的編譯器都為程序員提供了大量的標(biāo)準(zhǔn)庫(kù)函數(shù),如輸入/輸出函數(shù)、數(shù)學(xué)函數(shù)和字符串處理函數(shù)等。靈活地使用標(biāo)準(zhǔn)庫(kù)函數(shù)可以簡(jiǎn)化程序設(shè)計(jì),提高編寫(xiě)程序效率。
(6)各種版本的編譯器都提供了預(yù)處理命令和預(yù)處理程序。預(yù)處理擴(kuò)展了C語(yǔ)言的功能,提高了程序的可移植性,為大型程序的調(diào)試提供了方便。
(7)可移植性好。程序從一個(gè)環(huán)境不經(jīng)改動(dòng)或稍加改動(dòng)就可以移植到另一個(gè)完全不同的環(huán)境中運(yùn)行。這是因?yàn)闃?biāo)準(zhǔn)庫(kù)函數(shù)和預(yù)處理程序?qū)⒖赡艹霈F(xiàn)的與機(jī)器有關(guān)的因素與源程序分割開(kāi)來(lái),使得針對(duì)不同的計(jì)算機(jī)硬件環(huán)境,可以重新定義有關(guān)的內(nèi)容。
(8)生成的目標(biāo)代碼質(zhì)量高。由C源程序編譯和鏈接得到的目標(biāo)代碼的運(yùn)行效率比用匯編語(yǔ)言編寫(xiě)的也不過(guò)只低10%~20%,可充分發(fā)揮機(jī)器的效率。
(9)C語(yǔ)言語(yǔ)法限制不嚴(yán),程序設(shè)計(jì)自由度大。C語(yǔ)言程序在運(yùn)行時(shí)不做諸如數(shù)組下標(biāo)越界和變量類(lèi)型兼容性等檢查,而是由編程者自己保證程序的正確性。C語(yǔ)言幾乎允許所有的數(shù)據(jù)類(lèi)型的轉(zhuǎn)換,字符型和整型可以自由混合使用,所有類(lèi)型均可作邏輯型,可自己定義新的類(lèi)型,還可以把某類(lèi)型強(qiáng)制轉(zhuǎn)換為指定的類(lèi)型。實(shí)際上,這使編程者有了更大的自主性,能編寫(xiě)出靈活、優(yōu)質(zhì)的程序,同時(shí)也給初學(xué)者增加了一定的難度。所以,只有在熟練掌握C語(yǔ)言程序設(shè)計(jì)之后,才能體會(huì)到其靈活性。
C語(yǔ)言也存在以下缺點(diǎn):
(1)程序的錯(cuò)誤更隱蔽。C語(yǔ)言的靈活性使得用它編寫(xiě)程序時(shí)更容易出錯(cuò),而且C的編譯器不檢查這樣的錯(cuò)誤。與匯編語(yǔ)言類(lèi)似,需要程序運(yùn)行時(shí)才能發(fā)現(xiàn)這些邏輯錯(cuò)誤。C語(yǔ)言還會(huì)有一些隱患,如將比較的 “==” 寫(xiě)成賦值 “=” ,雖然語(yǔ)法上沒(méi)錯(cuò),但這樣的邏輯錯(cuò)誤往往不易發(fā)現(xiàn),想要找出錯(cuò)誤往往十分費(fèi)時(shí)。
(2)C語(yǔ)言程序有時(shí)會(huì)難以理解。C語(yǔ)言語(yǔ)法成分相對(duì)簡(jiǎn)單,是一種小型語(yǔ)言。但是,其數(shù)據(jù)類(lèi)型多,運(yùn)算符豐富且結(jié)合性多樣,使得對(duì)其理解有一定的難度。
(3)C語(yǔ)言程序有時(shí)會(huì)難以修改??紤]到程序規(guī)模的大型化或者巨型化,現(xiàn)在編程語(yǔ)言通常會(huì)提供 “類(lèi)” 和 “包” 之類(lèi)的語(yǔ)言特性,這樣的特性可以將程序分解成更加易于管理的模塊。然而C語(yǔ)言缺少這樣的特性,維護(hù)大型程序顯得比較困難。
1.3算法及其表示
C語(yǔ)言解題時(shí),在程序中有兩方面的描述,即數(shù)據(jù)描述和處理步驟(算法)描述,后者處理前者的數(shù)據(jù)。
算法具有以下特性:
- 有窮性:算法在執(zhí)行了有限步驟后結(jié)束,并且每一步都可以在有窮的時(shí)間內(nèi)完成。
- 確定性:算法中每種操作必須有確切的含義,即無(wú)二義性。同時(shí),無(wú)論如何算法只有唯一的一條執(zhí)行路徑,即相同的輸入只能得出相同的輸出。
- 可行性:算法中描述的操作都可以通過(guò)已經(jīng)實(shí)現(xiàn)的基本操作執(zhí)行有限次數(shù)來(lái)實(shí)現(xiàn)。
- 輸入:有零個(gè)或多個(gè)輸入,即算法需要的必要信息。
- 輸出:有一個(gè)或多個(gè)輸出,輸出的是與輸入有某些特定關(guān)系的信息。沒(méi)有輸出的算法是無(wú)意義的。
算法的表示:
1.自然語(yǔ)言描述;
2.傳統(tǒng)流程圖;
3.N-S流程圖;
4.偽代碼。
【例如】求兩個(gè)正整數(shù)m和n的最大公約數(shù)(即同時(shí)能夠整除m和n的最大正整數(shù))。
1. 自然語(yǔ)言描述
歐幾里得闡述了求兩個(gè)數(shù)的最大公約數(shù)的過(guò)程——歐幾里得算法
第一步:以n除m,并令r為所得余數(shù)(顯然n>r0)。
第二步:若r=0,算法結(jié)束,n即為m和n的最大公約數(shù)。
第三步:置mn,n
r,返回第一步。
2. 傳統(tǒng)流程圖
圖1-2 求最大公約數(shù)的傳統(tǒng)流程圖
3. N-S流程圖
圖1-3 求最大公約數(shù)的N-S流程圖
4. 偽代碼
算法開(kāi)始 輸入m,n; do{ r←以n除m的余數(shù); m←n; n←r; }while(r≠0); 輸出m; 算法結(jié)束
1.4常用算法介紹
1.枚舉法
枚舉法又稱為窮舉法。該方法通過(guò)逐一考察問(wèn)題的所有可能解,找出問(wèn)題真正的解。枚舉法要求問(wèn)題的可能解必須是有限的,而且這些可能解是已知的。
【例】給定一個(gè)正整數(shù),確定它的整數(shù)立方根是否存在,若存在則找出這個(gè)立方根。
算法開(kāi)始 輸入一個(gè)正整數(shù)給n; x←0; while(x≤n 且 x*x*x≠n){ x←x+1; } if(x≤n) 找到n的整數(shù)立方根,輸出x的值; else 輸出n的整數(shù)立方根不存在信息; 算法結(jié)束
2.遞推法
遞推法是從已知的初始條件出發(fā),逐次推出中間結(jié)果。在理想狀態(tài)下,每遞推一次,結(jié)果逐漸接近問(wèn)題的最后解。遞推法在數(shù)值算法中又稱為迭代法。迭代法常用于求近似解的問(wèn)題,根據(jù)對(duì)前一步結(jié)果的誤差的不同處理方法,迭代法又有逼近迭代和試探迭代等不同方法。數(shù)值計(jì)算要注意解的穩(wěn)定性問(wèn)題,即在迭代中每一步的解越來(lái)越接近真正的解,否則迭代不會(huì)成功。
【例】計(jì)算一個(gè)正整數(shù)n的階乘。
算法開(kāi)始 輸入一個(gè)正整數(shù)給n; t←1; i←1; while(i≤n){ t←t*i; i←i+1; } 輸出結(jié)果t 算法結(jié)束
3.遞歸法
一個(gè)直接或間接調(diào)用過(guò)程(或函數(shù))自身的算法稱為遞歸算法,一個(gè)函數(shù)如果調(diào)用自身進(jìn)行計(jì)算則稱該函數(shù)為遞歸函數(shù)。一些問(wèn)題的算法描述中,遞歸法往往比非遞歸法更加簡(jiǎn)潔易懂。
【例】計(jì)算一個(gè)正整數(shù)N的階乘。
階乘函數(shù)f的遞歸定義為: f(1)=1 (1!=1,N=1 時(shí)) f(N)=N*f(N-1) (N!=N*(N-1)!,如果N>1)
除了上面介紹的枚舉法、遞推法和遞歸法外,還有回溯法、貪婪法、分治法、動(dòng)態(tài)規(guī)劃法等
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++ 數(shù)據(jù)結(jié)構(gòu)之水洼的數(shù)量算法
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之水洼的數(shù)量算法的相關(guān)資料,需要的朋友可以參考下2017-06-06C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)QQ窗口抖動(dòng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11C/C++ 中const關(guān)鍵字的用法小結(jié)
C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性。這篇文章主要介紹了C/C++ 中const關(guān)鍵字的用法,需要的朋友可以參考下2020-02-02c++實(shí)現(xiàn)超簡(jiǎn)單的貪吃蛇游戲?qū)嵗榻B
大家好,本篇文章主要講的是c++實(shí)現(xiàn)超簡(jiǎn)單的貪吃蛇游戲?qū)嵗榻B,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12