【計算機二級C語言】卷019


選擇題

公共知識

【1】下列算法中均以比較作為基本運算, 則平均情況與最壞情況下的時間復雜度相同的是()。
〖A〗在順序存儲的線性表中尋找最大項
〖B〗在順序存儲的線性表中進行順序查找
〖C〗在順序存儲的有序表中進行對分查找
〖D〗在鏈式存儲的有序表中進行查找
在順序存儲的線性表中查找最大項時, 最壞情況下要比較所有元素直到最后一個最大值, 比較次數為n, 順序查找的平均情況時間復雜度為O(n)。
可見最壞情況與平均情況下的時間復雜度相同。
因此A選項正確。
故本題答案為A選項。
【2】在具有2n個結點的完全二叉樹中, 葉子結點個數為()。
〖A〗n
〖B〗n + 1
〖C〗n - 1
〖D〗n / 2
完全二叉樹是指除最后一層外, 每一層上的結點數均達到最大值, 在最后一層上只缺少右邊的若干結點。
根據完全二叉樹性質, 如果共2n個結點, 從根結點開始按層序用自然數1, 2, …, 2n給結點編號, 則編號為n的結點左子結點編號為2n, 因此葉子結點編號為n + 1, n + 2, …, 2n。
故葉子結點個數為n, 本題答案為A選項。
【3】下列敘述中正確的是()。
〖A〗在棧中, 棧頂指針的動態變化決定棧中元素的個數
〖B〗在循環隊列中, 隊尾指針的動態變化決定隊列的長度
〖C〗在循環鏈表中, 頭指針和鏈尾指針的動態變化決定鏈表的長度
〖D〗在線性鏈表中, 頭指針和鏈尾指針的動態變化決定鏈表的長度
在棧中, 棧底指針保持不變, 有元素入棧, 棧頂指名增加, 有元素出棧, 棧頂指針減少。
在循環隊列中, 隊頭指針和隊尾指針的動態變化決定隊列的長度。
在循環鏈表中, 前一個結點指向后一個結點, 而最后一個結點指向頭結點, 只有頭結點是固定的。
線性鏈表中, 由於前一個結點包含下一個結點的指針, 尾結點指針為空, 要插入或刪除元素, 只需要改變相應位置的結點指針即可, 頭指針和尾指針無法決定鏈表長度。
故本題答案為A選項。
【4】循環隊列的存儲空間為 Q(1 : 40), 初始狀態為 front = rear = 40。經過一系列正常的入隊與退隊操作后, front = rear = 15, 此后又退出一個元素, 則循環隊列中的元素個數為()。
〖A〗39, 或0且產生下溢錯誤
〖B〗14
〖C〗40
〖D〗15
循環隊列是隊列的一種順序存儲結構, 用隊尾指針rear指向隊列中的隊尾元素, 用排頭指針front指向排頭元素的前一個位置。
入隊運算時, 隊尾指針進1(即rear + 1), 然后在rear指針指向的位置插入新元素。
退隊運算時, 排頭指針進1(即front + 1), 然后刪除front指針指向的位置上的元素。
當front = rear = 15時可知隊列空或者隊列滿, 此后又退出一個元素, 如果之前隊列為空, 退出操作會產生錯誤, 隊列里有0個元素; 如果退出之前隊列已滿(40個元素), 執行退出后, 隊列里還有39個元素。
故本題答案為A選項。
【5】某系統結構圖如下圖所示

該系統結構圖的深度是()。
〖A〗4
〖B〗3
〖C〗2
〖D〗1
樹的根結點所在層次為1, 其他結點所在的層次等於它的父結點所在層次加1, 樹的最大層次就是樹的深度。
因此本系統結構圖的深度為4, 本題答案為A選項。
【6】軟件測試的目的是()。
〖A〗發現程序中的錯誤
〖B〗發現並改正程序中的錯誤
〖C〗設計和執行測試用例
〖D〗診斷程序中的錯誤
軟件測試是為了發現錯誤而執行程序的過程。
測試要以查找錯誤為中心, 而不是為了演示軟件的正確功能, 不是為了評估軟件或改正錯誤。
故本題答案為A選項。
【7】需求分析階段產生的主要文檔是()。
〖A〗需求規格說明書
〖B〗初步的用戶手冊
〖C〗確認測試計划
〖D〗數據流圖和數據字典
需求分析階段的工作可以概括為:需求獲取、需求分析、編寫需求規格說明書、需求評審四個方面。
軟件需求規格說明書是描述需求中的重要文檔, 是軟件需求分析的主要成果。
故本題答案為A選項。
【8】下列關於數據庫特點的說法中正確的是()。
〖A〗數據能共享且獨立性高
〖B〗數據能共享但數據冗余很高
〖C〗能保證數據完整性但降低了安全性
〖D〗數據獨立性高但不能實現共享
數據庫管理系統的特點:共享性高, 冗余度小; 具有高度的物理獨立性和邏輯獨立性; 整體結構化, 用數據模型描述; 由數據庫管理系統提供數據安全性、完整性、並發控制和恢復能力。
故本題答案為A選項。
【9】在關系數據庫設計中, 關系模式設計屬於()。
〖A〗邏輯設計
〖B〗概念設計
〖C〗物理設計
〖D〗需求分析
關系數據庫設計有需求分析設計、概念設計、邏輯設計、物理設計、編碼、測試、運行、進一步修改等幾個階段。
在需求分析設計階段形成需求說明書, 概念設計階段形成概念數據模型(作為進一步設計數據庫的依據), 邏輯設計階段形成邏輯數據模型(從ER圖向關系模式轉換、關系視圖設計、模式規范化), 物理設計階段形成數據庫內部模型(此時涉及具體軟件硬件環境)。
因此關系模式設計屬於邏輯設計。
故本題答案為A選項。
【10】定義學生、教師和課程的關系模式:S(S#, Sn, Sd, SA)(屬性分別為學號、姓名、所在系、年齡); C(C#, Cn, P#)(屬性分別為課程號、課程名、先修課); SC(S#, C#, G)(屬性分別為學號、課程號和成績)。則該關系為()。
〖A〗第三范式
〖B〗第一范式
〖C〗第二范式
〖D〗BCNF范式
范式是符合某一種級別的關系模式的集合。
關系數據庫中的關系必須滿足一定的要求, 滿足不同程度要求的為不同范式。
目前關系數據庫有六種范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyce - Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)。
滿足最低要求的范式是第一范式(1NF)。
在第一范式的基礎上進一步滿足更多要求的稱為第二范式(2NF), 其余范式以次類推。
一般說來, 數據庫只需滿足第三范式(3NF)就行了。

第一范式:主屬性(主鍵)不為空且不重復, 字段不可再分(存在非主屬性對主屬性的部分依賴)。

第二范式:如果關系模式是第一范式, 每個非主屬性都沒有對主鍵的部分依賴。

第三范式:如果關系模式是第二范式, 沒有非主屬性對主鍵的傳遞依賴和部分依賴。

BCNF范式:所有屬性都不傳遞依賴於關系的任何候選鍵。

題目中關系模式沒有非主屬性對主鍵的傳遞依賴和部分依賴, 滿足第三范式, 但不滿足BCNF范式。
故本題答案為A選項。

專業知識

【11】以下敘述中正確的是
〖A〗程序必須包含所有三種基本結構才能成為一種算法
〖B〗我們所寫的每條C語句, 經過編譯最終都將轉換成二進制的機器指令
〖C〗如果算法非常復雜, 則需要使用三種基本結構之外的語句結構, 才能准確表達
〖D〗只有簡單算法才能在有限的操作步驟之后結束
C語言程序可以不包含三種基本結構, 也可以包含其中的一種或多種, 所以A錯誤。
三種基本結構可以表示任何復雜的算法, 所以C錯誤。
正確的算法, 不管是簡單算法還是復雜算法都可以在有限的操作步驟之后結束, 這是算法的有窮性, 所以D錯誤。
【12】以下敘述中正確的是
〖A〗在算法設計時, 可以把復雜任務分解成一些簡單的子任務
〖B〗在C語言程序設計中, 所有函數必須保存在一個源文件中
〖C〗只要包含了三種基本結構的算法就是結構化程序
〖D〗結構化程序必須包含所有的三種基本結構, 缺一不可
C語言的程序中, 函數不一定都放在同一個源文件中, 可以分別放在不同源文件中, 通過#include命令來引用, 所以B錯誤。
結構化程序可以包含三種基本結構中的一種或幾種, 所以C、D錯誤。
【13】以下敘述中正確的是
〖A〗只能在函數體內定義變量, 其他地方不允許定義變量
〖B〗常量的類型不能從字面形式上區分, 需要根據類型名來決定
〖C〗預定義的標識符是C語言關鍵字的一種, 不能另作它用
〖D〗整型常量和實型常量都是數值型常量
變量可以定義在函數體外也可以定義在函數體內, 所以A錯誤。
常量的類型可以從字面形式上區分, 比如1為整型常量, 1.0為實型常量, a為字符型常量, 所以B錯誤。
預定義的標識符不是C語言的關鍵字, 所以C錯誤。
【14】以下敘述中正確的是
〖A〗在C程序中的八進制和十六進制, 可以是浮點數
〖B〗整型變量可以分為int型、short型、long型和unsigned型四種
〖C〗八進制數的開頭要使用英文字母o, 否則不能與十進制區分開
〖D〗英文大寫字母X和英文小寫字母x都可以作為二進制數字的開頭字符
C程序中的實型常量只有十進制一種數制, 所以A錯誤。
八進制數以0打頭, 所以C錯誤。
C語言中整數只有十進制、八進制、十六進制三種, 沒有二進制數制, 所以D錯誤。
【15】以下敘述中正確的是
〖A〗在scanf函數中的格式控制字符串是為了輸入數據用的, 不會輸出到屏幕上
〖B〗在使用scanf函數輸入整數或實數時, 輸入數據之間只能用空格來分隔
〖C〗在printf函數中, 各個輸出項只能是變量
〖D〗使用printf函數無法輸出百分號%
scanf函數中的格式控制字符串是為了輸入數據用的, 無論其中有什么字符, 也不會輸出到屏幕上, 所以A正確。
scanf()的格式控制串可以使用其他非空白字符, 如逗號, 但在輸入時必須輸入這些字符, 以保證匹配就可以, 所以B錯誤。
Printf函數可以輸出常量也可以輸出變量, 所以C錯誤。
Prinf函數可以用"\%"來輸出百分號%, 所以D錯誤。
【16】以下敘述中正確的是
〖A〗在scanf函數的格式串中, 必須有與輸入項一一對應的格式轉換說明符
〖B〗只能在printf函數中指定輸入數據的寬度, 而不能在scanf函數中指定輸入數據占的寬度
〖C〗scanf函數中的字符串, 是提示程序員的, 輸入數據時不必管它
〖D〗復合語句也被稱為語句塊, 它至少要包含兩條語句
在printf和scanf函數中都可以指定數據的寬度, 所以B錯誤。
scanf()的格式控制串可以使用其他非空白字符, 如逗號, 但在輸入時必須輸入這些字符, 以保證匹配, 所以C錯誤。
復合語句可以由任意多條語句構成, 可以使一條也可以沒有, 所以D錯誤。
【17】以下敘述中正確的是
〖A〗邏輯"或"(即運算符||)的運算級別比算術運算要高
〖B〗C語言的關系表達式:0 < x < 10完全等價於:(0 < x) && (x < 10)
〖C〗邏輯"非"(即運算符 !)的運算級別是最低的
〖D〗由&&構成的邏輯表達式與由||構成的邏輯表達式都有"短路"現象
B選項中, (x > 0) && (x < 10)的值是1或0, 條件是x > 0 並且x < 10。
但是 0 < x < 10這種寫法的結果任何時候都是1; C選項中, 邏輯"非"(即運算符 !)的運算級別是最高的; A選項中, 算術運算符優先級較高, 關系和邏輯運算符優先級較低。
因此D選項正確。
【18】以下敘述中正確的是
〖A〗if語句只能嵌套一層
〖B〗if子句和else子句中可以是任意的合法的C語句
〖C〗不能在else子句中再嵌套if語句
〖D〗改變if - else 語句的縮進格式, 會改變程序的執行流程
A選項中, if語句的嵌套沒有規定層數; C選項中, 可以在else子句中再嵌套if語句; D選項中, 改變if - else 語句的縮進格式, 不會改變程序的執行流程, 需要注意if和else的配對問題。
因此B選項正確。
【19】以下敘述中正確的是
〖A〗只要適當地修改代碼, 就可以將do - while與while相互轉換
〖B〗對於"for(表達式1;表達式2;表達式3) 循環體"首先要計算表達式2的值, 以便決定是否開始循環
〖C〗對於"for(表達式1;表達式2;表達式3) 循環體", 只在個別情況下才能轉換成while語句
〖D〗如果根據算法需要使用無限循環(即通常所稱的"死循環"), 則只能使用while語句
B選項中, for語句中需要先求解先求解表達式1; C選項中, for語句使用最為靈活, 它完全可以取代 while 語句; D選項中, 對於死循環, 也可以使用for語句。
因此A選項正確。
【20】以下敘述中正確的是
〖A〗只能在循環體內和switch語句體內使用break語句
〖B〗當break出現在循環體中的switch語句體內時, 其作用是跳出該switch語句體, 並中止循環體的執行
〖C〗continue語句的作用是:在執行完本次循環體中剩余語句后, 中止循環
〖D〗在while語句和do - while語句中無法使用continue語句
break語句通常用在循環語句和開關語句中。
當break用於開關語句switch中時, 可使程序跳出switch而執行switch以后的語句; 當break語句用於do - while、for、while循環語句中時, 可使程序終止循環而執行循環后面的語句, 即滿足條件時便跳出循環。
continue語句的作用是跳過循環體中剩余的語句而強行執行下一次循環。
B、C和D三個選項中均有錯誤。
因此A選項正確。
【21】以下敘述中正確的是
〖A〗'\0'表示字符0
〖B〗"a"表示一個字符常量
〖C〗表達式:'a' > 'b'的結果是"假"
〖D〗'\"'是非法的
A選項中, '\0'表示結束; B選項中, 字符常量是用單引號括起來的一個字符; D選項中, '\"'是雙引號符。
因此C選項正確。
【22】以下敘述中正確的是
〖A〗字符變量在定義時不能賦初值
〖B〗字符常量可以參與任何整數運算
〖C〗同一英文字母的大寫和小寫形式代表的是同一個字符常量
〖D〗轉義字符用@符號開頭
A選項中, 字符變量在定義時可以賦初值; C選項中, 同一英文字母的大寫和小寫形式代表的是不同的字符常量; D選項中, 轉義字符以反斜線"\"開頭的。
因此B選項正確。
【23】以下敘述中正確的是
〖A〗函數名允許用數字開頭
〖B〗函數調用時, 不必區分函數名稱的大小寫
〖C〗調用函數時, 函數名必須與被調用的函數名完全一致
〖D〗在函數體中只能出現一次return 語句
B選項中, 函數調用時, 函數名稱是需要區分大小寫的; A選項中, 函數名不允許以數字開頭; D選項中, 在函數中允許有多個return 語句, 但每次調用只能有一個return 語句被執行。
因此C選項正確。
【24】以下敘述中正確的是
〖A〗如果p是指針變量, 則&p是不合法的表達式
〖B〗如果p是指針變量, 則*p表示變量p的地址值
〖C〗在對指針進行加、減算術運算時, 數字1表示1個存儲單元的長度
〖D〗如果p是指針變量, 則*p + 1和*(p + 1)的效果是一樣的
B選項中, 如果p是指針變量, 則*p表示變量p所指向的地址的值; A選項中, 如果p是指針變量, 則&p表示變量p的地址; D選項中, 如果p是指針變量, *p + 1表示將p所指的值加上1, 而*(p + 1)表示的是先將指針右移一位再取所指向變量的值。
因此C選項正確。
【25】以下敘述中正確的是
〖A〗基類型不同的指針變量可以相互混用
〖B〗函數的類型不能是指針類型
〖C〗函數的形參類型不能是指針類型
〖D〗設有指針變量為 double * p, 則 p + 1 將指針p移動8個字節
B選項中, 所謂函數類型是指函數返回值的類型。
在C語言中允許一個函數的返回值是一個指針(即地址), 這種返回指針值的函數稱為指針型函數; C選項中, 函數的參數不僅可以是整型、實型、字符型等數據, 還可以是指針類型; A選項中, 雖然不同基類型的指針變量占用字節數是相同的, 但是不能混用。
因此D選項正確。
【26】如果定義:float a[10], x;
則以下敘述中正確的是
〖A〗語句 a = &x; 是非法的
〖B〗表達式 a + 1 是非法的
〖C〗三個表達式 a[1]、*(a + 1)、*&a[1]表示的意思完全不同
〖D〗表達式*&a[1]是非法的, 應該寫成*(&(a[1]))
B選項中, 表達式a + 1不是非法的; C選項中, *(a + 1)即指a[1]; D選項中, *&a[1]不是非法的。
因此A選項正確。
【27】有以下程序
#include <stdio.h>
void main() {
    int a[] = { 2, 4, 6, 8 }, *p = a, i;
    for (i = 0; i < 4; i++)
        a[i] = *p++;
    printf("%d\n", a[2]);
}
程序的輸出結果是
〖A〗2
〖B〗8
〖C〗4
〖D〗6
本題通過語句"*p=a"將一維數組a的首地址的值賦值給指針變量p, 即*p的值為2。
執行for循環, a[i] = *p++, 將*p的值賦給a[i]后, 指針p再進行++操作, 即指針p向后移動一個元素。
當i = 0時a[0] = *p, 然后p++;, 移動后p指針指向元素a[1]; 當i = 1時, 即a[1] = *p; p++; 此時p指針指向元素a[2]; 以此類推, 可知for循環中語句"a[i]=*p++"並沒有改變數組a的值, 因此a[2]的值是6。
故本題答案為D選項。
【28】以下敘述中正確的是
〖A〗語句 int a[4][3] = { { 1, 2 }, { 4, 5 } }; 是錯誤的初始化形式
〖B〗語句 int a[4][3] = { 1, 2, 4, 5 }; 是錯誤的初始化形式
〖C〗語句 int a[][3] = { 1, 2, 4, 5 }; 是錯誤的初始化形式
〖D〗在邏輯上, 可以把二維數組看成是一個具有行和列的表格或矩陣
二維數組在初始化時, 可以省略第1維, 但是不可以省略第2維。
可以為部分數組元素初始化。
B選項、C選項和A選項內的初始化都沒有錯誤。
因此D選項正確。
【29】以下敘述中正確的是
〖A〗字符串常量"Hello"會被隱含處理成一個無名字符型數組, 它有5個元素
〖B〗不能用字符串常量對字符數組名進行整體賦值操作
〖C〗char str[7] = "string!"; 在語法上是合法的, 運行也是安全的
〖D〗char *str; str = "Hello"; 與char str[]; str = "Hello"; 效果是一樣的
字符串中的字符依次存儲在內存中一塊連續的區域內, 並且把空字符' \0'自動附加到字符串的尾部作為字符串的結束標志。
故字符個數為n的字符串在內存中應占(n + 1)個字節。
選項A中有6個元素, 其中包含結尾字符, C選項中字符串常量包含8個字符, 所以不能賦值在str[7]中, D選項后者賦值錯誤。
【30】以下敘述中正確的是
〖A〗在語句char str[] = "string!"; 中, 數組str的大小等於字符串的長度
〖B〗語句 char str[10] = "string!"; 和 char str[10] = { "string!" }; 並不等價
〖C〗對於一維字符數組, 不能使用字符串常量來賦初值
〖D〗對於字符串常量 "string!", 系統已自動在最后加入了'\0'字符, 表示串結尾
字符串中的字符依次存儲在內存中一塊連續的區域內, 並且把空字符' \0'自動附加到字符串的尾部作為字符串的結束標志。
故字符個數為n的字符串在內存中應占(n + 1)個字節。
B選項中兩者等價, C選項中可以使用字符串常量來給一維字符數組賦值, 就像B選項中一樣, A選項中數組長度比字符串長度小一個字節, 字符串中包含隱含的結尾符。
【31】設有定義
char str[] = "Hello";
則語句
printf("%d %d", sizeof(str), strlen(str));
的輸出結果是
〖A〗5 5
〖B〗6 6
〖C〗6 5
〖D〗5 6
本題考查sizeof和strlen對字符串的處理不同之處, sizeof求出字符串的字符個數, 包括結尾符。
Strlen求出字符串的實際字符, 不包括結尾符。
所以答案為6, 5, C選項正確。
【32】在32位編譯器上, 設有定義
char *str1 = "Hello", str2[] = "Hello";,
則以下語句
printf("%d %d", sizeof(str1), sizeof(str2));
的輸出結果是
〖A〗5 6
〖B〗5 5
〖C〗6 6
〖D〗4 6
本題主要考查了指向字符串的指針和字符數組, str1為一個字符指針, 所以sizeof為4, str2為字符數組, 其中包含6個字符, 所以答案為4 6。
【33】以下敘述中正確的是
〖A〗任何情況下都不能用函數名作為實參
〖B〗函數既可以直接調用自己, 也可以間接調用自己
〖C〗函數的遞歸調用不需要額外開銷, 所以效率很高
〖D〗簡單遞歸不需要明確的結束遞歸的條件
在某些情況下, 函數名可以作為實參傳遞, 所以A選項錯誤。
函數遞歸調用使用棧區來遞歸, 需要額外開銷, 並且效率不高, C選項錯誤。
遞歸調用需要明確指出遞歸結束條件, 否則就陷入死循環了。
【34】以下敘述中正確的是
〖A〗函數的形式參數不屬於局部變量
〖B〗對於變量而言, "定義"和"說明"這兩個詞實際上是同一個意思
〖C〗在復合語句中不能定義變量
〖D〗全局變量的存儲類別可以是靜態類
聲明變量不分配空間, 定義變量要分配空間, 所以B選項錯誤。
符合語句中可以定義變量, 所以C選項錯誤。
函數的形參屬於局部變量, 所以A選項錯誤。
【35】以下敘述中正確的是
〖A〗在一個程序中, 允許使用任意數量的#include命令行
〖B〗在包含文件中, 不得再包含其他文件
〖C〗#include命令行不能出現在程序文件的中間
〖D〗雖然包含文件被修改了, 包含該文件的源程序也可以不重新進行編譯和連接
本題考查預處理中文件包含的概念, 包含文件中可以包含其他文件, B選項錯誤, #include可以出現在程序文件的中間, C選項錯誤, 包含文件被修改了, 包含該文件的源程序必須重新進行編譯和連接。
【36】以下敘述中正確的是
〖A〗函數的返回值不能是結構體類型
〖B〗在調用函數時, 可以將結構體變量作為實參傳給函數
〖C〗函數的返回值不能是結構體指針類型
〖D〗結構體數組不能作為參數傳給函數
本題考查結構體變量作為函數參數, 函數返回可以是結構體類型, 也可以是結構體類型的指針, 結構體數組可以作為參數傳給函數。
【37】以下敘述中正確的是
〖A〗結構體數組名不能作為實參傳給函數
〖B〗結構體變量的地址不能作為實參傳給函數
〖C〗結構體中可以含有指向本結構體的指針成員
〖D〗即使是同類型的結構體變量, 也不能進行整體賦值
本題考查結構體變量作為函數參數, 結構體變量的地址可以作為參數傳給函數, 結構體數組名就是一個地址, 可以傳給函數, 如果是同類型的結構體變量, 可以整體賦值。
【38】設有如下的說明和定義
struct {
    int a;
    char *s;
} x, *p = &x;
x.a = 4;
x.s = "hello";
則以下敘述中正確的是
〖A〗(p++)->a與p++->a都是合語法的表達式, 但二者不等價
〖B〗語句++p->a; 的效果是使p增1
〖C〗語句++p->a; 的效果是使成員a增1
〖D〗語句*p->s++; 等價於(*p)->s++;
本題考查結構體變量的引用, ++p->a的效果是使成員a增1, p++->a不合法, *p->s++為字符e, 與(*p)->s++不等價。
【39】下面關於位運算符的敘述, 正確的是
〖A〗||表示"按位或"的運算
〖B〗#表示"按位異或"的運算
〖C〗&表示"按位與"的運算
〖D〗~表示"按位異或"的運算
本題考查位運算。
^為按位異或, |為按位或, ~表示按位取反。
所以C選項正確。
【40】下面關於"EOF"的敘述, 正確的是
〖A〗EOF的值等於0
〖B〗EOF是在庫函數文件中定義的符號常量
〖C〗文本文件和二進制文件都可以用EOF作為文件結束標志
〖D〗對於文本文件, fgetc函數讀入最后一個字符時, 返回值是EOF
在C語言中, 或更精確地說成C標准函數庫中表示文件結束符(end of file)。
在while循環中以EOF作為文件結束標志, 這種以EOF作為文件結束標志的文件, 必須是文本文件。
在文本文件中, 數據都是以字符的ASCII代碼值的形式存放。
我們知道, ASCII代碼值的范圍是0 ~ 255, 不可能出現-1, 因此可以用EOF作為文件結束標志。

編程題

【41】使用VC++2010打開考生文件夾下blank1中的解決方案。此解決方案的項目中包含一個源程序文件blank1.c。在此程序中, 函數fun的功能是:在3×4的矩陣中找出在行上最大、在列上最小的那個元素, 若沒有符合條件的元素則輸出相應信息。
例如, 有下列矩陣:

程序執行結果為:find : a[2][2] = 9
請在程序的下畫線處填入正確的內容並把下畫線刪除, 使程序得出正確的結果。
注意:部分源程序在文件blank1.c中。
不得增行或刪行, 也不得更改程序的結構 !
(1) j
(2) 0
(3) i++
本題是在矩陣中找出在行上最大、在列上最小的那個元素。
填空1:找出行上最大的數, 並將該數的列數j保存在c中, 所以應填j。
填空2:使用while循環語句和控制變量find, 如果該數不是列中的最小數, 那么把find置0, 所以應填0。
填空3 : i是while的控制變量, 所以每做一次循環, 該數值要加1, 所以應填i++。
【42】使用VC++2010打開考生文件夾下modi1中的解決方案。此解決方案的項目中包含一個源程序文件modi1.c。在此程序中, 函數fun的功能是:根據整形參m的值, 計算如下公式的值。

例如, 若m中的值為5, 則應輸出0.536389。
請改正程序中的錯誤, 使它能得出正確的結果。
注意:部分源程序在文件modi1.c中。
不要改動main函數, 不得增行或刪行, 也不得更改程序的結構 !
(1) for (i = 2; i <= m; i++)
(2) y -= 1.0 / (i * i);
(1) 使用for循環計算公式, 必須計算到m, 所以應改為for(i = 2; i <= m; i++)。
(2) 在除法運算中, 如果除數和被除數都是整數, 那么所除結果也是整數, 因此應改為y -= 1.0 / (i * i)。
【43】使用VC++2010打開考生文件夾下prog1中的解決方案。此解決方案的項目中包含一個源程序文件prog1.c。在此程序中, m個人的成績存放在score數組中, 請編寫函數fun, 它的功能是:將低於平均分的人數作為函數值返回, 將低於平均分的分數放在below所指的數組中。
例如, 當score數組中的數據為10、20、30、40、50、60、70、80、90時, 函數返回的人數應該是4, below中的數據應為10、20、30、40。
注意:部分源程序在文件prog1.c中。
請勿改動主函數main和其他函數中的任何內容, 僅在函數fun的花括號中填入你編寫的若干語句。
int fun(int score[], int m, int below[]) {
    int i, j = 0;
    float av = 0.0;
    for (i = 0; i < m; i++)
        av = av + score[i] / m;
    /*求平均值*/
    for (i = 0; i < m; i++)
        if (score[i] < av)
            /*如果分數低於平均分, 則將此分數放入below數組中*/
            below[j++] = score[i];
    return j;
    /*返回低於平均分的人數*/
}
要計算低於平均分的人數, 首先應該求出平均分, 然后通過for循環語句和if條件語句找出低於平均分的分數。
該題第1個循環的作用是求出平均分av, 第2個循環的作用是找出低於平均分的成績記錄並存入below數組中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM