全國計算計算機二級C語言2018年3月(第六套)

1.設棧的順序存儲空間爲 S(1:m),初始狀態爲top=0。現通過一系列正常的入棧與退棧操做後,top=m+1,則棧中的元素個數爲  

A)不可能算法

B)m+1數據庫

C)0編程

D)m數組

 

 

A【解析】棧是一種特殊的線性表,它全部的插入與刪除都限定在表的同一端進行。入棧運算即在棧頂位置插入一個新元素,退棧運算即取出棧頂元素賦予指定變量。棧爲空時,棧頂指針top=0,通過入棧和退棧運算,指針始終指向棧頂元素,棧滿時,top=m。初始狀態爲top=m+1是不可能的。故本題答案爲A選項。安全

 


 

2.下列排序法中,最壞狀況下時間複雜度最小的是  

A)堆排序數據結構

B)快速排序編程語言

C)希爾排序函數

D)冒泡排序性能

 

A【解析】堆排序最壞狀況時間下的時間複雜度O(nlog2n);希爾排序最壞狀況時間下的時間複雜度O(n1.5);快速排序、冒泡排序最壞狀況時間下的時間複雜度O(n2)。故本題答案爲A選項。優化

 


 

3.某二叉樹的前序遍歷序列與中序遍歷序列相同,均爲 ABCDEF ,則按層次輸出(同一層從左到右)的序列爲  

A)ABCDEF

B)BCDEFA

C)FEDCBA

D)DEFABC

 

A【解析】二叉樹遍歷能夠分爲3種:前序遍歷(訪問根結點在訪問左子樹和訪問右子樹以前)、中序遍歷(訪問根結點在訪問左子樹和訪問右子樹二者之間)、後序遍歷(訪問根結點在訪問左子樹和訪問右子樹以後)。二叉樹的中序遍歷序列和前序遍歷序列均爲ABCDEF,可知該樹只有右子樹結點,沒有左子樹結點,A爲根結點。中序遍歷序列與前序遍歷序列相同說明該樹只有右子樹沒有左子樹,所以該樹有6層,從頂向下從左向右依次爲ABCDEF。故本題答案爲A選項。

 


 

4.下列敘述中正確的是  

A)對數據進行壓縮存儲會下降算法的空間複雜度

B)算法的優化主要經過程序的編制技巧來實現

C)算法的複雜度與問題的規模無關

D)數值型算法只需考慮計算結果的可靠性

 

A【解析】算法的空間複雜度指執行這個算法所須要的內存空間。在許多實際問題中,爲了減小算法所佔的存儲空間,一般採用壓縮存儲技術,以便儘可能減小沒必要要的額外空間。因爲在編程時要受到計算機系統運行環境的限制,所以,程序的編制一般不可能優於算法的設計。算法執行時所須要的計算機資源越多算法複雜度越高,所以算法的複雜度和問題規模成正比。算法設計時要考慮算法的複雜度,問題規模越大越是如此。故本題答案爲A選項。


 

5.軟件需求規格說明的內容應包括  

A)軟件的主要功能

B)算法詳細設計

C)E-R模型

D)軟件整體結構

 

A【解析】軟件需求規格說明應重點描述軟件的目標,軟件的功能需求、性能需求、外部接口、屬性及約束條件等。功能需求是軟件需求規格說明,給出軟件要執行什麼功能的詳盡描述。性能需求是指定量的描述軟件系統應知足的具體性能需求,即各類軟件功能的速度、響應時間、恢復時間。外部接口指軟件如何與人、系統的硬件及其餘硬件和其餘軟件進行交互。屬性是指與軟件有關的質量屬性,如正確性、可用性、可靠性、安全性、可維護性等。約束條件包括影響軟件實現的各類設計約束,如使用的標準、編程語言、數據庫完整性方針、資源限制、運行環境等方面的要求。故本題答案爲A選項。

 


 

6.某系統結構圖以下圖所示(圖中n≥5)

 

該系統結構圖的寬度是  

A)n

B)3

C)2

D)1

A【解析】系統結構圖的寬度指總體控制跨度(橫向最大模塊數)的表示。本題中,模塊數最多的是第2層,即「功能1」到「功能n」的模塊個數就是寬度,有n個。故本題答案爲A選項。

 


 

7.軟件是  

A)程序、數據和文檔的集合

B)計算機系統

C)程序

D)程序和數據

