?? 01章 編程簡介.txt
字號:
第1章計算機與C++編程簡介
教學目標
●了解計算機科學的基本概念
●熟悉不同類型的編程語言
●了解典型C++程序的開發環境
●用C++編寫簡單的計算機程序
●使用簡單輸入與輸出語句
●熟悉基本數據類型
●使用算術運算符
●了解算術運算符的優先級
●編寫簡單的判斷語句
1.1 簡介
歡迎來到C++的世界!我們將努力帶給你一個信息豐富、充滿趣味和富于挑戰的學習經歷。C++是一種較難的語言,通常只傳授給有經驗的程序員,因此本書在C++教材中獨具一格:
●適合很少或沒有編程經驗的技術方面的人員
●適合需要深入鉆研C++的熟練的程序員
一本書怎樣適應兩類讀者呢?本書始終強調通過實踐證明的結構化編程〔structuredprogramming)和面向對象編程(object-oriented programming)技術編寫清晰的程序。非程序員從一開始就要養成良好的編程習慣。我們盡量以清晰而直接的方式編寫程序。本書附有大量插圖,更重要的是.本書提供大量實用的C++程序,并顯示這些程序在計算機上運行時產生的輸出結果。所有C++特性都是在完整、可工作的C++程序環境中介紹的,我們稱其為“有生命力的代碼”。所有這些例子都可以從我們的web站點www.deitel.com中下載.也可以通過本書所配的交互式光盤《C與C++多媒體教室(第二版)》中取得。多媒體教室的特性見本書最后的說明。多媒體教室中還包含本書一半練習的解答,包括簡單解答、小型程序和許多完整項目。
本書的前五章介紹計算機基礎、計算機編程和C++計算機編程語言。參加我們課程的新學員告訴我,第1章到第5章的材料為今后學習C++的高級知識打下了堅實基礎。熟練的程序員可以快速瀏覽前五章,然后閱讀本書其余部分對C++的有深度、有挑戰性的介紹。
許多熟練的程序員告訴我們,他們很欣賞我們對結構化編程的處理、他們通常用C或Pascal結構化編程語言進行編程,但由于沒有系統地學習結構化編程,因此常常無法用這些語言編寫出最佳代碼。學習本書前幾章介紹的結構化編程知識后,有助于改進使用C或Pascal語言編程的風格。因此,無論你是新手還是熟練的程序員,這里的信息都是充實、有趣并且具有一定深度的。
大多數人對計算機能做的工作略有所知,利用本書可以學會如何指示計算機做這些工作。軟件(sofware,即編寫的指令,命令計算機完成操作并做出判斷)可以控制計算機(通常稱為硬件,Hardware)。C++是當今最常用的軟件開發語言之一。本書介紹的C++版本已經過美國國家標準協會(ANSI,American ational Standards Institute)和國際標準化組織(IS0,International Stanards0rganization)的標準化,這個ANSI/ISO C++草案標準已經批準為全球標推。
計算機的應用領域在不斷增加。在這個成本穩步攀升的時代,計算成本卻在急速下降,因為硬件和軟件技術都在飛速發展。25年前裝滿整個房間、價值上百萬美元的計算機如今已經縮小到比手指甲還小的芯片,而且只要幾美元。具有諷刺意味的是,硅是地球上最豐富的資源之一,是普通砂子的主要組成部分。硅芯片技術使計算技術如此經濟,如今全世界已經有大約2億臺通用計算機在使用中,其應用涉及商業、工業、政府和個人生活。這個數字在近年內必將翻番。
本書將使讀者面臨幾個挑戰。幾年前,人們學習第一個編程語言時可能只要學習C或Pascal,但實際上還需要學習C和C++,為什么呢?因為C++包括C語言和其他更多的內容。
幾年前人們只需學習結構化編程(sstructured programming),而今則既要學習結構化編程,又要學習面向對象編程(object-oriented programming),因為面向對象是今后10年最關鍵的編程方法。本課程要建立和使用許多對象(Object),但是這些對象的內部結構最好用結構化編程方法建立。另外,操作對象的方法最好也用結構化編程方法來表達。
另一個介紹兩種方法的原因是,目前有大量C++系統是從C語言系統移植過來的,還有大量的所謂“C語言遺留代碼”。C語言已經使用20余年,近年來用得越來越多。人們學習C++之后就會發現,C++比C語言強得多,因此通常會轉到使用C++.他們會將遺留的系統移植到C++,這是個相對簡單的過程。然后,他們開始用各種C++對C++語言的增強特性改進其編寫的類C語言程序的風格。最后,他們開始利用C++面向對象編程的功能,真正了解這種語言的全部好處。
編程語言中的一個有趣現象是,大多數廠家都推出C/C++產品組合而不是提供分開的產品。這樣,用戶可以繼續使用C語言編程,適當時候再逐漸過渡到C++。
C++已經成為實現語言的首選.但它能在第一門編程課程中介紹嗎?我們認為可以。五年前,當人們用Pascal作為第一門編程課程時,我們遇到過類似挑戰。我們編寫了《C How To Program》。
如今全世界幾百所大學都在使用《C How To Prrogram》第二版,使用這本教材的課程和使用Pascal作為第一門編程課程一樣有效。其間沒有明顯的差別,只是學生學習的興趣更高,因為他們知道工作中要使用的是c語言而不是Pascal語言。學習C語言的學生還能更快地學習C++和新的Internet 語言——Java。
本書前五章介紹C++中的結構化編程方法、C++的“C語言部分”和“C++對C語言的改進”。然后要介紹C++面向對象編程,但我們不想等到第6章再介紹面向對象編程,因此前五章每一章都有一節“有關對象的思考”,介紹面向對象編程的基本概念和術語。第6章“類與數據抽象“將開始用C++生成對象并編寫面向對象的程序。
第1章分為三部分,第一部分介紹計算機基礎和計算機編程。第二部分立即開始編寫一些簡單C++程序,第三部分介紹有關對象的思考。
下面要開始富有挑戰和回報的旅程了。學習過程中,如果想與我們聯系,可以給我們發電子郵件
deltel@deitel.com
或瀏覽我們的web站點:
http://www.deitel.com
我們將立即答復。希望大家喜歡學習《C++大學教程》,還可以使用本書的交互式光盤版本《C與C++多媒體教室(第二版)》,詳見本書最后的說明。
1.2 什么是計算機
計算機(computer)是能以人的幾百萬甚至幾十億倍速度進行計算井作出邏輯判斷的設備。例如.今天的許多個人計算機每秒鐘可以進行幾億次加法運算。操作臺式計算器的人要幾十年才能算出的數值,強大的個人計算機只要一秒鐘即可計算完畢(注意:你怎么知道這個人加對了沒有?你怎么知道計算機做得是否正確?)。如今.最快的超級計算機(supercomputer)每秒鐘可以進行幾干億次加法運算,是成百上千的人花一整年時間才能完成的計算工作。每秒鐘萬億條指令的計算機已經能在研究實驗室中工作。
計算機在一組指令控制下處理數據(data),這組指令稱為計算機程序(computer programmer)。這些計算機程序指導計算機按順序進行計算機程序(computer programmer)指定的一組操作。
構成計算機系統的各種設備(如鍵盤、屏幕、鼠標、磁盤、內存、光盤和處理器)稱為硬件。計算機上運行的計算機程序稱為軟件。幾年來,硬件成本已經大幅下降,使個人計算機更加平民化。但是,隨著程序員開發了許多越來越強大、越來越復雜的應用程序,而軟件開發技術卻進步不大,因而使軟件開發成本不斷上升。本書介紹通過成熟的軟件開發方法減少軟件開發成本,即結構化編程、自上而下逐步完善、功能化以及面向對象編程。
1.3計算機組成
不管外觀如何不同,每個計算機都可以看成由六個單元(logical unit)或部分組成,即:
1.輸入單元(iput unit),這是計算機的“接收”部分,從各種輸入設備接收信息(數據和計 算機程序),并將這些信息放到其他單元中,使信息得以處理。如今大多數信息都是通過鍵 盤和鼠標設備輸入計算機。將來大多數信息也許可以通過語音輸入或掃描圖形而獲得。
2.輸出單元(output unit),這是計算機的“發送”部分。將計算機處理過的信息送到不同輸出 設備中,向計算機外部提供所需的信息。如今計算機輸出的大多數信息是通過屏幕顯示、書 面打印或用于控制其他設備。
3.內存單元(memory unit),這是計算機中快速訪問、低容量的“庫存”部分。它保存通過輸入單元輸入的信息,以便在需要時立即提供這些信息進行處理。內存單元保存處理的信息, 直到輸出單元將信息故到輸出設備中。內存單元也稱為內存或主內存(memory或primary memory)。
4.算術/邏輯單元(arithmetic and logic unit ALU)這是計算機的“生產”部分,負責進行加、減、乘、除等運算,包含判斷機制例如可以讓計算機比較內存單元中的兩個項目,確定其是否相等。
5.中央處理單元(central processing unit CPU),這是計算機中的“管理”部分,是計算機的協調員,負責管理其他部分的操作。CPU告訴輸入單元何時將信息讀取到內存單元中,告訴ALU何時利用內存單元中的信息進行計算,告訴輸出單元何時將內存單元中的信息發送到指定的輸出設備中。
6.輔助存儲單元(secondary storage unit),這是計算機長期的高容量“庫存”部分,其他單元不是經常使用的程序或數據通常放在輔助存儲單元(如磁盤)中,直到幾小時、幾天、幾月 甚至幾年后才需要。訪問輔助存儲單元中的信息要比訪問主內存中的信息慢得多。輔助存儲單元的單位成本比主內存的單位成本低得多。
1.4 操作系統的變革
早期計算機一次只能完成一個任務或作業(task或job),這種計算機操作通常稱為單用戶批處理(batch processing)。計算機一次運行一個程序,成組或成批地處理數據。在這些早期系統中,用戶利用穿孔卡片將作業提交到計算機中心,通常要等待幾小時或幾天之后才能得到打印輸出。
稱為操作系統(operating system)的軟件系統可以幫助用戶更方便地使用計算機。早期操作系統能管理作業之間的順利過渡,使得計算機操作員在作業之間切換的時間減到最少,從而增加計算機處理的工作量或吞吐量(throughput)。
隨著計算機的功能越來越強大,單用戶批處理機制顯然不能有效地利用計算機資源,因此應該讓許多任務或作業共享計算機資源,以達到更好地利用資源,這種方法稱為多道程序設計(multiprogramming)。多道程序系統涉及多個作業在計算機上“同時”操作,計算機在競爭資源的作業之間共享資源。在早期多道程序操作系統中,用戶還是要通過穿孔卡片將作業提交到計算機中心,幾小時或幾天之后才能得到打印輸出。
20世紀60年代,計算機界和大學的幾個研究小組提出了分時(timesharing)操作系統。分時是多道程序的特殊情況,用戶通過終端(terminal)訪問計算機,終端是帶有鍵盤和屏幕的典型設備。在典型的分時操作系統中,可能有幾十甚至幾百個用戶同時共用計算機。計算機實際上并不是同時運行所有用戶,而是運行一個用戶的一小段作業,然后轉入運行下一個用戶的一小段作業。計算機的速度非常快,每秒鐘可以為每個用戶服務多次,使得用戶的程序看上去是在同時運行。分時的好處之一是用戶能立即收到響應,而不必像原先的計算方式需要等待很長時間。
1.5 個人計算、分布式計算與客戶/服務器計算
1977年,Apple計算機公司使個人計算(personal computer)得以普及。最初,擁有一臺計算機只是愛好者的夢想,隨著它的價格不斷降低,人們可以購買供個人或辦公使用的計算機。1981年,世界上最大的計算機廣家IBM公司推出了IBM個人計算機(IBM Personal computer)。一夜之間,個人計算機遍布公司、企業和政府機關。
然而這些計算機只是“獨立”的個體,各自做自己的工作,要通過磁盤復制來共享信息(通常稱為暗聯網)。盡管早期個人計算機不夠強大,不能同時服務于多個用戶,但這些機器可以鏈接在計算機網絡中,可以接入組織內的局域網(Local area Network,LAN),還可以通過單位內部的電話線完成鏈接。這樣就在組成化計算中出現了分布式計算(distributed computing)結構,其處理不是在某個中央計算機上進行,而是由分布于網絡中的機器完成。個人計算機已經足夠強大,能夠處理個人用戶的計算要求并處理電子信息傳遞等基本通信任務。
如今,最強大的個人計算機已經可以和十年前幾百萬美元的機器相媲美。最強大的臺式計算機(稱為工作站,workstation)對個人用戶提供了大量的功能。在網絡上.有些計算機向遍布整個網絡的客戶提供數據存取服務,這些計算機稱為文件服務器(file server)。通過這種方式.在網絡上共享信息很容易,因而產生了客戶—服務器結構o C和C++已經成為編寫操作系統、計算機網絡和分布式客戶/服務器應用程序軟件的首選編程語言。如今最常見的操作系統如UNIX、Microsoft的基于windows系統和IBM的os/2都提供了本節介紹的功能。
1.6 機器語言、匯編語言和高級語言
程序員用各種編程語言編寫指令,有些是計算機直接理解的,有些則需要中間翻譯(tranlation)的步驟。如今使用的計算機語言有幾百種,可以分為三大類:
1.機器語言
2.匯編語言
3.高級語言
任何計算機只能直接理解本身酌機器語言(machine language)。機器語言是特定計算機的自然語言,由計算機的硬件設計定義。機器語言通常由一系列數字組成(最終簡化0和1),讓計算機一次一個地執行最基本的操作。機器語言非常繁瑣,下面的機器語言程序將工齡工資和基礎工資相加,并把結果保存在工資總額中:
+1300042774
+1400593419
+1200274027
隨著計算機越來越普及,機器語言編程對大多數程序員顯然太慢、太繁瑣。程序員不用計算機直接理解的一系列數字,而是用類似英文縮寫的助記將來表示計算機的基本操作,這些助記符構成了匯編語言(assembly language)。稱為匯編器(assembler)的翻譯程序以計算機的速度將匯編語言程序轉換為機器語言。下列匯編程序也是工齡工資和基礎工資相加,并將結果保存在總工資中,但要比相應的機器語言清晰得多:
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
盡管這種代碼對于人們一目了然,但計算機卻無法理解,必須先翻譯為相應的機器語言。
隨著匯編語言的出現,計算機的使用迅速增加,然而即使是最簡單的任務.也需要許多條指令才能完成。為了加速編程過程,人們開發了高級語言(high-level language),用一條語句完成大量任務。稱為編譯器(compiler)的翻譯程序將高級語言程序變為相應的機器語言。高級語言使程序員能夠編寫更像英語的指令,可以包含常用的數學符號。將工齡工資和基礎工資相加.并把結果保存在總工資中,可以用下列高級語言程序:
grossPay = basePay + overTimePay
顯然,從程序員角度看,高級語言比機器語言和匯編語言都要強得多。 C和C++是最強大最廣泛使用的高級語言。
將高級語言程序編譯為相應的機器語言的過程可能需要大量時間。解釋器(interpreter)程序可以直接執行高級語言程序,而不必先將這些程序編譯成相應的機器語言。盡管編譯程序的執行速度比解釋程序更快,但解釋器在程序開發環境中更常用,因為增加新特性和糾正錯誤時經常需要重
新編譯程序。一旦程序開發完成,編譯版本的運行最有效。
1.7 C語言與C++的歷史
C++是從C語言演變而來的,而C語言又是從兩個編程語言BCPL和B演變而來的、BCPL是Martin Richards于1967年開發的,用于編寫操作系統軟件和編譯器。Ken Thompson在他的B語言(1970年在貝爾實驗室)。DCPL和B都是“無類型”語言,每個數據項在內存中占一個“字”(word)長、如果要將數據項作為整數或實數處理,編程的工作量會很大。
C語言是從D語言演變而成的,由貝爾實驗室的Dennis Ritchie開發,最初于1972年在DEC PDP—11計算機上實現。C語言使用了BCPL和B的許多重要概念,同時增加了數據類型和其他特性。C語言最初作為UNIX操作系統的開發語言而聞名于世。如今,大多數操作系統都是用C/C++寫成的。二十多年來,C語言已經遍布在大多數計算機上。C語言是硬件無關的,只要仔細設計。就可以編寫能移植列大多數計算機上的C語言程序。
到20世紀70年代未期,C語言演變成現在所謂的“傳統C”、“經典CPP或“Kernighan/RitchieC"。1978年Prentice Hall公司出版了Kernighan和Ritchie合作的著作《The CProgrmmming Language》,引起了人們對C語言的廣泛關注(見參考文獻Ke78)。
C語言在各種不同類型計算機(有時稱為硬件平臺)上的普及導致了許多變形。它們雖然相似,但通常互不兼容。對需要為不同平臺編寫可移植程序的開發人員.這是個嚴重問題,顯然需要有個標準的C語言版本。1983年,美國國家計算機與信息處理標準委員會(x3)成立了x3JII技術分會,目的是提供無歧義性且與機器無關的語言定義。1989年推出了這種語言標準。AN5I與國際標準化組織(IS0)合作.在全球范圍內將C語言標淮化,1990年推出了聯合標準文檔.稱為ANSI/IS09899:1990。這個文檔可以從ANSI獲得副本。1988年推出的Kernighan 和Ritchie著作的第二版體現了該版本(稱為ANSI C),這也是目前全世界使用的版本(見參考文獻Ke88)o
可移植性提示1.1
由于c語言是標準化、硬件無關、廣為使用的語言,因此用C語言編寫的應用程序通常只要稍作修改或不經修改即可在多種不同的計算機系統中運行。
C++是C語言的擴展,是20世紀80年代初由貝爾實驗室的Bjarne stroustrup開發的。C++的許多特性是從c語言中派生的,但更重要的是,它提供了面向對象編程(object-oriented programming)的功能。
軟件業正在醞釀一場革命,最終日標是更快、更正確、更經濟地建立軟件,新的、更強大的軟件需求迫在眉睫。對象(object)實際上是模擬實際項目的可復用軟件組件(component)。軟件開發人員發現,利用模塊化、面t向對象的設計和實現方法與過去結構化編程方法相比較,可以使軟件開發小組的生產率更高。面向對象編程的優勢在于更容易理解、糾正和修改。
許多面向對象的語言也紛紛涌現,包括最著名的由Xerox的Palo Alto研究中心(PARC)開發的small talk。Smalltalk是純粹的面向對象的語言,其所有的編程元素都是“對象”。C++則是一種“混合型語言“,可以用C語言方式、面向對象方式或兼用兩種方式進行編程。1.9節將介紹基于C/C++的新語言——Java。
1.8 C++標準庫
C++程序由類(class)和函數(function)組成。可以用多個小的軟件模塊構成C++程序,但大多數C++程序員會利用C++標準庫中已有的類和函數來編程。這樣,C++“世界”中實際要學習兩方面的知識,第一是學習C++語言本身,第二是學習如何利用C++標準庫中現有的類和函數(本書將介紹許多類和函數)。 Plauger(見參考文獻P192)的著作是程序員必讀的.可以幫助程序員深入了解C++中包括的ANSI C語言庫函數,了解如何實現這些庫函數,還可以了解如何用庫函數編寫可移植代碼。標準庫函數通常由編譯器廠家提供。許多獨立軟件供應商(indepandent softerware vender)也提供各種專用類庫。
軟件工程視點1.1
使用構件塊方法(building block approach)生成程序,而不要事事從0開始。盡量利用現有程序塊,這稱為軟件復用(software reuse),是面向對象編程的核心。
軟件工程視點1.2
C++編程中通常使用下列構件塊:C++標準庫中的類和函數.自己生成的類和函數和各種常見非C++標準庫中的類和函數。
自己生成類和函數的優點在于知道其如何工作,可以檢查C++代碼:缺點是要花大量時間及精力來設計、開發和維護這些類或函數,使其正確、有效地運行。
性能提示1.1
利用標準庫函數和類而不用自己的對應版本可以提高軟件性能,因為這些軟件經過認真編寫,能保證有效操作。
可移植性提示1.2
利用標準庫函數和類而不用自己的對應版本可以提高軟件性能,因為幾乎所有C++版本都包括這些軟件。
1.9 Java、Internet與萬維網
這是C++程序員應當高興的時刻,整個計算機行業都為新的ANSI/ISO草案標準最終得到批準而感到興奮。
]995年5月,Sun公司宣布推出新的Java編程語言。sun公司是基于UNIX的高性能工作站的領導廠家,一直強調計算機網絡的重要性。Java是基于C/C++的語言,加入了許多面向對象編程的特性。sun公司提供了基本Java軟件、文檔、教程和演示,可以在Web站點www.javasoft.com免費取得。Java具有大量的類庫,包括支持多媒體、網絡、圖形、數據庫訪問、分布式計算等軟件組件。
Java最吸引入的屬性之一是它的可移植性,可以在一臺計算機上編寫Java程序.然后在任何支持Java的計算機上運行(目前大多數常見計算機系統都支持Java)。這對軟件開發人員特別具有吸引力,他們可以不再為不同類型的計算機系統開發或維護不同的軟件版本。為不同類型的計算機系統開發和維護不同的軟件版本是非常費時、費力的,使得獨立軟件供應商只能生產常見系統平臺中使用的軟件,如Microsoft Windows。如今,基于Java的軟件應用程序可以在所有常用的Microsoft widowe版本中和各種UNIX、Macintosh及OS/2等大多數流行的系統平臺中運行。
我們體會到Java在學校和企業客戶中的重要性,因此編寫了幾本Java教材和基于交互式光盤的學習軟件包。這個語言變化得很快,因此我們在第一版《JavHow to Program》推出后僅11個月又推出了其第二版。C++要成熟很多(是1980年創建的),因此《C++大學教程》在第一版推出三年半之后才推出第二版,以配合ANSI/ISO C++草案標準的推廣。
1.10 其他高級語言
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -