當前位置:首頁 » 編程語言 » c語言介面隔離規定
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言介面隔離規定

發布時間: 2022-07-03 22:10:58

1. 什麼是c語言

C語言是Combined Language(組合語言)的中英混合簡稱。是一種計算機程序設計語言。它既具有高級語言的特點,又具有匯編語言的特點。它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序。因此,它的應用范圍廣泛,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,具體應用比如單片機以及嵌入式系統開發。
C語言是一種面向過程的計算機程序設計語言,它是目前眾多計算機語言中舉世公認的優秀的結構程序設計語言之一。它由美國貝爾研究所的D.M.Ritchie於1972年推出。1978後,C語言已先後被移植到大、中、小及微型機上。C語言發展如此迅速,而且成為最受歡迎的語言之一,主要因為它具有強大的功能。許多著名的系統軟體,如DBASE Ⅳ都是由C 語言編寫的。用C 語言加上一些匯編語言子程序,就更能顯示C 語言的優勢了,像PC- DOS 、WORDSTAR等就是用這種方法編寫的。
C語言是一種成功的系統描述語言,用C語言開發的UNIX操作系統就是一個成功的範例;同時C語言又是一種通用的程序設計語言,在國際上廣泛流行。世界上很多著名的計算公司都成功的開發了不同版本的C語言,很多優秀的應用程序也都使用C語言開發的,它是一種很有發展前途的高級程序設計語言。
1. C是中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。C 語言可以像匯編語言一樣對位、位元組和地址進行操作, 而這三者是計算機最基本的工作單元。
2.C是結構式語言。結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結構化方式可使程序層次清晰,便於使用、維護以及調試。C 語言是以函數形式提供給用戶的,這些函數可方便的調用,並具有多種循環、條件語句控製程序流向,從而使程序完全結構化。
3.C語言功能齊全。具有各種各樣的數據類型,並引入了指針概念,可使程序效率更高。另外C語言也具有強大的圖形功能,支持多種顯示器和驅動器。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的的游戲。
4. C語言適用范圍大。適合於多種操作系統,如Windows、DOS、UNIX等等;也適用於多種機型。C語言對編寫需要硬體進行操作的場合,明顯優於其它解釋型高級語言,有一些大型應用軟體也是用C語言編寫的。C語言具有繪圖能力強,可移植性,並具備很強的數據處理能力,因此適於編寫系統軟體,三維,二維圖形和動畫。它是數值計算的高級語言。
5.C語言文件由數據序列組成,可以構成二進制文件或文本文件 常用的C語言IDE(集成開發環境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++ ,Borland C++ Builder,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc 等等…… 對於一個初學者,Microsoft Visual C++是一個比較好的軟體。界面友好,功能強大,調試也很方便。
學習C語言
在初學C語言時,可能會遇到有些問題理解不透,或者表達方式與以往數學學習中不同(如運算符等),這就要求不氣餒,不明白的地方多問多想,鼓足勇氣進行學習,待學完後面的章節知識,前面的問題也就迎刃而解了,這一方面我感覺是我們同學最欠缺的。大多學不好的就是因為一開始遇到困難就放棄,曾經和好多同學談他的問題,回答是聽不懂、不想聽、放棄這樣三個過程,我反問,這節課你聽過課嗎?回答又是沒有,根本就沒聽過課,怎麼說自己聽不懂呢?相應的根本就沒學習,又談何學得好? 學習C語言始終要記住「曙光在前頭」和「千金難買回頭看」,「千金難買回頭看」是學習知識的重要方法,就是說,學習後面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識,這是我們學生最不易做到的,然而卻又是最重要的。學習C語言就是要經過幾個反復,才能前後貫穿,積累應該掌握的C知識。
掌握一些簡單的演算法
編程其實一大部分工作就是分析問題,找到解決問題的方法,再以相應的編程語言寫出代碼。這就要求掌握演算法,根據我們的《C程序設計》教學大綱中,只要求我們掌握一些簡單的演算法,在掌握這些基本演算法後,要完成對問題的分析就容易了。如兩個數的交換、三個數的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些演算法的內在含義 結語:當我們把握好上述幾方面後,只要同學們能克服畏難、厭學、上課能專心聽講,做好練習與上機調試,其實C語言並不難學 。

2. 9.下列屬於面向對象基本原則的是()。 A.繼承 B.封裝 C.里氏替換 D.都不是

C
面向對象的五個基本原則:
單一職責原則(SRP)
開放封閉原則(OCP)
里氏替換原則(LSP)
依賴倒置原則(DIP)
介面隔離原則(ISP)
封裝,繼承,多態只是面向對象的三大特性

3. C語言程序設計

不返回值
不加也可以的!加上return 0 主要是讓別人知道這個函數已經結束

4. c語言程序設計

\t 是水平製表,也就是輸出一個數,都按默認的對齊,或是默認的空格
\b是回退,向後退一格
最後一個數可能是c退回去把b取代了

5. c/c++ 類永遠只是聲明

的執行速度慢上約20倍。無論什麼都不能阻止Java語言進行編譯。寫作本書的時候,剛剛出現了一些准實時編譯器,它們能顯著加快速度。當然,我們完全有理由認為會出現適用於更多流行平台的純固有編譯器,但假若沒有那些編譯器,由於速度的限制,必須有些問題是Java不能解決的。

(2) 和C++一樣,Java也提供了兩種類型的注釋。

(3) 所有東西都必須置入一個類。不存在全局函數或者全局數據。如果想獲得與全局函數等價的功能,可考慮將static方法和static數據置入一個類里。注意沒有象結構、枚舉或者聯合這一類的東西,一切只有「類」(Class)!

(4) 所有方法都是在類的主體定義的。所以用C++的眼光看,似乎所有函數都已嵌入,但實情並非如何(嵌入的問題在後面講述)。

(5) 在Java中,類定義採取幾乎和C++一樣的形式。但沒有標志結束的分號。沒有class foo這種形式的類聲明,只有類定義。

class aType()

void aMethod()

}