A【解析】計算機軟件是計算機系統中與硬件相互依存的另外一部分,是包括程序、數據及相關文檔的完整集合。故本題答案爲A選項。

 


 

8.關係數據庫規範化的目的是爲了解決關係數據庫中的  

A)插入、刪除異常及數據冗餘問題

B)查詢速度低的問題

C)數據操做複雜的問題

D)數據安全性和完整性保障的問題

A【解析】關係數據庫進行規範化的目地:使結構更合理,消除存儲異常,使數據冗餘儘可能小,便於插入、刪除和更新。關係模式進行規範化的原則:聽從概念單一化「一事一地」原則,即一個關係模式描述一個實體或實體間的一種聯繫。規範的實質就是概念的單一化。 關係模式進行規範化的方法:將關係模式投影分解成兩個或兩個以上的關係模式。故本題答案爲A選項。

 


 

9.按照傳統的數據模型分類,數據庫系統可分爲  

A)層次、網狀和關係

B)大型、中型和小型

C)西文、中文和兼容

D)數據、圖形和多媒體

A【解析】數據模型(邏輯數據模型)是面向數據庫系統的模型,着重於在數據庫系統一級的實現。較爲成熟並前後被人們大量使用的數據模型有層次模型、網狀模型、關係模型和麪向對象模型。故本題答案爲A選項。

 


 

10.現有表示患者和醫療的關係以下:P(P#,Pn,Pg,By),其中P#爲患者編號,Pn爲患者姓名,Pg爲性別,By爲出生日期, Tr(P#,D#,Date,Rt),其中D#爲醫生編號,Date爲就診日期,Rt爲診斷結果。檢索在1號醫生處就診的男性病人姓名的表達式是  

A) 

 

B) 

 

C) 

 

D) 

 

A【解析】π表示投影運算,針對屬性;σ表示選擇運算,針對元組;∞表示天然鏈接。首先在Tr表中選擇D#1的記錄σD#=1(Tr),並找出這些記錄中患者的編號πP#(σD#=1 (Tr));,再在P表中找到性別爲男性的記錄σPg =’男’(P);將兩次檢索結果進行天然鏈接生成中間表πP#(σD#=1 (Tr))∞σPg =’男’(P),最後在中間表中檢索患者的姓名πPn(πP#(σD#=1 (Tr))∞σPg =’男’(P) )。故本題答案爲A選項。


 

11)下面不合法的常量數據是()。

A).023E-5

B)0x3f7b8a90

C)'\0x6d'

D)'\0123321'

答案:D

【解析】選項A是實型常量的指數表示形式,表示0.023*10-5,正確;選項B是十六進制表示的整型常量,正確;選項C是十六進制表示的轉義字符常量,正確;選項D是字符串常量,應該使用雙引號括起來,錯誤,本題答案爲D。

 

 


 

12)如下敘述中錯誤的是()。

A)C語言邏輯運算的結果是0和任意非0值

B)C語言中任意合法的表達式均可以做爲邏輯運算的對象

C)C語言關係運算的值只有0和1兩種可能

D)C語言中用0表示邏輯「假」,非零表示邏輯「真」

答案:A

【解析】由關係運算符構成的表達式,稱爲關係表達式,關係運算的值爲「邏輯值」,只有整數0或整數1,選項C正確;由邏輯運算符和運算對象組成的表達式稱爲邏輯表達式,邏輯運算的對象能夠是C語言中任意合法的表達式,邏輯表達式的運算結果或者爲1(「真」),或者爲0(「假」),選項A錯誤,選項B正確;邏輯值只有兩個,分別用「真」和「假」來表示,C語言中用非0表示「真」,用0表示「假」,選項D正確,本題答案爲A。

 


 

(13)如下說法正確的是()。

A)C語言中的常量是指在程序運行過程當中常常被改變數據類型的量

B)C語言中的常量是指在程序運行過程當中常常被改變值的量

C)C語言中的常量是指在程序運行過程當中常常被用到的變量

D)C語言中的常量是指在程序運行過程當中其值不能被改變的量

 

答案:D

【解析】C語言中的常量是指在程序運行過程當中其值不能被改變的量,因此本題答案是D。

 


 

14)C語言常量的類型從字面形式上可區分,如下判斷中正確的是()。

A)2E3   ---  整型

B)2.0E3 ---  實型

C)'\025'---  字符串

D)"a"   ---  字符型

