一、選擇題(1)~(10)每小題2分,(11)-(50)每小題1分,共60分)
下列各題A)、B)、C)、D)四個選項中,只有一個選項是正確的,請將正確選項涂寫在答題卡相應(yīng)位置上,答在試卷上不得分。
(1)數(shù)據(jù)結(jié)構(gòu)中,與所使用的計算機(jī)無關(guān)的是數(shù)據(jù)的________。
A)存儲結(jié)構(gòu) B)物理結(jié)構(gòu) C)邏輯結(jié)構(gòu) D)物理和存儲結(jié)構(gòu)
答案:C
評析:數(shù)據(jù)結(jié)構(gòu)概念一般包括3個方面的內(nèi)容,數(shù)據(jù)的邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)及數(shù)據(jù)上的運(yùn)算集合。數(shù)據(jù)的邏輯結(jié)構(gòu)只抽象的反映數(shù)據(jù)元素之間的邏輯關(guān)系,而不管它在計算機(jī)中的存儲表示形式。
(2)棧底至棧頂依次存放元素A、B、C、D,在第五個元素E入棧前,棧中元素可以出棧,
則出棧序列可能是________。
A)ABCED B)DBCEA C)CDABE D)DCBEA
答案:D
評析:棧操作原則上"后進(jìn)先出",棧底至棧頂依次存放元素A、B、c、D,則表明這4個元素中D是最后進(jìn)棧,B、c處于中間,A最早進(jìn)棧。所以出棧時一定是先出D,再出c,最后出A。
(3)線性表的順序存儲結(jié)構(gòu)和線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)分別是________。
A)順序存取的存儲結(jié)構(gòu)、隨機(jī)存取的存儲結(jié)構(gòu)
B)隨機(jī)存取的存儲結(jié)構(gòu)、順序存取的存儲結(jié)構(gòu)
C)隨機(jī)存取的存儲結(jié)構(gòu)、隨機(jī)存取的存儲結(jié)構(gòu)
D)任意存取的存儲結(jié)構(gòu)、任意存取的存儲結(jié)構(gòu)
答案:B
評析:順序存儲結(jié)構(gòu)中,數(shù)據(jù)元素存放在一組地址連續(xù)的存儲單元中,每個數(shù)據(jù)元素地址可通過公式LOC(ai)。LOC(a1)+(i-1)L計算得到,從而實現(xiàn)了隨機(jī)存取。對于鏈?zhǔn)酱鎯Y(jié)構(gòu),要對某結(jié)點進(jìn)行存取,都得從鏈的頭指針指向的結(jié)點開始,這是一種順序存取的存儲結(jié)構(gòu)。
(4)在單鏈表中,增加頭結(jié)點的目的是________。
A)方便運(yùn)算的實現(xiàn) B)使單鏈表至少有一個結(jié)點
C)標(biāo)識表結(jié)點中首結(jié)點的位置 D)說明單鏈表是線性表的鏈?zhǔn)酱鎯崿F(xiàn)
答案:A
評析:頭結(jié)點不僅標(biāo)識了表中首結(jié)點的位置,而且根據(jù)單鏈表(包含頭結(jié)點)的結(jié)構(gòu),只要掌握了表頭,就能夠訪問整個鏈表,因此增加頭結(jié)點目的是為了便于運(yùn)算的實現(xiàn)。
(5)軟件設(shè)計包括軟件的結(jié)構(gòu)、數(shù)據(jù)接口和過程設(shè)計,其中軟件的過程設(shè)計是指________。
A)模塊間的關(guān)系 B)系統(tǒng)結(jié)構(gòu)部件轉(zhuǎn)換成軟件的過程描述
C)軟件層次結(jié)構(gòu) D)軟件開發(fā)過程
答案:B
評析:軟件設(shè)計包括軟件結(jié)構(gòu)設(shè)計、數(shù)據(jù)設(shè)計、接口設(shè)計和過程設(shè)計。其中結(jié)構(gòu)設(shè)計是定義軟件系統(tǒng)各主要部件之間的關(guān)系;數(shù)據(jù)設(shè)計是將分析時創(chuàng)建的模型轉(zhuǎn)化為數(shù)據(jù)結(jié)構(gòu)的定義;接口設(shè)計是描述軟件內(nèi)部、軟件和操作系統(tǒng)之間及軟件與人之間如何通信;過程設(shè)計則是把系統(tǒng)結(jié)構(gòu)部件轉(zhuǎn)換成軟件的過程性描述。
(6)為了避免流程圖在描述程序邏輯時的靈活性,提出了用方框圖來代替?zhèn)鹘y(tǒng)的程序流程 圖,通常也把這種圖稱為________。
A)PAD圖 B)N-S圖 C)結(jié)構(gòu)圖 D)數(shù)據(jù)流圖
答案:B
評析:常見的過程設(shè)計工具有:程序流程圖、N-S圖、PAD圖和HIPO圖。其中,為了避免流程圖在描述程序邏輯時的靈活性,提出了用方框圖來代替?zhèn)鹘y(tǒng)的程序流程圖,通常也把這種圖稱為N-S圖。
(7)數(shù)據(jù)處理的最小單位是________。
A)數(shù)據(jù) B)數(shù)據(jù)元素 C)數(shù)據(jù)項 D)數(shù)據(jù)結(jié)構(gòu)
答案:C
評析:數(shù)據(jù)處理的最小單位是數(shù)據(jù)項;由若干數(shù)據(jù)項組成數(shù)據(jù)元素;而數(shù)據(jù)是指能夠被計算機(jī)識別、存儲和加工處理的信息載體;數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)之間的相互關(guān)系和數(shù)據(jù)運(yùn)算。
(8)下列有關(guān)數(shù)據(jù)庫的描述,正確的是________。
A)數(shù)據(jù)庫是一個DBF文件 B)數(shù)據(jù)庫是一個關(guān)系
C)數(shù)據(jù)庫是一個結(jié)構(gòu)化的數(shù)據(jù)集合 D)數(shù)據(jù)庫是一組文件
答案:C
評析:數(shù)據(jù)庫(Database,簡稱DB)是數(shù)據(jù)的集合,它具有統(tǒng)一的結(jié)構(gòu)形式并存放于統(tǒng)一的存儲介質(zhì)內(nèi),是多種應(yīng)用數(shù)據(jù)的集成,并可被各個應(yīng)用程序所共享。數(shù)據(jù)庫中的數(shù)據(jù)具有"集成"、"共享"之特點。
(9)單個用戶使用的數(shù)據(jù)視圖的描述稱為 ______ 。
A)外模式 B)概念模式 C)內(nèi)模式 D)邏輯模式
答案:A
評析:外模式是用戶的數(shù)據(jù)視圖,也就是用戶所見到的數(shù)據(jù)模式;全局?jǐn)?shù)據(jù)視圖的描述稱為概念模式,即數(shù)據(jù)庫中全部數(shù)據(jù)的整體邏輯結(jié)構(gòu)的描述;物理存儲數(shù)據(jù)視圖的描述稱為內(nèi)模式,即數(shù)據(jù)庫在物理存儲方面的描述;存儲模式即為內(nèi)模式。
(10)需求分析階段的任務(wù)是確定______。
A)軟件開發(fā)方法 B)軟件開發(fā)工具 C)軟件開發(fā)費(fèi)用 D)軟件系統(tǒng)功能
答案:D
評析:需求分析是軟件定義時期的最后一個階段,它的基本任務(wù)就是詳細(xì)調(diào)查現(xiàn)實世界要處理的對象(組織、部門、企業(yè)等),充分了解原系統(tǒng)的工作概況,明確用戶的各種需求,然后在此基礎(chǔ)上確定新系統(tǒng)的功能。
(11)若變量a是int類型,并執(zhí)行了語句:a='A'+1.6;,則正確敘述是______。
A)a的值是字符C B)a的值是浮點型
C)不允許字符型和浮點型相加 D)a的值是字符'A'的ASCII值加上l
答案:D
評析:在賦值表達(dá)式中,賦值符右邊的值的類型會自動轉(zhuǎn)換成賦值符左邊的變量的類型。在本題中,先用"A"的ASCII碼值加上1.46得到66.46,然后將它強(qiáng)制轉(zhuǎn)換成int型,轉(zhuǎn)換后,實數(shù)的小數(shù)部分全部
(12)若以下選項中變量已正確定義,則正確的賦值語句是______。
A)x1=26.8%3; B)1+2=x2; C)x3=0x12; D)x4=1+2=3;
答案:C
評析:賦值符號"="就是賦值運(yùn)算符,它的作用是將一個數(shù)據(jù)賦給一個變量。如果賦值運(yùn)算符兩側(cè)的類型不一致,但都是數(shù)值型或字符型時,在賦值時要進(jìn)行類型轉(zhuǎn)換,所以選項A錯誤。在賦值表達(dá)式中,賦值運(yùn)算符的左側(cè)必須是一個變量,所以選項B、D錯誤。選項C是將一個十六進(jìn)制數(shù)賦值給變量x3。
(13)以下程序段的輸出結(jié)果是______。
int a=1234;
printf("%2d\n",a);
A)12 B)34 C)1234 D)提示出錯、無結(jié)果
答案:C
評析:本題主要考查對primf函數(shù)域?qū)捗枋龇睦斫猓谶@里我們要特別注意:輸出數(shù)據(jù)的實際精度并不主要決定于格式項中的域?qū)捙c精度,也不決定于輸入的數(shù)據(jù)精度,而主要決定于數(shù)據(jù)在機(jī)器內(nèi)的存儲精度。
(14)以下選項中不屬于C語言的類型的是______。
A)signed short int B)unsigned char
C)signed long D)long short
答案:D
評析:c語言中歸納起來,基本類型數(shù)據(jù)有以下幾種:
[signed]char;unsigned char;[signed]short[int];unsigned short[int];[signed]long[int];unsigned long[int];float;double.
(15)設(shè)有定義:int a,*pa=&a;以下scanf語句能正確為變量a讀入數(shù)據(jù)的是______。
A)scanf("%d",B); B)scanf("%d",a);
C)scanf("%d",&pa); D)scanf("%d",*pa);
答案:C
評析:scanf函數(shù)要求其中的輸入項必須是地址形式,比如:普通變量的地址、數(shù)組名、指針變量等。對于普通變量,地址形式為:&變量名;當(dāng)一個普通變量的地址賦予了一個指針變量名,scanf函數(shù)的輸入項處就可以直接寫這個指針變量名。
(16)以下程序的輸出結(jié)果是______。
main()
{int a=5,b=4,c=6,d;
printf("%d\n",d=a>c?(a>c?a:C):(b));
}
A)5 B)4 C)6 D)不確定
答案:B
評析:本題最重要的分析d=a>c?(a>c?a:C):(b)),首先運(yùn)算括號內(nèi)的式子a>c?a:c,它的值是c的值6,即式子化成d=a>c?6:4。顯然a=c,所以將4賦給d。
(17)以下程序中,while循環(huán)的循環(huán)次數(shù)是______ 。
main()
{ int i=0:
while(i<10)
{if(i<1)continue;
if(i==5)break;
i++:
}
……
}
A)1 B)10 C)6 D)死循環(huán),不能確定次數(shù)
答案:D
評析:進(jìn)入循環(huán)后,先執(zhí)行一個條件語句,如果i的值小于l,那么直接進(jìn)入下一輪循環(huán),因為i的初始值是0,小于l,故直接進(jìn)入下一輪循環(huán),又因為i的值始終沒有改變,所以這個循環(huán)成了死循環(huán)。
(18)有以下程序:
main()
{
char k;int i;
for(i=1;i<3;i++)
{
scanf("%c",&k);
switch(k)
{
case'0':printf["another\n"];
case'1':printf["number\n");
}
}
}
程序運(yùn)行時,從鍵盤輸入:0l<回車>,程序執(zhí)行后輸出結(jié)果是______。
A)another B)another C)another D)number
number number number number
another number
答案:C
評析:switch語句是多分支選擇語句,執(zhí)行完一個case后面的語句后,流程控制轉(zhuǎn)移到下一個case繼續(xù)執(zhí)行。"case常量表達(dá)式"只是起語句標(biāo)號作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行switch語句時,根據(jù)switch后面表達(dá)式的值找到匹配的入口標(biāo)號,就從此標(biāo)號開始執(zhí)行下去,不再進(jìn)行判斷。
(19)以下程序的輸出結(jié)果是______。
main()
{Int a=O,i;
for(i=1;i<5;i++)
{switch(i)
{ case 0:
case 3:a+=2:
case l:
case 2:a+=3:
default:a+=5;
}
}
printf("%d\n",a)
}
A)3l B)13 C)10 D)20
答案:A
評析:switch結(jié)構(gòu)的執(zhí)行過程同上題。
(20)己定義c為字符型常量,則下列語句中正確的是______。
A)C='97' B)c="97" C)c=97 D)c="a"
答案:C
評析:字符變量占內(nèi)存一個字節(jié),只能放一個字符;字符常量為單引號括起的單個字符;字符串常量為雙引號括起的一串字符(可以0個字符,即"",稱為空串)。選項c為字符ASCII碼的整數(shù)形式。
(21)以下程序的輸出結(jié)果是_________。
main()
f int a=4,b=5,c=0,d;
d=!a&&!b||!c;
printf("%d\n",d);
}
A)l B)0 C)非0的數(shù) D)-1
答案:A
評析:!a值為0,故!a&&!b的值為0,!c的值為l,而0IIl的值應(yīng)該是l。所以答案是A。
(22)以下程序的輸出結(jié)果是_________。
#include<stdio.h>
main()
{int i=0,a=0;
while(i<20)
{for(;;)
{if((i%10)==0)break;
else I--:
}
i+=ll;a+=i;
}
printf("%d\n",a);
}
A)21 B)32 C)33 D)11
答案:B
評析:本題中,有兩個循環(huán)語句。首先,i=0,進(jìn)入while循環(huán),for語句中對循環(huán)沒有任何條件,故直接進(jìn)入for循環(huán),因為0%10結(jié)果還是O,所以跳出for循環(huán),執(zhí)行i+:11,i的值變?yōu)?1,執(zhí)行a+=i,a的值變?yōu)?1:接著進(jìn)入下一輪while循環(huán),在for循環(huán)中,因為i的值是11,對10取余結(jié)果為l,所以執(zhí)行i自減,i的值變成10,進(jìn)入又一輪for循環(huán),因為10%10==0,所以跳出for循環(huán),執(zhí)行i+=1l,i的值變成21,執(zhí)行a+=i,也就是將21+1 1的和賦給a,a=32,因為此時i的值不再小于20,所以結(jié)束循環(huán),
故輸出結(jié)果是32。
(23)有以下程序:
int n(int x,int y)
{retum x>y?x:y;}
Int f2(int x,int y)
{return x>y?y:x;)
main()
{ int a=4,b=3,c=5,d,e,f;
d=f1(a,b);d=fl(d,C);
e=f2(a,b);e=f2(e,C);
f=a+b+C-d-e;
printf("%d,%d,%d\n",d,e,f);
}
程序運(yùn)行后的輸出結(jié)果是_________ 。
A)3,4,5 B)5,3,4 C)5,4,3 D)3,5,4
答案:B
評析:函數(shù)n是一個求兩個整數(shù)中最大值的函數(shù),函數(shù)f2是一個求兩個整數(shù)中最小值的函數(shù)。在main函數(shù)中兩次調(diào)用函數(shù)n,求得變量a、b、、c中的最大值賦值給d;兩次調(diào)用函數(shù)f2,求得變量a、b、c中的最小值賦值給e;表達(dá)式a+b+c-d-e得到中間值,輸出5,3,4。
(24)以下程序的輸出結(jié)果是_________。
int f()
{static int i=0;
int s=1:
s+=i;i++;
return s;
}
main()
{inti,a=0;
for(i=0;i<5;j++)a+=f();
printf("%d\n",a);
}
A)20 B)24 C)25 D)15
答案:D
評析:靜態(tài)變量,在編譯時就為其分配了存儲空間,程序一開始執(zhí)行便被建立,直到該程序執(zhí)行結(jié)束都存在,而不像動態(tài)變量只存在于函數(shù)或分程序被調(diào)用期間。在函數(shù)多次被調(diào)用的過程中靜態(tài)局部變量的值具有可繼承性。
(25)已定義以下函數(shù):
fun(int *p)
{retum *p;}
該函數(shù)的返回值是______ 。
A)不確定的值 B)形參p中存放的值 C)形參p所指存儲單元中的值 D)形參p的地址值
答案:C.
評析:函數(shù)首部fun(int*p)中+p表示這是一個指針變量,指向整型數(shù)據(jù),用來從主調(diào)函數(shù)接收地址;而語句return *p;中的*p代表p所指向存儲單元中的值。
(26)若有以下程序
#include<stdio.h>
Void f(int n);
main()
{void f(int n);
f(5);
}
Void f(int n)
{print("%d\n",n);}
則以下敘述中不正確的是______ 。
A)若只在主函數(shù)中對函數(shù)f進(jìn)行說明,則只能在主函數(shù)中正確調(diào)用函數(shù)f
B)若在主函數(shù)前對函數(shù)f進(jìn)行說明,則在主函數(shù)和其后的其它函數(shù)中都可以正確調(diào)用函數(shù)f
C)對于以上函數(shù)程序,編譯時系統(tǒng)會提示出錯信息;提示對f函數(shù)重復(fù)說明
D)函數(shù)f無返回值,所以可用void將其類型定義為無值型
答案:C
評析:一個函數(shù)在一個文件中的定義只能有一次,但對它的聲明卻可以有很多個。一個函數(shù)可以正確調(diào)用在當(dāng)前函數(shù)之前聲明的函數(shù)。
[NextPage]
(27)有以下程序段:
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
b=p[5];
b中的值是______。
A)5 B)6 C)8 D)9
答案:D
評析:數(shù)組a各元素a[O]~a[9]的值依次為1~10;在程序的說明部分,指針變量p初始化為&a[3](即a+3),則p[5]相當(dāng)于·(p+5),相當(dāng)于a[8],所以執(zhí)行語句b=p[5];后,b的值為9。
(28)在C語言中,形參的缺省存儲類是______。
A)auto B)register C)static D)extern
答案:A
評析:程序進(jìn)行編譯時,并不為形式參數(shù)分配存儲穿間。只有在被調(diào)用時,形式參數(shù)才臨時地占有存儲空間。形式參數(shù)用關(guān)鍵字auto作存儲類別的聲明時,關(guān)鍵字"auto"可以省略,auto不寫則隱含確定為"自動存儲類別",它屬于動態(tài)存儲方式。
(29)有以下定義:
#include<stdio.h>
char a[10],*b=a;
不能給數(shù)組a輸入字符串的語句是______。
A)gets(a); B)gets(a[0]); C)gets(&a[0]); D)gets(b);
答案:B
評析:函數(shù)gets的格式為:gets(字符數(shù)組名)
c語言中,字符數(shù)組名代表數(shù)組的首元素地址,即&a[O],字符指針變量lb值也為數(shù)組a的首地址,選項A、c、D均能給數(shù)組a輸入字符串。選項B中a[O]為數(shù)組元素,是一個數(shù)據(jù)變量。
(30)若指針p已正確定義,要使p指向兩個連續(xù)的整型動態(tài)存儲單元,不正確的語句是 ______.
A)p=2*(int*)malloc(sizeof(int)); B)p=(int*)malloc(2*sizeof(int))
C)p=(int*)malloc(2*2) D)p=(int*)calloc(2,sizeof(int))
答案:A
評析:malloe函數(shù)的作用是在內(nèi)存開辟指定大小的存儲空問,并將此存儲空間的地址作為函數(shù)值帶回,它的原型為void。malloe(unsigned int size),函數(shù)值為指針,這個指針是指向void類型。如果要將此返回地址賦給一個指向特定類型的指針變量,則應(yīng)進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
calloc函數(shù)的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num個大小為size字節(jié)的空間。
(31)下面程序段的輸出結(jié)果是______ 。
main()
{
char strl [10]={'s','t','u','d','e','n','t'};
printf("%d\n",strlen(strl));
}
A)7 B)8 C)10 D)存在語法錯誤
答案:A
評析:strlen()函數(shù)得到字符串的長度,返回值為數(shù)值型。字符數(shù)組初始化,若提供的初值個數(shù)大于數(shù)組長度,則按語法錯誤處理。如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動定義為空字符。
(32)以下程序的輸出結(jié)果是______。
main()
{int x=040;
printf("%o\n",x<<1);
}
A)100 B)80 C)64 D)32
答案:A
評析:040用二進(jìn)制表示就是00100000,左移一位,得到的值應(yīng)該是01000000,化成八進(jìn)制應(yīng)該是0100。
(33)下面程序運(yùn)行后的輸出結(jié)果是______。
main()
{
char arr[2][4];
strcpy(arr[0],"you");strcpy(arr[1],"me");
arr[0][3]='&';
print"%s\n",arr[0]);
}
A)you&me B)you C)me D)err
答案:A
評析:在主函數(shù)中定義了一個2*4的二維字符數(shù)組,執(zhí)行strcpy(arr[O]"fIyou");后,arr[0]={'y''o','u','\0'},執(zhí)行strcpy(arr[1],"me");后arr[1]={ 'm', 'e','\0',不定},當(dāng)執(zhí)行完arr[O][3];'&';從arr[O]開始的存儲空間中的字符依次是'y','o','u','&','m','e','\0',故執(zhí)行printf("%s\n",arr[O]);后的輸出結(jié)果為"you&me",選A。
(34)若要打開A盤上的user子目錄下名為abc.txt的文本文件進(jìn)行讀、寫操作,下面符合 此要求的函數(shù)調(diào)用是______。
A)fopen("A:\user\abc.txt","r") B)fopen("A:\\user\\abc.txt","r+")
C)fopen("A:\user\abc.txt","rb") D)fopen("A:\\user\\abc.txt","w")
答案:B
評析:本題考查點是fopen函數(shù)中文件使用方式的指定。
文件使用方式"r",表示以"只讀"方式打開一個字符文件。
文件使用方式"r+",表示以"讀寫"方式打開一個字符文件。
文件使用方式""rb",表示以"只讀"方式打開一個二進(jìn)制文件。
文件使用方式"w",表示以"只寫"方式打開一個字符文件。
(35)以下不能正確進(jìn)行字符串賦初值的語句為______。
A)char str[5]= "good! " B)char str[]="good! "
C)char *str="good! " D)char str[5]={'g','0','o','d'}
答案:A
評析:用字符串作初值為字符數(shù)組賦值時,系統(tǒng)總會自動在字符串的末尾補(bǔ)上一個"\O",如選項A中定義的話,把第6個字符也就是"\0"賦給str數(shù)組,但此數(shù)組只含5個元素,而放到了s仃數(shù)組之后的存儲單元中,這就可能會破壞其它數(shù)據(jù)區(qū)或程序本身。
(36)有以下程序:
#include<string.h>
main(int argc,char*argv[])
{
int i,len=O;
for(i=1;i<argc;i+=2)len+=strlen(argv[i]);
Print("%d\n",len);
}
經(jīng)編譯連接后生成可執(zhí)行文件ex.exe,若運(yùn)行時輸入以下帶參數(shù)的命令行
ex abcd efg h3 k44
運(yùn)行后輸出結(jié)果是______。
A)14 B)12 C)8 D)6
答案:C
評析:main函數(shù)的第一個參數(shù)argc是int型變量,用來統(tǒng)計命令行中的字符串個數(shù),本題輸入帶參數(shù)的命令行"ex abed efg h3 k44<回車>",argc的值是5;第二個參數(shù)是字符型指針數(shù)組,長度由argc的值決定,每個數(shù)組元素存放一個指向字符串?dāng)?shù)據(jù)的指針。for語句將命令行中兩個字符串a(chǎn)bed和h3的長度進(jìn)行累加,放在變量len中。
(37)若有下面的說明和定義:
struct test
{ int ml;char m2;float m3;
union uu{char ul[5];int u2[2];}ua;
}myaa;
則sizeof(stuct test)的值是______。
A)12 B)16 C)14 D)9
答案:A
評析:在定義了結(jié)構(gòu)體變量后,系統(tǒng)會為之分配內(nèi)存單元,在內(nèi)存中一個整型占2個字節(jié),一個字符占1個字節(jié),一個數(shù)組元素占1個字節(jié),一個浮點型占4個字節(jié)。結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占的內(nèi)存長度之和;而共用體變量所占的內(nèi)存長度等于最長的成員的長度。所以test在內(nèi)存中占12個字節(jié)(2+l+4+5=12)。
(38)若有定義:int aa[8];,則以下謄達(dá)式中不能代表數(shù)組元素aa[1]的地址的是______。
A)&aa[0]+l B)&aa[1] C)aa[0]++ D)aa+1
答案:C
評析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同樣aa[1]的地址也可以直接用&aa[1]或aa+l表示。
(39)下面敘述中正確的是______。
A)全局變量的作用域一定比局部變量的作用域范圍大
B)靜態(tài)類別變量的生存期貫穿于整個程序的運(yùn)行期間
C)函數(shù)的形參都屬于全局變量
D)未在定義語句中賦值的auto變量和static變量的初值都是隨機(jī)值
答案:B
評析:c語言中,全局變量的作用范圍是從定義處到程序結(jié)束,因此全局變量的定義點直接影響其作用范圍,因此選項A錯誤。靜態(tài)(statiC)存儲類別變量是在程序編譯時分配存儲空間,該類別變量在整個程序運(yùn)行期間占據(jù)著固定的存儲單元,當(dāng)多次調(diào)用其所在的函數(shù)時,該類別變量的值為上一次調(diào)用的值,直至整個程序結(jié)束運(yùn)行后才釋放該變量所占存儲單元。因此選項B正確,選項D錯誤。c語言規(guī)定:函數(shù)的形參是auto型局部變量,因此選項c錯誤。
(40)以下程序的輸出結(jié)果是______ 。
f(int b[],int m,int n)
{jnt i,s=0;
for(i=m;i<n;i=i+2)s=s+b[i];
return s;
)
main()
{int x,a[]:{1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
)
A)10 B)18 C)8 D)15
答案:A
評析:本題中,主函數(shù)調(diào)用f函數(shù),在f函數(shù)中執(zhí)行了兩次循環(huán),第一次i=3,s=0+b[i]:4,然后i的值被修改成5,仍然滿足循環(huán)條件,進(jìn)入第二輪循環(huán),s=4+b[5]=4+6=10,隨后,i的值被修改成7,不再滿足循環(huán)條件,退出循環(huán),返回s的值。所以最后輸出結(jié)果是10。
(41)若有以下定義和語句:
int s[4][5],(*ps)[5];
ps=s;
則對s數(shù)組元素的正確引用形式是______ 。
A)ps+l B)*(ps+3) C)ps[0][2] D)*(ps+1)+3
答案:C
評析:選項A得到的是s數(shù)組第一行的地址,選項B得到的是s數(shù)組第三行第零列元素的地址,而選項D得到的是s數(shù)組第一行第三列元素的地址。只有選項c正確引用了ps數(shù)組第零行第二列的元素。
(42)以下程序的輸出結(jié)果是______。
main()
{int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
for(i=0;i<3;i++)
fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];
printf("%d\n",t);
}
A)3 B)4 C)l D)9
答案:B
評析:`兩個循環(huán)語句嵌套使用,在第一次外循環(huán)中,i=0,執(zhí)行內(nèi)循環(huán)時,將j賦值為i的值O,執(zhí)行一次t=t+b[i][b[j][j]],得到t=1,退出內(nèi)循環(huán),接著進(jìn)入第二次外循環(huán),在第二次外循環(huán)結(jié)束時t=2,然后執(zhí)行第三次外循環(huán),得到t=4,退出循環(huán),輸出t的值。
(43)有以下程序:
#definef (x)X*X
main()
{
int i:
i=f(4+4)/f(2+2);
printf("%d\n",i);
}
程序運(yùn)行后的輸出結(jié)果是______。
A)28 B)22 C)16 D)4
答案:A
評析:主函數(shù)中f(4+4)/f(2+2)可按帶參宏定義展開為4+4*4+4/2+2*2+2(千萬不要隨意地添加括號),求得結(jié)果為28。
(44)以下程序的輸出結(jié)果是______。
#inclue<stdio.h>
#inclue<string.h>
main()
{char b1[8]="goddwer",b2[8],*pb=bl+3;
while(--pb>=b1) strcpy(b2,pb);
print("%dha",strlen(b2));
)
A)8 B)3 C)l D)7
答案:D
評析:每次執(zhí)行循環(huán),都是將pb指針指向的內(nèi)容復(fù)制到b2中,第一次循環(huán)中,將b1[2]~b1[7]六個字符復(fù)制到b2中,第二次循環(huán),將b[1]~b[7]七個字符復(fù)制到b2中,第三次循環(huán),將b1數(shù)組的全部內(nèi)容復(fù)制到b2中。而后一次復(fù)制會覆蓋前面的復(fù)制,最后b2的實際長度應(yīng)該是八,而strlen()函數(shù)測出的是一個字符串中"\O"之前的全部字符的個數(shù),所以最后輸出的值是70
(45)在說明語句:int *f();中,標(biāo)識符f代表的是______。
A)一個用于指向整型數(shù)據(jù)的指針變量
B)一個用于指向一維數(shù)組的行指針
C)一個用于指向函數(shù)的指針變量
D)一個返回值為指針型的函數(shù)名
答案:D
評析:一個函數(shù)在編譯時被分配給一個入口地址,這個入口地址就稱為函數(shù)的指針。可以用一個指針變量指向函數(shù),然后通過該指針變量調(diào)用此函數(shù)。Int*f()表示f是一個函數(shù),它帶回一個指針值,這個指針是指向一個整型數(shù)據(jù)的。
(46)下面函數(shù)中,可以把整數(shù)以二進(jìn)制形式存放到文件中的函數(shù)是______。
A)fprintf函數(shù) B)fread函數(shù) C)fwrite函數(shù) D)fputc函數(shù)
答案:C
評析:ANSI c標(biāo)準(zhǔn)提出設(shè)置兩個函數(shù)(fread和fwrite),用來讀寫一個數(shù)據(jù)塊。它們的一般調(diào)用形式為:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中:buffer是一個指針;size是要讀寫的字節(jié)數(shù);count是要進(jìn)行讀寫多少個size字節(jié)的數(shù)據(jù)項;
fb是指文件型指針。如果文件以二進(jìn)制形式打開,用fread和fwrite函數(shù)就可以讀寫任何類型的信息。
(47)不合法的main函數(shù)命令行參數(shù)表示形式是______。
A)main(int a,char*c[]) B)main(int arc,char **arv)
C)main(int argc,char *argv) D)main(int argv,char *arge[])
答案:C
評析:本題主要考查了對main函數(shù)參數(shù)的了解,main函數(shù)可以有兩個形參,一般形式是:main(int argc,char*argv[]),也就是說,它的第一個形參是一個整型變量,第二個形參是一個指針數(shù)組,其元素指向字符型數(shù)據(jù)。
(48)以下程序的輸出結(jié)果是______.
int x=3;
main()
{int i;
for(i=l;i<x;i++)incre();
}
incre()
{ static int x=l;
X*=x+l:
printf("%Di",x);
}
A)3 3 B)2 2 C)2 6 D)2 5
答案:C
評析:incre()中定義一個靜態(tài)局部變量x,它的作用范圍僅限于本函數(shù)中,而不會影響main()函數(shù)中的x值。
(49)有以下結(jié)構(gòu)體說明和變量的定義,且如圖所示指針p指向變量a,指針q指向變量b。則不能把結(jié)點b連接到結(jié)點a之后的語句是________。
struct node
{ char data;
struct node *next;
}a,b,*p=&a,*q=&b;
A)a.next=q; B)p.next=&b; C)p->next=&b; D)(*p).next=q;
答案:B
評析:由于p是一個指向struct node型的指針變量,要訪問該指針變量指向的結(jié)構(gòu)體成員,必須使用->運(yùn)算符或"(*p).成員"的形式,故選項B是錯誤的。
(50)若有以下定義:
struct link
{ int data;
struct link*next;
}a,b,c,*p,*q;
且變量a和b之間已有如圖所示的鏈表結(jié)構(gòu):
指針p指向變量a,q指向變量c。則能夠把c插入到a和b之間并形成新的鏈表的語句組是______。
A)a.next=c;c.next=b; B)p.next=q;q.next=p.next;
C)p->next=&c;q->next=p->next; D)(*p).next=q;(*q).next=&b;
答案:D
評析:本題考的是指針的運(yùn)用。即先將元素a的指針指向q指針?biāo)赶虻脑丶碿,然后將c的指針指向b元素,采取的是直接取元素地址的方式。
二、填空題(每空2分,共40分)
請將每一個空的正確答案寫在答題卡的【1】至【20】序號的橫線上,答在試卷上不得分。
(1)算法的基本特征是可行性、確定性、 【1】 和擁有足夠的情報。
答案:【1】有窮性
評析:算法是指解題方案的準(zhǔn)確而完整的描述。它有4個基本特征,分別是可行性、確定性、有窮性和擁有足夠的情報。
(2)順序存儲方法是把邏輯上相鄰的結(jié)點存儲在物理位置 【2】 的存儲單元中。
答案:【2】相鄰
評析:常用的存儲表示方法有4種,順序存儲、鏈?zhǔn)酱鎯、索引存儲、散列存儲。其中,順序存儲方法是把邏輯上相鄰的結(jié)點存儲在物理位置也相鄰的存儲單元中。
(3)Jackson結(jié)構(gòu)化程序設(shè)計方法是英國的M.Jackson提出的,它是一種面向 【3】 的設(shè)計方法。
答案:【3】數(shù)據(jù)結(jié)構(gòu)
評析:結(jié)構(gòu)化分析方法主要包括:面向數(shù)據(jù)流的結(jié)構(gòu)化分析方法(SA-Structured analysis),面向數(shù)據(jù)結(jié)構(gòu)的Jackson方法(JSD-Jackson system development method)和面向數(shù)據(jù)結(jié)構(gòu)的結(jié)構(gòu)化數(shù)據(jù)系統(tǒng)開發(fā)方法(DSSD-Data structured system development method)。
(4)數(shù)據(jù)庫設(shè)計分為以下6個設(shè)計階段:需求分析階段、 【4】 、邏輯設(shè)計階段、物理 設(shè)計階段、實施階段、運(yùn)行和維護(hù)階段。
答案:【4】概念設(shè)計階段或數(shù)據(jù)庫概念設(shè)計階段
評析:數(shù)據(jù)庫設(shè)計分為以下6個設(shè)計階段:需求分析階段、概念設(shè)計階段、邏輯設(shè)計階段、物理設(shè)計階段、實施階段及數(shù)據(jù)庫運(yùn)行和維護(hù)階段。
(5)數(shù)據(jù)庫保護(hù)分為:安全性控制、 【5】 、并發(fā)性控制和數(shù)據(jù)的恢復(fù)。
答案:【5】完全性控制
評析:考查考生對數(shù)據(jù)庫基本知識的了解。
安全性控制:防止未經(jīng)授權(quán)的用戶有意或無意存取數(shù)據(jù)庫中的數(shù)據(jù),以免數(shù)據(jù)被泄露、更改或破壞;完整性控制:保證數(shù)據(jù)庫中數(shù)據(jù)及語義的正確性和有效性,防止任何對數(shù)據(jù)造成錯誤的操作;并發(fā)性控制:正確處理好多用戶、多任務(wù)環(huán)境下的并發(fā)操作,防止錯誤發(fā)生;數(shù)據(jù)的恢復(fù):當(dāng)數(shù)據(jù)庫被破壞或數(shù)據(jù)不正確時,使數(shù)據(jù)庫能恢復(fù)到正確的狀態(tài)。
(6)設(shè)有int x=ll;,則表達(dá)式(x++ *1/3)的值為 【6】 。
答案:【6】3
評析:白增自減運(yùn)算符的作用是使變量的值增1或減1,如:
++i,--i (在使用i之前,先使i的值加(減)1)
i++,i-- (在使用i之后,使i的值加(減)1)
所以表達(dá)式(x++*1/3)的值即11/3的值:3。
(7)若從鍵盤輸入58,則以下程序的輸出結(jié)果是 【7】 。
main()
{ int a;
Scanf("%d",&a);
If(a>50)printf("%d",a);
If(a>40)printf("%d",a);
if(a>30)printf("%d",a);
}
答案:【7】585858
評析:本題首先為a輸入一個值58,然后執(zhí)行三個判斷語句,在每一個判斷中,如果滿足判斷條件的話,就輸出a,因為三次判斷,條件都滿足,所以三次輸出a。
(8)下列程序運(yùn)行的結(jié)果是 【8】 。
#include<stdio.h>
main()
{
int x=l,i=l:
fOr(;x<50;i++)
{if(x>=10)break;
if(x%2!=1)
{x+=3;continue;}
x-=1;
}
printf("x=%d,i=%d\n",x,i);
}
答案:【8】x=11,i=11
評析:本題程序段通過for循環(huán)語句實現(xiàn)當(dāng)x的值為奇數(shù)時,x自減1:當(dāng)x為偶數(shù)時自加3的功能。程序共執(zhí)行了11次循環(huán),當(dāng)x=11時退出循環(huán)。
(9)以下程序的輸出結(jié)果是 【9】 。
main()
fint a=177;
printf("%o\n",a);
}
答案:【9】261
評析:本題考點是printf函數(shù)的格式字符。"%0"表示以八進(jìn)制整數(shù)形式輸出。
(10)以下程序的輸出結(jié)果是【10】 。
main()
{int a:O;
a+=(a=8);
printf("%d\n",a);
}
答案:【10】16
評析:本題主要考的是運(yùn)算符的優(yōu)先級。
A+=(a=8)可以寫成a:=a+(a=8)的形式,括號的優(yōu)先級高于"+",而"+"的優(yōu)先級又高于"=",所以先執(zhí)行括號內(nèi)的運(yùn)算,將a賦值為8,然后再執(zhí)行+運(yùn)算。
(11)以下定義的結(jié)構(gòu)體類型擬包含兩個成員,其中成員變量info用來存放整型數(shù)據(jù);成 員變量link是指向自身結(jié)構(gòu)的指針。請將定義補(bǔ)充完整。
struct node
{int info;
【11】 link;
};
答案:【11】struct node*
評析:本題考的是如何定義一個指向結(jié)構(gòu)體變量的指針。
一個結(jié)構(gòu)體變量指針就是該變量所占據(jù)的內(nèi)存段的起始地址?梢栽O(shè)一個指針變量,用來指向一個結(jié)構(gòu)體變量,此時該指針變量的值是結(jié)構(gòu)體變量的起始地址。指針變量也可以用來指向結(jié)構(gòu)體數(shù)組中的元素。
(12)以下程序的輸出結(jié)果是 【12】 。
main()
{int s,i;
for(s=O,i=O;i<3;i++,s+=i);
printf("%d\n",s);
}
答案:【12】6
評析:在逗號表達(dá)式內(nèi)按自左至右順序求解,因此本題共執(zhí)行三次循環(huán),具體情形如下:
第一次當(dāng)i=O時,執(zhí)行i++,s+=i,則i=l,s=l:
第二次當(dāng)i=l時,執(zhí)行i++,s+=i,則i=2,s=3;
第三次當(dāng)i=2時,執(zhí)行i++,s+=i,則i=3,s=6。
當(dāng)i=3后退出循環(huán)。
(13)以下程序的輸出結(jié)果是 【13】 。
main()
{char *p="abcdefgh",*r;
1ong *q;
q=(1ong*)p;
q++;
r=(char*)q;
printf("%s\n",r);
}
答案:【13】efgh
評析:指針變量p,r指向字符型數(shù)據(jù),而指針變量q指向長整型數(shù)據(jù)。首先通過類型轉(zhuǎn)換將指針p的值賦給q,然后執(zhí)行q自加,因為q是定義為指向長整型數(shù)據(jù)的變量,而長整型數(shù)據(jù)一般占4個字節(jié)的空間,所以實際上,q的值增加了4,當(dāng)再將q的值經(jīng)過強(qiáng)行類型轉(zhuǎn)換賦給r的時候,實際上這時候r是指向了字符e,所以最后打印字符串時,得到的結(jié)果是"efgh"。
(14)以下程序的輸出結(jié)果是 【14】 。
main()
{int x=0;
sub(&x,8,1);
printf("%d\n",x);
}
sub(int *a,int n,int k、
{if(k<=n) sub(a,n/2,2*k);
*a+:k:
}
答案:【14】7
評析:本題是一個遞歸調(diào)用。
主函數(shù)中調(diào)用sub函數(shù)流程如下:
sub(*x,8,1)-sub(*x,4,2)-sub(*x,2,4)-x=x+k=4
︱ ︱
x=x+k=7 x=x+k=6
(15)以下程序可以將從鍵盤輸入的十進(jìn)制數(shù)(1ong型)以二到十六進(jìn)制數(shù)的形式輸出,請?zhí)羁铡?BR> #include<stdio.h>
main()
{char b[16]={'O','l','2','3','4','5','6','7','8',
'9','A','B',C','D','E','F'};
int c[64],d,i=0,base;
long n:
print("Enter a number:\n");scanlf["%1d',&n);
print("Enter new base:\n");scanf("%ld",&base);
do
{
C[i]= 【15】
i++;n=n/base;
}while [n!=0);
pdntf("'Transmite new base:\n");
f0"--i;i>=O;--i)
{ d=c[I];
printf("%c",b 【16】 ;
}
}
答案:【15】n%base
【16】[d]
評析:進(jìn)制轉(zhuǎn)換的除余取整法。在循環(huán)中,是先對數(shù)n整除以base取余作為轉(zhuǎn)換后的base進(jìn)制數(shù)的第i位存放到數(shù)組元素c[i】中,然后對n整除以base的商作同樣的操作,直到商為O為止,故第一空為n%base。
由于存入到數(shù)組c中的各個元素為對應(yīng)數(shù)制在十進(jìn)制上表示的各位的權(quán)值,在輸出時必須將其轉(zhuǎn)換成對應(yīng)的字符輸出,而在數(shù)組b中對應(yīng)存放了各個數(shù)對應(yīng)的字符,故第二空應(yīng)填[d]。
(16)設(shè)有如下宏定義
#define MYSWAP(z,x,y) {z=x;x=f;y=z;}
以下程序段通過宏調(diào)用實現(xiàn)變量a,b內(nèi)容的交換,請?zhí)羁铡?BR> float a=5,b=16,c;
MYSWAPI( 【17】 ,a,b);
答案:【17】c
評析:本題最重要的是理解宏MYSWAP(z,x,y)的作用:通過z實現(xiàn)x,y的內(nèi)容交換。所以MYSWAP(c,a,b)可以通過c實現(xiàn)a,b內(nèi)容的交換。
(17)以下程序用來統(tǒng)計文件字符的個數(shù),請?zhí)羁铡?BR> #include "stdio.h"
main ()
{FILE *fp;long num=0;
if((fp=fopen("fname.dat","r"))==NULl)
{printf("Open error\n");,exit,(O);}
while( 【18】 )
{num++;}
Printf["num=%ld\n",num];
Fclose(fp);
)
答案:【18】fgetc(fp)!=EOF或!feof(fp)
評析:本程序考的是龜etc函數(shù)。
此函數(shù)的功能是從指針變量印所指向的文件中讀入一個字符,如果執(zhí)行龜etc函數(shù)時遇到文件結(jié)束符,則函數(shù)返回文件結(jié)束符EOF。
(18)以下程序用來輸出結(jié)構(gòu)體變量ex所占存儲單元的字節(jié)數(shù),請?zhí)羁铡?BR> struct st
{char *name;double score;};
main()
{ struct st ex;
print("ex size:%d\n",sizeof( 【19】 ));
}
答案:【19】ex
評析:sizeof函數(shù)計算已知類型所占的字節(jié)數(shù)。sizeof(ex)即計算結(jié)構(gòu)體變量ex在內(nèi)存中所占的字節(jié)數(shù)。
(19)以下程序中,select函數(shù)的功能是:在N行M列的二維數(shù)組中,選出一個最大值作為函數(shù)值返回,并通過形參傳回此最大值所在的行下標(biāo),請?zhí)羁铡?BR> #define N 3
#define M 3
select(int a[N][M],int *n)
{int i,j,row=O,colum=O;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n=row;
retum( 【20】 );
}
main()
{int a[N][M]={9,11,23,6,l,15,9,17,20),max,n;
max=select(a,&n);
printf("max=%d,line=%d\n",max,n);
}
答案:【20】a[row][colum]
評析:本題通過判斷語句,將較大值的行下標(biāo)賦給row,列下標(biāo)賦給colum,循環(huán)結(jié)束后,a[row][colum]中是數(shù)組元素的最大值,所以應(yīng)該把它的行下標(biāo)賦給*n,將a[row][colum]的值返回。