- 全國計算機等級考試《二級C語言程序設計》歷年真題與模擬試題詳解
- 圣才電子書
- 11字
- 2021-06-24 18:06:07
第一部分 歷年真題及詳解
2016年9月全國計算機等級考試《二級C語言程序設計》真題及詳解
(考試時間120分鐘 滿分100分)
一、選擇題(每題1分,共40分)
1下列鏈表中,其邏輯結構屬于非線性結構的是( )。
A.二叉鏈表
B.循環鏈表
C.雙向鏈表
D.帶鏈的棧
【答案】A
【解析】一個非空的數據結構為線性結構需要滿足兩個條件:①有且只有一個根結點;②每一個結點最多有一個前件,也最多有一個后件。不是線性結構的就是非線性結構。二叉鏈表是二叉樹的存儲結構,結點中存在含有兩個后繼結點的結點,是非線性結構。BCD三項均滿足線性結構的要求。答案選擇A選項。
2下列線性鏈表的敘述中,正確的是( )。
A.各數據結點的存儲空間可以不連續,但它們的存儲順序與邏輯順序必須一致
B.各數據結點的存儲順序與邏輯順序可以不一致,但它們的存儲空間必須連續
C.進行插入與刪除時,不需要移動表中的元素
D.以上三種說法都不對
【答案】C
【解析】AB兩項錯誤,在鏈式存儲結構中,存儲數據結構的存儲空間可以不連續,各數據結點的存儲順序與數據元素之間的邏輯關系可以不一致,而數據元素之間的邏輯關系是由指針域來確定的。線性鏈表在插入與刪除過程中不發生數據元素移動的現象,只需改變有關結點的指針,選項C正確。答案選擇C選項。
3某二叉樹共有7個結點,其中葉子結點只有1個,則該二叉樹的深度為( )。(假設根結點在第1層)
A.3
B.4
C.6
D.7
【答案】D
【解析】在任意一個二叉樹中,度為0的葉子結點總比度為2的結點多一個,所以本題中度為2的結點為1-1=0個,即二叉樹的每一個結點都只有一個孩子,7個結點共7層。答案選擇D選項。
4軟件按功能可以分為:應用軟件、系統軟件和支撐軟件(或工具軟件)。下面屬于系統軟件的是( )。
A.編輯軟件
B.操作系統
C.教務管理系統
D.瀏覽器
【答案】B
【解析】系統軟件是控制和協調計算機及外部設備,支持應用軟件開發和運行的軟件,操作系統是系統軟件;支撐軟件是支撐各種軟件的開發與維護的軟件,又稱為軟件開發環境,瀏覽器屬于支撐軟件;應用軟件是用戶可以使用的各種程序設計語言,以及用各種程序設計語言編制的應用程序的集合,編輯軟件、教務管理軟件屬于應用軟件。答案選擇B選項。
5在長度為n的有序線性表中進行二分查找,最壞情況下需要比較的次數是( )。
A.O(n)
B.O(n2)
C.O(log2n)
D.O(nlog2n)
【答案】C
【解析】二分查找的最壞情況是不斷的二分直至無法再分時,仍然沒有查找成功。對于有序的線性表,二分查找法只需比較log2n次。答案選擇C選項。
6有三個關系R、S和T如下:
R
S
T
則由關系R和S得到關系T的操作是( )。
A.自然連接
B.并
C.差
D.交
【答案】C
【解析】差運算,是在關系R中刪除S中存在的元組。R和S的差是由屬于R但不屬于S的元組組成的集合,運算符為“-”。記為T=R-S。根據本題關系R和關系S運算前后的變化,可以看出此處進行的是關系運算的差運算。答案選擇C選項。
7下面描述中,不屬于軟件危機表現的是( )。
A.軟件過程不規范
B.軟件開發生產率低
C.軟件質量難以控制
D.軟件成本不斷提高
【答案】A
【解析】軟件的危機表現包括:①軟件需求的增長得不到滿足,用戶對系統不滿意的情況經常發生;②軟件開發成本和進度無法控制;③軟件質量難以保證;④軟件不可維護或維護程度非常低;⑤軟件的成本不斷提高;⑥軟件開發的生產效率的提高趕不上硬件的發展、生產率等問題。答案選擇A選項。
8一個工作人員可以使用多臺計算機,而一臺計算機可被多個人使用,則實體工作人員與實體計算機之間的聯系是( )。
A.一對一
B.一對多
C.多對多
D.多對一
【答案】C
【解析】實體集之間通過聯系來建立連接關系,其中有一對一、一對多、多對多這幾種聯系。本題中,一個工作人員可以使用多臺計算機,而一臺計算機又可被多個人使用,所以是多對多的關系。答案選擇C選項。
9數據庫應用系統中的核心問題是( )。
A.數據庫設計
B.數據庫系統設計
C.數據庫維護
D.數據庫管理員培訓
【答案】A
【解析】數據庫應用系統是在數據庫管理系統(DBMS)支持下建立的計算機應用系統,其核心問題是數據庫設計。答案選擇A選項。
10軟件詳細設計產生的圖如下:
該圖是( )。
A.N-S圖
B.PAD圖
C.程序流程圖
D.E-R圖
【答案】C
【解析】N-S圖是由若干基本框圖構成的流程圖,其特點是沒有流程線;PAD圖即問題分析圖,它是一種由左往右展開的二維樹形結構;程序流程圖用于描述問題解決的過程和步驟,其中方框表示處理步驟,菱形框表示邏輯判斷,箭頭表示控制流向;E-R圖即實體-聯系圖,用來描述現實世界的概念模型,構成元素有實體、屬性和聯系,分別用矩形、橢圓形和菱形表示。所以答案選擇C選項。
11以下敘述正確的是( )。
A.C語言程序是由過程和函數組成的
B.C語言函數可以嵌套調用,例如:fun(fun(x))
C.C語言函數不可以單獨編譯
D.C語言中除了main函數,其他函數不可作為單獨文件形式存在
【答案】B
【解析】一個函數的返回值可以作為參數然后傳給另一個函數,因此函數是可以嵌套調用的。A項錯誤,C語言程序只有函數構成,沒有過程;C項錯誤,編譯系統的任務在于檢查語法錯誤,只要符合語法規則的C程序都可以通過編譯,就算是單獨的函數也可以;D項錯誤,在C語言中除main()函數以外的其他函數可以和main()函數在同一個C文件中,也可以單獨處于其他的C文件,只要在使用到這些函數的main()函數的C文件中用預編譯指令“#include”包含進來即可。答案選擇B選項。
12閱讀以下程序:
#include <stdio.h>
main()
{
int case;
float printF;
printf("請輸入2個數:");
scanf("%d %f",&case,&printF);
printf("%d %f\n",case,printF);
}
該程序編譯時產生錯誤,其出錯原因是( )。
A.定義語句出錯,case是關鍵字,不能用作用戶自定義標識符
B.定義語句出錯,printF不能用作用戶自定義標識符
C.定義語句無錯,scanf不能作為輸入函數使用
D.定義語句無錯,printf不能輸出case的值
【答案】A
【解析】在C語言中,關鍵字又稱保留字,它是系統預先定義的,具有特定含義的標識符,故不允許用戶重新定義。case為C語言中的關鍵字,因此用戶不能再定義標識符為case的變量。答案選擇A選項。
13以下選項中不能作為C語言合法常量的是( )。
A.'cd'
B.0.1e+6
C."a"
D.'\011'
【答案】A
【解析】常量包括整型常量、實型常量、字符常量和字符串常量等。單引號表示字符常量,但不能包含字符串。表達字符串常量時需用雙引號。A項,在C語言中,字符常量是用單引號括起來的一個字符,'cd'包含了2個字符;B項,0.1e+6是實型常量的指數形式,代表0.1×106;C項,"\a"是合法的字符串常量,\a是一個非打印的轉義字符表示響鈴;D項,'\011'是一個字符常量,\011是一個用3位八進制表示的轉義字符。答案選擇A選項。
14以下定義語句中正確的是( )。
A.int a=b=0;
B.char A=65+1,b='b';
C.float a=1,*b=&a,*c=&b;
D.double a=0.0;b=1.1;
【答案】B
【解析】A項錯誤,變量定義的時候不能用連續等號,等號在定義中是初始化的一種;C項錯誤,b是指針變量,*c=&b表示將一個二級指針賦值給一個一級指針,應該為*c=b或者**c=&b;D項,變量前為分號“;”表示前面的語句定義完畢,變量b的定義沒有指明變量類型。答案選擇B選項。
15有以下程序:
int i,n;
for(i=0; i<8; i++)
{
n=rand()%5;
switch(n)
{
case 1:
case 3:printf("%d\n",n);break;
case 2:
case 4:printf("%d\n",n);continue;
case 0:exit(0);
}
printf("%d\n",n);
}
以下關于程序執行情況的敘述中,正確的是( )。
A.for循環語句固定執行8次
B.當產生的隨機數n為4時結束循環操作
C.當產生的隨機數n為1和2時不做任何操作
D.當產生的隨機數n為0時結束程序運行
【答案】D
【解析】當產生隨機數為1或3時,會順序執行case1或case2下面的語句,進而輸出結果;當產生隨機數為2或4時,會繼續執行循環;當產生隨機數為0時,正常結束程序的運行。for循環語句隨著產生的隨機數的不同,執行的次數也不相同。答案選擇D選項。
16若有定義語句:int a=10;double b=3.14;,則表達式'A'+a+b值的類型是( )。
A.char
B.int
C.double
D.float
【答案】C
【解析】在多目運算符相關聯的運算數中,如果類型不一致,系統將自動進行類型轉換,使兩邊的類型達到一致后,再進行運算,轉換的規則是由“低到高”。'A'是字符型,a是整型,b是double型。字符型數據占1個字節,整型占2個字節,doub1e型占8個字節,故三者相加后為double型,答案選擇C選項。
17若有定義double a=22;int i=0,k=18;,則不符合C語言規定的賦值語句是( )。
A.a=a++,i++
B.i=(a+k)<=(i+k)
C.i=a%11
D.i=!a
【答案】C
【解析】C項錯誤,在C語言的算術運算符中,取余運算符“%”的左右兩側的兩個運算分量必須是整數。A項,賦值運算符的優先級高于“,”運算法,先進行賦值;B項,將“=”右邊的邏輯表達式的計算結果賦給變量i;D項,首先對變量a求邏輯非操作,然后將結果賦值給變量i。答案選擇C選項。
18程序段:
int x=12;
double y=3.141593;
printf("%d%8.6f",x,y);
輸出結果是( )。
A.123.141593
B.12 3.141593
C.12,3.141593
D.123.1415930
【答案】A
【解析】輸出的x與y間沒有空格,“%8.6f”代表總共8位寬度,包括小數點,小數點后有6位小數。答案選擇A選項。
19已知字母A的ASCII碼值為65,若變量kk為char型,以下不能正確判斷出kk中的值為大寫字母的表達式是( )。
A.kk>='A'&&kk<='Z'
B.!(kk>='A'||kk<='Z')
C.(kk+32)>='a'&&(kk+32)<='z'
D.isalpha(kk)&&(kk<91)
【答案】B
【解析】B項,表達式等價為kk<'A'&&kk>'Z',無法判斷kk中的值是否為大寫字母,邏輯錯誤。大寫字母的ASCII碼值是65~90,小寫字母的ASCII碼值是97~122,isalpha(kk)是判斷kk是否是字母的函數,是字母并且字母ASCII值小于91的一定為大寫字母。答案選擇B選項。
20若以下選項中的變量全部為整型變量,且已正確定義并賦值,則語法正確的switch語句是( )。
A.
switch(a+9)
{
case c1:y=a-b;
case c2:y=a+b;
}
B.
switch a*b
{
case 10:x=a+b;
default:y=a-b;
}
C.
switch(a+b)
{
case1:case2:case3:y=a+b;break;
case0:case4:y=a-b;
}
D.
switch(a*a+b*b)
{
default:break;
case 3:y=a+b;break;
case 2:y=a-b;break;
}
【答案】D
【解析】A項錯誤,case后面的應該為整形或字符型常量;B項錯誤,switch后面的表達式需要在括號內;C項錯誤,case和后面的常量表達式應該由空格隔開。答案選擇D選項。
21下列敘述中正確的是( )。
A.可以用關系運算符比較字符串的大小
B.空字符串不占用內存,其內存空間大小是0
C.兩個連續的單引號是合法的字符常量
D.兩個連續的雙引號是合法的字符串常量
【答案】D
【解析】A項錯誤,關系運算符不能比較字符串大小,可以用函數庫中的字符串比較函數來比較字符串的大小;B項錯誤,空字符串占用一個字節的內存;C項錯誤,字符常量是用單引號把一個字符括起來;D項正確,兩個連續的雙引號是一個字符串常量,稱為空串。答案選擇D選項。
22有以下程序:
#include<stdio.h>
main()
{
int i,j,k,a=5,b=6;
i=(a==b)?++a:--b;
j=a++;
k=b;
printf("%d,%d,%d\n",i,j,k);
}
程序的運行結果是( )。
A.7,6,5
B.5,5,5
C.7,5,5
D.5,6,5
【答案】B
【解析】條件表達式i=(a==b)?++a:--b;中先執行a==b,值為假,根據三元運算符語法規則,執行--b,此時b為5,賦給i,i=5。j=a++,將a=5先賦給j,再進行a++,j=5,a=6,k=b=5,故最后輸出的是5,5,5。答案選擇B選項。
23設有如下程序段:
char s[20]="Beijing",*p;
p=s;
則執行p=s;語句后,以下敘述正確的是( )。
A.可以用*p表示s[0]
B.s數組中元素的個數和p所指字符串長度相等
C.s和p都是指針變量
D.數組s中的內容和指針變量p中的內容相等
【答案】A
【解析】A項正確,p=s;后,指針p指向s的首地址,*p=s[0]。B項錯誤,p指針所指向的字符串為"Beijing",其長度為7,而數組a中元素的個數為20;C項錯誤,s為字符數組名;D項錯誤,數組s中有20個元素,其中s[7]~s[19]都為0,而p中只有7個元素;答案選擇A選項。
24有以下程序:
#include <stdio.h>
void f(int *p,int *q);
main()
{
int m=1,n=2,*r=&m;
f(r,&n);
printf("%d,%d",m,n);
}
void f(int *p,int *q)
{
p=p+1;
*q=*q+1;
}
程序運行后的輸出結果是( )。
A.1,3
B.2,3
C.1,4
D.1,2
【答案】A
【解析】語句p=p+1;只改變指針p的地址,與p的內容無關,所以m值沒有改變,而語句*q=*q+1;是改變該指針所指地址中的內容,所以n變為3,m不變,仍為1,答案選擇A選項。
25以下關于return語句的敘述中正確的是( )。
A.一個自定義函數中必須有一條return語句
B.一個自定義函數中可以根據不同情況設置多條return語句
C.定義成void類型的函數中可以有帶返回值的return語句
D.沒有return語句的自定義函數在執行結束時不能返回到調用處
【答案】B
【解析】B項,一個自定義函數可以根據不同的情況設置多條return語句,但注意函數的返回值必須只有一個;A項,一個自定義函數中可以沒有返回值,只要定義為void型即可;C項,定義成void類型的函數沒有返回值,所以其中不可以有return語句;D項,程序執行結束后無論是否有return語句都自動返回到調用處。答案選擇B選項。
26有以下程序:
#include<stdio.h>
main()
{
int x=1,y=0;
if(!x)y++;
else if(x==0)
if(x)y+=2;
else y+=3;
printf("%d\n",y);
}
程序運行后的輸出結果是( )。
A.3
B.2
C.1
D.0
【答案】D
【解析】else子句總是與前面最近的不帶else的if相結合,與書寫格式無關。本題中的層次關系是:if(!x)與else if(x==0)是一組,位于條件判斷的最外層。而if(x)與else是一組,位于else if(x==0)條件的內層。由此可知條件均不成立,所以y未進行任何操作,仍為0。答案選擇D選項。
27設有如下定義語句:
int m[ ]={2,4,6,8},*k=m;
以下選項中,表達式的值為6的是( )。
A.*(k+2)
B.k+2
C.*k+2
D.*k+=2
【答案】A
【解析】本題中k指向數組m的首地址。*(k+2)先將指針后移兩個元素,即為m[2]的地址,然后取出m[2]的值6。B項,k+2是m[2]的地址;C項,*k表示m[0]的值,然后再加上2,所以為4;D項,表示給m[0]的值加2,也為4。答案選擇A選項。
28若有定義語句
int year=2009,*p=&year;
以下不能使變量year中的值增至2010的語句是( )。
A.*p+=1;
B.(*p)++;
C.++(*P);
D.* p++;
【答案】D
【解析】A項,p所指內容執行增1操作;B項,先取P指針所指的內容,再執行后++運算;C項,先取P指針所指內容,再執行前++運算;D項,實際上是p指針執行++操作,而后取值。答案選擇D選項。
29有以下程序
#include<stdio.h>
void f(int *p);
main()
{
int a[5]={1,2,3,4,5},*r=a;
f(r);
printf("%d\n",*r);
}
void f(int *p)
{
p=p+3;
printf("%d,",*p);
}
程序運行后的輸出結果是( )。
A.1,4
B.4,4
C.3,1
D.4,1
【答案】D
【解析】在調用f函數時,形參p通過傳遞參數指向了數組a的起始地址,執行語句“p=p+3;”后指向了a[3]的地址,所以輸出4;主函數中,指針r仍指向數組a的首地址,所以輸出1。答案選擇D選項。
30有以下程序:
#include<stdio.h>
main()
{
int m=1,n=2,*p=&m,*q=&n,*r;
r=p;
p=q;
q=r;
printf("%d,%d,%d,%d\n",m,n,*p,*q);
}
程序運行后的輸出結果是( )。
A.1,2,1,2
B.1,2,2,1
C.2,1,2,1
D.2,1,1,2
【答案】B
【解析】本題首先讓指針變量p和q分別指向m和n的地址空間,然后將p賦值給r,讓r指向m,q賦值給p,讓p指向n,再將r賦值給q,讓q指向m,因此最后p指向n,q指向m。答案選擇B選項。
31以下敘述中錯誤的是( )。
A.同一個數組中所有元素的類型相同
B.不可以跳過前面的數組元素,給后面的元素賦初值0
C.定義語句:int a[10]={0};,給a數組中所有元素賦初值0
D.若有定義語句:int a[4]={1,2,3,4,5};,編譯時將忽略多余的初值
【答案】D
【解析】數組初始化時,若賦初值的個數多于所定義數組的元素個數時,編譯器會報錯。答案選擇D選項。
32有以下函數:
#include <stdio.h>
void func(int n)
{
int i;
for(i=0;i<=n;i++)printf("*");
printf("#");
}
main()
{
func(3);
printf("????");
func(4);
printf("\n");
}
程序運行后的輸出結果是( )。
A.****#????***#
B.***#????*****#
C.**#????*****#
D.****#????*****#
【答案】D
【解析】從main函數開始,執行func(3)函數,for循環執行4次,連續輸出四個“*”,然后輸出一個“#”;輸出“????”;再次調用func(4),for循環執行5次,連續輸出五個“*”,然后輸出一個“#”;最后輸出換行符。答案選擇D選項。
33有以下程序:
#include <stdio.h>
struct ord
{int x,y;}dt[2]={1,2,3,4};
main()
{
struct ord *p=dt;
printf("%d,",++p->x);
printf("%d",++p->y);
}
程序運行后的輸出結果是( )。
A.1,2
B.2,3
C.3,4
D.4,1
【答案】B
【解析】dt是一個結構體數組,所以初始化的結果為dt[0]={1,2},dt[1]={3,4}。*p=dt;表示p指向dt[0]。++p->x中,->的優先級大于++,所以表達式等價于++(p->x),因為p->x為1,所以輸出這個值為2,同理,第二個++p->y的值為2+1=3。答案選擇B選項。
34設有定義:
struct complex
{int real,unreal;}data1={1,8},data2;
則以下賦值語句中錯誤的是( )。
A.data2=data1;
B.data2=(2,6);
C.data2.real=data1.real;
D.data2.real=data1.unreal;
【答案】B
【解析】B項,對結構體進行初始化時,應該用花括號括起來的一組值,而不是用小括號,而且需要強制轉換數據類型,應該為data2=(struct complex){2,6};。答案選擇B選項。
35有以下程序:
#include <stdio.h>
#define PT 3.5
#define S(x) PT*x*x
main()
{
int a=1,b=2;
printf("%4.1f\n",S(a+b));
}
程序運行后的輸出結果是( )。
A. 14.0
B. 31.5
C. 7.5
D.程序有錯無輸出結果
【答案】C
【解析】宏定義分為兩種:①無參數的宏定義,即#define PT 3.5;②帶參數的宏定義,即#define S(x) PT*x*x。S(a+b)的運算過程即3.5*1+2*1+2,最后結果為 7.5,注意,7前面有一個空格字符。%4.1f要求輸出的浮點數的寬度為4(包括小數點),且小數點后保留一位小數。若數字寬度不夠則添加空格。答案選擇C選項。
36設有定義語句
int(*f)(int);
則以下敘述中正確的( )。
A.f是基類型為int的指針變量
B.f是指向函數的指針變量,該函數具有一個int類型的形參
C.f是指向int類型一維數組的指針變量
D.f是函數名,該函數的返回值是基類型為int類型的地址
【答案】B
【解析】在C語言中函數名代表該函數的入口地址,因此可以定義一種指向函數的指針來存放這類地址,int(*f)(int);,其中f為指向函數的指針變量,指向有一個整型變量且返回值也為整型的函數,第一個int為函數返回值的類型,第二個int為函數的形參類型。答案選擇B選項。
37有以下程序:
#include<stdio.h>
void fun(int n)
{
static int num=1;
num=num+n;
printf("%d",num);
}
main()
{
fun(3);
fun(4);
printf("\n");
}
程序運行后的輸出結果是( )。
A.48
B.34
C.35
D.45
【答案】A
【解析】靜態變量在第2次調用fun函數時不會被重新初始化,在整個程序運行結束時才會被釋放。第一次調用后num的值為1+3=4,第二次調用時,num=num+4=4+4=8。答案選擇A選項。
38以下選項中敘述錯誤的是( )。
A.C程序函數中定義的賦有初值的靜態變量,每調用一次函數,賦一次初值
B.在C程序的同一函數中,各復合語句內可以定義變量,其作用域僅限本復合語句內
C.C程序函數中定義的自動變量,系統不自動賦確定的初值
D.C程序函數的形參不可以說明為static型變量
【答案】A
【解析】函數內定義的靜態變量,在整個程序運行期間,占據靜態存儲區的永久性存儲單元。即使退出函數以后,下次再進入該函數時,靜態局部變量仍使用原來的存儲單元。對未賦初值的靜態局部變量,C編譯程序自動給它賦初值0。因此,在函數中定義的靜態變量,只在第1次調用賦值,以后調用保留上次的值。答案選擇A選項。
39有以下程序:
#include<stdio.h>
main()
{
short c=124;
c=c______;
printf("%d\n",c);
}
若要使程序的運行結果為248,應在下畫線處填入的是( )。
A.>>2
B.|248
C.&0248
D.<<1
【答案】D
【解析】要輸入248,是124的兩倍,124為01111100,248為11111000,因此只要左移一位即可。答案選擇D選項。
40假定已建立以下數據鏈表結構,且指針p和q已指向如下圖所示的結點:
則以下選項中可將q所指結點從鏈表中刪除并釋放該結點的語句是( )。
A.(*)p.next=(*q).next;free(p);
B.b=q->next;free(q);
C.p=q;free(q);
D.p->next=q->next;free(q);
【答案】D
【解析】要刪除結點q,首先要將q的上一個結點P的指針域指向q的指針域所指向的結點,防止刪除q結點后丟失q結點后的鏈表,即p->next=q->next,然后釋放結點q,free(q);。答案選擇D選項。
二、程序填空題(共18分)
給定程序中,函數fun的功能是:將形參s所指字符串中所有ASCII碼值小于97的字符存入形參t所指字符數組中,形成一個新串,并統計出符合條件的字符個數作為函數值返回。
例如,形參s所指字符串為:Abc@1x56*,程序執行后t所指字符數組中的字符串應為:A@156*。
請在程序的下畫線處填入正確的內容并把下畫線刪除,使程序得出正確的結果。
注意:部分源程序給出如下。
請勿改動主函數main和其他函數中的任何內容,僅在fun函數的橫線上填入所編寫的若干表達式或語句。
【試題源程序】
#include<stdio.h>
int fun(char *s,char *t)
{
int n=0;
while(*s)
{
if(*s<97)
{
*(t+n)=①______;
n++;
}
②______;
}
*(t+n)=0;
return ③______;
}
void main()
{
char s[81],t[81];
int n;
printf("\nEnter a string:\n");
gets(s);
n=fun(s,t);
printf("\nThere are %d letter which ASCII code is less than 97:%s\n",n,t);
}
答:
①* s
②s++
③n
【解析】
填空1:while循環的功能是將s所指字符串中ASCAII碼值小于97的字符存入t所指字符串中,顯然此處應該填s所指字符串中的內容,即*s。
填空2:從前一語句中可以想到,當把s所指字符串中的字符賦給t所指字符串后,應該修改指針,使指針s指向下一個字符。所以這里應該填s++。
填空3:根據題意,需要返回符合要求的字符個數。從程序中可以看出,變量n一直在記錄符合條件的字符個數,所以這里應填n。
三、程序修改題(共18分)
下列給定程序中,函數fun()的功能是:計算n的5次方的值(規定n的值大于2且小于8),通過形參指針傳回主函數:并計算該值的個位、十位、百位上數字之和作為函數值返回。例如:7的5次方是16807,其低3位數的和是15。
請改正程序指定部位的錯誤,使它能得到正確結果。
注意:不要改動main()函數,不得增行或刪行,也不得更改程序的結構。
【試題源程序】
#include<stdio.h>
#include<math.h>
int fun(int n,int *value)
{
int d,s,i;
/**************found************/
d=0;
s=0;
for(i=1;i<=5;i++)d=d*n;
*value=d;
for(i=1;i<=3;i++)
{
s=s+d%10;
/**************found************/
d=d\10;
}
return s;
}
main()
{
int n,sum,v;
do
{
printf("\nEnter n(2<n<8):\n");
scanf("%d",&n);
}while(n<=2||n>=8);
sum=fun(n,&v);
printf("\n\nThe result:\n value=%d sum=%d\n\n",v,sum);
}
答:
(1)錯誤:d=0;
正確:d=1;
(2)錯誤:d=d\10;
正確:d=d/10;
【解析】函數的思路是:先定義兩個型變量d和s,分別用于累乘和累加;第一個for循環用于實現求n的5次方,用指針返回結果;第2個for循環計算個位、十位和百位數字之和,用return語句返回結果。實現fun()函數的功能的關鍵在于累乘和累加初值的設定及算法的實現。
錯誤1:變量d用于保存已經累乘的數并用于下次累乘,初值不能為0。所以d=0;應改為d=1;。
錯誤2:C語言中整除的符號是“/”,不是“\”。
四、程序設計題(共24分)
請編寫函數fun(),該函數的功能是:將ss所指字符串中所有下標為奇數位置上的字母轉換為大寫(若該位置上不是字母,則不轉換)。例如,若輸入:abc4EFg,則輸出為:aBc4EFg。
注意:部分源程序給出如下。
請勿改動主函數main()和其他函數中的任何內容,僅在函數fun()的花括號中填入所編寫的若干語句。
【試題源程序】
#include <stdio.h>
#include <string.h>
void fun(char *ss)
{
}
main()
{
char tt[51];
printf("\nPlease enter an character string within 50 characters:\n");
gets(tt);
printf("\n\nAfter changing, the string\n \"%s\"",tt);
fun(tt) ;
printf("\nbecomes\n \"%s\"",tt);
}
答:
void fun(char *ss)
{
int i;
for(i=0;ss[i]!='\0';i++)
if(i%2==1&&ss[i]>='a'&&ss[i]<='z')
ss[i]=ss[i]-32;
}
【解析】本題的設計思路是:①利用循環遍歷字符串;②利用if語句判斷字符是否為小寫字母且其下標為奇數,如果是則把字符減32轉換成對應的大寫字母。
- 2019年11月全國計算機技術與軟件專業技術資格(水平)考試《系統集成項目管理工程師(中級)》復習全書【核心講義+歷年真題詳解】
- 全國計算機等級考試一本通:二級Access
- 2020年3月全國計算機等級考試《一級計算機基礎及MS Office應用》復習全書【核心講義+歷年真題詳解】
- 全國計算機等級考試真題匯編與專用題庫:二級C語言
- 2014年全國計算機等級考試3年真題精解與過關全真訓練題:二級Visual Basic語言程序設計
- 2014年全國計算機等級考試3年真題精解與過關全真訓練題:二級C語言程序設計
- 全國計算機等級考試《二級C語言程序設計》【教材精講+真題解析】講義與視頻課程【45小時高清視頻】
- 2014年全國計算機等級考試3年真題精解與過關全真訓練題:二級Visual FoxPro數據庫程序設計
- 2014年全國計算機等級考試3年真題精解與過關全真訓練題:二級Java語言程序設計
- 全國計算機等級考試教程:一級計算機基礎及WPS Office應用
- 全國計算機等級考試歷年真題與機考題庫:三級網絡技術
- 2020年3月全國計算機等級考試《三級嵌入式系統開發技術》專用教材【考綱分析+考點精講+真題演練】
- 全國計算機等級考試一本通:二級MS Office高級應用
- 全國職稱計算機考試講義·?真題?·預測三合一:PowerPoint 2003中文演示文稿
- 全國計算機等級考試歷年真題與標準題庫:二級MS Office高級應用