選擇題
公共知識
【1】下列敘述中錯誤的是()。
算法的時間復雜度是指執行算法所需要的計算工作量。
為了能夠比較客觀地反映出一個算法的效率, 在度量一個算法的工作量時, 不僅應該與所使用的計算機、程序設計語言以及程序編制者無關, 而且還應該與算法實現過程中的許多細節無關。
為此, 可以用算法在執行過程中所需基本運算的執行次數來度量算法的工作量。
算法所執行的基本運算次數還與問題的規模有關; 對應一個固定的規模, 算法所執行的基本運算次數還可能與特定的輸入有關。
故本題答案為A選項。
為了能夠比較客觀地反映出一個算法的效率, 在度量一個算法的工作量時, 不僅應該與所使用的計算機、程序設計語言以及程序編制者無關, 而且還應該與算法實現過程中的許多細節無關。
為此, 可以用算法在執行過程中所需基本運算的執行次數來度量算法的工作量。
算法所執行的基本運算次數還與問題的規模有關; 對應一個固定的規模, 算法所執行的基本運算次數還可能與特定的輸入有關。
故本題答案為A選項。
【2】在長度為n的順序表中查找一個元素, 假設需要查找的元素一定在表中, 並且元素出現在表中每個位置上的可能性是相同的, 則在平均情況下需要比較的次數為()。
在順序表中查找, 最好情況下第一個元素就是要查找的元素, 則比較次數為1; 在最壞情況下, 最后一個元素才是要找的元素, 則比較次數為n。
兩種情況平均即(1 + n) / 2。
故本題答案為A選項。
兩種情況平均即(1 + n) / 2。
故本題答案為A選項。
【3】設非空二叉樹的所有子樹中, 其左子樹上的結點值均小於根結點值, 而右子樹上的結點值均不小於根結點值, 則稱該二叉樹為排序二叉樹。對排序二叉樹的遍歷結果為有序序列的是()。
前序遍歷:訪問根結點在訪問左子樹和訪問右子樹之前。
即先訪問根結點, 然后遍歷左子樹, 最后遍歷右子樹; 並且在遍歷左子樹和右子樹時, 仍然先訪問根結點, 然后遍歷左子樹, 最后遍歷右子樹。
即先訪問根結點, 然后遍歷左子樹, 最后遍歷右子樹; 並且在遍歷左子樹和右子樹時, 仍然先訪問根結點, 然后遍歷左子樹, 最后遍歷右子樹。
中序遍歷:訪問根結點在訪問左子樹和訪問右子樹兩者之間。
即先遍歷左子樹, 然后訪問根結點, 最后遍歷右子樹。
並且在遍歷左子樹和右子樹時, 仍然首先遍歷左子樹, 然后訪問根結點, 最后遍歷右子樹。
后序遍歷:訪問根結點在訪問左子樹和訪問右子樹之后。
即首先遍歷左子樹, 然后遍歷右子樹, 最后訪問根結點;
並且在遍歷左子樹和右子樹時, 仍然首先遍歷左子樹, 然后遍歷右子樹, 最后訪問根結點。
題目給出的二叉樹顯然是左結點小於根結點, 根結點小於等於右結點。
如果要使結果為有序序列, 那么遍歷過程應該是左結點-根結點-右結點, 或者右結點-根結點-左結點。
根據前面3種遍歷特點可知, 中序遍歷符合要求。
故本題答案為A選項
【4】循環隊列的存儲空間為 Q(1 : 50), 初始狀態為 front = rear = 50。經過一系列正常的入隊與退隊操作后, front = rear = 25, 此后又插入一個元素, 則循環隊列中的元素個數為()。
循環隊列是隊列的一種順序存儲結構, 用隊尾指針rear指向隊列中的隊尾元素, 用排頭指針front指向排頭元素的前一個位置。
入隊運算時, 隊尾指針進1(即rear + 1), 然后在rear指針指向的位置插入新元素。
當front = rear = 25時可知隊列空或者隊列滿, 此后又插入了一個元素, 如果之前隊列為空, 插入操作之后隊列里只有一個元素, 如果插入之前隊列已滿(50個元素), 執行插入則會產生溢出錯誤。
故本題答案為A選項。
入隊運算時, 隊尾指針進1(即rear + 1), 然后在rear指針指向的位置插入新元素。
當front = rear = 25時可知隊列空或者隊列滿, 此后又插入了一個元素, 如果之前隊列為空, 插入操作之后隊列里只有一個元素, 如果插入之前隊列已滿(50個元素), 執行插入則會產生溢出錯誤。
故本題答案為A選項。
【5】軟件生命周期是指()。
通常, 將軟件產品從提出、實現、使用維護到停止使用退役的過程稱為軟件生命周期。
也就是說, 軟件產品從考慮其概念開始, 到該軟件產品不能使用為止的整個時期都屬於軟件生命周期。
故本題答案為A選項。
也就是說, 軟件產品從考慮其概念開始, 到該軟件產品不能使用為止的整個時期都屬於軟件生命周期。
故本題答案為A選項。
【6】對象實現了數據和操作(方法)的結合, 其實現的機制是()。
在面向對象的程序中, 把數據和實現操作的代碼集中起來放在對象的內部, 稱之為封裝。
故本題答案為A選項。
故本題答案為A選項。
【7】下面不屬於白盒測試方法的是()。
白盒測試是把程序看成裝在一只透明的白盒子里, 測試者完全了解程序的結構和處理過程。
它根據程序的內部邏輯來設計測試用例, 檢查程序中的邏輯通路是否都按預定的要求正確地工作。
白盒測試的主要技術有邏輯覆蓋測試(語句覆蓋、路徑覆蓋、判斷覆蓋、條件覆蓋、判斷-條件覆蓋)、基本路徑測試等。
常用的黑盒測試方法和技術有:等價類划分法、邊界值分析法、錯誤推測法和因果圖等。
故本題答案為A選項。
它根據程序的內部邏輯來設計測試用例, 檢查程序中的邏輯通路是否都按預定的要求正確地工作。
白盒測試的主要技術有邏輯覆蓋測試(語句覆蓋、路徑覆蓋、判斷覆蓋、條件覆蓋、判斷-條件覆蓋)、基本路徑測試等。
常用的黑盒測試方法和技術有:等價類划分法、邊界值分析法、錯誤推測法和因果圖等。
故本題答案為A選項。
【8】數據庫管理系統的基本功能不包括()。
數據庫管理系統的功能包括數據模式定義、數據存取的物理構建、數據操縱、數據完整性安全性的定義與檢查、數據庫的並發控制與故障恢復、數據的服務。
故本題答案為A選項。
故本題答案為A選項。
【9】在關系數據庫設計中, 關系模式是用來記錄用戶數據的()。
在關系數據庫中用關系模型來表示數據結構, 表示為一個二維表, 一個關系就是一個二維表。
故本題答案為A選項。
故本題答案為A選項。
【10】定義學生、教師和課程的關系模式STC(SNO, SN, SA, TN, CN, G), 其中的六個屬性分別為學生的學號、姓名、年齡、教師的姓名、課程名以及學生的成績, 則該關系為()。
范式是符合某一種級別的關系模式的集合。
關系數據庫中的關系必須滿足一定的要求, 滿足不同程度要求的為不同范式。
目前關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce - Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
滿足最低要求的范式是第一范式(1NF)。
在第一范式的基礎上進一步滿足更多要求的稱為第二范式(2NF), 其余范式以次類推。
一般說來, 數據庫只需滿足第三范式(3NF)就行了。
關系數據庫中的關系必須滿足一定的要求, 滿足不同程度要求的為不同范式。
目前關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce - Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
滿足最低要求的范式是第一范式(1NF)。
在第一范式的基礎上進一步滿足更多要求的稱為第二范式(2NF), 其余范式以次類推。
一般說來, 數據庫只需滿足第三范式(3NF)就行了。
第一范式:主屬性(主鍵)不為空且不重復, 字段不可再分(存在非主屬性對主屬性的部分依賴)。
第二范式:如果關系模式是第一范式, 每個非主屬性都沒有對主鍵的部分依賴。
第三范式:如果關系模式是第二范式, 沒有非主屬性對主鍵的傳遞依賴和部分依賴。
BCNF范式:所有屬性都不傳遞依賴於關系的任何候選鍵。
題目中關系模式STC滿足第一范式, 但不滿足第二范式。
故本題答案為A選項。
專業知識
【11】以下敘述中正確的是
N - S流程圖是可以描述循環結構、選擇結構、順序結構等多種結構的程序, 所以A選項錯誤。
程序的算法可以用流程圖、偽代碼、N - S結構圖等方法表示, 所以B選項錯誤。
計算機只能處理二進制表示的目標程序, 不能直接執行由C語言編寫的源程序, 所以D選項錯誤。
程序的算法可以用流程圖、偽代碼、N - S結構圖等方法表示, 所以B選項錯誤。
計算機只能處理二進制表示的目標程序, 不能直接執行由C語言編寫的源程序, 所以D選項錯誤。
【12】以下敘述中正確的是
C語言的源程序中對縮進沒有要求, 所以A選項錯誤。
C語言中區分大小寫, main函數不能寫成Main或_main, 所以B選項錯誤。
一個C程序有且只有一個主函數, 所以C選項錯誤。
C語言中區分大小寫, main函數不能寫成Main或_main, 所以B選項錯誤。
一個C程序有且只有一個主函數, 所以C選項錯誤。
【13】C語言中double 類型數據占字節數為
在VC環境下, double型數據在內存中占8個字節, float型數據占4個字節, int型數據占2個字節, char型數據占1個字節。
所以選擇B。
所以選擇B。
【14】以下敘述中正確的是
C語言中的關鍵字即不能做變量名也不能做用戶函數名, 所以A錯誤。
標識符的命名規則, 即由下划線字母數字組成, 且必須以下划線和字母開始, 也不能和關鍵字一致。
不同C語言規定標識符的有效長度可能會不同, 但沒有限制最大長度, 所以B錯誤。
用戶定義的標識符只要滿足標識符命名規則沒有特殊要求, 不必一定"見名知義", 所以D錯誤。
標識符的命名規則, 即由下划線字母數字組成, 且必須以下划線和字母開始, 也不能和關鍵字一致。
不同C語言規定標識符的有效長度可能會不同, 但沒有限制最大長度, 所以B錯誤。
用戶定義的標識符只要滿足標識符命名規則沒有特殊要求, 不必一定"見名知義", 所以D錯誤。
【15】以下敘述中正確的是
scanf和printf是C語言提供的輸入輸出函數, 所以B錯誤。
由printf輸出的數據都隱含右對齊, 所以A錯誤。
Printf輸出數據所占的寬度由系統決定, 所以D錯誤。
由printf輸出的數據都隱含右對齊, 所以A錯誤。
Printf輸出數據所占的寬度由系統決定, 所以D錯誤。
【16】以下敘述中正確的是
復合語句可以包含多條語句, 在其中可以定義局部變量, 所以A錯誤。
花括號對 { } 不僅用來表示函數的開頭和結尾, 也可以用於表示復合語句, 所以B錯誤。
C語言中的語句必須以分號";"結束, 所以空語句表示為";", 不是空行, 所以C錯誤。
花括號對 { } 不僅用來表示函數的開頭和結尾, 也可以用於表示復合語句, 所以B錯誤。
C語言中的語句必須以分號";"結束, 所以空語句表示為";", 不是空行, 所以C錯誤。
【17】以下敘述中正確的是
A選項中, 在C語言中, 邏輯真值對應非0; C選項中, 表達式:x == y 是合法的; D選項中, 分支結構的流程走向是根據表達式的值, 並不僅僅是算數表達式的值。
因此B選項正確。
因此B選項正確。
【18】以下敘述中正確的是
B選項和A選項中, 對於邏輯表達式, 其中b的值不會因為表達式的結果發生改變; D選項中, 關系運算符的結果有"真"和"假"兩種。
因此C選項正確。
因此C選項正確。
【19】以下敘述中正確的是
break語句通常用在循環語句和開關語句中。
當break用於開關語句switch中時, 可使程序跳出switch而執行switch以后的語句; 當break語句用於do - while、for、while循環語句中時, 可使程序終止循環而執行循環后面的語句, 即滿足條件時便跳出循環。
continue語句的作用是跳過循環體中剩余的語句而強行執行下一次循環。
A、B和D三個選項中均有錯誤。
因此C選項正確。
當break用於開關語句switch中時, 可使程序跳出switch而執行switch以后的語句; 當break語句用於do - while、for、while循環語句中時, 可使程序終止循環而執行循環后面的語句, 即滿足條件時便跳出循環。
continue語句的作用是跳過循環體中剩余的語句而強行執行下一次循環。
A、B和D三個選項中均有錯誤。
因此C選項正確。
【20】以下敘述中正確的是
A選項中, 循環發生嵌套時, 沒有規定層數; C選項中, 循環嵌套時, 書寫代碼時沒有要求必須縮進; D選項中, for語句的圓括號中的表達式都可以省略掉。
因此B選項正確。
因此B選項正確。
【21】下面選項中合法的字符常量是
字符常量是用單引號括起來的一個字符。
A選項中, 使用雙引號, 所以是錯誤的; C選項中, 'abc'是字符串, 字符常量只能是單個字符, 不能是字符串; D選項中, 以反斜線"\"開頭的是轉義字符。
因此B選項正確。
A選項中, 使用雙引號, 所以是錯誤的; C選項中, 'abc'是字符串, 字符常量只能是單個字符, 不能是字符串; D選項中, 以反斜線"\"開頭的是轉義字符。
因此B選項正確。
【22】以下敘述中正確的是
B選項中, 字符常量在內存中占1個字節; A選項中, 轉義字符是以反斜線"\"開頭, 后跟一個或幾個字符; D選項中, 字符常量可以進行關系運算, 不能參與數值運算。
因此C選項正確。
因此C選項正確。
【23】以下敘述中正確的是
A選項中, "用戶自己定義的函數只能調用庫函數"描述是不正確的, 也可以調用自定義函數; C選項中, 對於不同函數的形式參數可以使用相同名稱的標識符; D選項中, 關於函數的定義不可以嵌套, 但函數的調用可以嵌套。
因此B選項正確。
因此B選項正確。
【24】以下敘述中正確的是
B選項描述不正確, 指針變量可以通過求地址運算符(&)來獲得地址值, 可以通過指針變量獲得地址值, 還可以通過標准函數獲得地址值; C選項中, p = NULL; 和p = 0; 或p = '\0'; 等價; D選項中, 語句p = NULL; 執行后, 指針p並不是指向地址為0的存儲單元, 而是具有一個確定的值-"空"。
因此A選項正確。
因此A選項正確。
【25】以下敘述中正確的是
A選項描述不正確, 指針變量的賦值只能賦予地址, 決不能賦予任何其它數據, 否則將引起錯誤; C選項中, p = NULL; 和p = 0; 是等價的; D選項中, 指向同一數組的兩指針變量進行關系運算可表示它們所值數組元素之間的關系。
因此B選項正確。
因此B選項正確。
【26】以下敘述中正確的是
A選項中, 一條語句只能定義一個數組是不准確的, 可以通過一條語句定義多個數組; C選項中, 數組說明符的一對方括號中可以是整型常量, 可以是整型常量表達式; D選項中, 在引用數組元素時, 下標表達式必須是整型的。
因此B選項正確。
因此B選項正確。
【27】以下敘述中正確的是
數組下標的下限是0。
因此D選項正確。
因此D選項正確。
【28】以下敘述中正確的是
B選項中, 如給全部元素賦值, 則在數組說明中, 可以不給出數組元素的個數; C選項中, char a[2] = { "A", "B" }; 不合法, 應為char a[2] = { 'A', 'B' }; ; D選項中, 用字符串方式賦值比用字符逐個賦值要多占1個字節, 在該選項中應為3個字節。
因此A選項正確。
因此A選項正確。
【29】下面選項中的程序段, 沒有編譯錯誤的是
本題考查字符數組的初始化以及指向字符串的指針, B選項不能直接將字符串賦值給數組名, C選項不能將兩個字符數組直接互相賦值, D選項中不能這樣定義char mark[], 必須指定長度或者直接初始化。
【30】以下敘述中正確的是
本題考查字符數組的相關操作, B選項中數組str1包含了5個元素, 其中有結尾符; A選項中str1的類型不是字符串類型; 字符數組的最后一個元素可以不是'\0'字符。
故答案為C項。
故答案為C項。
【31】以下敘述中正確的是
本題考查字符串數組的相關知識, 選項B、C、D都是合語法的。
【32】以下敘述中正確的是
本題考查字符串處理函數strlen、strcat、strcmp。
B選項中strlen返回的是字符串s實際占用內存大小加上結尾符, A選項中不能用關系運算符進行大小比較, 可以使用strcmp。
D選項當使用連接函數strcat時, 內存空間會減少一個字符位置。
B選項中strlen返回的是字符串s實際占用內存大小加上結尾符, A選項中不能用關系運算符進行大小比較, 可以使用strcmp。
D選項當使用連接函數strcat時, 內存空間會減少一個字符位置。
【33】以下敘述中正確的是
本題考查函數調用相關知識, B選項中函數可以接受函數名作為實參傳入, 引用函數名也是指針, C、A選項是錯誤的, 因為遞歸函數就能調用自己。
【34】以下敘述中正確的是
本題考查局部變量和全局變量作用域, B選項中局部變量也有作用域, C選項中, 函數內部定義的也可能是全局變量, A選項錯誤, 因為可以定義個靜態局部變量。
【35】下面選項中關於編譯預處理的敘述正確的是
本題考查預編譯的預編譯處理命令行, 預處理命令行不能以分號結尾, 所以A選項錯誤, 預處理命令行可以出現在程序的最后一行, 預處理命令行作用域是整個文件。
【36】以下敘述中正確的是
本題考查typedef的使用方法, typedef對已存在的類型使用一個新的名字, 選項A總新類型名應該在原類型名之后, C選項中后面要加分號, D選項中可以使用原類型名。
【37】以下敘述中正確的是
本題考查結構體類型, 結構體類型中的成分可以是結構體, 所以B選項錯誤, 定義結構體時編譯程序並不會給它分配內存空間, 所以C選項錯誤, 結構體中各個成分的類型可以是不一樣的, 所以A選項錯誤。
【38】以下敘述中正確的是
本題考查typedef的使用方法, typedef對已存在的類型使用一個新的名字, 結構體類型中的成分可以是數組和指針, 所以B選項錯誤, 結構體類型的變量可以在聲明結構體的時候一起定義, C選項錯誤, D選項中可以一起定義。
【39】下面選項中關於位運算的敘述正確的是
本題考查位運算。
按位取反只需要一個操作數, 所以B選項錯誤, 左移一位是原操作數的2倍, 其他情況不是, 比如左移兩位就是原操作數的4倍, 所以C選項錯誤, 右移運算時, 高位在某些情況下不是補0。
按位取反只需要一個操作數, 所以B選項錯誤, 左移一位是原操作數的2倍, 其他情況不是, 比如左移兩位就是原操作數的4倍, 所以C選項錯誤, 右移運算時, 高位在某些情況下不是補0。
【40】下面選項中關於"文件指針"概念的敘述正確的是
在C語言中用一個指針變量指向一個文件, 這個指針稱為文件指針。
通過文件指針就可對它所指的文件進行各種操作。
文件指針不是文件位置指針, 所以B、C選項錯誤, D選項中不可以寫入任意的字符。
通過文件指針就可對它所指的文件進行各種操作。
文件指針不是文件位置指針, 所以B、C選項錯誤, D選項中不可以寫入任意的字符。
編程題
【41】使用VC++2010打開考生文件夾下blank1中的解決方案。此解決方案的項目中包含一個源程序文件blank1.c。在此程序中, 函數fun的功能是:將a所指3×5矩陣中第k列的元素左移到第0列, 第k列以后的每列元素行依次左移, 原來左邊的各列依次繞到右邊。
例如, 有下列矩陣:
若k為2, 程序執行結果為
請在程序的下畫線處填入正確的內容並把下畫線刪除, 使程序得出正確的結果。
注意:部分源程序在文件blank1.c中。
不得增行或刪行, 也不得更改程序的結構 !
例如, 有下列矩陣:

若k為2, 程序執行結果為

請在程序的下畫線處填入正確的內容並把下畫線刪除, 使程序得出正確的結果。
注意:部分源程序在文件blank1.c中。
不得增行或刪行, 也不得更改程序的結構 !
(1) k
(2) N - 1
(3) temp
填空1:外循環p的值為數組移動的次數, 試題要求第k列左移, 則需要移動的次數為k, 所以應填k。
填空2:矩陣共N列, 所以應填N - 1。
填空3:臨時變量temp中存放的值為數組最左邊元素的值, 需要把temp放到數組的末尾, 即放到a[i][N - 1]中, 所以應填temp。
填空2:矩陣共N列, 所以應填N - 1。
填空3:臨時變量temp中存放的值為數組最左邊元素的值, 需要把temp放到數組的末尾, 即放到a[i][N - 1]中, 所以應填temp。
【42】使用VC++2010打開考生文件夾下modi1中的解決方案。此解決方案的項目中包含一個源程序文件modi1.c。在此程序中, 函數fun的功能是:根據形參m的值(2≤m≤9), 在m行m列的二維數組中存放如下所示規律的數據, 由main函數輸出。
請改正程序中的錯誤, 使它能得出正確的結果。
注意:部分源程序在文件modi1.c中。
不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !

請改正程序中的錯誤, 使它能得出正確的結果。
注意:部分源程序在文件modi1.c中。
不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
(1) void fun(int a[][M], int m)
(2) a[j][k] = (k + 1) * (j + 1);
(1) 在函數體fun中可知, a是一個字符串數組型變量, 設置實參時, 用**a表示是錯誤的, 所以應改為void fun(int a[][M], int m)。
(2) 根據輸出的結果可知, 應改為a[j][k] = (k + 1) * (j + 1); 。
(2) 根據輸出的結果可知, 應改為a[j][k] = (k + 1) * (j + 1); 。
【43】使用VC++2010打開考生文件夾下prog1中的解決方案。此解決方案的項目中包含一個源程序文件prog1.c。在此程序中, 函數fun的功能是:將a、b中的兩個正整數合並形成一個新的整數放在c中。合並的方式是:將a中的十位和個位數依次放在變量c的十位和千位上, b中的十位和個位數依次放在變量c的個位和百位上。
例如, 當a = 45, b = 12。調用該函數后, c = 5241。
注意:部分源程序在文件prog1.c中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入你編寫的若干語句。
例如, 當a = 45, b = 12。調用該函數后, c = 5241。
注意:部分源程序在文件prog1.c中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入你編寫的若干語句。
void fun(int a, int b, long *c) {
*c = (a % 10) * 1000 + (b % 10) * 100 + (a / 10) * 10 + (b / 10);
}
本題是給出兩個兩位數的正整數分別取出各位上的數字, 再按條件組成一個新數。
取a十位數字的方法a / 10, 取a個位數字的方法a % 10。
同理可取出整數b的個位數和十位數。
取a十位數字的方法a / 10, 取a個位數字的方法a % 10。
同理可取出整數b的個位數和十位數。