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

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

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

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

1下列關于C語言文件的敘述中正確的是(  )。

A.文件由一系列數據依次排列組成,只能構成二進制文件

B.文件由結構序列組成,可以構成二進制文件或文本文件

C.文件由數據序列組成,可以構成二進制文件或文本文件

D.文件由字符序列組成,其類型只能是文本文件

【答案】C

【解析】C語言將文件看作是一個字符(字節)的序列,即由一個一個字符(字節)數據順序組成。根據數據的組成形式,可將文件分為兩種:ASCII文件,又稱文本(text)文件,它的每一個字節可放一個ASCII碼,代表一個字符;二進制文件,是把內存中的數據按其在內存中的存儲形式原樣輸出到磁盤上存放。所以C文件就是一個字節流或一個二進制流。答案選擇C選項。

2有以下程序:

#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

【解析】m和n的值不變,分別是1,2;指針*p和*q交換了指向的位置,即*p=&n,*q=&m,分別為2,1。答案選擇B選項。

3有以下程序:

#include <stdio.h>
#include <string.h>
struct A
{
  int a;
  char b[10];
  double c;
};
struct A f(struct A t);
main()
{
  struct A a={1001,"ZhangDa",1098.0};
  a=f(a);
  printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
struct A f(struct A t)
{
  t.a=1002;
  strcpy(t.b,"ChangRong");
  t.c=1202.0;
  return t;
}

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

A.1001,ZhangDa,1098.0

B.1002,ZhangDa,1202.0

C.1001,ChangRong,1098.0

D.1002,ChangRong,1202.0

【答案】D

【解析】函數f對結構體成員進行修改,并返回新的結構體;main函數先定義了一個結構體變量a并為它賦初值,然后調用函數f修改結構體變量的成員值,最后輸出新的結構體變量成員值。答案選擇D選項。

4數據庫管理系統是(  )。

A.操作系統的一部分

B.系統軟件

C.一種編譯系統

D.一種通信軟件系統

【答案】B

【解析】系統軟件主要包括:操作系統軟件;各種語言的解釋程序和編譯程序;各種服務性程序;各種數據庫管理系統。數據庫管理系統是一種系統軟件,負責數據庫中的數據組織、數組操縱、數據維護、控制和保護以及數據服務等。答案選擇B選項。

5有以下程序:

#include <stdio.h>
void fun(int p)
{
  int d=2;
  p=d++;
  printf("%d",p);
}
main()
{
  int a=1;
  fun(a);
  printf("%d\n",a);
}

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

A.32

B.12

C.21

D.22

【答案】C

【解析】C語言中函數參數傳遞滿足“單向傳遞”,實現傳遞值的功能,實參能傳給形參,形參卻不能傳回給實參。fun函數體內輸出p的值為2,并不影響到fun函數外a的值,a的值在main函數內依然為1。答案選擇C選項。

6有以下程序:

#include <stdio.h>
#define f(x) x*x*x
main()
{
  int a=3,s,t;
  s=f(a+1);
  t=f((a+1));
  printf("%d,%d\n",s,t);
}

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

A.10,64

B.10,10

C.64,10

D.64,64

【答案】A

【解析】C語言中帶參數的宏可以理解為用參數直接替換定義式中的變量,而不經過任何修改。所以s=f(a+1)=a+1*a+1*a+1=3+3+3+1=10,t=f((a+1))=(a+1)*(a+1)*(a+1)=4×4×4=64,所以有無括號的運算結果是不同的。故答案選擇A選項。

7有以下程序:

#include<stdio.h>
main()
{
  int a[]={2,3,5,4},i;
  for(i=0;i<4;i++)
    switch(i%2)
    {
      case 0:switch(a[i]%2)
            {
              case 0:a[i]++;break;
              case 1:a[i]--;
            } break;
      case 1:a[i]=0;
    }
  for(i=0;i<4;i++) printf("%d",a[i]);
  printf("\n");
}

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

A.3344

B.2050

C.3040

D.0304

【答案】C

【解析】main函數的主體是一個for循環語句,for循環中包含一個switch語句,如果判斷條件為0則進入第二個switch語句,如果判斷語句為1則執行“a[i]=0”,最后將數組順序輸出。所以程序功能是將數組下標為奇數的項設為0,數組下標為偶數的項,如果對應的元素為偶數則加1,如果對應的元素為奇數則減1。答案選擇C選項。

8若有以下程序段:

int r=8;
printf("%d\n",r>>1);

輸出結果是(  )。

A.16

B.8

C.4

D.2

【答案】C

【解析】C語言中,“>>”右移運算符是將變量轉換成二進制,然后右移相應位數,將移出的位信息舍去,并在高位補0,將所得的結果再賦值給變量。本題十進制數8轉換為二進制數為00001000,右移一位得到00000100,再轉換成十進制數就是4。所以答案選擇C選項。

9有以下定義語句,編譯時會出現編譯錯誤的是(  )。

A.char a='a';

B.char a='\n';

C.char a='aa';

D.char a='\x2d';

【答案】C

【解析】本題中a為一個字符型變量,只能為其賦值一個字符常量,A項編譯可以通過。C項中'aa'不是字符常量,而是一個字符串,所以會編譯錯誤。BD兩項為轉義字符,編譯可以通過。答案選擇C選項。

10下面結構體的定義語句中,錯誤的是(  )。

A.struct ord{int x;int y;int z;};struct ord a;

B.struct ord{int x;int y;int z;}struct ord a;

C.struct ord{int x;int y;int z;}a;

D.struct {int x;int y;int z;}a;

【答案】B

【解析】C語言中結構體變量的定義有三種方法:定義結構體類型的同時定義結構體變量,如C項;使用無名結構體類型定義結構體變量,如D項;先定義結構體類型,后定義結構體變量,如A項,B項錯在分別定義結構體類型與結構體變量時需要用“;”隔開。故答案選擇B選項。

11有以下程序:

#include <stdio.h>
#include <string.h>
main()
{
  char a[10]="abcd";
  printf("%d,%d\n",strlen(a),sizeof(a));
}

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

A.7,4

B.4,10

C.8,8

D.10,10

【答案】B

【解析】在C語言中,strlen()用來統計字符串中字符的個數(不包含字符串結束標志'\0'),sizeof()用來求分配給數組的存儲空間大小。題目中字符串a中字符個數為4,但由于數組a定義含有10個字符,所以所占空間大小為10。所以答案選擇B選項。

12以下函數findmax擬實現在數組中查找最大值并作為函數值返回,但程序中有錯導致不能實現預定功能。

#define MIN -2147483647
int fingmax (int x[],int n)
{
  int i,max;
  for(i=0;i<n;i++)
  {
    max=MIN;
    if(max<x[i])max=x[i];
  }
  return max;
}

造成錯誤的原因是(  )。

A.定義語句int i,max;中max未賦初值

B.賦值語句max=MIN;中,不應給max賦MIN值

C.語句if(max<x[i]) max=x[i];中判斷條件設置錯誤

D.賦值語句max=MIN;放錯了位置

【答案】D

【解析】本題中for循環中首先將MIN值賦值給max,然后用x[i]與max的值比較。每次都是將MIN值與x[i]值進行比較,所以無論x[i]的值是什么,都不會影響if的判斷語句,max=x[i]始終執行。所以函數返回的是數組中最后一個元素的值。程序的錯誤在于max=MIN的位置,for循環之前應先執行max=MIN。所以答案選擇D選項。

13設有定義:char *c;,以下選項中能夠使字符型指針c正確指向一個字符串的是(  )。

A.char str[]="string";c=str;

B.scanf("%s",c);

C.c=getchar();

D.*c="string";

【答案】A

【解析】B,C選項均為輸入函數,其表達意思為輸入字符串c。B項中scanf()函數是將c定義為一個字符數組的數組名;C項中是將c定義為一個字符型變量;D項中是需要在指針定義時為它賦值,因此是不合法的,所以BCD三項都不正確。A項定義字符數組str,再將字符數組str的首地址賦給字符型指針c,正確。所以答案選擇A選項。

14軟件詳細設計產生的圖如下:

該圖是(  )。

A.N-S圖

B.PAD圖

C.程序流程圖

D.E-R圖

【答案】C

【解析】N-S圖是由若干基本框圖構成的流程圖,其特點是沒有流程線;PAD圖即問題分析圖,它是一種由左往右展開的二維樹形結構;程序流程圖用于描述問題解決的過程和步驟,其中方框表示處理步驟,菱形框表示邏輯判斷,箭頭表示控制流向;E-R圖即實體-聯系圖,用來描述現實世界的概念模型,構成元素有實體、屬性和聯系,分別用矩形、橢圓形和菱形表示。答案選擇C選項。

15下列函數的功能是(  )。

fun(char * a,char * b)
{
  while((*b= *a)!='\0')
  {
    a++;
    b++;
  }
}

A.將a所指字符串賦給b所指空間

B.使指針b指向a所指字符串

C.將a所指字符串和b所指字符串進行比較

D.檢查a和b所指字符串中是否有'\0'

【答案】A

【解析】函數fun中a和b是兩個字符型指針,在while語句的表達式中將指針a所指向的字符賦給指針b所指向的內存單元,再判斷指針b所指向的字符是不是字符串中的結尾符,若不是,則字符指針a和b分別自增,再執行循環語句,直至b所指向的字符為字符串中的空字符。所以答案選擇A選項。

16表達式:(int)((double)9/2)-9%2的值是(  )。

A.0

B.3

C.4

D.5

【答案】B

【解析】運算符“/”“%”的優先級高于“-”,所以先進行除法和求余運算,再進行減法運算。強制類型轉換表達式的形式:(類型名)(表達式)。“9/2”結果為4,轉換成double類型再轉換成int類型結果依然為4,9%2的結果為1,最后結果為4-1=3。答案選擇B選項。

17有以下程序:

#include <stdio.h>
#include<string.h>
main()
{
  char str[][20]={"One*World","One*Dream!"},*p=str[1];
  printf("%d,",strlen(p));
  printf("%s\n",p);
}

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

A.9,One*World

B.9,One*Dream!

C.10,One*Dream!

D.10,One*World

【答案】C

【解析】程序將兩個字符串常量賦值給一個二維字符數組,然后p指向第二個字符串。strlen統計字符串中有效字符的個數,可知"One*Dream!"中共有10個字符。所以答案選擇C選項。

18對于循環隊列,下列敘述中正確的是(  )。

A.隊頭指針是固定不變的

B.隊頭指針一定大于隊尾指針

C.隊頭指針一定小于隊尾指針

D.隊頭指針可以大于隊尾指針,也可以小于隊尾指針

【答案】D

【解析】在循環隊列中,用隊尾指針(rear)指向隊列中的隊尾元素,用隊頭指針(front)指向隊頭元素的前一個位置。在循環隊列中,一般情況下rear>front,當存儲空間的最后一個位置被使用,而新元素要入隊時,如果存儲空間的第一個位置空閑,便可將元素插入到第一個位置,此時存儲空間的第一個位置作為隊尾,便有front>rear。所以答案選擇D選項。

19有以下程序:

#include <stdio.h>
int f(int n);
main()
{
  int a=3,s;
  s=f(a);
  s=s+f(a);
  printf("%d\n",s);
}
int f(int n)
{
  static int a=1;
  n+=a++;
  return n;
}

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

A.7

B.8

C.9

D.10

【答案】C

【解析】在函數f中,整型變量a為靜態變量,所以每次調用函數f時不再為a重新賦值,而且a的值只有在程序結束時才被釋放。第一次調用f后n=4,a=2,s=4;第二次調用時,a初值為2,調用后,a=3,n=5,s=4+5=9,所以輸出結果為9。答案選擇C選項。

20有以下程序:

#include <stdio.h>
main()
{
  int c=0,k;
  for(k=1;k<3;k++)
    switch(k)
    {
      default:c+=k;
      case 2:c++;break;
      case 4:c+=2;break;
    }
  printf("%d\n",c);
}

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

A.3

B.5

C.7

D.9

【答案】A

【解析】程序進入for循環后,首先k=1,執行default語句,c變為1。由于default語句之后沒有break語句,因此繼續執行case 2,c變為2,之后執行break語句跳出本次循環。下次循環k=2,直接執行case 2,c自增為3后跳出本次循環。k=3時for循環結束,最后輸出3。答案選擇A選項。

21有三個關系R,S和T如下:

其中關系T由關系R和S通過某種操作得到,該操作為(  )。

A.選擇

B.投影

C.交

D.并

【答案】D

【解析】選擇和投影操作對單個關系進行操作,選擇運算是對行的操作,投影運算是對列的操作。交和并運算要求參與運算的表具有相同的屬性,交運算的結果是兩個表的公共部分,并運算的結果包含兩個表的所有元素。觀察三個關系的元組可知,關系T=R∪S。答案選擇D選項。

22下面是有關C語言字符數組的描述,其中錯誤的是(  )。

A.不可以用賦值語句給字符數組名賦字符串

B.可以用輸入語句把字符串整體輸入給字符數組

C.字符數組中的內容不一定是字符串

D.字符數組只能存放字符串

【答案】D

【解析】C語言中,字符數組可以用來存放單個的字符或者字符串。答案選擇D選項。

23若有定義語句:

int a[4][10],*p,*q[4];

且0≤i<4,則錯誤的賦值是(  )。

A.p=a

B.q[i]=a[i]

C.p=a[i]

D.p=&a[2][1]

【答案】A

【解析】二維數組名是指向指針的指針,所以a和q都為指向指針的指針,而p為指向int類型的指針,p和a不同類型,故A選項中p=a賦值語句錯誤。其余選項可以正確賦值,其中D項是用取地址符&返回整數的地址,然后賦值給p。所以答案選擇A選項。

24以下程序段中,與語句:

k=a>b?(b>c?1:0):0;

功能相同的是(  )。

A.

if((a>b) && (b>c)) k=1;

else k=0;

B.

if((a>b) || (b>c)) k=1;

else k=0;

C.

if(a<=b) k=0;

else if(b<=c) k=1;

D.

if(a>b) k=1;

else if(b>c) k=1;

else k=0;

【答案】A

【解析】三元運算符表達式的形式為:表達式1?表達式2:表達式3,當表達式1的值為真時,結果為表達式2的值;當表達式1的值為假時,結果為表達式3的值。首先判斷a、b的關系:如果a>b,執行語句(b>c?1:0);判斷b、c的關系,如果b>c,k=1,否則k=0;如果a≤b,則k=0。綜上所述:當a>b且b>c時,k=1,否則k=0,與A項語句功能相同。答案選擇A選項。

25若有定義語句:

int x=10;

則表達式x-=x+x的值為(  )。

A.-20

B.-10

C.0

D.10

【答案】B

【解析】單目加運算符優先級高于賦值運算符,所以先做x+x結果為20,再做x-20,結果為-10,然后賦值給x。所以答案選擇B選項。

26有以下程序:

#include <stdio.h>
main()
{
  char s[]={"012xy"};
  int i,n=0;
  for(i=0;s[i]!='\0';i++)
    if(s[i]>='a'&&s[i]<='z')n++;
  printf("%d\n",n);
}

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

A.0

B.2

C.3

D.5

【答案】B

【解析】程序中main函數的作用就是判斷字符串s中小寫字母的個數,顯然結果為2。答案選擇B選項。

27下列選項中不屬于結構化程序設計原則的是(  )。

A.可封裝

B.自頂向下

C.模塊化

D.逐步求精

【答案】A

【解析】結構化程序設計的基本原則包括:模塊化;自頂向下;逐步求精;限制使用goto語句。可封裝是面向對象的設計思想。答案選擇A選項。

28有以下程序:

#include <stdio.h>
main()
{
  char c1,c2;
  c1='A'+'8'-'4';
  c2='A'+'8'-'5';
  printf("%c,%d\n",c1,c2);
}

已知字母A的ASCII碼為65,程序運行后的輸出結果是(  )。

A.E,68

B.D,69

C.E,D

D.輸出無定值

【答案】A

【解析】C語言中每個字符都對應一個ASCII碼值,該值可以用來運算。本題中main函數將字符A經過加四和加三運算后分別賦值給c1、c2,則c1='E',c2='D',然后將c1按字符格式輸出,c2按整型格式輸出。答案選擇A選項。

29算法的空間復雜度是指(  )。

A.算法在執行過程中所需要的計算機存儲空間

B.算法所處理的數據量

C.算法程序中的語句或指令條數

D.算法在執行過程中所需要的臨時工作單元數

【答案】A

【解析】算法的空間復雜度是指算法在執行過程中所需要的計算機存儲空間。包括算法程序所占空間,輸入的初始數據所占空間和執行過程中所需要的額外空間。答案選擇A選項。

30以下敘述中正確的是(  )。

A.程序設計的任務就是編寫程序代碼并上機調試

B.程序設計的任務就是確定所用數據結構

C.程序設計的任務就是確定所用算法

D.以上三種說法都不完整

【答案】D

【解析】程序設計是指設計、編程、調試程序的方法和過程,通常分為4個階段:問題建模;算法設計;編寫代碼;編譯調試。其工作內容涉及有關的基本概念、工具、方法及方法學,是目標明確的智力活動。答案選擇D選項。

31下列數據結構中,能夠按照“先進后出”原則存取數據的是(  )。

A.循環隊列

B.棧

C.隊列

D.二叉樹

【答案】B

【解析】棧和隊列都是操作受限的線性表:棧只能在棧頂插入和刪除元素,按照“先進后出”的原則組織數據;隊列只能在隊頭刪除元素,在隊尾插入元素,按照“先進先出”的原則組織數據。B項,棧,按照“先進后出”的原則組織數據。A項,循環隊列是隊列的一種特殊形式,按照“先進先出”的原則組織數據;C項,隊列,按照“先進先出”的原則組織數據。D項,二叉樹屬于非線性結構。答案選擇B選項。

32有以下程序:

#include <stdio.h>
main()
{
  int a=1,b=0;
  printf("%d,",b=a+b);
  printf("%d\n",a=2*b);
}

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

A.0,0

B.1,0

C.3,2

D.1,2

【答案】D

【解析】main函數先為a、b賦值,然后做運算a+b結果賦值給b,此時b為1,并將b打印出來。接著做運算2*b結果為2*1=2賦值給a,將a打印出來,所以最終的輸出結果為1,2。答案選擇D選項。

33以下選項中,能用作用戶標識符的是(  )。

A.void

B.8_8

C._0_

D.unsigned

【答案】C

【解析】標識符是由若干個字符組成的字符序列,用來命名程序的一些實體。C語言定義標識符應遵循以下六種規則:標識符由字母、數字或下劃線組成;第一個字符必須是字母或下劃線;標識符最多由274個字符組成;在標識符中嚴格區分大小寫字母;關鍵字不能作為自定義的標識符在程序中使用。A、D項皆為C語言的關鍵字,B項第一個字符為數字,錯誤。答案選擇C選項。

34軟件設計中劃分模塊的一個準則是(  )。

A.低內聚低耦合

B.高內聚低耦合

C.低內聚高耦合

D.高內聚高耦合

【答案】B

【解析】耦合性和內聚性是模塊獨立性的兩個定性標準。內聚性是一個模塊內部各個元素間彼此結合的緊密程度的度量,作為軟件結構設計的設計原則,要求每個模塊的內部都具有很強的內聚性;耦合性是指模塊間相互連接的緊密程度的度量,一個模塊與其他模塊的耦合性越強則該模塊的獨立性越弱。一般優秀的軟件設計應盡量做到高內聚、低耦合,即減弱模塊之間的耦合性和提高模塊內的內聚性,有利于提高模塊的獨立性。答案選擇B選項。

35設有以下函數:

void fun(int n,char* s){……}

則下面對函數指針的定義和賦值均是正確的是(  )。

A.void (* pf)();pf=fun;

B.void *pf();pf=fun;

C.void * pf(); *pf=fun;

D.void (* pf)(int,char);pf=&fun;

【答案】D

【解析】函數指針的一般定義形式為:

返回值類型 (* 指針變量名) ([形參列表]);

其中,“返回值類型”說明函數的返回類型,“(* 指針變量名)”中的括號不能省,括號改變了運算符的優先級。若省略整體則成為一個函數說明,說明了一個返回的數據類型是指針的函數,后面的“形參列表”表示指針變量指向的函數所帶的參數列表。

以本題函數和函數指針為例,將函數的首地址賦給指針,可以是pf=fun;或者pf=&fun;。

選項A,參數列表與題干函數不符,錯誤。選項B,函數指針定義格式錯誤。選項C。函數指針定義格式錯誤,復制格式也錯誤。答案選擇D選項。

36下列數據結構中,屬于非線性結構的是(  )。

A.循環隊列

B.帶鏈隊列

C.二叉樹

D.帶鏈棧

【答案】C

【解析】線性結構要滿足兩個條件:有且僅有一個根結點;每個結點最多有一個前驅,也最多有一個后繼。棧和隊列均滿足這兩個條件,屬于線性結構;循環隊列是一個頭結點和尾結點互為前驅結點和后繼結點的特殊的隊列,屬于線性結構;帶鏈隊列、帶鏈棧都是用鏈表形式來實現的,分別滿足隊列和棧的條件,只是存儲結構不連續,屬于線性結構。二叉樹除了葉子結點外,每個結點都可以有兩個后繼結點,屬于非線性結構。答案選擇C選項。

37閱讀以下程序:

#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選項。

38在E-R圖中,用來表示實體聯系的圖形是(  )。

A.橢圓形

B.矩形

C.菱形

D.三角形

【答案】C

【解析】在E-R圖中,菱形表示聯系,矩形表示實體,橢圓形表示屬性。答案選擇C選項。

39設有定義:

int a=1,b=2,c=3;

以下語句中執行效果與其他三個不同的是(  )。

A.if(a>b)c=a,a=b,b=c;

B.if(a>b){c=a,a=b,b=c;}

C.if(a>b)c=a;a=b;b=c;

D.if(a>b){c=a;a=b;b=c;}

【答案】C

【解析】C語言中if語句后面只跟一條語句時,可以省略大括號。即if語句僅作用于緊隨其后的那條語句或者是復合語句的內容,所以A項,執行三條語句組成的復合語句;BD兩項執行大括號中的三條語句;而C項只執行c=a;。答案選擇C選項。

40有以下程序:

#include <stdio.h>
main()
{
  int n=2,k=0;
  while(k++&&n++>2);
  printf("%d %d\n",k,n);
}

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

A.0 2

B.1 3

C.5 7

D.1 2

【答案】D

【解析】(表達式1)&&(表達式2)中,如果表達式1為假或0,那么表達式2就不會被執行。程序首先進入while的判斷語句,執行k++和n++。k++為零,不滿足循環條件,所以n++不會被執行,while循環結束后,k自增為1,n沒有進行運算,仍為2。答案選擇D選項。

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

N個有序整數數列已放在一維數組中,給定下列程序中,函數fun()的功能是:利用折半查找法查找整數m在數組中的位置。若找到,則返回其下標值;反之,則返回“Not be found!”。

折半查找法的基本算法是:每次查找前先確定數組中待確定的范圍:low和high(low<high),然后把m與中間位置(mid)中元素的值進行比較。如果m的值大于中間位置元素中的值,則下一次的查找范圍放在中間位置之后的元素中;反之,下次查找范圍落在中間位置之前的元素中。直到low>high,查找結束。

注意:

請勿改動主函數main和其他函數中的任何內容,僅在函數fun的橫線上填入所編寫的若干表達式或語句。

【試題源程序】

#include<stdio.h>
#define N 10
int fun(int a[],int m)
{
  int low=0,high=N-1,mid;
  while(low<=high)
  {
    /**********found**********/
    mid= ______;
    if(m<a[mid])
      /**********found**********/
      high= ______;
    else if(m>a[mid])
      low=mid+1;
    else
      return(mid);
  }
  /**********found**********/
  ______(-1);
}
main()
{
  int i,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m;
  printf("a數組中的數據如下:");
  for(i=0;i<N;i++)printf("%d ",a[i]);
  printf("Enter m:");
  scanf("%d",&m);
  k=fun(a,m);
  if(k>=0)
    printf("m=%d,index=%d\n",m,k);
  else
    printf("Not be found\n");
}

答:

(low+high)/2

mid-1

return

【解析】

填空1:此處要確定折半查找的中間位置,所以應該填(low+high)/2,這個式子的運算結果為整型數據。

填空2:由折半查找的算法可得,中間的元素值大,則應該選擇前半段進行查找,所以此處應該把mid前一位的下標賦值給high。

填空3:由算法可以看出,此處應該是執行完畢,仍然沒有找到滿足條件的元素,此時應當返回-1,所以使用關鍵字“return”。

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

下列給定程序中,函數fun()的功能是計算并輸出high以內的素數之和。high由主函數傳給fun( )函數。例如:若high的值為100,則函數的解為1060。

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

注意:

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

【試題源程序】

#include<conio.h>
#include<stdio.h>
#include<math.h>
int fun(int high)
{
  int sum=0,n=0,j,yes;
  while(high>=2)
  {
    yes=1;
    for(j=2;j<=high/2;j++)
      /**********found**********/
      if high%j==0
      {
        yes=0;
        break;
      }
    /**********found**********/
    if(yes==0)
    {
      sum+=high;
      n++;
    }
    high--;
  }
  return sum;
}
main()
{
  printf("%d\n",fun(100));
}

答:

(1)錯誤:if high%j==0

正確:if(high%j==0)

(2)錯誤:if(yes==0)

正確:if(yes)

【解析】fun函數的功能是:用while循環查找high以內的素數。通過for循環判斷一個數是否為素數;用變量n記錄素數的個數;用return返回素數之和sum。

錯誤1:if語句的兩側要加括號。

錯誤2:yes為1時,說明被判斷的數是素數,要累加到sum。

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

請編寫函數fun,其功能是:計算并輸出3到n之間(含3和n)所有素數的平方根之和。例如,在主函數中從鍵盤給n輸入100后,輸出為:sum=148.874270。

注意:

要求n的值大于2但不大于100。部分源程序給出如下。

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

【試題源程序】

#include <math.h>
#include <stdio.h>
double fun(int n)
{
 
}
main()
{
  int n;
  double sum;
  printf("\n\nInput n: ");
  scanf("%d",&n);
  sum=fun(n);
  printf("\n\nsum=%f\n\n",sum);
}

答:

double fun(int n)
{
  int i,j=0;
  double s=0;
  for(i=3;i<=n;i++)
  {
    int flag=1;
    for(j=2;j<=i/2;j++)
      if(i%j==0)
      {
        flag=0;
        break;
      }
    if (flag)
      s=s+sqrt(i);
  }
  return s;
}

【解析】程序是計算并輸出3到n之間(含3和n)所有素數的平方根之和,所以fun應當具有判斷一個數是否為素數的功能,可以利用sqrt()函數求一個數的平方根。

推薦閱讀
  1. 2019年11月全國計算機技術與軟件專業技術資格(水平)考試《系統集成項目管理工程師(中級)》復習全書【核心講義+歷年真題詳解】
  2. 全國職稱計算機考試標準教材與專用題庫:Excel 2007中文電子表格
  3. 2013全國計算機等級考試新版無紙化上機考試臨考沖刺模擬實戰:二級Access數據庫
  4. 全國職稱計算機考試標準教材與專用題庫:Excel 2003中文電子表格
  5. 2020年3月全國計算機等級考試《二級Visual Basic語言程序設計》【教材精講+真題解析】講義與視頻課程【46小時高清視頻】
  6. 2020年3月全國計算機等級考試《三級網絡技術》【教材精講+真題解析】講義與視頻課程【28小時高清視頻】
  7. 全國計算機等級考試全真模擬考場:二級C語言
  8. 5天通過職稱計算機考試(考點視頻串講+全真模擬):Excel 2003中文電子表格(第2版) (全國專業技術人員計算機應用能力考試指導叢書)
  9. 全國計算機等級考試模擬考場二級Python
  10. 全國計算機等級考試《二級C語言程序設計》【教材精講+真題解析】講義與視頻課程【45小時高清視頻】
  11. 2024年全國計算機等級考試模擬考場二級C語言
  12. 全國職稱計算機考試標準教材與專用題庫:中文Windows 7操作系統
  13. 2020年3月全國計算機等級考試《二級Visual Basic語言程序設計》歷年真題與模擬試題詳解
  14. 信息系統項目管理師歷年真題解析(第4版)
  15. 全國計算機等級考試歷年真題與機考題庫:三級網絡技術
主站蜘蛛池模板: 库伦旗| 太保市| 崇文区| 武山县| 宜兰县| 兴文县| 鹰潭市| 白河县| 宁安市| 泸州市| 西畴县| 兴文县| 洪江市| 天全县| 化隆| 柞水县| 平塘县| 沂源县| 湘阴县| 应城市| 怀仁县| 金昌市| 内乡县| 鄂州市| 苍南县| 祁门县| 宜阳县| 永新县| 巴楚县| 扶沟县| 依安县| 科技| 宁波市| 怀宁县| 凤冈县| 右玉县| 金湖县| 玛曲县| 东港市| 白银市| 河东区|