欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      學(xué)習(xí)C語言后的感悟

      時(shí)間:2019-05-12 20:34:31下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《學(xué)習(xí)C語言后的感悟》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《學(xué)習(xí)C語言后的感悟》。

      第一篇:學(xué)習(xí)C語言后的感悟

      “C++是個(gè)難學(xué)易用的語言”,這句話相信很多人心有戚戚。C++的學(xué)習(xí)難度,一在于語言本身太多的“幕”,二在于“paradigm shift”((思考模式的移轉(zhuǎn))。傳統(tǒng)程序語言如C,pascal,basic,fortran?,除了模樣看起來稍有不同,基本上都是函數(shù)call來call去,大同小異,很容易掌握。你想做的動作,在code中都看得一清二楚。你所看不到的,犖犖大者也不過就是編譯程序?yàn)槟愕暮郊由嫌靡蕴幚矶褩5囊恍《未a(prologue和epilogue),這一小段碼基本上做的是housekeeping工作,你沒看到也沒有關(guān)系(更好),并不影響你對程序邏輯的思考。

      C++不一樣,C++有太多和程序邏輯息息相關(guān)的動作是編譯程序?yàn)槲覀兗由先サ?。換句話說C++編譯程序?yàn)槲覀儭凹哟a”。如果不識清這一節(jié),學(xué)習(xí)C++有如霧里看花,霧非霧,花非花。

      編譯程序?yàn)槲覀兊腃++程序加了什么碼呢?很多!對象誕生時(shí)ctor會被喚起,物件死亡時(shí)dtor會被喚起,這都是加碼的結(jié)果。ctor中設(shè)定vtpr和vtbl,這也是加碼的結(jié)果。new 單一對象時(shí)會產(chǎn)生memory block cookie,new對象數(shù)組時(shí)會產(chǎn)生一個(gè)內(nèi)部結(jié)構(gòu)記錄著object size 和class ctor?,這也都是布幕后的工作。可以說,程序代碼中看不到而卻必須完成的所有與程序邏輯有關(guān)的動作,統(tǒng)統(tǒng)都是C++ 編譯程序加碼后的結(jié)果。

      當(dāng)“繼承”發(fā)生,整個(gè)情況變得稍微復(fù)雜起來。“多重繼承”又更復(fù)雜一些,“虛擬繼承”再更復(fù)雜一些。

      這些布幕后的主題,統(tǒng)可歸類為所謂的C++ object model(對象模型)。如果不知道這些底層機(jī)制,你就只能夠把“make destructors virtual in base classes”(, item14)或“never treat arrays polymorphically”(, item 3)這類規(guī)則硬背下來,卻不明白它的道理。

      用一樣?xùn)|西,卻不明白它的道理,林語堂如是說:“不高明”。只知道how,不知道why,侯捷如是說:“不高明”。

      C++的第二個(gè)學(xué)習(xí)難度在于“paradigm shift”(思考模式的移轉(zhuǎn))。別說自己設(shè)計(jì)classes 了,光使用別人的classes,就都是一種思考模式和行為模式的移轉(zhuǎn)。Mfc(或owl或vcl)programmer必然甚能夠領(lǐng)略并體會我的意思。

      使用所謂的application framework(一種大型的、凝聚性強(qiáng)的、有著面向?qū)ο蠊不A(chǔ)建設(shè)的class library),你的碼和framework之間究竟是怎樣的關(guān)系呢?framework提供的一大堆可改寫的虛擬函式的意義與價(jià)值究竟在哪里呢?為什么framework所設(shè)計(jì)的種種美好性質(zhì)以及各式各樣的算法竟然可以施行于我們自己設(shè)計(jì)的class types身上呢?framework被設(shè)計(jì)時(shí),并不知道我們的存在呀!

      這正是面向?qū)ο笾械亩嘈停╬olymorphism)的威力。

      稍早所說的C++對象模型,偏屬程序設(shè)計(jì)的低層面;這里所說的思考模式移轉(zhuǎn),則是程序設(shè)計(jì)的高層面。能夠把新思維模式的威力發(fā)揮得最淋漓盡致的,當(dāng)推面向?qū)ο蟮膒olymorphism(多型)和generalization(泛型)。如果你沒有使用這兩項(xiàng)特性,等于入C++寶山而空手歸。

      想象C++是一把用來解決程序問題的刀,要它堅(jiān)軔,要它鋒利,就必須經(jīng)過多次的回火,在高熱和驟冷之間錘煉。

      初學(xué)C++語法(syntax)之后,你應(yīng)該盡快嘗試體驗(yàn)polymorphism(大致而言也就是虛擬函數(shù)的運(yùn)用)。等到對oop的精神有了大局掌控的能力,但對C++的許多小細(xì)節(jié)不甚清楚,就是回到C++對象模型錘煉的時(shí)機(jī)。

      成長,是在高階(polymorphism)和低階(object model)之間反復(fù)震蕩,才能夠震蕩到更高的位階,而不是平平庸庸于中階(C++ syntax)的一灘死水。

      經(jīng)常有很多初學(xué)者把C語言與C++語言混為一談,確實(shí),C語言的大部分函數(shù)都可以在C++中實(shí)現(xiàn),C++也確實(shí)需要使用大量C語言的語法、函數(shù)。但是,C++與其他傳統(tǒng)語言最大的區(qū)別應(yīng)該就是它使用了“類”這么一個(gè)構(gòu)造函數(shù)。

      類,多么富有藝術(shù)性的詞!想一想能把真實(shí)世界中的一切在它中模擬實(shí)現(xiàn),就讓人興奮不已。掌握了它也就掌握了程序藝術(shù)的真諦、也就掌握了打通了現(xiàn)實(shí)與虛幻的時(shí)空門!

      在這里,我們來討論一下在C++中有關(guān)于類的構(gòu)成及使用。

      用C語言和其他類似的傳統(tǒng)語言所寫的程序必然包括一組數(shù)據(jù)結(jié)構(gòu)以及用來處理這些數(shù)據(jù)結(jié)構(gòu)的函數(shù)。由于這些語言沒有提供數(shù)據(jù)抽象的功能,因此程序本身并不清楚哪些函數(shù)處理了數(shù)據(jù)結(jié)構(gòu)。此外,這些語言也無法防止非授權(quán)訪問的某些數(shù)據(jù)結(jié)構(gòu)的函數(shù)對這些數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作,因而使的程序變的不必要的復(fù)雜,并且容易忽視一寫偶然的設(shè)計(jì)錯(cuò)誤。

      而C++提供了數(shù)據(jù)結(jié)構(gòu)的封裝與抽象,它為程序員提供了定義新的數(shù)據(jù)結(jié)構(gòu)的簡單而強(qiáng)大的工具。在新的數(shù)據(jù)類型中,即包括數(shù)據(jù)內(nèi)容又包括對數(shù)據(jù)內(nèi)容的操作,把它們封裝起來以后,數(shù)據(jù)類型本身能夠控制外界對它的數(shù)據(jù)成員的訪問。

      引入繼承機(jī)制以前的C++類中的成員分為兩部分,即私有成員和公有成員。在C++類中的私有段成員(包括數(shù)據(jù)和函數(shù)),他們只限于通過成員函數(shù)來訪問,也就是說只有類本身能夠訪問它,任何類以外的函數(shù)對私有數(shù)據(jù)的訪問都是非法的。公有段成員(包括公有數(shù)據(jù)和公有函數(shù)成員)提供了類的外部接口,它允許類的使用者來訪問它,我們可以通過使用類的公有成員來訪問這個(gè)類。

      在類聲明中,私有段的標(biāo)識關(guān)鍵詞為private,當(dāng)私有段成員處于類聲明中的第一部分時(shí),此關(guān)鍵詞可以省略。公有段的標(biāo)識關(guān)鍵詞為public,此關(guān)鍵詞在任何情況下都是不能省略的。

      使用私有數(shù)據(jù)來隱藏由類對象操縱的數(shù)據(jù),然后提供一些成員函數(shù)來訪問這些數(shù)據(jù),通常使用和改變這些數(shù)據(jù)的能力和實(shí)現(xiàn)細(xì)節(jié)是被隱藏起來的。

      在定義成員函數(shù)時(shí)應(yīng)注意:

      1、在所定義的成員函數(shù)名之前應(yīng)墜上類名,在類名和函數(shù)名之間加上分隔符“::”。

      2、函數(shù)的返回類型一定要與函數(shù)聲明時(shí)的類型相匹配。

      3、在定義成員函數(shù)時(shí),對函數(shù)所帶的參量,僅僅說明它的類型是很不夠的,還需要指出它的參量名。

      對于成員函數(shù)的定義,并不是必須把它們放在類定義體之外,有時(shí),有些簡單的成員函數(shù)可以在類定義中定義。這些包含在類定義體內(nèi)定義的成員函數(shù)稱為內(nèi)部函數(shù),或稱為內(nèi)置函數(shù)。

      類的每項(xiàng)操作都是通過函數(shù)成員實(shí)現(xiàn)的,使用某些操作則表明了一個(gè)函數(shù)調(diào)用,但這對于小的和常用的操作程序來說,開銷是很大的。內(nèi)置函數(shù)就是用來解決這個(gè)問題的,它將該函數(shù)的代碼插入在函數(shù)的每個(gè)調(diào)用處,作為函數(shù)體的內(nèi)部擴(kuò)展,用來避免函數(shù)調(diào)用機(jī)制所帶來的開銷。雖然這種做法可以提高執(zhí)行效率,但如果函數(shù)體過長會有不良后果,因此,一般對非常簡單的函數(shù),才聲明成內(nèi)置函數(shù)。

      類在概念上是一種機(jī)制,它抽象了一類對象的存儲和操作特性。在系統(tǒng)實(shí)現(xiàn)中,類是一種共享機(jī)制,它提供了本類對象的操作實(shí)現(xiàn)。

      通常我們把具有同樣性質(zhì)和功能的東西所構(gòu)成的集合稱為類。在C++中,可以把具有相同內(nèi)部存儲結(jié)構(gòu)和相同一組操作的對象看成屬于同一類。在指定一個(gè)類后,往往把屬于這個(gè)類的對象稱為類的實(shí)例。實(shí)際上對象和實(shí)例表達(dá)的是一個(gè)意思。

      類與對象間的關(guān)系,可以用整形int和整形變量i之間的關(guān)系來類比。類和整型int均代表的是一般的概念,而對象和整形變量i卻是代表具體的東西。創(chuàng)建一個(gè)具體對象有兩種方法:

      (1)在定義類的同時(shí)創(chuàng)建對象

      我們在給出類定義描述時(shí)創(chuàng)建對象,如下:

      class date{

      int month,day,year;

      public:

      void set(int,int,int);

      void print();

      int getyear();

      int getmonth();

      int getday();

      }tt;//同時(shí)創(chuàng)建對象tt

      在定義類date的同時(shí)創(chuàng)建了date類的對象tt,這時(shí)創(chuàng)建的是一個(gè)全局對象。

      (2)在使用時(shí)定義對象

      在定義類的同時(shí)創(chuàng)建的對象是一種全局對象,在它的生存氣內(nèi)任何函數(shù)都可以使用它,這在程序執(zhí)行過程中容易造成一些混亂。使用它的函數(shù)有時(shí)只在極短的時(shí)間對它進(jìn)行操作,而后就不再理會它,但它仍然存在,只有在整個(gè)程序結(jié)束時(shí)它才會自動消亡。所以在定義類的同時(shí)創(chuàng)建對象是有一定的弊端的。為了消除這些弊端,完全可以在需要使用此類對象時(shí),再在使用它的函數(shù)中定義對象。

      對于使用一個(gè)類,實(shí)際上是創(chuàng)建一個(gè)此類的對象,之后使用它的公有成員函數(shù)達(dá)到對此類對象作用的目的。

      下面看一個(gè)使用類的例子:

      class point{

      int x,y;

      public:

      void setpoint(int vx,int vy){x=vx;y=vy;}

      };

      void f1()

      {

      point p1;//創(chuàng)建point類的對象p1

      p1.setpoint(10,10);//給point類對象p1的私有成員賦值 //??

      }

      從這里看出,我們在函數(shù)f1()中使用了類point,定義了它的一個(gè)對象p1,并用p1.setpoint(10,10)調(diào)用了類的公有成員函數(shù)setpoint,通過函數(shù)調(diào)用實(shí)現(xiàn)了對其私有成員的賦值操作。

      對于類成員的訪問,我們采用的是“.”操作符,在這里p1.setpoint(10,10)實(shí)際上是一種縮寫形式,它表達(dá)的意義是p1.point::setpoint(10,10),這兩種表達(dá)形式是等價(jià)的。

      在定義類對象時(shí),若我們定義的是指向此類對象的指針,則使用此類成員時(shí),不再用“.”操作符,而是使用“->”操作符。

      我們再來看各種函數(shù)在C++類中的使用

      面向?qū)ο缶幊痰囊粋€(gè)重要思想就是數(shù)據(jù)的封裝,也就是把對象中的數(shù)據(jù)隱藏起來,只通過成員函數(shù)來對對象進(jìn)行操作。這時(shí),就要對類中的成員指定操作權(quán)限。例如:

      struct Date{

      private:

      int d,m,y;

      public:

      void init(int dd, int mm, int yy);

      void add_year(int n);

      void add_month(int n);

      void add_day(int n);

      };

      這里,成員變量d、m、y的操作權(quán)限為私有,只有類本身的成員函數(shù)能夠訪問它們。而下面的四個(gè)成員函數(shù)的操作權(quán)限為公有,都可以被外界訪問。當(dāng)然,并不是成員變量就一定要是私有的,而成員函數(shù)就一定要是公有的,一些內(nèi)部使用的成員函數(shù)也可以是私有的,而成員變量也可以是公有的。

      另外,在定義類時(shí),我們一般用class來代替struct。class與struct唯一的區(qū)別就是,在不指定操作權(quán)限時(shí),struct的默認(rèn)操作權(quán)限為公有,而class的默認(rèn)操作權(quán)限為私有。

      在一個(gè)類中,可以定義兩種特殊的函數(shù)。一種被稱為構(gòu)造函數(shù),該函數(shù)沒有返回類型,名字與類名相同,會在對象創(chuàng)建時(shí)自動調(diào)用,往往用來完成一些對象初始化的工作,在它的參數(shù)列表后可以跟初始化列表;另一種被稱為析構(gòu)函數(shù),該函數(shù)也沒有返回類型,名字是由類名之前加一個(gè)“~”符號構(gòu)成的,會在對象死亡(也就是超出生命周期)時(shí)自動調(diào)用,往往用來完成一些掃尾工作。構(gòu)造函數(shù)可以帶一些參數(shù),并且可以重載,而析構(gòu)函數(shù)不帶任何參數(shù)。例如:

      class Date {

      public:

      Date(int dd, int mm, int yy);

      Date(char* date);

      ~Date();

      };

      Date::Date(int dd, int mm, int yy): d(dd), m(mm), y(yy){

      }

      Date national_day(1, 10, 2003);

      Date christmas(“December 25th, 2003”);

      在Date類構(gòu)造函數(shù)的實(shí)現(xiàn)中,冒號后面的就是初始化列表,可以用來初始化一些成員變量。當(dāng)然,你也可以在構(gòu)造函數(shù)的函數(shù)體中初始化成員變量,不過一般推薦使用初始化列表來完成這項(xiàng)工作。

      我們在前面提到了“封裝”,封裝實(shí)際上就是信息隱藏。在面向?qū)ο笙到y(tǒng)中封裝是構(gòu)成對象的處理,一個(gè)封裝的對象也常稱為一個(gè)抽象數(shù)據(jù)類型,若沒有封裝就沒有面向?qū)ο缶幊獭?/p>

      最后有些時(shí)候,我們要在對象的成員函數(shù)中引用對象本身,這時(shí)就要用到this指針。在成員函數(shù)中,this指針是一個(gè)指向該對象類型的指針,并總指向當(dāng)前的對象。另外,當(dāng)類的成員函數(shù)中有局部變量與類的成員變量重名時(shí),直接寫變量名代表局部變量。如果要訪問成員變量,則需通過this來引用(this->xxx)。

      以上就是對C++中類的構(gòu)成與使用的簡單總結(jié),由于篇幅限制,我們還有很多與類的使用有關(guān)的思想和方法沒有總結(jié),如友元、重載、引用、繼承與類的派生等等。實(shí)際上,類和對象最大的用處是大大簡化了大型軟件編寫和維護(hù)的過程。在將要成為一名編程人員的學(xué)生的學(xué)習(xí)道路上,體會和掌握C++的這種面向?qū)ο缶幊痰乃枷?,是非常重要的?/p>

      總結(jié)

      程序設(shè)計(jì)語言的學(xué)習(xí)過程與自然語言的學(xué)習(xí)有著十分相似的地方。

      本文開始講了C語言與C++語言聯(lián)系。在學(xué)習(xí)的過程中,我們要充分利用它們之間的相同之處,明確不同之處,這樣才能加快學(xué)習(xí)的速度。這就好像在掌握了母語的基礎(chǔ)上去學(xué)習(xí)一門外語,利用好語言之間的相同之處能夠使外語的學(xué)習(xí)變得簡單;而如果不能解決好語言之間的不同之處,就會給外語的學(xué)習(xí)帶來困難。要學(xué)好外語需要多加練習(xí),而只有不斷地使用一門程序設(shè)計(jì)語言寫程序才能切實(shí)提高對程序設(shè)計(jì)語言的掌握水平。

      隨后文章進(jìn)一步深入,總結(jié)了C++類的構(gòu)成及定義與它使用到的一些函數(shù)。這就好比外語中一些獨(dú)特的文化底蘊(yùn),我們只有了解這些文化底蘊(yùn),才能真正掌握一門外語。程序設(shè)計(jì)語言也是如此,這部分所總結(jié)的內(nèi)容使我們能夠更好地使用C++語言中的類定義方法,特別是我們說到類與對象的關(guān)系,這里是我們使用類的關(guān)鍵。

      最后,我們簡單討論了一些與類的使用有關(guān)的函數(shù)和思想。這就像是寫作,寫作的基礎(chǔ)是掌握好一門自然語言,程序設(shè)計(jì)的基礎(chǔ)則是掌握好一門程序設(shè)計(jì)語言。但是,要寫出優(yōu)秀的文章僅僅靠掌握好一門自然語言是不夠的,我們還需要有精巧的構(gòu)思和華麗的詞藻。如何嫻熟的運(yùn)用這些函數(shù)、思想去為你的“文章”增色,就需要大家自己的多多練習(xí)了。

      第二篇:學(xué)習(xí)C語言后的感悟[定稿]

      我學(xué)了C,C++,JAVA.還有很多的腳本語言,最后徹底留下的只有c語言,c++的許多機(jī)制忘了,JAVA就沒有記住幾種機(jī)制。

      面對編程高手(會n種),而且很牛b的那種,我依然以我會c語言自豪,我也因?yàn)槲視語言而自信。面對什么什么技術(shù)“趨勢”的時(shí)代,我只精通c語言,發(fā)現(xiàn)已經(jīng)足夠了,而且是完全足夠了。當(dāng)我需要學(xué)習(xí)PHP的時(shí)候,我1個(gè)星期可以說基本掌握了;當(dāng)我要學(xué)B shell的時(shí)候,1個(gè)星期也夠了;當(dāng)我要學(xué)習(xí)JSP的時(shí)候....什么?什么是JSP?別說我學(xué)過這些垃圾。

      我愛用最簡單的語言機(jī)制構(gòu)建出你復(fù)雜邏輯,你嚴(yán)謹(jǐn)?shù)乃季S。當(dāng)你發(fā)現(xiàn)這么簡單的C語言男夠構(gòu)架出UNIX操作系統(tǒng)和大部分UNIX程序的時(shí)候,你就發(fā)現(xiàn)你不能輕視C。

      有的人說機(jī)制少,不安全,不健全......那么安全的語言機(jī)制就失去了靈活,失去了輕便。有的人說功能少,C庫少,連界面都不能寫.......那么當(dāng)malloc都由自己寫的時(shí)候,程序才牢牢掌握在自己手中。真正的程序員是沒有界面的,程序員在text mode下能快捷,方便地做你想做的一切事情。

      下面介紹一下我學(xué)習(xí)的方法,覺得特別有用。

      如果是連高數(shù),計(jì)算機(jī)原理之類的書或是英語沒有入門的人,那就不應(yīng)該學(xué)習(xí)編程,不可能牛起來。

      如果是C語言剛上手,最好選一本國內(nèi)語言語法,語句講得細(xì)致的書。

      如果上手了,或者學(xué)習(xí)過其他的語言,那么就一定要看一本最經(jīng)典的C語言書,比如《C語言程序設(shè)計(jì)》,這本書我后來又看一遍才知道有多好,眼界十分開闊。

      認(rèn)為都學(xué)的差不多了,最最最好的聯(lián)系方法(切身體會?。。褪亲约簩懗绦?,寫什么呢??兩個(gè)中你挑一個(gè):md5加密算法的實(shí)現(xiàn) 或者是 lzss或lzw壓縮算法的實(shí)現(xiàn)。這兩個(gè)程序接近底層又不算十分大,又有很多的數(shù)據(jù)結(jié)構(gòu)和算法。資料就要自己去找了,網(wǎng)上有講算法的,你來具體實(shí)現(xiàn),能自己設(shè)計(jì)算法并能夠在unix機(jī)器上實(shí)現(xiàn)那更好。

      搞過這個(gè)你就能體會到自己終于入門了,因?yàn)槟愕綍r(shí)候就會發(fā)現(xiàn)又很多的內(nèi)容還等著你去學(xué).....并且你可以拿著你的程序炫耀了,事實(shí)證明能把這個(gè)程序徹底些出來并且些的很好的(bug少),已經(jīng)有功底了,你可以把程序發(fā)布到sourceforge.net等開源社區(qū)上,招人開啟你自己的工程。

      當(dāng)然有了功底,剩下的路你自己就應(yīng)該知道怎么走了,有一條向linux工程師的方向,就是學(xué)習(xí)linux,如果你c語言足夠好,可以直接學(xué)習(xí)內(nèi)核,試著編寫,編譯內(nèi)核;也可以弄弄上層的東西,shell,awk,iptable之類的.....當(dāng)然經(jīng)典的書《unix高級編程》是講unix下的gcc程序開發(fā)的還有網(wǎng)絡(luò)工程師的路,那就要學(xué)協(xié)議,有巨他媽經(jīng)典的3卷的書:《TCP/IP詳解》一,二,三。只看一也可以。然后看一看《unix網(wǎng)絡(luò)編程》,那就足夠了.....如果想向軟件工程師發(fā)展,那更不成問題。你再學(xué)什么語言,什么JAVA,C++,JSP....那是哇哇的簡單,但是注意,一定要看最經(jīng)典的書,你才能成為高手!

      還有一條我最向往的路,就是成為一個(gè)hacker,就是黑客,做這個(gè)你必須有一定的經(jīng)濟(jì)收入和空余的時(shí)間才可以...。宗旨是為全世界的IT頁貢獻(xiàn)出力量。這個(gè)有一個(gè)好處,就是任憑你自己的興趣,喜歡游戲的可以開發(fā)游戲,想搞unix的可以開發(fā)內(nèi)核什么的。

      這個(gè)最后一定要進(jìn)入一個(gè)很好的自由社區(qū),比如apache基金會或是GNU基金會,想在后一代的著名程序比如apache httpd,tomcat,kerneln.n上刻上自己的名字就可以向這方面發(fā)展。也可以在sourceforge.net上找找自己喜歡的工程,申請加入..如果搞的好還能有基金會的money外快又能滿足自己的興趣,可惜我現(xiàn)在沒錢,否則早干了....那個(gè)時(shí)候,你已經(jīng)有找一份很體面的工作的實(shí)力了..干什么都可以輕輕松松的..不論走到哪,c語言還是根本,不論IT格局怎么變,有C語言有如心中一塊石頭,它是不可能變的,就像tcp/ip,不管上層再有什么技術(shù),基本原理和接口20幾年就是沒有變過!回顧幾年的IT學(xué)習(xí)生涯,就像是濃縮的過程,東西越學(xué)越少,最后好像只有c語言了....一)“項(xiàng)目驅(qū)動”式教學(xué)

      目前最著名、最有影響、應(yīng)用最廣泛的windows、linux和UNIX三個(gè)操作系統(tǒng)都是用C語言編寫的。0S是計(jì)算機(jī)系統(tǒng)(由軟硬件兩個(gè)子系統(tǒng)構(gòu)成)的核心和靈魂,它是軟件中最龐大最復(fù)雜的系統(tǒng)軟件。既然如此龐大復(fù)雜的0S都可以用c語言編寫,從狹義而言,還有什么系統(tǒng)軟件和應(yīng)用軟件不能用c語言編寫呢?由此可以肯定的說,c語言是一門十分優(yōu)秀而又重要的語言。

      c語言程序設(shè)計(jì)是過程性程序設(shè)計(jì)語言,它的發(fā)展貫穿了計(jì)算機(jī)發(fā)展的歷程,它蘊(yùn)含了程序設(shè)計(jì)的基本思想,囊括了程序設(shè)計(jì)的基本概念,所以它是理工科高等院校的一門基礎(chǔ)課程。從市面上有關(guān)c語言的書籍和高等院校采用的教材來看,它們有一個(gè)共性,那就是:脫離了實(shí)際應(yīng)用(全是小打小鬧的小例子),純粹的過程性程序設(shè)計(jì),沒有軟件工程思想的體現(xiàn),沒有一定程序設(shè)計(jì)風(fēng)格,僅僅是為了讓大家明白什么是c語言而已。

      高等院校開設(shè)c語言程序設(shè)計(jì)的目的是讓學(xué)生對程序設(shè)計(jì)有個(gè)入門,有個(gè)直觀的理解,同時(shí)為其他后續(xù)課程作鋪墊。但是如果教學(xué)僅僅以此為目的,那么教學(xué)本身就效果而言是個(gè)大大的失敗。

      大家知道,在商業(yè)上講究唯利是圖,“利”是商業(yè)追求的目標(biāo),離開了“利”經(jīng)商,則商無動力,其結(jié)果是必?cái)o疑。在c語言程序設(shè)計(jì)教學(xué)當(dāng)中,教師應(yīng)該把“唯用是圖”作為教學(xué)的首要目標(biāo)。如果拋開了實(shí)際應(yīng)用進(jìn)行程序設(shè)計(jì)教學(xué),就是紙上談兵,就是“說明書”式的教學(xué)。印度的程序設(shè)計(jì)課程采用“事件驅(qū)動式”教學(xué),我認(rèn)為在中國的c語言程序設(shè)計(jì)教學(xué)中應(yīng)該采用“項(xiàng)目驅(qū)動式”教學(xué)?!绊?xiàng)目驅(qū)動式”教學(xué)就是以項(xiàng)目為目的,以c語言理論教學(xué)為過程,最終能用c語言設(shè)計(jì)項(xiàng)目,實(shí)現(xiàn)項(xiàng)目的要求。“項(xiàng)目驅(qū)動式”教學(xué)的關(guān)鍵在于培養(yǎng)學(xué)生“如何做什么”和“可以干什么”。一個(gè)項(xiàng)目就是一個(gè)工程,在“項(xiàng)目驅(qū)動式”教學(xué)中,首先應(yīng)該讓學(xué)生簡單了解什么是軟件工程思想,其次在c語言理論教學(xué)過程中,讓學(xué)生懂得面向?qū)ο蟮某绦蛟O(shè)計(jì)的風(fēng)格,最后引導(dǎo)他們來設(shè)計(jì)項(xiàng)目。

      (二)“項(xiàng)目驅(qū)動”式教學(xué)應(yīng)注意的問題

      1.c語言程序設(shè)計(jì)教學(xué)要幫助學(xué)生樹立面向工程的觀點(diǎn)

      在計(jì)算機(jī)行業(yè)中,軟件是通過人們的智力活動、把知識與技術(shù)轉(zhuǎn)化成信息的一種產(chǎn)品。軟件的設(shè)計(jì)已經(jīng)用工程的觀念來進(jìn)行管理。軟件設(shè)計(jì)工作被當(dāng)作一項(xiàng)系統(tǒng)工程來對待。軟件的的生存周期一般可分為以下階段:問題定義、可行性研究、需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼、測試、運(yùn)行與維護(hù)。我們不難看出軟件工程的復(fù)雜程度是很大的。理工科高等院校把c語言作為一門基礎(chǔ)課程,也是為了給社會培養(yǎng)信息技術(shù)人才。眾所周知,養(yǎng)成一個(gè)好的習(xí)慣是非常重要的,所以c語言程序設(shè)計(jì)作為大多數(shù)工科院校學(xué)生接觸的第一門程序設(shè)計(jì)語言(有的院校講pascal),就應(yīng)該讓學(xué)生樹立正確的觀點(diǎn)。那么當(dāng)前的程序設(shè)計(jì)教學(xué)也必須以切合將來軟件工程開發(fā)的實(shí)際需要為第一目標(biāo),使學(xué)生在學(xué)習(xí)程序設(shè)計(jì)的初級階段就樹立正確的軟件工程觀點(diǎn)。這樣做不僅可以為學(xué)生將來從事計(jì)算機(jī)應(yīng)用設(shè)計(jì)打下良好的基礎(chǔ),而且有利于培養(yǎng)學(xué)生分析問題的完備性,以及統(tǒng)籌全局,協(xié)調(diào)關(guān)系的基本素質(zhì)。

      2.理論教學(xué)應(yīng)從單一的“結(jié)構(gòu)化程序設(shè)計(jì)”向“結(jié)構(gòu)化與面向?qū)ο蟛⑴e”轉(zhuǎn)變

      “結(jié)構(gòu)化程序設(shè)計(jì)”方法是程序設(shè)計(jì)的基礎(chǔ),必須讓學(xué)生掌握得堅(jiān)實(shí)可靠。結(jié)構(gòu)化程序設(shè)計(jì)的過程是培養(yǎng)學(xué)生思維能力的過程,在教學(xué)中經(jīng)常發(fā)現(xiàn)有些學(xué)生的思維混亂。這些都是缺乏思維訓(xùn)練的結(jié)果。結(jié)構(gòu)化程序設(shè)計(jì)的訓(xùn)練不僅可以讓學(xué)生養(yǎng)成良好的程序設(shè)計(jì)習(xí)慣,而且可以有效地培養(yǎng)學(xué)生思維的條理性和邏輯性。所以在授課過程中要注意講解結(jié)構(gòu)化程序設(shè)計(jì)的思想時(shí)應(yīng)突出兩點(diǎn):(1)程序的質(zhì)量首先取決于它的結(jié)構(gòu)。(2)程序設(shè)計(jì)的基本方法是自頂向下地逐步求精和模塊化。

      在c程序教學(xué)過程中,越到后面的章節(jié),學(xué)生越會產(chǎn)生設(shè)計(jì)程序逐漸變難的感覺,這是不符合邏輯的一種怪現(xiàn)象。按照常理,C語言學(xué)的越多,說明你的程序設(shè)計(jì)知識越多,設(shè)計(jì)起程序來應(yīng)該更加得心應(yīng)手,那么出現(xiàn)這種現(xiàn)象的原因何在呢?當(dāng)然該問題的出現(xiàn)的原因是多方面的,但是其中最重要的一點(diǎn)就是長期以來程序設(shè)計(jì)的觀念不是以如何處理好對象為出發(fā)點(diǎn),而是以如何使用好語言為基本點(diǎn)。受這種思想的影響,我們的程序設(shè)計(jì)教學(xué)大多數(shù)不是以如何解決好問題為重點(diǎn),而是以講解語法規(guī)則和語句格式為重點(diǎn),是“說明書”式的教學(xué)。這樣做造成的結(jié)果就是見到一個(gè)程序后學(xué)生首先想到是該用哪條語句,而不是思考怎樣合理的解析。要切實(shí)解決這個(gè)問題,首先應(yīng)該改變程序設(shè)計(jì)的觀念?!懊嫦?qū)ο蟪绦蛟O(shè)計(jì)”思想是目前最為流行、極為實(shí)用的一種程序設(shè)計(jì)方法,但是讓學(xué)生直接接觸“面向?qū)ο蟪绦蛟O(shè)計(jì)”,肯定不能對程序設(shè)計(jì)打下牢固的基礎(chǔ)。“結(jié)構(gòu)化與面向?qū)ο蟛⑴e”是現(xiàn)代計(jì)算機(jī)程序設(shè)計(jì)的發(fā)展趨勢,應(yīng)該認(rèn)真探索研究,讓學(xué)生有一個(gè)較為輕松的學(xué)習(xí)過程。程序設(shè)計(jì)的實(shí)質(zhì)就是編寫處理對象的過程,所以將c與c++有機(jī)的融為一體的教材應(yīng)該是首選教材,在教學(xué)過程中,我們應(yīng)該從社會發(fā)展的角度進(jìn)行探索研究,將目前最為流行又極為實(shí)用“面向?qū)ο蟪绦蛟O(shè)計(jì)”思想融合到c語言教學(xué)中。

      3.c語言教學(xué)應(yīng)培養(yǎng)學(xué)生良好的程序設(shè)計(jì)風(fēng)格

      具有良好的設(shè)計(jì)風(fēng)格應(yīng)該是程序員所具備的基本素質(zhì),在實(shí)際的項(xiàng)目中程序員往往都有自己的一些編程風(fēng)格。目前95%以上的程序設(shè)計(jì)書籍不注重程序設(shè)計(jì)風(fēng)格問題,這導(dǎo)致了很多學(xué)生沒有良好的程序設(shè)計(jì)風(fēng)格,在他們剛剛畢業(yè)踏入社會時(shí),如果周圍的同事沒有良好的編程風(fēng)格,那么很難通過環(huán)境來使自己提高這方面的素質(zhì),即使有提高也不容易比較全面的提高。因此在學(xué)生接觸的第一門程序設(shè)計(jì)語言教學(xué)中,就應(yīng)該培養(yǎng)學(xué)生良好的程序設(shè)計(jì)風(fēng)格,使他們一進(jìn)工作環(huán)境就具備這個(gè)素質(zhì)。

      Pascal設(shè)計(jì)者N.Writh教授十分重視程序設(shè)計(jì)風(fēng)格的養(yǎng)成,他堅(jiān)信“教給學(xué)生們以表達(dá)他們思維的語言會深深地影響他們思維和創(chuàng)造發(fā)明的習(xí)慣,而正是這些語言本身的混亂直接影響著學(xué)生們的程序設(shè)計(jì)的風(fēng)格”,他這里所指的“這些運(yùn)用”是當(dāng)時(shí)那些主要用于程序設(shè)計(jì)教學(xué)的計(jì)算機(jī)語言。對學(xué)生來講,一開始就強(qiáng)調(diào)程序設(shè)計(jì)風(fēng)格很有必要,良好的程序設(shè)計(jì)風(fēng)格不僅有助于提高程序的可靠性、可理解性、可測試性、可維護(hù)性和可重用性,而且也能夠促進(jìn)技術(shù)的交流,改善軟件的質(zhì)量。所以培養(yǎng)良好的程序設(shè)計(jì)風(fēng)格對于初學(xué)者來說非常重要。程序設(shè)計(jì)風(fēng)格,實(shí)際上是指的是編碼風(fēng)格。在教學(xué)過程中應(yīng)從源程序文檔化,數(shù)據(jù)說明的原

      則,輸入/輸出方法這三個(gè)方面培養(yǎng)學(xué)生的編碼風(fēng)格,進(jìn)而從編碼原則探討提高程序的可讀性、改善程序質(zhì)量的方法。

      (1)源程序文檔化。編碼的目的是產(chǎn)生程序,但是為了提高程序的可維護(hù)性。源代碼是需要實(shí)現(xiàn)文檔化的。源程序文檔化包括選擇標(biāo)識符(變量和標(biāo)號)的名字、安排注釋以及標(biāo)準(zhǔn)的書寫格式等。

      ①選擇標(biāo)識符的命名規(guī)則。標(biāo)識符包括模塊名、變量名、常量名、標(biāo)號名、子程序名等。這些名字應(yīng)能反映它所代表的實(shí)際東西,應(yīng)有一定實(shí)際意義,使其能顧名思義。另外在模塊名、變量名、常量名、標(biāo)號名、子程序名中使用下劃線是一種風(fēng)格。使用這一技術(shù)的一種廣為人知的命名規(guī)則就是匈牙利命名法(變量類型由一個(gè)或兩個(gè)字符表示,并且這些字符將作為變量名的前綴)。當(dāng)然使用匈牙利命名法與否都沒有錯(cuò)誤,重要的是要保持一致性——在整個(gè)程序中使用相同的命名規(guī)則。這就是說,如果你在一個(gè)小組環(huán)境中編程,你和其他小組成員應(yīng)該制定一種命名規(guī)則。并自始至終使用這種規(guī)則。如果有人使用了別的命名規(guī)則,那么集成的程序讀起來將是很費(fèi)勁的。此外,你還要與程序中用到的第三方庫(如果有的話)所使用的風(fēng)格保持一致。如果可能的話,你應(yīng)該盡量使用與第三方庫相同的命名規(guī)則,這將加強(qiáng)你的程序的可讀性和一致性。

      ②注釋。程序中的注釋是程序設(shè)計(jì)者與程序閱讀者之間通信的重要手段。注釋能夠幫助讀者理解程序,并為后續(xù)測試維護(hù)提供明確的指導(dǎo)信息。因此,注釋是十分重要的,大多數(shù)程序設(shè)計(jì)語言提供了使用自然語言來寫注釋的環(huán)境,為程序閱讀者帶來很大的方便。注釋分為功能性注釋和序言性注釋。

      a.功能性注釋。功能性注釋在源程序中,用以描述其后的語句或程序段是在做什么工作,也就是解釋下面要“做什么”,而不是解釋下面怎么做。對于書寫功能性注釋,要注意以下幾點(diǎn):第一描述一段程序,而不是每一個(gè)語句。第二利用縮進(jìn)和空行,使程序與注釋容易區(qū)別。第三注釋要準(zhǔn)確無誤。

      b.序言性注釋。序言性注釋通常位于每個(gè)程序模塊的開頭部分,它給出程序的整體說明,對于理解程序具有引導(dǎo)作用。有些軟件開發(fā)部門對序言性注釋做了明確而嚴(yán)格的規(guī)定,要求程序編制者逐項(xiàng)列出。有關(guān)內(nèi)容包括:程序標(biāo)題;有關(guān)該模塊功能和目的的說明;主要算法;接口說明:包括調(diào)用形式,參數(shù)描述,子程序清單;有關(guān)數(shù)據(jù)描述;模塊位置(在哪一個(gè)源文件中,或隸屬于哪一個(gè)軟件包);開發(fā)簡歷:模塊設(shè)計(jì)者、復(fù)審考、復(fù)審日期。③用標(biāo)準(zhǔn)的書寫格式。源程序清單的書寫建議采用以下幾點(diǎn):

      a.每行只寫一條語句;

      b.用分層縮進(jìn)的寫法顯示嵌套結(jié)構(gòu)層次,這樣可使程序的邏輯結(jié)構(gòu)更加清晰,層次更加分明。c.書寫表達(dá)式時(shí)適當(dāng)使用空格或圓括號作隔離符。

      d.在注釋段周圍加上邊框;

      e.注釋段與程序段、以及不同的程序段之間插入字行;

      (2)數(shù)據(jù)說明采用的原則。在編寫程序時(shí),要注意數(shù)據(jù)說明的風(fēng)格。

      數(shù)據(jù)說明的次序如果規(guī)范,將有利于測試,排錯(cuò)和維護(hù)。首先說明的先后次序要固定,例如,按常量說明、簡單變量類型說明、數(shù)組說明用數(shù)據(jù)塊說明、所有的文件說明的順序說明。當(dāng)然在類型說明中還可進(jìn)一步要求,例如按如下順序排列:整型量說明、實(shí)型量說明、字符量說明、邏輯說明。

      其次當(dāng)用一個(gè)語句說明多個(gè)變量名時(shí),應(yīng)當(dāng)對這些變量按字母的順序排列。

      最后對于復(fù)雜數(shù)據(jù)結(jié)構(gòu),應(yīng)利用注釋說明實(shí)現(xiàn)這個(gè)數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)。

      (3)輸入/輸出方法。輸入/輸出的方式和格式應(yīng)當(dāng)盡量避免因設(shè)計(jì)不當(dāng)給用戶帶來的麻

      煩。這就要求,源程序的輸入/輸出風(fēng)格必須滿足能否為用戶接受這一原則。所以在設(shè)計(jì)程序時(shí),應(yīng)考慮以下原則:輸入數(shù)據(jù)時(shí),要使輸入的步驟和操作盡可能簡單,應(yīng)允許使用自由格式輸入;應(yīng)允許缺省值;對輸入的數(shù)據(jù)要進(jìn)行檢驗(yàn),以保證每個(gè)數(shù)據(jù)的有效性。

      (三)結(jié)束語

      在教學(xué)過程中,我們讓學(xué)生設(shè)計(jì)一個(gè)程序模擬體育彩票的銷售與對獎(jiǎng)的過程,取得了良好的效果。他不僅啟發(fā)和誘導(dǎo)了學(xué)生獨(dú)立思考、積極思維的主動性,而且充分調(diào)動了學(xué)生學(xué)習(xí)的自覺性和積極性,使學(xué)生融會貫通地掌握了所學(xué)知識,提高了分析問題和解決實(shí)際問題的能力。

      搞好c程序設(shè)計(jì)的教學(xué)工作涉及的因素很多,如果以項(xiàng)目來驅(qū)動教學(xué),首先讓學(xué)生樹立面向工程的思想,其次把教學(xué)從單一的“結(jié)構(gòu)化程序設(shè)計(jì)”向“結(jié)構(gòu)化與面向?qū)ο蟛⑴e”轉(zhuǎn)變,最后特別要培養(yǎng)學(xué)生養(yǎng)成良好的編碼風(fēng)格,從而使他們學(xué)會能夠“干什么”,那么我們認(rèn)為教學(xué)目的就達(dá)到了。

      第三篇:c語言學(xué)習(xí)

      一門新的語言學(xué)習(xí)(和C沒啥關(guān)系!真的。);

      2.看《Thinking In C++》,不要看《C++變成死相》;

      3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因?yàn)樗麄兒茈y而我們自己是初學(xué)者所以就不看;

      4.不要被VC、BCB、BC、MC、TC等詞匯所迷惑——他們都是集成開發(fā)環(huán)境,而我們要學(xué)的是一門語言;

      5.不要放過任何一個(gè)看上去很簡單的小編程問題——他們往往并不那么簡單,或者可以引伸出很多知識點(diǎn);

      6.會用Visual C++,并不說明你會C++;

      7.學(xué)class并不難,template、STL、generic programming也不過如此——難的是長期堅(jiān)持實(shí)踐和不遺余力的博覽群書;

      8.如果不是天才的話,想學(xué)編程就不要想玩游戲——你以為你做到了,其實(shí)你的C++水平并沒有和你通關(guān)的能力一起變高——其實(shí)可以時(shí)刻記住:學(xué)C++是為了編游戲的;

      9.看Visual C++的書,是學(xué)不了C++語言的;

      10.浮躁的人容易說:XX語言不行了,應(yīng)該學(xué)YY;——是你自己不行了吧???

      11.浮躁的人容易問:我到底該學(xué)什么;——?jiǎng)e問,學(xué)就對了;

      12.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;

      13.浮躁的人容易說:我要中文版!我英文不行!——不行?學(xué)呀!

      14.浮躁的人容易問:XX和YY哪個(gè)好;——告訴你吧,都好——只要你學(xué)就行;

      15.浮躁的人分兩種:a)只觀望而不學(xué)的人;b)只學(xué)而不堅(jiān)持的人;

      16.把時(shí)髦的技術(shù)掛在嘴邊,還不如把過時(shí)的技術(shù)記在心里;

      17.C++不僅僅是支持面向?qū)ο蟮某绦蛟O(shè)計(jì)語言;

      18.學(xué)習(xí)編程最好的方法之一就是閱讀源代碼;

      19.在任何時(shí)刻都不要認(rèn)為自己手中的書已經(jīng)足夠了;

      20.請閱讀《The Standard C++ Bible》(中文版:標(biāo)準(zhǔn)C++寶典),掌握C++標(biāo)準(zhǔn);

      21.看得懂的書,請仔細(xì)看;看不懂的書,請硬著頭皮看;

      22.別指望看第一遍書就能記住和掌握什么——請看第二遍、第三遍;

      23.請看《Effective C++》和《More Effective C++》以及《Exceptional C++》;

      24.不要停留在集成開發(fā)環(huán)境的搖籃上,要學(xué)會控制集成開發(fā)環(huán)境,還要學(xué)會用命令行方式處理程序;

      25.和別人一起討論有意義的C++知識點(diǎn),而不是爭吵XX行不行或者YY與ZZ哪個(gè)好;

      26.請看《程序設(shè)計(jì)實(shí)踐》,并嚴(yán)格的按照其要求去做;

      27.不要因?yàn)镃和C++中有一些語法和關(guān)鍵字看上去相同,就認(rèn)為它們的意義和作用完全一樣;

      28.C++絕不是所謂的C的“擴(kuò)充”——如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯(lián)系得那么緊密;

      29.請不要認(rèn)為學(xué)過XX語言再改學(xué)C++會有什么問題——你只不過又在學(xué)一門全新的語言而已;

      30.讀完了《Inside The C++ Object Model》以后再來認(rèn)定自己是不是已經(jīng)學(xué)會了C++;

      31.學(xué)習(xí)編程的秘訣是:編程,編程,再編程;

      32.請留意下列書籍:《C++面向?qū)ο蟾咝Ь幊蹋–++ Effective Object-Oriented Software Construction)》《面向?qū)ο筌浖?gòu)造(Object-Oriented Software Construction)》《設(shè)計(jì)模式(Design Patterns)》《The Art of Computer Programming》;

      33.記?。好嫦?qū)ο蠹夹g(shù)不只是C++專有的;

      34.請把書上的程序例子親手輸入到電腦上實(shí)踐,即使配套光盤中有源代碼;

      35.把在書中看到的有意義的例子擴(kuò)充;

      36.請重視C++中的異常處理技術(shù),并將其切實(shí)的運(yùn)用到自己的程序中;

      37.經(jīng)?;仡欁约阂郧皩戇^的程序,并嘗試重寫,把自己學(xué)到的新知識運(yùn)用進(jìn)去;

      38.不要漏掉書中任何一個(gè)練習(xí)題——請全部做完并記錄下解題思路;

      39.C++語言和C++的集成開發(fā)環(huán)境要同時(shí)學(xué)習(xí)和掌握;

      40.既然決定了學(xué)C++,就請堅(jiān)持學(xué)下去,因?yàn)閷W(xué)習(xí)程序設(shè)計(jì)語言的目的是掌握程序設(shè)計(jì)技術(shù),而程序設(shè)計(jì)技術(shù)是跨語言的;

      41.就讓C++語言的各種平臺和開發(fā)環(huán)境去激烈的競爭吧,我們要以學(xué)習(xí)C++語言本身為主;

      42.當(dāng)你寫C++程序?qū)懙揭话雲(yún)s發(fā)現(xiàn)自己用的方法很拙劣時(shí),請不要馬上停手;請盡快將余下的部分粗略的完成以保證這個(gè)設(shè)計(jì)的完整性,然后分析自己的錯(cuò)誤并重新設(shè)計(jì)和編寫(參見43);

      43.別心急,設(shè)計(jì)C++的class確實(shí)不容易;自己程序中的class和自己的class設(shè)計(jì)水平是在不斷的編程實(shí)踐中完善和發(fā)展的;

      44.決不要因?yàn)槌绦颉昂苄 本筒蛔裱承┠悴皇炀毜囊?guī)則——好習(xí)慣是培養(yǎng)出來的,而不是一次記住的;

      45.每學(xué)到一個(gè)C++難點(diǎn)的時(shí)候,嘗試著對別人講解這個(gè)知識點(diǎn)并讓他理解——你能講清楚才說明你真的理解了;

      46.記錄下在和別人交流時(shí)發(fā)現(xiàn)的自己忽視或不理解的知識點(diǎn);

      47.請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;

      48.保存好你寫過的所有的程序——那是你最好的積累之一;

      49.請不要做浮躁的人;

      50.請熱愛C++!

      建議你買本書,書比網(wǎng)上的電子版教程好的多,如計(jì)算機(jī)屆超級權(quán)威教授 譚浩強(qiáng) 老先生寫的《C語言程序設(shè)計(jì)(第三版)》,全國發(fā)行了700萬冊,可以說是學(xué)C語言的人必看的書,我們大學(xué)就用這本書,很適合自學(xué),通俗易懂

      建議你學(xué)習(xí)其它計(jì)算機(jī)知識時(shí)也看他的書,他出的書很多,涵蓋面廣,每一本都很經(jīng)典

      這里有他的教程word版下載

      另外,機(jī)械工業(yè)出版社的 計(jì)算機(jī)叢書系列也相當(dāng)經(jīng)典,全是翻譯國外經(jīng)典教材,國外計(jì)算機(jī)發(fā)展早,水平比國內(nèi)高很多,看這些教材事半功倍,推薦(美)Al Kelley Ira Pohl的《C語言教程第4版》

      學(xué)習(xí)程序語言要持之以恒,不浮躁,祝你成功

      第四篇:單片機(jī)C語言學(xué)習(xí)

      單片機(jī)C語言之一___________________________________________________________________ _____________________ 預(yù)處理 一》宏定義:

      1、不帶參數(shù):

      #define 標(biāo)識符 常量表達(dá)式

      /*#define是宏定義命令,宏名(標(biāo)識符)好習(xí)慣用大寫*/ #define NIL 0x80

      2、帶參數(shù):/*相當(dāng)于小函數(shù)*/ #define 宏名(參數(shù)表)字符串

      /*不僅要時(shí)行字任串替換還要進(jìn)行參數(shù)的替換,在宏定義時(shí),宏名與帶參數(shù)的括弧之間不應(yīng)該加空格,否則將空格以后的字符串都作為替代字符串的一部分,這可是很容易出錯(cuò)的*/ 如:#define SQ(a,b)a*b 使用:x=12;y=10;area=SQ(x,y);/*則area=12*10=120*/ 二》文件包含:

      #include <文件名>或#include “文件名” /*在C中用雙引用形式更保險(xiǎn),在C51中常用物是尖括弧形式*/ 三》條件編譯:

      /*一般源程序中的所有程序行都參加編譯,但有時(shí)希望對其中一部分內(nèi)容只在滿足一定條件下才進(jìn)行編譯,也就是對一部分內(nèi)容指定編譯的條件。*/ #if、#elif、#else、#endif、#ifdef、#ifndef /*選擇不同的編譯范圍,產(chǎn)生不同的代碼,提供通用性。*/ /*如對8051在6MHZ與12MHZ下有*/ #ifdef cpu==8051 #define FREQ 6 /*程序段*/ #else #define FREQ 12/*程序段*/ #endif /*這樣下面的原程序不用做任何修改便可以使用于兩種時(shí)鐘頻率的單片機(jī)系統(tǒng)*/ 四》其他:

      1、#error:捕捉不可預(yù)料的編譯條件

      #if(myv!=0&&myv!=1)/*假定其值必為0或1*/ #error myv must be 1 or 0/*出錯(cuò)時(shí)顯示*/ #endif

      2、#pragma:用于在程序中向編譯器傳送各種編譯控制命令 #pragma 編譯命令序列

      /*例:想按如下命令編譯ex.c c51 ex.c debug cod large可用:*/

      #pragma DB CD LA #pragma disable /*禁止中斷*/

      單片機(jī)C語言之二_____________________________________________________________________________________ 一》數(shù)據(jù)類型:

      char int long 1:unsinged 0~255 0~65535 0~4294967295 2:signed-128~127-32768~32767-2147483648~2147483647 指針:* 3字節(jié) 位標(biāo)量: sbit 特殊功能寄存器:sfr 16位特殊功能寄存器:sfr16 占2個(gè)內(nèi)存單元,0~65535 可尋址位:sbit利用他可訪問51單片機(jī)的內(nèi)部RAM中的可尋址位或特殊功能寄存器中的可尋址位 sfr P0=0x80;sbit P0_1=P0^1;/*將P0口的口地址定義為80H,將P0.1位定義為P1_1*/ 二》數(shù)據(jù)存貯類型

      表1.C51數(shù)據(jù)存貯類型

      ━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━ 數(shù)據(jù)存貯類型 ┃ 與存貯空間的對應(yīng)關(guān)系

      ━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━ data ┃ 直接尋址片內(nèi)數(shù)據(jù)存貯區(qū),訪速度快 bdata ┃ 可位尋址片內(nèi)數(shù)據(jù)存貯區(qū),允許位與字節(jié)混合訪問 idata ┃ 間接尋址片內(nèi)數(shù)據(jù)存貯區(qū),可訪問片內(nèi)全部RAM地址空間

      pdata ┃ 分頁尋址片外數(shù)據(jù)存貯區(qū)(256字節(jié))由MOVX @R0訪問 xdata ┃ 片外數(shù)據(jù)存貯區(qū)(64K),由MOVX @DPTR訪問 code ┃ 代碼存貯區(qū)(64K),由MOVC @DPTR訪問

      ━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━ 變量的存貯類型定義: char data var /*字符變量var被定義為data存貯類型,C51編譯器將把該變量定位在51單片機(jī)片內(nèi)數(shù)據(jù)區(qū)存貯區(qū)中*/ bit bdata flag /*位變量flag被定義為bdata存貯類型,C51編譯器將把該變量定位在51單片機(jī)片內(nèi)數(shù)據(jù)區(qū)存貯區(qū)(RAM)中的位尋址區(qū):20H--2FH*/

      三》typedef:重新定義數(shù)據(jù)類型

      typedef 已有數(shù)據(jù)類型 新的數(shù)據(jù)類型 typedef int word;/*將word定義為整型*/ word i,j;/*將i,j定義為整型*/ 四》位運(yùn)算符:

      ━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━━━━┳━━━━━━ ~ ┃ & ┃ | ┃ ^ ┃ << ┃ >> ━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━━━━╋━━━━━━

      按位取反┃ 按位與 ┃ 按位或 ┃ 按位異或 ┃ 左移 ┃ 右移

      ━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━━━━┻━━━━━━

      對移位:如<< ,a<<2,即為將二進(jìn)制的a左移兩位,若a=0x8f,即10001111,a=a<<2,將導(dǎo)致a=0x3c(00111100),右邊補(bǔ)零。五》條件運(yùn)算符:

      邏輯表達(dá)式? 表達(dá)式1:表達(dá)式2 六》指針與地址運(yùn)算符: *取內(nèi)容 &取地址

      七》強(qiáng)制類型轉(zhuǎn)換:(類型)=表達(dá)式(char *)0xb000 八》sizeof 取數(shù)據(jù)類型、變量以及表達(dá)式的字節(jié)數(shù)的運(yùn)算符; 九》continue:中斷語句:結(jié)束本次循環(huán)。

      單片機(jī)C語言之三_____________________________________________________________________________________ 函數(shù):

      一》中斷服務(wù)函數(shù)與寄存器組定義:

      函數(shù)類型 函數(shù)名(形式參數(shù)表)[interrupt n][using n] n為中斷號,0~31:

      ━━━━┳━━━━━┳━━━━━ 中斷編號┃ 中斷向量┃ 入口地址 ━━━━╋━━━━━╋━━━━━ 0 ┃ 外中斷0 ┃ 0003H ━━━━╋━━━━━╋━━━━━ 1 ┃ 定時(shí)器0 ┃ 000BH ━━━━╋━━━━━╋━━━━━ 2 ┃ 外中斷1 ┃ 0013H

      ━━━━╋━━━━━╋━━━━━ 3 ┃ 定時(shí)器1 ┃ 001BH ━━━━╋━━━━━╋━━━━━ 4 ┃ 串行口 ┃ 0023H ━━━━┻━━━━━┻━━━━━

      后面的n指的是四個(gè)工作寄存器組的一個(gè):0~3 對函數(shù)目標(biāo)代碼影響如下:

      在函數(shù)入口處將當(dāng)前工作寄存器組保護(hù)到堆棧中;指定的工作寄存器內(nèi)容不會改變,函數(shù)返回前將被保護(hù)的工作寄存器組從堆棧中恢復(fù)!例(定時(shí)1ms):

      #include sbit P1_0=P1^0;void timer0(void)interrupt 1 using 1{ P1_0=!P1_0;TH0=-(1000/256);TL0=-(1000%256);} main(){ SP=0x60;P1_0=0;TMOD=0X01;TH0=-(1000/256);TL0=-(1000%256);EA=1;ET0=1;TR0=1;do{}while(1);} /* 注意:

      1、如果中斷函數(shù)中用到浮點(diǎn)運(yùn)算,必須保存浮點(diǎn)寄存器的狀態(tài)。(在math.h中保存浮點(diǎn)寄存器函數(shù)為pfsave, 恢復(fù)浮點(diǎn)寄存器的狀態(tài)函數(shù)為fprestore)

      2、如果在中斷函數(shù)中調(diào)用了其他函數(shù),則被調(diào)函數(shù)所使用的工作寄存器組與中斷函數(shù)的一致!*/

      單片機(jī)C語言之四_____________________________________________________________________________________

      一、局部變量與全局變量(外部變量):

      1、全局變量若不在開頭定義則加extern

      2、全局變量會使代碼長,占用內(nèi)存多

      二、存儲方式:

      自動變量(auto):缺省,函數(shù)調(diào)用存在,退出消失。

      內(nèi)部變量 靜態(tài)變量(static):static int a=5;始終存在,退出不消失,但不能訪問。寄存器變量(register):速度最快。通常只給編譯器一個(gè)建議,由編譯器根 據(jù)實(shí)際情況確定。(見下)變量 全局變量(global): 外部變量

      靜態(tài)變量(static): 寄存器變量例: #include int_power(m,e)int m;register int e;{ register int temp;temp=1;for(;e;e--)temp*=m;return(temp);} main(){ ?? }

      三、函數(shù)的參數(shù)和局部變量的存儲器模式: 三種存儲器模式:small,compact,large.一個(gè)函數(shù)的存儲器模式確定了函數(shù)的參數(shù)和局部變量在內(nèi)存中的地址空間 small:內(nèi)部ram compact, large:外部RAM 函數(shù)類型 函數(shù)名(形式參數(shù)表)[存儲器模式] 例:

      #pragma large /*默認(rèn)存儲器模式為large*/ extern int calc(char I,int b)small;/*指定small模式*/ extern int func(int I,float f)large;/*指定large模式*/ int large_te(int I,int k)/*未指定,按默認(rèn)的large模式處理*/ { return(mtest(I,k)+2);}

      利用存儲器混合模式編程,充分利用有限的存儲空間,還可加快程序的執(zhí)行速度!

      單片機(jī)C語言之五_____________________________________________________________________________________ 數(shù)組 1>初始化數(shù)組: unsigned char a[5]={0x11,0x22,0x33,0x44,0x55} 或

      unsigned char a[ ] ={0x11,0x22,0x33,0x44,0x55,0x66} 3>數(shù)組作為函數(shù)的參數(shù):不但可以由變量作為函數(shù)的參數(shù)外,還可以用數(shù)組名作為函數(shù)的參數(shù)。一個(gè)數(shù)組數(shù)組名表示該數(shù)組的首地址。用一個(gè)數(shù)組名作為函數(shù)的參數(shù)時(shí),在執(zhí)行函數(shù)調(diào)用的過程中參數(shù)傳遞方式采用的是地址傳遞。將實(shí)際參數(shù)數(shù)組首地址傳遞給被調(diào)函數(shù)中的形式參數(shù)數(shù)組,這樣一來兩個(gè)數(shù)組就占有同一段內(nèi)存單元。見下圖:

      a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 起始地址1000 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b[8] b[9] 用數(shù)組名作為函數(shù)的參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)函數(shù)中分別進(jìn)行數(shù)組定義而不能只在一方定義數(shù)組。而且在兩個(gè)函數(shù)中定義的數(shù)組類型必須一致,如果類型不一致將導(dǎo)致編譯出錯(cuò)。實(shí)參數(shù)組和型參數(shù)組的長度可以一致可以不一致,編譯器對形參數(shù)組的長度不做檢查,直只是將實(shí)參數(shù)組的首地址傳遞給行參數(shù)組。如果希望行參數(shù)組能得到實(shí)參數(shù)組的全部元素,則應(yīng)使兩個(gè)數(shù)組的長度一致。定義型參數(shù)組時(shí)可以不指定長度,只在數(shù)組名后面跟一個(gè)方括號[]。這時(shí)為了在被調(diào)函數(shù)中處理數(shù)組元素的需要,應(yīng)另外設(shè)置一個(gè)參數(shù)來傳遞數(shù)組元素的個(gè)數(shù)。

      例:用數(shù)組作為函數(shù)的參數(shù),計(jì)算兩個(gè)不同長度的數(shù)組中所有元素的平均值 #include float average(array,n)int n;float array[ ];{ int I;float aver,sum=array[0];for(I=1;I

      float pot_1[2]={99.9,88.8};float pot_2[3]={11,22,33.3};average(pot_1,2);average(pot_1,3);}

      單片機(jī)C語言之六_____________________________________________________________________________________ 軟件法去干擾:

      工程上我們在采集數(shù)據(jù)時(shí)一般要求精度達(dá)到5%%,大于這個(gè)值將認(rèn)為無效。我在實(shí)際應(yīng)用中采用8535對32路數(shù)據(jù)進(jìn)行采集(8535帶10位AD,帶看門狗),發(fā)現(xiàn)數(shù)據(jù)跳動有時(shí)達(dá)7%%,這是由于各種干擾造成的。主要來自于隨機(jī)干擾,下面就各種干擾的方法給出簡單的去除方法:

      1、白噪聲:最重要的統(tǒng)計(jì)特性為平均值為0,可采取每路數(shù)據(jù)采集幾次求平均的方法;

      2、隨機(jī)干擾:該點(diǎn)明顯高于或低于附近正常采樣值,故采取中值濾波法,即對被測信號連續(xù)采樣M次,進(jìn)行大小排序,取大小居中的1/3個(gè)采樣值進(jìn)行算術(shù)平均;

      3、電源干擾:特點(diǎn)是有固定周期,故可采用定時(shí)采樣求平均的方法。

      由于各種排序與求平均算法用C易于實(shí)現(xiàn),故C常常用于采集系統(tǒng)中軟件去干擾。至于排序算法可參考上一篇文章,有一個(gè)經(jīng)典的程序。

      在實(shí)際中我們采用每路猜9個(gè)值,排序,取中間3個(gè),求平均。然后。,每路數(shù)據(jù)幾乎不動!

      單片機(jī)C語言之七_(dá)____________________________________________________________________________________ 指針:可對內(nèi)存地址直接操作

      基于存貯器的指以貯器類為參量,它在編譯時(shí)才被確定。因此為指針選擇存貯器的方法可以省掉,以這些指針的長度可為1個(gè)字節(jié)(idata *,data *,pdata *)或2個(gè)這節(jié)(code *,xdata *)。char xdata *address;ADC0809具有8個(gè)模擬量輸入通道,采用中斷方式,在中斷函數(shù)中讀取8個(gè)通道的A/D轉(zhuǎn)換值,分別存儲在外部RAM的1000H~1007H單元。ADC0809端口地址為00F0H。

      程序定義了兩個(gè)指針變量* ADC和* ADCdata,分別指向ADC0809端口地址(00F0H)和外部RAM單元地址(1000H~1007H)

      由*ADC=I送入通道數(shù),啟動ADC0809進(jìn)行A/D轉(zhuǎn)換,轉(zhuǎn)換結(jié)束時(shí)產(chǎn)生INT1中斷。在中斷服務(wù)函數(shù)int1()中通過temp=*ADC和*ADCdata=temp;讀取A/D轉(zhuǎn)換結(jié)果并存到外部RAM中。#include unsigned int xdata *ADC;/*定義ADC0809端口指針*/ unsigned int xdata *ADCdata;/*定義ADC0809數(shù)據(jù)緩沖器指針*/ unsigned char I;

      void main(){ ADC=0x00f0;/*定義端口地址和數(shù)據(jù)緩沖器地址*/ ADCdata=0x1000;I=8;/* ADC0809有8個(gè)模擬輸入通道*/ EA=1;EX1=1;IT1=1;/*開中斷*/ *ADC=I;/*啟動ADC0809*/ WHILE(I);/*等待8個(gè)通道A/D轉(zhuǎn)換完*/ } void int1()interrupt 2 { unsigned char tmp;temp=*ADC;/*讀取A/D轉(zhuǎn)換結(jié)果*/ *ADCdata=temp;/*結(jié)果值存到數(shù)據(jù)緩沖區(qū)*/ ADCdata++;/*數(shù)據(jù)緩沖區(qū)地址加1*/ i—;*ADC=I;/*啟動下一個(gè)模擬輸入通道A/D轉(zhuǎn)換*/ } 除了用指針變量來實(shí)現(xiàn)對內(nèi)存地址的直接操作外,c51編譯器還提供一組宏,該宏定義文件為:“absacc.h”,利用它可十分方便地實(shí)現(xiàn)對任何內(nèi)存空間的直接操作,改寫上面的程序: #include #include /*包含絕對地址操作預(yù)定義頭文件*/ #define ADC 0x00f0;/*定義ADC0809端口地址*/ #define ADCdata 0X1000 /*定義數(shù)據(jù)緩沖器地址*/ unsigned char I;void main(){ I=8;/ *ADC0809有8個(gè)模擬輸入通道*/ EA=1;ex1=1;it1=1;/ *開中斷*/ XBYTE[ADC]=I;/*啟動0809 */ While(i);/*等待8個(gè)通道轉(zhuǎn)換完畢*/ } void int1()interrupt2 { unsigned char tmp;tmp=XBYTE[ADC];/*讀取A/D轉(zhuǎn)換結(jié)果*/ i--;XBYTE[ADCdata+I]=tmp;/**結(jié)果值存儲到數(shù)據(jù)緩沖器*/ XBYTE[ADC]=I;/*啟動下一個(gè)模擬輸入通道A/D轉(zhuǎn)換*/ } 兩指針相減-----計(jì)算字符串的長度 #include main(){

      char *s=”abcdef”;int strlen(char *s);printf(“n length of ‘%%s’=%%dn”,s,strlen(s));} int strlen(char *s){ char *p=s;while(*p!=’