(28)已定義以下函數(shù):
fun(char*p2,char*p1)
{while((*p2=*p1)!='\0'){pl++;p2++;}}
函數(shù)的功能是__________。
A)將p1所指字符串復制到p2所指內(nèi)存空間
B)將pl所指字符串的地址賦給指針p2
C)對p1和p2兩個指針所指字符串進行比較
D)檢查p1和p2兩個指針所指字符串中是否有'\O'
答案:A
評析:由于在while循環(huán)的條件中執(zhí)行了*p2=*pl運算,其作用是將*pl中的內(nèi)容復制到*p2中,而(*p2=*p1)!='\0'的作用是判斷當前字符是否為字符串結束字符'\O'。在循環(huán)體中p1++,p2++的目的是移動字
(29)有以下程序
void fun(char*c,int d)
{*c=*c+1;d=d+1;
printf("%c,%c,",*c,d);
}
main()
{char a:。A',b。'a';
fun(&b,a);printf("%c,%c\n",a,b);
)
程序運行后的輸出結果是_________。
A)B,a,B,a B)a,B,a,B C)A,b,A,b D)b,B,A,b
答案:D
評析:將a,b代入函數(shù)得+&b=。&b+1=a+l=b,所以打印出第一個字母b;
a=a+l=A+l=B,打印出第二個字符B;
a='A',輸出字母A;
b由于是按地址傳到函數(shù)而被修改,為'b',輸出字母b
(30)以下程序中函數(shù)sort的功能是對a所指數(shù)組中的數(shù)據(jù)進行由大到小的排序。
void sort(int a[],im n)
{intiJ,t;
for(i=O;i<n-1;i++)
for=i+1 0<n0++)
if(a[i]<aD)) {t=-a[I];a[I=a[j];a[j]=t;}
}
main()
{int aa[10]:{1,2,3,4,5,6,7,8,9,10},i;
sort(&aa[3],5);
for(i=0;i<lO;i++)primf("%d,",aa[I]);
printf("\n");
)
程序運行后的輸出結果是________。
A)l,2,3,4,5,6,7,8,9,10, B)10,9,8,7,6,5,4,3,2,1,
C)l,2,3,8,7,6,5,4,9,10, D)l,2,10,9,8,7,6,5,4,3,
答案:C
評析:本題并不是對數(shù)組的所有元素進行排序,而是對從a[3]開始往后的4個元素進行排序。
(31)對于基類型相同的兩個指針變量,不能進行的運算是________。
A)< B)= C)+ D)
答案:C
評析:對于指針變量,除了常規(guī)的*、&、=運算外,還可以對其比較地址的大小,計算兩指針變量的差值,但對于地址執(zhí)行+、*、/、%等算術運算都是無意義的。
(32)有以下程序
main()
{char a[]={'a','b','c','d','e','f','g','h','\O'};int I,J;
i=sizeof(a); j=strlen(a);
printf("%d,%d\n",I,J);
}
程序運行后的輸出結果是________。
A)9,9 B)8,9 C)1,8 D)9,8
答案:D
評析:sizeof()函數(shù)是計算字符數(shù)組的長度,因為'\0'也是一個字符,要計算在內(nèi)。strlen()是計算字符串長度的函數(shù),遇到'\0'即認為是字符串結束,不把空字符計入字符串的長度。
(33)以下不能正確定義二維數(shù)組的選項是_________。
A)int a[2][2]={{1},{2}} B)int a[][2]={l,2,3,4}
C)int a[2][2]={{l},2,3} D)int a[2][]={{1,2},{3,4}}
答案:D
評析:在二維數(shù)組進行初始化時,可以省略數(shù)組的一個維度,但省略的維數(shù)只能是高維部分,不能是低維。對于多維數(shù)組的初始化時,也是同樣處理,因此,本題答案應選D,其它選項均能對數(shù)組進行正確的初始化。
(34)有一函數(shù)
┏ l x>O
y=┨ O x=O
┗ -1 x<O
以下程序段中不能根據(jù)x的值正確計算出y的值的是___________。
A)if(x>O)y=l;else if(x==O)y=0;else y=-l;
B)y=O;if(x>O)y=1;else if(x<O)y=-1;
C)y=0;if(x>=0)if(x>O)y=1;else y=-l;
D)if(x>=0)if(x>O)y=l;else y=O;else y=-1;
答案:C
評析:本題應當注意if與else的配對關系。從最內(nèi)層開始,else總是與它上面最近的(未曾配對的)if配對。
(35)以下程序中的函數(shù)reverse的功能是將a所指數(shù)組中的內(nèi)容進行逆置。
void reverse(int a[],im n)
{int i,t;
for(i=O;i<n/2;i++)
{t=a[i];a[i]=a[n-l-i];a[n-1-i]=t;}
}
main()
{int b[10]={1,2,3,4,5,6,7,8,9,10};int i,s=0;
reverse(b,8);
for(i=6;i<10;i++)s+=b[I];
printf("%d\n",s);
}
程序運行后的輸出結果是
A)22 B)10 C)34 D)30
答案:A
評析:本題并不是將整個數(shù)組中的內(nèi)容逆置,而是逆置前8個元素。逆置后的數(shù)組為:8,7,6,5,4,3,2,1,9,10通過for循環(huán)計算b[6]+b[7]+b[8]+b[9]即2+1+9+10=22。
(36)執(zhí)行下面的程序段后,變量k的值為___________。
int k=3,s[2];
s[0]=k;k=s[1]*10;
A)不確定 B)33 C)30 D)10
答案:A
評析:由于本題中未對數(shù)組進行初始化,因此程序運行時,數(shù)組s中各個元素的值都是不確定的,雖然在代碼中對s[O]進行了賦值,但沒有對s[1]進行賦值,故執(zhí)行l(wèi)(=s[1]+10;后,k的值不確定。
(37)有以下程序
#include<string.h>
main()
{ char'p="abcde\0fghjik\O";
printf("%d\n",strlen(p));
}
程序運行后的輸出結果是__________。
A)12 B)15 C)6 D)5
答案:D
評析:"\0"是字符串結束標志,當遇到此標志時字符串已結束。所以字符串的長度為5。
(38)程序中頭文件t)rpel_h的內(nèi)容是:
#define N 5
#define Ml N*3
程序如下:
#include"type 1.h"
#define M2 N*2
main()
{ int i;
i=MI+M2;
printf("%d\n",i);
}
程序編譯后運行的輸出結果是_________。
A)lO B)20 C)25 D)30
答案:C
評析:宏定義就是用一個指定的標識符(即名字)來代表一個字符串,它的一般形式為:
#define 標識符 字符串
這種方法使用戶能以一個簡單的名字代替一個長的字符串,因此把這個標識符(名字)稱為"宏名"。
(39)若有以下的程序段,則在執(zhí)行for語句后,*(*(pt+1)+2)表示的數(shù)組元素是________。
int t[3][3],*pt[3],k;
for(k=0;k<3;k++)pt[k]=&t[k][O];
A)t[2][0] B]t[2][2] C]t[1][2] D]t[2][1]
答案:C
評析:在題面中定義了一個二維數(shù)組l,及一個一維指針數(shù)組pt,在循環(huán)語句中分別對指針數(shù)組賦值為二維數(shù)組t的第k行首元素的地址。*(pt+1),表示的是數(shù)組pt中下標為1的元素的值,而該值為二維數(shù)組t的第l行(從第0行算起)的首元素的地址,故*(*(pt+1)+2)表示的是數(shù)組t中t[1][2]的元素的值。
(40)以下敘述中錯誤的是_________。
A)二進制文件打開后可以先讀文件的末尾,而順序文件不可以
B)在程序結束時,應當用fclose函數(shù)關閉已打開的文件
C)利用fread函數(shù)從二進制文件中讀數(shù)據(jù),可以用數(shù)組名給數(shù)組中所有元素讀入數(shù) 據(jù)
D)不可以用FILE定義指向二進制文件的文件指針
答案:D
評析:每個被使用的文件都在內(nèi)存中開辟一個區(qū),用來存放文件的有關信息,這些信息是保存在一個名為FILE的結構體類型的結構體變量中的。而文件又分為ASCII文件和二進制文件,所以,、可以用FILE定義指向二進制文件的文件指針。
(41)有以下程序
#include<string.h>
main(int argc,char *argv[])
{ inti,len=0;
for(i=1;i<argc;i++)len+=strlen(argv[I]);
printf("%d\n",len);
)
程序編譯連接后生成的可執(zhí)行文件是exl.exe,若運行時輸入帶參數(shù)的命令行是:
exl abcd efg 10↙
則運行的結果是________。
A)22 B)17 C)12 D)9
答案:D
評析:本題主函數(shù)帶有兩個參數(shù),一個int型變量argc,另一個是char型的一維一級指針數(shù)組argv。當主函數(shù)被執(zhí)行時,系統(tǒng)自動將根據(jù)命令行的情況,分別給主函數(shù)的兩個參數(shù)賦值。argc用于存放命令行中命令字和參數(shù)的總和的個數(shù)4,argv用來存放命令行中命令字和所有參數(shù)的字符串,并規(guī)定argv[0]存放命令字字符串exl,argv[1]用來存放第一個參數(shù)的字符串a(chǎn)bcd,argv[21用來存放第二個參數(shù)的字符串e龜,argv[3]用來存放第三個參數(shù)的字符串10。那么for循環(huán)將循環(huán)3次分別將argv數(shù)組中元素的長度累加到len中,所以答案為9。
(42)若有以下說明和定義:__________。
fun(*C){…}
main()
{int(*a)()=fun,(*b)(),w[10],c;}
在必要的賦值后,對fun函數(shù)調(diào)用正確的是_________。
A)a=a(w); B) (*a)(&C); C)b=*b(w); D)fun(b);
答案:B
評析:在主函數(shù)中定義了二個指向函數(shù)的指針a,b,其中指針a指向函數(shù)fun,指針b未初始化。對于選項A、c,其返回類型是錯誤的,對于D,其調(diào)用的參數(shù)是錯誤的,選項B是正確的,其相當于調(diào)用函數(shù)fhll(&C);。
(43)有以下程序
intfa(intx、
{returnx*x;}
int fb(intxl
{returnX*X*x;}
int f(int(*f1)(),int(*f2)(),int x)
{return f2(x)-fl(x);)
main()
{ int i;
i=f(fa,fb,2);printf("%d\n",i);
}
程序運行后的輸出結果是
A) 4 B)1 C)4 D)8
答案:C
評析:f[fa,fb,2]即為fb(2)-fa(2)=2*2*2-2*2=8-4=4。
(44)有以下程序
void ss(char *s,char t)
{while(*s)
{ if(*s==t)*s=t-'a'+'A';
s++:
}
}
main()
{char strl[100]="abcddfefdbd",c='d';
ss(strl,C); printf("%s\n",strl);
}
程序運行后的輸出結果是_________。
A)ABCDDEFEDBD B)abcDDfefDbD
C)abcAAfefAbA D)Abcddfefdbd
答案:B
評析:在主函數(shù)中因為c被賦值為字符'd.,所以函數(shù)的功能是將字符串中d字母轉換為大寫。
(45)下面程序運行后的輸出結果是__________。
intf()
{
static int i=O:
int s=l:
s+=i;i++;
return s:
}
main()
{
inti,a=0;
for(I=0;i<5;i++)a+=f();
printf("%dha",a);
)
A)20 B)24 C)25 D)15
答案:D
評析:在主函數(shù)main中,當I=0時,f()返回1;當I=1時,f()中保留前次執(zhí)行后的i,返回2,i為n時;f()返回n+l,,在主函數(shù)main中一共調(diào)用了5次f(),其返回值分別是1,2,3,4,5,對各次的返回值進行累加,其和為15。
(46)設有如下定義:
struct sk
{int a;
float b:
}data;
int*p;
若要使p指向data中的a域,正確的賦值語句是_________。
A)p=&a; B)p=data.a(chǎn); C)p=&data.a(chǎn); D)*p。data.a(chǎn)
答案:C
評析:將data.a(chǎn)的起始地址賦給指針變量p,也就是使p指向data.a(chǎn)。
(47)有以下程序
#include<stdlib.h>
struct NoDE
{int num;struct NoDE。next;}
main()
{struct NODE *p,*q,*r;
p=(struct NoDE*)malloc(sizeof(struct NODE));
q=(struct NODE*)malloc(sizeof(struct NODE));
r==(struct NODE*)malloc(sizeof(struct NODE));
p->num=10;q->num=20;r->num=30;
p->next=q;q->next=r;
pdntf("%d\n",p->num+q->next->num);
}
程序運行后的輸出結果是____________。
A)10 B)20 C)30 D)40
答案:D
評析:p->num即為10,q->next->num即為r->num,為30,所以p->num+q->next=>num=10+30=40。
(48)若有以下說明和定義
typedef int *INTEGER
INTEGER p,*q;
以下敘述正確的是________。
A)p是int型變量 B)p是基類型為int的指針變量
C)q是基類型為int的指針變量 D)程序中可用INTEGER代替int類型名
答案:B
評析:typedef int*INTEGER;(聲明INTEGER為整型指針類型):
INTEGER p,*q;(定義p,*q為整型指針類型),所以p是基類型為int的指針變量;*q是基類型為int的指針變量;程序中可用*INTEGER代替int類型名。
(49)有以下程序
main()
{unsigned char a,b,c;
a=0x3;b=a︱0x8;c=b<<l;
printf("%d%d\n",b,C);
}
程序運行后的輸出結果是___________。
A)-11 12 B)-6 -13 C)12 24 D)l1 22
答案:D
評析:0x3表示16進制表,"︱"為按位或,"<<"為按位左移,將a,b轉換為二進制數(shù)進行位運算,再將結果以十進制打印出,結果為11 22。
(50)以下程序中函數(shù)f的功能是將n個字符串,按由大到小的順序進行排序。
#include<string.h>
void f(char p[][lO],int n)
{chart[201;int ij;
for(i=0;i<n-1;i++)
for 0=i+l;j<n;j++)
if[strcmp(p[i],p[j])<O]
{strcpy(t,p[i]);strcpy(p[i],pD)};strcpy(p[j],t);)
}
main()
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i;
f(p,5);print"%d\n",strlen(p[0]));
}
程序運行后的輸出結果是__________。
A)6 B)4 C)5 D)3
答案:C
評析:比較字符串的大小是從字符串的第一個字母開始比較,如果第一個字母相同則比較第二個字母,以此類推,直至字符串結束。
二、填空題(每空2分,共40分)
請將每一個空的正確答案寫在答題卡的【l】至【20】序號的橫線上,答在試卷上不得分。
(1)測試的目的是暴露錯誤,評價程序的可靠性;而 【1】 的目的是發(fā)現(xiàn)錯誤的位置并 改正錯誤。
答案:【1】調(diào)試
評析:軟件測試的目標是在精心控制的環(huán)境下執(zhí)行程序,以發(fā)現(xiàn)程序中的錯誤,給出程序可靠性的鑒定:調(diào)試是一個與測試有聯(lián)系又有區(qū)別的概念。具體來說,測試的目的是暴露錯誤,評價程序的可靠性,而調(diào)試的目的是發(fā)現(xiàn)錯誤的位置,并改正錯誤。
(2)在最壞情況下,堆排序需要比較的次數(shù)為 【2】 。
答案:【2】O(nlog2n1)
評析:在最壞情況下,冒泡排序所需要的比較次數(shù)為n(n-1)/2;簡單插入排序所需要的比較次數(shù)為n(n-1)/2;希爾排序所需要的比較次數(shù)為O(n^1.5);堆排序所需要的比較次數(shù)為O(nlog2n)。
(3)若串s="Program,,,則其子串的數(shù)目是 【3】 。
答案:【3】29
評析:串s中共有7個字符,由于串中字符各不相同,則其子串中字符個數(shù)為0的串有1個,即空串;字符個數(shù)為1的字符串有7個;字符個數(shù)為2的字符串有6個;字符個數(shù)為3的字符串有5個;字符個數(shù)為4的字符串有4個;字符個數(shù)為5的字符串有3個;字符個數(shù)為6的字符串有2個;字符個數(shù)為7的字符串有1個;共有1+2+3+4+5+6+7+1=29。
(4)一個項目具有一個項目主管,一個項目主管可管理多個項目,則實體""項目主管""與實體""項目""的聯(lián)系屬于 【4】 的聯(lián)系。
答案:【4】l對多或1:N
評析:兩個實體集間的聯(lián)系實際上是實體集間的函數(shù)關系,這種函數(shù)關系可以有3種,即一對一(1:1)的聯(lián)系、一對多(1:N)或多對一(N:1)的聯(lián)系和多對多(N:N)的聯(lián)系。
(5)數(shù)據(jù)庫管理系統(tǒng)常見的數(shù)據(jù)模型有層次模型、網(wǎng)狀模型和 【5】 三種。
答案:【5】關系模型
評析:數(shù)據(jù)庫管理系統(tǒng)是位于用戶與操作系統(tǒng)之間的一層系統(tǒng)管理軟件,是一種系統(tǒng)軟件,是用戶與數(shù)據(jù)庫之間的一個標準接口,其總是基于某種數(shù)據(jù)模型,可以分為層次模型、網(wǎng)狀模型和關系模型。
(6)以下程序運行后的輸出結果是 【6】 。
main()
{ int x=10,y=20,t=O;
if(x==y)t=x;x=y;y=t;
printf("%d,%d\n",x,y);
}
答案:【6】20,0
評析:在本題給出的程序中,if條件為假,不執(zhí)行t=x;語句,而去執(zhí)行x=y;和y=t;語句,所以打印出x的值為20,y的值為0;但是如果程序這樣寫{t=-x;x=y;y=t;},那么就是實現(xiàn)x與y的交換。
(7)若已知a=20,b=lO,則表達式!a>b的值為 【7】 。
答案:【7】O
評析:c語言中邏輯運算符按由高到低順序依次為:邏輯非(!)、算術運算符、關系運算符、邏輯與(&&)和邏輯或(1f)、賦值運算符。所以表達式!a>b先運算!a的值為0,再運算0>b,所以結果為0。
(8)以下程序運行后的輸出結果是 【8】 。
main()
{intx=15;
while(x>10&&x<50)
{x++;
if(x/3){x++;break;)
else continue;
}
print("%d\n",x);
}
答案:【8】17
評析:當x=15時,while條件為真,執(zhí)行x++;,這時x的值為16,if條件為真,執(zhí)行x++:后跳出循環(huán)體,此時x的值為17a
(9)有以下程序:
#include<stdio.h>
main()
{charc;
while((c=getchar())!d?。)putchat(--C);
}
程序運行時,如果從鍵盤輸入:Y?N?↙,則輸出結果為 【9】 。
答案:【9】X
評析:getchar()只能接收一個字符,當從鍵盤輸入Y?N?↙,系統(tǒng)判斷出第一個字符Y!='?'條件為真,輸出x,繼續(xù)循環(huán),這時while條件不成立,循環(huán)結束。
(10)以下函數(shù)的功能是計算s=1+1/2!+1/3!+……+l/n!,請?zhí)羁铡?BR> double fun(int n)
{double s=0.0,fac=1.O;int i;
for(i=1;i<=n;i++)
{ fac=fac 【10】。
s=s+fac;
}
return s;
}
答案:【10】/i或*1.0/i或*1/I或*(1.0/i)或/(double)i
評析:該程序實現(xiàn)的功能是求各個因式的和,觀察表達式可以看出,只要將i的值的倒數(shù)乘以fac就得到每個因式的值。
(11)下面程序的運行結果是: 【11】 。
#define N 10
#define s(x)X*X
#define f(x)(x*x)
main()
{int i1,i2;
il=1000/s(N);i2=1000/f(N);
printf("%d%d\n",t1,i2);
}
答案:【11】1000 10
評析:根據(jù)宏定義,變量i1的值為1000/10*10=1000,變量i2的值為1000/(10*lO)=lO
(12)以下程序的運行結果是 【12】 。
main()
{
static int a[]={l,2,3,4};
int iJ=2;
for(I=l;i<3;i++)
{n(a);J++;}
printf(%d,%d\n",a[0],J);
}
f1(int a[4])
{
int I,J=l;
for(I=1;i<4;i+|+)
a[I-1]=a[I];
j++;
}
答案:【12】3,4
評析:用static對局部變量聲明,則為該變量分配的空間在整個程序執(zhí)行期間始終存在。n函數(shù)中定義的變量為局部變量,主函數(shù)中j的初值為2,循環(huán)執(zhí)行了兩次,所以j=4。主函數(shù)通過對n的調(diào)用輸出原數(shù)組a[3]的值。
(13)下面程序的運行結果是: 【13】 。
typedef union student
{char name[10];
long sno;
char sex;
float score[4];
}STU;
main()
{STU a[5];
primf("%d\n",sizeof(a));
}
答案:【13】80
評析:共用體變量所占的內(nèi)存長度等于最長的成員的長度,所以變量、STU所占的字節(jié)數(shù)等于其成員score[4]所占的字節(jié)數(shù),即為16個字節(jié),最終打印出共用體數(shù)組a[5]的長度為J6*5=80。
(14)若f1)已正確定義為一個文件指針,d1.dat為二進制文件,請?zhí)羁,以便?讀"而打開此文件:f1):fopen(【14】 );。
答案:【14】"d1.dat"."rb"
評析:ANSIC規(guī)定了標準輸入輸出函數(shù)庫,用fopen()函數(shù)來實現(xiàn)打開文件,其調(diào)用方式為(fb已定義為一個文件指針):fb=fopen(文件名,使用文件方式)。
(15)以下程序的功能是將無符號八進制數(shù)構成的字符串轉換為十進制的整數(shù),請?zhí)羁铡?BR> #include<stdio-b>
main()
{
char*p,s[6];
int n:
p=s;
gets(p);
n=*p-'0';
while(【15】 !='\0')n=n*8+*p-'0';
printf("%d\n",n);
}
答案:【15】*++D
評析:本題中,主要是通過將8進制數(shù)各位上的數(shù)乘以對應位的權值,然后累加轉換成10進制數(shù)的。在程序中,n=*p-'0',用于將8進制字符串的最高位轉換成10進制字符。在while循環(huán)中,通過不斷對已轉換的10進制數(shù)*8+*p-'0'形成新的10進制數(shù)。由于在該循環(huán)中沒有其它地方對指針p的值進行更改,要實現(xiàn)對8進制字符串的遍歷,必須要對其進行自加,而在循環(huán)的外面己處理了第1個8進制字符,故應該是采用先自加的形式,同時要對自加后的p所對應的字符進行判斷以確定該字符串是否結束,故該空應填*++p。
(16)設有定義:int n,*k=&n;,以下語句將利用指針變量k讀寫變量n中的內(nèi)容,請將語 句補充完整。
scanf("%d",【16】);
printf("%d",【17】);
答案:【16】k
【17】*k
評析:本題中的笫一空,要求輸入變量n的地址,而指針變量k指向整型變量n,故填寫k.第二空要求打印輸出變量n的值,應該填入*k。
(17)以下程序的功能是:從鍵盤輸入一行字符,存入一個字符數(shù)組中,然后輸出該字符 串,請?zhí)羁铡?BR> #include<ctype.H>
#include<stdio.h>
main()
{
char str[8l],*sptr;
int i:
for(I=0;i<80;i++)
{ str[I]=getchar();
if(str[I]=='\n')break;
}
str[i]= 【18】;
sptr=str;
while(*sptr)putchar(*sptr【19】 );
}
答案:【18】0或NULL
【19】++
評析:在for循環(huán)中,其作用是直接從標準輸入設備獲取字符,直到遇到回車符結束。由于在while循環(huán)輸出字符時,是根據(jù)*sptr來判斷字符串是否結束,故在字符串的結束部分必須添加上字符'\0'。對于第二空,要實現(xiàn)對字符串的遍歷,必須要進行自加操作,以使下次訪問時能夠訪問下一個字符,故第二空應為++。
(18)fun函數(shù)的功能是:首先對a所指的N行N列的矩陣,找出各行中的最大的數(shù),再求這N個最大值中的最小的那個數(shù)作為函數(shù)值返回。請?zhí)羁铡?BR> #include<stdio.h>
#define N 100
int fun(im(*a)[N])
{ int row,col,max,min;
for(row=0;row<N;row++)
{for(max=a[row][0],col=1;coI<N;col++)
if(【20】]max=a[row][col];
if(row==0)min=max;
else if(max<min)min=max;
}
retummin;
}
答案:【20】max<a[row][col]或max<=a[row][col]或a[row][col]>max或a[row][col]>=max
評析:本題空格所在的if條件要求判斷出每一行中的最大數(shù),應該填寫條件max<a[row][col]。