答案:B

【解析】2E3是實型常量的指數形式,選項A錯誤;2.0E3是實型常量的指數形式,選項B正確’\025’是八進制表示的轉義字符,選項C錯誤;「a」是雙引號括起來的字符串常量,選項D錯誤;本題答案爲B。

 


 

(15)如下各選項中的代碼段執行後,變量y的值不爲1的是

A)int x=5,y=0; if(5) y=1;

B)int x=5,y=0; if(x) y=1; 

C)int x=10,y=0; if(x=y) y=1;

D)int x=5,y=10; if(x=y) y=1;

答案:C

【解析】選項A的if條件表達式5的值爲真,執行y=1,y的值爲1;選項B的if條件表達式x的值爲5,也是真,執行y=1,y的值爲1;選項C的if條件表達式x=y是賦值語句,將y的值0賦給x,表達式的值爲0,if語句不執行,y值爲0;選項D的if條件表達式x=y是賦值語句,將y的值10賦給x,表達式的值爲10,執行y=1,y的值爲1,本題答案爲C。

 


 

16) 若要利用if-else語句判斷year是否閏年,是閏年則返回1,不是閏年則返回0。如下選項中不能完成正確判斷的程序段是()。

A)if(year%400==0) return 1; else if(year%100!=0) if(year%4==0) return 1; else return 0; B)if(year%400!=0) if(year%100==0) return 0; else if(year%4==0) return 1; else return 0; else return 1; C)if(year%100==0) if(year%400==0) return 1; else return 0; else if(year%4==0) return 1; else return 0; D)if(year%4!=0)  return 0; else if(year%400==0) return 1; else if(year%100==0) return 0; else return 1;

 

答案:A

 


 

【解析】判斷year是閏年,須要知足兩個條件之一:1year能夠被4整除且year不能被100整除,(2year能夠被400整除;選項A沒有考慮year能被100整除不是閏年的狀況,錯誤;B、C、D都是正確的;本題答案爲A。

17)有以下程序 

#include <stdio.h> #include <string.h> main() { char a[6] = "0123", *b = "++"; printf("%d,%d", strlen(a), sizeof(b)); } 

 


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

A)4,2

B)4,4

C)6,2

D)5,4

答案:B

【解析】strlen()函數計算參數指向的字符串長度,題意中字符數組a有6個字節的存儲空間,可是隻存儲了4個字符,因此strlen()結果爲4,選項C、D錯誤sizeof()運算符是計算類型所佔用的長度,題意中b是一個指針變量,指針在內存中佔4個字節,因此sizeof結果爲4,選項A錯誤;本題答案爲B。

 

 


 

18)有如下程序 

#include <stdio.h> 
    void main() { double x=3.14159; printf("%f\n", (int)(x*1000+0.5)/(double)1000); } 

 


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

A)3.142000

B)3.141000

C)3.143000

D)3.140000

答案:A

【解析】根據算術表達式和運算符的優先級與結合性,對於題意表達式:int(x*1000 + 0.5)/(double)1000,首先計算x*1000,因爲x是double類型,1000是整型,因此x*1000的結果默認是double類型:3141.59;再執行int的強制轉換,結果爲3142;分母(double)1000強制轉換爲double類型,此時3142/(double)1000中,3142須要轉換成double類型,而後除以1000,結果爲3.142000,保留小數點後6位,本題答案爲A。

 


 

(19)  有如下程序 

#include <stdio.h> 
    void main() { char *s = "\ta\018bc"; for (; *s != '\0'; s++) printf("*"); printf("\n"); } 

 


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

A)******

B)*********

C)*****

D)*******

答案:A

【解析】main()函數定義一個字符指針s,指向字符串」\ta\018bc」for循環遍歷s指向的字符串中的字符,而後輸出「*」,因此題意能夠理解爲:s指向的字符串中有多少個字符,就輸出多少個「*」;s指向的字符串中字符分別是:’\t’(轉義字符)、’a’、’\01’(轉義字符)、’8’、’b’、’c’,總共6個,其中因爲8不屬於八進制中的數字,因此’\018’不是一個轉義字符,而’\01’是轉義字符,本題答案爲A。本題答案爲B。

 


 

20)如下有關全局變量的敘述中錯誤的是()。

A)全局變量沒被引用時,不佔用內存空間

B)全部在函數體外定義的變量都是全局變量

C)全局變量能夠和局部變量同名稱

D)全局變量的生命週期一直持續到程序結束

答案:A

【解析】全局變量在程序運行時就分配了存儲空間,直到程序結束,它的生命週期是整個程序的運行期,選項A錯誤、D正確;在函數體外定義的變量都屬於全局變量,選項B正確;全局變量能夠和局部變量同名,在局部做用域局部變量會屏蔽同名的全局變量,除非顯示的引用全局變量,選項C正確;本題答案爲A。

 


 

(21)有以下程序

#include  <stdio.h> #include <string.h> main() { printf("%d\n", strlen("0\n011\0")); }

 


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

A)5

B)6

C)8

D)9

答案:A

【解析】strlen()函數是求字符串長度的庫函數,它在遍歷字符串過程當中遇到字符串結束符‘\0’時,計算結束,計算結果不包括‘\0’,因此題意中字符串「0\n011\0」長度爲5,各個字符分別是:‘0’、‘\n’、‘0’、‘1’、‘1’,本題答案爲A。

 


 

(22)如有定義: char s1[100 ]="name", s2[ 50]="address", s3[80]="person";,要將它們鏈接成新串:"personnameaddress",正確的函數調用語句是()。

A)strcat(strcat(s1,s2),s3);    

B)strcat(s3,strcat(s1,s2));

C)strcat(s3,strcat(s2,s1));

D)strcat(strcat(s2,s1),s3);

答案:B

【解析】strcat()函數是字符串鏈接函數,調用形式爲:strcat(s1, s2);表示s2指向的字符串的內容複製到s1指向的存儲空間中,返回s1的地址;由題意可知新串首地址爲s3,因此s3應該是第一參數,選項A、D錯誤;同理,新串中除了s3字符串,剩下的字符串爲:」nameaddress」,即首地址s1,因此調用strcat()函數s1是第一參數,因此正確的函數調用語句爲:strcat(s3, strcat(s1, s2));本題答案爲B。

 


 

(23)  有如下程序  

#include <stdio.h> 
    #define SWAT(t,a,b)  t=a; a=b; b=t;  main() { int  x=6,y=4,z=3,s=0; if(x<y) SWAT(s,x,y); if(x<z) SWAT(s,x,z); if(y<z) SWAT(s,y,z); printf("%d,%d,%d\n", x,y,z); } 

 


執行後的輸出結果是

A)6,4,3

B)3,4,6

C)0,3,4

D)3,0,0

答案:D

【解析】程序定義一個宏,#define SWAT(t,a,b) t=a;a=b;b=t;因此程序中,三個if語句通過宏替換後以下:

if (x < y) s=x; x = y; y = s;

if (x < z) s = x; x = z; z = s;

if (y < z) s = y; y = z; z = s;

x初值6,y初值4,z初值爲3,s初值爲0,因此:

1個if語句,x<y(6<4)爲假,執行x=y;y=s;此時x的值爲4,y的值爲0;

2個if語句,x<z(4<3)爲假,執行x=z;z=s;此時x的值爲3,z的值爲0;

3個if語句,y<z(0<0)爲假,執行y=z;z=s;此時y的值爲0,z的值爲0;最終x、y、z的值爲三、0、0;本題答案爲D。

 


 

(24)如有定義:char ch; int a; double d;, 當輸入爲12345 678910.36時,如下選項中能給各個變量正確輸入數據的是()。

A)scanf("%d%c%lf",&a,&ch,&d);

B)scanf("%5d%2c%7.2lf",&a,&ch,&d);

C)scanf("%d%c%lf",a,ch,d);

D)scanf("5d%2c%7.2lf%",&a,&ch,&d);

答案:A

【解析】scanf()函數是標準輸入函數,其中雙引號之間的內容是格式控制串,後面是輸入參數列表。其中輸入參數列表中各項都必須是變量地址,因此選項C錯誤;在scanf()函數的格式字符前,能夠加入一個正整數指定輸入數據所佔的寬度,但不能夠對實數指定小數位的寬度,因此選項B、D錯誤;選項A是正確的,按照A的輸入格式,12345賦值a,空格賦值給ch,678910.36賦值給d;本題答案爲A

 


 

25) 有以下程序

#include  <stdio.h> main() { char a, b; int i; a = '3'; b = 'A'; for (i=0; i<6; i++) { if (i % 2) putchar(a + i); else putchar(b + i); } }

 


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

A)AB56EF

B)A4C6E8

C)B4D6F8

D)A5C7E9

答案:B

【解析】程序首先賦值a爲字符’3’,賦值b爲字符’A’,循環變量i的初值爲0,每次循環後自增1,最大值爲5,if條件判斷i的值,當i的值爲偶數時,bi的和當作字符輸出;當i的值爲奇數時,將a與i的和當作字符輸出;因此i0時,輸出b+0A;i1時,輸出a+1‘4’;i爲2時,輸出b+2C;i爲3時輸出a+3即‘6’……,綜上,程序運行結果爲:A4C6E8,本題答案爲B

 


 

(26)有如下程序    

#include <stdio.h> 
    void fun(double x, double *y, double *z) { *y = *y-1.0; *z = *z+x; } main() { double a=2.5, b=9.0, *pa, *pb; pa=&a;  pb=&b; fun(b-a,pa,pb); printf("%f\n",a); } 

 


程序運行後的輸出結果是

A)8.000000

B)9.000000

C)1.500000

D)10.500000

答案:C

【解析】main()函數定義兩個double類型的變量a、b,分別賦初值爲:2.五、9.0,另外定義兩個double類型的指針變量papb,其中pa指向a,pb指向b;而後b-a、papb傳給函數fun,此時x的值爲7.5,y指向a,z指向b;因此:

*y=*y-1.0,是將變量a的值減去1.0賦給a,a的值爲1.5;

*z=*z+x,是將變量b的值加上7.5賦給b,b的值爲16.5;

fun()函數執行完畢後,輸出a的值爲1.5;本題答案爲C。

 


 

27)有下列程序  

 #include  <stdio.h> 
  void fun(int a[ ], int n, int flag)   { int i=0,j, t;    for (i=0; i<n-1; i++)    for (j=i+1; j<n; j++)    if (flag ? (a[i] < a[j]) : (a[i] > a[j]))    { t = a[i]; a[i] = a[j]; a[j] = t;}   }   main( )   { int c[10]={7,9,10,8,3,5,1,6,2,4},i;    fun(c, 10, 1);    fun(c, 5, 0);    for (i=0;i<10; i++)    printf("%d,", c[i]);   } 

 

 


程序執行後的輸出結果是()。

A)5,4,3,2,1,6,7,8,9,10,

B)6,7,8,9,10,5,4,3,2,1, 

C)6,7,8,9,10,1,2,3,4,5, 

D)10,9,8,7,6,1,2,3,4,5,

答案:B

【解析】題意中,fun()函數接收數組a,數組元素個數n以及整型變量flag,而後經過for循環遍歷數組a的n個元素,若flag爲1,則將數組元素降序排列,若flag爲0,則將數組元素升序排列。main()函數定義整型數組c,它包含10個元素,首先將數組c、元素個數10和1傳給fun()函數,將c中10個元素逆序排列,結果爲:10,9,8,7,6,5,4,3,2,1;而後再次調用fun()函數,將數組c,元素個數5和0傳給fun()函數,將c中前5個元素升序排列,結果爲:6,7,8,9,10,5,4,3,2,1,本題答案爲B。

 


 

(28)  有以下程序

#include  <stdio.h>
void get_put() { char ch; ch = getchar(); if (ch != '\n') get_put(); putchar(ch); } main() { get_put(); }

 


程序運行時,輸入AB12<回車>,則輸出結果是()。

A)2100

B)21BA

C)DCBA

D)21AB

答案:B

【解析】main()函數調用get_put()函數,get_put()是遞歸函數,每次使用getchar()讀入一個字符存放到ch中,若ch不是字符’\n’,遞歸調用自身,而後調用putchar()函數輸出該字符。當輸入AB12\n(<回車>)時,直到讀入的字符是’\n’,輸出回車符,而後回到上一層遞歸,逆序輸出各個字符,輸出結果爲:<回車>21BA,因此本題答案爲B。

 


 

(29) 有如下程序

#include <stdio.h>

    void swap(int *a, int *b) { int  t, *tp; t = *a; *a = *b; *b = t; tp = a;  a = b;  b = tp; printf("%d,%d,", *a,*b); } main( ) { int i=3, j=7, *p=&i, *q=&j; swap(p, q); printf("%d,%d,%d,%d", i, j, *p, *q); }

 

    程序執行後的輸出結果是

A)3,7,3,7,3,7

B)7,3,7,3,7,3

C)3,7,3,7,7,3

D)3,7,7,3,7,3

 

答案:D

【解析】main()函數中,首先定義兩個整型變量i和j,初值爲3和7,並i的地址賦給p,j的地址賦給q,傳給swap()函數,swap()函數接收兩個整型指針變量a,b,而後使用整型變量t交換a、b所指向的值並輸出,經過指針變量,此次交換改變了實參ij的值,使得i=7,j=3;指針變量tp交換a和b的值,因爲a、b的值是p,q值的拷貝,因此此次交換隻改變了形參a,b的值,對實參p,q的值沒有改變,因此此時a指向j,b指向i,函數最後輸出*a和*b,因此輸出3,7;因爲swap()函數改變了pq指向的值,但未改變pq的值,因此main()函數輸出i的值爲7,j的值爲3,*p的值爲i,*q的值爲j,因此程序輸出3,7,7,3,7,3,本題答案爲D。

 


 

30) 有以下程序

#include  <stdio.h> #include <string.h> main() { char a[] = "THIS\0", *b = "OK\0\0"; printf("%d,%d,%d,%d", strlen(a), sizeof(a), strlen(b), sizeof(b)); }

 


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

A)4,6,2,4

B)4,4,4,1

C)6,5,2,1

D)6,4,2,4

答案:A

【解析】strlen()函數求得參數中字符串的長度(不包括字符串結束符’\0’);sizeof()運算符,求得參數這種類型所佔存儲空間的長度;題意中a是數組名,因爲定義時省略維數大小,因此數組大小是初始化的字符個數,因此a的數組大小爲6,綜上:strlen(a)只計算字符’T’、’H’、’I’、’S’,結果爲4;sizeof(a)是求得數組a的大小,結果爲6;另外指針b指向一個字符串’OK\0\0’,因此strlen(b)只計算字符’O’、’K’,結果爲2,sizeof(b)求得指針佔用存儲空間的大小,結果爲4,本題答案爲A。

 


 

31)如下選項中,可以正確利用隨機函數rand(),產生一個英文字母的表達式是()。

A)rand()%2==0 ? rand()%'A' : rand()%'a'

B)rand()%26+'A'|| rand()%26+'a'

C)rand()%26+'A' && rand()%26+'a'

D)rand()%2==0 ? rand()%26+'A': rand()%26+'a'

答案:D

【解析】rand()函數是產生隨機數的函數,它能夠生成0~RAND_MAX之間的一個隨機數,其中RAND_MAX是stdlib.h中定義的一個整數。一般若是咱們須要隨機0~N-1之間的一個隨機數,須要使用rand()的結果對N求模便可。選項A中rand()%2只有兩個值0或1,因此當rand()%2的結果爲0時,整個表達式的值是rand()%'A',這裏'A'要轉換成ASCII碼值65,因此結果爲0~64之間的一個隨機數,當rand()%2的結果爲1時,整個表達式的值是rand()%'a','a'ASCII碼值爲97,因此結果是0~96之間的一個隨機數,可見選項A錯誤;邏輯或運算符||或邏輯與運算符&&的結果都只能是0或非0,因此選項B、C也是錯誤的;選項D中,若是rand()%2的結果爲0,那麼整個表達式的值爲rand()%26+'A',0~25之間任一個數與'A'的和都是一個大寫字母;若是rand()%2的值爲1,整個表達式的值爲rand()%26+'a'0~25之間任一個數與'a'的和都是一個小寫字母,因此選項D正確;本題答案爲D。

 

 


 

32)有下列程序  

 #include <stdio.h>   #include <string.h>   main( )   { char v[4][10]={"efg","abcd","mnopq","hijkl"},*p[4],*t;    int i,j;    for (i=0; i<4; i++)    p[i] = v[i];    for (i=0; i<3; i++)    for (j=i+1; j<4; j++)    if (strcmp(p[i], p[j]) > 0)    { t = p[i]; p[i] = p[j]; p[j] = t; }    for (i=0; i<4; i++)    printf("%s " , p[i]);   } 

 

 


程序執行後的輸出結果是

A)efg abcd hijkl mnopq

B)abcd efg hijkl mnopq

C)mnopq hijkl efg abcd

D)efg abcd mnopq hijkl 

答案:B

【解析】main()函數中定義一個二維數組v,另外還定義一個指針數組p,經過for循環,將v的各個行(字符串的首地址)賦給p的對應下標的元素,而後經過嵌套的for循環,爲該二維數組中存放的各個字符串進行排序,stcmp函數返回值大於0時(p[i]>p[j])交換兩個字符串,因此每一輪內嵌for循環,都將下標i的字符串放在最終的排序位置上,即排序規則是按字符串升序排列,字符串排序時,是將兩個字符串自左向右逐個字符比較(按字符的ASCII碼大小),直到出現不一樣的字符或遇到’\0’爲止,排序後,再將v中各個排序後的字符串輸出;因此程序運行結果爲:abcd efg hijkl mnopq,本題答案爲B

 


 

(33)  有如下程序

#include  <stdio.h>

    int *f(int *s) { s+=2; s[1] +=6; *s=7; return s; } main( ) { int  a[5]={1,2,3,4,5}, *p=a; p= f(p); printf("%d,%d,%d,%d", a[0], a[1], *p,p[1]); }

 

  程序執行後的輸出結果是()。

A)1,2,7,10

B)7,8,7,8

C)1,2,1,2

D)7,10,7,10

答案:A

【解析】f()函數接收一個數組a的首地址s,而後s指針向後移動兩個單位,此時s指向數組a的第3個元素,即3,而後將s的後一個元素累加6,s指向的元素賦值爲7,並返回s指針賦給實參p,因此f()函數調用後,a數組中的元素分別爲:1,2,7,10,5。執行p=f(p)後,p指向第3個元素,因此輸出a[0]1,a[1]2,*p爲7,p[1]爲10,本題答案爲A。

 

 


 

34) 如圖所示:帶有頭結點的單向鏈表head,其三個數據結點A、B、C 的鏈接關係見圖。  

     結點類型的定義爲:
     struct link
     {
         double dt;
         struct link *next;
     };
    若指針p指向A結點,在不改變p指向的前提下,如下選項中不能訪問C結點數據成員dt的表達式是

A)*(*p).next->next->dt

B)p->next-> next->dt

C)(*(*(*p).next).next).dt

D)(*(p->next-> next)).dt

答案:A

【解析】link結構體中的next是鏈表中下一個結點的地址,因爲p當前指向A,因此p->nextB的地址,p->next->nextC的地址,訪問C的結點數據成員dt可使用C的地址訪問,即:p->next->next->dt,選項B正確p是A的地址,因此*p是結點A,(*p).next是B的地址,因爲成員運算符.的優先級高於解引用運算符*,因此*(*p).next是結點B,(*(*p).next).next是C的地址,*(*(*p).next).next是結點C,引用C的dt成員:(*(*(*p).next).next).dt ,選項C正確;同理,也能夠既使用指針運算符,也使用解引用運算符來訪問C的結點數據成員dt,即(*(p->next-> next)).dt,選項D正確;選項A中,*p表示A結點,(*p).next表示結點B的地址,因爲->運算符的優先級高於*運算符,因此先執行->,即表達式(*p).next->next->dt引用C結點的數據成員dt,而後再執行解引用運算*,這是錯誤的,本題答案爲A。

 


 

35)設有函數說明語句:


  int fun(int,int);
以及函數指針定義語句:
  int (*f)(int,int);
若要使函數指針指向函數fun的入口地址,如下選項中正確的是()。

A)f=fun( );

B)*f=fun;  

C)f=fun; 

D)*f=fun( );

答案:C

【解析】C語言中,函數名也是一個指針,是函數的入口地址,因此要是函數指針f指向函數fun的入口地址,直接將函數名fun賦給f便可,本題答案爲C。

 


 

(36) 有下列程序  

#include <stdio.h> main( ) { char v[4][10];  int i; for (i=0; i<4; i++) scanf("%s", v[i]); printf("%c,%s,%s,%c", **v, *(v+1), v[3]+3, *(v[2]+1)); }

 


程序執行時若輸入: welcome you to beijing<回車>,則輸出結果是()。

A)w,you,jing,o 

B)welcome,you,jing,to

C)w,you,eeijing,u

D)w,xelcome,eeijing,u

答案:A

【解析】題意中,定義一個二維字符數組v,而後經過for循環,輸入4個字符串welcome、you、to、beijing,分別存放在v的四個元素中;因此v表示存放四個字符串的二維數組;**v表示第一個字符串的第一個字符w;*(v+1)指向第二個字符串you;v[3]+3指向第四個字符串第三個字符開始後的整個字符串jing;*(v[2]+1)表示第三個字符串的第二個字符o,本題答案爲A。

 


 

37)如下針對相應語句的註釋中,說法錯誤的是()。

A)int *pt[2];    /*  pt是一個指針數組名   */  

B)int (*pt)[2];  /*  pt是一維數組名    */

C)int (*pt)( );  /*  pt是指向函數的指針   */

D)int *pt( );    /*  pt是一個函數名   */

答案:B

【解析】選項A定義一個數組pt,它包含兩個整型指針的元素,因此pt是一個指針數組名,正確;選項B定義了一個數組指針ptpt指向一個數組,該數組包含兩個整型元素,錯誤;選項C定義了一個函數,pt是函數指針,指向這個函數,其中該函數沒有參數,返回類型爲整型,正確;選項D定義一個函數,函數名pt,函數返回整型指針類型,正確;本題答案爲B。

 


 

(38)如有定義   

typedef  int  *(*T[10])[10];  
   T  b;
則如下選項中所定義的a與上述定義中的b,其類型徹底相同的是()。

A)int *(*a[10][10]);

B)int **a[10][10];     

C)int *(a[10])[10];

D)int *(*a[10])[10];

答案:D

【解析】typedef int *(*T[10])[10]使用typedef定義一種新類型名T,T的類型是二維數組指針,指向10個元素的數組,其中數組元素類型爲int *[10],即數組的每一個元素又是包含10個元素的數組,數組的元素是整型指針類型,本題答案爲D。

 


 

(39)  有如下程序

#include   <stdio.h> main( ) { int  x=3,y=5, z1,z2; z1=x^y; z2=x+y; printf("%d,%d\n", z1, z2); }

 

   程序執行後的輸出結果是()。

A)9,8

B)8,8

C)35,8

D)6,8

答案:D

【解析】「^」是異或運算符,兩個運算數的二進制位逐位進行異或運算,當相應位的數值相同時,結果爲0,當相應位的數值不一樣時,結果爲1;題意中,x=3,二進制位00000011,y=5,二進制爲00000101,異或運算後二進制數:00000110,因此z1的結果爲6;z2=x+y,結果爲8;本題答案爲D。

 


 

(40)  有如下程序 

 

#include<stdio.h> typedef struct book { char name[50]; double price; } BOOK; void fun(BOOK*pd,int num,int size); void main() { BOOK data[10]={"photoshop",26.8,"計算機原理",15.00,"數據結構",35.6}; int n=3,m=10; fun(data,n,m); printf("%s , %s\n",data[8].name,data[9].name); } void fun(BOOK*pd,int num,int size) { int i,j,t; double mx,mn; mx=mn=pd[0].price; j=t=0; for(i=1;i<num;i++) { if(pd[i].price>mx) { mx=pd[i].price;j=i; } if(pd[i].price<mn) { mn=pd[i].price;t=i; } } pd[size-2]=pd[j]; pd[size-1]=pd[t]; } 

 


程序的運行結果是()。

A)數據結構 , 計算機原理

B)計算機原理 , 數據結構

C)Photoshop , 計算機原理

D)數據結構 , Photoshop

答案:A

【解析】程序首先使用typedef定義一種新的類型名BOOK,它包含兩個數據成員:字符數組namedouble類型變量price;main()函數使用BOOK定義結構體數組data,它包含10個BOOK類型的結構體元素,並完成初始化,其中前3個元素使用肯定的值初始化,後7個元素系統默認值初始化;函數fun()經過for循環遍歷結構體數組pd的前num個元素,從而找出前num個元素中price成員最大的元素下標存放到j,找出前num個元素中price成員最小的元素下標存放到t,而後將下標爲j的元素賦給下標爲size-2的位置,將下標爲t的元素賦給下標爲size-1的位置;因爲main()函數中調用fun(data, n, m),n值爲3,m值爲10,因此fun()函數將data中下標爲8的元素賦值爲前3個元素中price值最大的元素,將data中下標爲9的元素賦值爲前3個元素中price值最小的元素,調用結束後,輸出下標爲8和9的元素的成員name,根據初值可知price最大的元素的name成員爲「數據結構」,price最小的元素的name成員爲「計算機原理」,因此程序輸出:數據結構,計算機原理,本題答案爲A。

相關文章
相關標籤/搜索