官术网_书友最值得收藏!

2015年3月全國計算機等級考試《二級C語言程序設計》真題及詳解

(考試時間120分鐘 滿分100分)

一、選擇題(每題1分,共40分)

1某二叉樹的中序序列為DCBAEFG,后序序列為DCBGFEA,則該二叉樹的深度(根結點在第1層)為(  )。

A.5

B.4

C.3

D.2

【答案】B

【解析】二叉樹的后序序列為DCBGFEA,則A為根結點。中序序列為DCBAEFG,則DCB為左子樹結點,EFG為右子樹結點。同理B為C父結點,C為D父結點。根據分析,可畫出左子樹,同理E為F父結點,F為G父結點。根據分析,可畫出右子樹,易知二叉樹深度為4層。答案選擇B選項。

2設有定義:

struct{int n;float x;}s[2],m[2]={{10,2.8},{0,0.0}};

則以下賦值語句中正確的是(  )。

A.s[0]=m[1];

B.s=m;

C.s.n=m.n;

D.s[2].x=m[2].x;

【答案】A

【解析】定義了結構體類型數組s,長度為2,結構體類型數組m,長度為2,并對數組m進行了初始化。同類型的結構體可以直接用變量名實現賦值,A項正確;數組名為數組首地址,地址常量之間不可以相互賦值,B項錯誤;數組名為地址常量不是結構體變量,不能引用成員,C項錯誤;s[2]與m[2]數組越界,D項錯誤。答案選擇A選項。

3關于C語言標識符,以下敘述錯誤的是(  )。

A.標識符可全部由數字組成

B.標識符可全部由下劃線組成

C.標識符可全部由小寫字母組成

D.標識符可全部由大寫字母組成

【答案】A

【解析】C語言標識符只能由字母、數字、下劃線構成,且只能以字母、下劃線開頭,故答案選擇A選項。

4以下程序段中的變量已定義為int類型,則

sum=pAd=5;
pAd=sum++,++pAd,pAd++;
printf("%d\n",pAd);

程序段的輸出結果是(  )。

A.6

B.4

C.5

D.7

【答案】D

【解析】自增和自減運算符的兩種用法:前置運算,運算符放在變量之前,規則是先使變量的值增(或減)1,然后以變化后表達式的值參與其他運算;后置運算,運算符放在變量之后,規則是變量先參與其他運算,然后再使變量的值增(或減)1。執行pAd=sum++,sum++是后置自增,執行完后,pAd=5,sum=6;++pAd和pAd++語句中沒有其他運算,即效果相同,pAd分別加1,兩句執行完后,pAd=7。答案選擇D選項。

5設循環隊列為Q(1:m),其初始狀態為front=rear=m。經過一系列入隊與退隊運算后,front=20,rear=15。現要在該循環隊列中尋找最小值的元素,最壞情況下需要比較的次數為(  )。

A.5

B.6

C.m-5

D.m-6

【答案】D

【解析】循環隊列是隊列的一種順序存儲結構,用隊尾指針rear指向隊列中的隊尾元素,用隊首指針指向隊首元素的前一個位置,因此,從隊首指針front指向的后一個位置直到隊尾指針rear指向的位置之間所有的元素均為隊列中的元素,隊列初始狀態為front=rear=m,當front=20,rear=15時,隊列中有m-20+15=m-5個元素,最壞情況下需要比較次數為m-6次。答案選擇D選項。

6以下選項中,合法的C語言常量是(  )。

A.1.234

B.'C++'

C."\2.0

D.2Kb

【答案】A

【解析】C語言中的常量:整型常量,用不帶小數點的數字表示;實型常量,用帶小數點的數字表示;字符型常量,用帶有單引號的一個字符表示;字符串常量,用一對雙引號括起來的一串字符。1.234為實型常量,A項正確;'C++'不合法,若改成"C++"則為字符串常量,B項錯誤;"\2.0不合法,不是任何類型常量,C項錯誤;2Kb不合法,若加上雙引號"2Kb"為字符串常量,D項錯誤。答案選擇A選項。

7以下選項中,不能對主函數中變量i和j的值進行交換的程序是(  )。

A.

#include <stdio.h>
void swap(int *p,int *q)
{
  int *t;
  *t=*p;
  *p=*q;
  *q=*t;
}
main()
{
  int i=10,j=20,*a=&i,*b=&j;
  swap(a,b);
  printf("i=%d j=%d\n",i,j);
}

