【程序填空題參考答案】
【3.1】答案: ① a+b ② a-b ③ a-b
【3.2】答案:① 1.0/(float)(i*i) ② sqrt(6*s)
【3.3】答案:① *k=p
【3.4】答案:① t=t*i ② t=t>0?-1:1
【3.5】答案:① d=1 ② k++ ③ k<=n
【3.6】答案: ① x>=0 ② x 【3.7】答案: ① 2 ② 2 【3.8】答案:① m=n ② m>0 ③ m=m/10 【3.9】答案:① i==j ② k!=i&&k!=j 【3.10】答案:① i<=9 ② j%3!=0 【3.11】答案:① m=n ② r!=0 ③ return(n) 【3.12】答案:① float a[10],x ② i<=9 ③ i<=8 ④ j<=9-i 、 a[j]>a[j+1] ⑥ a[j]=a[j+1] ⑦ i<=9 ⑧i%5==0 【3.13】答案:① &a[i] ② continue 注釋:①是基本概念,使用scanf函數(shù)輸入數(shù)組元素的值。當(dāng)輸入的元素值小于0時(shí),應(yīng)當(dāng)跳過(guò)后面的語(yǔ)句,取下一個(gè)數(shù),所以②要填入continue。 【3.14】答案:① s[j++]=s[i] ② s[j]=s[i] 【3.15】答案:① s[j++]=s[i] 【3.16】答案:① x[i++] 【3.17】答案:① i=strlen(a);i>=j;i-- ② a[i+1]=a[i] 【3.18】答案:① '\0' ② str1[i]-str2[i] 【3.19】答案:① j++ ② '\\' ③ j++ ④ '\\' ⑤ j++ ⑥ '\0' 【3.20】答案:① t[k]!= '\0' ② t[k]== '\0' 【3.21】答案:① <=n ② s ③ 0 ④ fun(k) 【3.22】答案:① a[fmax(a,N)] ② k=p 【3.23】答案:① last*n%1000 ② x!=min-x ③ flag=0 【3.24】答案:① (x0+a/x0)/2 ② a,x1 注釋:根據(jù)迭代公式,①處應(yīng)當(dāng)是計(jì)算迭代值x1=(x0+a/x0)/2。按照求平方根的要求,當(dāng)?shù)木炔荒軡M足"(fabs(x1-x0)>0.00001)"時(shí),則要繼續(xù)迭代,因此②處應(yīng)當(dāng)填寫(xiě)"a,x1"。程序中調(diào)用了求絕對(duì)值的庫(kù)函數(shù)fabs( )。 【3.25】答案:① 2+age(n-1) ② age(5) 注釋:由于程序是遞歸算法,因此首先要建立問(wèn)題的遞歸數(shù)學(xué)模型。根據(jù)原題的描述可以寫(xiě)出如下遞歸公式: age(n) = 10 (n=1) age(n) = 2+age(n-1) (n>1) 對(duì)照程序和遞歸公式可以看出:n的含義是第n位學(xué)生。很顯然,要求第5位學(xué)生的年齡,②處應(yīng)當(dāng)是調(diào)用函數(shù)age,實(shí)參的值應(yīng)當(dāng)是5。在①處應(yīng)該是函數(shù)的遞歸調(diào)用,根據(jù)遞歸公式,應(yīng)當(dāng)填寫(xiě):2+age(n-1)。 【3.26】答案:① return(1) ② return (sum(n-1)+n) 注釋:按照常規(guī)的編程方法,此問(wèn)題可采用一個(gè)循環(huán)語(yǔ)句實(shí)現(xiàn)。閱讀程序,沒(méi)有發(fā)現(xiàn)循環(huán)語(yǔ)句,這時(shí),應(yīng)當(dāng)認(rèn)為原來(lái)的編程者使用的是非常規(guī)的算法。對(duì)于這樣常規(guī)算法需要用循環(huán)實(shí)現(xiàn)而沒(méi)有使用循環(huán)的程序,就可以肯定地認(rèn)為,一定是使用了遞歸算法。 將問(wèn)題"求1~n的累加和"的公式寫(xiě)成遞歸定義,可以是如下形式; sum(n)=1 當(dāng)n=1時(shí) sum(n)=sun(n-1)+n 當(dāng)n>1時(shí) 根據(jù)此遞歸定義,可以很容易完成程序。 【3.27】答案:① return(1) ② n*facto(n-1) 注釋:我們熟悉的求n!的算法一般是采用循環(huán)語(yǔ)句實(shí)現(xiàn),但在此程序中根本沒(méi)有循環(huán)語(yǔ)句。這時(shí)我們應(yīng)該想到:是采用遞歸算法實(shí)現(xiàn)的。首先寫(xiě)出求n!的遞歸公式; n!=1 當(dāng)n=1時(shí) n!=n*(n-1) 當(dāng)n>1時(shí) 根據(jù)此遞歸定義,可以很容易完成程序。 【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m) 注釋:題目的說(shuō)明中已經(jīng)給出組合問(wèn)題的遞歸定義,不需要讀者自己尋找遞歸表達(dá)式。程序中的語(yǔ)句"if (n<2*m) m=n-m;"完成了題目中敘述的"用公式(1)進(jìn)行簡(jiǎn)化"的工作。 【3.29】答案:① *str=='\0' ② 1+strlen(str+1) 注釋:求串長(zhǎng)算法的關(guān)鍵是確定串結(jié)束標(biāo)記'\0'的位置。根據(jù)求串長(zhǎng)的方法,可以得到如下遞歸算法:指針str指向字符串的首字符 如果 當(dāng)前字符(*str)== 串結(jié)束標(biāo)記'\0' 則 串長(zhǎng)=0 否則 串長(zhǎng) = 1+除第一個(gè)字符之外的剩余字符串的串長(zhǎng) 因此,在①的位置上應(yīng)當(dāng)填寫(xiě)"*str=='\0'",以判斷當(dāng)前字符(*str)是否是串結(jié)束標(biāo)記'\0'。在②的位置應(yīng)當(dāng)是根據(jù)上面的遞歸算法進(jìn)行遞歸調(diào)用,因此應(yīng)當(dāng)填寫(xiě)"1+strlen(str+1)"。 【3.30】答案:① &n ② m%10 ③ m/10 ④ m>0 ⑤ r(m) 【3.31】答案:① prt(c, n-1) ② prt(' ' , n-i) ③ prt('*', i) 注釋:函數(shù)prt的功能是輸出n個(gè)字符c。 【3.32】答案:① y(x, n-1) 注釋:這顯然是一個(gè)遞歸問(wèn)題,首先要對(duì)原來(lái)的數(shù)學(xué)函數(shù)定義形式進(jìn)行變形,推導(dǎo)出原來(lái)函數(shù)的等價(jià)遞歸定義?梢酝茖(dǎo)出原來(lái)函數(shù)的遞歸定義如下。 y(x,n)=x 當(dāng)n=0時(shí) y(x,n)=sqrt(x+y(x,n-1)) 當(dāng)n>0時(shí) 【3.33】答案:① p-- ② *p='\0' ③ *p=c ④ p-- ⑤ *s++ 注釋:在遞歸算法中,指針s指向字符串首部要反向的字符,即要將指針s所指向的字符與指針p 所指向的字符串尾的字符('\0')進(jìn)行交換,在交換過(guò)程中,將尚沒(méi)有交換的字符串的中間部分作為一個(gè)整體,進(jìn)行遞歸處理。程序中首先執(zhí)行"c=*s",將首字符存入臨時(shí)變量;然后執(zhí)行"*s=*p",將尾字符存入串首;執(zhí)行"revstr(s+1)"是遞歸處理串的中間部分,這時(shí),在②處應(yīng)當(dāng)填入"*p='\0'",即存入串結(jié)束標(biāo)記。這是這一程序中的關(guān)鍵所在。在③處要完成將存在臨時(shí)變量c中的字符存入串尾的工作,應(yīng)當(dāng)填寫(xiě)"*p=c"。 【3.34】答案:① str+1 ② return ①改為 n-2 【3.35】答案:① p>=q ② max=s ③ p,max 、 p+1,q ⑤ &array[0], &array[9] 注釋:本程序中的排序部分采用的是遞歸算法。函數(shù)sort的兩個(gè)形參的含義是:對(duì)指針p和指針q之間的數(shù)據(jù)進(jìn)行排序。由語(yǔ)句"for( s=p+1; s<=q; s++)"中指針p和指針q之間的關(guān)系可以得出:指針p不應(yīng)在指針q之后,因此①處應(yīng)填"p>=q"、⑤處應(yīng)填"&array[0],&array[9]"。 由于變量max是指向當(dāng)前最大值的指針,則當(dāng)找到新的最大值時(shí),max中保存的應(yīng)該是新的最大值的指針,因此②處應(yīng)填"max=s"。 當(dāng)調(diào)用函數(shù)swap交換兩個(gè)變量值的時(shí)候,要求實(shí)參是變量的地址,因此,③處應(yīng)填"p,max"將最大值存入指針p所指的單元。 由于問(wèn)題的要求是"從大到小"排序,通過(guò)執(zhí)行一次函數(shù)sort使最大值已經(jīng)放到了指針p所指的單元中,因此,下一遍排序的時(shí)候,只要對(duì)指針p之后的元素進(jìn)行即可,所以④處應(yīng)填"p+1,q"。 【3.36】答案:① a+1 ② n%10+'0' 【3.37】答案:① s 【3.38】答案;①*(p+4*i+j) 注釋:p是一個(gè)一級(jí)指針,賦值后保存二維數(shù)組a的首地址,做加法運(yùn)算加1時(shí),實(shí)際地址增加一個(gè)它所指向的數(shù)據(jù)類型的長(zhǎng)度。在C語(yǔ)言中,多維數(shù)組在計(jì)算機(jī)中是按行存儲(chǔ)的,所以在本題中要通過(guò)指針訪問(wèn)二維數(shù)組中的數(shù)據(jù),必須將二維下標(biāo)轉(zhuǎn)換為一維下標(biāo)。 【3.39】答案:① '\0' 或 0 ② ++ 注釋:在C語(yǔ)言中,進(jìn)行字符串處理時(shí),必須注意串結(jié)束標(biāo)記'\0',它是在進(jìn)行串處理時(shí)的最基本的要求,所以①中要填入'\0'。為了使用putchar輸出一個(gè)字符串,則必須有改變指針的運(yùn)算,這里只能使用++運(yùn)算。 【3.40】答案:① p++ ② w[i+1]=w[i] 【3.41】答案:① && ② *a<*b ③ *a++, *b++ ④ == 、 != ⑥ '\0' ⑦ w=s ⑧ n++ 、 t=s[i];s[i]=s[j];s[j]=t; ⑩ s3[0] 【3.42】答案:① *++pa ② *++pa ③ *pa ④ return(total) ⑤ n<=2 || n>=MAXNUM+1 ⑥ num+n 【3.43】答案:① stu.name ② &stu.score ③ p->name ④ p->score 注釋:這是結(jié)構(gòu)中的最基本概念。 【3.44】答案:① struct student ② strcmp(stu[i].name,str)==0 ③ break 注釋:程序的主體是一個(gè)二重循環(huán),內(nèi)層for循環(huán)完成查找學(xué)生的工作。①處是進(jìn)行結(jié)構(gòu)數(shù)組說(shuō)明并初始化,按照結(jié)構(gòu)變量說(shuō)明的格式規(guī)定,應(yīng)該填寫(xiě):strcut student。②處為if語(yǔ)句的邏輯條件,應(yīng)當(dāng)是當(dāng)查找到指定的學(xué)生后輸出學(xué)生的情況,因此應(yīng)當(dāng)填寫(xiě):strcmp(stu[i].name,str)==0。③處應(yīng)當(dāng)將控制退出內(nèi)層的for循環(huán),只能選擇break語(yǔ)句。 【3.45】答案:① p+n ② gets(p->name) ③ p+n 注釋:本程序是通過(guò)函數(shù)完成對(duì)于結(jié)構(gòu)數(shù)組的輸入和輸出操作。函數(shù)data_in和data_out十分相似,都是通過(guò)結(jié)構(gòu)指針p和結(jié)構(gòu)指針q來(lái)操作結(jié)構(gòu)數(shù)組的元素。由于指針q在兩個(gè)函數(shù)中的作用相同,所以①和③填寫(xiě)的內(nèi)容也應(yīng)該是相同的;由for語(yǔ)句中的循環(huán)終止條件"p 【3.46】答案:① j=i-1 ② > ③ j-- ④ j+1 ⑤ j+1 注釋:程序的基本思想是:對(duì)于輸入的第i個(gè)整數(shù)num,從數(shù)組array中已有的元素中倒序開(kāi)始查找。若數(shù)組array中的第j個(gè)元素的值大于num,則將數(shù)組中的元素j向后移動(dòng)一個(gè)位置;否則,就應(yīng)將num插入到當(dāng)前位置作為元素j。因此,程序的基本設(shè)計(jì)思想就是插入排序。 程序中內(nèi)層的for循環(huán)完成查找插入位置的工作,因此答案①、②和③有密切的關(guān)系,要統(tǒng)一考慮。同樣,程序中的答案④和⑤也有密切的關(guān)系,要統(tǒng)一考慮。 【3.47】答案:① != '\n' ② p=top 【3.48】答案:① p1->next 【3.49】答案:① head ② p ③ p=head 注釋:程序在從鍵盤接受字符的同時(shí)就在建立起鏈表,所建立的鏈表本身就已經(jīng)是反序排列的,因此在反序輸出字符串的時(shí)候?qū)嶋H只需沿著鏈表的第一個(gè)結(jié)點(diǎn)開(kāi)始,順序操作即可。 【3.50】答案:① return ② (struct data *) malloc(sizeof(struct data)) 、 input( ) ④ p!=NULL ⑤ p=p->next 【3.51】答案:① (struct student *) ② tail=tail->next ③ head 注釋:①malloc函數(shù)的作用是在內(nèi)存開(kāi)辟指定字節(jié)數(shù)的存儲(chǔ)空間,并將此存儲(chǔ)空間的地址返回賦給尾指針tail,但是此地址為void型,應(yīng)將其強(qiáng)制轉(zhuǎn)換為所要求的結(jié)構(gòu)指針類型。 、谛麻_(kāi)辟的結(jié)點(diǎn)的內(nèi)存地址存于tail所指向的已建立的鏈表的尾結(jié)點(diǎn)的結(jié)構(gòu)成員next,新結(jié)點(diǎn)連入鏈表以后,尾指針tail應(yīng)指向新的結(jié)點(diǎn)。 【3.52】答案:① (struct student *) ② (struct list *) ③ return(head) 【3.53】答案:① FILE ② !feof(fp) 注釋:FILE 是文件結(jié)構(gòu)類型名。feof()是測(cè)試文件結(jié)束標(biāo)志的函數(shù)。 【3.54】答案:① "second.txt" ② fclose(fp) 【3.55】答案:① 3 ② !feof(f1)或feof(f1)==0 ③ f2 ④ fclose(f2) ⑤ fclose(f1) 注釋:程序中使用了帶參數(shù)的main函數(shù),其中整型參數(shù)argc為命令行中字符串的個(gè)數(shù),此程序運(yùn)行時(shí)輸入的字符串有可運(yùn)行程序名、文件1和文件2,故argc不應(yīng)小于3。字符串指針argv[0]指向可運(yùn)行程序名、字符串指針argv[1]指向輸入文件名、字符串指針argv[2]指向輸出文件名,由上所述②處給出循環(huán)條件是輸入文件是否結(jié)束,③處需要填出輸出文件名。最后兩處是關(guān)閉兩個(gè)文件,原則上關(guān)閉文件沒(méi)有順序要求,但習(xí)慣上是后打開(kāi)的文件先關(guān)閉。 【3.56】答案:① *argv[1] ② (*funcp)(n) ③ s+=i 注釋:程序執(zhí)行時(shí)輸入的命令及參數(shù)的個(gè)數(shù)(操作系統(tǒng)規(guī)定用空格表示字符串的分隔)由系統(tǒng)賦給主函數(shù)的形數(shù)argc,輸入的命令和參數(shù)以字符串的格式保存,字符串的首地址分別賦給指針數(shù)組argv的各個(gè)元素,其中argv[1]是'+'或'-',分別表示累加或階乘。程序根據(jù)argv[1]所指向的字符串的內(nèi)容給指向函數(shù)的指針變量funcp賦值。②處要求的語(yǔ)句是根據(jù)指向函數(shù)的指針變量的內(nèi)容對(duì)相應(yīng)的函數(shù)實(shí)現(xiàn)調(diào)用,所以選擇A或B是錯(cuò)誤的;據(jù)funcp是被調(diào)函數(shù)的地址,*funcp實(shí)現(xiàn)了對(duì)函數(shù)的調(diào)用,根運(yùn)算符的結(jié)合性,(*funcp)表示取funcp的目標(biāo),而*funcp(n)則funcp先和(n)結(jié)合,funcp就被解釋為函數(shù)名,顯然是錯(cuò)誤的。 【3.57】答案:① "w" ② -32 ③ "r" 【3.58】答案:① "bi.dat" ② &j ③ fp 【3.59】答案:① fgetc(fp))!=EOF ② &keyword[i].word[0] 、 s++; q++; ④ *s==*q ⑤ (word=getword(cp))!=NULL 【3.60】答案:① "a+" ② rewind(fp) ③ !=NULL ④ flag=0 ⑤ ferror(fp)==0name)。