(6) Java中沒有作用域范圍運算符「::」。Java利用點號做所有的事情,但可以不用考慮它,因為只能在一個類里定義元素。即使那些方法定義,也必須在一個類的內部,所以根本沒有必要指定作用域的范圍。我們注意到的一項差異是對static方法的調用:使用ClassName.methodName()。除此以外,package(包)的名字是用點號建立的,並能用import關鍵字實現C++的「
import java.awt.*;


(7) 與C++類似,Java含有一系列「主類型」(Primitive type),以實現更有效率的訪問。在Java中,這些類型包括boolean,char,byte,short,int,long,float以及double。所有主類型的大小都是固有的,且與具體的機器無關(考慮到移植的問題)。這肯定會對性能造成一定的影響,具體取決於不同的機器。對類型的檢查和要求在Java里變得更苛刻。例如:

■條件表達式只能是boolean(布爾)類型,不可使用整數。

■必須使用象X+Y這樣的一個表達式的結果;不能僅僅用「X+Y」來實現「副作用」。

(8) char(字元)類型使用國際通用的16位Unicode字元集,所以能自動表達大多數國家的字元。

(9) 靜態引用的字串會自動轉換成String對象。和C及C++不同,沒有獨立的靜態字元數組字串可供使用。

(10) Java增添了三個右移位運算符「>>>」,具有與「邏輯」右移位運算符類似的功用,可在最末尾插入零值。「>>」則會在移位的同時插入符號位(即「算術」移位)。

(11) 盡管表面上類似,但與C++相比,Java數組採用的是一個頗為不同的結構,並具有獨特的行為。有一個只讀的length成員,通過它可知道數組有多大。而且一旦超過數組邊界,運行期檢查會自動丟棄一個異常。所有數組都是在內存「堆」里創建的,我們可將一個數組分配給另一個(只是簡單地復制數組句柄)。數組標識符屬於第一級對象,它的所有方法通常都適用於其他所有對象。

(12) 對於所有不屬於主類型的對象,都只能通過new命令創建。和C++不同,Java沒有相應的命令可以「在堆棧上」創建不屬於主類型的對象。所有主類型都只能在堆棧上創建,同時不使用new命令。所有主要的類都有自己的「封裝(器)」類,所以能夠通過new創建等價的、以內存「堆」為基礎的對象(主類型數組是一個例外:它們可象C++那樣通過集合初始化進行分配,或者使用new)。

(13) Java中不必進行提前聲明。若想在定義前使用一個類或方法,只需直接使用它即可——編譯器會保證使用恰當的定義。所以和在C++中不同,我們不會碰到任何涉及提前引用的問題。

(14) Java沒有預處理機。若想使用另一個庫里的類,只需使用import命令,並指定庫名即可。不存在類似於預處理機的宏。

(15) Java用包代替了命名空間。由於將所有東西都置入一個類,而且由於採用了一種名為「封裝」的機制,它能針對類名進行類似於命名空間分解的操作,所以命名的問題不再進入我們的考慮之列。數據包也會在單獨一個庫名下收集庫的組件。我們只需簡單地「import」(導入)一個包,剩下的工作會由編譯器自動完成。

