1. 求2011年c語言公共基礎知識
一、選擇題
(1) 下面敘述正確的是(C)
A. 演算法的執行效率與數據的存儲結構無關 B. 演算法的空間復雜度是指演算法程序中指令(或語句)的條數 C. 演算法的有窮性是指演算法必須能在執行有限個步驟之後終止 D. 以上三種描述都不對
(2) 以下數據結構中不屬於線性數據結構的是(C)
A. 隊列 B. 線性表 C. 二叉樹 D. 棧
(3) 在一棵二叉樹上第5層的結點數最多是(B) 註:由公式2k-1得
A. 8 B. 16 C. 32 D. 15
(4) 下面描述中,符合結構化程序設計風格的是(A)
A. 使用順序、選擇和重復(循環)三種基本控制結構表示程序的控制邏輯 B. 模塊只有一個入口,可以有多個出口 C. 注重提高程序的執行效率 D. 不使用goto語句
(5) 下面概念中,不屬於面向對象方法的是 (D) 註:P55-58
A. 對象 B. 繼承 C. 類 D. 過程調用
(6) 在結構化方法中,用數據流程圖(DFD)作為描述工具的軟體開發階段是(B)
A. 可行性分析 B. 需求分析 C. 詳細設計 D. 程序編碼
(7) 在軟體開發中,下面任務不屬於設計階段的是(D)
A. 數據結構設計 B. 給出系統模塊結構
C. 定義模塊演算法 D. 定義需求並建立系統模型
(8) 資料庫系統的核心是(B)
A. 數據模型 B. 資料庫管理系統 C. 軟體工具 D. 資料庫
(9) 下列敘述中正確的是(C)
A.資料庫是一個獨立的系統,不需要操作系統的支持 B.資料庫設計是指設計資料庫管理系統C.資料庫技術的根本目標是要解決數據共享的問題 D.資料庫系統中,數據的物理結構必須與邏輯結構一致
(10) 下列模式中,能夠給出資料庫物理存儲結構與物理存取方法的是(A) 註:P108
A. 內模式 B. 外模式 C. 概念模式 D. 邏輯模式
(11) 演算法的時間復雜度是指(C)
A. 執行演算法程序所需要的時間 B. 演算法程序的長度 C. 演算法執行過程中所需要的基本運算次數 D. 演算法程序中的指令條數
(12) 演算法的空間復雜度是指(D)
A. 演算法程序的長度 B. 演算法程序中的指令條數 C. 演算法程序所佔的存儲空間 D. 演算法執行過程中所需要的存儲空間
(13) 設一棵完全二叉樹共有699個結點,則在該二叉樹中的葉子結點數為(B) 註:利用公式n=n0+n1+n2、n0=n2+1和完全二叉數的特點可求出
A. 349 B. 350 C. 255 D. 351
(14) 結構化程序設計主要強調的是(B)
A.程序的規模 B.程序的易讀性
C.程序的執行效率 D.程序的可移植性
(15) 在軟體生命周期中,能准確地確定軟體系統必須做什麼和必須具備哪些功能的階段是(D) 註:即第一個階段
A. 概要設計 B. 詳細設計 C. 可行性分析 D. 需求分析
(16) 數據流圖用於抽象描述一個軟體的邏輯模型,數據流圖由一些特定的圖符構成。下列圖符名標識的圖符不屬於數據流圖合法圖符的是(A) 註:P67
A. 控制流 B. 加工 C. 數據存儲 D. 源和潭
(17) 軟體需求分析階段的工作,可以分為四個方面:需求獲取、需求分析、編寫需求規格說明書以及(B) 註:P66
A. 階段性報告 B. 需求評審 C. 總結 D. 都不正確
(18) 下述關於資料庫系統的敘述中正確的是(A)
A. 資料庫系統減少了數據冗餘 B. 資料庫系統避免了一切冗餘
C. 資料庫系統中數據的一致性是指數據類型的一致 D. 資料庫系統比文件系統能管理更多的數據
(19) 關系表中的每一橫行稱為一個(A)
A. 元組 B. 欄位 C. 屬性 D. 碼
(20) 資料庫設計包括兩個方面的設計內容,它們是(A)
A. 概念設計和邏輯設計 B. 模式設計和內模式設計
C. 內模式設計和物理設計 D. 結構特性設計和行為特性設計
(21) 下列敘述中正確的是(A)
A. 線性表是線性結構 B. 棧與隊列是非線性結構
C. 線性鏈表是非線性結構 D. 二叉樹是線性結構
(22) 下列關於棧的敘述中正確的是(D)
A. 在棧中只能插入數據 B. 在棧中只能刪除數據
C. 棧是先進先出的線性表 D. 棧是先進後出的線性表
(23) 下列關於隊列的敘述中正確的是(C)
A. 在隊列中只能插入數據 B. 在隊列中只能刪除數據
C. 隊列是先進先出的線性表 D. 隊列是先進後出的線性表
(24) 對建立良好的程序設計風格,下面描述正確的是(A) 註:P48
A. 程序應簡單、清晰、可讀性好 B. 符號名的命名要符合語法
C. 充分考慮程序的執行效率 D. 程序的注釋可有可無
(25) 下面對對象概念描述錯誤的是(A) 註:P55
A. 任何對象都必須有繼承性 B. 對象是屬性和方法的封裝體
C. 對象間的通訊靠消息傳遞 D. 操作是對象的動態性屬性
(26) 下面不屬於軟體工程的3個要素的是(D) 註:P62
A. 工具 B. 過程 C. 方法 D. 環境
(27) 程序流程圖(PFD)中的箭頭代表的是(B) 註:P81
A. 數據流 B. 控制流 C. 調用關系 D. 組成關系
(28) 在數據管理技術的發展過程中,經歷了人工管理階段、文件系統階段和資料庫系統階段。其中數據獨立性最高的階段是(A)
A. 資料庫系統 B. 文件系統 C. 人工管理 D. 數據項管理
(29) 用樹形結構來表示實體之間聯系的模型稱為(B)
A. 關系模型 B. 層次模型 C. 網狀模型 D. 數據模型
(30) 關系資料庫管理系統能實現的專門關系運算包括(B)
A. 排序、索引、統計 B. 選擇、投影、連接
C. 關聯、更新、排序 D. 顯示、列印、製表
(31) 演算法一般都可以用哪幾種控制結構組合而成(D) 註:P3
A. 循環、分支、遞歸 B. 順序、循環、嵌套
C. 循環、遞歸、選擇 D. 順序、選擇、循環
(32) 數據的存儲結構是指(B) 註:P13,要牢記
A. 數據所佔的存儲空間量 B. 數據的邏輯結構在計算機中的表示
C. 數據在計算機中的順序存儲方式 D. 存儲在外存中的數據
(33) 設有下列二叉樹:圖見書P46
對此二叉樹中序遍歷的結果為(B)
A. ABCDEF B. DBEAFC C. ABDECF D. DEBFCA
(34) 在面向對象方法中,一個對象請求另一對象為其服務的方式是通過發送(D) 註:P56
A. 調用語句 B. 命令 C. 口令 D. 消息
(35) 檢查軟體產品是否符合需求定義的過程稱為(A) 註:P95
A. 確認測試 B. 集成測試 C. 驗證測試 D. 驗收測試
(36) 下列工具中屬於需求分析常用工具的是(D) 註:P67
A. PAD B. PFD C. N-S D. DFD
(37) 下面不屬於軟體設計原則的是(C) 註:P73
A. 抽象 B. 模塊化 C. 自底向上 D. 信息隱蔽
(38) 索引屬於(B)
A. 模式 B. 內模式 C. 外模式 D. 概念模式
(39) 在關系資料庫中,用來表示實體之間聯系的是(D)
A. 樹結構 B. 網結構 C. 線性表 D. 二維表
(40) 將E-R圖轉換到關系模式時,實體與聯系都可以表示成(B)
A. 屬性 B. 關系 C. 鍵 D. 域
(41) 在下列選項中,哪個不是一個演算法一般應該具有的基本特徵(C)
A. 確定性 B. 可行性 C. 無窮性 D. 擁有足夠的情報
(42) 希爾排序法屬於哪一種類型的排序法(B)
A.交換類排序法 B.插入類排序法 C.選擇類排序法 D.建堆排序法
(43) 在深度為5的滿二叉樹中,葉子結點的個數為(C)
A. 32 B. 31 C. 16 D. 15
(44) 對長度為N的線性表進行順序查找,在最壞情況下所需要的比較次數為(B) 註:要牢記
A. N+1 B. N C. (N+1)/2 D. N/2
(45) 信息隱蔽的概念與下述哪一種概念直接相關(B) 註:P74
A.軟體結構定義 B. 模塊獨立性 C. 模塊類型劃分 D. 模擬耦合度
(46) 面向對象的設計方法與傳統的的面向過程的方法有本質不同,它的基本原理是(C)
A. 模擬現實世界中不同事物之間的聯系 B. 強調模擬現實世界中的演算法而不強調概念 C. 使用現實世界的概念抽象地思考問題從而自然地解決問題 D. 鼓勵開發者在軟體開發的絕大部分中都用實際領域的概念去思考
(47) 在結構化方法中,軟體功能分解屬於下列軟體開發中的階段是(C) 註:總體設計也就是概要設計
A. 詳細設計 B. 需求分析 C. 總體設計 D. 編程調試
(48) 軟體調試的目的是(B) 註:與軟體測試要對比著復習
A.發現錯誤 B.改正錯誤 C.改善軟體的性能 D.挖掘軟體的潛能
(49) 按條件f對關系R進行選擇,其關系代數表達式為(C)
A. R|X|R B. R|X|Rf C. бf(R) D. ∏f(R)
(50) 資料庫概念設計的過程中,視圖設計一般有三種設計次序,以下各項中不對的是(D) 註:P127,要牢記
A. 自頂向下 B. 由底向上 C. 由內向外 D. 由整體到局部
(51) 在計算機中,演算法是指(C)
A. 查詢方法 B. 加工方法
C. 解題方案的准確而完整的描述 D. 排序方法
(52) 棧和隊列的共同點是(C) 註:這一共同點和線性表不一樣
A. 都是先進後出 B. 都是先進先出 C. 只允許在端點處插入和刪除元素 D. 沒有共同點
(53) 已知二叉樹後序遍歷序列是dabec,中序遍歷序列是debac,它的前序遍歷序列是(A) 註:P38,前提要掌握三種遍歷的方法
A. cedba B. acbed C. decab D. deabc
(54) 在下列幾種排序方法中,要求內存量最大的是(D) 註:要牢記,書中沒有提到。
A. 插入排序 B. 選擇排序 C. 快速排序 D. 歸並排序
(55) 在設計程序時,應採納的原則之一是(A) 註:和設計風格有關
A. 程序結構應有助於讀者理解 B. 不限制goto語句的使用
C. 減少或取消註解行 D. 程序越短越好
(56) 下列不屬於軟體調試技術的是(B) 註:P98
A. 強行排錯法 B. 集成測試法 C. 回溯法 D. 原因排除法
(57)下列敘述中,不屬於軟體需求規格說明書的作用的是(D)註:P71
A. 便於用戶、開發人員進行理解和交流 B. 反映出用戶問題的結構,可以作為軟體開發工作的基礎和依據 C. 作為確認測試和驗收的依據 D. 便於開發人員進行需求分析
(58) 在數據流圖(DFD)中,帶有名字的箭頭表示(C)
A. 控製程序的執行順序 B. 模塊之間的調用關系 C. 數據的流向 D. 程序的組成成分
(59) SQL語言又稱為(C)
A. 結構化定義語言 B. 結構化控制語言
C. 結構化查詢語言 D. 結構化操縱語言
(60) 視圖設計一般有3種設計次序,下列不屬於視圖設計的是(B)
A. 自頂向下 B. 由外向內 C. 由內向外 D. 自底向上
(61) 數據結構中,與所使用的計算機無關的是數據的(C)
A. 存儲結構 B. 物理結構 C. 邏輯結構 D. 物理和存儲結構
(62) 棧底至棧頂依次存放元素A、B、C、D,在第五個元素E入棧前,棧中元素可以出棧,則出棧序列可能是(D)
A. ABCED B. DBCEA C. CDABE D. DCBEA
(63) 線性表的順序存儲結構和線性表的鏈式存儲結構分別是(B)
A. 順序存取的存儲結構、順序存取的存儲結構 B. 隨機存取的存儲結構、順序存取的存儲結構 C. 隨機存取的存儲結構、隨機存取的存儲結構 D. 任意存取的存儲結構、任意存取的存儲結構
(64) 在單鏈表中,增加頭結點的目的是(A)
A. 方便運算的實現 B. 使單鏈表至少有一個結點 C. 標識表結點中首結點的位置 D. 說明單鏈表是線性表的鏈式存儲實現
(65) 軟體設計包括軟體的結構、數據介面和過程設計,其中軟體的過程設計是指(B) 註:P73
A. 模塊間的關系 B. 系統結構部件轉換成軟體的過程描述 C. 軟體層次結構 D. 軟體開發過程
(66) 為了避免流程圖在描述程序邏輯時的靈活性,提出了用方框圖來代替傳統的程序流程圖,通常也把這種圖稱為(B) 註:P82
A. PAD圖 B. N-S圖 C. 結構圖 D. 數據流圖
(67) 數據處理的最小單位是(C) 註:數據項不可再分割
A. 數據 B. 數據元素 C. 數據項 D. 數據結構
(68) 下列有關資料庫的描述,正確的是(C) 註:P102
A. 資料庫是一個DBF文件 B. 資料庫是一個關系 C. 資料庫是一個結構化的數據集合 D. 資料庫是一組文件
(69) 單個用戶使用的數據視圖的描述稱為(A) 註:P108
A. 外模式 B. 概念模式 C. 內模式 D. 存儲模式
(70) 需求分析階段的任務是確定(D)
A. 軟體開發方法 B. 軟體開發工具 C. 軟體開發費用 D. 軟體系統功能
(71) 演算法分析的目的是(D) 註:書中沒有總結,但要牢記
A. 找出數據結構的合理性 B. 找出演算法中輸入和輸出之間的關系 C. 分析演算法的易懂性和可靠性 D. 分析演算法的效率以求改進
(72)鏈表不具有的特點是(B)
A.不必事先估計存儲空間 B.可隨機訪問任一元素
C.插入刪除不需要移動元素 D.所需空間與線性表長度成正比
(73) 已知數據表A中每個元素距其最終位置不遠,為節省時間,應採用的演算法是(B)
A. 堆排序 B. 直接插入排序 C. 快速排序 D. 直接選擇排序
(74) 用鏈表表示線性表的優點是(A) 註:因為不需要移動元素
A. 便於插入和刪除操作 B. 數據元素的物理順序與邏輯順序相同 C. 花費的存儲空間較順序存儲少 D. 便於隨機存取
(75) 下列不屬於結構化分析的常用工具的是(D) 註:P67
A. 數據流圖 B. 數據字典 C. 判定樹 D. PAD圖
(76) 軟體開發的結構化生命周期方法將軟體生命周期劃分成(A)
A. 定義、開發、運行維護 B. 設計階段、編程階段、測試階段 C. 總體設計、詳細設計、編程調試 D. 需求分析、功能定義、系統設計
(77) 在軟體工程中,白箱測試法可用於測試程序的內部結構。此方法將程序看做是(C) 註:P87
A. 循環的集合 B. 地址的集合 C. 路徑的集合 D. 目標的集合
(78) 在數據管理技術發展過程中,文件系統與資料庫系統的主要區別是資料庫系統具有(D) 註:數據模型採用關系模型(二維表)
A. 數據無冗餘 B. 數據可共享
C. 專門的數據管理軟體 D. 特定的數據模型
(79) 分布式資料庫系統不具有的特點是(B)
A. 分布式 B. 數據冗餘
C. 數據分布性和邏輯整體性 D. 位置透明性和復制透明性
(80) 下列說法中,不屬於數據模型所描述的內容的是(C) 註:P110
A. 數據結構 B. 數據操作 C. 數據查詢 D. 數據約束
(81)根據數據結構中各數據元素之間前後件關系的復雜程度,一般將數據結構分成(C)
A.動態結構和靜態結構 B.緊湊結構和非緊湊結構
C.線性結構和非線性結構 D.內部結構和外部結構
(82)下列敘述中,錯誤的是(B)
A.數據的存儲結構與數據處理的效率密切相關 B.數據的存儲結構與數據處理的效率無關 C.數據的存儲結構在計算機中所佔的空間不一定是連續的 D.一種數據的邏輯結構可以有多種存儲結構
(83)線性表L=(a1,a2,a3,…ai,…an),下列說法正確的是(D)
A.每個元素都有一個直接前件和直接後件 B.線性表中至少要有一個元素 C.表中諸元素的排列順序必須是由小到大或由大到
D.除第一個元素和最後一個元素外,其餘每個元素都有一個且只有一個直接前件和直接後件
(84)線性表若採用鏈式存儲結構時,要求內存中可用存儲單元的地址(D)
A.必須是連續的 B.部分地址必須是連續的
C.一定是不連續的 D.連續不連續都可以
(85)棧通常採用的兩種存儲結構是(A)
A.順序存儲結構和鏈式存儲結構 B.散列方式和索引方式
C.鏈表存儲結構和數組 D.線性存儲結構和非線性存儲結構
(86)下列數據結構中,按先進後出原則組織數據的是(B)
A.線性鏈表 B.棧 C.循環鏈表 D.順序表
(87)樹是結點的集合,它的根結點數目是(C)
A.有且只有1 B.1或多於1 C.0或1 D.至少2
(88)具有3個結點的二叉樹有(D)
A.2種形態 B.4種形態 C.7種形態 D. 5種形態
(89)設一棵二叉樹中有3個葉子結點,有8個度為1的結點,則該二叉樹中總的結點數為(B)
A. 12 B. 13 C.14 D. 15
(90)在結構化程序設計思想提出之前,在程序設計中曾強調程序的效率,現在,與程序的效率相比,人們更重視程序的(C)
A.安全性 B.一致性 C.可理解性 D.合理性
(91)為了提高測試的效率,應該 (D) 註:P85
A.隨機選取測試數據B.取一切可能的輸入數據作為測試數據C.在完成編碼以後制定軟體的測試計劃 D.集中對付那些錯誤群集的程序
(92)軟體生命周期中所花費用最多的階段是(D)
A.詳細設計 B.軟體編碼 C.軟體測試 D.軟體維護
二、填空題
(1) 演算法的復雜度主要包括______復雜度和空間復雜度。 答:時間
(2) 數據的邏輯結構在計算機存儲空間中的存放形式稱為數據的______。答:存儲結構#物理結構
(3) 若按功能劃分,軟體測試的方法通常分為白盒測試方法和______測試方法。答:黑盒
(4) 如果一個工人可管理多個設施,而一個設施只被一個工人管理,則實體"工人"與實體"設備"之間存在______聯系。
答:一對多#1:N#1:n
(5) 關系資料庫管理系統能實現的專門關系運算包括選擇、連接和______。 答:投影
(6) 在先左後右的原則下,根據訪問根結點的次序,二叉樹的遍歷可以分為三種:前序遍歷、______遍歷和後序遍歷。答:中序
(7) 結構化程序設計方法的主要原則可以概括為自頂向下、逐步求精、______和限制使用goto語句。 答:模塊化
(8) 軟體的調試方法主要有:強行排錯法、______和原因排除法。答:回溯法
(9) 資料庫系統的三級模式分別為______模式、內部級模式與外部級模式。答:概念#概念級
(10) 數據字典是各類數據描述的集合,它通常包括5個部分,即數據項、數據結構、數據流、______和處理過程。答:數據存儲
(11) 設一棵完全二叉樹共有500個結點,則在該二叉樹中有______個葉子結點。答:250
(12) 在最壞情況下,冒泡排序的時間復雜度為______。 答:n(n-1)/2#n*(n-1)/2#O(n(n-1)/2)#O(n*(n-1)/2)
(13) 面向對象的程序設計方法中涉及的對象是系統中用來描述客觀事物的一個______。答:實體
(14) 軟體的需求分析階段的工作,可以概括為四個方面:______、需求分析、編寫需求規格說明書和需求評審。 答:需求獲取
(15) ______是資料庫應用的核心。 答:資料庫設計
(16) 數據結構包括數據的______結構和數據的存儲結構。
答:邏輯
(17) 軟體工程研究的內容主要包括:______技術和軟體工程管理。答:軟體開發 註:P64
(18) 與結構化需求分析方法相對應的是______方法。
答:結構化設計
(19) 關系模型的完整性規則是對關系的某種約束條件,包括實體完整性、______和自定義完整性。答:參照完整性
(20) 數據模型按不同的應用層次分為三種類型,它們是______數據模型、邏輯數據模型和物理數據模型。答:概念 註:P110
(21) 棧的基本運算有三種:入棧、退棧和______。
答:讀棧頂元素#讀棧頂的元素#讀出棧頂元素
(22) 在面向對象方法中,信息隱蔽是通過對象的______性來實現的。答:封裝
(23) 數據流的類型有______和事務型。 答:變換型 註:P77
(24) 資料庫系統中實現各種數據管理功能的核心軟體稱為______。答:資料庫管理系統#DBMS 註:要牢記,重要
(25) 關系模型的數據操縱即是建立在關繫上的數據操縱,一般有______、增加、刪除和修改四種操作。答:查詢 註:要牢記
(26) 實現演算法所需的存儲單元多少和演算法的工作量大小分別稱為演算法的 ______。 答:空間復雜度和時間復雜度
(27) 數據結構包括數據的邏輯結構、數據的 ______以及對數據的操作運算。答:存儲結構 註:P7
(28) 一個類可以從直接或間接的祖先中繼承所有屬性和方法。採用這個方法提高了軟體的______。答:可重用性
(29) 面向對象的模型中,最基本的概念是對象和 ______。 答:類
(30) 軟體維護活動包括以下幾類:改正性維護、適應性維護、______維護和預防性維護。答:完善性 註:要牢記,書中沒有提到
(31) 演算法的基本特徵是可行性、確定性、______和擁有足夠的情報。答:有窮性
(32) 順序存儲方法是把邏輯上相鄰的結點存儲在物理位置______的存儲單元中。答:相鄰
(33) Jackson結構化程序設計方法是英國的M.Jackson提出的,它是一種面向______的設計方法。答:數據結構 註:P67
(34) 資料庫設計分為以下6個設計階段:需求分析階段、______、邏輯設計階段、物理設計階段、實施階段、運行和維護階段。
答:概念設計階段#資料庫概念設計階段
(35) 資料庫保護分為:安全性控制 、______、並發性控制和數據的恢復。答:完整性控制 註:要牢記
(36) 測試的目的是暴露錯誤,評價程序的可靠性;而______的目的是發現錯誤的位置並改正錯誤。答:調試
(37) 在最壞情況下,堆排序需要比較的次數為______。
答:O(nlog2n)
(38) 若串s="Program",則其子串的數目是______。答:29
(39) 一個項目具有一個項目主管,一個項目主管可管理多個項目,則實體"項目主管"與實體"項目"的聯系屬於______的聯系。
答:1對多#1:N
(40) 資料庫管理系統常見的數據模型有層次模型、網狀模型和______三種。答:關系模型
(41)數據的邏輯結構有線性結構和_______兩大類。 答非線性結構
(42)數據結構分為邏輯結構與存儲結構,線性鏈表屬於_______。答:存儲結構
(43)數據的基本單位是_______。答:元素
(44)長度為n的順序存儲線性表中,當在任何位置上插入一個元素概率都相等時,插入一個元素所需移動元素的平均個數為______。
答:n/2
(45)當循環隊列非空且隊尾指針等於隊頭指針時,說明循環隊列已滿,不能進行入隊運算。這種情況稱為______。 答:上溢
(46)在面向對象方法中,類之間共享屬性和操作的機制稱為_______。答:繼承
2. 計算機二級c語言知識點
2017計算機二級c語言知識點精選
計算機二級C語言考試內容是什麼?為幫助大家更好備考3月計算機考試,我為大家分享計算機C語言二級考試知識點如下:
第一章 數據結構與演算法
1.1 演算法
1.演算法的基本概念
(1) 概念:演算法是指一系列解決問題的清晰指令。
(2) 4個基本特徵:可行性、確定性、有窮性、擁有足夠的情報。
(3) 兩種基本要素:對數據對象的運算和操作、演算法的控制結構(運算和操作時問的順序)。
(4) 設計的基本方法:列舉法、歸納法、遞推法、遞歸法、減半遞推技術和回溯法。
2.演算法的復雜度
(1) 演算法的時間復雜度:執行演算法所需要的計算工作量。
(2) 演算法的空間復雜度:執行演算法所需的內存空間。
1.2 數據結構的基本概念
數據結構指相互有關聯的數據元素的集合,即數據的組織形式。其中邏輯結構反映數據元素之間邏輯關系;存儲結構為數據的邏輯結構在計算機存儲空間中的存放形式,有順序存儲、鏈式存儲、索引存儲和散列存儲4種方式。
數據結構按各元素之間前後件關系的復雜度可劃分為:
(1) 線性結構:有且只有一個根節點,且每個節點最多有一個直接前驅和一個直接後繼的非空數據結構。
(2) 非線性結構:不滿足線性結構的數據結構。
1.3 線性表及其順序存儲結構
1.線性表的基本概念
線性結構又稱線性表,線性表是最簡單也是最常用的一種數據結構。
2.線性表的順序存儲結構
元素所佔的存儲空間必須連續。
元素在存儲空間的位置是按邏輯順序存放的。
3.線性表的插入運算
在第i個元素之前插入一個新元素的步驟如下:
步驟一:把原來第n個節點至第i個節點依次往後移一個元素位置。
步驟二:把新節點放在第i個位置上。
步驟三:修正線性表的節點個數。
在最壞情況下,即插入元素在第一個位置,線性表中所有元素均需要移動。
4.線性表的刪除運算
刪除第i個位置的元素的步驟如下:
步驟一:把第i個元素之後不包括第i個元素的n-i個元素依次前移一個位置;
步驟二:修正線性表的結點個數。
1.4 棧和隊列
1.棧及其基本運算
(1) 基本概念:棧是一種特殊的線性表,其插入運算與刪除運算都只在線性表的一端進行,也被稱為「先進後出」表或「後進先出」表。
棧頂:允許插入與刪除的一端。
棧底:棧頂的另一端。
空棧:棧中沒有元素的棧。
(2) 特點。
棧頂元素是最後插入和最早被刪除的元素。
棧底元素是最早插入和最後被刪除的元素。
棧有記憶作用。
在順序存儲結構下,棧的插入和刪除運算不需移動表中其他數據元素。
棧頂指針top動態反映了棧中元素的變化情況
(3) 順序存儲和運算:入棧運算、退棧運算和讀棧頂運算。
2.隊列及其基本運算
(1) 基本概念:隊列是指允許在一端進行插入,在另一端進行刪除的線性表,又稱「先進先出」的線性表。
隊尾:允許插入的一端,用尾指針指向隊尾元素。
排頭:允許刪除的一端,用頭指針指向頭元素的前一位置。
(2) 循環隊列及其運算。
所謂循環隊列,就是將隊列存儲空間的最後一個位置繞到第一個位置,形成邏輯上的環狀空間。
入隊運算是指在循環隊列的隊尾加入一個新元素。
當循環隊列非空(s=1)且隊尾指針等於隊頭指針時,說明循環隊列已滿,不能進行人隊運算,這種情況稱為「上溢」。
退隊運算是指在循環隊列的隊頭位置退出一個元素並賦給指定的變數。首先將隊頭指針進一,然後將排頭指針指向的元素賦給指定的變數。當循環隊列為空(s=0)時,不能進行退隊運算,這種情況稱為「下溢」。
1.5 線性鏈表
在定義的鏈表中,若只含有一個指針域來存放下一個元素地址,稱這樣的鏈表為單鏈表或線性鏈表。
在鏈式存儲方式中,要求每個結點由兩部分組成:一部分用於存放數據元素值,稱為數據域;另一部分用於存放指針,稱為指針域。其中指針用於指向該結點的前一個或後一個結點(即前件或後件)。
1.6 樹和二叉樹
1.樹的基本概念
樹是簡單的非線性結構,樹中有且僅有一個沒有前驅的節點稱為「根」,其餘節點分成m個互不相交的有限集合T1,T2,…,T}mm,每個集合又是一棵樹,稱T1,T2,…,T}mm為根結點的子樹。
父節點:每一個節點只有一個前件,無前件的節點只有一個,稱為樹的根結點(簡稱樹的根)。
子節點:每~個節點可以後多個後件,無後件的節點稱為葉子節點。
樹的度:所有節點最大的度。
樹的深度:樹的最大層次。
2.二叉樹的定義及其基本性質
(1) 二叉樹的定義:二叉樹是一種非線性結構,是有限的節點集合,該集合為空(空二叉樹)或由一個根節點及兩棵互不相交的左右二叉子樹組成。可分為滿二叉樹和完全二叉樹,其中滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹。二叉樹具有如下兩個特點:
二叉樹可為空,空的二叉樹無節點,非空二叉樹有且只有一個根結點;
每個節點最多可有兩棵子樹,稱為左子樹和右子樹。
(2) 二叉樹的基本性質。
性質1:在二叉樹的第k層上至多有2k-1個結點(k≥1)。
性質2:深度為m的二叉樹至多有2m-1個結點。
性質3:對任何一棵二叉樹,度為0的結點(即葉子結點)總是比度為2的結點多一個。
性質4:具有n個結點的完全二叉樹的深度至少為[log2n]+1,其中[log2n]表示log2n的整數部分。
3.滿二叉樹與完全二叉樹
(1) 滿二叉樹:滿二叉樹是指這樣的一種二叉樹:除最後一層外,每一層上的所有結點都有兩個子結點。滿二叉樹在其第i層上有2i-1個結點。
從上面滿二叉樹定義可知,二叉樹的每一層上的結點數必須都達到最大,否則就不是滿二叉樹。深度為m的滿二叉樹有2m-1個結點。
(2) 完全二叉樹:完全二叉樹是指這樣的二叉樹:除最後一層外,每一層上的結點數均達到最大值;在最後一層上只缺少右邊的若干結點。
如果—棵具有n個結點的深度為k的二叉樹,它的每—個結點都與深度為k的滿二叉樹中編號為1~n的結點——對應。
3.二叉樹的存儲結構
二叉樹通常採用鏈式存儲結構,存儲節點由數據域和指針域(左指針域和右指針域)組成。二叉樹的鏈式存儲結構也稱二叉鏈表,對滿二叉樹和完全二叉樹可按層次進行順序存儲。
4.二叉樹的遍歷
二叉樹的遍歷是指不重復地訪問二叉樹中所有節點,主要指非空二叉樹,對於空二叉樹則結束返回。二叉樹的遍歷包括前序遍歷、中序遍歷和後序遍歷。
(1) 前序遍歷。
前序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹;並且,在遍歷左右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。前序遍歷描述為:若二叉樹為空,則執行空操作;否則①訪問根結點;②前序遍歷左子樹;③前序遍歷右子樹。
(2) 中序遍歷。
中序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹;並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。中序遍歷描述為:若二叉樹為空,則執行空操作;否則①中序遍歷左子樹;②訪問根結點;③中序遍歷右子樹。
(3) 後序遍歷。
後序遍歷是指在訪問根結點、遍歷左子樹與遍歷右子樹這三者中,首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點,並且,在遍歷左、右子樹時,仍然先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。後序遍歷描述為:若二叉樹為空,則執行空操作;否則①後序遍歷左子樹;②後序遍歷右子樹;③訪問根結點。
1.7 查找技術
(1) 順序查找:在線性表中查找指定的元素。
(2) 最壞情況下,最後一個元素才是要找的元素,則需要與線性表中所有元素比較,比較次數為n。
(3) 二分查找:二分查找也稱折半查找,它是一種高效率的查找方法。但二分查找有條件限制,它要求表必須用順序存儲結構,且表中元素必須按關鍵字有序(升序或降序均可)排列。對長度為n的有序線性表,在最壞情況下,二分查找法只需比較log2n次。
1.8 排序技術
(1) 交換類排序法。
冒泡排序:通過對待排序序列從後向前或從前向後,依次比較相鄰元素的排序碼,若發現逆序則交換,使較大的元素逐漸從前部移向後部或較小的元素逐漸從後部移向前部,直到所有元素有序為止。在最壞情況下,對長度為n的線性表排序,冒泡排序需要比較的次數為n(n-1)/2。
快速排序:是迄今為止所有內排序演算法中速度最快的一種。它的基本思想是:任取待排序序列中的某個元素作為基準(一般取第一個元素),通過一趟排序,將待排元素分為左右兩個子序列,左子序列元索的排序碼均小於或等於基準元素的排序碼,右子序列的排序碼則大於基準元素的排序碼,然後分別對兩個子序列繼續進行排序,直至整個序列有序。最壞情況下,即每次劃分,只得到一個序列,時間效率為O(n2)。
(2) 插人類排序法。
簡單插入排序法:把n個待排序的元素看成為一個有序表和一個無序表,開始時有序表中只包含一個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,把它的排序碼依次與有序表元素的排序碼進行比較,將它插入到有序表中的適當位置,使之成為新的有序表。在最壞情況下,即初始排序序列是逆序的情況下,比較次數為n(n-1)/2,移動次數為n(n-1)/2。
希爾排序法:先將整個待排元素序列分割成若干個子序列(由相隔某個「增量」的元素組成的)分別進行直接插入排序。待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。
(3) 選擇類排序法。
簡單選擇排序法:掃描整個線性表。從中選出最小的元素。將它交換到表的最前面;然後對剩下的子表採用同樣的方法,直到子表空為止。最壞情況下需要比較n(n-1)/2次。
堆排序的方法:首先將一個無序序列建成堆;然後將堆頂元素(序列中的最大項)與堆中最後一個元素交換(最大項應該在序列的最後)。不考慮已經換到最後的那個元素,只考慮前n-1個元素構成的子序列,將該子序列調整為堆。反復做步驟②,直到剩下的子序列空為止。在最壞情況下,堆排序法需要比較的次數為0(nlog2n)
第二章 程序設計基礎
2.1 程序設計方法與風格
(1)設計方法:指設計、編制、調試程序的方法和過程,主要有結構化程序設計方法、軟體工程方法和面向對象方法。
(2)設計風格:良好的'設計風格要注重源程序文檔化、數據說明方法、語句的結構和輸入輸出。
2.2 結構化程序設計
1.結構化程序設計的原則
結構化程序設計強調程序設計風格和程序結構的規范化,提倡清晰的結構。。
(1)自頂向下:即先考慮總體,後考慮細節;先考慮全局目標,後考慮局部目標。
(2)逐步求精:對復雜問題,應設計一些子目標做過渡,逐步細化。
(3)模塊化:把程序要解決的總目標分解為分目標,再進一步分解為具體的小目標,把每個小目標稱為一個模塊;
(4)限制使用GOT0語句。
2.結構化程序的基本結構與特點
(1)順序結構:自始至終嚴格按照程序中語句的先後順序逐條執行,是最基本、最普遍的結構形式。
(2)選擇結構:又稱為分支結構,包括簡單選擇和多分支選擇結構。
(3)重復結構:又稱為循環結構,根據給定的條件,判斷是否需要重復執行某一相同的或類似的程序段。
結構化程序設計中,應注意事項:
(1)使用程序設計語言中的順序、選擇、循環等有限的控制結構表示程序的控制邏輯。
(2)選用的控制結構只准許有一個人口和一個出口。
(3)程序語言組成容易識別的塊,每塊只有一個入口和一個出口。
(4)復雜結構應該用嵌套的基本控制結構進行組合嵌套來實現。
(5)語言中所沒有的控制結構,應該採用前後一致的方法來模擬。
(6)盡量避免GOT0語句的使用。
2.3 面向對象的程序設計
面向對象方法的本質是主張從客觀世界固有的事物出發來構造系統,強調建立的系統能映射問題域。
對象:用來表示客觀世界中任何實體,可以是任何有明確邊界和意義的東西。
類:具有共同屬性、共同方法的對象的集合。
實例:一個具體對象就是其對應分類的一個實例。
消息:實例間傳遞的信息,它統一了數據流和控制流。
繼承:使用已有的類定義作為基礎建立新類的定義技術。
多態性:指對象根據所接受的信息而作出動作,同樣的信息被不同的對象接收時有不同行動的現象。面向對象程序設計的優點:與人類習慣的思維方法一致、穩定性好、可重用性好、易於開發大型軟體產品、可維護性好。
第三章 軟體工程基礎
3.1 軟體工程基本概念
1.軟體的定義與特點
(1)定義:軟體是指與計算機系統的操作有關的計算機程序、規程、規則,以及可能有的文件、文檔和數據。
(2)特點。
是邏輯實體,有抽象性。
生產沒有明顯的製作過程。
運行使用期間不存在磨損、老化問題。
開發、運行對計算機系統有依賴性,受計算機系統的限制,導致了軟體移植問題。
復雜性較高,成本昂貴。
開發涉及諸多社會因素。
2.軟體的分類
軟體可分應用軟體、系統軟體和支撐軟體3類。
(1)應用軟體是特定應用領域內專用的軟體。
(2)系統軟體居於計算機系統中最靠近硬體的一層,是計算機管理自身資源,提高計算機使用效率並為計算機用戶提供各種服務的軟體。
(3)支撐軟體介於系統軟體和應用軟體之間,是支援其它軟體的開發與維護的軟體。
3.軟體危機與軟體工程
軟體危機指在計算機軟體的開發和維護中遇到的一系列嚴重問題。軟體工程是應用於計算機軟體的定義、開發和維護的一整套方法、工具、文檔、實踐標准和工序,包括軟體開發技術和軟體工程管理。
4.軟體生命周期
軟體產品從提出、實現、使用維護到停止使用的過程稱為軟體生命周期。
在國家標准中,軟體生命周期劃分為8個階段①軟體定義期:包括問題定義、可行性研究和需求分析3個階段。②軟體開發期:包括概要設計、詳細設計、實現和測試4個階段。③運行維護期:即運行維護階段。
5.軟體工程的原則
軟體工程的原則包括:抽象、信息隱蔽、模塊化、局部化、確定性、一致性、完備性和可驗證性。
3.2 結構化分析方法
需求分析的任務是發現需求、求精、建模和定義需求的過程,可概括為:需求獲取、需求分析、編寫需求規格說明書和需求評審。
1.常用的分析方法
結構化分析方法:其實質著眼於數據流,自頂向下,逐層分解,建立系統的處理流程。
面向對象分析方法。
2.結構化分析常用工具
結構化分析常用工具包括數據流圖、數字字典(核心方法)、判斷樹和判斷表。
(1)數據流圖:即DFD圖,以圖形的方式描繪數據在系統中流動和處理的過程,它只反映系統必須完成的邏輯功能。是一種功能模型。
符號名稱作用:
箭頭代表數據流,沿箭頭方向傳送數據的通道
圓或橢圓代表加工,輸入數據經加工變換產生輸出
雙杠代表存儲文件,表示處理過程中存放各種數據文件
方框代表源和潭,表示系統和環境的介面
(2)數據字典:結構化分析方法的核心。數據字典是對所有與系統相關的數據元素的一個有組織的列表。以及精確的、嚴格的定義,使得用戶和系統分析員對於輸入、輸出、存儲成分和中間計算結果有共同的理解。
(3)判定樹:使用判定樹進行描述時,應先從問題定義的文字描述中分清判定的條件和判定的結論,根據描述材料中的連接詞找出判定條件之問的從屬關系、並列關系、選擇關系,根據它們構造判定樹。
(4)判定表:與判定樹相似,當數據流圖中的加工要依賴於多個邏輯條件的取值,即完成該加工的一組動作是由於某一組條件取值的組合引發的,使用判定表比較適宜。
3.軟體需求規格說明書
軟體需求規格說明書是需求分析階段的最後成果,是軟體開發的重要文檔之一。
(1)軟體需求規格說明書的作用:①便於用戶、開發人員進行理解和交流;②反映出用戶問題的結構,可以作為軟體開發工作的基礎和依據;③作為確認測試和驗收的依據。
(2)軟體需求規格說明書的內容:①概述;②數據描述;③功能描述;④性能描述;⑤參考文獻;⑥附錄。
(3)軟體需求規格說明書的特點:①正確性;②無歧義性;③完整性;④可驗證性;⑤一致性;⑥可理解性;⑦可修改性;⑧可追蹤性。
3.3 結構化設計方法
1.軟體設計的基本概念和方法
軟體沒計是一個把軟體需求轉換為軟體表示的過程。
(1)基本原理:抽象、模塊化、信息隱藏、模塊獨立性(度量標准:耦合性和內聚性,高耦合、低內聚)。
(2)基本思想:將軟體設計成由相對獨立、單一功能的模塊組成的結構。
2.概要設計
(1)4個任務:設計軟體系統結構、數據結構及資料庫設計、編寫概要設計文檔、概要設計文檔評審。
(2)面向數據流的設計方法:數據流圖的信息分為交換流和事物流,結構形式有交換型和事務型。
3.詳細設計的工具
詳細設計的工具包括:
圖形工具:程序流程圖、N-S、PAD、HIPO。
表格工具:判定表。
語言工具:PDL(偽碼)。
3.4 軟體測試
1.目的
為了發現錯誤而執行程序的過程。
2.准則
所有測試應追溯到用戶需求。
嚴格執行測試計劃,排除測試的隨意性。
充分注意測試中的群集現象。
程序員應避免檢查自己的程序。
窮舉測試不可能。
妥善保存設計計劃、測試用例、出錯統計和最終分析報告。
3.軟體測試技術和方法
軟體測試的方法按是否需要執行被測軟體的角度,可分為靜態測試和動態測試,按功能分為白盒測試和黑盒測試。
(1)白盒測試:根據程序的內部邏輯設計測試用例,主要方法有邏輯覆蓋測試、基本路徑測試等。
(2)黑盒測試:根據規格說明書的功能來設計測試用例,主要診斷方法有等價劃分法、邊界值分析法、錯誤推測法、因果圖法等,主要用於軟體確認測試。
4.軟體測試的實施
軟體測試是保證軟體質量的重要手段,軟體測試是一個過程,其測試流程是該過程規定的程序,目的是使軟體測試工作系統化。
軟體測試過程分4個步驟,即單元測試、集成測試、驗收測試和系統測試。
單元測試是對軟體設計的最小單位——模塊(程序單元)進行正確性檢驗測試。
單元測試的目的是發現各模塊內部可能存在的各種錯誤。
單元測試的依據是詳細的設計說明書和源程序。
單元測試的技術可以採用靜態分析和動態測試。
3.5 程序的調試
(1)任務:診斷和改正程序中的錯誤。
(2)調試方法:強行排錯法、回溯法和原因排除法。
第四章 資料庫設計基礎
4.1 資料庫系統的基本概念
(1) 數據(Data):描述事物的符號記錄。
(2) 資料庫(DataBase):長期存儲在計算機內的、有組織的、可共享的數據集合。
(3) 資料庫管理系統的概念
資料庫管理系統(DataBase Management System,DBMS)是資料庫的機構,它是一種系統軟體,負責資料庫中的數據組織、數據操作、數據維護、數據控制及保護和數據服務等。為完成以上6個功能,DBMS提供了相應的數據語言;數據定義語言(負責數據的模式定義與數據的物理存取構建);數據操縱語言(負責數據的操縱);數據控制語言(負責數據完整性、安全性的定義)。資料庫管理系統是資料庫系統的核心,它位於用戶和操作系統之間,從軟體分類的角度來說,屬於系統軟體。
(4) 資料庫技術發展經歷了3個階段。
人工管理階段→文件系統階段→資料庫系統階段
(5) 資料庫系統的特點:集成性、高共享性、低冗餘性、數據獨立性、數據統一管理與控制等。
(6) 資料庫系統的內部機構體系:三級模式(概念模式、內模式、外模式)和二級映射(外模式/概念模式的映射、概念模式/內模式的映射)構成了資料庫系統內部的抽象結構體系。
4.2 數據模型
數據模型是數據特徵的抽象,從抽象層次上描述了系統的靜態特徵、動態行為和約束條件,描述的內容有數據結構、數據操作和數據約束。有3個層次:概念數據模型、邏輯數據模型和物理數據模型。
(1) E—R模型:提供了表示實體、屬性和聯系的方法。實體間聯系有「一對一」、「一對多」和「多對多」。
(2) E-R模型用E-R圖來表示。
(3) 層次模型:利用樹形結構表示實體及其之問聯系。其中節點是實體,樹枝是聯系,從上到下是一對多關系。
(4) 網狀模型:用網狀結構表示實體及其之間聯系。是層次模型的擴展。網路模型以記錄型為節點,反映現實中較為復雜的事物聯系。
(5) 關系模型:採用二維表(由表框架和表的元組組成)來表示,可進行數據查詢、增加、刪除及修改操作。關系模型允許定義「實體完整性」、「參照完整性」和「用戶定義的完整性」三種約束。
鍵(碼):二維表中唯一能標識元組的最小屬性集。
候選鍵(候選碼):二維表中可能有的多個鍵。
主鍵:被選取的一個使用的鍵。
4.3 關系代數
(1) 關系代數的基本運算:投影、選擇、笛卡爾積。
(2) 關系代數的擴充運算:交、連接與自然連接、除。
4.4 資料庫設計與管理
1.資料庫設計概述
基本思想:過程迭代和逐步求精。
方法:面向數據的方法和面向過程的方法。
設計過程:需求分析→概念設計→邏輯設計→物理設計→編碼→測試→運行→進→步修改。
2.資料庫設計的需求分析
需求收集和分析是資料庫設計的第一階段,常用結構化分析方法(自頂向下、逐層分解)和面向對象的方法,主要工作有繪制數據流程圖、數據分析、功能分析、確定功能處理模塊和數據間關系。
數據字典:包括數據項、數據結構、數據流、數據存儲和處理過程,是對系統中數據的詳盡描述。
3.資料庫的設計
(1) 資料庫的概念設計:分析數據問內在的語義關聯,以建立數據的抽象模型。
(2) 資料庫的邏輯設計:從E-R圖向關系模型轉換,邏輯模式規范化,關系視圖設計可以根據用戶需求隨時創建。實體轉換為元組,屬性轉換為關系的屬性,聯系轉換為關系。
(3) 資料庫的物理設計:是數據在物理設備上的存儲結構與存取方法,目的是對資料庫內部物理結構作出調整並選擇合理的存取路徑,以提高速度和存儲空間。
4.資料庫管理
資料庫管理包括資料庫的建立、資料庫的調整、資料庫的重組、資料庫的安全性與完整性控制、資料庫故障恢復和資料庫的監控。
;3. 誰幫我整理一些C語言的基礎知識,謝謝!!
C語言基礎知識
1.1 C語言簡介
C語言於1972年由美國的Dennis Ritchie發明,並首次在配備了UNIX操作系統的DEC PDP-11計算機上實現。它由早期的編程語言BCPL(Basic Combind Programming Language)發展演變而來。1970年,AT&T貝爾實驗室的Ken Thompson根據BCPL語言設計出了較先進並取名為B的語言,通過不斷修改、完善,更先進的C語言問世了。
C語言是一種功能強大、應用廣泛、具有發展前途的計算機語言。它既可用於系統軟體的設計,也可用於應用軟體的開發。許多著名的系統軟體都是由C語言編寫的。C語言具有下列特點:
(1)C語言既具有低級語言直接操縱硬體的特點,又具有高級語言與 自然語言和人的思維邏輯相似的特點,C語言程序易編寫、易查錯,而且實用性很強。
(2)C語言具有豐富的數據類型和運算符,語法結構簡單。
(3)C語言是一種結構化程序設計語言,提供了完整的程序控制語句。
(4)C語言是一種模塊化程序設計語言,適合大型軟體的開發和研製。
(5)C語言還有一個突出的優點就是適合於多種操作系統,如DOS、UNIX,也適用於多種機型,其程序移植性好。
1.2 C語言的數據類型
數據是程序處理的對象,數據類型是數據的內在表現形式。例如,學生的年齡和成績具有一般數值的特點,在C語言中稱為數值型,其中年齡是整數,稱為整型;成績可以為小數,稱為實型。而學生的姓名和性別是文字,在C語言中稱為字元型數據。
C語言具有豐富的數據類型,其中基本的數據類型有整型、實型、字元型。
1.2.1 變數
變數是在程序執行過程中其值可以被改變的量。
1.變數命名規則
和人的取名一樣,變數的命名也有一定的規則。
(1)由字母、數字和下劃線組成;
(2)必須以字母或下劃線打頭;
(3)字母區分大小寫(在系統默認狀態下);
(4)前32個字元有效(在系統默認狀態下)。
例如:a,Book,book,_Make_Cipher都是合法的變數名,且Book與book是不同的變數名,而123A,x+y都不是變數名。
2.變數的數據類型
變數可以是任意的一種數據類型,如整型變數、字元型變數、指針變數等。C語言中的基本數據類型及其特性如表1-1所示。
表1-1 C語言的基本數據類型
數據類型名 數據類型描述 數據類型的長度(位元組) 數據取值范圍
char 字元型 1 0~255
int 有符號整型 2 –32 768~32 767
unsigned int 無符號整型 2 0~65 535
short 短整型 2 –32 768~32 767
long 長整型 4 –2 147 483 648~2 147 483 647
unsigned long 無符號長整型 4 0~4 294 967 295
float 單精度實數 4 |3.4×10–38|~|3.4×1038|
double 雙精度實數 8 |1.7×10–308|~|1.7×10308|
long double 長雙精度實數 10 |3.4×10–4932|~|3.4×104932|
3.變數的定義
每個變數在使用前都必須先定義其數據類型,定義變數數據類型的語法格式如下:
數據類型符 變數名1,變數名2,…;
例如:
int age,score; /* 定義年齡和成績為整型 */
char name[20]; /* 定義姓名為至多含20個字元的字元數組 */
4.變數的存儲類型
當定義某個變數時,C語言的編譯系統就要給該變數分配若干個存儲單元用來存放該變數的值。而在計算機中寄存器和內存都可以存放數據,內存又可分為臨時佔用和長期佔用。變數的存儲類型是指變數在計算機中的存放位置及時間。
定義變數存儲類型的語法格式如下:
存儲類型符 數據類型符 變數名1,變數名2,…;
變數的存儲類型有自動型(auto)、寄存器型(register)、靜態型(static)和外部型(extern),具體特點和使用方法在後面的章節中詳細介紹。
在變數定義時,如未說明存儲類型,則系統默認為自動型(auto)。
5.變數的初始化
變數的初始化是給變數賦初值的一種方法,是指在變數定義時就給變數賦予初始值。變數初始化的方法很簡單,在變數定義的語句中,在變數名後加一個等號和初值即可。
例如:
int x, age=20, score=100;
在上面的定義中,變數x未賦初值,而變數age和score的初值分別為20和100。
在程序中,變數未賦值之前不允許使用,即要遵循「先賦值後使用」的規則。
1.2.2 常量
常量是在程序運行過程中值不發生改變的數據。例如,圓周率3.1415926就是一個常量。常量也有數據類型,它們是整型常量、實型常量、字元常量、字元串常量及符號常量,整型常量及實型常量的數據長度及取值范圍與變數的規定相同。
1.整型常量
整型常量用來表示整數,整型數據可以以不同數制形式來表示,不同的進位制有其不同的表示方式,其表示方式如表1-2所示。
表1-2 整型常量的表示方式
數 制 表 示 方 式 示 例
十進制 一般整數的寫法 0,–22,55
八進制 在八進制整數前加數字0 00,–072,+0331
十六進制 在十六進制整數前加數字0和字母x 0x0,0x1B5,–0xb3
另外,對於長整型常量,應當在其後加後綴L或l,例如30L。30L和30數值一樣,但佔用內存的大小不一樣。30佔用2個位元組的存儲空間,而30L佔用4個位元組的存儲空間。
2.實型常量
實型常量只有十進制數表示方式,它沒有單精度和雙精度之分。其表示方式有定點數表示和浮點數表示兩種。具體表示方式如表1-3所示。
表1-3 實型常量的書寫方法
類 別 表 示 方 式 示 例
定點數 整數部分.小數部分 0.0,1.34,–34.0
浮點數 尾數E(或e)指數 3.57E10,–5.6e–9
說明:
(1)浮點數表示方式相當於數學中的科學計數法,其換算公式如下:
尾數E(或e)指數=尾數×10指數
(2)浮點數中的指數部分只能是整型數,尾數可以大於或等於10。
3.字元常量
字元常量是用兩個單引號引住單個字元來表示的。例如:'A'、'*'、'!'等。使用字元常量時應注意以下幾點:
(1)空格也是字元,表示為'a'。
(2)單引號中必須恰好有一個字元,不能空缺。如' '是錯誤的字元常量。
在C語言中有一類特殊的字元常量,被稱為轉義字元。它們用來表示特殊符號或鍵盤上的控制代碼,常見的轉義字元如表1-4所示。
表1-4 常用轉義字元表
轉 義 字 符 意 義 轉 義 字 符 意 義
\n 回車換行符 \a 響鈴
\t 水平製表符 \" 雙引號
\v 垂直製表符 \' 單引號
\b 左退一格 \\ 反斜杠
\r 回車符 \ddd 1~3位八進制數ddd對應的字元
\f 換頁符 \xhh 1~2位十六進制數hh對應的字元
4.字元串常量
字元串是用雙引號引住的若干個字元。例如,"hello!","485769","a"。
字元串可以不含任何字元,稱為空串,表示為""。
字元串中所含的字元個數稱為字元串的長度。例如,"abc123","3",""的長度分別為6,1,0。計算字元串長度時應注意以下幾點:
(1)對於含有轉義字元的字元串,應將轉義字元計算為1個字元。例如,"abc\\12\n"的長度為7,而不是9;"abc\\\12\n"及"abc\\\123\n"的長度均為6。
(2)在字元串中,反斜杠表示轉義字元的開始,如果其後面沒有表1-4中所列出的轉義符號,則該反斜杠被忽略,並不參與計算長度。例如,"\A"的長度為1,但"\"是非法的。
5.符號常量
上面所介紹的常量都是具體數據,在程序中也可以用特定符號來表示某個常量,這個符號被稱為符號常量。
符號常量的語法格式如下:
#define 符號常量名 常量
例如:
#define PI 3.1415926
經過上述定義後,可以在程序中使用PI來代替3.1415926。
在程序中使用符號常量有兩個好處:一是提高了程序的易讀性;二是為修改程序提供了方便。例如,當不需要太高精度時,只需要將符號常量定義修改為
#define PI 3.14
而不需要在程序中去修改每一處的圓周率。
1.3 算術運算符與算術表達式
用來表示各種運算的符號稱為運算符。C語言中包括以下七大類的基本運算符:算術運算符、邏輯運算符、關系運算符、賦值運算符、逗號運算符、條件運算符和位運算符。本節主要介紹算術運算符,其他的運算符將在後續章節中詳細介紹。
1.3.1 算術運算符
C語言中的算術運算符和數學中的算術運算相似,是對數據進行算術運算的。算術運算符的運算對象、運算規則及結合性如表1-5所示。
表1-5 算術運算符
運算對象個數 名 稱 運 算 符 運 算 規 則 運算對象
數據類型 結 合 性
單目 正 + 取原值 整型或實型 自右向左
負 – 取負值
雙目 加 + 加法運算 自左向右
減 – 減法運算
乘 * 乘法運算
除 / 除法運算
模 % 整除取余 整型
單目 增1(前綴) ++ 先加1,後使用 整型、字元型、指針型變數或數組元素、實型 自右向左
增1(後綴) ++ 先使用,後加1
減1(前綴) – – 先減1,後使用
減1(後綴) – – 先使用,後減1
在C語言中,參加運算的對象個數稱為運算符的「目」。單目運算符是指參加運算的對象只有一個,如+10,–67,x++。雙目運算符是指參加運算的對象有兩個,如2+3,7%3。
相同運算符連續出現時,有的運算符是從左至右進行運算,有的運算符是從右至左進行運算,C語言中,將運算符的這種特性稱為結合性。
加法(+)、減法(–)、乘法(*)與數學中的算術運算相同。例如:3.5+4.7結果是8.2;3.5 – 4.7結果是–0.8;3.5*4.7結果是16.45。
除法運算(/)與數學中的除法不完全相同,它與參加運算的對象的數據類型相關。當參加運算的兩個對象均為整型數據時,其運算結果為數學運算結果的整數部分。如7/4結果為1,而不是1.75。若參加運算的兩個對象有一個是實型或兩個都是實型,那麼運算結果為實際運算的值,如7/5.0的運算結果為1.4。
模運算的運算對象必須為整型,結果是相除後的余數,如7%5結果為2。
增1減1運算符都是單目運算符,用來對整型、實型、字元型、指針型變數或數組元素等變數進行加1或減1運算,運算的結果仍是原類型。
1.3.2 常用數學函數
C語言系統提供了400多個標准函數(稱為庫函數),設計程序時可以直接使用它們。庫函數主要包括數學函數、字元處理函數、類型轉換函數、文件管理函數及內存管理函數等幾類。下面介紹常用的數學函數,其他類型的函數將在後面章節中陸續介紹。
1.函數名:abs
原型:int abs(int i);
功能:求整數的絕對值。
例如,設x=abs(5),y=abs(–5),z=abs(0),則x=5,y=5,z=0。
2.函數名:labs
原型:long labs(long n);
功能:求長整型數的絕對值。
例如,設x=labs(40000L),y=labs(–5),z=labs(0),則x=40000,y=5,z=0。
3.函數名:fabs
原型:double fabs(double x);
功能:求實數的絕對值。
例如,設x=fabs(5.3),y=fabs(–5.3),z=fabs(0),則x=5.3,y=5.3,z=0。
4.函數名:floor
原型:double floor(double x);
功能:求不大於x的最大整數,它相當於數學函數[x]。
例如,設x=floor(–5.1),y=floor(5.9),z=floor(5),則x= –6,y=5,z=5。
5.函數名:ceil
原型:double ceil(double x);
功能:求不小於x的最小整數。
例如,設x=ceil(–5.9),y=ceil(5.1),z=ceil(5),則x = –5,y=6,z=5
6.函數名:sqrt
原型:double sqrt(double x);
功能:求x的平方根。
例如,設x=sqrt(4),y=sqrt(16),則x=1.414214,y=4.0
7.函數名:log10
原型:double log10(double x);
功能:求x的常用對數。
8.函數名:log
原型:double log(double x);
功能:求x的自然對數。
9.函數名:exp
原型:double exp(double x);
功能:求歐拉常數e的x次方。
10.函數名:pow10
原型:double pow10(int p);
功能:求10的p次方。
例如,設x=pow10(3),y=pow10(0),則x=1000,y=1
11.函數名:pow
原型:double pow(double x, double y);
功能:求x的y次方。
例如,設x=pow(3,2),y=pow(–3,2),則x=9,y=9
12.函數名:sin
原型:double sin(double x);
功能:正弦函數。
13.函數名:cos
原型:double cos(double x);
功能:餘弦函數。
14.函數名:tan
原型:double tan(double x);
功能:正切函數。
1.3.3 算術表達式
由算術運算符和運算對象連接形成的式子稱為算術表達式。
算術運算符的優先順序從高到低規定如下:
++ – –
* / %
+ –
位於同一行的運算符的優先順序相同。
1.4 數據類型轉換規則
對數據進行運算時,要求參與運算的對象的數據類型相同(運算得到的運算結果的類型與運算對象也相同)。因此,在運算過程中常常需要對變數或常量的數據類型進行轉換,轉換的方法有兩種,一種是系統自動轉換(又稱為隱式轉換);另一種是在程序中強制轉換(又稱為顯式轉換)。
1.4.1 自動轉換規則
在不同類型數據的混合運算中,由系統自動實現轉換。轉換規則如下:
(1)若參與運算的數據的類型不同,則應先轉換成同一類型,然後進行運算。
(2)將低類型數據轉換成高類型數據後進行運算。如int型和long型運算時,先把int型轉換成long型後再進行運算。
類型的高低是根據其所佔空間的位元組數按從小到大的順序排列的,順序如下:
char,int,long,float,double。
(3)所有的浮點運算都是按照雙精度進行運算的,即使僅含float型單精度量運算的表達式,也要先轉換成double型,再作運算。
(4)char型和short型參與運算時,必須先轉換成int型。
例如,設有:
float PI=3.14;
int s,r=7;
s=r*r*PI;
因為PI為單精度型,s和r為整型,在執行s=r*r*PI語句時,r和PI都轉換成double型後再進行計算,運算結果也為double型,右邊的運算結果為153.86,但由於s為整型,故應將賦值號右邊的運算結果轉換成整型(捨去小數部分),因此s的值為153。
1.4.2 強制類型轉換
強制類型轉換是通過類型轉換運算來實現的,其語法格式如下:
(類型說明符)(表達式)
其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。例如: (float) a 把a轉換為實型;(int)(x+y) 把x+y的結果轉換為整型;而(int)x+y 則只將x轉換為整型。
在使用強制類型轉換時應注意以下問題:
(1)類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則只是把x轉換成int型之後再與y相加。
(2)對於被轉換的單個變數而言,無論是強制轉換還是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行臨時性轉換,而不會改變變數定義時所聲明的類型。
例如,設有:
float f = –5.75;
int x;
x= (int)f;
將f強制轉換成整數–5,因此x = –5,而f本身的類型並未改變且其值仍為–5.75。
1.5 程序結構
1.5.1 主函數結構
每一個C源程序都是一系列函數的集合。其中,必須有且只能有一個主函數,其函數名為main,其結構如下:
void main(void)
{
…
}
其中,void main(void) 稱為函數說明部分(又稱函數頭),而
{
…
}
稱為函數體,函數體中的每個語句行末尾都必須用分號結束。
1.5.2 文件包含命令
C語言系統提供了400多個庫函數,並將這些函數根據其功能分成了若干組,每組都有一個組名。如數學類函數組的組名為math。在C語言系統所安裝文件夾的下級文件夾中有一個與其相對應的文件math.h,這些擴展名為.h的文件稱為頭文件。
include稱為文件包含命令,當用戶在程序中使用到系統的標准庫函數中的函數時,需要在程序中(一般在程序的首部)增加一條預處理語句如#include<stdio.h>,以便告知系統需要使用某個頭文件中的函數。
1.5.3 C語言程序基本結構
一個完整的C語言源程序由如下5個部分構成:
(1)預處理命令;
(2)全局變數說明;
(3)函數原型說明;
(4)主函數;
(5)其他子函數。
一個簡單的C語言源程序只需要(1)和(4)兩個部分,其中「預處理命令」一般是一系列文件包含命令,即include命令。
關於程序結構,應當注意以下幾方面的問題:
(1)可由若干個函數構成,其中必須有且只有一個以main命名的主函數,可以沒有其他函數。每個函數完成一定的功能,函數與函數之間可以通過參數傳遞信息。main()函數可以位於原程序文件中任何位置,但程序的執行總是從main函數開始,main函數執行完畢時程序執行結束。
(2)子函數的結構與主函數相同,即分為函數說明部分和函數體兩個部分。
(3)函數中的每個語句最後要有一個分號,作為語句結束標記。但某些特殊的語句行末尾不需要分號,有時還不能有分號。
(4)「/*」和「*/」括住的任意一段字元稱為「程序注釋」,用來對程序作說明,可以插入到程序的任何地方,且可以跨行使用。程序注釋不影響程序運行結果。
(5)函數的書寫格式很靈活,在一行中可以書寫多個語句(每個語句末尾都要有分號),一個語句也可以寫在多行中。在程序的任何地方都可以插入空格或回車符。
(6)主函數可以調用任何子函數但不能調用它自己,任何子函數之間也可以相互調用,但是子函數不能調用主函數。
下面是一個簡單的C語言源程序:
【例1-1】 求圓的面積。
#include <stdio.h>
void main(void)
{
float r,s,p=3.14;
r=10.5;
s=r*r*p;
printf("圓的面積是:%f ",s);
}
下面是一個較完整的C語言源程序:
【例1-2】 較完整的C語言程序示例。
#include<stdio.h>
#include<conio.h>
int y,z;
void abc(int x);
void main(void)
{
int x;
clrscr();
x=10;
y=20;
z=30;
printf("ok1: x=%d y=%d z=%d \n",x,y,z);
abc(x);
printf("ok2: x=%d y=%d z=%d \n",x,y,z);
getch();
}
void abc(int x)
{
int y;
printf("ok3: x=%d y=%d z=%d \n",x,y,z);
x=100;
y=200;
z=300;
printf("ok4: x=%d y=%d z=%d \n",x,y,z);
}
4. 計算機c語言基礎知識
計算機c語言的特性
C語言是世界上最流行、使用最廣泛的高級程序設計語言之一。在操作系統和系統使用程序以及需要對硬體進行操作的場合,用C語言明顯優於其它高級語言,許多大型應用軟體都是用C語言編寫的。C語言的主要特性有以下幾種:
1、C是高級語言:它把高級語言的基本結構和語句與低級語言的實用性結合起來。
2、C是結構式語言:結構式語言的顯著特點是代碼及數據的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。
3、C語言功能齊全:具有各種各樣的數據類型,並引入了指針概念,可使程序效率更高。而且計算功能、邏輯判斷功能也比較強大,可以實現決策目的的游戲。
4、C語言適用范圍大:適合於多種操作系統,如Windows、DOS、UNIX等等;也適用於多種機型。
5、C語言應用指針:可以直接進行靠近硬體的操作,但是C的指針操作不做保護,也給它帶來了很多不安全的因素。C++在這方面做了改進,在保留了指針操作的同時又增強了安全性。
6、C語言創始人D.M.Ritchie6、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,xcode等。
計算機c語言的語法結構
1.順序結構
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結構。
2.選擇結構
選擇結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。選擇結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的選擇語句。
3.循環結構
循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段演算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即goto循環、while循環、do while循環和for循環。
4.模塊化程序結構
C語言的模塊化程序結構用函數來實現,即將復雜的C程序分為若干模塊,每個模塊都編寫成一個C函數,然後通過主函數調用函數及函數調用函數來實現一大型問題的C程序編寫,因此常說:C程序=主函數+子函數。因此,對函數的定義、調用、值的返回等中要尤其注重理解和應用,並通過上機調試加以鞏固。
計算機c語言基礎知識
【知識點1】C程序
C語言程序結構有三種: 順序結構 , 循環結構(三個循環結構), 選擇結構(if 和 switch)
【知識點2】main函數
每個C語言程序中main 函數是有且只有一個。讀程序都要從main()入口, 然後從最上面順序往下讀(碰到循環做循環,碰到選擇做選擇)。
【知識點3】存儲形式
計算機的數據在電腦中是以二進制的形式保存。最低的存儲單元是bit(位),位是由為 0 或者1構成。 byte 是指位元組, 一個位元組 = 八個位。數據存放的位置就是它的地址。
【知識點4】注釋
是對程序的說明,可出現在程序中任意合適的地方,注釋從「/*」開始到最近一個「*/」結束,其間任何內容都不會被計算機執行,注釋不可以嵌套。
【知識點5】書寫格式
每條語句的後面必須有一個分號,分號是語句的一部分。一行內可寫多條語句,一個語句可寫在多行上。
【知識點6】標識符
合法的用戶標識符考查:
合法的要求是由字母,數字,下劃線組成。有其它元素就錯了。
並且第一個必須為字母或則是下劃線。第一個為數字就錯了。
C語言標識符分如下3類
(1)關鍵字。它們在程序中有固定的含義,不能另作他用。如int、for、switch等。
(2)預定義標識符。預先定義並具有特定含義的標識符。如define、include等。
(3)用戶標識符。用戶根據需要定義的標識符,符合命名規則且不與關鍵字相同。
關鍵字不可以作為用戶標識符號。main define scanf printf 都不是關鍵字。迷惑你的地方If 是可以做為用戶標識符。因為If 中的'第一個字母大寫了,所以不是關鍵字。
【知識點7】實型數據
實型數據的合法形式:小數形式和指數形式。掌握判定指數形式合法性。
2.333e-1 就是合法的,且數據是2.333×10-1。
考試口訣:e 前e 後必有數,e 後必為整數。
【知識點8】字元
字元數據的合法形式::
'1' 是字元佔一個位元組,"1"是字元串占兩個位元組(含有一個結束符號)。
'0' 的ASCII 數值表示為48,'a' 的ASCII 數值是97,'A'的ASCII 數值是65。
字元型和整數是近親:
char a = 65 ;
printf(「%c」, a); 得到的輸出結果:a
printf(「%d」, a); 得到的輸出結果:65
一般考試表示單個字元錯誤的形式:'65' "1"
字元是可以進行算術運算的,記住: '0'-0=48
大寫字母和小寫字母轉換的方法: 'A'+32='a' 相互之間一般是相差32。
【知識點9】整型數據
整型一般是兩個位元組, 字元型是一個位元組,雙精度一般是4 個位元組:
考試時候一般會說,在16 位編譯系統,或者是32 位系統。碰到這種情況,不要去管,
一樣做題。掌握整型一般是兩個位元組, 字元型是一個位元組,雙精度一般是4 個位元組就可以了。
【知識點10】轉義字元
轉義字元的考查:
在程序中 int a = 0x6d,是把一個十六進制的數給變數a 注意這里的0x 必須存在。
在程序中 int a = 06d, 是一個八進制的形式。
在轉義字元中, 』x6d』 才是合法的,0 不能寫,並且x 是小寫。
『141』 是合法的, 0 是不能寫的。
『108』是非法的,因為不可以出現8。
【知識點11】算術運算
算術運算符一共有+、—、*、/、%這五個。%符號兩邊要求是整數。不是整數就錯了。
三種取整丟小數的情況:不是四捨五入是舍掉小數部分。
1、int a =1.6;
2、(int)a;
3、1/2; 3/2;
【知識點12】強制類型轉換
將一個運算對象轉換成指定類型,格式為(類型名)表達式
一定是 (int)a 不是 int(a),注意類型上一定有括弧的。
注意(int)(a+b) 和(int)a+b 的區別。前是把a+b 轉型,後是把a 轉型再加b。
【知識點13】賦值
是表達式就一定有數值。
賦值表達式:表達式數值是最左邊的數值,a=b=5;該表達式為5,常量不可以賦值。
復合賦值運算符:注意:a*=m+2 是 a=a*(m+2)
自加、自減表達式:假設a=5,++a(表達式的值為6), a++(表達式的值為5);
j=a++;等價於j=a;a=a+1; 而j=++a;等價於a=a+1;j=a;。
考試口訣:++在前先加後用,++在後先用後加。
【知識點14】逗號運算
逗號表達式:優先順序別最低; 表達式的數值逗號最右邊的那個表達式的數值。
(2,3,4)的表達式的數值就是4。
【知識點15】數制轉換
一定要記住二進制 如何轉換成十進制。
八進制是沒有8 的,逢8 進1,018 的數值是非法的。
【知識點16】位運算
會有一到二題考試題目。
C語言提供6種位運算符:按位求反~,按位左移<<,按位右移>>,按位與&,按位異或|,按位或^。
總的處理方法:幾乎所有的位運算的題目都要按這個流程來處理(先把十進制變成二進制再變成十進制)。
異或運算的規則:0異或1得到1,0異或0得到0,1異或1得到0。可記為「相同為0,不同為1」。
在沒有捨去數據的時候,<<左移一位表示乘以2;>>右移一位表示除以2。
5. 求助,關於c語言的。
C語言基礎(01-引言及預備知識): C語言是一門功能強大的編程語言,它也是C++語言的基礎。C語言屬於中級語言。這里所說的中級是相對於計算機的底層硬體而言的。匯編語言是最低級的語言,它可以直接與硬體打交道。高級語言有Pascal、Basic、Fortran等等。高級語言的一條語句對應低級語言的很多條語句,任何高級語言編寫的程序都要經過編譯程序的編譯、連接才能成為可以運行的程序。編譯連接的過程也就是把高級語言翻譯成機器語言(二進制機器碼)的過程,而匯編語言是基本上與機器語言一 一對應的一種語言。這個翻譯過程是由編譯程序自動完成的。把C語言定為中級語言是有它的道理的,因為C語言既有匯編語言的存取底層硬體的能力,又具有高級語言的許多特點。熟練掌握了C語言,學習其它的各種編程語言應該是很輕松的了。
C語言的書寫格式:
1) 一個C語言編寫的源程序,必定有一個主程序(稱為main()函數,在C語言中子程序稱為「函數」(當然,不要理解成為數學裡面的「函數」)。但是決不能有一個以上的main函數(即只能有一個)。
2) 函數語句塊用『{』括弧開始, 以『}』反括弧結束。這樣的花括弧必須成對出現。
3) 表達式寫在小括弧裡面,以『(』括弧開始,以『)』反括弧結束。
4) 函數不能嵌套,即函數裡面不能再套函數。(每一個函數是完成一個特定功能的函數模塊)
C語言的組成:
C語言是由許多函數組成的。其中只有一個主函數(main()函數)。C程序執行時總是從main函數的『{』處開始,至main函數的反大括弧'}'處結束。當然還有其它一些規則,這將在以後的學習中去熟悉它。
C語言的書寫規則:
C語言在書寫時有它自身的特點:書寫格式比較自由,在一行里可以寫多條語句,一個語句也可以分寫在多行上。雖然如此,在書寫源程序時還是要注意哪些可以自由書寫,而哪些必須要按照書寫規則來書寫。
幾條規則寫在下面:
1) 一行內可以寫幾個語句,建議一行不超過兩條語句;
2) 一條語句可以寫在多行上;
3) C語句不需要寫行標號;
4) 每條語句及數據定義的後面要寫上分號以表示該語句結束;
5) C語言中注釋用 /* */來表示;
6) 建議書寫時採用縮進格式;
7) 花括弧、小括弧都是成對出現的。
一個最簡單的C程序的編寫:
/* 程序代碼*/ /* 注釋部分*/
main() /*main是主函數名。緊跟在main後面的括弧是放參數的。
括弧裡面為空說明main函數不需要參數*/
{ /*正寫的大花括弧表示main函數從這里開始*/
} /*反寫的大花括弧表示main函數到這里結束*/
說明:由於是一個演示程序,在函數體內並沒有任何可以執行的語句,也就是這個程序什麼事也不做。
這個程序就是這么簡單: 寫在一行上就是 main() { }
你在TC的編輯環境下把這段代碼輸入進去,按F9鍵編譯連接,按CTRL_F5運行,一定很正常。但是什麼結果也不會有,因為在main函數裡面什麼代碼也沒有。
下面再舉一個可以向屏幕上輸出一條信息的例子:
main()
{
printf("這就是C語言編寫的程序!"); /*這一條語句的作用是向屏幕輸出一條信息
」這就是C語言編寫的程序!"*/
}
在這個程序中,main函數只有一條語句:printf("這就是C語言編寫的程序!");這個語句的作用是向屏幕輸出一個字元串。有關這個語句的知識以後再講。現在要注意的是一個C語言程序的框架是怎樣組成的。
C語言程序的幾種文件格式:
1、 源程序---在TC集成環境中輸入的程序文本稱為源程序。源程序是一種文本文件。它是我們看得見並認識的一種文件。其擴展名為.C。例如你把文件保存為TEST,那麼在磁碟上應看得到TEST.C這個文件。這樣的文件可以用記事本打開。
2、二進制文件---寫完了源程序後接著要做的是編譯這個文件。在TC集成環境里是按ALT_F9鍵,編譯後生成了一個二進制文件,這個二進制文件名為TEST.OBJ,也就是擴展名為OBJ的目標文件。
3、運行文件---最後一步是make(或Link),在TC集成環境里是按F9鍵Make之後生成了一個可以在DOS下運行的文件,其擴展名為EXE。如TEST.EXE。這個EXE文件是由第2步中的OBJ文件生成的。OBJ文件雖然是二進制文件,而電腦又是可以運行二進制文件的,為什麼還要把OBJ文件Link為EXE文件才能運行?這里的知識就比較多了,這里不能多講。但是要明白一點,在DOS下僅僅有了一個二進制文件還不能運行,因為操作系統要把這些二進制文件加以規劃,把相應的數據、程序代碼放到應該放的內存位置,這樣的經過嚴密規劃和組織好了的二進制文件才能運行。而這些只有在生成的EXE文件裡面才做完了這些工作。
---------------------------------------
作業題:
1、下列程序中格式錯在( )處。
A. main() B. int a,b,z;
C. a=2:b=3; D. z=a+b;
分析:A,B,D 沒有錯誤。 C 中在a=2後面應該是分號而不應是":"號
答: C
2、C語言允許將一條語句寫在兩行上,下列語句不正確的是
A. int a,
B;
B. int a
,b;
C. int
a,b
D. int a,b
;
分析:C語言規定可以在語句中的任何一個分隔符或空格處換行。上面4個選項中D.有問題因為在D.中第一行的最後沒有分隔符,而第二行只有一個分號,可以看做一個語句。所以D中的錯誤為:第一行是一個獨立的語句,但是少了一個分號。
答: D
3. C語言的一行寫不下時,可以
A. 用逗號換行 B. 用分號換行
C. 在任意一空格處換行 D. 用回車符換行
分析:C語言可以在任何一個分隔符或空格處換行,所以此題的正確答案是 C
答: C
4. 下列程序段中,哪一個是錯誤的注釋方法?
A. #in/*包含*/clude<stdio.h>
void main()
{
}
B. #include<stdio.h>
void main/* */(/*主函數*/)
{
}
C. #include<stdio.h>
void main()
{ int x/*初始化*/=10;
/*列印*/printf("%d",x);
}
D. #include<stdio.h>
void main()
{
int x=10;
printf("%d",x);
/*列印x的值*」*=10*/
}
分析:根據C語言的規定:注釋不能插在標識符的中間,在其它有分隔符的地方都可以插入注釋,上面四個程序段中只有A是將注釋插入在標識符的中間了。所以A是錯誤的。
答: A
5. C語言程序是由( )組成的?
答:C程序是由函數組成的。
6. C程序運行時,運行的是什麼文件?
數據的類型:
在程序中要處理大量的數據,把這些數據按其特點分為幾種基本的數據類型,它們分別是:
1 、整型 2 、字元型 3 、實型
還有其它的一些擴展的數據類型,但是開始學習時要先熟悉這三種基本數據類型。
在 C 語言中這幾種數據類型用符號表示如下:
整型數據類型 int /* 一般指可以運算的數,如自然數就是整型數據類型 */
字元數據類型 char /* 一般指文字,如英文字母;字元類型的 '1''2''3''4' 等 */
實型 float /* 也稱作浮點型,記住 float 類型的數都是有小數位的,如 425.23*/
常量和變數:
常量――程序運行過程中其值不變的量,如一個整數 134, 一個字元 『a'
變數――程序運行過程中其值可以變化的量,如 int a; char b; 那麼 a 和 b 都是變數。
符號常量 ――用一個「符號」來表示的一個「常量」稱為「符號常量」。
符號常量有什麼好處 ――在給符號常量命名的時候,按習慣取的名字與實際上的含義相符,可以「見名識意」;另外在需要修改常量的值的時候,只需要修改符號常量的定義部分即可,非常方便。
符號常量的定義方法 ―― #define 符號 常量
例: #define NUMBER 30 /* 定義了一個符號常量,在這里是用符號 NUMBER 表示整數 30 ,以後在程序里就可以
用符號 NUMBER 代替整數 30 進行運算 */
main()
{
int a=20; /* 把常量 20 賦給整型變數 a*/
int c; /* 定義了整型變數 c*/
c=NUMBER+a; /* 變數 c 的值此時為 50 ,符號常量 NUMBER 參與了運算 */
}
變數的定義方法 ――在變數的名字前面加上一個變數的數據類型,以說明已定義的變數可以用來存放什麼樣類型的數據。
例: int a; /* 定義了一個整型變數,以後這個變數只能存放整型類型的數 */
char b; /* 定義了一個字元型變數,以後這個變數只能存放符字元型數據 */
怎樣把常量值賦給已定義了的變數 ――用一個 = 號賦值。
例: int a; /* 定義一個整型孌量 a*/
char b; /* 定義了一個字元型變數 b*/
a=20; /* 用 = 號完成賦值,賦值後變數 a 的值此時為 20*/
b='d' /* 把常量字元 'd' 賦給變數 b ,此時變數 b 的值是字元 'd'*/
變數賦值時一種更靈活的方法 ――可以在一行上給多個相同數據類型的變數賦值,變數之間用逗號分隔。
例: int a,b,c,d; /* 定義了 4 個整型變數 */
char e,f,g; /* 定義了 3 個字元型變數 */
深入理解變數 ―― 1 ) 1 個變數必須有一個變數名。 2 )變數必須有其指定的數據類型
3 )變數一旦被定義,它就在內存中佔有一個位置,這個位置稱做該 變數的地址 。
4 )每一個變數都有其對應的值。
l 一定要牢記變數的這 4 個特性。
變數使用時的注意事項 ―― 1 )變數在使用之前一定要先定義,使用一個沒有定義的變數是錯誤的。
2 )變數必須在一個函數的開始部分定義。(這個限制在 C++ 中不存在)
例題:寫一個 2 個整數相加的程序。
/* 解題思路:求 2 個整數相加,必定要先定義 2 個變數來存放這 2 個數,另外還需要 1 個變數用來存放
相加的和,所以共需要定義 3 個整型變數 */
/* 注意每次在寫 C 程序的時候一定要注意書寫格式 */
main()
{
int a,b,c;
a=20,b=30; /* 在這里指定變數的值,因為還沒有講輸入輸出函數,只能這樣了。 */
c=a+b;
}
想一想,這樣簡單的一個題,需要知道的知識面卻不少。 用到了上面所講的哪些知識?
C語言中的庫函數――我們編寫C語言程序時要寫許多代碼,這些代碼是用基本程序語句如運算符、表達式、幾種語句結構來組成。這些語句組成了多個不同的函數,由多個函數組成一個完整的程序。實際上如果程序中的語句都要由自己來寫的話,那麼工作量是很大的了。並且有一些完成基本任務的函數如輸入輸出函數是經常需要使用的。這樣的一些常用的完成基本任務的函數有許多已經由提供編譯程序的公司為我們寫好了。這些已經寫好的函數放在TC或者BC編譯器的文件中。所謂「庫函數」,就是存放「函數」的「倉庫」。在TC中,函數的「倉庫」在哪裡呢?在TC的.\LIB目錄中。編寫程序的時候,如果我們需要使用某個庫函數,就要在這個程序開頭指明這庫函數存放在哪裡,以便讓編譯程序到這個地方去找。這個指明庫函數路徑的語句稱為「包含」語句,寫做#include。完整的寫法是:
#include <stdio.h>
#include 是包含的意思,<stdio.h> 是指明要使用的庫函數在 stdio.h這個文件裡面有說明。尖括弧<>是必須要寫的。而實際上,編譯程序在stdio.h之個文件里根據庫函數名可以在.\LIB目錄下的LIB文件里找到相關的代碼,寫進程序裡面去。使用不同的庫函數時要用不同的包含,關於怎樣使用#include,可以查看庫函數的幫助。
有了眾多的庫函數,給編寫程序帶來了很大的方便。就象做房子要用磚和瓦一樣。如果沒有磚和瓦,做房子自己要挖土燒磚,可想而知,那樣做房子的難度有多大。寫程序也是這樣,有了庫函數,在需要完成某些任務時,找到相應的庫函數調用一下就可以了,不需要自己一點一點的寫代碼。在學習編程的同時要多多了解一些庫函數的特點及用法,對編寫程序是有很大的好處的。
(在Windows下編寫程序,需要了解的「庫函數」就更多了,可以說不了解庫函數就不會編程。VC中用的是MFC,Win32中用的是API,它們都是函數庫)
先了解二個庫函數――1、scanf函數 /*格式化控制台輸入函數*/
函數原型:int scanf(control_string....); /*看上去很復雜。沒關系,以後自然會明白的*/
使用例:
void main()
{
int a,b,c; /*定義了三個整型變數*/
scanf("%d%d",&a,&b); /*從鍵盤輸入二個整數到孌量a和b中*/
c=a+b; /*把變數a與b相加的和送給變數c*/
}
下面仔細講一下scanf函數各參數的用法:
可以看到在小括弧里有二個%d,後面有二個變數a和b。二個%d的寫法為"%d%d",注意凡是這樣的符號都要寫在雙引號裡面,而變數則寫在雙引號的外面並用逗號分隔。這個%d我們稱為格式化說明符,第一個%d用於說明第一個變數a,第二個%d用於說明第二個變數b,這樣的順序是一一對應的。%d格式符說明了後面輸入的變數值是整型數。
另外注意的是二個%d是靠在一起的 %d%d,凡是這樣的寫法,在輸入數時,對於二個數之間的分隔是用「空隔鍵」來實現的。如輸入30和50這二個數形式為 30 50 如果二個%d寫成%d,%d中間有一個逗號,那麼在輸入數據時也一定要在輸入的數之間加上逗號,如 30,50。
再來看一下變數的寫法,可以看到在每一個變數名的前面都有一個&號,這個&號是取變數地址的意思,那麼&a寫在一起就是變數a的地址,&b寫在一起就是變數b的地址。
上面的scanf函數的作用就是把從鍵盤上輸入的二個整數分別送到變數a和變數b的地址裡面去。這個&號是非常重要,不要寫漏了。
scanf函數的格式說明符(格式說明符說明了下一步將讀的是什麼類型的數據)
格式碼 含義
%c 讀一單字元
%d 讀一整數
%i 讀一個浮點數
%e 讀一個浮點數
%f 讀一個浮點數
%g 讀一個浮點數
%o 讀一個八進制數
%s 讀一字元串
%x 讀一十六進制數
%p 讀一指針
%n 讀一個指針收一個等於到目前為止輸入的字元數止的整數
%u 讀一無符號整數
%[] 掃描一字元集
例:從鍵盤輸入二個字元,一個大寫,一個小寫,然後把這個小寫字元轉換成大寫,大寫字元轉換成小寫。
#include<stdio.h> /*因為在程序里用到了庫函數scanf,所以要使用包含#include<stdio.h>*/
void main()
{
char ch,chh; /*定義了二個字元型變數*/
scanf("%c%c",&ch,&chh); /*從鍵盤輸入二個字元,一個大寫,另一個小寫*/
ch=ch+32; /*大寫轉成小寫*/
chh=chh-32; /*小寫轉成大寫*/
}
2、printf函數 /*格式化輸出函數*/
函數原型:int printf(const char *control_string....);
說明:printf把變數的值或常量字元串輸出到控制台(一般是顯示屏)
使用例:
#include<stdio.h>
void main()
{
int a,b,c;
scanf("%d%d",&a,&b);
c=a+b;
printf("輸出二個整數相加的和"); /*輸出字元串常量,這里沒有用到格式化說明符*/
printf("%d",c); /*把變數c的值用整型格式輸出,這里%d是整型格式說明符*/
}
如果有幾個變數的值要輸出,用這樣的形式:printf("%d %d %d",a,b,c);
從這個printf輸出的格式中看出,每一個格式符對應一個變數,其對應順序也是一一對應的,第一個%d對應第一個變數a,以此類推。注意在printf函數中,變數前面就不要加&符號了。
注意printf函數中幾個%d之間留了一些空格,這里的用法與scanf相比有一點不同。在printf函數中格式符之間留多少空隔,輸出的時候每一個輸出的值之間就有多少空隔。如printf("%d %d %d",a,b,c);輸出則為:20 30 50 (這里的數是假設的)。如果寫為printf("%d,%d,%d",a,b,c);則輸出形式為 20,30,50
printf函數的格式符:
格式碼 格式
%c 單個字元
%d 十進制數
%i 十進制數
%e 科學法表示
%E 科學法表示
%f 十進制浮點數
%g 用%e或%f中較短的的一個(如果是%e,用小寫e)
%G 用%e或%f中較短的的一個(如果是%E,用大寫E)
%o 以八進制形式輸出
%s 字元串
%u 無符號十進制數
%x 十六進制數(小寫)
%X 十六進制數(大寫)
%p 顯示一個指針
%n 相關變數是整型指針,它所指處存放至今要寫入字元的總數
%% 列印一個%號
printf函數使用例:
1)char ss="abcdefghijk"; printf("%s",ss); /*輸出一個字元串,屏幕上顯示"abcdefghijk"*/
2)unsigned int a=65535; printf("%u",a); /*以十六進制形式輸出一個無符號數,顯示為ffff*/
3)int a=123,b=456,c=687; printf("%d\t%d\n%d",a,b,c);
輸出形式為:
123 456 /*'\t'是一個製表符,所以要移動一個製表位這么多空格數*/
687 /*'\n'是換行轉義符,在前面字元常量里講過。所以要換一行再輸出687*/
C語言基礎(05-運算符和表達式):運算符(也叫操作符)--運算符是一個表示特定的數學或邏輯操作的符號。如'+'號,表示了一個相加運算;'&&'號表示了一個邏輯『與』的運算。由運算符把需要進行運算的各個量(常量或變數)連接起來組成一個表達式。
下面要講的是標準的運算符,在C++中還有另外的一些運算符。運算符 進行的運算 所屬類別 備注
[ ] 間隔符 標點符號
( ) 間隔符 標點符號
· 直接分量選擇 雙目操作符
-> 間接分量選擇 雙目操作符
++ 前增量、後增量 單目操作符
-- 前減量、後減量 單目操作符
+ 加 雙目操作符、單目操作符
- 減 雙目操作符、單目操作符
* 1)乘 2)間接引用 雙目操作符、單目操作符
/ 除 雙目操作符
% 求余 雙目操作符
& 1)位『與』2)取地址 雙目操作符、單目操作符
! 邏輯『非』 單目操作符
&& 邏輯『與』 雙目操作符
|| 邏輯『或』 雙目操作符
<< 左移位 雙目操作符
>> 右移位 雙目操作符
< 小於 雙目操作符
> 大於 雙目操作符
== 等於 雙目操作符
!= 不等於 雙目操作符
^ 位『異或』 雙目操作符
+= 和賦值 雙目操作符
-= 差賦值 雙目操作符
*= 乘賦值 雙目操作符
/= 商賦值 雙目操作符
<<= 左移賦值 雙目操作符
>>= 右移賦值 雙目操作符
&= 按位『與』賦值 雙目操作符
^= 按位異或賦值 雙目操作符
|= 按位或賦值 雙目操作符
%= 模賦值 雙目操作符
= 賦值 雙目操作符
?: 按條件取值 雙目操作符
, 間隔符 標點符號
# 預處理符號 標點符號
## 預處理符號 標點符號
sizeof 求位元組數
~ 按位求反
| 位『或』
: 間隔符
; 間隔符
... 間隔符
要把表中的運算符仔細的分類是不容易的,因為同一個運算符,在不同的地方其含義是不同的。如*運算符,當作為乘運算時是雙目操作符(所謂雙目操作符,即運算時需要二個操作數),如3*6,那麼3與6總共是二個操作數。當作為取值運算時就是單目操作符(所謂單目操作符是只需要一個操作數)如對一個數求反:!a,這里只有一個操作數a。
要記住運算符的二個特點,一個是運算符的操作對象,另一個就是運算符的優先順序別。其中運算符的優先順序別是最不容易搞清楚和最容易出錯的地方。
在講運算符之前講一下「表達式」的概念:所謂表達式,就是用運算符把各個操作數連接成符合C語法規則的進行運算的式子。這里說的「符合C語法的規則」也很重要。如 a+b+5就是一個用算術運算符連接起來的表達式。
1、算術運算符:+、-、*、/、%
1)+、-、*、/ 分別是相加、相減、相乘、相除
2)% 求二個數運算的模。所謂求模就是求二個數相除後的余數。例:25/3的余數是1,可以說25%3的模是1。要注意的是求模運算時二個操作數必須是整數。如果求25.3/3.1這樣是不能運算的。
下面寫一個例子:
#include<stdio.h> /*程序中要用到輸入輸出庫函數,所以包含了stdio.h*/
void main()
{
int a=10,b=20,c=30; /*定義了3個整型變數,並同時進行了初始化賦值*/
a=a*b+c; /*a*b+c組成了一個算術表達式,運算後的結果為230並把值*/
/*賦給變數a*/
printf("%d",a); /*以整型格式輸出變數a的值。這里輸出230*/
a=a%b; /*進行求模運算。因為沒有餘數,最後的模為0*/
printf("%d",a); /*輸出變數a的值。這里輸出0*/
}
下面是一個要考慮運算符優先順序的例子:
#include<stdio.h>
void main()
{
int a=10,b=20,c=30;
a=c-a*b; /*這里就要考慮運算符優先順序,*運算符的優先順序比-運算符*/
/*的高,所以先進行乘運算。這里最後結果為-170*/
}
由上面這個例子看到,在一個有多個運算符連接起來的表達式中需要考慮運算符的優先順序,這個例子很簡單。關於運算符優先順序的概念其實在小學生的算術運算中就有這樣的概念了,只不過這里的運算符多了一些,要考慮的情況也就復雜了。
如果這個式子改寫一下,寫成:a=(c-a)*b;在運算時就以括弧中的運算優先。
幾個簡化的運算表達式:
在C語言的程序中,經常看到這樣的運算,如:i++;或者k--;這是運算符號的簡化寫法。
1、加1運算的簡寫
當一個變數進行加1運算時,如a=a+1;這是變數自身加1,簡寫為a++;
2、減1運算的簡寫
當一個變數進行減1運算時,如a=a-1;這是變數自身減1,簡寫為a--;
3、加1個常量運算的簡寫
當一個變數與一個常量相加時,如a=a+5;這是變數自身加5,簡寫為a+=5;
4、減一個常量運算的簡寫
當一個變數與一個常量相減時,如a=a-5;這是變數自身減5,簡寫為a-=5;
5、乘一個常量運算的簡寫
當一個變數與一個常量相乘時,如a=a*5,這是變數自身乘5,簡寫為a*=5;
6、除一個常量運算的簡寫
當一個變數與一個常量相除時,如a=a/5;這是變數自身除5,簡寫為a/=5;
運算符的結合性(或稱作關聯性)
在一個復雜的表達式中,常常有許多運算符和變數,這時就要判斷優先順序和結合性這二個因素。
例:-5+7; 這樣的一個表達式用結合性來判斷,因為運算符'-'和'+'相對於運算的數來說是『左』結合的,所以就有'-5'和'+7'所以運算的結果為 2。
通過這個例子要知道什麼是「左結合性」和「右結合性」
左結合性--變數(或常量)與左邊的運算符結合
右結合性--變數(或常量)與右邊的運算符結合
運算符的優先順序和結合性表
優先順序 運算符(高 ------→低) 結合率 運算符類型
高 ( ) [ ] -> . 從左至右 雙目運算符
! ~ ++ -- (類型) sizeof + - * & 從右至左 單目運算符
* / % 從左至右 雙目運算符
+ - 從左至右 雙目運算符
<< >> 從左至右 雙目運算符
< <= > >= 從左至右 雙目運算符
== != 從左至右 雙目運算符
& 從左至右 雙目運算符
^ 從左至右 雙目運算符
| 從左至右 雙目運算符
&& 從左至右 雙目運算符
|| 從左至右 雙目運算符
?: 從右至左 三目運算符
低 = += -= *= /= %= &= ^= |= <<= >>= 從左至右 雙目運算符
高 -------------→ 低
從表中可以看出一個規律,凡是單目運算符都是「右結合」的,凡是雙目運算符都是「左結合」的。其中有一個?:運算符是三目運算符是右結合的,記住了這個規律,運算符的結合性也就掌握了。
如果代碼行中的運算符比較多,用括弧確定表達式的操作順序,避免使用默認的優先順序。
由於將表熟記是比較困難的,為了防止產生歧義並提高可讀性,應當用括弧確定表達式的操作順序。例如:
d = (high << 8) | low /*用括弧把需要先運算的括起來*/
if ((a | b) && (a & c)) /*用括弧把需要先運算的括起來*/
例:
下列程序輸出的結果是
#include<stdio.h>
void main()
{
int a=2;
a%=4-1;
printf("%d",a);
a+=a*=a-=a*=3;
printf("\n%d",a);
}
A. 2,0 B. 1,0
C. -1,12 D. 2,12
分析:由於%=運算符的優先順序別低於-運算,a%=4-1即是a%=3,等價於a=a%3即a=2%3=2,所以選項B和C是錯誤的。表達式a+=a*=a-=a*=3,計算時注意賦值類表達式的值和變數的值隨時被更新,計算表達式的值,開始時a=2,表達式賦值是從左至右進行的,表達a*=3使得a=6,此表達式的值也為6,於是表達式a-=a*=3相當於a-=6=6-6=0,a的值為0,後面的計算就不用做了,所以a的值最終為0。
答:A
下列語句中錯誤的是
A.x=sizeof int;
B.x=sizeof 3.14
C.printf("%d",a=a+1,b--,c+1);
D.printf("%d",++x,x++);
分析:此題的選項A的作用是測試int類型所佔內存的位元組數,因為類型符要用括弧括起來,這時缺少括弧是錯誤的。
選項B是正確的。
選項C從表面上看似乎復雜一些,但其中的a=a+1,b--,c+1是一個逗號表達式,C語言允許使用這種表達式所以D也是正確的。
答案:A
下面的語句中,符合C語言語法的賦值語句是
A.a=7+b+c=a+7; B.a=7+b++=a+7;
C.a=7+b,b++,a+7; D.a=7+b;c=a+7;
分析:一般情況下,表達式不能放在賦值號的左邊,所