程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> C++ 設計的基本原理與實踐技巧淺析

C++ 設計的基本原理與實踐技巧淺析

編輯:vc教程

“該死的魚雷!全速前進。”

——海軍上將Farragut

程序設計是這樣一門藝術, 它將問題求解方案描述成計算機可以執行的形式。程序設計中很多工作都花費在尋找求解方案以及對其求精上。通常, 只有在真正編寫程序求解一個問題的過程中才會對問題本身理解透徹。

本書適合於那些從未有過編程經驗但願意努力學習程序設計的初學者, 它能幫助你理解使用C++語言進行程序設計的基本原理並獲得實踐技巧。我的目標是使你獲得足夠多的知識和經驗, 以便能使用最新最好的技術進行簡單有用的編程工作。達到這一目標需要多長時間呢?作為大學一年級課程的一部分, 你可以在一個學期內完成這本書的學習(假定你有另外四門中等難度的課程)。如果你是自學的話, 不要期望能花費更少的時間完成學習(一般來說, 每周15個小時, 共14周是合適的學時安排)。

三個月可能看起來是一段很長的時間, 但要學習的內容很多, 寫第一個簡單程序之前, 就要花費一個小時。而且, 所有學習過程都是漸進的: 每一章都會介紹一些新的有用的概念, 並通過從實際應用中獲取的例子來闡述這些概念。隨著學習進程的推進, 你通過程序代碼表達思想的能力——也就是讓計算機按你的期望工作的能力, 會逐漸穩步地提高。我從不會說: “先學習一個月的理論知識, 然後看看你是否能使用這些理論吧。”

為什麼要學習程序設計呢?因為計算機文化是建立在軟件之上的。如果不理解軟件, 那麼你將退化到只能相信“魔術”的境地, 並且將被排除在很多最為有趣、最具經濟效益和社會效益的領域之外。當談論程序設計時, 我所想到的是整個計算機程序家族, 從帶有GUI(圖形用戶界面)的個人計算機程序, 到工程計算和嵌入式系統控制程序(如數碼相機、汽車和手機中的程序), 以及文字處理程序等, 在很多日常應用和商業應用中都能看到這些程序。程序設計與數學有些相似, 如果認真去做的話, 它會是一種非常有用的智力訓練, 可以鍛煉我們的思考能力。然而, 由於計算機能做出反饋, 程序設計又不像大多數數學形式那麼抽象, 因而對更多人來說更容易接受。可以說, 程序設計是一條能夠打開你的眼界, 將世界變得更美好的途徑。最後, 程序設計非常有趣。

為什麼學習C++這門程序設計語言呢?學習程序設計不可能不借助一門程序設計語言, 而C++直接支持現實世界中的軟件所使用的那些關鍵概念和技術。C++是使用最為廣泛的程序設計語言之一, 其應用領域幾乎沒有局限。從大洋深處到火星表面, 到處都能發現C++程序的身影。C++是由一個開放的國際標准組織全面考量、精心設計的。在任何一種計算機平台上都能找到高質量的和免費的C++實現。而且, 你用C++所學到的程序設計思想, 大多數都可直接用於其他程序設計語言, 如C、C#、Fortran以及Java。最後一個原因, 我喜歡C++適合編寫優美、高效的代碼這一特點。

本書不是初學程序設計的簡單入門教材, 我寫此書的用意也不在此。我為本書設定的目標是:能讓你學到基本的實用編程技術的最簡單的書籍。這是一個雄心勃勃的目標, 因為很多現代軟件所依賴的技術, 不過才出現短短幾年時間。

我的基本假設是, 你希望編寫供他人使用的程序, 並願意認真負責地、 較高質量地完成這個工作;也就是說, 我假定你希望達到專業水准。因此, 我為本書選擇的主題覆蓋了開始學習實用編程技術所需要的內容, 而不只是那些容易講授和容易學習的內容。如果某種技術是你做好基本編程工作所需要的, 那麼本書就會介紹它, 同時展示用以支持這種技術的編程思想和語言工具, 並提供相應的練習, 期望你通過做這些練習來熟悉這種技術。但如果你只想了解“玩具程序”, 那麼你能學到的將遠比我所提供的少得多。另一方面, 我不會用一些實用性很低的內容來浪費你的時間, 本書介紹的內容都是你在實踐中幾乎肯定會用到的。

如果你只是希望直接使用別人編寫的程序, 而不想了解其內部原理, 也不想親自向代碼中加入重要的內容, 那麼本書不適合你。請考慮是否采用另一本書或另一種程序設計語言會更好些。如果這大概就是你對程序設計的看法, 那麼請同時考慮一下你從何得來的這種觀點, 它真的滿足你的需求嗎?人們常常低估程序設計的復雜程度和它的重要性。我不願看到你不喜歡程序設計, 只是因為你的需求與我所描述的部分軟件之間不匹配。信息技術世界中還有很多部分是不要求程序設計知識的, 那些領域可能適合你。本書面向的是那些確實希望編寫和理解復雜計算機程序的人。

