二、填空題。
(1)算法的復雜度主要包括空間復雜度和【1】復雜度。
【解析】算法的復雜度主要指時間復雜度和空間復雜度。
(2)在線性結構中,隊列的操作順序是先進先出,而棧的操作順序是【2】 。
【解析】隊列和棧都是線性結構,但是不同之處在于隊列的操作順序是先進先出,而棧的操作順序是先進后出。
(3)數據流圖的類型有【3】和事務型。
【解析】典型的數據流圖有兩種,即變換型和事務型。
(4)在數據庫理論中,數據物理結構的改變,如存儲設備的更換、物理存儲的更換、存取方式等都不影響數據庫的邏輯結構,從而不引起應用程序的變化,稱為【4】 。
【解析】數據的物理結構改變,不影響數據庫的邏輯結構,從而不引起應用程序的變化,這種性質叫做物理獨立性。
(5)數據庫管理系統(tǒng)是位于用戶與【5】之間的軟件系統(tǒng)。
【解析】數據庫管理系統(tǒng)是幫助用戶創(chuàng)建和管理數據庫的應用程序的集合。因此,數據庫管理系統(tǒng)需要操作系統(tǒng)的支持,為用戶提供服務。
(6)若從鍵盤輸入58,則以下程序的輸出結果是【6】 。
main()
{ int a;
scanf("%d",&a);
if(a>50) printf("%d",a);
if(a>40) printf("%d",a);
if(a>30) printf("%d",a);
}
【解析】在程序中,執(zhí)行scanf()語句后,a被賦值為58。接著執(zhí)行第一個if語句,因為,a=58>50,執(zhí)行第一個if語句后面的輸出語句,輸出58;接著執(zhí)行第二個if語句,因為,a=58>40,執(zhí)行第二個if語句后面的輸出語句,輸出58;接著執(zhí)行第三個if語句,因為,a=58>30,執(zhí)行第三個if語句后面的輸出語句,輸出58,所以最后的輸出為585858。
(7)以下程序的輸出結果是【7】 。
main()
{ int a=177;
printf("%o\n",a);
}
【解析】在控制格式符中“o”代表的是將數據按八進制數輸出,十進制數的177代表的八進制數是261。
(8)以下程序的輸出結果是【8】 。
main()
{ int a=0;
a+=(a=8);
printf("%d\n",a);
}
【解析】在程序中首先將8賦值給變量a,然后再進行復合賦值運算。即a=a+a=8+8=16,所以該空格處應該填16。
(9)以下程序的輸出結果是【9】 。
main()
{ int a=5,b=4,c=3,d;
d=(a>b>c);
printf("%d\n",d);
}
【解析】關系運算符“>”的結合方式是從左向右的,所以在本題中的表達式a>b>c;從左向右開始計算,a>b的結果為“1”,接著1和c比較假,該空格處應該填0。
(10)以下定義的結構體類型包含兩個成員,其中成員變量info用來存放整型數據;成員變量link是指向自身結構體的指針。請將定義補充完整。
struct node
{ int info;
【10】link;
};
【解析】link是指向結構體自身的指針,因此link是指針,指向struct node類型的數據,可定義成“struct node *link”。 (11)以下程序的輸出結果是【11】 。
main()
{ int s,i;
for(s=0,i=1;i<3;i++,s+=i);
printf("%d\n",s);
}
【解析】此程序中,for循環(huán)語句后面直接跟了一個“;”,表明循環(huán)體為空。輸出語句不在for循環(huán)體內,所以在循環(huán)執(zhí)行完畢后才輸出s的值。s、i的初值分別為0和1,判斷循環(huán)條件,表達式“1<3”成立,執(zhí)行“i++,s+=i”后,i和s的值分別為2和1,繼續(xù)判斷循環(huán)條件,表達式“2<3”成立,執(zhí)行“i++,s+=i”后,i和s的值分別為3,再次判斷循環(huán)條件,表達式“3<3”不成立,循環(huán)結束。
(12)以下程序的輸出結果是【12】 。
main()
{ char *p="abcdefgh",*r;
long *q;
q=(long *)p;
q++;
r=(char *)q;
printf("%s\n",r);
}
【解析】本題定義了一個字符型指針變量p并通過賦初值讓它指向了一個字符串,定義了另一個字符型指針變量r和一個長整型指針變量q。首先通過語句“q=(long*)p;”把p的地址值強制轉換為長整型地址值并賦值給q,然后執(zhí)行“q++;”,地址值增加了4,執(zhí)行語句“r=(char*)q;”,把長整型指針變量q的值再強制轉換成字符型地址值并賦給r,r的值應為字符串中字符“e”的地址,最后輸出r指向的字符串,是“efgh”。
(13)以下程序的輸出結果是【13】 。
main()
{ char s[]="abcdef";
s[3]='\0';
printf("%s\n",s);
}
【解析】字符串的結束標記'\0',當輸出一個存放在字符數組中的字符串時,只需輸出到'\0'為止,而不管其后有什么數據。本題給字符數組s的元素s[3]賦值為'\0',故只能輸出3個字符“abc”。
(14)以下程序的輸出結果是【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;
}
【解析】在主函數中定義了一個變量x并賦初值0,然后執(zhí)行函數調用語句,該語句的執(zhí)行過程為sub(&x,8,1)調用sub(&a,4,2),sub(&a,4,2)調用sub(&a,2,4),sub(&a,2,4)中由于2<4,所以if后面括號里的判斷為假,遞歸結束,執(zhí)行其后的*a+=k;語句此時x=x+k=0+4=4,回退到上一層調用函數sub(&x,4,2)中,執(zhí)行后面的語句,x=x+k=4+2=6,再回推到最上一層調用函數sub(&x,8,1)執(zhí)行后面的語句,x=x+k=6+1=7,所以最后輸出7。
(15)設有如下宏定義
#define MYSWAP(z,x,y) {z=x;x=y;y=z;}
以下程序段通過宏調用實現變量a、b內容的交換,請?zhí)羁铡?BR> float a=5,b=16,c;
MYSWAP(【15】,a,b);
【解析】本題關鍵在考生是不是了解宏的基本運用,在使用宏的時候明顯少了一個實參。在定義宏的時候變量z是用來做中間變量的,題目中缺的變量就是一個中間變量c。
(16)以下程序用來統(tǒng)計文件中字符的個數。請?zhí)羁铡?BR> #include "stdio.h"
main()
{ FILE * fp; long num=0L;
if((fp=fopen("fname.dat", "r"))==NULL);
{ printf("Open error\n");exit(0);}
while(【16】)
{ fgetc(fp);num++;}
printf("num=%1d\n",num-1);
fclose(fp);
}
【解析】統(tǒng)計文件中字符個數的算法可描述如下:首先判斷文件位置指針是否指向了文件尾,如果不是則讀出一個字符,同時字符的個數加1,再判斷文件位置指針是否位于文件尾,如此循環(huán),直到文件位置指針位于文件尾為止。本題首先以讀文件的方式打開了文件“fname.dat”,如果打開成功則把返回的文件型指針賦值給fp,然后通過循環(huán)求文件中的字符數。首先判斷文件位置指針是否位于文件尾,如果不是則循環(huán)讀取字符,每次字符數加1。所以下劃處應填循環(huán)條件,文件位置指針不是指向文件尾,即“!feof(fp)”。
(17)以下程序中,select函數的功能是:在N行M列的二維數組中,選出一個值作為函數值返回,并通過形參傳回此值所在的行下標。請?zhí)羁铡?BR> #define N 3
#define M 3
select(int a[N][M],int *n)
{ int i,j,row=1,colum=1;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n=【17】;
return(【18】);
}
main()
{ int a[N][M]={9,11,23,6,1,15,9,17,20},max,n;
max=select(a,&n);
printf("max=%d,line=%d\n",max,n);
}
【解析】指針變量作為函數參數及二維數組的一個典型算法—求值及其下標。通過對題意的分析,在select()函數中,變量row的作用是用來記錄元素的行下標,colum的作用是用來記錄元素的列下標。程序中通過一個循環(huán)求得數組元素中值的行列下標,分別存放在變量row和colum中,根據題意,應該把行下標賦值給形參指針變量n指向的變量,把值a[row][colum]作為函數值返回。
(18)mystrlen函數的功能是計算str所指字符串的長度,并作為函數值返回。請?zhí)羁铡?BR> int mystrlen(char *str)
{ int i;
for(i=0;【19】!= '\0';i++);
return(【20】);
}
【解析】求str指向的字符串長度的算法是:用一個變量i表示字符串中字符的位置,一開始賦值為0,取出i位置的字符,判斷是否為“\0”,若不是,則i的值加1,如此循環(huán)直到取出的字符是“\0”為止,此時i的值就是字符串的長度。由此可知,第一個空處應填第i位置上的字符*(str+i);第二個空格應該填字符串的長度i。
(1)算法的復雜度主要包括空間復雜度和【1】復雜度。
【解析】算法的復雜度主要指時間復雜度和空間復雜度。
(2)在線性結構中,隊列的操作順序是先進先出,而棧的操作順序是【2】 。
【解析】隊列和棧都是線性結構,但是不同之處在于隊列的操作順序是先進先出,而棧的操作順序是先進后出。
(3)數據流圖的類型有【3】和事務型。
【解析】典型的數據流圖有兩種,即變換型和事務型。
(4)在數據庫理論中,數據物理結構的改變,如存儲設備的更換、物理存儲的更換、存取方式等都不影響數據庫的邏輯結構,從而不引起應用程序的變化,稱為【4】 。
【解析】數據的物理結構改變,不影響數據庫的邏輯結構,從而不引起應用程序的變化,這種性質叫做物理獨立性。
(5)數據庫管理系統(tǒng)是位于用戶與【5】之間的軟件系統(tǒng)。
【解析】數據庫管理系統(tǒng)是幫助用戶創(chuàng)建和管理數據庫的應用程序的集合。因此,數據庫管理系統(tǒng)需要操作系統(tǒng)的支持,為用戶提供服務。
(6)若從鍵盤輸入58,則以下程序的輸出結果是【6】 。
main()
{ int a;
scanf("%d",&a);
if(a>50) printf("%d",a);
if(a>40) printf("%d",a);
if(a>30) printf("%d",a);
}
【解析】在程序中,執(zhí)行scanf()語句后,a被賦值為58。接著執(zhí)行第一個if語句,因為,a=58>50,執(zhí)行第一個if語句后面的輸出語句,輸出58;接著執(zhí)行第二個if語句,因為,a=58>40,執(zhí)行第二個if語句后面的輸出語句,輸出58;接著執(zhí)行第三個if語句,因為,a=58>30,執(zhí)行第三個if語句后面的輸出語句,輸出58,所以最后的輸出為585858。
(7)以下程序的輸出結果是【7】 。
main()
{ int a=177;
printf("%o\n",a);
}
【解析】在控制格式符中“o”代表的是將數據按八進制數輸出,十進制數的177代表的八進制數是261。
(8)以下程序的輸出結果是【8】 。
main()
{ int a=0;
a+=(a=8);
printf("%d\n",a);
}
【解析】在程序中首先將8賦值給變量a,然后再進行復合賦值運算。即a=a+a=8+8=16,所以該空格處應該填16。
(9)以下程序的輸出結果是【9】 。
main()
{ int a=5,b=4,c=3,d;
d=(a>b>c);
printf("%d\n",d);
}
【解析】關系運算符“>”的結合方式是從左向右的,所以在本題中的表達式a>b>c;從左向右開始計算,a>b的結果為“1”,接著1和c比較假,該空格處應該填0。
(10)以下定義的結構體類型包含兩個成員,其中成員變量info用來存放整型數據;成員變量link是指向自身結構體的指針。請將定義補充完整。
struct node
{ int info;
【10】link;
};
【解析】link是指向結構體自身的指針,因此link是指針,指向struct node類型的數據,可定義成“struct node *link”。 (11)以下程序的輸出結果是【11】 。
main()
{ int s,i;
for(s=0,i=1;i<3;i++,s+=i);
printf("%d\n",s);
}
【解析】此程序中,for循環(huán)語句后面直接跟了一個“;”,表明循環(huán)體為空。輸出語句不在for循環(huán)體內,所以在循環(huán)執(zhí)行完畢后才輸出s的值。s、i的初值分別為0和1,判斷循環(huán)條件,表達式“1<3”成立,執(zhí)行“i++,s+=i”后,i和s的值分別為2和1,繼續(xù)判斷循環(huán)條件,表達式“2<3”成立,執(zhí)行“i++,s+=i”后,i和s的值分別為3,再次判斷循環(huán)條件,表達式“3<3”不成立,循環(huán)結束。
(12)以下程序的輸出結果是【12】 。
main()
{ char *p="abcdefgh",*r;
long *q;
q=(long *)p;
q++;
r=(char *)q;
printf("%s\n",r);
}
【解析】本題定義了一個字符型指針變量p并通過賦初值讓它指向了一個字符串,定義了另一個字符型指針變量r和一個長整型指針變量q。首先通過語句“q=(long*)p;”把p的地址值強制轉換為長整型地址值并賦值給q,然后執(zhí)行“q++;”,地址值增加了4,執(zhí)行語句“r=(char*)q;”,把長整型指針變量q的值再強制轉換成字符型地址值并賦給r,r的值應為字符串中字符“e”的地址,最后輸出r指向的字符串,是“efgh”。
(13)以下程序的輸出結果是【13】 。
main()
{ char s[]="abcdef";
s[3]='\0';
printf("%s\n",s);
}
【解析】字符串的結束標記'\0',當輸出一個存放在字符數組中的字符串時,只需輸出到'\0'為止,而不管其后有什么數據。本題給字符數組s的元素s[3]賦值為'\0',故只能輸出3個字符“abc”。
(14)以下程序的輸出結果是【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;
}
【解析】在主函數中定義了一個變量x并賦初值0,然后執(zhí)行函數調用語句,該語句的執(zhí)行過程為sub(&x,8,1)調用sub(&a,4,2),sub(&a,4,2)調用sub(&a,2,4),sub(&a,2,4)中由于2<4,所以if后面括號里的判斷為假,遞歸結束,執(zhí)行其后的*a+=k;語句此時x=x+k=0+4=4,回退到上一層調用函數sub(&x,4,2)中,執(zhí)行后面的語句,x=x+k=4+2=6,再回推到最上一層調用函數sub(&x,8,1)執(zhí)行后面的語句,x=x+k=6+1=7,所以最后輸出7。
(15)設有如下宏定義
#define MYSWAP(z,x,y) {z=x;x=y;y=z;}
以下程序段通過宏調用實現變量a、b內容的交換,請?zhí)羁铡?BR> float a=5,b=16,c;
MYSWAP(【15】,a,b);
【解析】本題關鍵在考生是不是了解宏的基本運用,在使用宏的時候明顯少了一個實參。在定義宏的時候變量z是用來做中間變量的,題目中缺的變量就是一個中間變量c。
(16)以下程序用來統(tǒng)計文件中字符的個數。請?zhí)羁铡?BR> #include "stdio.h"
main()
{ FILE * fp; long num=0L;
if((fp=fopen("fname.dat", "r"))==NULL);
{ printf("Open error\n");exit(0);}
while(【16】)
{ fgetc(fp);num++;}
printf("num=%1d\n",num-1);
fclose(fp);
}
【解析】統(tǒng)計文件中字符個數的算法可描述如下:首先判斷文件位置指針是否指向了文件尾,如果不是則讀出一個字符,同時字符的個數加1,再判斷文件位置指針是否位于文件尾,如此循環(huán),直到文件位置指針位于文件尾為止。本題首先以讀文件的方式打開了文件“fname.dat”,如果打開成功則把返回的文件型指針賦值給fp,然后通過循環(huán)求文件中的字符數。首先判斷文件位置指針是否位于文件尾,如果不是則循環(huán)讀取字符,每次字符數加1。所以下劃處應填循環(huán)條件,文件位置指針不是指向文件尾,即“!feof(fp)”。
(17)以下程序中,select函數的功能是:在N行M列的二維數組中,選出一個值作為函數值返回,并通過形參傳回此值所在的行下標。請?zhí)羁铡?BR> #define N 3
#define M 3
select(int a[N][M],int *n)
{ int i,j,row=1,colum=1;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n=【17】;
return(【18】);
}
main()
{ int a[N][M]={9,11,23,6,1,15,9,17,20},max,n;
max=select(a,&n);
printf("max=%d,line=%d\n",max,n);
}
【解析】指針變量作為函數參數及二維數組的一個典型算法—求值及其下標。通過對題意的分析,在select()函數中,變量row的作用是用來記錄元素的行下標,colum的作用是用來記錄元素的列下標。程序中通過一個循環(huán)求得數組元素中值的行列下標,分別存放在變量row和colum中,根據題意,應該把行下標賦值給形參指針變量n指向的變量,把值a[row][colum]作為函數值返回。
(18)mystrlen函數的功能是計算str所指字符串的長度,并作為函數值返回。請?zhí)羁铡?BR> int mystrlen(char *str)
{ int i;
for(i=0;【19】!= '\0';i++);
return(【20】);
}
【解析】求str指向的字符串長度的算法是:用一個變量i表示字符串中字符的位置,一開始賦值為0,取出i位置的字符,判斷是否為“\0”,若不是,則i的值加1,如此循環(huán)直到取出的字符是“\0”為止,此時i的值就是字符串的長度。由此可知,第一個空處應填第i位置上的字符*(str+i);第二個空格應該填字符串的長度i。