(28)有如下程序
main()
{ int x=3;
do
{ printf("%d",x--);}
while(!x);
}
該程序的執(zhí)行結果是________。
A)321 B)3 C)不輸出任何內容 D)陷入死循環(huán)
答案:B
評析:本題x賦初值為3,當執(zhí)行printf("%d",x--);時,由于X--的作用是先運算x,再將x的值減l,所以,printf輸出的x值為3,等輸出后,x的值減1變?yōu)?,繼續(xù)執(zhí)行,判斷條件!x為假,循環(huán)只被執(zhí)行一次。
(29)設有聲明語句:char a='\72';則變量a__________
A)包含1個字符 B)包含2個字符
C)包含3個字符 D)聲明不合法
答案:A
評析:轉義字符常量'\xx'可以把'\'后面的數(shù)字轉換為對應的ASCII字符。
(30)有以下程序段:
main()
{
int a=5,*b,**c
c==&b;b=&a;
}
程序在執(zhí)行了c=&b;b=&a;語句后,表達式ttc的值是__________。
A)變量a的地址 B)變量b中的地址
C)變量a中的值 D)變量b的地址
答案:C
評析:指針變量是用來存放地址的。&:取地址運算符。+:指針運算符。**c為指針變量*c所指向的存儲單元,*c為指針指針變量c所指向的存儲單元,而c=&b表示c為變量b的地址,b=&a表示b為變量a的地址。表達式一c的值就是變量a中的值。
(31)有如下函數(shù)調用語句
func(recl,rec2+rec3,(rec4,rec5));
該函數(shù)調用語句中,含有的實參個數(shù)是________。
A)3 B)4 C)5 D)有語法錯誤
答案:A
評析:(rec4,rec5)是逗號表達式,它的值是rec5的值。所以該函數(shù)調用語句含有的實參個數(shù)是3。
(32)有如下程序
main()
{
char s[115]={.tabc","de","fgh"};
printf("%e",s[2][6]);
}
其輸出為__________。
A)不確定 B)編譯錯誤 C)g D)輸出null字符
答案:A
評析:由于s[2116]表示字符串已超出了數(shù)組s的表示范圍,在c中不會對數(shù)組越界進行檢查,當數(shù)組越界時,會得到一個不確定的值。
(33)有如下程序
int rune(ira a,int b)
{ remm(a+b);}
main()
{ int x=2,y=5,z=8,r;
r=func(func(x,y),z);
primf("%d\n",r);
}
該程序的輸出結果是________。
A)12 B)13 C)14 D)15
答案:D
評析:調用函數(shù)func(x,y),返回x+y,即7;再調用函數(shù)func(7,z),返回7+z,即15。
(34)有如下程序段
int *p,a=10,b=l;
p=&a; a=*p+b;
執(zhí)行該程序段后,a的值為_________。
A)12 B)11 C)10 D)編譯出錯
答案:B
評析:執(zhí)行p=&a;后,p指向整數(shù)a,*p即p的目標變量,也就是a;所以a=*p+b等價于a=a+b,可知a的值最終為11。
(35)有以下程序:
int*f(int*x,int*y)
{ if(*x<*y)return x;
else returny;
}
main()
{
int a=7,b=8,*p,*q,*r;
p=&a;q=&b;
r=f(p,q);
printf("%d,%d,%d\n",*p,*q,*r);
}
程序運行后輸出結果是_________。
A)7,8,8 B)7,8,7 C)8,7,7 D)8,7,8
答案:B
評析:f函數(shù)的功能是返回地址為x,y的兩個數(shù)中值較的數(shù)的地址,本題輸出結果是7,8,7。
(36)有如下程序
long fib(im n)
{ if(n>2) return(fib(n-1)+fib(n-2));
else return(2);
)
main()
{ printf(%ld\n",fib(3));}
該程序的輸出結果是_________。
A)2 B)4 C)6 D)8
答案:B
評析:函數(shù)舶內部有兩個遞歸調用,當n=3時,fib(n-1)返回2,fib(n-2)也返回2,所以fib(n-I)+fib(n-21的值為4。
(37)下面程序的輸出結果是_________。
main()
{
char str[10],c='a';
inti=0:
for(;i<5;i++)
str[I]=c++;
printf("%s",str);
}
A)abcde B)a C)不確定 D)bcdef
答案:C
評析:字符串少一個結束標志,所以輸出的結果不確定。
(38)在c語言中,函數(shù)中變量的隱含存儲類別是__________。
A)auto B)static C)extern D)無存儲類別
答案:A
評析:函數(shù)中變量的存儲類別包括auto,static,extern,其中auto為隱含存儲類別,static為靜態(tài)存儲類別,register是寄存器存儲類別。A
評析:函數(shù)中變量的存儲類別包括auto,static,extern,其中auto為隱含存儲類別,static為靜態(tài)存儲類別,register是寄存器存儲類別。
(39)有如下程序
#define n 2
#define m N+I
#define NUM 2*m+l
main()
{ int i;
for(i=1;i<=NUM;i++)printtf("%d\n",i);
}
該程序中的for循環(huán)執(zhí)行的次數(shù)是_________。
A)5 B)6 C)7 D)8
答案:B
評析:在c語言中,宏定義在編譯時將被直接替換,所以NUM最后會被替換成2*N+l+l,即2*2+1+1,值為6。因此,for循環(huán)執(zhí)行的次數(shù)為6。
(40)假設在turboc2.0采用small模式編譯如下程序
main()
{
char a[4]:{'a','b'};
char%="abc.t:
printf("%d,%d",sizeof(a),sizeof(b));
}
其輸出結果為_________。
A)4,2 B)4,4 C)4,3 D)2,2
答案:A
評析:用small模式編譯,指針變量占2個字節(jié)。sizeof(array):數(shù)組名array代表數(shù)組本身,sizeof函數(shù)測出的是整個數(shù)組的大小。a數(shù)組的大小為4,b指針變量的大小為2。
(41)有以下函數(shù)
char *fun(char *p)
{ retum p; }
該函數(shù)的返回值是_________。
A)無確切的值 B)形參p中存放的地址值
C)一個臨時存儲單元的地址 D)形參p自身的地址值
答案:B
評析:p本身就是一個字符型指針變量,返回p也就是返回變量p中存放的地址值。
(42)有如下程序段:
#include<stdio.h>
#define Max(a,b)a>b?a:b
main()
{
int a=5,b=6,c=4,d;
d=c+Max(a,b);
printf("%d",d);
}
其輸出結果為__________。
A)10 B)5 C)6 D)編譯錯誤
答案:B
評析:在c語言中,宏定義是直接替換的,所以在c+a>b?a:b這個條件表達式中,c+a>b為真,所以用a的值作為整個表達式的值,而a的值為5,所以整個表達式的值為5。
(43)有如下程序段
int a=14,b=l 5,x;
char c='A':
x=(a&&b) &&(c<'B');
執(zhí)行該程序段后,x的值為________。
A)true B)false C)0 D)l
答案:D
評析:a&&b的值為true,c<'B'的值也為true,所以(a&&b)&&(c<'B')的值為true。但x是int型變量,所以(披&b)&&(c<'B')的值最后要從bool型轉換為int型賦給x。這樣x的值應為l。
(44)下述關于C語言文件的操作的結論中,正確的是________。
A)對文件操作必須先關閉文件
B)對文件操作必須先打開文件
C)對文件操作順序無要求
D)對文件操作前必須先測文件是否存在,然后再打開文件。
答案:B
評析:在c中對文件操作必須先打開文件,待文件操作完畢后要關閉文件。對文件以讀的方式進行打開操作時,同時會執(zhí)行文件的檢查文件是否存在,不存在將會返回空的文件指針,如果對文件以寫的方式打開時,文件不存在,將會自動創(chuàng)建文件,.因此在C中打開文件前不必對其檢查文件是否存在,故答案為B。
(45)下列關鍵字中,不屬于C語言變量存儲類別的是________。
A)register B)auto C)extem D)public
答案:D
評析:變量的存儲類別具體包含四種:自動的(auto),靜態(tài)的(statiC),寄存器的(register),外部的(extern)。
(46)有如下說明
im a[10]={l,2,3,4,5,6,7,8,9,10},*p=a;
則數(shù)值為9的表達式是________。
A)木p+9 B)半(p+8) C)牛p+=9 D)p+8
答案:B
評析:p是指針,p+8是地址值,D是錯的;*p是p的目標變量,即a[0],值為1,所以+p+9的值是lO,而*p+=9值是重新給a[O]賦了值(1+9);所以A和C也是錯的。p+8是地址值,指向a[8],那么*(p+8)。的值就是a[81的值,即9。
(47)若有以下定義:int t[3][2];能正確表示t數(shù)組元素地址的表達式是________。
A)&t[3][2] B]t[3] C]t[1] D]*t[2]
答案:C
評析:A和B兩個表達式都已越界了;*t[2]是目標變量,即一個整數(shù),而不是地址值。
(48)下面程序運行后的輸出結果是________。
struct abc
{
int a,b,c;
}
main()
{
struct abc s[2]={{1,2,3},{4,5,6}};
int t=-s[0].a+s[1].b;
printf("%d\n",t);
}
A)5 B)6 C)7 D)8
答案:B
評析:在main函數(shù)中定義了一個struct abc類型的數(shù)組,同時分別利用{1,2,3}及{4,5,6}對數(shù)組中兩個元素進行初始化。在該結構體,依次對其中的a,b,c三個變量進行初始化。故s[O].a=l,s[1].b=5,所以本題輸出為6。
(49)有如下程序
main()
{
int a[31131。{{1,2},{3,4},{5,6}},i,j,s=0;
for(i=l;i<3;i++)
for(j=0;j<=i;j++)
s+=a[I][j];
printf("%d\n",s);
}
該程序的輸出結果是________。
A)18 B)19 C)20 D)2l
答案:A
評析:題中的外循環(huán)只執(zhí)行了2次:
第1次:a[1][0]=3,a[1][1]=4,所以s=7;
第2次:a[2][O]=5,a[2][1]=6,a[2][2]=0,所以s=7+5+6+0=18。
(50)若己建立如下圖所示的單向鏈表結構:
在該鏈表結構中,指針p、s分別指向圖中所示結點,則不能將s所指的結點插入到鏈表末尾仍構成單向鏈表的語句組是__________。
A)p=p->next;s->next:p;p->next=s;
B)p=p->next;s->next:p->next;p->next=s;
C)s->next:NULL;p=p->next;p->next:s;
D)p=(*p).next;(*s).next=(*p).next;(*p).next=s;
答案:A
評析:在答案A中:p=p->next;s->next=p;p->next=s;s的確已插到了鏈表的末尾,但它的next卻并沒有為NULL,而是指向了它的直接前趨p,這樣它就不是一個單向鏈表(單向鏈表最后一個結點的next指針一定是一個NULL)。
二、填空題(每空2分,共40分)
請將每一個空的正確答案寫在答題卡的【1】至【20】序號的橫線上,答在試卷上不得分。
(1)在運算過程中,能夠使空表與非空表的運算統(tǒng)一的結構是 【1】 。
答案:【1】循環(huán)鏈表
評析:在鏈表的運算過程中,采用鏈接方式即循環(huán)鏈表的結構把空表與非空表的運算統(tǒng)一起來。循環(huán)鏈表具有兩個特點:
①在循環(huán)鏈表中增加了一個表頭結點,其數(shù)據域為任意或根據需要來設置,指針域指向線性表的第一個元素的結點。循環(huán)鏈表的頭指針指向表頭結點。
、谘h(huán)鏈表中最后一個結點的指針不是空,而是指向表頭結點。
(2)軟件工程研究的內容主要包括: 【2】 技術和軟件工程管理。
答案:【2】軟件開發(fā)
評析:基于軟件工程的目標,軟件工程的理論和技術性研究的內容主要包括:軟件開發(fā)技術和軟件工程管理。
軟件開發(fā)技術包括:軟件開發(fā)方法學、開發(fā)過程、開發(fā)工具和軟件工程環(huán)境,其主體內容是軟件開發(fā)方法學。
軟件工程管理包括:軟件管理學、軟件工程經濟學、軟件心理學等內容。
(3)與結構化需求分析方法相對應的是 【3】 方法。
答案:【3】結構化設計
評析:與結構化需求分析方法相對應的是結構化設計方法。結構化設計就是采用最佳的可能方法設計系統(tǒng)的各個組成部分以及各個成分之間的內部聯(lián)系的技術。也就是說,結構化設計是這樣一個過程,它決定用哪些方法把哪些部分聯(lián)系起來,才能解決好某個具體且有清楚定義的問題。
(4)關系模型的完整性規(guī)則是對關系的某種約束條件,包括實體完整性、 【4】 和自定義完整性。
答案:【4】參照完整性
評析:關系模型允許定義三類數(shù)據約束,它們是實體完整性、參照完整性以及用戶定義的完整性約束,其中前兩種完整性約束由關系數(shù)據庫系統(tǒng)自動支持。
實體完整性約束要求關系的主鍵中屬性值不能為空,這是數(shù)據庫完整性的最基本要求,因為主鍵是惟一決定元組的,如為空則其惟一性就成為不可能的了。
參照完整性約束是關系之間相關聯(lián)的基本約束,它不允許關系引用不存在的元組:即在關系中的外鍵要么是所關聯(lián)關系中實際存在的元組,要么是空值。
自定義完整性是針對具體數(shù)據環(huán)境與應用環(huán)境由用戶具體設置的約束,它反映了具體應用中數(shù)據的語義要求。
(5)數(shù)據模型按不同的應用層次分為三種類型,它們是 【5】 數(shù)據模型、邏輯數(shù)據模型和物理數(shù)據模型。
答案:【5】概念
評析:數(shù)據模型按不同的應用層次分為三種類型,它們是概念數(shù)據模型、邏輯數(shù)據模型和物理數(shù)據模型。
概念數(shù)據模型簡稱概念模型,是一種面向客觀世界、面向用戶的模型;它與具體的數(shù)據庫管理系統(tǒng)無關。
(6)表示""整數(shù)x的絕對值大于5""時值為""真""的C語言表達式是 【6】 。
答案:【6】x>5‖x<-5或k<-5‖x>5
評析:要使整數(shù)x的絕對值大于5,則x大于5或x小于-5,用c語言表示即為:x>5‖x<-5或者x<-5‖x>5。
故本題答案為:x>5‖x<-5或者x<-5‖x>5。
(7)以下程序的輸出結果是 【7】 。
main()
{ unsigned short a=65536;int b;
printf("%d\n",b=a);
}
答案:【7】0
評析:對于一個unsigned short來說,它能取的最大值是65535。這里給a賦值65536,已經超出了它的取值范圍,這樣它的高位將被截掉,只把低位賦給它(全零)。所以a的值實際為0。
(8)若有定義:ira a=lO,b=9,c=8;,接著順序執(zhí)行下列語句,變量b中的值是 【8】 。
c=(a-=(b-5));
c=(a%11)+(b=3);
答案:【8】3
評析:這里:b-5=4,a.=4之后a的值為6,并把它賦給c。此時b的值并未被改變。在第2個表達式中,也只有賦值表達式b=3改變了b的值。所以兩行語句執(zhí)行完畢,b的值應該為3。
(9)以下程序運行后的輸出結果是 【9】 。
main()
{
int p=30;
primf("%d\n",(p/3>O?p/10:p%3));
}
答案:【9】3
評析:條件表達式的一般形式為:表達式17表達式2:表達式3條件運算符的執(zhí)行順序:先求解表達式1,若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值;若表達式l的值為0(假)-,則求解表達式3,表達式3的值就是整個條件表達式的值。30/3=10>0,所以執(zhí)行p/lO,結果為3。
(10)函數(shù)pi的功能是根據以下近似公式求n值:
(∏*∏)/6=1+1/(2*2)+1/(3*3)+…+1(n*n)
現(xiàn)在請你在下面的函數(shù)中填空,完成求n的功能。
#include"math.H"
{ double s=0.0;long i;
for(i=1;i<=n;i++)s=s+ 【10】 ;
retum(sqrt(6*s));
}
答案:【10】1.O/(i*i1或(double)l/(i*i)
評析:表達式1+1/(2*2)+l/(3*3)+…+1(n*n)可寫為:1/(1*1)+1/(2*2)+1/(3*3)+…+1(n*n)
n
即:∑l÷(i×i)
i-l
對應的c語言的表達式:s=s+1.O/(i*i)。注:必須要寫成1.0的形式,否則1/(i*i)返回值為其值截尾取整,即恒為O。
(11)函數(shù)pi的功能是根據以下公式近似求得的:
pi*pi/6=1+1/(2*2)+1/(3*3)+…+1/(n*n)
請在下面的函數(shù)中填空,完成求pi的功能。
#include<math.h>
double pi(10ng n1
{ double s=O.O,long i;
for(i=1;i<=n;I++)s=s+ 【11】 ;
return(sqrt(6*s));
}
答案:【11】1.0/i/i或1.O/(i*i)
評析:由題面中提供的計算pi的公式可知:在第i項其值為1/(i*i),考慮到運算結果為浮點數(shù),故必須要將l轉化為浮點數(shù)或采用1.O/(i*i)的形式。故本題應填1.O/(i*i)或其等效形式。
(12)若輸入字符串:abcde/,則以下while循環(huán)體將執(zhí)行 【12】 次。
while((ch=getchar())=='e')printf("*");
答案:【12】0
評析:函數(shù)getchar()是從鍵盤得到用戶輸入的一個字符。用戶輸入的第1個字符是a,不管后面輸入的是什么ch的值都是'a',因此條件(ch=getchar())=='e'為假,這個循環(huán)不會被執(zhí)行。
(13)以下函數(shù)用來求出兩整數(shù)之和,并通過形參將結果傳回,請?zhí)羁铡?BR> voidfunc(intx,inty, 【13】 z]
{ *z-x+y;},
答案:【13】int*
評析:從題中代碼可知:z應該是一個整型指針,因此應填:int*
(14)若有以下定義,則不移動指針p,且通過指針p引用值為98的數(shù)組元素的表達式是 【14】 。
int w[10]={23,54,10,33,47,98,72,80,61},*p=w;
答案:【14】p[5]或*(p+5)
評析:98是數(shù)組w的第5個元素(最開始的為第O個),而通過*p=w已經將p指向了數(shù)組w,要想不移動指針p而引用98,可以有以下兩種寫法:p[5]、*(p+5)。
(15)設在主函數(shù)中有以下定義和函數(shù)調用語句,且fun函數(shù)為void類型;請寫出fun函 數(shù)的首部 【15】 。要求形參名為b。
main()
{ double s[10][22];
int n:
……
fun(s);
……
}
答案:【15】void fun(double b[1011221]
評析:本題答案:void fun(double b[10][22])
(16)有以下程序:
int f(int n)
{ if(n==1)return 1;
else return f(n-1)+1;}
main()
{ int i j=0;
for(i=1;i<3;i++)j+=f(i);
printf("%d\n"'j);
}
程序運行后的輸出結果是 【16】 。
答案:【16】3
評析:i=l時,f(1)=1 J=j+f(1)=0+1=1;i=2時,f(2)=f(1)+l=1+1=2 j=j+f(2)=l+3=3;此時循環(huán)結束,程序運行后的輸出結果是3。
(17)以下程序的輸出結果是 【17】 。
void fun()
{ static int a:0;
a+=2;printf("%d",a);
}
main()
{ int cc;
for(CC=1;cc<4;cc++)fun();
printf("\n");
}
答案:【17】246
評析:循環(huán)for(cc=l;cc<4;cc++)被執(zhí)行了3次。在函數(shù)fun中,由于a是static型變量,所以函數(shù)第1次調用后,a=2;第2次調用后,a=4;第3次調用后,a=6。
(18)實現(xiàn)程序可將磁盤中的一個文件復制到另一個文件中,兩個文件的文件名在可執(zhí)行命令的命令行中(相當于copy命令),假定文件在當前目錄下。請補全程序。
#include<stdio.h>
void main(int argc,char。argv[])
{ FILE *f1,*f2;
if(argc< 【18】 )
{ printf("parameter error!\n");exit(0);}
fl=fopen(argv[1],"r");
f2=fopen(argv[2],"w");
while( 【19】 )fputc(fgetc(f1),f2);
fclose(f1);
fclose(f2);
}
答案:【18】3
【19】!feof(f1)
評析:在c語言中,宏定義是直接替換的,所以在對表達式MAX(a+b,c+d)*10進行或替換后,表達式變?yōu)椋?a+b)>(c+d)?(a+b):(c+d)*10
在這個條件表達式中,(a+b)>(c+d)為真,所以用(a+b)的值作為整個表達式的值(否則用(c+d)*10的值作為整個表達式的值),而(a+b)的值為7。所以整個表達式的值為7。
(19)以下程序的輸出結果是 【20】 。
#define MAX(x,y)(x)>(y)?(x):(y)
main()
f int a=5,b=2,c=3,d=3,t;
t=MAX(a+b,c+d)*10;
printf("%d\n",t);
}