(16) 被定義成類成員的對象句柄會自動初始化成null。對基本類數據成員的初始化在Java里得到了可靠的保障。若不明確地進行初始化,它們就會得到一個默認值(零或等價的值)。可對它們進行明確的初始化(顯式初始化):要麼在類內定義它們,要麼在構建器中定義。採用的語法比C++的語法更容易理解,而且對於static和非static成員來說都是固定不變的。我們不必從外部定義static成員的存儲方式,這和C++是不同的。

(17) 在Java里,沒有象C和C++那樣的指針。用new創建一個對象的時候,會獲得一個引用(本書一直將其稱作「句柄」)。例如:

String s = new String("howdy");

然而,C++引用在創建時必須進行初始化,而且不可重定義到一個不同的位置。但Java引用並不一定局限於創建時的位置。它們可根據情況任意定義,這便消除了對指針的部分需求。在C和C++里大量採用指針的另一個原因是為了能指向任意一個內存位置(這同時會使它們變得不安全,也是Java不提供這一支持的原因)。指針通常被看作在基本變數數組中四處移動的一種有效手段。Java允許我們以更安全的形式達到相同的目標。解決指針問題的終極方法是「固有方法」(已在附錄A討論)。將指針傳遞給方法時,通常不會帶來太大的問題,因為此時沒有全局函數,只有類。而且我們可傳遞對對象的引用。Java語言最開始聲稱自己「完全不採用指針!」但隨著許多程序員都質問沒有指針如何工作?於是後來又聲明「採用受到限制的指針」。大家可自行判斷它是否「真」的是一個指針。但不管在何種情況下,都不存在指針「算術」。

(18) Java提供了與C++類似的「構建器」(Constructor)。如果不自己定義一個,就會獲得一個默認構建器。而如果定義了一個非默認的構建器,就不會為我們自動定義默認構建器。這和C++是一樣的。注意沒有復制構建器,因為所有自變數都是按引用傳遞的。

(19) Java中沒有「破壞器」(Destructor)。變數不存在「作用域」的問題。一個對象的「存在時間」是由對象的存在時間決定的,並非由垃圾收集器決定。有個finalize()方法是每一個類的成員,它在某種程度上類似於C++的「破壞器」。但finalize()是由垃圾收集器調用的,而且只負責釋放「資源」(如打開的文件、套接字、埠、URL等等)。如需在一個特定的地點做某樣事情,必須創建一個特殊的方法,並調用它,不能依賴finalize()。而在另一方面,C++中的所有對象都會(或者說「應該」)破壞,但並非Java中的所有對象都會被當作「垃圾」收集掉。由於Java不支持破壞器的概念,所以在必要的時候,必須謹慎地創建一個清除方法。而且針對類內的基礎類以及成員對象,需要明確調用所有清除方法。

(20) Java具有方法「過載」機制,它的工作原理與C++函數的過載幾乎是完全相同的。

(21) Java不支持默認自變數。

(22) Java中沒有goto。它採取的無條件跳轉機制是「break 標簽」或者「continue 標准」,用於跳出當前的多重嵌套循環。

(23) Java採用了一種單根式的分級結構,因此所有對象都是從根類Object統一繼承的。而在C++中,我們可在任何地方啟動一個新的繼承樹,所以最後往往看到包含了大量樹的「一片森林」。在Java中,我們無論如何都只有一個分級結構。盡管這表面上看似乎造成了限制,但由於我們知道每個對象肯定至少有一個Object介面,所以往往能獲得更強大的能力。C++目前似乎是唯一沒有強制單根結構的唯一一種OO語言。

(24) Java沒有模板或者參數化類型的其他形式。它提供了一系列集合:Vector(向量),Stack(堆棧)以及Hashtable(散列表),用於容納Object引用。利用這些集合,我們的一系列要求可得到滿足。但這些集合並非是為實現象C++「標准模板庫」(STL)那樣的快速調用而設計的。Java 1.2中的新集合顯得更加完整,但仍不具備正宗模板那樣的高效率使用手段。

(25) 「垃圾收集」意味著在Java中出現內存漏洞的情況會少得多,但也並非完全不可能(若調用一個用於分配存儲空間的固有方法,垃圾收集器就不能對其進行跟蹤監視)。然而,內存漏洞和資源漏洞多是由於編寫不當的finalize()造成的,或是由於在已分配的一個塊尾釋放一種資源造成的(「破壞器」在此時顯得特別方便)。垃圾收集器是在C++基礎上的一種極大進步,使許多編程問題消彌於無形之中。但對少數幾個垃圾收集器力有不逮的問題,它卻是不大適合的。但垃圾收集器的大量優點也使這一處缺點顯得微不足道。

(26) Java內建了對多線程的支持。利用一個特殊的Thread類,我們可通過繼承創建一個新線程(放棄了run()方法)。若將synchronized(同步)關鍵字作為方法的一個類型限制符使用,相互排斥現象會在對象這一級發生。在任何給定的時間,只有一個線程能使用一個對象的synchronized方法。在另一方面,一個synchronized方法進入以後,它首先會「鎖定」對象,防止其他任何synchronized方法再使用那個對象。只有退出了這個方法,才會將對象「解鎖」。在線程之間,我們仍然要負責實現更復雜的同步機制,方法是創建自己的「監視器」類。遞歸的synchronized方法可以正常運作。若線程的優先等級相同,則時間的「分片」不能得到保證。

(27) 我們不是象C++那樣控制聲明代碼塊,而是將訪問限定符(public,private和protected)置入每個類成員的定義里。若未規定一個「顯式」(明確的)限定符,就會默認為「友好的」(friendly)。這意味著同一個包里的其他元素也可以訪問它(相當於它們都成為C++的「friends」——朋友),但不可由包外的任何元素訪問。類——以及類內的每個方法——都有一個訪問限定符,決定它是否能在文件的外部「可見」。private關鍵字通常很少在Java中使用,因為與排斥同一個包內其他類的訪問相比,「友好的」訪問通常更加有用。然而,在多線程的環境中,對private的恰當運用是非常重要的。Java的protected關鍵字意味著「可由繼承者訪問,亦可由包內其他元素訪問」。注意Java沒有與C++的protected關鍵字等價的元素,後者意味著「只能由繼承者訪問」(以前可用「private protected」實現這個目的,但這一對關鍵字的組合已被取消了)。

(28) 嵌套的類。在C++中,對類進行嵌套有助於隱藏名稱,並便於代碼的組織(但C++的「命名空間」已使名稱的隱藏顯得多餘)。Java的「封裝」或「打包」概念等價於C++的命名空間,所以不再是一個問題。Java 1.1引入了「內部類」的概念,它秘密保持指向外部類的一個句柄——創建內部類對象的時候需要用到。這意味著內部類對象也許能訪問外部類對象的成員,毋需任何條件——就好象那些成員直接隸屬於內部類對象一樣。這樣便為回調問題提供了一個更優秀的方案——C++是用指向成員的指針解決的。

(29) 由於存在前面介紹的那種內部類,所以Java里沒有指向成員的指針。

(30) Java不存在「嵌入」(inline)方法。Java編譯器也許會自行決定嵌入一個方法,但我們對此沒有更多的控制權力。在Java中,可為一個方法使用final關鍵字,從而「建議」進行嵌入操作。然而,嵌入函數對於C++的編譯器來說也只是一種建議。

(31) Java中的繼承具有與C++相同的效果,但採用的語法不同。Java用extends關鍵字標志從一個基礎類的繼承,並用super關鍵字指出准備在基礎類中調用的方法,它與我們當前所在的方法具有相同的名字(然而,Java中的super關鍵字只允許我們訪問父類的方法——亦即分級結構的上一級)。通過在C++中設定基礎類的作用域,我們可訪問位於分級結構較深處的方法。亦可用super關鍵字調用基礎類構建器。正如早先指出的那樣,所有類最終都會從Object里自動繼承。和C++不同,不存在明確的構建器初始化列表。但編譯器會強迫我們在構建器主體的開頭進行全部的基礎類初始化,而且不允許我們在主體的後面部分進行這一工作。通過組合運用自動初始化以及來自未初始化對象句柄的異常,成員的初始化可得到有效的保證。

1045頁程序

(32) Java中的繼承不會改變基礎類成員的保護級別。我們不能在Java中指定public,private或者protected繼承,這一點與C++是相同的。此外,在衍生類中的優先方法不能減少對基礎類方法的訪問。例如,假設一個成員在基礎類中屬於public,而我們用另一個方法代替了它,那麼用於替換的方法也必須屬於public(編譯器會自動檢查)。

(33) Java提供了一個interface關鍵字,它的作用是創建抽象基礎類的一個等價物。在其中填充抽象方法,且沒有數據成員。這樣一來,對於僅僅設計成一個介面的東西,以及對於用extends關鍵字在現有功能基礎上的擴展,兩者之間便產生了一個明顯的差異。不值得用abstract關鍵字產生一種類似的效果,因為我們不能創建屬於那個類的一個對象。一個abstract(抽象)類可包含抽象方法(盡管並不要求在它裡麵包含什麼東西),但它也能包含用於具體實現的代碼。因此,它被限製成一個單一的繼承。通過與介面聯合使用,這一方案避免了對類似於C++虛擬基礎類那樣的一些機制的需要。

為創建可進行「例示」(即創建一個實例)的一個interface(介面)的版本,需使用implements關鍵字。它的語法類似於繼承的語法,如下所示:

1046頁程序

(34) Java中沒有virtual關鍵字,因為所有非static方法都肯定會用到動態綁定。在Java中,程序員不必自行決定是否使用動態綁定。C++之所以採用了virtual,是由於我們對性能進行調整的時候,可通過將其省略,從而獲得執行效率的少量提升(或者換句話說:「如果不用,就沒必要為它付出代價」)。virtual經常會造成一定程度的混淆,而且獲得令人不快的結果。final關鍵字為性能的調整規定了一些范圍——它向編譯器指出這種方法不能被取代,所以它的范圍可能被靜態約束(而且成為嵌入狀態,所以使用C++非virtual調用的等價方式)。這些優化工作是由編譯器完成的。

(35) Java不提供多重繼承機制(MI),至少不象C++那樣做。與protected類似,MI表面上是一個很不錯的主意,但只有真正面對一個特定的設計問題時,才知道自己需要它。由於Java使用的是「單根」分級結構,所以只有在極少的場合才需要用到MI。interface關鍵字會幫助我們自動完成多個介面的合並工作。

(36) 運行期的類型標識功能與C++極為相似。例如,為獲得與句柄X有關的信息,可使用下述代碼:

X.getClass().getName();

為進行一個「類型安全」的緊縮造型,可使用:

derived d = (derived)base;

這與舊式風格的C造型是一樣的。編譯器會自動調用動態造型機制,不要求使用額外的語法。盡管它並不象C++的「new casts」那樣具有易於定位造型的優點,但Java會檢查使用情況,並丟棄那些「異常」,所以它不會象C++那樣允許壞造型的存在。

(37) Java採取了不同的異常控制機制,因為此時已經不存在構建器。可添加一個finally從句,強制執行特定的語句,以便進行必要的清除工作。Java中的所有異常都是從基礎類Throwable里繼承而來的,所以可確保我們得到的是一個通用介面。

1047頁程序

(38) Java的異常規范比C++的出色得多。丟棄一個錯誤的異常後,不是象C++那樣在運行期間調用一個函數,Java異常規范是在編譯期間檢查並執行的。除此以外,被取代的方法必須遵守那一方法的基礎類版本的異常規范:它們可丟棄指定的異常或者從那些異常衍生出來的其他異常。這樣一來,我們最終得到的是更為「健壯」的異常控制代碼。

(39) Java具有方法過載的能力,但不允許運算符過載。String類不能用+和+=運算符連接不同的字串,而且String表達式使用自動的類型轉換,但那是一種特殊的內建情況。

(40) 通過事先的約定,C++中經常出現的const問題在Java里已得到了控制。我們只能傳遞指向對象的句柄,本地副本永遠不會為我們自動生成。若希望使用類似C++按值傳遞那樣的技術,可調用clone(),生成自變數的一個本地副本(盡管clone()的設計依然尚顯粗糙——參見第12章)。根本不存在被自動調用的副本構建器。為創建一個編譯期的常數值,可象下面這樣編碼:

static final int SIZE = 255

static final int BSIZE = 8 * SIZE

(41) 由於安全方面的原因,「應用程序」的編程與「程序片」的編程之間存在著顯著的差異。一個最明顯的問題是程序片不允許我們進行磁碟的寫操作,因為這樣做會造成從遠程站點下載的、不明來歷的程序可能胡亂改寫我們的磁碟。隨著Java 1.1對數字簽名技術的引用,這一情況已有所改觀。根據數字簽名,我們可確切知道一個程序片的全部作者,並驗證他們是否已獲得授權。Java 1.2會進一步增強程序片的能力。

(42) 由於Java在某些場合可能顯得限制太多,所以有時不願用它執行象直接訪問硬體這樣的重要任務。Java解決這個問題的方案是「固有方法」,允許我們調用由其他語言寫成的函數(目前只支持C和C++)。這樣一來,我們就肯定能夠解決與平台有關的問題(採用一種不可移植的形式,但那些代碼隨後會被隔離起來)。程序片不能調用固有方法,只有應用程序才可以。

(43) Java提供對注釋文檔的內建支持,所以源碼文件也可以包含它們自己的文檔。通過一個單獨的程序,這些文檔信息可以提取出來,並重新格式化成HTML。這無疑是文檔管理及應用的極大進步。

(44) Java包含了一些標准庫,用於完成特定的任務。C++則依靠一些非標準的、由其他廠商提供的庫。這些任務包括(或不久就要包括):

■連網

資料庫連接(通過JDBC)

■多線程

■分布式對象(通過RMI和CORBA)

■壓縮

■商貿

由於這些庫簡單易用,而且非常標准,所以能極大加快應用程序的開發速度。

(45) Java 1.1包含了Java Beans標准,後者可創建在可視編程環境中使用的組件。由於遵守同樣的標准,所以可視組件能夠在所有廠商的開發環境中使用。由於我們並不依賴一家廠商的方案進行可視組件的設計,所以組件的選擇餘地會加大,並可提高組件的效能。除此之外,Java Beans的設計非常簡單,便於程序員理解;而那些由不同的廠商開發的專用組件框架則要求進行更深入的學習。

(46) 若訪問Java句柄失敗,就會丟棄一次異常。這種丟棄測試並不一定要正好在使用一個句柄之前進行。根據Java的設計規范,只是說異常必須以某種形式丟棄。許多C++運行期系統也能丟棄那些由於指針錯誤造成的異常。

(47) Java通常顯得更為健壯,為此採取的手段如下:

■對象句柄初始化成null(一個關鍵字)

■句柄肯定會得到檢查,並在出錯時丟棄異常

■所有數組訪問都會得到檢查,及時發現邊界違例情況

■自動垃圾收集,防止出現內存漏洞

■明確、「傻瓜式」的異常控制機制

■為多線程提供了簡單的語言支持

■對網路程序片進行位元組碼校驗

6. c語言程序設計