B.

#include <stdio.h>
void swap(int *p,int *q)
{
  int t;
  t=*p;
  *p=*q;
  *q=t;
}
main()
{
  int i=10,j=20,*a=&i,*b=&j;
  swap(a,b);
  printf("i=%d j=%d\n",i,j);
}

C.

#include <stdio.h>
#include <stdlib.h>
void swap(int *p,int *q)
{
  int *t;
  t=(int *) malloc(sizeof(int));
  *t=*p;
  *p=*q;
  *q=*t;
  free(t);
}
main()
{
  int i=10,j=20;
  swap(&i,&j);
  printf("i=%d j=%d\n",i,j);
}

D.

#include <stdio.h>
void swap(int *p,int *q)
{
  int t;
  t=*p;
  *p=*q;
  *q=t;
}
main()
{
  int i=10,j=20,*x=&i,*y=&j;
  swap(x,y);
  printf("i=%d j=%d\n",i,j);
}

【答案】A

【解析】A項與C項的區別在于A項在創建臨時指針t時,并沒有對t進行初始化,也沒有對t正確開辟內存,導致程序異常,不能得到正確結果;B項,調用函數傳入的是i與j地址,函數體內交換的是地址內元素,臨時變量t為整型變量,能實現i與j值交換;C項,調用函數傳入的是i與j地址,函數體內交換的是地址內元素,臨時變量t為整型指針,且已正確開辟內存,能實現i與j值交換;D項與B項相同,能實現i與j值交換。答案選擇A選項。

8C語言中,最基本的數據類型包括(  )。

A.整型、實型、邏輯型

B.整型、字符型、數組

C.整型、實型、字符型

D.整型、實型、結構體

【答案】C

【解析】C語言中,最基本的數據類型包括整型、實型、字符型,答案為C選項。

9下列敘述中錯誤的是(  )。

A.算法的時間復雜度與算法所處理數據的存儲結構有直接關系

B.算法的空間復雜度與算法所處理數據的存儲結構有直接關系

C.算法的時間復雜度與空間復雜度有直接關系

D.算法的時間復雜度與算法程序執行的具體時間是不一致的

【答案】C

【解析】算法的時間復雜度是指執行算法所需要的計算工作量。數據的存儲結構直接決定數據輸入,因此會影響算法所執行的基本運算次數,A項正確;算法的空間復雜度是指執行這個算法所需要的內存空間,其中包括輸入數據所占的存儲空間,B項正確;算法的時間復雜度與空間復雜度沒有直接關系,C項錯誤;算法程序執行的具體時間受到所使用的計算機、程序設計語言以及算法實現過程中的許多細節影響,而算法的時間復雜度與這些因素無關,所以算法的時間復雜度與算法程序執行的具體時間是不一致的,D項正確。答案選擇C選項。

10以下能正確輸出字符a的語句是(  )。

A.printf("%s","a");

B.printf("%s",'a');

C.printf("%c","a");

D.printf("%d",'a');

【答案】A

【解析】“格式控制串”用來指定每個輸出項的輸出格式,%s對應字符串,%c對應字符,%d對應整型。雙引號里面的內容為字符串"a",單引號里面的內容為字符'a'。答案選擇A選項。

11字符數組a和b中存儲了兩個字符串,判斷字符串a和b是否相等,應當使用的是(  )。

A.if(strcmp(a,b)==0)

B.if(strcpy(a,b))

C.if(a==b)

D.if(a=b)

【答案】A

【解析】C語言中,判斷字符串是否相等,使用字符串比較函數strcmp(),不能使用相等操作符“==”。strcmp(s1,s2)函數比較s1和s2所指字符串的大小時,若串s1>串s2,函數值大于0(正數);若串s1=串s2,函數值等于0;若串s1<串s2,函數值小于0(負數)。答案選擇A選項。

12設有定義:int x=11,y=12,z=0;,以下表達式值不等于12的是(  )。

A.(z,x,y)

B.(z=x,y)

C.z=(x,y)

D.z=(x==y)

【答案】D

【解析】逗號表達式的計算過程是從左到右逐個求每個表達式的值,取最右邊一個表達式的值作為該逗號表達式的值。賦值運算結合性為由右向左結合,賦值運算符左值為變量,右值為變量或常量或表達式,且左右兩邊數據類型相同才能實現賦值。成功實現賦值后以左值為返回值。邏輯表達式成立則返回1,不成立返回0。D選項邏輯表達式x==y不成立,則z=0,表達式值為0。B選項中的賦值運算符優先級大于逗號運算符,因此x賦值給z,z=11,再計算逗號表達式,取后面一個值y作為表達式值。C選項逗號表達式(x,y)取y值為表達式值,然后賦值給z=12,表達式值為12。A選項逗號表達式(z,x,y)取y值為表達式值12。答案選擇D選項。

13下列敘述中正確的是(  )。

A.存儲空間連續的數據結構一定是線性結構

B.存儲空間不連續的數據結構一定是非線性結構

C.沒有根結點的非空數據結構一定是線性結構

D.具有兩個根結點的數據結構一定是非線性結構

【答案】D

【解析】A項錯誤,數據結構線性與否與存儲空間是否連續沒有直接關系,如二叉樹可以用一片連續的空間來存儲,但二叉樹為非線性結構;B項錯誤,線性表的鏈式存儲結構可以用不連續的空間來存儲,但線性表為線性結構;C項錯誤,沒有根結點的非空數據結構一定不是線性結構;D項正確,線性結構有且只有一個根結點,具有兩個根結點的結構一定是非線性結構。答案選擇D選項。

14以下選項中,合法的實數是(  )。

A.4.5E2

B.E1.3

C.7.11E

D.1.2E1.2

【答案】A

【解析】實型常量用帶小數點的數字表示,其值有兩種表達形式,分別為十進制小數形式和指數形式。十進制小數形式由數字和小數組成,必須有小數點,且小數點的位置不受限制。指數形式由十進制數加階碼標志“e”或“E”以及階碼(只能為整數,可以帶符號)組成。4.5E2為指數形式實數,A項正確。E1.3階碼標志前缺少十進制數,并且階數不是整數,B項錯誤。7.11E缺少階數,C項錯誤。1.2E1.2階數不是整數,D項錯誤。答案選擇A選項。

15以下選項中敘述正確的是(  )。

A.函數體必須由{開始

B.C程序必須由main語句開始

C.C程序中的注釋可以嵌套

D.C程序中的注釋必須在一行完成

【答案】A

【解析】函數體是函數首部下面的花括號內的部分,所以函數體必須由{開始,A選項正確。一個源程序文件可以包括預處理命令、全局聲明、函數定義,程序總是從main函數開始執行的,不是main語句,B選項錯誤。函數可以嵌套,注釋不能嵌套,C選項錯誤。C程序中允許兩種注釋,以//開頭的單行注釋;以/*開始,以*/結束的塊式注釋,D選項錯誤。答案選擇A選項。

16在源程序的開始處加上“#include<stdio.h>”進行文件引用的原因,以下敘述正確的是(  )。

A.stdio.h文件中包含標準輸入輸出函數的函數說明,通過引用此文件以便能正確使用printf、scanf等函數

B.將stdio.h中標準輸入輸出函數鏈接到編譯生成的可執行文件中,以便能正確運行

C.將stdio.h中標準輸入輸出函數的源程序插入到引用處,以便進行編譯鏈接

D.將stdio.h中標準輸入輸出函數的二進制代碼插入到引用處,以便進行編譯鏈接

【答案】A

【解析】“stdio.h”文件中包含標準輸入輸出函數的函數說明,預處理指令#include<stdio.h>是指程序可以在該文件中找到printf,scanf等函數,答案選擇A選項。

17下面屬于白盒測試方法的是(  )。

A.邊界值分析法

B.基本路徑測試

C.等價類劃分法

D.錯誤推測法

【答案】B

【解析】白盒測試是把程序看成裝在一只透明的白盒子里,測試者完全了解程序的結構和處理過程。它根據程序的內部邏輯來設計測試用例,檢查程序中的邏輯通路是否都按預定的要求正確地工作。白盒測試的主要技術有邏輯覆蓋測試、基本路徑測試等,B選項正確。常用的黑盒測試方法和技術有:等價類劃分法、邊界值分析法、錯誤推測法和因果圖等,ACD三項錯誤。答案選擇B選項。

18有以下程序(其中的strstr()函數頭部格式為:char* strstr(char* p1,char* p2)確定p2字符串是否在p1中出現,并返回p2第一次出現的字符串首地址):

#include <stdio.h>
#include <string.h>
char *a="you";
char *b="Welcome you to Beijing!";
main()
{
  char *p;
  p=strstr(b,a)+strlen(a)+1;
  printf("%s\n",p);
}

程序的運行結果是(  )。

A.to Beijing!

B.you to Beijing!

C.Welcome you to Beijing!

D.Beijing!

【答案】A

【解析】調用strstr函數,返回值為a指向的字符串在b指向的字符串中第一次出現的位置,并將此地址賦給指針p。strlen()函數求字符串的實際長度(不包含結束標志)。strstr函數返回的地址下標值為8,加上a長度3,再加1,指針P指向的地址下標值為12,輸出:to Beijing!,答案選擇A選項。

19有以下程序:

#include <stdio.h>
void change(int * array,int len)
{
  for(;len>=0;len--)array[len]-=1;
}
main()
{
  int i, array[5]={2,2};
  change(array,4);
  for(i=0;i<5;i++)printf("%d,",array[i]);
  printf("\n");
}

程序運行后的輸出結果是(  )。

A.1,1,-1,-1,-1,

B.1,0,-1,1,-1,

C.1,1,1,1,1,

D.1,-1,1,-1,1,

【答案】A

【解析】在main()函數中,首先給一維數組array賦初值[2,2,0,0,0],再調用change函數,對array數組中的每一個數進行減1處理,最后使用for循環語句輸出數組元素的值,答案選擇A選項。

20有以下程序:

#include <stdio.h>
main()
{
  int i,data;
  scanf("%d",&data);
  for(i=0;i<5;i++)
  {
    if(i<data) continue;
    printf("%d,",i);
  }
  printf("\n");
}

程序運行時,從鍵盤輸入:3<回車>后,程序輸出結果為(  )。

A.3,4,

B.1,2,3,4,

C.0,1,2,3,4,5,

D.0,1,2,

【答案】A

【解析】continue語句只能用在循環結構中,其作用是結束本次循環,即不再執行循環體中continue語句之后的語句,而是立即轉入對循環條件的判斷與執行。本題執行過程為:輸入3,則data=3;執行for循環,i=0,if條件成立,結束本次循環,不輸出i值,執行下一次循環;直到i>=3,if條件不成立,依次輸出i值3,4,;直到i=5退出for循環。答案選擇A選項。

21設序列長度為n,在最壞情況下,時間復雜度為O(log2n)的算法是(  )。

A.二分法查找

B.順序查找

C.分塊查找

D.哈希查找

【答案】A

【解析】對長度為n的線性表排序,最壞情況下,二分法查找時間復雜度為O(log2n);順序查找時間復雜度為O(n);分塊查找時間復雜度與分塊規則有關;哈希查找時間復雜度為O(1),因其通過計算哈希函數來定位元素位置,所以只需一次即可。答案選擇A選項。

22有以下程序:

#include <stdio.h>
main()
{
  int x;
  scanf("%d",&x);
  if(x>10) printf("1");
  else if(x>20) printf("2");
  else if(x>30) printf("3");
}

若運行時輸入:35<回車>,則輸出結果是(  )。

A.123

B.2

C.3

D.1

【答案】D

【解析】程序執行過程為:輸入35<回車>,scanf函數從鍵盤讀入35賦值給x,對if條件進行判斷,35>10,條件成立,輸出1,不再執行下面的else if語句,程序結束。答案選擇D選項。

23以下非法的字符常量是(  )。

A.'\\n'

B.'\101'

C.'\x21'

D.'\0'

【答案】A

【解析】C語言允許使用一些以特殊形式出現的字符常量,使用'\n'來表示換行,'\n'實際上是一個字符,它的ASCII碼值為10,不存在'\\n'用法。答案選擇A選項。

24有以下程序:

#include <stdio.h>
#define S(x) x *x
main()
{
  int k=5,j=2;
  printf("%d,%d\n",S(k+j+2),S(j+k+2));
}

程序的運行結果是(  )。

A.21,18

B.81,81

C.21,21

D.18,18

【答案】A

【解析】帶參數的宏的替換過程是,用宏調用提供的實參字符串直接置換宏定義命令行中相應形參字符串,非形參字符保持不變。S(k+j+2)被置換成k+j+2*k+j+2,計算時先計算2*k,結果為21;S(j+k+2)被置換成j+k+2*j+k+2,計算時先計算2*j,結果為18。程序的運行結果是21,18。答案選擇A選項。

25一名雇員就職于一家公司,一個公司有多名雇員,則實體公司和實體雇員之間的聯系是(  )。

A.1:1聯系

B.1:m聯系

C.m:1聯系

D.m:n聯系

【答案】B

【解析】實體集之間的聯系分為3類:一對一聯系(1:1)、一對多聯系(1:m)、多對多聯系(m:n)。題目中一名雇員就職于一家公司,一個公司有多名雇員,公司與雇員之間的聯系為一對多(1:m)聯系。答案選擇B選項。

26將E-R圖轉換為關系模式時,E-R圖中的實體和聯系都可以表示為(  )。

A.屬性

B.鍵

C.關系

D.域

【答案】C

【解析】采用E-R方法得到的全局概念模型是對信息世界的描述,為了適合關系數據庫系統的處理,必須將E-R圖轉換成關系模式。E-R圖是由實體、屬性和聯系組成,而關系模式中只有一種元素——關系。答案選擇C選項。

27以下針對全局變量的敘述錯誤的是(  )。

A.全局變量的作用域是從定義位置開始至源文件結束

B.全局變量是在函數外部任意位置上定義的變量

C.用extern說明符可以限制全局變量的作用域

D.全局變量的生存期貫穿于整個程序的運行期間

【答案】C

【解析】在不同編譯單位內用extern說明符來擴展全局變量的作用域,extern可以將全局變量作用域擴展到其他文件,而不是限制全局變量的作用域。答案選擇C選項。

28有以下程序:

#include <stdio.h>
main()
{
  char *s="120119110";
  int n0,n1,n2,nn,i;
  n0=n1=n2=nn=i=0;
  do
  {
    switch(s[i++])
    {
      default:nn++;
      case '0':n0++;
      case '1':n1++;
      case '2':n2++;
    }
  }while(s[i]);
  printf("n0=%d,n1=%d,n2=%d,nn=%d\n",n0,n1,n2,nn);
}

程序的運行結果是(  )。

A.n0=3,n1=8,n2=9,nn=1

B.n0=2,n1=5,n2=1,nn=1

C.n0=2,n1=7,n2=10,nn=1

D.n0=4,n1=8,n2=9,nn=1

【答案】A

【解析】本題執行過程為:s[0]='1',匹配case '1',n1=1,n2=1;s[1]='2',匹配case '2',n2=2;s[2]='0',匹配case '0',n0=1,n1=2,n2=3;s[3]='1',匹配case '1',n1=3,n2=4;s[4]='1',匹配case '1',n1=4,n2=5;s[5]='9',匹配default,nn=1,n0=2,n1=5,n2=6;s[6]='1',匹配case '1',n1=6,n2=7;s[7]='1',匹配case '1',n1=7,n2=8;s[8]='0',匹配case '0',n0=3,n1=8,n2=9;s[9]='\0',退出循環。輸出n0,n1,n2,nn為3,8,9,1。答案選擇A選項。

29在最壞情況下(  )。

A.快速排序的時間復雜度比冒泡排序的時間復雜度要小

B.快速排序的時間復雜度比希爾排序的時間復雜度要小

C.希爾排序的時間復雜度比直接插入排序的時間復雜度要小

D.快速排序的時間復雜度與希爾排序的時間復雜度是一樣的

【答案】C

【解析】快速排序與冒泡排序的時間復雜度均為O(n2),A項錯誤;快速排序比希爾排序的時間復雜度要大(O(n2)>O(n1.5)),B、D項錯誤;希爾排序的時間復雜度比直接插入排序的時間復雜度要小(O(n1.5)<O(n2)),C項正確。答案選擇C選項。

30有以下程序:

#include <stdio.h>
main()
{
  int x=0x13;
  if(x=0x18)printf("T");
  printf("F");
  printf("\n");
}

程序運行后的輸出結果是(  )。

A.TF

B.T

C.F

D.TFT

【答案】A

【解析】x=0x18為賦值表達式,十六進制數0x18非0,故x非0,if條件成立輸出T,之后再輸出F與回車符。程序運行后的輸出結果是TF。答案選擇A選項。

31以下關于宏的敘述錯誤的是(  )。

A.宏替換不具有計算功能

B.宏是一種預處理指令

C.宏名必須用大寫字母構成

D.宏替換不占用運行時間

【答案】C

【解析】宏名習慣采用大寫字母,以便與一般變量區別,但是并沒有規定一定要用大寫字母,答案選擇C選項。

32有以下程序:

#include <stdio.h>
int fun(char *s)
{
  char *p=s;
  while(*p++!='\0');
  return(p-s);
}
main()
{
  char *p="01234";
  printf("%d\n",fun(p));
}

程序的運行結果是(  )。

A.6

B.5

C.4

D.3

【答案】A

【解析】程序執行過程為:定義字符串指針p并為其初始化為"01234",調用函數fun(p),將指針傳入函數。fun函數功能即返回字符串首地址與結束符下一個地址之差,也即是字符串長度加1。輸出地址差為6,答案選擇A選項。

33計算機軟件包括(  )。

A.算法和數據

B.程序和數據

C.程序和文檔

D.程序、數據及相關文檔

【答案】D

【解析】計算機軟件由兩部分組成:機器可執行的程序和數據;機器不可執行的,與軟件開發、運行、維護、使用等有關的文檔。答案選擇D選項。

34有以下程序:

#include <stdio.h>
main()
{
  int i, array[5]={3,5,10,4};
  for(i=0;i<5;i++)printf("%d,",array[i] &3);
  printf("\n");
}

程序運行后的輸出結果是(  )。

A.3,1,2,0,0,

B.3,5,10,4,0,

C.3,3,3,3,0,

D.3,2,2,2,0,

【答案】A

【解析】在對數組進行初始化時,如果在聲明數組時給出了長度,但沒有給所有的元素賦予初始值,那么C語言將自動對余下的元素賦初值0,則array={3,5,10,4,0}。按位與運算“&”,當參加運算的兩個二進制數的對應位都為1,則該位的結果為1,否則為0。將數組元素與3按位與,即3&3=3,5&3=1,10&3=2,4&3=0,0&3=0。for循環輸出與運算結果:3,1,2,0,0,。答案選擇A選項。

35以下敘述正確的是(  )。

A.do-while語句構成的循環,當while語句中的表達式值為0時結束循環

B.do-while語句和while-do構成的循環功能相同

C.while-do語句構成的循環,當while語句中的表達式值為非0時結束循環

D.do-while語句構成的循環,必須用break語句退出循環

【答案】A

【解析】B項錯誤,do-while語句先執行循環體,再判斷循環條件語句,while-do循環先判斷循環條件語句,再執行循環體;C項錯誤,do-while語句構成的循環,while語句中的表達式值為0時結束循環;D項錯誤,do-while語句除了可以使用break語句退出循環外,還可以使用循環條件語句,當不滿足循環條件時退出循環。答案選擇A選項。

36關于地址和指針,以下說法正確的是(  )。

A.通過強制類型轉換可以將一種類型的指針變量賦值給另一種類型的指針變量

B.可以取一個常數的地址賦值給同類型的指針變量

C.可以取一個表達式的地址賦值給同類型的指針變量

D.可以取一個指針變量的地址賦值給基類型相同的指針變量

【答案】A

【解析】常數的地址存儲在內存的常量區,常量區存儲的都是常量,值都是不可修改的,所以直接取常量的地址賦給指針變量沒有任何意義,C語言也不允許這樣做,編譯會出錯,B項錯誤;表達式的值存儲在臨時變量中,內存中存在專門用來存儲臨時變量的區域,對這塊地址進行操作也是沒有意義的,C語言不允許這樣做,編譯會出錯,C項錯誤;可以取一個指針變量的地址,但是指針變量的地址屬于指針,只能賦值給指針類型的指針變量,D項錯誤。答案選擇A選項。

37下面描述不屬于軟件特點的是(  )。

A.軟件是一種邏輯實體,具有抽象性

B.軟件在使用中不存在磨損、老化問題

C.軟件復雜性高

D.軟件使用不涉及知識產權

【答案】D

【解析】軟件具有以下特點:軟件是一種邏輯實體,具有抽象性;軟件沒有明顯的制作過程;軟件在使用期間不存在磨損、老化問題;軟件對硬件和環境具有依賴性;軟件復雜性高,成本昂貴;軟件開發涉及諸多的社會因素,如知識產權等。答案選擇D選項。

38以下程序的功能是:通過調用calc函數,把所求得的兩數之和值放入變量add中,并在主函數中輸出。

#include <stdio.h>
void calc(float x,float y,float *sum)
{
  ______=x+y;
}
main ()
{
  float x,y,add;
  scanf("%f%f",&x,&y);
  calc(x,y,&add);
  printf("x+y=%f\n",add);
}

calc函數中下劃線處應填入的是(  )。

A.*sum

B.sum

C.&sum

D.add

【答案】A

【解析】程序的執行過程為:從鍵盤讀入兩個float類型數據,分別賦給x,y,調用函數calc將x與y的值與add變量地址傳入函數,地址賦給指針sum,函數體中將兩數之和放入指針指向的地址,指針正確的引用形式為:*sum,這表示變量,可以被賦值。所以橫線處填寫*sum。答案選擇A選項。

39有以下程序:

#include <stdio.h>
main()
{
  char c;
  for(;(c=getchar())!='#';)putchar(++c);
}

執行時如輸入為:abcdefg##<回車>,則輸出結果是(  )。

A.abcdefg

B.bcdefgh$

C.bcdefgh$$

D.bcdefgh

【答案】D

【解析】for循環每次將函數getchar()的輸入值賦給變量c,如果不等于'#',則執行putchar(++c),即將當前變量c的ASCII碼加1后,再輸出改變后的變量c的值。當變量c的值等于'#',則終止循環,所以輸出應該是bcdefgh。答案選擇D選項。

40有以下程序:

#include <stdio.h>
void fun(int *x,int s, int e)
{
  int i,j,t;
  for(i=s,j=e;i<j;i++,j--)
  {
    t=*(x+i);
    *(x+i)=*(x+j);
    *(x+j)=t;
  }
}
main()
{
  int m[]={0,1,2,3,4,5,6,7,8,9},k;
  fun(m,0,3);
  fun(m+4,0,5);
  fun(m,0,9);
  for(k=0;k<10;k++)printf("%d",m[k]);
}

程序的運行結果是(  )。

A.4567890123

B.3210987654

C.9876543210

D.0987651234

【答案】A

【解析】程序的執行過程為:定義數組m,并為其賦初值,數組長度為10。調用函數fun(m,0,3)將數組首地址傳入函數,函數實現將數組下標值從0到3的元素首尾倒置,for循環結束之后數組為m={3,2,1,0,4,5,6,7,8,9}。調用函數fun(m+4,0,4)將數組下標值為4的元素地址傳入函數,函數實現將數組下標值從4到9的元素首尾倒置,for循環結束之后數組為m={3,2,1,0,9,8,7,6,5,4}。調用函數fun(m,0,9)將數組首地址傳入函數,函數實現將數組下標值從0到9的元素首尾倒置,for循環結束之后數組為m={4,5,6,7,8,9,0,1,2,3}。依次輸出數組元素,結果為4567890123。答案選擇A選項。

二、程序填空題(共18分)

下列給定程序的功能是調用fun函數建立班級通信錄。通信錄中記錄每位學生的編號、姓名和電話號碼。班級人數和學生信息從鍵盤讀入,每個人的信息作為一個數據塊寫到名為myfile5.dat的二進制文件中。

請在程序的下畫線處填入正確的內容并將下畫線刪除,使程序得出正確的結果。

注意:

不得增行或刪行,也不得更改程序的結構!

【試題源程序】

#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct
{
  int num;
  char name[10];
  char tel[10];
}STYPE;
void check();
/**********found**********/
int fun(______ *std)
{
  /**********found**********/
  ______ *fp; int i;
  if((fp=fopen("myfile5.dat","wb"))==NULL)return(0);
  printf("\nOutput data to file! \n");
  for(i=0;i<N;i++)
    /**********found**********/
    fwrite(&std[i],sizeof(STYPE),1, ______);
  fclose(fp);
  return(1);
}
void main()
{
  STYPE s[10]={ {1,"aaaaa","111111"}, {1,"bbbbb","222222"}, {1,"ccccc","333333"}, {1,"ddddd","444444"}, {1,"eeeee","555555"} };
  int k;
  k=fun(s);
  if(k==1)
  {
    printf("Succeed!");
    check();
  }
  else printf("Fail!");
}

void check()
{
  FILE *fp; int i;
  STYPE s[10];
  if((fp=fopen("myfile5.dat","rb"))==NULL)
  {
    printf("Fail! \n");
    exit(0);
  }
  printf("\nRead file and output to screen: \n");
  printf("\n num name tel\n");
  for(i=0;i<N;i++)
  {
    fread(&s[i],sizeof(STYPE),1,fp);
    printf("%6d %s %s\n",s[i].num, s[i].name,s[i].tel);
  }
  fclose(fp);
}

答:

STYPE

FILE

fp

【解析】

填空1:根據主函數中的調用函數fun(s)可知,函數fun()的形參應為結構體類型,因此填入STYPE。

填空2:fp是指向文件類型的指針變量,因此填入FILE。

填空3:函數fwrite調用的一般形式為“fwrite(buffer,size,count,fp);”,其中,fp表示文件指針。

三、程序修改題(共18分)

下列給定程序中,函數fun的功能是:從s所指字符串中,找出t所指字符串的個數作為函數值返回。例如,當s所指字符串中的內容為“abcdabfab”,t所指字符串的內容為“ab”,則函數返回整數3。

請改正程序中的錯誤,使它能得出正確的結果。

注意:

不要改動main函數,不得增行或刪行,也不得更改程序的結構!

【試題源程序】

#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
int fun(char *s, char *t)
{
  int n;
  char *p,*r;
  n=0;
  while(*s)
  {
    p=s;
    r=t;
    while(*r)
      /**********found**********/
      if(*r==*p){r++; p++}
      else break;
    /**********found**********/
    if(r=='\0')
      n++;
    s++;
    }
    return n;
}
void main()
{
  char s[100],t[100]; int m;
  system("CLS");
  printf("\nPlease enter strings:");
  scanf("%s",s);
  printf("\nPlease enter substrings:");
  scanf("%s",t);
  m=fun(s,t);
  printf("\nThe result is:m=%d\n", m);
}

答:

(1)錯誤:if(*r==*p){r++;p++}

正確:if(*r==*p){r++;p++;}

(2)錯誤:if(r=='\0')

正確:if(*r=='\0')

【解析】

錯誤1:在經過“if”判斷后執行后面括號內的語句時,每條語句應以“;”做結尾,“p++”后面沒有分號即是錯誤。

錯誤2:該題目中定義*r為指針變量,r為指針名稱,對其所指內容進行判斷時應加“*”。

四、程序設計題(共24分)

請編一個函數void fun(int tt[M][N],int pp[N]),tt指向一個M行N列的二維數組,求出二維數組每列中最大元素,并依次放入pp所指的一維數組中。二維數組中的數已在主函數中給出。

注意:

請勿改動主函數main和其他函數中的任何內容,僅在函數fun的花括號中填入你編寫的若干語句。

【試題源程序】

#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#define M 3
#define N 4
void fun(int tt[M][N],int pp[N])
{
 
}
void main()
{
  int t[M][N]={{68,32,54,12},{14,24,88,58},{42,22,44,56}};
  int p[N],i,j,k;
  system("CLS");
  printf("The riginal data is:\n");
  for(i=0;i<M;i++)
  {
    for(j=0;j<N;j++)printf("%6d",t[i][j]);
    printf("\n");
  }
  fun(t,p);
  printf("\nThe result is:\n");
  for(k=0;k<N;k++)printf("%4d",p[k]);
  printf("\n");
}

答:

void fun(int tt[M][N],int pp[N])
{
  int i,j,max;
  if(tt==NULL||pp==NULL)return;
  for(j=0;j<N;j++)
  {
    max=tt[0][j];/*假設各列中的第一個元素最大*/
    for(i=1;i<M;i++)if(tt[i][j]>max)max=tt[i][j];/*如果各列中的其他元素比最大值大,則將這個更大的元素看作當前該列中最大元素*/
    pp[j]=max;/*將各列的最大值依次放入pp數組中*/
  }
}

【解析】根據題意可知,fun函數實現的功能是對給定二維數組中每列的元素進行比較,得出最大值后依次輸出至一維數組中。設計思路如下:定義一個最大值變量max,首先將每列的第一個元素設為最大值,然后將最大值max與第二個元素比較,較大值賦給max;以此類推,將max依次與第三,…,M個元素比較,得出該列最大值,并進行輸出。

主站蜘蛛池模板: 哈巴河县| 镇沅| 方正县| 高尔夫| 讷河市| 军事| 乌兰浩特市| 邹平县| 洛扎县| 平塘县| 双江| 曲水县| 崇信县| 陇川县| 岑巩县| 蒲城县| 塘沽区| 镇康县| 安陆市| 芜湖市| 凭祥市| 宁都县| 竹溪县| 高唐县| 上虞市| 黔西| 微博| 安多县| 平南县| 青神县| 洪湖市| 城固县| 郸城县| 凤城市| 灵山县| 尚义县| 巫山县| 曲周县| 喀喇沁旗| 绥江县| 巨鹿县|