(28)有以下程序
void fun(char *a,char *b)
{ a=b;
(*a)++;
}
main()
{
char c1='A',c2='a,*p1,*p2;
clrscr0;
pl=&cl;
p2=&c2;
fun(p1,p2);
printf("%c%c\n",cl,c2);
}
程序運行后的輸出結果是__________。
A)Ab B)aa C)Aa D)Bb
答案:A
評析:在函數調用中,可以分值傳遞和地址傳遞。若參數傳遞的是簡單數據類型的數值,稱為值傳遞方式。若參數傳遞的是變量的地址,稱為地址傳遞方式。
(29)若有定義:static int fun(int a,int b),則以下敘述中錯誤的是_________。
A)定義了一個返回值為整型的靜態(tài)函數
B)該函數只能被同一文件內的函數調用
C)該函數可以在任何文件中被調用
D)該函數屬于內部函數
答案:C
評析:根據函數能否被其他源文件調用,將函數區(qū)分為內部和外部函數。如果將函數定義為外部函數,則在函數首部最左端冠以關鍵字eXtem。如果將函數定義為內部函數,則在函數首部最左端冠以關鍵字static。內部函數只能被本文件中的其它函數調用。而外部函數則可以被其他任何c程序文件調用。
(30)以下能正確定義一維數組的選項是_________。
A)int num[]; B)int num[0..100];
C)#define N 100; D)int N=100;
int num[N]; int num[N];
答案:C
評析:有二種方法指定數組長度。其一是直接在數組名后面的方括號內輸入數組的長度。其二是,在定義數組的同時對其賦值,由實際賦值的元素個數自動確定數組的長度。
(31)有以下程序
fun(int a[],intm,int n)
{ int I,J;
for(i=m;i<n;i++)
a[i+ll=a[I]+3;
}
main()
{
int i,a[6l={2,4,6,8,10,12};
clrscr0;
fun(a,2,5);
for(i=O;i<6;i++)
printf("%"a[I]);
}
程序運行后輸出的結果是__________。
A)24691315 B)24691215 C)249121518 D)249121415
答案:B
評析:在調用函數時,既可以用單個的變量作為參數,也可以用數組名作為參數。還可將數組的下標值作為實參使用。在本題中,是將數組名和數組的下標值作為實參。
(32)以下不正確的敘述是__________.
A)在C程序中,逗號運算符的優(yōu)先級最低。
B)在C程序中,T和t是兩個不同的變量
C)若a和b類型相同,在執(zhí)行了賦值表達式a=b后,b中的值將放入a中,而b中的值不變。
D)當從鍵盤輸入數據時,對于整型變量只能輸入整型數據。對于實型變量只能輸入實型數據。
答案:D
評析:在c語言中,為方便表達式的運算,對所有的運算符都設定了一定的優(yōu)先級,其中逗號運算符的優(yōu)先級最低。c語言中的數據有常量和變量之分,其中變量是區(qū)分大小寫的,也就是說T和t是兩個不同的變量名。將某個變量的值賦給其它的變量之后,并不影響其本身的值。當定義一個整型變量后,可以從鍵盤上對其輸入整型值,也可以是字符型的數據。如果將字符型的值賦給整型變量,則它接受的是字符常量的ASCII碼值。實型變量也可以接收整型值。
(33)有以下程序
pf(char *p,int n)
{ int i;
for(i=0;i<n;i++1
p[i]=p[I]+32;
}
main()
{
char a[]="ABCD";
int i:
clrscr();
pf(a,4);
for(i=0;i<4;i++)
printf("%c",a[I]);
}
程序運行后的輸出結果是________。
A)ABCD B)ABCD\0 C)abcd D)abed\0
答案:C
評析:通過指向數組的指針可以引用數組中的任何元素,并且對其進行各種運算。本題中就是通過指向數組的指針將一字符數組中的所有大寫字母轉換成相應的小寫字母。
(34)有以下程序
main()
{
int a[3][3],*p,i;
clrscr();
p=&a[0][0];
for(i=0;i<9;i++)
p[i]:i+2;
printf("%d\n",a[2][11);
}
程序運行后的輸出結果是_________。
A)3 B)6 C)9 D)2
答案:C
評析:當某個指針變量指向多維數組時,可以用其每次加l來順序操作數組中的元素。在此題中,a[3][3]={{2,3,4},{5,6,7},{8,9,10}}。而最后輸出的a[2][1]就是第3行的第2列的元素,即9。
(35)有以下程序
#include<stdio.h>
#define F(X,Y)(X)*(Y)
main()
{
int a=3,b=4;
clrscr();
printf("%d\n",F(a--,++b));
}
程序運行后的輸出結果是_________。
A)8 B)10 C)12 D)15
答案:D
評析。在帶參數的宏定義中,不是簡單的字符替換。其方法是:在程序中如果有帶實參的宏, (如F(x,Y)),則按#define命令行中指定的字符串進行置換。如果串中包含宏中的形參(女NX,Y),、則將程序語句中相應的實參代替形參。本題中的宏定義展開后為:(a.--)*(++b)=(3)*(5)=15。
(36)有以下程序
main()
{
int x=3,y=2,z=l;
printf("%d\n",x/y&&z);
}
程序運行后的輸出結果是_________。
A)0 B)l C)2 D)3
答案:B
評析:在c程序的標準輸出函數prim沖,要注意表達式的優(yōu)先級。如本題的表達式x/y&&z,先運算的是算術運算x/v,結果是1,然后才運算l&&z,結果是1。
(37)下列關于c程序編譯的描述中,錯誤的是_________。
A)在程序的編譯過程中可以發(fā)現所有的語法錯誤
B)在程序的編譯過程中可以發(fā)現部分的語法錯誤
C)在程序的編譯過程中不能發(fā)現邏輯錯誤
D)程序編譯是調試程序的必經過程
答案:B
評析:編譯過程實際上就是調試程序,找出程序中所有可能存在的語法錯誤。但是,對于程序邏輯上的一些錯誤,編譯過程無能為力,只有程序編寫人員自己通過一些良好的編程技巧和方法來排除。
(38)若有以下說明和定義
union、s
{ int i;
char ch
float e
}a;
下列對共用體的操作正確的是________。
A)a='A'; B)re=a;
C)a.i=3; D)printf("%dha",a);
答案:C
評析:共用體實際上用同一內存段來存放幾種不同類型的成員,但在每一瞬時只能存放其中一種,而不是現時存放幾種。因此,不能對共用體名賦值,不能引用共用體名以得到某一個值,也不能把共用體變量作為函數參數。
(39)下列選項中正確的語句組是_________。
A)char s[8];s={"Beijing"}; B)char *s;s={"Beijing"};
C)char s[8];s="Beijing"; D)char *s;s="Beijing";
答案:D
評析:字符串通常是指用一對雙引號括起來的一組字符常量序列。在c語言中,可以直接定義一個指向字符串的指針變量,然后對其賦值為字符串常量后,指向字符串的指針就指向了字符串的首地址。
(40)如果一個C程序由多個文件組成,在將多個文件編譯連接成一個統(tǒng)一的可執(zhí)行文件時,可采用的方法有多種,以下敘述中錯誤的是__________。
A)可以利用Turbo c集成環(huán)境 B)在MS C上進行編譯連接
C)用#include命令 D)用文字處理軟件Word
答案:D
評析:運算多個文件的程序有3種方法,第1種是利用Turbo c集成環(huán)境,先將每個文件輸入并存儲在磁盤上,然后在編譯在狀態(tài)下建立一個"項目文件",最后再編譯連接。第2種方法是在MS c上先分別對多個文件進行編譯得到.obj文件,然后用link命令把四個文件連接起來。第3種方法是用#include命令將多個文件包含進某個文件中。
(41)有以下程序
main()
{
int n,s=0;
clrscr0;
for(n=10;n<30;n++)
{
if(n%3==O)
{ s+=n;
continue;
}
if(s>100)break;
}
printf("%d",s);
}
程序運行后的輸出結果是___________。
A)117 B)147 C)127 D)137
答案:A
評析:continue語句的功能是結束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著執(zhí)行下一次是否執(zhí)行循環(huán)的判定。而break語句是從循環(huán)體內跳出,即提前結束循環(huán)。
(42)有以下程序
main()
{
char s[]={'T','E','A','C','H','E','R'},*p;
clrscr0;
p=s+3;
printf("%c",*p++);
printf("%c",*p++);
}
程序運行后的輸出結果是________。
A)AC B)CH C)HE D)TEA
答案:B
評析:如果有指向字符數組的指針,那么字符數組中的元素可以用指針變量表示,執(zhí)行第一個輸出語句printf("%c",*p++);后,輸出字符'C',執(zhí)行第二個輸出語句printr("%c",*p++);后,輸出字符'H'。
(43)已定義以下函數
fun(char *pl,char*p2)
{
while(('pl='p2)『-'\0'』
{
pl++;
p2++;
}
}
函數的功能是__________。
A)將p2所指字符串復制到pl所指內存空間
B)將p2所指字符串的地址賦給指針p1
C)對pl和p2兩個指針所指字符串進行比較
D)檢查pl和p2兩個指針所指字符串中是否有'\O'
答案:A
評析:指針的白加或自減運算,表示指針向前或向后移動一個存儲單元。
(44)有以下程序
main()
{
char s[][5]={{",",'*'},{",'*',",'*'},{'*'",",",'*'},{",'*',",'*'},{",",'*'}};
int i, j;
for(i=0;i<5;i十+)
{
for(j=O;__________j++)
printf("%c",s[i][I]);
printf("\n");
}
}
若輸出如下的鉆石形平面圖,則在程序的下劃線處應填入的表達式是__________。
*
* *
* *
* *
*
A)j<5 B)j<=5 C)j>5 D)j>=5
答案:A
評析:在一個二維數組中,可以通過其行標和列標來控制其輸出的數據元素。
(45)有以下程序
sum(char *p)
{ *p=*p+3;}
main()
{
char str[10]={"abcde"},*p=str;
clrscr0;
sum(p);
primf("%c\n",*p--);
}
程序運行后的輸出結果是_________。
A)c B)d C)e D)f
答案:B
評析:在用字符指針作為形式參數時,先讓指針p指向字符數組的首地址,然后可以用*(p+i)的形式直接存取各對應單元中的元素,而*p+i的意義則不樣,它是指將指針變量p所指向的存儲單元的值加上i。
(46)已定義以下函數
fun(int *p)
(return *p;)
該函數的返回值是_________。
A)不確定的值 B)形參p中存放的值
C)形參p所指存儲單元的值 D)形參p的地址值
答案:C
評析:指針p是指向一個地址,而*p是表示指針p指向存儲單元中的數據。
(47)有如下語句
int *p, a[]={2,4,6,8,10};
p=a;
則與語句*p++;等價的語句是__________。
A)(*p)++; B)*(p++); C)*(++p); D)++*p;
答案:B
評析:由于++和*同優(yōu)先級,結合方向為自右向左,因此語句*p++;等價于*(p++);,而*(++p)是先使p加l,再取*p的值。語句++*p;相當于++(*p),則是先取p所指變量的值,然后自加l。
(48)下列關于結構體與苯用體的說法中,錯誤的是_________。
A)結構體變量所占內存長度是各成員占的內存長度之和
B)共用體變量所占內存長度是各成員占的內存長度之和
C)共用體變量所占內存長度等于最長成員的長度
D)共用體變量和結構體變量中的所有成員可以是不同數據類型
答案:B
評析:共用體也稱"聯(lián)合體",與結構體定義形式相同,而它們是含義不同的兩類構造數據類型。結構體中每個成員都有自己獨立的內存空間,是所有成員的內存長度之和。而共用體不同,所有成員是共用一個內存區(qū)的,所以共用體變量的內存長度是最長成員的長度。
(49)下列對于文件的打開方式敘述中,錯誤的是_________。
A)用"r"方式打開的文件只能讀
B)用"w"方式打開的文件只能向該文件寫數據
C)用"a"方式打開的文件既能讀,又可以向該文件寫數據
D)如果不能打開文件,fopen函數將會帶回一個錯信息
答案:C
評析:在c程序中打開文件時,必須要確定文件的打開方式。在文件打開函數fopen中,用"r"方式打開的文件只能讀,即從文件向計算機輸入,而不是向文件輸入;用"w"方式打開的文件只能寫,即向文件寫入數據,而不能從文件中向計算機輸入數據。用"a"方式打開的文件只能在文件末尾添加數據。在用"r"方式打開時,fopen函數如果不能打開一個文件,會返回一個出錯信息。
(50)下列關于c語言數據文件的敘述中正確的_________。
A)文件由ASCII碼字符序列組成,c語言只能讀寫文本文件
B)文件由二進制數據序列組成,c語言只能讀寫二進制文件
C)文件由記錄序列組成,可按數據的存放形式分為二進制文件和文本文件
D)文件由數據流形式組成,可按數據的存放形式分為二進制文件和文本文件
答案:D
評析:c語言把文件看作一個字符(字節(jié))的序列,即由一個一個字符(字節(jié))數據順序組成。根據數據的組織形式,可分為ASCII碼文件和二進制文件。因此,一個c文件是一個字節(jié)流或二進制流。它把數據看作是一連串的字符(字節(jié))。而不考慮記錄的界限。換句話說,c語言文件并不是由記錄組成的。
二、填空題(每空2分,共40分)
請將每一個空的正確答案寫在答題卡的【1】至【20】序號的橫線上,答在試卷上不得分。
(1)某二叉樹中共有27個結點,其中度為2的結點有10個,則該二叉樹中有 【1】 個度為l的結點。
答案:【1】6
評析:已知n2=10,根據二叉樹中度為2的結點與葉子結點的關系:n0=n2+l可知,為1l。因此,度為l的結點數為:n1=n-n0-n2=27-10-l1=6
(2)1973年美國學者I.Nassi和B.Shneiderman提出了一種新的流程圖形式。在這種新的流程圖中,完全去掉了帶箭頭的流程線,全部算法寫在一個矩形框內。這種流程圖稱為
【2】 流程圖。
答案:【2】N-S
評析:基于可以用順序結構表示任何復雜算法結構的思想,1973年美國學者I.Nassi和B.Shneiderman提出了一種新的流程圖形式。這種流程圖稱為N-S流程圖(N和s是兩位美國學者的英文姓名的第一個字母)。
(3)在軟件測試過程中,單元測試的目的 【3】 ,多采用白盒測試法。
答案:【3】保證每個模塊單獨運行正確
評析:軟件測試的實施過程分為四步,即單元測試、綜合測試、確認測試利系統(tǒng)測試。其中單元測試的主要的目的是保證每個模塊單獨運行正確:多采用白盒測試法,檢查模塊控制結構的某些特殊路徑,期望覆蓋盡可能多的出錯點。
(4)在數據庫系統(tǒng)中,數據冗余度大大降低的最主要原因是 【4】 。
答案:【4】實現數據共享
評析:數據庫中的數據是可以被多個用戶共享的,這和以前的文件系統(tǒng)有所不同。由于數據庫中的數據實現數據共享,可以極大的降低數據冗余度,并且只花費很少的存儲空間。
(5)在軟件生存周期中,軟件定義階段的主要任務是 【5】 。
答案:【5】確定軟件系統(tǒng)的工程需求
評析:一個軟件生存周期主要包含三個階段,即軟件定義、軟件開發(fā)、軟件維護。軟件定義階段主要任務是確定軟件系統(tǒng)的工程需求。為準確明確軟件的工程需求,軟件定義又分成軟件系統(tǒng)的可行研究和需求分析兩個子階段。
(6)如果在運行以下程序時從鍵盤輸入:bcd<回車>。輸出結果 【6】 。
#include<stdio.h>
main()
{
char I='a'J='a',k='a';
clrscr();
scanf("%c%*c%c",&i,&j,&k);
printf("%c%c%c",i,j,k);
}
答案:【6】bda
評析:在scanf()語句中,如果輸入格式中帶有"*",則變量在接收數據時,自動忽略掉數據輸入序列中"*'對應位置的的數據元素,其對應變量的值從"*"對應位置的下一個數據開始接收。
(7)以下程序運行后的輸出結果是 【7】 。
#define SQ(y) y*y
main()
{ int x=lO,y;
y=SQ(x+3);
primf("%d",y);
}
答案:【7】43
評析:在使用帶參數的宏定義時不是進行簡單的字符替換。如果在程序有帶實參的宏,則按#define命令行中指定的字符串從左到右進行置換。如果是表達式時,一定要注意其替換后得到的表達式。本題中,有宏定義行#define sQ(y) y*y。在用實參x+3進行替換后,其得到的字符串表達式為:x+3*x+3=10+3*10+3=43。
(8)已知字符"A"的ASCII值為65,以下程序運行后的輸出結果是 【8】 。
main()
{
int x=30,y=50,t=4;
char z='A':
clrscr();
if(y>x+2&&y<z-12)
x=y;
y=t;
if(y<z&&y>z-20)
t=x:
x=y;
y=t;
printf("%d,%d,%d\n",x,y,z);
}
答案:【8】4,4, 65
評析:如果多個分支結構處于順序關系時,每個分支語句都要執(zhí)行。本題中的兩個if語句就是這種關系。
(9)以下程序的運行結果是 【9】 。
main()
{
int a=4,b=8,c;
c=("b==a)&&(a+b!=20);
printf("%d,%d,%d\n",a,b,C);
}
答案:【9】4,8,0
評析:如果在表達中出現多種運算符時,一定要撂照他們的優(yōu)先級別進行運算,否則其結果可能會產生錯誤。本題中,由于賦值表達中式c=(a/b==a)&&(a+b!=20)中有兩個括號,而且兩個括號是進行邏輯與運算。當第1個括號內的值為假時,不管后面括號內的值是否為假,兩個括號內的值進行邏輯與(&&)運算時,其結果肯定為假。
(10)以下程序的運行結果是 【10】 。
main()
{
char a='A',b='E';
int sum=1,i=1;
do
{
sum*=i;
i++:
}while(i<=b-a);
printf("%d",sum);
}
答案:【10】24
評析:字符數據進行算術運算時,是將字符對應的ASCII值當作一個整型數據來處理。同樣要將整數進行字符運算時,可以將整數轉換成ASCII值與其相等的字符。
(11)已知數字'0'的AsCII碼值為48,在程序運行時若從鍵盤輸入:096<回車>,則下列程序運行后的輸出結果是 【11】 。
#include<stdio.h>
main()
{ char x,y;
x=getchar();
scanf("%d",&y);
x=x+4; y=y/2;
printf("%c%C",x,y);
}
答案:【11】40
評析:以ASCII碼值為橋梁,可以將字符數據與其ASCII值相等的整型數進行相互轉換,并且可以用這個特性對字符進行一些整型數據的運算。
(12)以下程序中,min函數的功能是求4行5列二維數組每列元素的最小值。請?zhí)羁铡?BR> Void min(int m,int n,int fI)[5],int *bt)
{ inti,j,k=0;
for (j=0;j<n;j++)
{ k=f[0][j]};
for(i=0;i<m;i++)
if( 【12】 )k=f[i][j];
bt[j]=k;
}
}
main()
{ int a[4][5],i,j,b[5];
for(i=0;i<4.i++)
for(j=0;0<5.J++)
scanf("%d",&a[i][j]);
min(4,5,a,b);
f'0r(j=0;j<5;j++)
printf("%d",b[j]);
primf("\n");
}
答案:【12】k>f[i][j]
評析:求二維數組中每列的最小值時,其方法是先讓每列中的第一個元素同第二個元素比較,然后將較小的值保存在臨時變量k中,最后再將k中的值與問列中剩余的元素進行比較,每次都是將較小的值保存在臨時變量k中。靳列比較后完成后,其最小值就是k的值。然后將k值賦給一維數組b啪中對應的單元。最后得到的一維數組b啪中的所有值就是所要求的二維數組中每列的最小值。
(13)有以下程序
main()
{ int a,b,c,d;
clrsc();
scanf("%o",&a);
b=a>>4:
c:~(~0<<4);
d=b&c:
printf("%d,%d\n",a,d);
}
若從鍵盤上輸入331,則程序運行后的輸出結果 【13】 。
答案:【13】217,13
評析: c語言中的位運算符有6種,本程序有其中4種位運算符,分別是左移、右移、取反和按位與運算。
(14)以下程序運行后輸出結果是 【14】 。
int a=30,b=40;
voidfun(int x,inty)
{ int z;
z=(x>y)?x:y;
a=z+10;
b=z+20;
}
main()
{
printf("a=%d,b=%d\n",a,b);
fun(a,b);
printf("a=%d,b=%d\n",a,b);
}
答案:【14】a=30,b=40
a=50,b=60
評析:全局變量的作用域是從定義變量的位置開始到本源文件的結束。在本題中,變量a,b就是屬于全局變量。其初值分別為a=30,b=4O。在沒有對兩個全局變量作任何處理前,它們的值保持原值,所以第1次輸出a,b的值分別是初值a=30,b=40。但在fun函數中a,b的值改變后,其值在結束fun函數后仍然保留,所以第2次輸出a,b的值分別為a=50,b=60。
(15)以下程序運行后的輸出結果是 【15】 。
#include<string.h>
main()
{
int i:
char a[]。"abcdef',*p,*s;
p=a;
for(I=O;i<strlen(a)/2;i++)
{
a[strlen(a)-i-1]=*p;
p++;
}
s=strupr(a);
puts(s);
}
答案:【15】ABCCBA
評析:for循環(huán)是將字符數組a的前半段元素取出,然后按原來相反的順序覆蓋字符數組的后半段。字符串函數strupr的功能是將字符串中小寫字母轉換為大寫字母。然后用字符串輸出函數puts輸出。
(16)以下程序運行后其輸出的結果是 【16】 。
ma(int a)
{ static int y=l,z=2;
y*=a;
Z*=a:
printf("y=%d,z=%d",y,z);
}
main()
{
int i,a=2:
clrsc");
for(i=0;i<3;I++)
{ printf("%d",i);
ma(a);
printf("\n");
}
}
答案:【16】0 y=2,z=4
l y=4,z=8
2 y=8,z=16
評析:靜態(tài)存儲變量的定義方法是在定義變量里,前面加關鍵字static,而且一次允許定義多個靜態(tài)變量。一旦某個變量在函數中被定義成靜態(tài)的類型,在程序運行期間,每次調用函數時,它不再重新賦初值,而是保留上次函數調用結束時的值。.如本題中,在第1次調用函數ma()結束時,y、z的值分別是y=2,z=4。在第2次調用ma()函數時,靜態(tài)存儲變量y、z不再重新被賦初值,而是保留上次結束時的值。
(17)已知有如圖所示的單鏈表,則以下函數的功能是 【17】 。
#include<stdio.h>
typedef struct node
{ int data;
struct node *next;
}Node;
Node *reverlist(Llist *head)
{
Node *p,*q;
if(head&&head->nex0
{
p=head;
q=p->next;
p->next=null;
while(q)
{
p=q;
q=q->next;
p->next=head;
head=p;
}
}
return(head);
答案:【17】逆置單鏈表
知識點:單鏈表的運算
評析:該函數是首先將head指向的鏈表在第l和第2個結點間斷開成前后兩個鏈表,用指針head指向前面單個結點的鏈表,而用指針q指向后面斷開部分的鏈表,每次將指針q指向鏈表的第1個結點取出,然后插入到head指針指向鏈表的最前面,直到q指針指向鏈表的結點全部取出,并插入到head指針指向的鏈表中,最后指針head指向的鏈表就是原來鏈表的逆置鏈表。
(18)以下程序的功能是將一個字符串sl中的內容復制到字符串s2中,請?zhí)羁铡?BR> void copy_string(char *pl,char *p2)
{
for ( ;*p1 !='\0' ;p1 ++,p2++)
【18】 ;
【19】 ;
;
}
main( )
{
char * s1 ="hello!";
char *s2="Good morning!";
prinff("\nstring sl=%s\nstring s2=%s\n",sl,s2);
copy_string( 【20】 );
printf("\nstring sl=%s\nstring s2=%s\n",sl,s2);
答案:【18】*p2=*pl
【19】*p2='\0'
【20】sl,s2
評析:形式參數可以有不同的數據類型,其中本題中的字符指針也是一種形式a在本題中,pl,p2都是字符指針,在調用copy_string函數時,將數組s1的首地址傳給p1,把數組s2的首地址傳給p2。在函數copy_string中的for循環(huán)中,每次將*pl賦給*p2,第1次就是將s1數組的第1個字符賦給s2數組。在執(zhí)行pl++和p2++后,p1和p2就分別指向s1[1]和s2[1]。然后依此類推。在復制所有字符后,還要記得在最后將結束符'\0'賦給p2。