(26)下列程序執(zhí)行后輸出的結(jié)果是___________。
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
評析:本題執(zhí)行過程如下:首先調(diào)用fun函數(shù),使得實參a的值3傳遞給形參p,得到局部變量d=8,打印出局部變量d的值8;返回主函數(shù)執(zhí)行"d+=a++",此處的d為全局變量,所以d=1+3=4(由于本題是值傳遞,所以在函數(shù)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)程序錯誤,宏定義不允許有參數(shù)
答案:C
評析:本題的宏定義是合法的,宏定義展開為3*(3+((A+1)*a))=3*(3+((7+1)*3))=81。
(28)定義int*swap()指的是_______。
A)一個返回整型值的函數(shù)swap()
B)一個返回指向整型值指針的函數(shù)swap()
C)一個指向函數(shù)swap()的指針,函數(shù)返回一個整型值
D)以上說法均錯
答案:B
評析:一個函數(shù)可以帶回一個整型值、字符值、實型值等,但也可以帶回指針型數(shù)據(jù),即地址。本題的定義中,包括括號和·號,由于f)優(yōu)先級高于t。故它是一個返回整型指針的函數(shù)。
(29)以下程序段的輸出結(jié)果是__________。
main()
{ char s1[10],s2[10],s3[10];
scanf("%s",s1);gets(s2);gets(s3);
puts(s 1);puts(s2);puts(s3);
}
輸入數(shù)據(jù)如下: (此處代表回車符)
aaa
bbb
A)aaa B)aaa C)aaa\0bbb\0 D)aaabbb
bbb
bbb
答案:B
評析:scanf是標(biāo)準(zhǔn)輸入函數(shù),在輸入字符串a(chǎn)aa時,實際的內(nèi)容為"aaa\0","\0"是由系統(tǒng)自動加入的;gets的功能是從終端讀入一行字符,即一直讀到換行符為止,并由系統(tǒng)自動以"\0"代替換行符。
(30)下述函數(shù)功能是________。
Int fun(char*x)
{ char*y=x;
while(*y++);
return y-x-l;
}
A)求字符串的長度 B)求字符串存放的位置
C)比較兩個字符串的大小 D)將字符串x連接到字符串y后面
答案:A
評析:在函數(shù)體內(nèi)定義一字符型指針并指向形參,然后遍歷其中各字符直到NULL,最后返回字符串首尾地址的差值,即字符串的長度。
(31)以下程序的輸出結(jié)果是_________。
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(不含)字符的總字符個數(shù)。本題定義字符數(shù)組str的同時,對第7個元素,由系統(tǒng)自動添加上"\0",故字符串的長度為6。
(32)請讀程序段:
char str[]="ABCD",*p=str;
printf("%d\n",*(p+4));
程序段的輸出結(jié)果是_________。
A)68 B)0
C)字符'D'的地址 D)不確定的值
答案:B
評析:在對字符數(shù)組賦字符串值時,系統(tǒng)會自動在字符串的末尾加上一個字符串結(jié)束標(biāo)志"\0",故指向字符數(shù)組的指針p的+(p+4)的值為"\0"。由于"\0"的編碼值就是0,所以本題輸出為0。
(33)若有定義:int a[4][10];,則以下選項中對數(shù)組元素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)設(shè)有以下語句:
char strl[]="string",str2[8],。str3,。str4="strin∥;
則__________不是對庫函數(shù)的正確調(diào)用。
A)strcpy(strl,"HELLOl"); B)strcpy(str2,"HELL02");
C)strcpy(str3,"HELL03"); D)strcpy(str4,"HELL04");
答案:C
評析:c語言中:sgcpy(stl,st2);,其兩個參數(shù)均為字符指針或字符數(shù)組,選項c中的目的串指針str3沒有指向具體有效的存儲單元,故是錯誤的調(diào)用。
(35)請讀程序:
#include
#include
main()
{ char*sl="AbCdEf",*s2="aB";
s1++;s2++;
printf("%d\n",strcmp(s 1,s2));
}
上面程序的輸出結(jié)果是___________。
A)正數(shù) B)負(fù)數(shù) C)零 D)不確定的值
答案:A
評析:函數(shù)strcmp的功能是比較字符串s1和s2,如果sl>s2,則返回個正數(shù);如果sls2,所以函數(shù)的值為正數(shù)。
(36)下面程序的輸出是_________。
char s[]="ABcD";
main()
{ char*p;
for(p=s;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
評析:在第一次執(zhí)行for循環(huán)時,字符數(shù)組的首地址賦給了指針變量p,使得指針變量p指向了s的首地址,輸出p所指向的字符串;第二次執(zhí)行for循環(huán)時,p值增加1,p指向了s的第二個元素輸出BCD;第三次輸出CD;第四次輸出D;直到p指向字符串的結(jié)束字符"\0",for循環(huán)終止執(zhí)行。
(37)以下程序輸出的結(jié)果為__________。
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"的首地址,依此類推。當(dāng)執(zhí)行p=alpha后,p指向指針數(shù)組alpha的首地址。for循環(huán)中輸出了4個字符串。
(38)下面程序的輸出結(jié)果是_________。
#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循環(huán)中,i的初值為3,那么輸出的第一個字符為"s",接著兩次i--,則輸出的值為+p[1],即字符"0",所以本題的輸出為SO。
(39)以下程序的輸出結(jié)果是_________。
#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
評析:由于實參傳送的是變量的地址,所以對形參指針?biāo)赶虻膯卧獌?nèi)容的改變,即對實參內(nèi)容的改變。
(40)若一個外部變量的定義形式為static int x;,那么,其中static的作用應(yīng)該是_______。
A)將變量存儲在靜態(tài)存儲區(qū)
B)使變量x可以由系統(tǒng)自動初始化
c)使x只能在本文件內(nèi)引用
D)使x的值可以永久保留
答案:C
評析:事實上,無論有無static修飾,外部變量都具有A、B和c三種特性。作為一種修飾,static僅是限制此類型外部變量的引用范圍:只能在定義它的文件范圍內(nèi)使用。 (41)以下程序的輸出結(jié)果是________。
#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)展開后應(yīng)為字符串k+l*k+l。
(42)下面是對宏定義的描述,不正確的是_______。
A)宏不存在類型問題,宏名無類型,它的參數(shù)也無類型
B)宏替換不占用運行時間
C)宏替換時先求出實參表達(dá)式的值,然后代入形參運算求值
D)宏替換只不過是字符替代而已
答案:C
評析:宏替換實質(zhì)上就是字符替代,它不可能進(jìn)行計算,故c錯誤。帶參數(shù)的宏與函數(shù)相比,宏在程序編譯之前已經(jīng)將代碼替換到程序內(nèi),執(zhí)行時不會產(chǎn)生類似于函數(shù)調(diào)用的問題,可以說不占用運行時間。
(43)以下程序(程序左邊的數(shù)字為附加的行號)________。
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
評析:字符串復(fù)制函數(shù)strcpy包含在頭文件string.h中,因此,程序中的第l行文件包含命令是錯誤的。
(44)若有如下說明,則__________的敘述是正確的。
struct st
{ int a;
int b[2l;
}a;
A)結(jié)構(gòu)體變量a與結(jié)構(gòu)體成員a同名,定義是非法的
B)程序只在執(zhí)行到該定義時才為結(jié)構(gòu)體st分配存儲單元
c)程序運行時為結(jié)構(gòu)體st分配6個字節(jié)存儲單元
D)類型名struct st可以通過extern關(guān)鍵字提前引用(即引用在前,說明在后)
答案:D
評析:結(jié)構(gòu)體變量a與結(jié)構(gòu)體成員a同名是合法的定義,引用成員a的方法是a.a(chǎn),變量a處于不同的"層次"上,系統(tǒng)完全能夠分清。st是一個結(jié)構(gòu)體名,不會為結(jié)構(gòu)體名分配存儲空間,應(yīng)該是在運行時為結(jié)構(gòu)體變量a分配6個字節(jié)的存儲單元,故選項B和選項C錯誤。
(45)若有以下結(jié)構(gòu)體定義,則________是正確的引用或定義。
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
評析:在定義結(jié)構(gòu)體變量時,不能只用結(jié)構(gòu)體名example或關(guān)鍵字strum進(jìn)行定義,必需要用結(jié)構(gòu)體類型名struct example定義,在引用結(jié)構(gòu)體成員變量時,需要用結(jié)構(gòu)體變量名進(jìn)行引用,所以選D。
(46)下列程序的執(zhí)行結(jié)果是_________。
#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與字符數(shù)組c共占用同一個存儲單元,且此存儲單元為2個字節(jié),通常c[O]位于低字節(jié),c[1]位于高字節(jié),所以x.i的值為266。
(47)已知形成鏈表的存儲結(jié)構(gòu)如下圖所示,則下述類型描述中的空白處應(yīng)填_______。
struct link
Data next
{ char data;
___________
}node;
A)struct link next B)link*next
C)struct next link D)struct link*next
答案:D
評析:在單向鏈表中,由于每個結(jié)點需要存儲下一個結(jié)點的地址,且下一個結(jié)點的數(shù)據(jù)類型與前一個結(jié)點的數(shù)據(jù)類型完全相同,故應(yīng)為struct link*next。
(48)已知小寫字母a的ASCII碼為97,大寫字母A的ASCII.碼為65,以下程序的結(jié)果是__________。
main()
{ unsigned int a=32,b=66;
printf("%c\n",atb);
}
A)66 B)98 C)b D)B
答案:C
評析:位運算符"l"的作用是按位或,即兩個二進(jìn)制數(shù)的相應(yīng)位中只要有一個為1,該位的結(jié)果值為l。最后以字符型輸出, 98對應(yīng)的字符"b"。
(49)C語言庫函數(shù)龜ets(str,n,fp)的功能是_________。
A)從fp指向的文件中讀取長度n的字符串存入str指向的內(nèi)存
B)從fp指向的文件中讀取長度不超過n-l的字符串存入str指向的內(nèi)存
C)從fp指向的文件中讀取n個字符串存/Xstr指向的內(nèi)存
D)從str讀取至多n個字符到文件fp
答案:B
評析:fgets函數(shù)的作用是從指定的文件讀入一個字符串。fgets(str,n,fp);中的n為要求得到的字符的個數(shù),但只從fb指向的文件輸入n-1個字符,然后在最后加一個'\O'字符,因此得到的字符串共有n個字符。
(50)下述程序向文件輸出的結(jié)果是__________。
#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)因文件為二進(jìn)制文件而不可讀
答案:C
評析:fprintf函數(shù)工作時,多個數(shù)據(jù)間不會自動加分隔符,選項A錯誤;浮點數(shù)的輸出格式是"%5.0f"表明其小數(shù)部分輸出O位,即沒有輸出,所以選項B也是錯誤的。二、填空題 (每空2分,共40分)
請將每空的正確答案寫在【l】至【20】序號的橫線上,答在試卷上不得分。
(1)對于長度為n的順序存儲的線性表,當(dāng)隨機(jī)插入和刪除一個元素時,需平均移動元素 的個數(shù)為 【l】 。
答案:【1】n/2
評析:刪除一個元素,平均移動的元素個數(shù)為(n-l+n-2+……+0)n=(n-1)/2;插入一個元素,平均移動元素個數(shù)為(n+n-l+n-2+……+1)n=(n+1)/2;所以總體平均移動元素個數(shù)為n/2。
(2)注釋說明了程序的功能,它分為 【2】 注釋和功能性注釋。
答案:【2】序言性
評析:注釋一般分為序言性注釋和功能性注釋。
(3)軟件測試中路徑覆蓋測試是整個測試的基礎(chǔ),它是對軟件 【3】 進(jìn)行測試。
答案:【3】結(jié)構(gòu)
評析:路徑測試是白盒測試方法中的一種,它要求對程序中的每條路徑最少檢查一次,目的是對軟件的結(jié)構(gòu)進(jìn)行測試。
(4)數(shù)據(jù)庫技術(shù)的主要特點為數(shù)據(jù)的集成性、數(shù)據(jù)的高 【4】 和低冗余性、數(shù)據(jù)獨立性和數(shù)據(jù)統(tǒng)一管理與控制。
答案:【4】共享性
評析:數(shù)據(jù)庫技術(shù)的主要特點有以下幾個方面:數(shù)據(jù)的集成性,數(shù)據(jù)的高共享性與低冗余性,數(shù)據(jù)韻獨立性,數(shù)據(jù)統(tǒng)一管理與控制。
(5)數(shù)據(jù)元素之間 【5】 的整體稱為邏輯結(jié)構(gòu)。
答案:【5】邏輯關(guān)系
評析:數(shù)據(jù)元素之間邏輯關(guān)系的整體稱為邏輯結(jié)構(gòu)。數(shù)據(jù)的邏輯結(jié)構(gòu)就是數(shù)據(jù)的組織形式。
(6)若有定義int m=5,y=2,則執(zhí)行表達(dá)式y(tǒng)+=y-=m*=y后,y的值為 【6】 。
答案:【6】.16
評析:將賦值運算符右側(cè)的"表達(dá)式"的值賦給左側(cè)的變量,并且賦值運算符按照"白右而左"的結(jié)合順序,本題表達(dá)式應(yīng)先算m的值為10,再運算y的值為8,最后計算y=y+(-8)=-8+(-8)=-16。
(7)若x和y都是double型變量,]ix的初值為3.0,y的初值為2.0,則表達(dá)式pow(y,fabs(x))的值為 【7】 。
答案:【7】8.000000
評析: fabs函數(shù)功能是求x的絕對值,計算結(jié)果為double型。pow功能是計算x的y次方的值,計算結(jié)果同樣為double型。所以本題表達(dá)式相當(dāng)于2.0的3.0次方,結(jié)果為8.000000。
(8)設(shè)有char a,b;,若要通過a&b運算屏蔽掉a中的其它位,只保留第2位和第8位(右起為第1位),則b的二進(jìn)制是 【8】 。
答案:【8】10000010
評析:運算"&"的規(guī)則是只有當(dāng)兩個相應(yīng)的二進(jìn)制位都為1時,該位的結(jié)果才為1。要保留第2、8位,只要將其與二進(jìn)制數(shù)10000010相與。
(9)下列程序執(zhí)行后輸出的結(jié)果是 【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
評析:在程序執(zhí)行時,static變量僅初始化一次,下次使用時將使用上次保存的值。
(10)下面程序執(zhí)行后輸出的結(jié)果是 【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函數(shù)的局部變量(值為3)。函數(shù)fun(x*y-m)的值為7*5-3=32,在main函數(shù)中,ftm(a,b)/m中的m應(yīng)取外部變量的值13,因此輸出2。
(11)下列程序執(zhí)行后輸出的結(jié)果是 【11】 。
main()
{ nt arr[10],i,k=0;
for(I=0;i for(I=1;i<4;i++)k+=arr[i]+i;
printf("%d\n",k);
}
答案:【11】12
評析:本題的第一個fur循環(huán)用于給數(shù)組arr賦初值,第二個for循環(huán)用于求和運算。由于第二個fur循環(huán)初始值為1,而循環(huán)條件為i<4,所以求的是art[1]到arr[3]及i的和,所以輸出結(jié)果為12。
(12)下列程序執(zhí)行后輸出的結(jié)果是 【12】 。
struct s
{int x,y;}data[2]={10,100,20,200};
main()
{
struct s*p=data;
printf("%d\n",++(p->x));
}
答案:【12】11
評析:程序中結(jié)構(gòu)體數(shù)組data首地址(即&data[0])賦值給結(jié)構(gòu)體指針變量p,++(p->x)表示先將p所指向的結(jié)構(gòu)體變量的成員x值加1,然后將此x(即data[01.x]輸出。
(13)下面程序有兩個printf語句,如果第一個printf語句輸出的是194,則第二個print語句的輸出結(jié)果是 【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個字節(jié)。注意,本題是以16進(jìn)制輸出的。
(14)以下函數(shù)的功能是計算s=l+l/2!+l/3!+…+l/n!,請?zhí)羁?
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循環(huán)求s表達(dá)式中每一項的和,表達(dá)式"fac=fac/k;"求的是每一項的值,所以k的值應(yīng)為n!,在求n!的時候,可以用上次循環(huán)階乘的值乘i,就可以直接得此次n!,故本題填k=k*i。
(15)下面程序的運行結(jié)果是 【15】 。
main()
{ unsigned a=0112,x;
x=a>>3:
printf("x=%o",x);
}
答案:【15】x=11
評析:在對無符號數(shù)的右移是高位補(bǔ)0。
(16)函數(shù)delete(s,i,n)是作用是從字符串s中刪除從第i個字符開始的n個字符,請?zhí)羁铡?BR> void delete(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 s[j++]=s[k++];
s[j]='\0';
}
答案:【16】length++
【17】i 評析:第一個循環(huán)極有可能是計算串的長度,在i<=length時字符才被刪除,被刪除的是從第i個到第i+n或最后一個間的所有字符。刪除前,應(yīng)判斷i<=length。由于已經(jīng)進(jìn)行了一i運算,故實際應(yīng)填入i
(17)下述函數(shù)統(tǒng)計一個字符串中的單詞個數(shù),單詞是指處在空格之間的字符序列,請?zhí)羁铡?BR> 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
評析:在統(tǒng)計字符串單詞個數(shù)的算法中,本題的flag是為了記錄一個單詞是否結(jié)束。第18空應(yīng)填*s++;如果某個字符不是空格,則必需判斷它是否是單詞,如是,則使得flag的標(biāo)志為1,num的值加1。本題判斷方法是:先判斷s所指向的字符是否為空格,如果是則使得flag=O,否則判斷前一個字符是否是空格,如果是則說明這個字符是一個單詞的開始,將flag標(biāo)志為1,num的值加1,如果不是,則不必記錄。故第19空應(yīng)flag==O或*(s-1)==";最后一個空格需填寫的是返回的單詞的個數(shù),即num
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
評析:本題執(zhí)行過程如下:首先調(diào)用fun函數(shù),使得實參a的值3傳遞給形參p,得到局部變量d=8,打印出局部變量d的值8;返回主函數(shù)執(zhí)行"d+=a++",此處的d為全局變量,所以d=1+3=4(由于本題是值傳遞,所以在函數(shù)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)程序錯誤,宏定義不允許有參數(shù)
答案:C
評析:本題的宏定義是合法的,宏定義展開為3*(3+((A+1)*a))=3*(3+((7+1)*3))=81。
(28)定義int*swap()指的是_______。
A)一個返回整型值的函數(shù)swap()
B)一個返回指向整型值指針的函數(shù)swap()
C)一個指向函數(shù)swap()的指針,函數(shù)返回一個整型值
D)以上說法均錯
答案:B
評析:一個函數(shù)可以帶回一個整型值、字符值、實型值等,但也可以帶回指針型數(shù)據(jù),即地址。本題的定義中,包括括號和·號,由于f)優(yōu)先級高于t。故它是一個返回整型指針的函數(shù)。
(29)以下程序段的輸出結(jié)果是__________。
main()
{ char s1[10],s2[10],s3[10];
scanf("%s",s1);gets(s2);gets(s3);
puts(s 1);puts(s2);puts(s3);
}
輸入數(shù)據(jù)如下: (此處代表回車符)
aaa
bbb
A)aaa B)aaa C)aaa\0bbb\0 D)aaabbb
bbb
bbb
答案:B
評析:scanf是標(biāo)準(zhǔn)輸入函數(shù),在輸入字符串a(chǎn)aa時,實際的內(nèi)容為"aaa\0","\0"是由系統(tǒng)自動加入的;gets的功能是從終端讀入一行字符,即一直讀到換行符為止,并由系統(tǒng)自動以"\0"代替換行符。
(30)下述函數(shù)功能是________。
Int fun(char*x)
{ char*y=x;
while(*y++);
return y-x-l;
}
A)求字符串的長度 B)求字符串存放的位置
C)比較兩個字符串的大小 D)將字符串x連接到字符串y后面
答案:A
評析:在函數(shù)體內(nèi)定義一字符型指針并指向形參,然后遍歷其中各字符直到NULL,最后返回字符串首尾地址的差值,即字符串的長度。
(31)以下程序的輸出結(jié)果是_________。
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(不含)字符的總字符個數(shù)。本題定義字符數(shù)組str的同時,對第7個元素,由系統(tǒng)自動添加上"\0",故字符串的長度為6。
(32)請讀程序段:
char str[]="ABCD",*p=str;
printf("%d\n",*(p+4));
程序段的輸出結(jié)果是_________。
A)68 B)0
C)字符'D'的地址 D)不確定的值
答案:B
評析:在對字符數(shù)組賦字符串值時,系統(tǒng)會自動在字符串的末尾加上一個字符串結(jié)束標(biāo)志"\0",故指向字符數(shù)組的指針p的+(p+4)的值為"\0"。由于"\0"的編碼值就是0,所以本題輸出為0。
(33)若有定義:int a[4][10];,則以下選項中對數(shù)組元素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)設(shè)有以下語句:
char strl[]="string",str2[8],。str3,。str4="strin∥;
則__________不是對庫函數(shù)的正確調(diào)用。
A)strcpy(strl,"HELLOl"); B)strcpy(str2,"HELL02");
C)strcpy(str3,"HELL03"); D)strcpy(str4,"HELL04");
答案:C
評析:c語言中:sgcpy(stl,st2);,其兩個參數(shù)均為字符指針或字符數(shù)組,選項c中的目的串指針str3沒有指向具體有效的存儲單元,故是錯誤的調(diào)用。
(35)請讀程序:
#include
#include
main()
{ char*sl="AbCdEf",*s2="aB";
s1++;s2++;
printf("%d\n",strcmp(s 1,s2));
}
上面程序的輸出結(jié)果是___________。
A)正數(shù) B)負(fù)數(shù) C)零 D)不確定的值
答案:A
評析:函數(shù)strcmp的功能是比較字符串s1和s2,如果sl>s2,則返回個正數(shù);如果sls2,所以函數(shù)的值為正數(shù)。
(36)下面程序的輸出是_________。
char s[]="ABcD";
main()
{ char*p;
for(p=s;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
評析:在第一次執(zhí)行for循環(huán)時,字符數(shù)組的首地址賦給了指針變量p,使得指針變量p指向了s的首地址,輸出p所指向的字符串;第二次執(zhí)行for循環(huán)時,p值增加1,p指向了s的第二個元素輸出BCD;第三次輸出CD;第四次輸出D;直到p指向字符串的結(jié)束字符"\0",for循環(huán)終止執(zhí)行。
(37)以下程序輸出的結(jié)果為__________。
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"的首地址,依此類推。當(dāng)執(zhí)行p=alpha后,p指向指針數(shù)組alpha的首地址。for循環(huán)中輸出了4個字符串。
(38)下面程序的輸出結(jié)果是_________。
#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循環(huán)中,i的初值為3,那么輸出的第一個字符為"s",接著兩次i--,則輸出的值為+p[1],即字符"0",所以本題的輸出為SO。
(39)以下程序的輸出結(jié)果是_________。
#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
評析:由于實參傳送的是變量的地址,所以對形參指針?biāo)赶虻膯卧獌?nèi)容的改變,即對實參內(nèi)容的改變。
(40)若一個外部變量的定義形式為static int x;,那么,其中static的作用應(yīng)該是_______。
A)將變量存儲在靜態(tài)存儲區(qū)
B)使變量x可以由系統(tǒng)自動初始化
c)使x只能在本文件內(nèi)引用
D)使x的值可以永久保留
答案:C
評析:事實上,無論有無static修飾,外部變量都具有A、B和c三種特性。作為一種修飾,static僅是限制此類型外部變量的引用范圍:只能在定義它的文件范圍內(nèi)使用。 (41)以下程序的輸出結(jié)果是________。
#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)展開后應(yīng)為字符串k+l*k+l。
(42)下面是對宏定義的描述,不正確的是_______。
A)宏不存在類型問題,宏名無類型,它的參數(shù)也無類型
B)宏替換不占用運行時間
C)宏替換時先求出實參表達(dá)式的值,然后代入形參運算求值
D)宏替換只不過是字符替代而已
答案:C
評析:宏替換實質(zhì)上就是字符替代,它不可能進(jìn)行計算,故c錯誤。帶參數(shù)的宏與函數(shù)相比,宏在程序編譯之前已經(jīng)將代碼替換到程序內(nèi),執(zhí)行時不會產(chǎn)生類似于函數(shù)調(diào)用的問題,可以說不占用運行時間。
(43)以下程序(程序左邊的數(shù)字為附加的行號)________。
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
評析:字符串復(fù)制函數(shù)strcpy包含在頭文件string.h中,因此,程序中的第l行文件包含命令是錯誤的。
(44)若有如下說明,則__________的敘述是正確的。
struct st
{ int a;
int b[2l;
}a;
A)結(jié)構(gòu)體變量a與結(jié)構(gòu)體成員a同名,定義是非法的
B)程序只在執(zhí)行到該定義時才為結(jié)構(gòu)體st分配存儲單元
c)程序運行時為結(jié)構(gòu)體st分配6個字節(jié)存儲單元
D)類型名struct st可以通過extern關(guān)鍵字提前引用(即引用在前,說明在后)
答案:D
評析:結(jié)構(gòu)體變量a與結(jié)構(gòu)體成員a同名是合法的定義,引用成員a的方法是a.a(chǎn),變量a處于不同的"層次"上,系統(tǒng)完全能夠分清。st是一個結(jié)構(gòu)體名,不會為結(jié)構(gòu)體名分配存儲空間,應(yīng)該是在運行時為結(jié)構(gòu)體變量a分配6個字節(jié)的存儲單元,故選項B和選項C錯誤。
(45)若有以下結(jié)構(gòu)體定義,則________是正確的引用或定義。
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
評析:在定義結(jié)構(gòu)體變量時,不能只用結(jié)構(gòu)體名example或關(guān)鍵字strum進(jìn)行定義,必需要用結(jié)構(gòu)體類型名struct example定義,在引用結(jié)構(gòu)體成員變量時,需要用結(jié)構(gòu)體變量名進(jìn)行引用,所以選D。
(46)下列程序的執(zhí)行結(jié)果是_________。
#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與字符數(shù)組c共占用同一個存儲單元,且此存儲單元為2個字節(jié),通常c[O]位于低字節(jié),c[1]位于高字節(jié),所以x.i的值為266。
(47)已知形成鏈表的存儲結(jié)構(gòu)如下圖所示,則下述類型描述中的空白處應(yīng)填_______。
struct link
Data next
{ char data;
___________
}node;
A)struct link next B)link*next
C)struct next link D)struct link*next
答案:D
評析:在單向鏈表中,由于每個結(jié)點需要存儲下一個結(jié)點的地址,且下一個結(jié)點的數(shù)據(jù)類型與前一個結(jié)點的數(shù)據(jù)類型完全相同,故應(yīng)為struct link*next。
(48)已知小寫字母a的ASCII碼為97,大寫字母A的ASCII.碼為65,以下程序的結(jié)果是__________。
main()
{ unsigned int a=32,b=66;
printf("%c\n",atb);
}
A)66 B)98 C)b D)B
答案:C
評析:位運算符"l"的作用是按位或,即兩個二進(jìn)制數(shù)的相應(yīng)位中只要有一個為1,該位的結(jié)果值為l。最后以字符型輸出, 98對應(yīng)的字符"b"。
(49)C語言庫函數(shù)龜ets(str,n,fp)的功能是_________。
A)從fp指向的文件中讀取長度n的字符串存入str指向的內(nèi)存
B)從fp指向的文件中讀取長度不超過n-l的字符串存入str指向的內(nèi)存
C)從fp指向的文件中讀取n個字符串存/Xstr指向的內(nèi)存
D)從str讀取至多n個字符到文件fp
答案:B
評析:fgets函數(shù)的作用是從指定的文件讀入一個字符串。fgets(str,n,fp);中的n為要求得到的字符的個數(shù),但只從fb指向的文件輸入n-1個字符,然后在最后加一個'\O'字符,因此得到的字符串共有n個字符。
(50)下述程序向文件輸出的結(jié)果是__________。
#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)因文件為二進(jìn)制文件而不可讀
答案:C
評析:fprintf函數(shù)工作時,多個數(shù)據(jù)間不會自動加分隔符,選項A錯誤;浮點數(shù)的輸出格式是"%5.0f"表明其小數(shù)部分輸出O位,即沒有輸出,所以選項B也是錯誤的。二、填空題 (每空2分,共40分)
請將每空的正確答案寫在【l】至【20】序號的橫線上,答在試卷上不得分。
(1)對于長度為n的順序存儲的線性表,當(dāng)隨機(jī)插入和刪除一個元素時,需平均移動元素 的個數(shù)為 【l】 。
答案:【1】n/2
評析:刪除一個元素,平均移動的元素個數(shù)為(n-l+n-2+……+0)n=(n-1)/2;插入一個元素,平均移動元素個數(shù)為(n+n-l+n-2+……+1)n=(n+1)/2;所以總體平均移動元素個數(shù)為n/2。
(2)注釋說明了程序的功能,它分為 【2】 注釋和功能性注釋。
答案:【2】序言性
評析:注釋一般分為序言性注釋和功能性注釋。
(3)軟件測試中路徑覆蓋測試是整個測試的基礎(chǔ),它是對軟件 【3】 進(jìn)行測試。
答案:【3】結(jié)構(gòu)
評析:路徑測試是白盒測試方法中的一種,它要求對程序中的每條路徑最少檢查一次,目的是對軟件的結(jié)構(gòu)進(jìn)行測試。
(4)數(shù)據(jù)庫技術(shù)的主要特點為數(shù)據(jù)的集成性、數(shù)據(jù)的高 【4】 和低冗余性、數(shù)據(jù)獨立性和數(shù)據(jù)統(tǒng)一管理與控制。
答案:【4】共享性
評析:數(shù)據(jù)庫技術(shù)的主要特點有以下幾個方面:數(shù)據(jù)的集成性,數(shù)據(jù)的高共享性與低冗余性,數(shù)據(jù)韻獨立性,數(shù)據(jù)統(tǒng)一管理與控制。
(5)數(shù)據(jù)元素之間 【5】 的整體稱為邏輯結(jié)構(gòu)。
答案:【5】邏輯關(guān)系
評析:數(shù)據(jù)元素之間邏輯關(guān)系的整體稱為邏輯結(jié)構(gòu)。數(shù)據(jù)的邏輯結(jié)構(gòu)就是數(shù)據(jù)的組織形式。
(6)若有定義int m=5,y=2,則執(zhí)行表達(dá)式y(tǒng)+=y-=m*=y后,y的值為 【6】 。
答案:【6】.16
評析:將賦值運算符右側(cè)的"表達(dá)式"的值賦給左側(cè)的變量,并且賦值運算符按照"白右而左"的結(jié)合順序,本題表達(dá)式應(yīng)先算m的值為10,再運算y的值為8,最后計算y=y+(-8)=-8+(-8)=-16。
(7)若x和y都是double型變量,]ix的初值為3.0,y的初值為2.0,則表達(dá)式pow(y,fabs(x))的值為 【7】 。
答案:【7】8.000000
評析: fabs函數(shù)功能是求x的絕對值,計算結(jié)果為double型。pow功能是計算x的y次方的值,計算結(jié)果同樣為double型。所以本題表達(dá)式相當(dāng)于2.0的3.0次方,結(jié)果為8.000000。
(8)設(shè)有char a,b;,若要通過a&b運算屏蔽掉a中的其它位,只保留第2位和第8位(右起為第1位),則b的二進(jìn)制是 【8】 。
答案:【8】10000010
評析:運算"&"的規(guī)則是只有當(dāng)兩個相應(yīng)的二進(jìn)制位都為1時,該位的結(jié)果才為1。要保留第2、8位,只要將其與二進(jìn)制數(shù)10000010相與。
(9)下列程序執(zhí)行后輸出的結(jié)果是 【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
評析:在程序執(zhí)行時,static變量僅初始化一次,下次使用時將使用上次保存的值。
(10)下面程序執(zhí)行后輸出的結(jié)果是 【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函數(shù)的局部變量(值為3)。函數(shù)fun(x*y-m)的值為7*5-3=32,在main函數(shù)中,ftm(a,b)/m中的m應(yīng)取外部變量的值13,因此輸出2。
(11)下列程序執(zhí)行后輸出的結(jié)果是 【11】 。
main()
{ nt arr[10],i,k=0;
for(I=0;i for(I=1;i<4;i++)k+=arr[i]+i;
printf("%d\n",k);
}
答案:【11】12
評析:本題的第一個fur循環(huán)用于給數(shù)組arr賦初值,第二個for循環(huán)用于求和運算。由于第二個fur循環(huán)初始值為1,而循環(huán)條件為i<4,所以求的是art[1]到arr[3]及i的和,所以輸出結(jié)果為12。
(12)下列程序執(zhí)行后輸出的結(jié)果是 【12】 。
struct s
{int x,y;}data[2]={10,100,20,200};
main()
{
struct s*p=data;
printf("%d\n",++(p->x));
}
答案:【12】11
評析:程序中結(jié)構(gòu)體數(shù)組data首地址(即&data[0])賦值給結(jié)構(gòu)體指針變量p,++(p->x)表示先將p所指向的結(jié)構(gòu)體變量的成員x值加1,然后將此x(即data[01.x]輸出。
(13)下面程序有兩個printf語句,如果第一個printf語句輸出的是194,則第二個print語句的輸出結(jié)果是 【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個字節(jié)。注意,本題是以16進(jìn)制輸出的。
(14)以下函數(shù)的功能是計算s=l+l/2!+l/3!+…+l/n!,請?zhí)羁?
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循環(huán)求s表達(dá)式中每一項的和,表達(dá)式"fac=fac/k;"求的是每一項的值,所以k的值應(yīng)為n!,在求n!的時候,可以用上次循環(huán)階乘的值乘i,就可以直接得此次n!,故本題填k=k*i。
(15)下面程序的運行結(jié)果是 【15】 。
main()
{ unsigned a=0112,x;
x=a>>3:
printf("x=%o",x);
}
答案:【15】x=11
評析:在對無符號數(shù)的右移是高位補(bǔ)0。
(16)函數(shù)delete(s,i,n)是作用是從字符串s中刪除從第i個字符開始的n個字符,請?zhí)羁铡?BR> void delete(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 s[j++]=s[k++];
s[j]='\0';
}
答案:【16】length++
【17】i 評析:第一個循環(huán)極有可能是計算串的長度,在i<=length時字符才被刪除,被刪除的是從第i個到第i+n或最后一個間的所有字符。刪除前,應(yīng)判斷i<=length。由于已經(jīng)進(jìn)行了一i運算,故實際應(yīng)填入i
(17)下述函數(shù)統(tǒng)計一個字符串中的單詞個數(shù),單詞是指處在空格之間的字符序列,請?zhí)羁铡?BR> 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
評析:在統(tǒng)計字符串單詞個數(shù)的算法中,本題的flag是為了記錄一個單詞是否結(jié)束。第18空應(yīng)填*s++;如果某個字符不是空格,則必需判斷它是否是單詞,如是,則使得flag的標(biāo)志為1,num的值加1。本題判斷方法是:先判斷s所指向的字符是否為空格,如果是則使得flag=O,否則判斷前一個字符是否是空格,如果是則說明這個字符是一個單詞的開始,將flag標(biāo)志為1,num的值加1,如果不是,則不必記錄。故第19空應(yīng)flag==O或*(s-1)==";最后一個空格需填寫的是返回的單詞的個數(shù),即num