(一)「項目驅動」式教學
目前最著名、最有影響、應用最廣泛的windows、linux和UNIX三個操作系統都是用C語言編寫的。0S是計算機系統(由軟硬體兩個子系統構成)的核心和靈魂,它是軟體中最龐大最復雜的系統軟體。既然如此龐大復雜的0S都可以用c語言編寫,從狹義而言,還有什麼系統軟體和應用軟體不能用c語言編寫呢?由此可以肯定的說,c語言是一門十分優秀而又重要的語言。
c語言程序設計是過程性程序設計語言,它的發展貫穿了計算機發展的歷程,它蘊含了程序設計的基本思想,囊括了程序設計的基本概念,所以它是理工科高等院校的一門基礎課程。
從市面上有關c語言的書籍和高等院校採用的教材來看,它們有一個共性,那就是:脫離了實際應用(全是小打小鬧的小例子),純粹的過程性程序設計,沒有軟體工程思想的體現,沒有一定程序設計風格,僅僅是為了讓大家明白什麼是c語言而已。
高等院校開設c語言程序設計的目的是讓學生對程序設計有個入門,有個直觀的理解,同時為其他後續課程作鋪墊。但是如果教學僅僅以此為目的,那麼教學本身就效果而言是個大大的失敗。
大家知道,在商業上講究唯利是圖,「利」是商業追求的目標,離開了「利」經商,則商無動力,其結果是必敗無疑。在c語言程序設計教學當中,教師應該把「唯用是圖」作為教學的首要目標。如果拋開了實際應用進行程序設計教學,就是紙上談兵,就是「說明書」式的教學。印度的程序設計課程採用「事件驅動式」教學,我認為在中國的c語言程序設計教學中應該採用「項目驅動式」教學。「項目驅動式」教學就是以項目為目的,以c語言理論教學為過程,最終能用c語言設計項目,實現項目的要求。「項目驅動式」教學的關鍵在於培養學生「如何做什麼」和「可以干什麼」。一個項目就是一個工程,在「項目驅動式」教學中,首先應該讓學生簡單了解什麼是軟體工程思想,其次在c語言理論教學過程中,讓學生懂得面向對象的程序設計的風格,最後引導他們來設計項目。
(二)「項目驅動」式教學應注意的問題
1.c語言程序設計教學要幫助學生樹立面向工程的觀點
在計算機行業中,軟體是通過人們的智力活動、把知識與技術轉化成信息的一種產品。軟體的設計已經用工程的觀念來進行管理。軟體設計工作被當作一項系統工程來對待。軟體的的生存周期一般可分為以下階段:問題定義、可行性研究、需求分析、概要設計、詳細設計、編碼、測試、運行與維護。我們不難看出軟體工程的復雜程度是很大的。理工科高等院校把c語言作為一門基礎課程,也是為了給社會培養信息技術人才。眾所周知,養成一個好的習慣是非常重要的,所以c語言程序設計作為大多數工科院校學生接觸的第一門程序設計語言(有的院校講pascal),就應該讓學生樹立正確的觀點。那麼當前的程序設計教學也必須以切合將來軟體工程開發的實際需要為第一目標,使學生在學習程序設計的初級階段就樹立正確的軟體工程觀點。這樣做不僅可以為學生將來從事計算機應用設計打下良好的基礎,而且有利於培養學生分析問題的完備性,以及統籌全局,協調關系的基本素質。
2.理論教學應從單一的「結構化程序設計」向「結構化與面向對象並舉」轉變
「結構化程序設計」方法是程序設計的基礎,必須讓學生掌握得堅實可靠。結構化程序設計的過程是培養學生思維能力的過程,在教學中經常發現有些學生的思維混亂。這些都是缺乏思維訓練的結果。結構化程序設計的訓練不僅可以讓學生養成良好的程序設計習慣,而且可以有效地培養學生思維的條理性和邏輯性。所以在授課過程中要注意講解結構化程序設計的思想時應突出兩點:(1)程序的質量首先取決於它的結構。(2)程序設計的基本方法是自頂向下地逐步求精和模塊化。
在c程序教學過程中,越到後面的章節,學生越會產生設計程序逐漸變難的感覺,這是不符合邏輯的一種怪現象。按照常理,C語言學的越多,說明你的程序設計知識越多,設計起程序來應該更加得心應手,那麼出現這種現象的原因何在呢?當然該問題的出現的原因是多方面的,但是其中最重要的一點就是長期以來程序設計的觀念不是以如何處理好對象為出發點,而是以如何使用好語言為基本點。受這種思想的影響,我們的程序設計教學大多數不是以如何解決好問題為重點,而是以講解語法規則和語句格式為重點,是「說明書」式的教學。這樣做造成的結果就是見到一個程序後學生首先想到是該用哪條語句,而不是思考怎樣合理的解析。要切實解決這個問題,首先應該改變程序設計的觀念。「面向對象程序設計」思想是目前最為流行、極為實用的一種程序設計方法,但是讓學生直接接觸「面向對象程序設計」,肯定不能對程序設計打下牢固的基礎。「結構化與面向對象並舉」是現代計算機程序設計的發展趨勢,應該認真探索研究,讓學生有一個較為輕松的學習過程。程序設計的實質就是編寫處理對象的過程,所以將c與c++有機的融為一體的教材應該是首選教材,在教學過程中,我們應該從社會發展的角度進行探索研究,將目前最為流行又極為實用「面向對象程序設計」思想融合到c語言教學中。
3.c語言教學應培養學生良好的程序設計風格
具有良好的設計風格應該是程序員所具備的基本素質,在實際的項目中程序員往往都有自己的一些編程風格。目前95%以上的程序設計書籍不注重程序設計風格問題,這導致了很多學生沒有良好的程序設計風格,在他們剛剛畢業踏入社會時,如果周圍的同事沒有良好的編程風格,那麼很難通過環境來使自己提高這方面的素質,即使有提高也不容易比較全面的提高。因此在學生接觸的第一門程序設計語言教學中,就應該培養學生良好的程序設計風格,使他們一進工作環境就具備這個素質。
Pascal設計者N.Writh教授十分重視程序設計風格的養成,他堅信「教給學生們以表達他們思維的語言會深深地影響他們思維和創造發明的習慣,而正是這些語言本身的混亂直接影響著學生們的程序設計的風格」,他這里所指的「這些運用」是當時那些主要用於程序設計教學的計算機語言。對學生來講,一開始就強調程序設計風格很有必要,良好的程序設計風格不僅有助於提高程序的可靠性、可理解性、可測試性、可維護性和可重用性,而且也能夠促進技術的交流,改善軟體的質量。所以培養良好的程序設計風格對於初學者來說非常重要。
程序設計風格,實際上是指的是編碼風格。在教學過程中應從源程序文檔化,數據說明的原則,輸入/輸出方法這三個方面培養學生的編碼風格,進而從編碼原則探討提高程序的可讀性、改善程序質量的方法。
(1)源程序文檔化。編碼的目的是產生程序,但是為了提高程序的可維護性。源代碼是需要實現文檔化的。源程序文檔化包括選擇標識符(變數和標號)的名字、安排注釋以及標準的書寫格式等。
①選擇標識符的命名規則。標識符包括模塊名、變數名、常量名、標號名、子程序名等。這些名字應能反映它所代表的實際東西,應有一定實際意義,使其能顧名思義。另外在模塊名、變數名、常量名、標號名、子程序名中使用下劃線是一種風格。使用這一技術的一種廣為人知的命名規則就是匈牙利命名法(變數類型由一個或兩個字元表示,並且這些字元將作為變數名的前綴)。當然使用匈牙利命名法與否都沒有錯誤,重要的是要保持一致性——在整個程序中使用相同的命名規則。這就是說,如果你在一個小組環境中編程,你和其他小組成員應該制定一種命名規則。並自始至終使用這種規則。如果有人使用了別的命名規則,那麼集成的程序讀起來將是很費勁的。此外,你還要與程序中用到的第三方庫(如果有的話)所使用的風格保持一致。如果可能的話,你應該盡量使用與第三方庫相同的命名規則,這將加強你的程序的可讀性和一致性。
②注釋。程序中的注釋是程序設計者與程序閱讀者之間通信的重要手段。注釋能夠幫助讀者理解程序,並為後續測試維護提供明確的指導信息。因此,注釋是十分重要的,大多數程序設計語言提供了使用自然語言來寫注釋的環境,為程序閱讀者帶來很大的方便。注釋分為功能性注釋和序言性注釋。
a.功能性注釋。功能性注釋在源程序中,用以描述其後的語句或程序段是在做什麼工作,也就是解釋下面要「做什麼」,而不是解釋下面怎麼做。對於書寫功能性注釋,要注意以下幾點:第一描述一段程序,而不是每一個語句。第二利用縮進和空行,使程序與注釋容易區別。第三注釋要准確無誤。
b.序言性注釋。序言性注釋通常位於每個程序模塊的開頭部分,它給出程序的整體說明,對於理解程序具有引導作用。有些軟體開發部門對序言性注釋做了明確而嚴格的規定,要求程序編制者逐項列出。有關內容包括:程序標題;有關該模塊功能和目的的說明;主要演算法;介面說明:包括調用形式,參數描述,子程序清單;有關數據描述;模塊位置(在哪一個源文件中,或隸屬於哪一個軟體包);開發簡歷:模塊設計者、復審考、復審日期。
③用標準的書寫格式。源程序清單的書寫建議採用以下幾點:
a.每行只寫一條語句;
b.用分層縮進的寫法顯示嵌套結構層次,這樣可使程序的邏輯結構更加清晰,層次更加分明。
c.書寫表達式時適當使用空格或圓括弧作隔離符。
d.在注釋段周圍加上邊框;
e.注釋段與程序段、以及不同的程序段之間插入字行;
(2)數據說明採用的原則。在編寫程序時,要注意數據說明的風格。
數據說明的次序如果規范,將有利於測試,排錯和維護。首先說明的先後次序要固定,例如,按常量說明、簡單變數類型說明、數組說明用數據塊說明、所有的文件說明的順序說明。當然在類型說明中還可進一步要求,例如按如下順序排列:整型量說明、實型量說明、字元量說明、邏輯說明。
其次當用一個語句說明多個變數名時,應當對這些變數按字母的順序排列。
最後對於復雜數據結構,應利用注釋說明實現這個數據結構的特點。
(3)輸入/輸出方法。輸入/輸出的方式和格式應當盡量避免因設計不當給用戶帶來的麻煩。這就要求,源程序的輸入/輸出風格必須滿足能否為用戶接受這一原則。所以在設計程序時,應考慮以下原則:輸入數據時,要使輸入的步驟和操作盡可能簡單,應允許使用自由格式輸入;應允許預設值;對輸入的數據要進行檢驗,以保證每個數據的有效性。
(三)結束語
在教學過程中,我們讓學生設計一個程序模擬體育彩票的銷售與對獎的過程,取得了良好的效果。他不僅啟發和誘導了學生獨立思考、積極思維的主動性,而且充分調動了學生學習的自覺性和積極性,使學生融會貫通地掌握了所學知識,提高了分析問題和解決實際問題的能力。
搞好c程序設計的教學工作涉及的因素很多,如果以項目來驅動教學,首先讓學生樹立面向工程的思想,其次把教學從單一的「結構化程序設計」向「結構化與面向對象並舉」轉變,最後特別要培養學生養成良好的編碼風格,從而使他們學會能夠「干什麼」,那麼我們認為教學目的就達到了。

7. ( )是指單位時間內傳輸的數據單元的數量。 A.數據傳輸距離B.數據傳輸速率C.數據傳輸質量D.數據信道帶寬與

應該選B
(數據傳輸速率)是指單位時間內傳輸的數據單元的數量。