考慮到本書的結構和注重實踐的特點, 它也可以作為程序設計方面的第二本書, 適合那些已經了解一點C++的人, 和那些會用其他語言編程, 現在想學習C++的人。如果你屬於其中一類, 我不好估計你學習這本書要花費多長時間。但我可以給你的建議是, 多做練習。因為你在學習中常見的一個問題是習慣用熟悉的、舊的方式編寫程序, 而不是在適當的地方采用新技術, 多做練習會幫助你解決這個問題。如果你曾經按某種更為傳統的方式學習過C++, 那麼在進行到第7章之前, 你會發現一些令你驚奇的和有用的內容。除非你的名字是Stroustrup, 否則你會發現我在本書中所討論的內容不是“你父輩的C++”。

學習程序設計要靠編程實踐。在這一點上, 程序設計與其他需要實踐學習的技能是相似的。你不可能僅僅通過讀書就學會游泳、演奏樂器或者開車, 你必須進行實踐。同樣, 不讀程序、不寫程序就不可能學會程序設計。本書給出了大量代碼實例, 都配合有說明文字和圖表。你需要通過讀這些代碼來理解程序設計的思想、概念和原理, 並掌握用來表達這些思想、概念和原理的程序設計語言的特性。但有一點很重要, 僅僅讀代碼是不能學會編程實踐技巧的。為此, 你必須進行編程練習, 通過編程工具熟悉編寫、編譯和運行程序。你需要親身體驗編程中會出現的錯誤, 學習如何修改它們。總之, 在學習程序設計的過程中, 編寫代碼的練習是不可替代的。而且, 這也是樂趣所在!

另一方面, 程序設計遠非只是遵循一些語法規則和閱讀手冊那麼簡單。本書的重點不在於C++的語法, 而在於理解基礎思想、原理和技術, 這是一名好程序員所必備的。只有設計良好的代碼才有機會成為一個正確、可靠和易維護的系統的一部分。而且, “基礎”意味著延續性: 當現在的程序設計語言和工具演變甚至被取代後, 這些基礎知識仍會保持其重要性。

那麼計算機科學、軟件工程、信息技術等又如何呢?它們都屬於程序設計范疇嗎?當然不是!但程序設計是一門基礎性的學科, 是所有計算機相關領域的基礎, 在計算機科學領域占有重要的地位。本書對算法、數據結構、用戶接口、數據處理和軟件工程等領域的重要概念和技術進行了簡要介紹。但本書不能取代對這些領域全面、均衡的學習。

代碼可以很有用, 同樣也可以很優美。本書會幫你了解優美的代碼意味著什麼, 並幫你掌握構造優美代碼的原理和實踐技巧。祝你學習順利!

致學生

到目前為止, 我在德州農工大學已經用本書的初稿教過1000名以上的大一新生, 其中60%曾經有過編程經歷, 而剩余40%從未見過哪怕一行代碼。大多數學生的學習是成功的, 所以你也可以成功。

你不一定是在某門課程中來學習本書, 我認為本書會廣泛用於自學。然而, 不管你學習本書是作為課程的一部分還是自學, 都要盡量與他人協作。程序設計有一個不好的名聲——它是一種個人活動, 這是不公正的。大多數人在作為一個有共同目標的團體的一份子時, 工作效果更好, 學習得更快。與朋友一起學習和討論問題不是作弊!而是取得進步最有效, 同時也是最快樂的途徑。如果沒有特殊情況的話, 與朋友一起工作會促使你表達出你的思想, 這正是測試你對問題理解和確認你的記憶的最有效的方法。你沒有必要獨自解決所有編程語言和編程環境中的難題。但是, 請不要自欺欺人, 不去完成那些簡單練習和大量的習題(即使沒有老師督促你, 你也不應這樣做)。記住, 程序設計(尤其)是一種實踐技能, 需要通過實踐來掌握。如果你不編寫代碼(完成每章的若干習題), 那麼閱讀本書就純粹是一種無意義的理論學習。

大多數學生, 特別是那些愛思考的好學生, 有時會對自己努力工作是否值得產生疑問。當(不是如果)你產生這樣的疑問時, 休息一會兒, 重新閱讀這篇前言, 閱讀一下第1章(“計算機、 人和程序設計”)和第22章(“思想和歷史”)。在那裡, 我試圖闡述我在程序設計中發現了哪些令人興奮的東西, 以及為什麼我會認為程序設計是能為世界帶來積極貢獻的重要工具。如果你對我的教學理念和一般方法有疑問, 請閱讀第0章(“致讀者”)。

你可能會對本書的厚度感到擔心。本書如此之厚的一部分原因是, 我寧願反復重復一些解釋說明或增加一些實例, 而不是讓你自己到處找這些內容, 這應該令你安心。另外一個主要原因是, 本書的後半部分是一些參考資料和補充資料, 供你想要深入了解程序設計的某個特定領域(如嵌入式系統程序設計、 文本分析或數值計算)時查閱。

還有, 學習中請耐心些。學習任何一種重要的、有價值的新技能都要花費一些時間, 而這是值得的。

致教師

本書不是一門傳統的計算機科學的101課程, 而是一本關於如何構造能實際工作的軟件的書。因此本書省略了很多計算機科學系學生按慣例要學習的內容(圖靈完全、 狀態機、 離散數學、 喬姆斯基文法等)。硬件相關的內容也省略了, 因為我假定學生從幼兒園時代就已經通過不同途徑使用過計算機了。本書也不准備涉及一些計算機科學領域最重要的主題。本書是關於程序設計的(或者更一般地, 是關於如何開發軟件的), 因此關注的是少量主題的更深入的細節, 而不是像傳統計算機課程那樣討論很多主題。本書試圖只做好一件事, 計算機科學不是一門課程可以囊括的。如果本書(本課程)被計算機科學、計算機工程、電子工程(很多我們最早的學生都是電子專業的)、信息科學或者其他相關專業所采用, 我希望這門課程能和其他一些課程一起進行, 共同形成對計算機科學的完整介紹。

請閱讀第0章, 那裡有對我的教學理念、一般教學方法等的介紹。請在教學過程中嘗試將這些觀點傳達給你的學生。

資源

本書網站的網址為wwwstroustrupcom/Programming, 其中包含了各種使用本書講授和學習程序設計所需的輔助資料。這些資料可能會隨著時間推移不斷改進, 但對於初學者, 現在可以找到下面一些資料:

基於本書的講義的幻燈片。

一本教師指南。

本書中使用的庫的頭文件和實現。

本書中實例的代碼。

某些習題的解答。

可能有用的一些鏈接。

勘誤表。

歡迎隨時提出對這些資料的改進意見。

致謝

我要特別感謝我已故的同事和聯合導師Lawrence “Pete” Peterson, 很久以前, 在我還未感受到教授初學者的惬意時, 是他鼓勵我承擔這項工作, 並提供了很多能令課程成功的教學經驗。沒有他, 這門課程的首次嘗試就會失敗。他參與了這門課程最初的建設, 本書就是為這門課程所著。他還和我一起反復講授這門課程, 汲取經驗, 不斷改進課程和本書。在本書中我使用的“我們”這個字眼, 最初的意思就是指“Pete和我”。

我要感謝那些直接或間接幫助過我撰寫本書的學生、助教以及德州農工大學講授ENGR 112課程的教師, 以及Walter Daugherity, 他曾講授過這門課程。還要感謝Damian Dechev、 Tracy Hammond、 Arne Tolstrup Madsen、 GabrIEl DOS Reis、 Nicholas Stroustrup、 J C van Winkel、 Greg Versoonder、 RonnIE Ward和Leor Zolman, 他們對本書初稿提出了一些建設性意見。感謝Mogens Hansen為我解釋引擎控制軟件。感謝Al Aho、 Stephen Edwards、 Brian Kernighan和Daisy Nguyen, 他們幫助我在夏天躲開那些分心的事來完成本書。

感謝AddisonWesley公司為我安排的審閱人: Richard Enbody、 David Gustafson、 Ron McCarty和K Narayanaswamy, 他們基於自身講授C++課程或者大學計算機科學系101課程的經驗, 對本書提出了寶貴的意見。還要感謝我的編輯Peter Gordon為本書提出的很多有價值的意見以及他極大的耐心。我非常感謝AddisonWesley公司為本書組織的制作團隊的同仁, 他們為本書的高質量出版做出了很多貢獻, 他們是: Julie Grady (校對)、 Chris Keane (排版)、 Rob Mauhar (插圖)、 JulIE Nahil (制作編輯)和Barbara Wood (文字編輯)。

另外, 我本人對本書代碼的檢查很不系統, Bashar Anabtawi、 Yinan Fan和Yuriy Solodkyy使用微軟C++ 71版(2003)和80版(2005)以及GCC 344版檢查了所有代碼片段。

我還要感謝Brian Kernighan和Doug McIlroy為程序設計類書籍的撰寫定下了非常高的標准, 以及Dennis RitchIE和Kristen Nygaard為實用編程語言設計提供的非常有價值的經驗。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved