2015年計算機二級《C語言》考試上機測試題(3)
39.設x=011050,則x=x&01252的值是( )。
A.0000001000101000
B.1111110100011001
C.0000001011100010
D.1100000000101000
40.在“文件包含,,預處理語句的使用形式中,當#include后面的文件名用(雙引號)括時,尋找被包含文件的方式是( )。
A.直接按系統設定的標準方式搜索目錄
B.先在源程序所在的目錄搜索,如沒找到,再按系統設定的標準方式搜索
C.僅僅搜索源程序所在目錄
D.僅僅搜索當前目錄
二、基本操作題(共18分)
請補充函數proc(),該函數的功能是計算下面公式SN的值:
SN=1+1/3十4/5+...+2N-1/SN-1
例如,當N=20時,SN=29.031674。
注意:部分源程序給出如下。
請勿改動main()函數和其他函數中的任何內容,僅在函數proc()的橫線上填入所編寫的若干表達式或語句。
試題程序:
#include
#include
#include
double proc(int n)
{
double s=1.0,sl=0.0;
int k;
for(【1】;k<=n;k++)
{
sl=S;
【2】
}
return 【3】 ;
)
void main()
{
int k=0:
double sum;
system("CLS");
printf("\nPlease input N=");
scanf("%d",&k);
sum=proc(k);
printf("\nS=%If",sum);
)
三、程序改錯題(共24分)
下列給定程序中,函數proc()的功能是根據整型形參n,計算如下公式的值:
Y=1-1/(22)+1/(33)-1/(44)+…+(-1)(n+1)/(nn)
例如,n中的值為l0,則應輸出0.817962。
請修改程序中的錯誤,使它能得到正確結果。
注意:不要改動main()函數,不得增行或刪行,也不得更改程序的結構。
試題程序:
#include
#include
#include
double proc(int n)
{
double y=1.0;
f|****found****
int J=1; .
int i;
for(i=2;i<=n;i++)
{
j=-l*j;//****found****
y+=1/(i*i);
)
return(y);
)
void main()
{
int n=10:
system("CLS"):
printf("\nThe result is%lf\n",proc(n));
)
四、程序設計題(共18分)
編寫一個函數,從傳人的M個字符中找出最長的一個字符串,并通過形參指針max傳回該串地址(用****作為結束輸入的標志)。
注意:部分源程序給出如下。
請勿改動main()函數和其他函數中的任何內容,僅在函數proc()的花括號中填人所編寫的若干語句。
試題程序:
#include
#include
#include
char*proc(char(*a)[81],int num)
{
)
void main()
{
char ss[l0][81],*max;
int n,i=0;
printf("輸入若干個字符串:");
gets(ss[i]);
puts(ss[i]);
while(!strcmp(ss[i],"****")= =0)
{
i++:
gets(ssEi]);
puts(ss[i]);
)
n=i:
max=proe(SS,n);
printf("\nmax=%s\n",max);
}
參考答案及解析
一、選擇題
1.D。【解析】算法的空間復雜度,是指執行這個算法所需的存儲空間。算法所占用的存儲空間包括算法程序所占用的空間、輸入的初始數據所占用的存儲空間、算法執行過程中所需要的額外空間。
2.D。【解析】數據的存儲結構是指數據的邏輯結構在計算機存儲空間中的存放形式,一種數據結構可以根據需要采用不同的存儲結構,用的存儲結構有順序和鏈式結構。用不同的存儲結構,其處理的效率是不同的。
3.D。【解析】所謂的交換排序方法是指借助數據元素之間的互相交進行排序的一種方法,包括冒泡排序和快速排序,冒泡排序通過相鄰元素的交換,逐步將線性表變成有序是一種最簡單的交換排序方法。
4.C。【解析】結構化程序設計的原則和方法之一是限制使用GOT0語句,但不是絕對不允許使用G0T0語句。其他三項為結構化程序設計的原則。
5.D。【解析】文件系統所管理的數據文件基本上是分散、相互獨立的。相對于數據庫系統,以此為基礎的數據處理存在3個缺點:數據冗余大、數據的不一致性、程序與數據的依賴性強。
6.C。【解析】面向對象的設計方法的基本原理是:使用現實世界的概念抽象地思考問題從而自然地解決問題。它雖強調模擬現實世界中的概念而不強調算法,但是它鼓勵開發者在軟件開發的過程中從應用領域的概念角度去思考。
7.D。【解析】所謂的后序遍歷是指,首先遍歷左子樹,然后遍歷右子樹,最后訪問根結點,并且在遍歷左、右樹時,仍然先遍歷左子樹,然后遍歷右子樹,最后訪問根點。因此,后序遍歷二叉樹的過程也是一個遞歸過程。
8.B。【解析】軟件的過程設計是指系統結構部件轉換成軟件的過程描述。
9.A。【解析】模塊的獨立性是指每個模塊保證完成系統要求的獨立功能,并且與其他模塊的聯系少且接口簡單。衡量軟件的模塊獨立性有內聚性和耦合性兩個定性度量標準。耦合性是模塊間互相連接緊密程度的度量。一般較優秀的軟件設計,應盡量做到高內聚,低耦合,即減弱模塊之間的耦合性和提高模塊內的內聚性,以利于提高模塊的獨立性。
10.C。【解析】對象的封裝性是指從外面看只能看到對象的外部特性,而對象的內部,其處理能力的實行和內部狀態對外是不可見的,是隱蔽的。
11.C。【解析】數據庫系統由如下5個部分組成:數據庫(DB)、數據庫管理系統(DBMS)、數據庫管理員(人員)、系統平臺之一——硬件平臺(硬件)、系統平臺之二——軟件平臺(軟件)。其中DB(DataBase)即數據庫,是統一管理的相關數據的集合DBMS即數據庫管理系統,是位于用戶與操作系統之間的一層數據管理軟件,為用戶或應用完程序提供訪問DB的方法。由以上可知,選C為正確答案。
12.A。【解析】標識符是由字母、數字或下劃線組成,并且它的第一個字符必須是字母或者下劃線。B選項int不是表達變量類型的標識符,它不能再用做變量名和函數名。C選項d0是C語言的一個關鍵字。D選項標識符只能以字母或下劃線開始。
13.D。【解析】本題考查邏輯運算符的使用。當“&&”的兩個運算對象都是邏輯l時,表達式返回值才是1;“‖”的兩個運算對象至少有一個是邏輯1時,表達式返回值也是l,x 14.C。【解析】第l個printf函數,格式說明的個數是2,而輸出項的個數是3,所以對于多余的輸出項k不予輸出;第2個printf函數,有兩個%說明,第1個%后面的字符要原樣輸出。本題考查printf函數的格式。①“%x”和“%o”分別表示以十六進制和八進制無符合型輸出整型數據(不帶前導ox或o);②printf函數中格式說明符之前插入的任何字符都原樣輸出;③格式說明與輸出項的個數也要相等,如果格式說明的個數少于輸出項的個數,則對于多余的輸出項不予輸出。
15.C。【解析】函數fun(int x,int y)的功能是返回x+Y的值。在主函數中,變量a,b,c的初始值分別為 1,2,3。因此逗號表達式“a++,b++,a+b”的值等于5,表達式c++的值為3,調用于函數的表達式為“fun(5,3);”,其返回值等于8。
16.D。【解析】在x=2,y=x+3/2中,3/2=1,2+1=3,因此表達式的值為3,因為X,y為double型變量,故選擇D選項。
17.A。【解析】當X為1時,執行case l,a自加等于l,因為case l后沒有break,接著執行case 2,此時a的值為2,b自加為1,故選擇A選項。
18.D。【解析】本題考查自增運算符“++”、邏輯與運算符“&&”和邏輯或運算符“‖”。自增運算符“++”出現在變量之前,表示先使用變量的值加1,再使用變量的值進行運算;出現在變量之后,表示先使用變量的值進行運算,再使用變量的值加l。當邏輯與運算符“&&”兩邊的運算對象都為真時,邏輯表達式的值才為真;當邏輯或運算符“‖”只要一個值為1,值就為l。根據運算符的優先級,題中應先計算內層括號中的值。++j是先自加后運算,因此運算時j的值等于3,所以表達式++j=3成立,即表達式的值為l;1與任何數都為進行或(1 1)運算,結果都為1,因此k一3的表達式i++是先運算后自加,因此運算時i為 1,所以i++=1成立,自加1后i=2。if語句的條件為真即“1”,所以輸出i、j、k的值分別是2,3,3。
19.A。【解析】本題考查switch語句。當i=1時,執行case l,因為沒有遇到break語句,所以依次往下運行,“a=a+2=2,a=a+3=5”;當i=2時,執行case 2,因為沒有遇到break語句,所以依次往下執行,“a=a+2=7,a=a+3=10”;當i=3時,執行case 3,a=a+1=11,因為沒有遇到break語句,所以依次往下運行,a=a+2=13,a=a+3=16;當i=4時,執行default,a=a+3=l9,結束循環。
20.C。【解析】只有當3個if條件同時成立,即能夠同時被2、3、7整除時,才輸出i的值,而從0到50能夠同時被2、3、7整除的數只有42,故選擇c選鞏。
21.A。【解析】循環的作用是求行下標從l到2列下標從0到i的元素之和,即s=a[1][0]+a[1][1]+a[2][o]+a[2][1]+a[2][2]=3+4+5+6+0一18。
22.A。【解析】在程序語句中,k的初始值為5,進行第l次while循環后,k自減l為4,非0,執行循環體里的printf語句,輸出k,此時k的值變為l。程序執行第2次循環時,k自減l變為0,為假,退出while循環語句。所以程序的最后結果為l。
23.A。【解析】通過地址來引用數組元素的方法有下列5種:
(1)a[i][j];(2)*(a[i]+j);(3)*(*(a+j)+j);(4)*(a[i][j]);(5)(&a[o][0]+3*i+j)。故A正確。
24.C。【解析】選項A、B的空間不夠;字符串存儲要有結束符’\0’,且要占用一個空間,printf用來輸出 字符,不能輸入字符串。
25.D。【解析】由題目中線性鏈表的定義可知,要將q和r所指的結點交換前后位置,只要使q指向r的后一個結點,P指向r結點,r指向q結點即可。而在選項D中,r->next=q,這時r指向的節點為q;p->next=r,這時P指向的節點為r;q->next:r->next,因為r節點已經指向q,所以執行這個語句后q又指向q,所以選項D不正確。
26.B。【解析】在第1次外層for循環中,首先x++得到x=1。進入到內層for循環,只有循環j的值為奇數時,變量x的值才自加1,所以在內層for循環執行過程中,變量x的值自加兩次,當退出內層for循環時,x=3,然后執行x++,得到x=4。在進入執行第2次外層for循環中,首先x++得到x=5。進入到內層for循環,只有循環變量J的值為奇數時,變量X的值才自加1,所以在內層for循環執行過程中,變量X的值自加l兩次,當退出內層for循環時,x=7,然后執行x++,得到x=8,所以打印輸出變量x的值為8。
27.C。【解析】子函數funl(double a)的功能是返回a的平方值的整數部分。子函數fun2(double X, double y)的功能是返回X的平方值的整數部分與Y的平方值的整數部分的和。又因為題中變量W的定義為double型,函數fun(2)的定義為int型,按照各類數值型數據間的混合運算,整型數據被轉換為實型數據。所以雙精度型變量w的值為5.0。
28.c。【解析】在for循環語句中自變量i從0開始,每次自加2,執行s+=*(t+i)語句,因為C語言規定數組名做表達式相當于數組的首地址,也就是第一個元素的地址。因此,*(t+i)代表數組的第i+1個元素。所以程序運行的結果是l+3+5+7+9=25,即變量S的值等于25。
29.A。【解析】本題在函數int fun(int n)的定義中又出現了對函數fun的調用,所以函數fun是遞歸函數。因而在主函數中調用x=fun(x)時,當輸入10賦給變量X時,遞歸調用的過程為
fun(10)=l0+fun(9)=10+9+fun(8)=10+9+8+fun(7)
=10+9++8+7+fun(6)=10+9++8+7+6+fun(6)
=10+9++8+7+6+5+fun(4)
=10+9++8+7+6+5+4+fun(3)
=10+9++8+7+6+5+4+3+fun(2)
=10+9++8+7+6+5+4+3+2+fun(1)
=10+9++8+7+6+5+4+3+2=55
30.C。【解析】在函數int fun(int x[],int n)的定義中,變量sum為一個靜態局部變量。由于在整個程序運行期間,靜態局部變量在內存中的靜態存儲中占據著永久的存儲單元。函數int fun(int x[],int n)的功能是求出數組x[]各個元素的和,所以在主函數中,調用函數fun(a,5)后,變量sum=1+2+3+4+5=15,當再次調用fun(b,4)后,變量sum=15+6+7+8+9=45,所以s=15+45=60。
31.D。【解析】執行第一次for循環時,用表達式p[i][J]!=’\o’來判斷字符串數組指針P是否到達字符串的結尾,如果沒有到達,繼續執行while中的語句。if語句表示(p[i][j]-’\o’)除2的余數不為0時,即字符串所有奇數,執行后面的語句。所以退出第1次for的循環體時,輸出為397,執行第2次循環體。對字符串“2584”進行處理,輸出結果為5,因而最后輸出結果為3975。
32.B。【解析】從題目中可知,’\O’、’\t’、’\\’分別為一個字符,而sizeof是求字節個數的函數,其中包括’\O’占的字節,strlen函數是求數組長度的函數;其以’\0’結束,因此strlen的值為5,sizeof的值為20。
33.C。【解析】數組的下標是從0開始的,A中越界,行下標和列下標都不能越界;B中,雖然是個地址,但是也同樣越界了;選項c中表示的是第一個的首地址;選項D表示的為其元素的值,并不是地址。
34.B。【解析]SEEK_SET代表文件的開始,SEEK_END代表文件末尾,SEEK_CUR代表文件當前位置。
35.C。【解析】當if執行到第一個滿足(i*i>=20)&&(i*i<=100)這個條件的i出現時,通過break語句跳出循環,執行下面的prinlf語句。
36.B。【解析】指針中存放的是變量的地址,指針也可以進行增減運算,這時指針移動的最小單位是一個存儲單元,而不是一個字節。所以題中p+6指的是將指針向后移動了6個存儲單元,即指向b[6],存放的是b[6]的地址。
37.D。【解析】由n!的數字定義可知n!=n*(n-1)*(n-2)*…*1。在選項A中,由于f的初值為0,在for循環語句中,f依次乘以l,2,3,…,n,最后計算得到f=n!=0,所以選項A不正確。在選項B中,f的初值為l,在for循環語句中,f依次乘以l,2,3,…,(n-1),最后計算得到f=(n-1)!,所以選項B不正確。在選項C中,f的初值為l,在for循環語句中,f依次乘以n,n+1,n+2,……,所以選項C不正確。在選項D中,f的初值為l,在for循環語句中,f依次乘以n,n-1,n-2,…,2,最后計算得到f=n!,所以選項D正確。
38.A。【解析]strcpy實現的功能是復制,該操作把are復制到a中,aE03 E33一’&’,且strcpy(aEl], "you")把you復制到a[l]中,故輸出a為“are&you”。
39.A。【解析】本題主要考查按位與運算,x=Oll050的二進制形式為00010010000101000,Ol252的二進制形式為0000001010101010,兩者相與得0000001000101000。
40.B。【解析】#include”文件名”,預處理程序首先在引用被包含文件的源文件所在的目錄下搜索指定的文件,如沒找到,再按系統指定的標準目錄搜索。
二、基本操作題程序填空題
【1】k=2【2】s+=(2*k一1)/sl【3】s
【解析】由題目中所給公式可知,多項武的第一項為1。變量s中存放多項式的和,其初始值為l。因此,循環從第二項開始,因此,【1】處填“k=2”;變量sl中存放各項表達武的值,由公式可知,【2】處填“s+=(2*k-1)/sl”;題目中要求將多項式的和返回到主函數當中,因此,【3】處填“s”。
三、程序改錯題
(1)錯誤:int j=1;正確:double j=1.0;
(2)錯誤:y+=1/(i*i); 正確:y+=j/(i*i);
【解析】由函數proc()可知,變量j的作用是控制每一項符號的變化,并且作為運算的分子,應改為double型變量。因此,“int j=1;”應改為“double j=1.0;”。變量y中存放多項式的值,多項式中的每一項符號由變量j決定。因此,“y+=1/(i*i);”應改為“y+=j/(i*i);”。
四、程序設計題
char*proc(char(*a)[81],int M)
{
char*max;
int i=0:
max=a[O]:
for(i=0;i if(strlen(max) max=a[i];
return max; //返回最長字符串的地址
}
【解析】本題首先要定義一個字符指針用于保存最長的字符串,并使其初始值指向第一個字符串;再循環遍歷字符串數組,通過if語句比較字符串的長度,并把最長的字符串地址賦給字符指針;最后返回最長字符串的地址。