一、選擇題(1)~(10)每小題2分,(11)-(50)每小題1分,共60分)
下列各題A)、B)、C)、D)四個選項中,只有一個選項是正確的,請將正確選項涂寫在答題卡相應位置上,答在試卷上不得分。
(1)數據結構中,與所使用的計算機無關的是數據的________。
A)存儲結構 B)物理結構 C)邏輯結構 D)物理和存儲結構
答案:C
評析:數據結構概念一般包括3個方面的內容,數據的邏輯結構、存儲結構及數據上的運算集合。數據的邏輯結構只抽象的反映數據元素之間的邏輯關系,而不管它在計算機中的存儲表示形式。
(2)棧底至棧頂依次存放元素A、B、C、D,在第五個元素E入棧前,棧中元素可以出棧,
則出棧序列可能是________。
A)ABCED B)DBCEA C)CDABE D)DCBEA
答案:D
評析:棧操作原則上"后進先出",棧底至棧頂依次存放元素A、B、c、D,則表明這4個元素中D是最后進棧,B、c處于中間,A最早進棧。所以出棧時一定是先出D,再出c,最后出A。
(3)線性表的順序存儲結構和線性表的鏈式存儲結構分別是________。
A)順序存取的存儲結構、隨機存取的存儲結構
B)隨機存取的存儲結構、順序存取的存儲結構
C)隨機存取的存儲結構、隨機存取的存儲結構
D)任意存取的存儲結構、任意存取的存儲結構
答案:B
評析:順序存儲結構中,數據元素存放在一組地址連續(xù)的存儲單元中,每個數據元素地址可通過公式LOC(ai)。LOC(a1)+(i-1)L計算得到,從而實現了隨機存取。對于鏈式存儲結構,要對某結點進行存取,都得從鏈的頭指針指向的結點開始,這是一種順序存取的存儲結構。
(4)在單鏈表中,增加頭結點的目的是________。
A)方便運算的實現 B)使單鏈表至少有一個結點
C)標識表結點中首結點的位置 D)說明單鏈表是線性表的鏈式存儲實現
答案:A
評析:頭結點不僅標識了表中首結點的位置,而且根據單鏈表(包含頭結點)的結構,只要掌握了表頭,就能夠訪問整個鏈表,因此增加頭結點目的是為了便于運算的實現。
(5)軟件設計包括軟件的結構、數據接口和過程設計,其中軟件的過程設計是指________。
A)模塊間的關系 B)系統(tǒng)結構部件轉換成軟件的過程描述
C)軟件層次結構 D)軟件開發(fā)過程
答案:B
評析:軟件設計包括軟件結構設計、數據設計、接口設計和過程設計。其中結構設計是定義軟件系統(tǒng)各主要部件之間的關系;數據設計是將分析時創(chuàng)建的模型轉化為數據結構的定義;接口設計是描述軟件內部、軟件和操作系統(tǒng)之間及軟件與人之間如何通信;過程設計則是把系統(tǒng)結構部件轉換成軟件的過程性描述。
(6)為了避免流程圖在描述程序邏輯時的靈活性,提出了用方框圖來代替?zhèn)鹘y(tǒng)的程序流程 圖,通常也把這種圖稱為________。
A)PAD圖 B)N-S圖 C)結構圖 D)數據流圖
答案:B
評析:常見的過程設計工具有:程序流程圖、N-S圖、PAD圖和HIPO圖。其中,為了避免流程圖在描述程序邏輯時的靈活性,提出了用方框圖來代替?zhèn)鹘y(tǒng)的程序流程圖,通常也把這種圖稱為N-S圖。
(7)數據處理的最小單位是________。
A)數據 B)數據元素 C)數據項 D)數據結構
答案:C
評析:數據處理的最小單位是數據項;由若干數據項組成數據元素;而數據是指能夠被計算機識別、存儲和加工處理的信息載體;數據結構是指數據之間的相互關系和數據運算。
(8)下列有關數據庫的描述,正確的是________。
A)數據庫是一個DBF文件 B)數據庫是一個關系
C)數據庫是一個結構化的數據集合 D)數據庫是一組文件
答案:C
評析:數據庫(Database,簡稱DB)是數據的集合,它具有統(tǒng)一的結構形式并存放于統(tǒng)一的存儲介質內,是多種應用數據的集成,并可被各個應用程序所共享。數據庫中的數據具有"集成"、"共享"之特點。
(9)單個用戶使用的數據視圖的描述稱為 ______ 。
A)外模式 B)概念模式 C)內模式 D)邏輯模式
答案:A
評析:外模式是用戶的數據視圖,也就是用戶所見到的數據模式;全局數據視圖的描述稱為概念模式,即數據庫中全部數據的整體邏輯結構的描述;物理存儲數據視圖的描述稱為內模式,即數據庫在物理存儲方面的描述;存儲模式即為內模式。
(10)需求分析階段的任務是確定______。
A)軟件開發(fā)方法 B)軟件開發(fā)工具 C)軟件開發(fā)費用 D)軟件系統(tǒng)功能
答案:D
評析:需求分析是軟件定義時期的最后一個階段,它的基本任務就是詳細調查現實世界要處理的對象(組織、部門、企業(yè)等),充分了解原系統(tǒng)的工作概況,明確用戶的各種需求,然后在此基礎上確定新系統(tǒng)的功能。
(11)若變量a是int類型,并執(zhí)行了語句:a='A'+1.6;,則正確敘述是______。
A)a的值是字符C B)a的值是浮點型
C)不允許字符型和浮點型相加 D)a的值是字符'A'的ASCII值加上l
答案:D
評析:在賦值表達式中,賦值符右邊的值的類型會自動轉換成賦值符左邊的變量的類型。在本題中,先用"A"的ASCII碼值加上1.46得到66.46,然后將它強制轉換成int型,轉換后,實數的小數部分全部
(12)若以下選項中變量已正確定義,則正確的賦值語句是______。
A)x1=26.8%3; B)1+2=x2; C)x3=0x12; D)x4=1+2=3;
答案:C
評析:賦值符號"="就是賦值運算符,它的作用是將一個數據賦給一個變量。如果賦值運算符兩側的類型不一致,但都是數值型或字符型時,在賦值時要進行類型轉換,所以選項A錯誤。在賦值表達式中,賦值運算符的左側必須是一個變量,所以選項B、D錯誤。選項C是將一個十六進制數賦值給變量x3。
(13)以下程序段的輸出結果是______。
int a=1234;
printf("%2d\n",a);
A)12 B)34 C)1234 D)提示出錯、無結果
答案:C
評析:本題主要考查對primf函數域寬描述符的理解,在這里我們要特別注意:輸出數據的實際精度并不主要決定于格式項中的域寬與精度,也不決定于輸入的數據精度,而主要決定于數據在機器內的存儲精度。
(14)以下選項中不屬于C語言的類型的是______。
A)signed short int B)unsigned char
C)signed long D)long short
答案:D
評析:c語言中歸納起來,基本類型數據有以下幾種:
[signed]char;unsigned char;[signed]short[int];unsigned short[int];[signed]long[int];unsigned long[int];float;double.
(15)設有定義:int a,*pa=&a;以下scanf語句能正確為變量a讀入數據的是______。
A)scanf("%d",B); B)scanf("%d",a);
C)scanf("%d",&pa); D)scanf("%d",*pa);
答案:C
評析:scanf函數要求其中的輸入項必須是地址形式,比如:普通變量的地址、數組名、指針變量等。對于普通變量,地址形式為:&變量名;當一個普通變量的地址賦予了一個指針變量名,scanf函數的輸入項處就可以直接寫這個指針變量名。
(16)以下程序的輸出結果是______。
main()
{int a=5,b=4,c=6,d;
printf("%d\n",d=a>c?(a>c?a:C):(b));
}
A)5 B)4 C)6 D)不確定
答案:B
評析:本題最重要的分析d=a>c?(a>c?a:C):(b)),首先運算括號內的式子a>c?a:c,它的值是c的值6,即式子化成d=a>c?6:4。顯然a=c,所以將4賦給d。
(17)以下程序中,while循環(huán)的循環(huán)次數是______ 。
main()
{ int i=0:
while(i<10)
{if(i<1)continue;
if(i==5)break;
i++:
}
……
}
A)1 B)10 C)6 D)死循環(huán),不能確定次數
答案:D
評析:進入循環(huán)后,先執(zhí)行一個條件語句,如果i的值小于l,那么直接進入下一輪循環(huán),因為i的初始值是0,小于l,故直接進入下一輪循環(huán),又因為i的值始終沒有改變,所以這個循環(huán)成了死循環(huán)。
(18)有以下程序:
main()
{
char k;int i;
for(i=1;i<3;i++)
{
scanf("%c",&k);
switch(k)
{
case'0':printf["another\n"];
case'1':printf["number\n");
}
}
}
程序運行時,從鍵盤輸入:0l<回車>,程序執(zhí)行后輸出結果是______。
A)another B)another C)another D)number
number number number number
another number
答案:C
評析:switch語句是多分支選擇語句,執(zhí)行完一個case后面的語句后,流程控制轉移到下一個case繼續(xù)執(zhí)行。"case常量表達式"只是起語句標號作用,并不是在該處進行條件判斷。在執(zhí)行switch語句時,根據switch后面表達式的值找到匹配的入口標號,就從此標號開始執(zhí)行下去,不再進行判斷。
(19)以下程序的輸出結果是______。
main()
{Int a=O,i;
for(i=1;i<5;i++)
{switch(i)
{ case 0:
case 3:a+=2:
case l:
case 2:a+=3:
default:a+=5;
}
}
printf("%d\n",a)
}
A)3l B)13 C)10 D)20
答案:A
評析:switch結構的執(zhí)行過程同上題。
(20)己定義c為字符型常量,則下列語句中正確的是______。
A)C='97' B)c="97" C)c=97 D)c="a"
答案:C
評析:字符變量占內存一個字節(jié),只能放一個字符;字符常量為單引號括起的單個字符;字符串常量為雙引號括起的一串字符(可以0個字符,即"",稱為空串)。選項c為字符ASCII碼的整數形式。
(21)以下程序的輸出結果是_________。
main()
f int a=4,b=5,c=0,d;
d=!a&&!b||!c;
printf("%d\n",d);
}
A)l B)0 C)非0的數 D)-1
答案:A
評析:!a值為0,故!a&&!b的值為0,!c的值為l,而0IIl的值應該是l。所以答案是A。
(22)以下程序的輸出結果是_________。
#include<stdio.h>
main()
{int i=0,a=0;
while(i<20)
{for(;;)
{if((i%10)==0)break;
else I--:
}
i+=ll;a+=i;
}
printf("%d\n",a);
}
A)21 B)32 C)33 D)11
答案:B
評析:本題中,有兩個循環(huán)語句。首先,i=0,進入while循環(huán),for語句中對循環(huán)沒有任何條件,故直接進入for循環(huán),因為0%10結果還是O,所以跳出for循環(huán),執(zhí)行i+:11,i的值變?yōu)?1,執(zhí)行a+=i,a的值變?yōu)?1:接著進入下一輪while循環(huán),在for循環(huán)中,因為i的值是11,對10取余結果為l,所以執(zhí)行i自減,i的值變成10,進入又一輪for循環(huán),因為10%10==0,所以跳出for循環(huán),執(zhí)行i+=1l,i的值變成21,執(zhí)行a+=i,也就是將21+1 1的和賦給a,a=32,因為此時i的值不再小于20,所以結束循環(huán),
故輸出結果是32。
(23)有以下程序:
int n(int x,int y)
{retum x>y?x:y;}
Int f2(int x,int y)
{return x>y?y:x;)
main()
{ int a=4,b=3,c=5,d,e,f;
d=f1(a,b);d=fl(d,C);
e=f2(a,b);e=f2(e,C);
f=a+b+C-d-e;
printf("%d,%d,%d\n",d,e,f);
}
程序運行后的輸出結果是_________ 。
A)3,4,5 B)5,3,4 C)5,4,3 D)3,5,4
答案:B
評析:函數n是一個求兩個整數中最大值的函數,函數f2是一個求兩個整數中最小值的函數。在main函數中兩次調用函數n,求得變量a、b、、c中的最大值賦值給d;兩次調用函數f2,求得變量a、b、c中的最小值賦值給e;表達式a+b+c-d-e得到中間值,輸出5,3,4。
(24)以下程序的輸出結果是_________。
int f()
{static int i=0;
int s=1:
s+=i;i++;
return s;
}
main()
{inti,a=0;
for(i=0;i<5;j++)a+=f();
printf("%d\n",a);
}
A)20 B)24 C)25 D)15
答案:D
評析:靜態(tài)變量,在編譯時就為其分配了存儲空間,程序一開始執(zhí)行便被建立,直到該程序執(zhí)行結束都存在,而不像動態(tài)變量只存在于函數或分程序被調用期間。在函數多次被調用的過程中靜態(tài)局部變量的值具有可繼承性。
(25)已定義以下函數:
fun(int *p)
{retum *p;}
該函數的返回值是______ 。
A)不確定的值 B)形參p中存放的值 C)形參p所指存儲單元中的值 D)形參p的地址值
答案:C.
評析:函數首部fun(int*p)中+p表示這是一個指針變量,指向整型數據,用來從主調函數接收地址;而語句return *p;中的*p代表p所指向存儲單元中的值。
(26)若有以下程序
#include<stdio.h>
Void f(int n);
main()
{void f(int n);
f(5);
}
Void f(int n)
{print("%d\n",n);}
則以下敘述中不正確的是______ 。
A)若只在主函數中對函數f進行說明,則只能在主函數中正確調用函數f
B)若在主函數前對函數f進行說明,則在主函數和其后的其它函數中都可以正確調用函數f
C)對于以上函數程序,編譯時系統(tǒng)會提示出錯信息;提示對f函數重復說明
D)函數f無返回值,所以可用void將其類型定義為無值型
答案:C
評析:一個函數在一個文件中的定義只能有一次,但對它的聲明卻可以有很多個。一個函數可以正確調用在當前函數之前聲明的函數。
[NextPage]
(27)有以下程序段:
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;
b=p[5];
b中的值是______。
A)5 B)6 C)8 D)9
答案:D
評析:數組a各元素a[O]~a[9]的值依次為1~10;在程序的說明部分,指針變量p初始化為&a[3](即a+3),則p[5]相當于·(p+5),相當于a[8],所以執(zhí)行語句b=p[5];后,b的值為9。
(28)在C語言中,形參的缺省存儲類是______。
A)auto B)register C)static D)extern
答案:A
評析:程序進行編譯時,并不為形式參數分配存儲穿間。只有在被調用時,形式參數才臨時地占有存儲空間。形式參數用關鍵字auto作存儲類別的聲明時,關鍵字"auto"可以省略,auto不寫則隱含確定為"自動存儲類別",它屬于動態(tài)存儲方式。
(29)有以下定義:
#include<stdio.h>
char a[10],*b=a;
不能給數組a輸入字符串的語句是______。
A)gets(a); B)gets(a[0]); C)gets(&a[0]); D)gets(b);
答案:B
評析:函數gets的格式為:gets(字符數組名)
c語言中,字符數組名代表數組的首元素地址,即&a[O],字符指針變量lb值也為數組a的首地址,選項A、c、D均能給數組a輸入字符串。選項B中a[O]為數組元素,是一個數據變量。
(30)若指針p已正確定義,要使p指向兩個連續(xù)的整型動態(tài)存儲單元,不正確的語句是 ______.
A)p=2*(int*)malloc(sizeof(int)); B)p=(int*)malloc(2*sizeof(int))
C)p=(int*)malloc(2*2) D)p=(int*)calloc(2,sizeof(int))
答案:A
評析:malloe函數的作用是在內存開辟指定大小的存儲空問,并將此存儲空間的地址作為函數值帶回,它的原型為void。malloe(unsigned int size),函數值為指針,這個指針是指向void類型。如果要將此返回地址賦給一個指向特定類型的指針變量,則應進行強制類型轉換。
calloc函數的模型是:void*calloc(unsigned int num,unsigned int size)作用是分配num個大小為size字節(jié)的空間。
(31)下面程序段的輸出結果是______ 。
main()
{
char strl [10]={'s','t','u','d','e','n','t'};
printf("%d\n",strlen(strl));
}
A)7 B)8 C)10 D)存在語法錯誤
答案:A
評析:strlen()函數得到字符串的長度,返回值為數值型。字符數組初始化,若提供的初值個數大于數組長度,則按語法錯誤處理。如果初值個數小于數組長度,則只將這些字符賦給數組中前面那些元素,其余的元素自動定義為空字符。
(32)以下程序的輸出結果是______。
main()
{int x=040;
printf("%o\n",x<<1);
}
A)100 B)80 C)64 D)32
答案:A
評析:040用二進制表示就是00100000,左移一位,得到的值應該是01000000,化成八進制應該是0100。
(33)下面程序運行后的輸出結果是______。
main()
{
char arr[2][4];
strcpy(arr[0],"you");strcpy(arr[1],"me");
arr[0][3]='&';
print"%s\n",arr[0]);
}
A)you&me B)you C)me D)err
答案:A
評析:在主函數中定義了一個2*4的二維字符數組,執(zhí)行strcpy(arr[O]"fIyou");后,arr[0]={'y''o','u','\0'},執(zhí)行strcpy(arr[1],"me");后arr[1]={ 'm', 'e','\0',不定},當執(zhí)行完arr[O][3];'&';從arr[O]開始的存儲空間中的字符依次是'y','o','u','&','m','e','\0',故執(zhí)行printf("%s\n",arr[O]);后的輸出結果為"you&me",選A。
(34)若要打開A盤上的user子目錄下名為abc.txt的文本文件進行讀、寫操作,下面符合 此要求的函數調用是______。
A)fopen("A:\user\abc.txt","r") B)fopen("A:\\user\\abc.txt","r+")
C)fopen("A:\user\abc.txt","rb") D)fopen("A:\\user\\abc.txt","w")
答案:B
評析:本題考查點是fopen函數中文件使用方式的指定。
文件使用方式"r",表示以"只讀"方式打開一個字符文件。
文件使用方式"r+",表示以"讀寫"方式打開一個字符文件。
文件使用方式""rb",表示以"只讀"方式打開一個二進制文件。
文件使用方式"w",表示以"只寫"方式打開一個字符文件。
(35)以下不能正確進行字符串賦初值的語句為______。
A)char str[5]= "good! " B)char str[]="good! "
C)char *str="good! " D)char str[5]={'g','0','o','d'}
答案:A
評析:用字符串作初值為字符數組賦值時,系統(tǒng)總會自動在字符串的末尾補上一個"\O",如選項A中定義的話,把第6個字符也就是"\0"賦給str數組,但此數組只含5個元素,而放到了s仃數組之后的存儲單元中,這就可能會破壞其它數據區(qū)或程序本身。
(36)有以下程序:
#include<string.h>
main(int argc,char*argv[])
{
int i,len=O;
for(i=1;i<argc;i+=2)len+=strlen(argv[i]);
Print("%d\n",len);
}
經編譯連接后生成可執(zhí)行文件ex.exe,若運行時輸入以下帶參數的命令行
ex abcd efg h3 k44
運行后輸出結果是______。
A)14 B)12 C)8 D)6
答案:C
評析:main函數的第一個參數argc是int型變量,用來統(tǒng)計命令行中的字符串個數,本題輸入帶參數的命令行"ex abed efg h3 k44<回車>",argc的值是5;第二個參數是字符型指針數組,長度由argc的值決定,每個數組元素存放一個指向字符串數據的指針。for語句將命令行中兩個字符串abed和h3的長度進行累加,放在變量len中。
(37)若有下面的說明和定義:
struct test
{ int ml;char m2;float m3;
union uu{char ul[5];int u2[2];}ua;
}myaa;
則sizeof(stuct test)的值是______。
A)12 B)16 C)14 D)9
答案:A
評析:在定義了結構體變量后,系統(tǒng)會為之分配內存單元,在內存中一個整型占2個字節(jié),一個字符占1個字節(jié),一個數組元素占1個字節(jié),一個浮點型占4個字節(jié)。結構體變量所占內存長度是各成員占的內存長度之和;而共用體變量所占的內存長度等于最長的成員的長度。所以test在內存中占12個字節(jié)(2+l+4+5=12)。
(38)若有定義:int aa[8];,則以下謄達式中不能代表數組元素aa[1]的地址的是______。
A)&aa[0]+l B)&aa[1] C)aa[0]++ D)aa+1
答案:C
評析:答案A中&aa[0]表示aa[0]的地址,加上1就是aa[1]的地址。同樣aa[1]的地址也可以直接用&aa[1]或aa+l表示。
(39)下面敘述中正確的是______。
A)全局變量的作用域一定比局部變量的作用域范圍大
B)靜態(tài)類別變量的生存期貫穿于整個程序的運行期間
C)函數的形參都屬于全局變量
D)未在定義語句中賦值的auto變量和static變量的初值都是隨機值
答案:B
評析:c語言中,全局變量的作用范圍是從定義處到程序結束,因此全局變量的定義點直接影響其作用范圍,因此選項A錯誤。靜態(tài)(statiC)存儲類別變量是在程序編譯時分配存儲空間,該類別變量在整個程序運行期間占據著固定的存儲單元,當多次調用其所在的函數時,該類別變量的值為上一次調用的值,直至整個程序結束運行后才釋放該變量所占存儲單元。因此選項B正確,選項D錯誤。c語言規(guī)定:函數的形參是auto型局部變量,因此選項c錯誤。
(40)以下程序的輸出結果是______ 。
f(int b[],int m,int n)
{jnt i,s=0;
for(i=m;i<n;i=i+2)s=s+b[i];
return s;
)
main()
{int x,a[]:{1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
)
A)10 B)18 C)8 D)15
答案:A
評析:本題中,主函數調用f函數,在f函數中執(zhí)行了兩次循環(huán),第一次i=3,s=0+b[i]:4,然后i的值被修改成5,仍然滿足循環(huán)條件,進入第二輪循環(huán),s=4+b[5]=4+6=10,隨后,i的值被修改成7,不再滿足循環(huán)條件,退出循環(huán),返回s的值。所以最后輸出結果是10。
(41)若有以下定義和語句:
int s[4][5],(*ps)[5];
ps=s;
則對s數組元素的正確引用形式是______ 。
A)ps+l B)*(ps+3) C)ps[0][2] D)*(ps+1)+3
答案:C
評析:選項A得到的是s數組第一行的地址,選項B得到的是s數組第三行第零列元素的地址,而選項D得到的是s數組第一行第三列元素的地址。只有選項c正確引用了ps數組第零行第二列的元素。
(42)以下程序的輸出結果是______。
main()
{int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;
for(i=0;i<3;i++)
fbr(j=I;J<=I;J++)t=t+b[i][b[j][j]];
printf("%d\n",t);
}
A)3 B)4 C)l D)9
答案:B
評析:`兩個循環(huán)語句嵌套使用,在第一次外循環(huán)中,i=0,執(zhí)行內循環(huán)時,將j賦值為i的值O,執(zhí)行一次t=t+b[i][b[j][j]],得到t=1,退出內循環(huán),接著進入第二次外循環(huán),在第二次外循環(huán)結束時t=2,然后執(zhí)行第三次外循環(huán),得到t=4,退出循環(huán),輸出t的值。
(43)有以下程序:
#definef (x)X*X
main()
{
int i:
i=f(4+4)/f(2+2);
printf("%d\n",i);
}
程序運行后的輸出結果是______。
A)28 B)22 C)16 D)4
答案:A
評析:主函數中f(4+4)/f(2+2)可按帶參宏定義展開為4+4*4+4/2+2*2+2(千萬不要隨意地添加括號),求得結果為28。
(44)以下程序的輸出結果是______。
#inclue<stdio.h>
#inclue<string.h>
main()
{char b1[8]="goddwer",b2[8],*pb=bl+3;
while(--pb>=b1) strcpy(b2,pb);
print("%dha",strlen(b2));
)
A)8 B)3 C)l D)7
答案:D
評析:每次執(zhí)行循環(huán),都是將pb指針指向的內容復制到b2中,第一次循環(huán)中,將b1[2]~b1[7]六個字符復制到b2中,第二次循環(huán),將b[1]~b[7]七個字符復制到b2中,第三次循環(huán),將b1數組的全部內容復制到b2中。而后一次復制會覆蓋前面的復制,最后b2的實際長度應該是八,而strlen()函數測出的是一個字符串中"\O"之前的全部字符的個數,所以最后輸出的值是70
(45)在說明語句:int *f();中,標識符f代表的是______。
A)一個用于指向整型數據的指針變量
B)一個用于指向一維數組的行指針
C)一個用于指向函數的指針變量
D)一個返回值為指針型的函數名
答案:D
評析:一個函數在編譯時被分配給一個入口地址,這個入口地址就稱為函數的指針?梢杂靡粋指針變量指向函數,然后通過該指針變量調用此函數。Int*f()表示f是一個函數,它帶回一個指針值,這個指針是指向一個整型數據的。
(46)下面函數中,可以把整數以二進制形式存放到文件中的函數是______。
A)fprintf函數 B)fread函數 C)fwrite函數 D)fputc函數
答案:C
評析:ANSI c標準提出設置兩個函數(fread和fwrite),用來讀寫一個數據塊。它們的一般調用形式為:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
其中:buffer是一個指針;size是要讀寫的字節(jié)數;count是要進行讀寫多少個size字節(jié)的數據項;
fb是指文件型指針。如果文件以二進制形式打開,用fread和fwrite函數就可以讀寫任何類型的信息。
(47)不合法的main函數命令行參數表示形式是______。
A)main(int a,char*c[]) B)main(int arc,char **arv)
C)main(int argc,char *argv) D)main(int argv,char *arge[])
答案:C
評析:本題主要考查了對main函數參數的了解,main函數可以有兩個形參,一般形式是:main(int argc,char*argv[]),也就是說,它的第一個形參是一個整型變量,第二個形參是一個指針數組,其元素指向字符型數據。
(48)以下程序的輸出結果是______.
int x=3;
main()
{int i;
for(i=l;i<x;i++)incre();
}
incre()
{ static int x=l;
X*=x+l:
printf("%Di",x);
}
A)3 3 B)2 2 C)2 6 D)2 5
答案:C
評析:incre()中定義一個靜態(tài)局部變量x,它的作用范圍僅限于本函數中,而不會影響main()函數中的x值。
(49)有以下結構體說明和變量的定義,且如圖所示指針p指向變量a,指針q指向變量b。則不能把結點b連接到結點a之后的語句是________。
struct node
{ char data;
struct node *next;
}a,b,*p=&a,*q=&b;
A)a.next=q; B)p.next=&b; C)p->next=&b; D)(*p).next=q;
答案:B
評析:由于p是一個指向struct node型的指針變量,要訪問該指針變量指向的結構體成員,必須使用->運算符或"(*p).成員"的形式,故選項B是錯誤的。
(50)若有以下定義:
struct link
{ int data;
struct link*next;
}a,b,c,*p,*q;
且變量a和b之間已有如圖所示的鏈表結構:
指針p指向變量a,q指向變量c。則能夠把c插入到a和b之間并形成新的鏈表的語句組是______。
A)a.next=c;c.next=b; B)p.next=q;q.next=p.next;
C)p->next=&c;q->next=p->next; D)(*p).next=q;(*q).next=&b;
答案:D
評析:本題考的是指針的運用。即先將元素a的指針指向q指針所指向的元素即c,然后將c的指針指向b元素,采取的是直接取元素地址的方式。
二、填空題(每空2分,共40分)
請將每一個空的正確答案寫在答題卡的【1】至【20】序號的橫線上,答在試卷上不得分。
(1)算法的基本特征是可行性、確定性、 【1】 和擁有足夠的情報。
答案:【1】有窮性
評析:算法是指解題方案的準確而完整的描述。它有4個基本特征,分別是可行性、確定性、有窮性和擁有足夠的情報。
(2)順序存儲方法是把邏輯上相鄰的結點存儲在物理位置 【2】 的存儲單元中。
答案:【2】相鄰
評析:常用的存儲表示方法有4種,順序存儲、鏈式存儲、索引存儲、散列存儲。其中,順序存儲方法是把邏輯上相鄰的結點存儲在物理位置也相鄰的存儲單元中。
(3)Jackson結構化程序設計方法是英國的M.Jackson提出的,它是一種面向 【3】 的設計方法。
答案:【3】數據結構
評析:結構化分析方法主要包括:面向數據流的結構化分析方法(SA-Structured analysis),面向數據結構的Jackson方法(JSD-Jackson system development method)和面向數據結構的結構化數據系統(tǒng)開發(fā)方法(DSSD-Data structured system development method)。
(4)數據庫設計分為以下6個設計階段:需求分析階段、 【4】 、邏輯設計階段、物理 設計階段、實施階段、運行和維護階段。
答案:【4】概念設計階段或數據庫概念設計階段
評析:數據庫設計分為以下6個設計階段:需求分析階段、概念設計階段、邏輯設計階段、物理設計階段、實施階段及數據庫運行和維護階段。
(5)數據庫保護分為:安全性控制、 【5】 、并發(fā)性控制和數據的恢復。
答案:【5】完全性控制
評析:考查考生對數據庫基本知識的了解。
安全性控制:防止未經授權的用戶有意或無意存取數據庫中的數據,以免數據被泄露、更改或破壞;完整性控制:保證數據庫中數據及語義的正確性和有效性,防止任何對數據造成錯誤的操作;并發(fā)性控制:正確處理好多用戶、多任務環(huán)境下的并發(fā)操作,防止錯誤發(fā)生;數據的恢復:當數據庫被破壞或數據不正確時,使數據庫能恢復到正確的狀態(tài)。
(6)設有int x=ll;,則表達式(x++ *1/3)的值為 【6】 。
答案:【6】3
評析:白增自減運算符的作用是使變量的值增1或減1,如:
++i,--i (在使用i之前,先使i的值加(減)1)
i++,i-- (在使用i之后,使i的值加(減)1)
所以表達式(x++*1/3)的值即11/3的值:3。
(7)若從鍵盤輸入58,則以下程序的輸出結果是 【7】 。
main()
{ int a;
Scanf("%d",&a);
If(a>50)printf("%d",a);
If(a>40)printf("%d",a);
if(a>30)printf("%d",a);
}
答案:【7】585858
評析:本題首先為a輸入一個值58,然后執(zhí)行三個判斷語句,在每一個判斷中,如果滿足判斷條件的話,就輸出a,因為三次判斷,條件都滿足,所以三次輸出a。
(8)下列程序運行的結果是 【8】 。
#include<stdio.h>
main()
{
int x=l,i=l:
fOr(;x<50;i++)
{if(x>=10)break;
if(x%2!=1)
{x+=3;continue;}
x-=1;
}
printf("x=%d,i=%d\n",x,i);
}
答案:【8】x=11,i=11
評析:本題程序段通過for循環(huán)語句實現當x的值為奇數時,x自減1:當x為偶數時自加3的功能。程序共執(zhí)行了11次循環(huán),當x=11時退出循環(huán)。
(9)以下程序的輸出結果是 【9】 。
main()
fint a=177;
printf("%o\n",a);
}
答案:【9】261
評析:本題考點是printf函數的格式字符。"%0"表示以八進制整數形式輸出。
(10)以下程序的輸出結果是【10】 。
main()
{int a:O;
a+=(a=8);
printf("%d\n",a);
}
答案:【10】16
評析:本題主要考的是運算符的優(yōu)先級。
A+=(a=8)可以寫成a:=a+(a=8)的形式,括號的優(yōu)先級高于"+",而"+"的優(yōu)先級又高于"=",所以先執(zhí)行括號內的運算,將a賦值為8,然后再執(zhí)行+運算。
(11)以下定義的結構體類型擬包含兩個成員,其中成員變量info用來存放整型數據;成 員變量link是指向自身結構的指針。請將定義補充完整。
struct node
{int info;
【11】 link;
};
答案:【11】struct node*
評析:本題考的是如何定義一個指向結構體變量的指針。
一個結構體變量指針就是該變量所占據的內存段的起始地址?梢栽O一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址。指針變量也可以用來指向結構體數組中的元素。
(12)以下程序的輸出結果是 【12】 。
main()
{int s,i;
for(s=O,i=O;i<3;i++,s+=i);
printf("%d\n",s);
}
答案:【12】6
評析:在逗號表達式內按自左至右順序求解,因此本題共執(zhí)行三次循環(huán),具體情形如下:
第一次當i=O時,執(zhí)行i++,s+=i,則i=l,s=l:
第二次當i=l時,執(zhí)行i++,s+=i,則i=2,s=3;
第三次當i=2時,執(zhí)行i++,s+=i,則i=3,s=6。
當i=3后退出循環(huán)。
(13)以下程序的輸出結果是 【13】 。
main()
{char *p="abcdefgh",*r;
1ong *q;
q=(1ong*)p;
q++;
r=(char*)q;
printf("%s\n",r);
}
答案:【13】efgh
評析:指針變量p,r指向字符型數據,而指針變量q指向長整型數據。首先通過類型轉換將指針p的值賦給q,然后執(zhí)行q自加,因為q是定義為指向長整型數據的變量,而長整型數據一般占4個字節(jié)的空間,所以實際上,q的值增加了4,當再將q的值經過強行類型轉換賦給r的時候,實際上這時候r是指向了字符e,所以最后打印字符串時,得到的結果是"efgh"。
(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:
}
答案:【14】7
評析:本題是一個遞歸調用。
主函數中調用sub函數流程如下:
sub(*x,8,1)-sub(*x,4,2)-sub(*x,2,4)-x=x+k=4
︱ ︱
x=x+k=7 x=x+k=6
(15)以下程序可以將從鍵盤輸入的十進制數(1ong型)以二到十六進制數的形式輸出,請?zhí)羁铡?BR> #include<stdio.h>
main()
{char b[16]={'O','l','2','3','4','5','6','7','8',
'9','A','B',C','D','E','F'};
int c[64],d,i=0,base;
long n:
print("Enter a number:\n");scanlf["%1d',&n);
print("Enter new base:\n");scanf("%ld",&base);
do
{
C[i]= 【15】
i++;n=n/base;
}while [n!=0);
pdntf("'Transmite new base:\n");
f0"--i;i>=O;--i)
{ d=c[I];
printf("%c",b 【16】 ;
}
}
答案:【15】n%base
【16】[d]
評析:進制轉換的除余取整法。在循環(huán)中,是先對數n整除以base取余作為轉換后的base進制數的第i位存放到數組元素c[i】中,然后對n整除以base的商作同樣的操作,直到商為O為止,故第一空為n%base。
由于存入到數組c中的各個元素為對應數制在十進制上表示的各位的權值,在輸出時必須將其轉換成對應的字符輸出,而在數組b中對應存放了各個數對應的字符,故第二空應填[d]。
(16)設有如下宏定義
#define MYSWAP(z,x,y) {z=x;x=f;y=z;}
以下程序段通過宏調用實現變量a,b內容的交換,請?zhí)羁铡?BR> float a=5,b=16,c;
MYSWAPI( 【17】 ,a,b);
答案:【17】c
評析:本題最重要的是理解宏MYSWAP(z,x,y)的作用:通過z實現x,y的內容交換。所以MYSWAP(c,a,b)可以通過c實現a,b內容的交換。
(17)以下程序用來統(tǒng)計文件字符的個數,請?zhí)羁铡?BR> #include "stdio.h"
main ()
{FILE *fp;long num=0;
if((fp=fopen("fname.dat","r"))==NULl)
{printf("Open error\n");,exit,(O);}
while( 【18】 )
{num++;}
Printf["num=%ld\n",num];
Fclose(fp);
)
答案:【18】fgetc(fp)!=EOF或!feof(fp)
評析:本程序考的是龜etc函數。
此函數的功能是從指針變量印所指向的文件中讀入一個字符,如果執(zhí)行龜etc函數時遇到文件結束符,則函數返回文件結束符EOF。
(18)以下程序用來輸出結構體變量ex所占存儲單元的字節(jié)數,請?zhí)羁铡?BR> struct st
{char *name;double score;};
main()
{ struct st ex;
print("ex size:%d\n",sizeof( 【19】 ));
}
答案:【19】ex
評析:sizeof函數計算已知類型所占的字節(jié)數。sizeof(ex)即計算結構體變量ex在內存中所占的字節(jié)數。
(19)以下程序中,select函數的功能是:在N行M列的二維數組中,選出一個最大值作為函數值返回,并通過形參傳回此最大值所在的行下標,請?zhí)羁铡?BR> #define N 3
#define M 3
select(int a[N][M],int *n)
{int i,j,row=O,colum=O;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
if(a[i][j]>a[row][colum]){row=i;colum=j;}
*n=row;
retum( 【20】 );
}
main()
{int a[N][M]={9,11,23,6,l,15,9,17,20),max,n;
max=select(a,&n);
printf("max=%d,line=%d\n",max,n);
}
答案:【20】a[row][colum]
評析:本題通過判斷語句,將較大值的行下標賦給row,列下標賦給colum,循環(huán)結束后,a[row][colum]中是數組元素的最大值,所以應該把它的行下標賦給*n,將a[row][colum]的值返回。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |