




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計
問題與求解方法
——編程高手修煉捷徑
何勤著
代序
目前,人們要真正學會編程,大多都要花費五年以上的時間,懸梁刺股、臥薪嘗膽。
真正原因何在?其實只需到真正會編程的人身上,就能找到根本原因。
經過認真仔細分析,我發現根本原因在于:每個真正會編程者,都必須具備計算機科
學的大局觀。也就是說,每個真正會編程者都必須懂得和掌握:
1、c語言的基本語法(主要是各種命令型語言的公共部分,其他語言目前還無法取代)
2、大量閱讀和調試經典的、基本的、由易到難的各種類型的C語言程序(至少100題以上)。
消化和積累各種基本問題的編程思路,并能用逐步求精的偽代碼構造常見問題的算法;
3、學習算法和數據結構的基本知識。
4、整體上把握計算機到底是如何工作的;
5、整體上把握操作系統是如何在硬件的密切配合下通過查找各種表格,管理調度計算機的
所有軟硬件資源為多道應用程序運行(和計算機用戶)提供服務的。
6、編譯程序大體上是如何對源程序進行編譯工作的。
以上六項是必須具備的。此外,如果想成為程序員,還應當學習和掌握:匯編語言程序
設計、數據庫原理及數據庫編程、計算機網絡及網絡編程、面向對象程序設計等課程知識、
計算機原理和操作系統更深入的知識。
由此可見,這條成才之路確實非常漫長和艱苦!尤其是第4到第6項知識的掌握,更是
一個極為痛苦的心路歷程上的萬里長征!因為讀者不僅要認真學習這些知識,而且還要做大
量的提煉精華、融會貫通的艱巨功課。這是由于各門課程之間的內容銜接這項無比艱巨的工
作,通常必須由學生親自去完成,目前沒有任何一本書在這方面做得比較好。
為了大大減輕這個成才過程中的痛苦,明顯縮短讀者真正學會編程的周期。筆者花費了
十余年時間廣泛收集、篩選素材,并且進行了長時間地、艱苦地探索。終于很幸運地找到了
一個絕好的比喻——理想廚房系統,恰好可以把以上幾個方面的知識在一個比較初級的層次
上,比較完美地串聯起來。構成一幅計算機科學中(與真正學會編程有關的)最重要的、最
精華的基本知識的“聯絡圖”。為初學者在短時間內把握計算機科學的大局觀并學會編程,
開辟了一條相對比較輕松的捷徑。而且,這也為后續更高級編程技術課的學習奠定了扎實的
知識基礎。
本書雖然比較系統地講解了C語言語法,但是,讀者別指望從這本書中找到很多高深
語法細節問題的詳細講解。因為筆者認為:過早學習太多高深語法知識,是很多讀者學不會
編程的罪魁禍首!這將導致很多讀者覺得程序設計課相當枯燥乏味。浪費了讀者本可以用來
學習生動有趣的編程思路和技巧的、有限和寶貴的精力。大腦里留存下了一大堆未經消化的
細節語法規則,反而束縛了最需靈活自由的編程思路的展開和翱翔。
編程語言的高級語法知識的學習和掌握,比大量編程思路的領會、消化和積累要容易得
多!讀者在學習編程過程中最需要得到的是編程思路上的引導和啟發。讀者應當在真正學會
編程后再決定是否要比較全面深入自學哪一種程序設計語言的語法細節知識。
本書中的大多數例題值得你認真鉆研,因為其中蘊含了大量比較經典的基本編程思想和
編程技巧。本書不可能系統講解各種編程思路(這是算法、數據結構這兩門課程的任務),
然而,本書卻教給了讀者很多有效的舉一反三的編程方法,這種方法強調從特殊到一般,來
探索問題的編程思路和編程技巧。在循環和數組這兩章中的很多例題中,展現了如何利用這
種方法來做各類編程題。本書也很重視培養讀者用逐步求精的偽代碼來構思算法的能力。
讀者要注意,學習鉆研本書,一定要配套做100——200道各種類型的由易到難的編程
題。這個親自動手編寫和調試程序的實踐性修煉環節,是任何編程書籍和老師都無法替代的。
這是學會編程決不能省略的最重要環節。再困難也要堅持,挺過開始的困難階段,變成一種
習慣后,你就能夠逐漸享受到編程帶來的極大樂趣。
讀者還要特別注意:千萬不要被某些教科書誤導,從而陷入鉆研一門高級語言語法細節
知識的癡迷和狂熱之中,誤以為學好一門語言的高深語法,就可以輕松步入編程高手的行列。
這就象一位想學會寫作文的學生,只熱衷于冷僻漢字和高深語法,而置更為重要的通過認真
學習消化課文來積累寫作思路和技巧(包括大量造句和寫作文)于不顧那么可笑!必須將編
程思路的學習領會和積累,放在編程學習中的首要位置。
以理想廚房為"綱",以程序如何運行、如何構思、如何編寫為“目,把計算機科學中
為了真正學會編程必須掌握的、幾乎所有的、基礎的、精華的知識有機的串聯起來。在本書
中僅僅做了這樣一件事。
一書在手,“軟(指軟件)硬(指硬件)兼施、內(指編程思想)外(指語言語法)兼
修”,讓讀者可以真正全方位學習編程,并且真正學會編程,這是本書的寫作目標。所以,
本書中的知識講解比較密集、濃縮,尤其是第一章和第二章。讀者要作好心理上的準備,你
是否愿意付出艱苦努力,去認真學習本書,出版社和作者是否值得信任。
讀者不要以為真正學會編程只是計算機專業學生的事。任何一位當代社會的理工類大學
生,都必須具備一定的編程能力,能夠在未來的科技工作中把計算機做為自己的得力助手和
親密伙伴,否則你就不是當代社會的合格科技人材。當代科技工作者不會編程,就象古代戰
士不會射箭一樣。
何勤
初學者閱讀本書,建議從第41頁開始
第一部分:計算機原理(初)
第。章“理想廚房”的工作原理
0.1理想廚房系統
0.2理想廚房系統的一個炒菜實例
0.3"理想廚房”工作的重要特點
0.4理想廚房系統與計算機系統術語對照表
第1章計算機的基本工作原理
1.1二進制簡介
1.1.1二進制與二進制數的基本概念
1.1.2與二進制相關的術語:位、位串、字節
1.1.3數和碼的含義與區別
1.2計算機系統
1.2.1計算機系統中的硬件
1.2.2計算機系統中的軟件
1.2.3計算機指令能做的工作
1.3提高部分
1.3.1程序(指令序列)在硬件上的運行過程
1.3.2結構化、規范化的機器語言程序
1.3.3各種數制之間的轉換
第二部分(C語言基礎)
第2章C語言程序結構和基本語法要素
第3章順序結構程序設計
3.1語句執行的順序性
3.2用計算機求解問題的步驟
3.3逐步求精的偽代碼
3.4驗證算法的方法
3.5賦值表達式和多重賦值
3.6變量類型的進一步討論
3.7各種類型的常量
3.8不同類型數據之間的類型轉換
3.9常見編程錯誤
3.10提高部分
3.10.1機內形式的整數
3.10.2二進制浮點數在計算機中的表示方法
第4章選擇結構程序設計
4.1兩種基本的if語句
4.2布爾表達式之一:關系表達式
4.3空語句
4.4復合語句
4.5if語句的嵌套及其用法
4.6布爾表達式之二:邏輯表達式
4.7一種特殊的多重嵌套if語句——多分支選擇結構語句
4.8switch語句
4.9選擇結構常見錯誤
4.10提高部分
4.10.1其他表達式作為布爾表達式使用
4.10.2條件運算符
4.10.3邏輯表達式的短路運算
第5章循環結構程序設計
5.1while語句
5.2自增、自減運算符和表達式的副作用
5.3do-while循環語句
5.4for語句
5.5復合賦值運算符和逗號表達式
5.6break語句和continue語句
5.7循環語句的嵌套
5.8常見錯誤
5.9提高部分
第6章數組
6.1引言
6.2一維數組
6.2.1一維數組的定義
6.2.2下標變量(數組元素)
6.2.3下標和下標表達式
6.2.4動態下標變量
6.2.5下標和下標表達式的允許取值范圍
6.2.6數組元素在內存中的相對位置
6.2.7數組元素的初始化
6.2.8下標變量的存取
6.3一維字符數組和字符串
6.3.1一維字符數組的定義
6.3.2單個字符的輸入輸出庫函數
6.4二維數組
6.5編程綜合練習
第7章函數
7.1引言
7.2函數的概念
7.3函數編寫的一些重要原則
7.4使用數組(或數組元素)作為函數參數
7.5函數的嵌套與遞歸
7.6有關函數定義、返回、聲明、調用的進一步說明
7.6.1函數定義
7.6.2return語句與函數類型
7.6.3函數聲明與函數原型
7.6.4函數調用
7.6.5函數的形式參數與實際參數
7.7提高部分
第8章指針
8.1引言
8.2指針變量的定義、初始化和應用
8.2.1指針變量的定義
8.2.2指針變量的初始化
8.2.3指針賦值
824間接尋址運算符
8.2.5指針變量作為函數的形式參數和實際參數
8.2.6指針作為函數調用的返回值
8.3指向數組的指針以及相關的運算
8.3.1指針變量指向數組元素
8.3.2數組名用作指針(常量)
8.4提高部分
第9章C語言進階
9.1結構
9.1.1結構類型的定義
9.1.2定義結構變量
9.1.3結構變量的初始化和訪問(輸入/輸出和存取)
9.1.4結構數組和結構指針的定義、初始化以及訪問方式
9.1.5用typedef定義類型的別名
9.2編譯預處理
9.2.1#includc命令
9.2.2#define命令
9.2.3條件編譯指令
9.3文件、流和輸入/輸出
9.3.1概述
9.3.2文件和流的概念
9.3.3文件的兩種形式
9.3.4文件的輸入和輸出
9.4提高部分
9.4.1鏈表(單鏈表)
9.4.2位運算
9.4.3枚舉類型
9.4.4文件流的本質
第三部分
算法與數據結構簡介
第四部分
利用ege圖形庫函數的游戲編程案例
第五部分計算機原理和操作系統簡介
第11章編程原理進階
11.1引言
11.2輸入/輸出設備和輸入/輸出接口電路
11.3內存與外存
11.4中斷和操作系統
11.4.1操作系統工作的機制
11.4.2操作系統的特點
11.5提高部分
11.5..1計算機為何使用二進制數字信號?
11.5.2模擬圖像和聲音的數字化編碼過程
附錄Aege圖形庫函數使用說明和庫函數列表
附錄B常用字符與ASCII碼對照表
附錄B常用C語言庫函數
附錄C運算符的優先級和結合性
附錄D格式化輸入輸出庫函數的用法小結
參考文獻
第零章理想廚房的工作原理
一種有著神奇的“魔力"和“智能”的人造設備,正在迅速地、徹底地、默默無聞或者
令人震驚地改變和豐富我們所生活的大千世界。這個看起來很不起眼的,在少數場合被稱為
“電腦”的電器設備,是如何具有如此神奇的“魔力”和“智能”的?本章和下一章將帶你
開始解開這個與我們的生活和工作息息相關的當代社會最大的謎。
0.1節介紹理想廚房系統,0.2節通過一個炒菜實例,講解理想廚房各部件是如何密
切配合工作的。0.3是一張理想廚房系統與計算機系統的對照表。
計算機從發明到現在不過70年左右的時間,然而計算機的發明、改進和普及,把人類
帶進了智能時代。計算機本身也變得越來越復雜、快速、小巧、種類繁多。但大多數計算機
都遵循馮.諾伊曼體系結構,這為我們理解計算機的基本工作原理提供了方便。
從某種角度來看,計算機就是一種人造智能生命。想要真正學會編程,通過編寫的程序
命令計算機工作,就必須懂得計算機的基本工作原理。就像人們要與某種具有智能的其他
物種個體進行交流通信,就必須對那個物種的習性有一個基本了解一樣。
本章和下一章是全書的重要基礎。通過這兩章,讀者可以了解計算機的工作過程。這些
知識對學習程序設計非常有幫助。直接學習計算機工作原理是極其枯燥乏味、很困難的,因
為有大量的新名詞。為此,筆者付出了極大的努力,找到了一種比較好的類比方法——理想
廚房系統,通過這個例子就可以初步了解計算機的基本工作原理。
0.1理想廚房系統:
理想廚房系統,是一個通過順序執行菜譜中的各個加工步驟,把原材料加工成菜肴的系
統。它由硬件和軟件(菜譜)組成。
1)軟件部分:菜譜是理想廚房系統中的一個無重量、無體積、不會損壞、但可以經常更換
的極為重要的“軟件”部件。菜譜由一個個的加工步驟順序組成。
每個加工步驟命令理想廚房系統完成一個基本操作(比如炒、蒸、煮、輸入一種原材料
等)。
注意:為了解說簡潔起見,在以下敘述中,我們經常把菜譜中的一個“加工步驟”稱為一條
“揖令:。因為一個加工步驟就是一條指導理想廚房如何工作的命令。
2)硬件部分:理想廚房系統,主要由以下四個“硬件"(即實物)部件構成——理想廚房、
自動冰箱、輸入輸出設備(即配菜員和傳菜生)和三條傳送帶。
需要注意的是,理想廚房僅僅只是理想廚房系統中的一個重要組成部分。
理想廚房系統的構成簡圖如圖0」所示:
理想廚房自動冰箱
0.1理想廚房系統運行示意圖:
0.1理想廚房系統示意圖:
?自動冰箱:自動冰箱負責臨時保存菜譜、原材料和菜肴。它由非常多的(比如幾百個)大
小一樣的格子組成,每個格子都有一個唯一固定編號,這個編號稱為地址。地址是從0開始
逐一遞增的。是不是感到很奇怪:菜譜也要保存在冰箱中,這樣做的道理請看本章后面。每
份原材料和菜譜中的每個加工步驟,都占據冰箱中的一個格子。
?理想廚房:
功能:負責根據從冰箱的菜譜中取到的加工步驟,進行炒菜以及進行相關的控制工作。
構成:理想廚房主要由廚房管理員、廚師、炊具和一些碟子組成,參見圖0.1。
?理想廚房中的各種碟子
理想廚房中有一些起著重要作用的碟子:
一個PC碟(又稱為指令地址存放碟):此碟中存放一個非負整數值,這個值是一個地
址;它指明將要執行的指令位于自動冰箱的哪一格中。
一個IR碟(又稱為指令存放碟):用來存放剛剛從冰箱中取過來的一條立即要執行的指
令。
理想廚房中還有若干個通用碟(圖0.1中標有名稱RO、RI、R2的碟):用來臨時存放從
冰箱中取來的原材料或經過加工了的半成品或成品。這是由于到冰箱格子中存取物品,要比
到通用碟慢得多的緣故。
?指令執行的全過程
理想廚房每次只能按順序執行菜譜中的一條指令。
理想廚房執行指令的流程完全是周期性的,即任意一條指令都是按照“取指令——閱讀
分析指令——執行指令”這三個階段進行的。
廚房管理員首先根據PC碟中的值,通過三條傳送帶的協調工作(三條傳送帶如何協調
工作的細節,請參見下一節),到自動冰箱的指定格中去取菜譜中的一條指令。取到理想廚
房并把它存放到IR碟中之后,PC碟中的值將會加上1——這是為取下一條指令預先做好準
備。
然后,廚房管理員閱讀并分析IR碟中剛取到的這一條指令,根據該指令的指示,去做
以下六類工作中的一種:
1.取物品:通過三套傳送帶,命令自動冰箱把指定地址格子中的(炒菜加工步驟馬上
要用到的)原材料(通過材料傳送帶)傳送到理想廚房中來;
2.加工:章令廚師按照指令的要求,對原材料作一個基本加工操作(做"炒","蒸二
“煮”等基本操作步驟中的某一個動作);
3.存物品:通過向三套傳送帶向自動冰箱發號令,把某個碟子或炊具中的成品(或半
成品)送回到冰箱指定的格子中存放;
4.在廚房內部進行物品傳送:在廚房的各個碟子和炊具之間傳送原料或半成品;
5.輸入:命令配菜員為某道菜臨時配備原材料;(在本章不作討論)。
6.輸出:命令傳菜生將炒好的菜送給顧客;(在本章不作討論)。
一條指令執行完后,理想廚房立即自動進行下一個完全類似的、新的“取指令——閱
讀分析指令——執行指令”的工作。
下面我們通過一個實例來講述理想廚房系統的工作機制。這是本章的一個重點,因為計
算機的工作原理,與之極其相似。
0.2理想廚房系統的一個炒菜實例
在本節中我們通過炒制一道青菜的例子,來說明理想廚房系統的工作全過程。
首先,把青菜放在冰箱地址為5的格子中,冰箱地址為6號的格子,預留給炒好的菜使
用。
菜譜的所有加工步驟(又稱為指令)從冰箱地址0號格開始依次按照順序存放,編寫
炒青菜的菜譜如下:
地址0的格子中取地址5(中的物品)到RO碟;
地址1的格子中將R0(倒入炒鍋中)炒好后裝到R1碟;
地址2的格子中存R1碟(中的物品)到地址6中;
可見,此菜譜一共有3個加工步驟。
開始時理想廚房系統狀態如下圖0.3
(注意:冰箱格子以及理想廚房碟子中存放的物品都用了斜體字)
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
R0材料傳送帶0取她址5到RO碟
R1廚具1將R。炒好后裝到R1碟;
R2廚師2存R1碟到地址6中;
地址傳送帶3
04
PC0廚房管理員5青菜
IR控制傳送帶6
7
取
圖0.3
菜譜和原料安放完畢后,啟動理想廚房系統,開始自動化的工作。
1)廚房管理員根據PC碟子中的數字“爐,知道要到地址為。的格子中取第一條指令(即
加工步躲)。于是,廚房管理員向控制傳送帶上發出一個“取”信號,然后馬上將PC碟中
的數字V復制后放到地址傳送帶上。這兩個信號都會到達冰箱。冰箱收到這兩個信號后
(知道理想廚房想要得到第0格中的物品,于是自動冰箱)將。號格的內容“取地址5到
破復制一份,將其放到材料傳送帶上,送往理想廚房。理想廚房收到后,將這條指令
放到IR碟中。然后,廚房管理員將PC碟中的原來值增加1,以便為取下一條指令做好準備。
取指令工作完成后,理想廚房系統處于如下圖。.4狀態:
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
R0材料傳送帶0取地址5至1!R0碟
R1炊具1將RO炒好后裝到R1碟;
R2廚師2存R1碟到地址6中;
地址傳送帶3
4
PC1廚房管理員5青菜
IR取地址5到RO碟控制傳送帶6
7
圖0.4
指令執行階段:
廚房管理員讀到指令存放碟(即IR碟)中的加工步驟后,知道要到冰箱地址為5的格
子中去取物品,并且要放到R0碟中。因此,管理員向控制傳送帶上送出一個“取”信號,
然后馬上將5這個數字放到地址傳送帶上。
冰箱知道理想廚房要取5格中的物品,于是冰箱將地址為5的格子中的物品"喜菜"取
出來,放到材料傳送帶上。
材料傳送帶上的物品“青果”,傳到理想廚房后,按照指令的要求(通過理想廚房內部
的傳送帶)送到了R。碟中。
第一條指令執行完后,理想廚房系統處于如下圖0.5所示的狀態:
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
R0青菜材料傳送帶0取她址5到RO碟
R1炊具1將R。炒好后裝到R1碟;
R2廚師2存R1碟到地址6中;
地址傳送帶3
54
PC7廚房管理員5青菜
IR取地址5到RO碟控制傳送帶6
7
取
圖0.5
2)接下來,開始下一條指令的取指令階段。完全類似于前一條指令,在取指令階段完成后,
理想廚房系統處于如下圖0.6狀態:
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
R0青菜(原料)材料傳送帶0取地址5至!1R0碟
R1炊具1將RO炒好后裝到R1碟;
R2廚師2存R1碟到地址6中;
地址傳送帶3
14
PC2廚房管理員5青菜
IR將R0炒好后裝到R1碟;控制傳送帶6
7
取
圖0.6
指令執行階段:
管理員閱讀并分析指令存放碟中的指令后,命令廚師將R0碟中的物品倒入鍋中炒好后裝
到R1碟。
第二條指令執行完后,理想廚房系統處于如下圖0.7狀態:
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
R0青菜材料傳送帶0取地址5至R0碟
R1熟青菜炊具1將RO炒好后裝到R1碟;
R2廚師2存R1碟到地址6中;
地址傳送帶3
4
PC2廚房管理員5青菜
IR將RO炒好后裝到R1碟;控制傳送帶6
7
圖0.7
3)同理,在第3條指令的取指令階段完成后,理想廚房系統處于如下圖0.8狀態:
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
生青菜材料傳送帶0取地址5到RO碟
R1熟青菜炊具1將RO炒好后裝到R1碟;
R2廚師2存RI碟到地址6中;
地址傳送帶3
4
5青菜
PC3廚房管理員控制傳送帶6
IR存R1碟到地址6中7
圖0.8
指令執行階段:
下面開始執行“存R1碟到地址6中”達條墻令。廚房管理員分析指令存放碟中的加工
步驟后,知道要將R1碟中的物品,送到冰箱地址為6的格子中去存放。于是,管理員向控
制傳送帶上發一個“存”信號,然后馬上將6這個數放到地址傳送帶上;最后,將R1碟中
的物品“熟青菜”放到材料傳送帶上,送往冰箱。
冰箱收到兩個來自理想廚房的信號后,知道理想廚房要存放物品到6格中;于是自動冰
箱(的機械手)在材料傳送帶旁,等待從理想廚房R1碟傳來物品——“熟青菜”、一旦到
達,自動冰箱就將其取下,并將其存放到地址為6的格子中。完成后系統狀態如圖0.9:
理想廚房自動冰箱
碟名碟中物品地址冰箱格子中物品
RO青菜材料傳送帶0取地址5到RO碟
R1黑香點炊具1將RO炒好后裝到R1碟;
R2廚師2存R1碟到地址6中;
地址傳送帶3
64
5青菜
PC3廚房管理員控制傳送帶6熟青菜
班存R7碟到地址6中;7
圖0.9
到此為止,炒青菜這道菜終于大功告成。
0.3理想廚房工作的重要特點
現在,我們對剛學到的重點知識,做一個小結:
1、順序性和周期性
順序性:理想廚房每次都只能取得和執行一條指令;一條地址為i中的指令執行完畢后,才
能順序執行地址為i+1中的指令。
周期性:廚房管理員的工作完全是周期性的,即他永遠在做:
(命令各部件)取指令一閱讀分析指令f發出控制命令要求各部件執行指令(簡稱為
取指T譯碼一執行)
這一周期性的動作。
只要一啟動,理想廚房就永遠按照這個周期性的動作,一條一條的順序地取指令并且執
行指令,…這樣不停地、不知疲倦地快速運行著,直到執行了一條"停止運行"指令或發生
嚴重故障時為止。
2、有限和無限
有限:廚師會做的各種不同基本加工操作所構成的集合是固定有限的(炒、煎、蒸、煮、
烤等幾十種),也就是說廚師學不會任何一種新的基本加工操作。廚房管理員能看懂的各種
不同種類加工步驟所構成的集合也是固定有限的(從冰箱取物品、存物品到冰箱、廚師的各
種不同加工方式、配菜員輸入原材料到冰箱或廚房、傳菜生輸出菜肴給顧客等)。
無限:然而,人們可以為理想廚房編寫出來的菜譜數量是無限制的。因此,理想廚房可
以炒出菜的品種總數也是沒有限制的。
3、智者與白癡
理想廚房中的廚師和廚房管理員都是不知疲倦的、機械化的“白癡”,在廚師或廚房管
理員的“大腦”中沒有任何一道菜的(全部或一部分)加工步驟。加工制作各種菜肴的智慧
(即蘊含在加工步驟中的智慧)都是來自于存放在自動冰箱中的菜譜,也就是來自于菜譜的
編寫者。正是由人們編寫出來的可以讓理想廚房執行的各種各樣的菜譜,才使得原本白癡般
的、能力極為有限然而速度卻極快的理想廚房系統在炒菜方面顯得似乎無所不能!
4、主動與被動:
在指令執行的三個階段中,取指令和分析閱讀指令是硬件主功進行的,而在指令的執行
階段,硬件是在軟件(即菜譜中的加工步驟)的命令下被動進行的。
5、不變與可變:
一個理想廚房系統的硬件組成和結構是不變的,而存放在它的冰箱中的軟件(菜譜)卻
是可以隨著客戶需要而隨時加以改變的;
同一個菜譜(菜譜不變)隨著加工處理的原材料的種類的不同(原材料可變),可以得
到不同的菜肴(菜肴可變)。比如:情炒青菜的菜譜同樣可以用來清炒韭菜,只要把生韭菜
放到原來放生青菜的指定格中。
一條指令執行的前兩個階段(取指令、閱讀分析指令),參與工作的硬件部件是不變的;
而在指令的執行階段,隨著指令類型的不同參與工作的硬件部件是可變的。
6、兩個中心
廚房管理員是執行指令的控制中心;廚師(加上炊具)是原材料的加工中心。
理想廚房系統的工作原理,到此已經全部介紹完畢。在下一章你將看到:理想廚房的工
作原理,與計算機的工作原理是極為類似的。因此在本書中,從整體上把握計算機的基本工
作原理,就變成為一個比較輕松的名詞替換的小游戲。
0.4理想廚房系統與計算機系統術語對照表
下面給出兩個系統之間的術語對照表,見表0.1。
表0.1術語對照表
理想廚房系統電子數字計算機系統(簡稱計算機系統)
1.硬件設備
自動冰箱(包含很多大小相等的格子)內存(又稱為主存,包含很多容量相等的基本存
儲單元)
(冰箱中的)一個格子(內存中的)一個基本存儲單元
材料傳送帶數據總線
地址傳送帶地址總線
控制信號傳送帶控制總線
理想廚房(包含以下設備)CPU或稱為微處理器(包含以下部件)
廚師及炊具算術邏輯單元ALU(又稱為運算器)
廚房管理員控制單元(又稱為控制器)
通用碟通用寄存器(或數據寄存器)
指令地址存放碟PC指令地址寄存器PC(又稱為程序計數器)
指令存放碟IR指令寄存器限
狀態存放碟程序狀態字寄存器PSW(又稱為標志寄存器)
采購員及配菜員輸入設備(鍵盤、鼠標、網卡、U盤等)
傳菜生輸出設備(顯示器、打印機、網卡、u盤等)
自動倉庫外存(硬盤、U盤)
2.軟件與硬件之間的接口(編寫菜譜或程序的基本要素)
冰箱地址(即格子的編號)內存地址(即基本存儲單元的編號)
廚師可做的各種炒菜基本動作算術邏輯單元可進行的各種基本運算
碟子的名稱寄存器的編號
理想廚房可以執行的所有不同加工動該類型計算機的指令集
作
3.軟件
特殊菜譜(機器語言形式的)程序
加工步驟指令
原材料數據
炒好的菜信息(或稱為結果)
精確的普通菜譜高級語言源程序(又稱為源代碼)
簡要的普通菜譜偽代碼
4.系統的使用者
編寫特殊菜譜者用機器語言編程的程序員
編寫精確的普通菜譜者用高級程序設計語言編程的程序員
理想廚房系統的大堂經理和顧客計算機的用戶
以上表中這些與計算機相關的術語,將在1.2節進行講解。
與在理想廚房系統上運行一個菜譜極為類似,在電子計算機上運行一個程序時,上表中
列出的計算機的各個部件也會協同工作,完成程序給定的任務(參見1.2節)。學習了理想
廚房這個例子,理解計算機原理就變得非常容易了。
0.5本章習題
1、在取一條指令到理想廚房的過程中,哪些部件會依次參與工作?哪個部件在此過程中起
著核心控制作用?
2、取一份原材料的工作過程與取一條指令的工作過程有什么區別?
3、考慮一下為理想廚房編寫的菜譜與給普通人看的菜譜有何不同點?
4、編寫一個香菇炒青菜的菜譜。
5、寫出三條傳送帶各自的職責。哪傳送帶是可以雙向傳遞的?在取指令時,材料傳送帶是
雙向的還是單向的?
第一章二進制的數和碼
——捷徑有時候是一條彎路。
——萬事開頭難。
計算機能夠"理解和懂得”的語言是二進制機器語言,計算機能夠直接加工處理的,
都是二進制的數和碼。本章1.1對二進制進行了簡介,其中最重要的概念是:字節、二進制
的數和碼;世界上的各種事物如何通過編碼用二進制位串來表示(或近似表示)。1.2對計算
機的基本構成成分、機器語言、計算機的基本工作原理進行了簡介。
1.1二進制簡介
為了從整體上把握計算機的基本工作原理,并為后面的編程學習奠定扎實的基礎,讀者
必須事先對數字信號、二進制及其相關知識有一個比較清晰的、整體的簡明了解。以下進行
簡要介紹。
1.1.1二進制與二進制數的基本概念
十進制數所對應的二進制數(所對應的十六進制數)
000
111
2102
3113
41004
51015
61106
71117
810008
910019
101010A(或a)
111011B(或b)
121100C(或c)
131101D(或d)
141110E(或c)
151111F(或f)
161000010
表1,1部分十進制數與二進制數(和十六進制數)數值對照表
二進制就是只能用數字"0"和“1”來進行計數的數字系統。二進制加法運算的重要規
則是:1+1=10,即兩個1相加,就產生了向高位的進位——即“逢二進一”(做減法時則
是“借一當二”),類似于十進制中的“逢十進一”(做減法時則是“借一當十”)o其它二進
制加法規則更簡單:0+0=0、0+1=1、1+0=1o
與十進制數類似,在一個二進制數中,靠左邊的數字是高位數,靠右邊的數字是低位數,
其中最左邊的位稱為最高位。
我們經常用一對圓括號括住一個數值,并在圓括號外的右下角加一個整數下標,用此下
標來表示該數值是幾進制的(但是對于十進制數一般不用圓括號和下標)。比如:(1011)16
是一個十六進制數;而(1011)2是一個二進制數。
1.1.2二進制數的多項式展開表示
一個十進制整數,其數值可用以下多項式展開來表示:比如3785
3785=3X103+7X102+8X10'+5X10°(1)
我們把(1)式中10的幾次方稱為權重,權重左邊的乘數稱為系數。(1)式中共有4
個系數,從左到右依次是:"3"、“7”、"8"、"5",權重依次分別是KAio2,10\10%
可見,用這種記數法表示數值時,越左邊的系數,所對應的權重越大,所以就越重要。
權重中的基數(即底)與表示該數的進制是一樣大的,在十進制數中都是10。
類似的,任意一個二進制整數,其數值也可用多項展開式來表示:比如二進制整數1011
(1011)2=1X23+0X22+1X21+1X2°(2)1
(2)式中系數從左到右依次是:"1"、"0"、“1”、“1”,而權重依次分別是23、22、2"2。(注
意:這里的權重是用十進制來表示的。如果權重也用二進制,則應當分別是二進制的10"、
101\10\100)。
展開式中系數的最大值一定比進制數小1,比如:在十進制記數系統中,系數的最大值
是9,而在在二進制記數系統中,系數的最大值是1。
1.2二進制相關術語簡介:位、位串、字節
下面,我們來熟悉一些與書寫、存儲或傳輸一串二進制數字有關的術語。
121位(bit):書寫、存儲或傳輸單個二進制數字,我們將其稱為"位"(bit)或“比特”。
單個“位”中的二進制數字不是0就是1,再沒有別的可能數字。
任何一個只能處在兩種不同穩定狀態的電子元件(觸發器、電容等)或者某種均勻介質
(比如覆蓋著磁性顆粒的金屬圓盤)表面上的一個小點,都可以用來(間接)表示和存儲二
進制的一個“位,如果用電容充滿電狀態表示二進制數"1",就可以用電容放完電的狀態
來表示二進制數“0”。
122位串及其長度:多個二進制數字順序排列在一起,稱之為“位串”(有些教科書稱為位
模式)。位串中含有的數字總個數稱為位串的長度。比如:位串100110的長度是6。處于位
串左邊的位稱為高位,處于位串右邊的位是低位。位于位串最左邊的位,稱為最高位。
123度量位串長度的基本單位——字節(Byte)
“位”這個二進制最小度量單位太小了,通常用起來很不方便。現代的絕大多數計算機
和一些數字處理設備,大多數是以長度為8的位串——字節——來作為度量(部件或設備的)
數據存儲容量大小的一種基本單位。
?如果完全用二進制展開表示,則應當是:(1011)2=1X1011+0X1()10+1X1()1+1X10。
,系數和權重都用二進制表示,但人們一般僅將系數用二進制表示。
把長度為8的一個位串稱作為一個字節,長度為16的一個位串稱為2個字節等等。長
度為n的位串,一共有n/8個字節。
也就是說,一個位串的長度,既可以用位串中的總位數來度量,也可以用位串所具有的
字節數來度量。
1.2.4二進制數據存儲和傳輸的一些其它常用單位KB、MB和GB
字節(Byte)這個基本單位雖然大小是位(bit)這個最小二進制單位的8倍,但是在很
多場合仍然還是顯得太小。更大的常用單位有(在以下敘述和各種資料、書籍中,經常用字
符B來代表術語字節——Byte):
千字節:1KB=1024B=2"'B
兆字節:1MB=1024KB=2">KB=2"B=1048576B(約為一百零五萬字節)
吉字節:1GB=1024MB=2i°MB=23°B=1073742814B(約十億七千多萬字節)
需要引起注意的是:相鄰單位之間,都是1024倍的關系,而不是1000倍的關系。
125位串的通常傳輸方式——并行或串行:一個長度為n的位串,既可以用n根并排導線
同時進行傳輸,每根導線傳輸一個位——即并行傳輸(這種傳輸方式速度很快,但要用多根
導線);也可以只用一根導線,分為n個相等時間段,一位一位地依次先后進行傳輸——即
串行傳輸(這種傳輸方式速度較慢,但只要用一根導線)。
在導線中如果用直流電的高電平(即有電流通過)來傳輸1,就可以用低電平(即無電
流通過)來傳輸0。
在計算機內部全部使用二進制的數或碼,但由于二進制通常太長不好書寫,人們在編
程和將數據輸入計算機時,還是喜歡用十進制(或者十六進制和八進制)。因此,我們必須
對用各種進制表示的數如何轉化成別的進制數有一個基本了解。
L3各種進制數之間的轉換
1.3.1二進制整數轉化成十進制整數
任意一個二進制整數,其數值可用以下展開式來表示:比如二進制數整1011
(1011)2=1X23+0X22+1X21+1X20(2)
此二進制數的值,等于十進制的1X8+0X4+1X2+1X1=8+2+1=11(3)
由此可以得到二進制整數轉化成十進制整數的一般方法:只要將一個二進制整數(比如1011)
展開后的(2)式中的每一位的系數值(采用十進制乘法規則)乘以這一位轉化成十進制數
后的權重(即2的幾次方),然后再將乘積項的數值(采用十進制加法規則)逐個相加起來
即可。
1.3.2任意R進制實數(或整數)的表示法
一般情況下,任何一個R進制去數,都可以緊湊地表示為:
(+Vn.f-r^o,rir.2...r.m)R(1.3)
(在計算科學中,R通常是2,8,10,16中的某一個正整數)
其中的任何一個(系數)i■,都是位于0到R-1之間的一個正整數,r。是個位數,r」是小
數點后的第一位數,%是最高位數。丁是小數點后的最低位數。如果小數點后的所有(系
數)口、Q、…、丁等都為0,則(1.3)表示一個整數。
將任意一個R進制數擴大R倍(即乘以R),只需將小數點右移一位即可;類似地,將
任意一個R進制數縮小R倍(即除以R),只需將小數點左移一位即可。
其中R等于10是人們最為熟悉的十進制數,這種(可以帶小數點的)十進制數的簡潔
緊湊表示方法,是由古代印度人發明的(來源于人有十個手指)。
任何一個R進制實數,也都可以用多項式展開表示為:
n,lm
±(rnXR+rn.lXR'-+---+rlXR+r0XR"+口X曰+QX/+…+小XR)(ij稱為系數,
史稱為權重)
在R進制數值的多項式展開表示法中,不使用小數點。人們最為熟悉的仍然是R等于
10時的多項式展開式。
1.3.3將十進制整數轉化成二進制數
把一個十進制轉整數(比如89)換成二進制,只需要用新的基數2(采用十進制除法規
則)除以這個十進制數(89),余數(1)是結果左邊的下一位數字,商(44)是新的被除數,…
然后重復這個過程,直到商為0時終止。
短除法就是按照這個轉換原理,把要轉換的十進制整數不斷的除以2,然后取余數,商
作為新的被除數,直到商為0的時候結束。然后把余數倒著寫出來。
例如:把89轉換成二進制數
2|891八
144
20
21220
2|111
2151
2120
2[11
0
即:89=02
延伸與拓展:轉換規則的技術內幕
要想明白這種轉換規則的道理,請考慮十進制整數與它等值的二進制整數的方程式:
89=(r0XZ+…+nX乎+〃X2+r0XZ)2
其中的二進制系數3。等等應該如何求得?可將該方程式的左邊的十進制整數整除2,得
到商44和余數1;與此同時將方程式的右邊的二進制整數的小數點左移一位(等價于整除2)。
n
這樣方程式右邊將得到rnX2-4…+0X2'+f!X2°+r0X2T;
顯然,商44應當與二進制整數%X2n"+…+「2X2』r】X2。相等;而89整除2所得到
的余數1(除以2的余數不是0就是1)就等于方程右邊的系數力(系數%不是0就是1)。
,>
同理,從方程式44=rnX2'<+-+r2X2+r,x2,我們可以用完全相同的方式得到系
數口的值,……,轉換工作直到方程左邊的商為0時結束。
注意:短除法也完全適用于將一個十進制整數轉換為一個任意R(R>2)進制的整數,只需將除數
由2替換為R即可。
1.3.4將十進制小數轉化成二進制小數
10進制小數轉換為2進制小數的轉換過程,與整數的進制轉換過程有些類似而計算方
法又恰恰相反:不是用新的基數2除這個數,而是用新基數2去乘它。乘法的進位(進到個
位的數字)將成為答案右邊的下一位數字,乘法結果中的小數部分將成為新的被乘數,整個
過程直到乘法結果中的小數部分為0時終止
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東建筑大學《歌曲分析與寫作(二)》2023-2024學年第一學期期末試卷
- 江蘇省南通市如東縣、徐州市豐縣2025屆招生全國統一考試·英語試題含解析
- 武平縣2025年四年級數學第二學期期末聯考試題含解析
- 江西應用工程職業學院《矩陣論3》2023-2024學年第二學期期末試卷
- 湛江市大成中學高二上學期第二次月考物理試題
- 2025年度長期借款合同示范文本
- 2025公路運輸合同范本
- 2025電子產品銷售勞動合同范本
- 2025實驗室建設項目合同書
- 2025年朋友咨詢關于勞動合同的問題求解答
- (完整)中小學教師職稱評定答辯題
- 精神專科醫院護理查房方案
- 學生考試成績評價分析表模板
- 高三數學復習備考策略
- 《環境工程概論4》全冊配套完整教學課件
- 六、七年級走進文言文譯文
- 2023年拉薩市“一考三評”備考試題庫匯總-上(單選題部分)
- 半月板損傷的護理查房
- 滬教版初中數學初二數學上冊《二次根式的運算》教學設計
- 糧庫出租合同書本
- 2022年桂林臨桂區教師招聘考試真題
評論
0/150
提交評論