c語言面試題及答案

c語言面試題及答案

  導讀:C語言是一門通用計算機程式語言,應用廣泛。在面試的時候刷一遍題庫,能夠幫助你加深各方面的知識點,使自己面試成功的機率更大。下面小編為大家帶來c語言面試題及答案,希望能幫助到大家。

  一、選擇題(1)~(10)每小題2分,(11)~(50)每小題1分,共60分)

  在下列各題A)、B)、C)、D)四個選項中,只有一個選項是正確的,請將正確的選項塗寫在答題卡相應的位置上,答在試卷上不得分。

  (1)在資料結構中,從邏輯上可以把資料結構分為_______。

  A)動態結構和靜態結構      B)緊湊結構和非緊湊結構

  C)線性結構和非線性結構    D)內部結構和外部結構

  答案:C

  評析:邏輯結構反映資料元素之間的邏輯關係,線性結構表示資料元素之間一對一的關係,非線性結構表示資料元素之間一對多或多對一的關係。

  (2)若進棧序列為l,2,3,4,進棧過程中可以出棧,則下列選項中不可能的一個出棧序列是_______。

  A)1,4,3,2    B)2,3,4,l

  C)3,1,4,2    D)3,4, 2,1

  答案:C

  評析:棧是一種後進先出表,在選項c中,先出棧的是3,說明此時棧內必然有1,2,由於l先於2進棧,所以l不可能在2之前出棧,故選項C這種出棧序列是不可能的。

  (3)排序方法中,將整個無序序列分割成若干小的子序列並分別進行插入排序的方法,稱為_______。

  A)希爾排序    B)氣泡排序    C)插入排序    D)選擇排序

  答案:A

  評析:希爾排序法的基本思想是:將整個無序序列分割成若干小的子序列分別進行插入排序。

  (4)在順序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查詢關鍵碼值11,所需的關鍵碼比較次數為_______。

  A)2      B)3       C)4        D)5

  答案:C

  評析:二分法查詢是用關鍵碼與線性表的中間元素比較,然後根據比較結果來判斷是結束查詢,還是在左邊或者右邊子表按相同的方法繼續查詢。本題中,與ll比較的關鍵碼分別為15,8,10,12四個。

  (5)對於n個結點的單向連結串列(無表頭結點),需要指標單元的個數至少為_______。

  A)n-1    B)n    C)n+l      D)2n

  答案:C

  評析:在n個結點的單向連結串列(無表頭結點)中,每個結點都有一個指標單元(即指標域),加上頭指標,至少需要n+1個指標單元。

  (6)在軟體開發過程中,軟體結構設計是描述_______。

  A)資料儲存結構     B)軟體體系結構    C)軟體結構測試    D)軟體控制過程

  答案:B

  評析:從工程管理的角度來看,軟體設計分為兩步完成:概要設計和詳細設計。概要設計(又稱結構設計)將軟體需求轉化為軟體體系結構、確定系統級介面、全域性資料結構或資料庫模式。

  (7)模組本身的內聚是模組獨立性的重要性度量因素之一。在7類內聚中,具有最強內聚    的一類是_______。

  A)順序性內聚     B)過程性內聚      C)邏輯性內聚    D)功能性內聚

  答案:D

  評析:內聚性是一個模組內部各元素間彼此結合的緊密程度的度量。內聚共有7類,它們之間的內聚性由弱到強排列順序為:偶然內聚、邏輯內聚、時間內聚、過程內聚、通訊內聚、順序內聚和功能內聚。

  (8)資料儲存和資料流都是_______,僅僅是所處的狀態不同。

  A)分析結果    B)事件    C)動作    D)資料

  答案:D

  評析:資料流圖有4種成分:源點或終點、處理、資料儲存和資料流。資料儲存是處於靜止狀態的資料,資料流是處於運動中的資料。

  (9)資料的完整性是指資料的正確性、有效性和_______。

  A)可維護性    B)獨立性    C)安全性    D)相容性

  答案:D

  評析:資料模型的完整性規則是給定的資料模型中資料及其聯絡所具有的制約和依存規則,用以限定符合資料模型的資料庫狀態及其狀態的變化,以保證資料的正確性、有效性和相容性。

  (10)關係代數運算是以_______為基礎的運算。

  A)關係運算    B)謂詞運算    C)集合運算     D)代數運算

  答案:C

  評析:關係代數運算是以關係代數作為運算物件的一組高階運算的集合。它的基本操作是並、交、差、笛卡爾積,另外還包垂直分割(投影)、水平分割(選擇)、關係的結合(連線)等。

  (11)能將高階語言程式轉換成目標語言程式的是_______。

  A)除錯程式    B)解釋程式    C)編譯程式      D)編輯程式

  答案:C

  評析:用高階語言編寫的程式稱為“源程式”,而計算機只能識別和執行由0和l組成的二進位制指令,所以高階語言必須先用一種稱為“編譯程式”的軟體,把源程式翻譯成二進位制形式的“目標程式”。

  (12) _______是構成c語言程式的基本單位。

  A)函式    B)過程    C)子程式       D)子例程

  答案:A

  評析:c程式是由函式構成的。一個c源程式至少包含一個main函式,也可以包含一個main函式和若干個其他函式,因此,函式是c程式的基本單位。

  (13)可以在C語言中用做使用者識別符號的是_______。

  A)void    B)as_b3    C)for        D)2c

  define    _123       -abc        Do

  WORD       If        cas         SIG

  答案:B

  評析:在c語言中規定,識別符號只能由字母、數字和下劃線三種符號所組成,而且第一個字元必須是字母或下劃線。另外還需要注意的是關鍵字不能作識別符號。選項A中void,C中for都為關鍵字,D中2c以字母開頭。

  (14)若有以下型別說明語句:

  char w;int x;float y,z;

  則表示式w*x+z-y的結果為________型別。

  A)float    B)char     C)int   D)double

  答案:A

  評析:在進行運算時,不同型別的資料參加運算,需要先將其轉換成同一型別的資料,然後再進行運算。轉換的順序由低到高為:char,short→int→unsigned→long→double→float,故結果為float型。

  (15)main(()

  {  float x=123A56;

  printf(“%-5.2f ”,x);

  }

  以上程式輸出的結果是________。

  A)123.4    B)123.5      C)123.45    D)123.46

  答案:D

  評析:f格式符,用來輸出實數,以小數的形式輸出。“%-m.nf”的含義是:輸出資料共佔m列,其中n位小數,如果輸出位數小於m。則右端補空格。如果總長度大於列數,則按實際情況四捨五入輸出。

  (16)下面語句的輸出結果是________。

  Printf(“%d\n”,strlen(“\t\”\065\xff\n”));

  A)14          B)8

  C)5           D)輸出項不合法,無正常輸出

  答案:C

  評析:在c語言中,以“\”開頭的字元均為跳脫字元,其中“\”後可跟l~3位八進位制數或在“\”後跟字母x及l~2位十六進位制數,以此來代表一個特定的字元。

  (17)下列程式的輸出結果是________。

  main()

  {  int a=0,b=0,c=0;

  if(++a>0lI++b>0)++c;

  printf(“\na=%d,b=%d,c=%d”,a,b,C);

  }

  A)a=0,b=0,c=0       B)a=l,b=l,c=1

  C)a=l,b=O, c=I       D)a=0, b=1.c=1

  答案:C

  評析:

  “︱︱”是或運算,它有個“短路”的特點需要特別注意,當“︱︱”運算子左邊的表示式的值為真時,則程式就不再對“︱︱”右邊的表示式的值去進行運算,而是使得整個表示式的值直接為真。

  (18)下列程式的輸出結果是_________。

  Main()

  {  int i;

  for(i=1;i+l;i++)

  {  if(i>4){printlf(”%d”,i++);break;}

  }

  printf(“%d”,i++);

  }

  A)55                    B)56

  C)程式錯誤,沒有輸出    D)迴圈條件永遠為真,死迴圈

  答案:B

  評析:本程式中有個for迴圈,但注意到for迴圈的條件是“i+l”,也就是隻要i+l的值為真(非零值均為真),就執行迴圈。當i=l的時,i+l的值為真,判斷if條件不成立,執行i++,輸出i的值為5。

  (19)下列程式的輸出結果是_________。

  #define A 100

  main()

  {  int i=O,sum=O;

  do{  if(I==(i/2)*2)continue;

  sum+=i;

  }while(++i<A);

  printf(“%d\n”,sum);

  }

  A)2500    B)2050    C)4    D)O

  答案:A

  評析:本題程式的功能是求1到_99之問(包括1和99)所有奇數之和。程式中的while迴圈的終止條件為++i=100,在while迴圈體內,如果i是偶數,則執行continue,跳過這一次迴圈,去執行下一次迴圈,否則求和。最後輸出的值是1到99之間(包括l和99)所有奇數之和(1+99)*50/2=2500。

  (20)下列程式的輸出結果是_________。

  main()

  {  int I=3;

  switch(i)

  { case 1:

  case 2:printf(”%d”,i);

  case 3:

  case 4:break;

  default:printf(”OK”);

  }

  }

  A)0    B)3    C)OK    D)沒有任何輸出

  答案:D

  評析:在本題中,i的值為3,由於“case 3:”後面沒有break語句,所以繼續向下執行“case 4:”後面的語句,由於“case 4:”後面的語句為break強行退出switch語句,所以,本題沒有任何輸出。

  (21)下列程式執行後的輸出結果是________。

  main()

  {  int m[][3]={1,4,7,2,5,8,3,6,9};

  int i,k=2:

  for(I=0;i<3;i++)

  {printf(”%d”,m[k][i]);}

  }

  A)456    B)258    C)369    D)789

  答案:C

  評析:根據二維陣列的定義得出:m[O][O]=1,m[O][1]=4,m[O][2]=7,m[1][0]=2,rail][1]=5,m[1][2]=8,m[2][0]=3,m[2][l]=6,m[2][2]=9,所以本題的輸出是第3行的值m[2][0],m[2][1],m[2][2],即369。

  (22)設已定義洱口k為int型別變數,則以下for迴圈語句_________。

  for(i=0;k=-1,k=1;i++,k++)

  printf(”****\n”);

  A)判斷迴圈結束的條件不合法    B)是無限迴圈

  C)迴圈一次也不執行            D)迴圈只執行一次

  答案:B

  評析:本題定義了一個for迴圈,它的迴圈變數是i,但由於本題並沒有去設定迴圈條件,所以迴圈的條件永遠預設為真,即無限次執行迴圈。

  (23)下面程式的輸出結果是___________。

  unsigned fun(unsigned num)

  {   unsigned k=1;

  do{

  k*=num%lO;

  num/=lO;

  }while(num);

  return(k);

  }

  main()

  {  unsigned n。26;

  printf(”%d\n”,fun(n));

  }

  A)0    B)4    C)12    D)無限次迴圈

  答案:C

  評析:本題定義了一個fun函式,用於num求和,具體執行過程如下:

  num=26:k=k*(num%10)=1*(26%10),所以k=6,num=num/10=2;

  num=2:k=k*(num%10)=6*(2%10),所以k=12,num=num/lO=O;

  num=O:while條件不成立,所以返回k的值12.

  (24)已知字母A的ASCII碼值是65,字母a的ASCII碼值是97,以下程式_______。

  main()

  {  char a=‘A’;

  int b=20;

  printf(“%d,%o”,(a=a+a,a+b,b),a+‘a’-‘A’,b);

  }

  A)表示式非法,輸出零或不確定值

  B)因輸出項過多,無輸出或輸出不確定值

  C)輸出結果為20,141

  D)輸出結果為20,141,20

  答案:C

  評析:本題中首先輸出逗號表示式“a=a+a,a+b,b”的值,即是20。然後以八進位制的形式輸出a+‘a’-‘A’的值為97對應的八進位制數141,由於最後一個表示式b沒有對應輸出格式的輸出項表列就不會輸出。

  (25)C語言函式返回值的型別是由__________決定的。

  A)return語句中的表示式型別    B)呼叫函式的主調函式型別

  C)呼叫函式時臨時               D)定義函式時所指定的函式型別

  答案:D

  評析:函式值的型別應當是在定義函式時指定的。在定義函式時對函式值說明的型別一般應該和return語句中的表示式型別一致,如果不_致,則以函式型別為準,即函式型別決定返回值的型別。

  (26)下列程式執行後輸出的結果是___________。

  int d=l:

  fun(int p)

  {  int d。5;

  d+=p++;

  printf(”%d,”,d);

  }

  main()

  {  int a=3;

  fun(a);

  d+=a++:

  printf(”%d\n”,d);

  }

  A)8,12    B)9,13    C)8,4    D)9,5

  答案:C

  評析:本題執行過程如下:首先呼叫fun函式,使得實參a的值3傳遞給形參p,得到區域性變數d=8,打印出區域性變數d的值8;返回主函式執行“d+=a++”,此處的d為全域性變數,所以d=1+3=4(由於本題是值傳遞,所以在函式fun中對p值的改變並不能引起a的改變),故本題的輸出是8,4。

  (27)已知下面的程式段,正確的判斷是_________。

  #define A 3

  #define B(A)((_A+1)‘a)

  int a=3:

  ……

  X=3*(A+B(7));

  A)程式錯誤,不允許巢狀定義    B)X=93

  C)X=8l                        D)程式錯誤,宏定義不允許有引數

  答案:C

  評析:本題的宏定義是合法的,宏定義展開為3*(3+((A+1)*a))=3*(3+((7+1)*3))=81。

  (28)定義int*swap()指的是_______。

  A)一個返回整型值的函式swap()

  B)一個返回指向整型值指標的函式swap()

  C)一個指向函式swap()的指標,函式返回一個整型值

  D)以上說法均錯

  答案:B

  評析:一個函式可以帶回一個整型值、字元值、實型值等,但是也可以帶回指標型資料,即地址。本題的定義中,包括括號和·號,由於f)優先順序高於t。故它是一個返回整型指標的函式。

  (29)以下程式段的輸出結果是__________。

  main()

  {   char s1[10],s2[10],s3[10];

  scanf(”%s”,s1);gets(s2);gets(s3);

  puts(s 1);puts(s2);puts(s3);

  }

  輸入資料如下:  (此處代表回車符)

  aaa

  bbb

  A)aaa    B)aaa    C)aaa\0bbb\0    D)aaabbb

  bbb

  bbb

  答案:B

  評析:scanf是標準的輸入函式,在輸入字串aaa時,實際的內容為“aaa”,“\0”是由系統自動加入的;gets的功能是從終端讀入一行字元,即一直讀到換行符為止,並由系統自動以“\0”代替換行符。

  (30)下述函式功能是________。

  Int fun(char*x)

  {  char*y=x;

  while(*y++);

  return y-x-l;

  }

  A)求字串的長度          B)求字串存放的位置

  C)比較兩個字串的大小    D)將字串x連線到字串y後面

  答案:A

  評析:在函式體內定義一字元型指標並指向形參,然後遍歷其中各字元直到碰到NULL,最後返回字串首尾地址的差值,即字串的長度。

  (31)以下程式的輸出結果是_________。

  main()

  { char str[12]={‘s’,‘t’,‘r’,‘i’,‘n’,‘ g’};

  printf(”%d\n”,strlen(str));

  }

  A)6    B)7    C)ll    D)12

  答案:A

  評析:在c語言中,字串的長度是其首字元到NULL(不含)字元的總字元個數。本題定義字元陣列str的同時,對第7個元素,由系統自動新增上“\0”,故字串的長度為6。

  (32)請讀程式段:

  char str[]=”ABCD”,*p=str;

  printf(”%d\n”,*(p+4));

  程式段的輸出結果是_________。

  A)68                 B)0

  C)字元‘D’的地址    D)不確定的值

  答案:B

  評析:在對字元陣列賦字串值時,系統會自動在字串的末尾加上一個字串結束標誌“\0”,故指向字元陣列的指標p的+(p+4)的值為“\0”。由於“\0”的編碼值就是0,所以本題輸出為0。

  (33)若有定義:int a[4][10];,則以下選項中對陣列元素a[i][j]引用錯誤的是________。

  (0<=i<4,0<=j<10)

  A)*(&a[O][O]+10*i+j)     B)*(a+i)+j

  C)*(*(a+i)+j)             D)*(a[i]+j)

  答案:B

  評析:本題中選項B是錯誤的引用,*(a+i)+j只代表了a[i][i]的地址。

  (34)設有以下語句:

  char strl[]=”string”,str2[8],。str3,。str4=”strin∥;

  則__________不是對庫函式的正確呼叫。

  A)strcpy(strl,”HELLOl”);    B)strcpy(str2,”HELL02”);

  C)strcpy(str3,”HELL03”);    D)strcpy(str4,”HELL04”);

  答案:C

  評析:c語言中:sgcpy(stl,st2);,其兩個引數均為字元指標或字元陣列,選項c中的目的串指標str3沒有指向具體有效的儲存單元,故是錯誤的呼叫。

  (35)請讀程式:

  #include

  #include

  main()

  {  char*sl=”AbCdEf”,*s2=”aB”;

  s1++;s2++;

  printf(”%d\n”,strcmp(s 1,s2));

  }

  上面程式的輸出結果是___________。

  A)正數    B)負數    C)零    D)不確定的值

  答案:A

  評析:函式strcmp的功能是比較字串s1和s2,如果sl>s2,則返回個正數;如果sls2,所以函式的值為正數。

  (36)下面程式的輸出是_________。

  char s[]=”ABcD”;

  main()

  {  char*p;

  for(p=s;p<s+4;p++)

  printf(”%s\n”,p);

  }

  A)ABCD    B)A        C)D    D)ABCD

  BCD       B          C      ABC

  CD        C          B      AB

  D         D          A      A

  答案:A

  評析:在第一次執行for迴圈的時候,字元陣列的首地址賦給了指標變數p,使得指標變數p指向了s的首地址,輸出p所指向的字串;第二次執行for迴圈時,p值增加1,p指向了s的第二個元素輸出BCD;第三次輸出CD;第四次輸出D;直到p指向字串的結束字元“\0”,for迴圈終止執行。

  (37)以下程式輸出的結果為__________。

  main()

  {  char* alpha[6]={“ABCD”,EFGH”,”IJKL”,”MNOP”,”QRST”,”UVwX”};

  char**p;

  int i:

  p=alpha;

  for(I=0;i<4;i++)

  printf(”%s”,p[I]);

  }

  A)ABCDEFGHIJKL            B)ABCD

  C)ABCDEFGHIJKLMNOP        D)AEIM

  答案:C

  評析:alpha[O]指向“ABCD”的首地址;alpha[1]指向“EFGH”的首地址;alpha[2]指向“IJKL”的首地址,依此類推。當執行到p=alpha後,p指向指標陣列alpha的首地址。for迴圈中輸出了4個字串。

  (38)下面程式的輸出結果是_________。

  #include

  main()

  {  char*p[]={”B00L”,”0PK”,”H”,”SP”};

  int i:

  for(i=3;i>=0;i–,i–)

  printf(“%c”,*p[i]);

  printf(”\n”);

  }

  A)SO    B)SP    C)SPOPK    D)SHOB

  答案:A

  評析:p[0]存放的是“BOOL\0”的首地址;p[1]存放的是“OPK\0”的首址等。

  在printf語句中輸出的+p[I]表示p[i]字串的第一個字元。在for迴圈中,i的初值為3,那麼輸出的第一個字元為“s”,接著兩次i–,則輸出的值為+p[1],即字元“0”,所以本題的輸出為SO。

  (39)以下程式的輸出結果是_________。

  #include

  void prt(int*x,int*y,int*z)

  {   printf(”%d,%d,%d\n”,++*x,++*y*(z++));}

  int a=10,b=40,c=20;

  main()

  {  prt(&a,&b&C);

  prt(&a,&b,&C);

  }

  A)ll,42,3l    B)ll,41,20    C)1l,21,40    D)11,41,2l

  12,22,41      12,42,20      11,2l,41      12,42,22

  答案:B

  評析:由於實參傳送的是變數的地址,所以對形參指標所指向的單元內容的改變,即對實參內容的改變。

  (40)若一個外部變數的定義形式為static int x;,那麼,其中static的作用應該是_______。

  A)將變數儲存在靜態儲存區

  B)使變數x可以由系統自動初始化

  C)使x只能在本檔案內引用

  D)使x的值可以永久保留

  答案:C

  評析:事實上,無論有無static修飾,外部變數都具有A、B和c三種特性。作為一種修飾,static僅是限制此型別外部變數的引用範圍:只能在定義它的檔案範圍內使用。

  (41)以下程式的輸出結果是________。

  #include

  #define SQR(x)x*x

  main()

  {  int a,k=3;

  a=++SQR(k+1);

  printf(”%d\n”,a);

  }

  A)8    B)9    C)17    D)20

  答案:B

  評析:本題宏替換中遇到形參x以實參k+l代替,其它字元不變。sQR(k+1)展開後應為字串k+l*k+l。

  (42)下面是對宏定義的描述,不正確的是_______。

  A)宏不存在型別問題,宏名無型別,它的引數也無型別

  B)宏替換不佔用執行時間

  C)宏替換時先求出實參表示式的值,然後代入形參運算求值

  D)宏替換隻不過是字元替代而已

  答案:C

  評析:宏替換實質上就是字元替代,它不可能去進行計算,故c是錯誤的。帶引數的宏與函式相比,宏在程式編譯之前已經將程式碼替換到程式內,執行時不會產生類似於函式呼叫的問題,可以說不佔用執行時間。

  (43)以下程式(程式左邊的數字為附加的行號)________。

  1#include

  2#include

  3main()

  4{char s[]=”string”;

  5  puts(s);

  6  strcpy(s,”hello”);

  7  printf(”%3s\n”,s);}

  A)沒有錯      B)第l行有錯      C)第6行有錯    D)第7行有錯

  答案:B

  評析:字串複製函式strcpy包含在標頭檔案string.h中,因此,程式中的第l行檔案包含命令是錯誤的。

  (44)若有如下說明,則__________的敘述是正確的。

  struct st

  {  int a;

  int b[2l;

  }a;

  A)結構體變數a與結構體成員a同名,定義是非法的

  B)程式只在執行到該定義時才為結構體st分配儲存單元

  C)程式執行時為結構體st分配6個位元組儲存單元

  D)型別名struct st可以透過extern關鍵字提前引用(即引用在前,說明在後)

  答案:D

  評析:結構體變數a與結構體成員a同名是合法的定義,引用成員a的方法是a.a,變數a處於不同的“層次”上,系統完全能夠分清。st是一個結構體名,不會為結構體名分配儲存空間,應該是在執行時為結構體變數a分配6個位元組的儲存單元,故選項B和選項C錯誤。

  (45)若有以下結構體定義,則________是正確的引用或定義。

  struct example

  {  int x;

  int y;

  }v1;

  A)example.x=10          B)example v2.x=10

  C)struct v2;v2.x=lO    D)struct example v2={10};

  答案:D

  評析:在定義結構體變數時,不能只用結構體名example或關鍵字strum進行定義,必需要用結構體型別名struct example定義,在引用結構體成員變數時,需要用結構體變數名進行引用,所以選D。

  (46)下列程式的執行結果是_________。

  #include

  union un

  {  int i;

  char c[21;

  };

  void main()

  { union un x;

  x.c[0]=10:

  x.c[1]=1:

  printf(“\n%d”,x.i);

  }

  A)266    B)ll    C)265    D)138

  答案:A

  評析:由於本題定義的是共用體,所以成員表列中的整型變數x和字元陣列c共佔用同一個儲存單元,且此儲存單元為2個位元組,通常c[O]位於低位元組,c[1]位於高位元組,所以x.i的值為266。

  (47)已知形成連結串列的儲存結構如下圖所示,則下述型別描述中的空白處應填_______。

  struct link

  Datanext{   char data;

  ___________

  }node;

  A)struct link next    B)link*next

  C)struct next link    D)struct link*next

  答案:D

  評析:在單向連結串列中,由於每個結點需要儲存下一個結點的地址,且下一個結點的資料型別與前一個結點的資料型別完全相同,故應為struct link*next。

  (48)已知小寫字母a的ASCII碼為97,大寫字母A的ASCII.碼為65,以下程式的結果是__________。

  main()

  {  unsigned int a=32,b=66;

  printf(“%c\n”,atb);

  }

  A)66    B)98    C)b    D)B

  答案:C

  評析:位運算子“l”的作用是按位或,即兩個二進位制數的相應位中只要有一個為1,該位的結果值為l。最後以字元型輸出,  98對應的字元“b”。

  (49)C語言庫函式龜ets(str,n,fp)的功能是_________。

  A)從fp指向的檔案中讀取長度n的字串存入str指向的記憶體

  B)從fp指向的檔案中讀取長度不超過n-l的字串存入str指向的記憶體

  C)從fp指向的檔案中讀取n個字串存/Xstr指向的記憶體

  D)從str讀取至多n個字元到檔案fp

  答案:B

  評析:fgets函式的作用是從指定的檔案讀入一個字串。fgets(str,n,fp);中的n為要求得到的字元的個數,但只從fb指向的檔案輸入n-1個字元,然後在最後加一個‘\O’字元,因此得到的字串共有n個字元。

  (50)下述的程式向檔案輸出的結果是__________。

  #include

  void main()

  {  FILE*fp=fopen(“TEST”,”wb”);

  fprintf(fp,”%d%5.0f%c%d”,58,76273.0,’-',2278);

  fclose(fp);

  }

  A)58 76273-2278      B)5876273。.000000-2278

  C)5876273-2278       D)因檔案為二進位制檔案而不可讀

  答案:C

  評析:fprintf函式工作時,多個數據間不會自動加分隔符,選項A錯誤;浮點數的輸出格式是“%5.0f”表明其小數部分輸出O位,即沒有輸出,所以選項B也是錯誤的。

  二、填空題(每空2分,共40分)

  請將每個空的正確答案寫在【l】至【20】序號的橫線上,答在試卷上不得分。

  (1)對於長度為n的順序儲存的線性表,當隨機插入和刪除一個元素時,需平均移動元素的個數為  【l】  。

  答案:【1】n/2

  評析:刪除一個元素,平均移動的元素個數為(n-l+n-2+……+0)n=(n-1)/2;插入一個元素,平均移動元素個數為(n+n-l+n-2+……+1)n=(n+1)/2;所以總體平均移動元素個數為n/2。

  (2)註釋說明了程式的功能,它分為  【2】  註釋和功能性註釋。

  答案:【2】序言性

  評析:註釋一般分為序言性註釋和功能性註釋。

  (3)軟體測試中路徑覆蓋測試是整個測試的基礎,它是對軟體  【3】  進行測試。

  答案:【3】結構

  評析:路徑測試是白盒測試方法中的'一種,它要求對程式中的每條路徑最少檢查一次,目的是對軟體的結構進行測試。

  (4)資料庫技術的主要特點為資料的整合性、資料的高  【4】  和低冗餘性、資料獨立性和資料統一管理與控制。

  答案:【4】共享性

  評析:資料庫技術的主要特點有以下幾個方面:資料的整合性,資料的高共享性與低冗餘性,資料韻獨立性,資料統一管理與控制。

  (5)資料元素之間  【5】  的整體稱為邏輯結構。

  答案:【5】邏輯關係

  評析:資料元素之間邏輯關係的整體稱為邏輯結構。資料的邏輯結構就是資料的組織形式。

  (6)若有定義int m=5,y=2,則執行表示式y+=y-=m*=y後,y的值為  【6】  。

  答案:【6】.16

  評析:將賦值運算子右側的“表示式”的值賦給左側的變數,並且賦值運算子按照“白右而左”的結合順序,本題表示式應先算m的值為10,再運算y的值為8,最後計算y=y+(-8)=-8+(-8)=-16。

  (7)若x和y都是double型變數,]ix的初值為3.0,y的初值為2.0,則表示式pow(y,fabs(x))的值為  【7】  。

  答案:【7】8.000000

  評析: fabs函式功能是求x的絕對值,計算結果為double型。pow功能是計算x的y次方的值,計算結果同樣為double型。所以本題表示式相當於2.0的3.0次方,結果為8.000000。

  (8)設有char a,b;,若要透過a&b運算遮蔽掉a中的其它位,只保留第2位和第8位(右起為第1位),則b的二進位制是  【8】  。

  答案:【8】10000010

  評析:運算“&”的規則是隻有當兩個相應的二進位制位都為1時,該位的結果才為1。要保留第2、8位,只要將其與二進位制數10000010相與。

  (9)下列程式執行後輸出的結果是  【9】  。

  f(int a)

  {  static c=0;

  C=a+C++:

  return(C);

  }

  main()

  {  int a=2,i,k;

  for(i=O;i<2;i++)

  k=f(a++);

  printf(”%d\n”,k);

  }

  答案:【9】7

  評析:在程式執行時,static變數僅初始化一次,下次使用時將使用上次儲存的值。

  (10)下面程式執行後輸出的結果是  【10】  。

  int m=13:

  int fun(int x,int y)

  {  int m=3;

  return(x*y-m);

  }

  main()

  {  int a=7,b=5;

  printf(”%d\n”,fun(a,b)/m);

  }

  答案:【10】2

  評析:本題變數m既是外部變數(值是13),又是fun函式的區域性變數(值為3)。函式fun(x*y-m)的值為7*5-3=32,在main函式中,ftm(a,b)/m中的m應取外部變數的值13,因此輸出2。

  (11)下列程式執行後輸出的結果是  【11】  。

  main()

  {  nt arr[10],i,k=0;

  for(I=0;i<l0;i++)arr[I]=i;

  for(I=1;i<4;i++)k+=arr[i]+i;

  printf(”%d\n”,k);

  }

  答案:【11】12

  評析:本題的第一個for迴圈是用於給陣列arr賦初值,第二個for迴圈用於求和運算。由於第二個for迴圈初始值為1,而迴圈條件為i<4,所以求的是art[1]到arr[3]及i的和,所以輸出結果為12。

  (12)下列程式執行後輸出的結果是 【12】 。

  struct s

  {int x,y;}data[2]={10,100,20,200};

  main()

  {

  struct s*p=data;

  printf(”%d ”,++(p->x));

  }

  答案:【12】11

  評析:程式中結構體陣列data首地址(即&data[0])賦值給結構體指標變數p,++(p->x)表示先將p所指向的結構體變數的成員x值加1,然後將此x(即data[01.x]輸出。

  (13)下面程式有兩個printf語句,如果第一個printf語句輸出的是194,則第二個print語句的輸出結果是  【13】  。

  main()

  { int a [10]={1,2,3,4,5,6,7,8,9,0},*p;

  p=a;

  printf(”%X\n”,p);

  printf(”%x\n”,p+9);

  }

  答案:【13】la6

  評析:對於指標變數的運算,就是對於地址的運算。本題中由於指標指向的是整型變數,所以,使指標變數移動9個位置也就是移動18個位元組。注意,本題是以16進位制輸出的。

  (14)以下函式的功能是計算s=l+l/2!+l/3!+…+l/n!,請填空.

  double fun(int n)

  {  double s=O.O,fac=1.O;

  int i,k=1;

  for(i=l;i<=n;i++)

  {    【14】  ;

  fat=fat/k;

  s=s+fac;

  }

  }

  答案:【14】k=k*i

  評析:本題中透過for迴圈求s表示式中每一項的和,表示式“fac=fac/k;”求的是每一項的值,所以k的值應為n!,在求n!的時候,可以用上次迴圈階乘的值乘i,就可以直接得此次n!,故本題填k=k*i。

  (15)下面程式的執行結果是  【15】  。

  main()

  {  unsigned a=0112,x;

  x=a>>3:

  printf(”x=%o”,x);

  }

  答案:【15】x=11

  評析:在對無符號數的右移是高位補0。

  (16)函式(s,i,n)是作用是從字串s中刪除從第i個字元開始的n個字元,請填空。

  void (char s[],int i,int n)

  {  int j,k,length=O;

  while(s[1ength])

  【16】  ;

  –i:

  j=i;

  }

  if(  【17】  )

  {  k=i+n;

  if(i+n<=length)

  while(k<length)

  s[j++]=s[k++];

  s[j]=‘\0’;

  }

  答案:【16】length++

  【17】i<length

  評析:第一個迴圈極有可能是這個計算串的長度,在i<=length時字元才被刪除,被刪除的是從第i個到第i+n或最後一個間的所有字元。刪除前,應判斷i<=length。由於已經進行了一i運算,故實際應填入i<length。

  (17)下述函式統計一個字串中的單詞個數,單詞是指處在空格之間的字元序列,請填空。

  int word(char*s)

  { int num=O,flag=O;

  while(*s)

  { if(  【18】  ==”)flag=O;

  else if(  【19】  ){flag=1;num++}

  }

  return  【20】  ;

  }

  答案:【18】*s++

  【19】flag==O或*(s-1)==”

  【20】num

  評析:在統計字串單詞個數的演算法中,本題的flag是為了記錄一個單詞是否結束了。在第18空應填寫*s++;如果某個字元不是空格,則必需判斷它是否是單詞,如果是,則使得flag的標誌為1,num的值加1。本題判斷方法是:先判斷s所指向的字元是否為空格,如果是則使得flag=O,否則判斷前一個字元是否是空格,如果是的話,則說明這個字元是一個單詞的開始,將flag標誌為1,num的值加1,如果不是,則不必記錄。故第19空應flag==O或*(s-1)==”;最後一個空格需填寫的是返回的單詞的個數,即num。

最近訪問