![](https://img.examw.com/index/logo.png)
【程序填空題參考答案】
【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ù)組元素的值。當輸入的元素值小于0時,應(yīng)當跳過后面的語句,取下一個數(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)當是計算迭代值x1=(x0+a/x0)/2。按照求平方根的要求,當?shù)木炔荒軡M足"(fabs(x1-x0)>0.00001)"時,則要繼續(xù)迭代,因此②處應(yīng)當填寫"a,x1"。程序中調(diào)用了求絕對值的庫函數(shù)fabs( )。 【3.25】答案:① 2+age(n-1) ② age(5) 注釋:由于程序是遞歸算法,因此首先要建立問題的遞歸數(shù)學模型。根據(jù)原題的描述可以寫出如下遞歸公式: age(n) = 10 (n=1) age(n) = 2+age(n-1) (n>1) 對照程序和遞歸公式可以看出:n的含義是第n位學生。很顯然,要求第5位學生的年齡,②處應(yīng)當是調(diào)用函數(shù)age,實參的值應(yīng)當是5。在①處應(yīng)該是函數(shù)的遞歸調(diào)用,根據(jù)遞歸公式,應(yīng)當填寫:2+age(n-1)。 【3.26】答案:① return(1) ② return (sum(n-1)+n) 注釋:按照常規(guī)的編程方法,此問題可采用一個循環(huán)語句實現(xiàn)。閱讀程序,沒有發(fā)現(xiàn)循環(huán)語句,這時,應(yīng)當認為原來的編程者使用的是非常規(guī)的算法。對于這樣常規(guī)算法需要用循環(huán)實現(xiàn)而沒有使用循環(huán)的程序,就可以肯定地認為,一定是使用了遞歸算法。 將問題"求1~n的累加和"的公式寫成遞歸定義,可以是如下形式; sum(n)=1 當n=1時 sum(n)=sun(n-1)+n 當n>1時 根據(jù)此遞歸定義,可以很容易完成程序。 【3.27】答案:① return(1) ② n*facto(n-1) 注釋:我們熟悉的求n!的算法一般是采用循環(huán)語句實現(xiàn),但在此程序中根本沒有循環(huán)語句。這時我們應(yīng)該想到:是采用遞歸算法實現(xiàn)的。首先寫出求n!的遞歸公式; n!=1 當n=1時 n!=n*(n-1) 當n>1時 根據(jù)此遞歸定義,可以很容易完成程序。 【3.28】答案:① com=n ② com=combin(n-1,m-1) + combin(n-1,m) 注釋:題目的說明中已經(jīng)給出組合問題的遞歸定義,不需要讀者自己尋找遞歸表達式。程序中的語句"if (n<2*m) m=n-m;"完成了題目中敘述的"用公式(1)進行簡化"的工作。 【3.29】答案:① *str=='\0' ② 1+strlen(str+1) 注釋:求串長算法的關(guān)鍵是確定串結(jié)束標記'\0'的位置。根據(jù)求串長的方法,可以得到如下遞歸算法:指針str指向字符串的首字符 如果 當前字符(*str)== 串結(jié)束標記'\0' 則 串長=0 否則 串長 = 1+除第一個字符之外的剩余字符串的串長 因此,在①的位置上應(yīng)當填寫"*str=='\0'",以判斷當前字符(*str)是否是串結(jié)束標記'\0'。在②的位置應(yīng)當是根據(jù)上面的遞歸算法進行遞歸調(diào)用,因此應(yīng)當填寫"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個字符c。 【3.32】答案:① y(x, n-1) 注釋:這顯然是一個遞歸問題,首先要對原來的數(shù)學函數(shù)定義形式進行變形,推導出原來函數(shù)的等價遞歸定義。可以推導出原來函數(shù)的遞歸定義如下。 y(x,n)=x 當n=0時 y(x,n)=sqrt(x+y(x,n-1)) 當n>0時 【3.33】答案:① p-- ② *p='\0' ③ *p=c ④ p-- ⑤ *s++ 注釋:在遞歸算法中,指針s指向字符串首部要反向的字符,即要將指針s所指向的字符與指針p 所指向的字符串尾的字符('\0')進行交換,在交換過程中,將尚沒有交換的字符串的中間部分作為一個整體,進行遞歸處理。程序中首先執(zhí)行"c=*s",將首字符存入臨時變量;然后執(zhí)行"*s=*p",將尾字符存入串首;執(zhí)行"revstr(s+1)"是遞歸處理串的中間部分,這時,在②處應(yīng)當填入"*p='\0'",即存入串結(jié)束標記。這是這一程序中的關(guān)鍵所在。在③處要完成將存在臨時變量c中的字符存入串尾的工作,應(yīng)當填寫"*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的兩個形參的含義是:對指針p和指針q之間的數(shù)據(jù)進行排序。由語句"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是指向當前最大值的指針,則當找到新的最大值時,max中保存的應(yīng)該是新的最大值的指針,因此②處應(yīng)填"max=s"。 當調(diào)用函數(shù)swap交換兩個變量值的時候,要求實參是變量的地址,因此,③處應(yīng)填"p,max"將最大值存入指針p所指的單元。 由于問題的要求是"從大到小"排序,通過執(zhí)行一次函數(shù)sort使最大值已經(jīng)放到了指針p所指的單元中,因此,下一遍排序的時候,只要對指針p之后的元素進行即可,所以④處應(yīng)填"p+1,q"。 【3.36】答案:① a+1 ② n%10+'0' 【3.37】答案:① s 【3.38】答案;①*(p+4*i+j) 注釋:p是一個一級指針,賦值后保存二維數(shù)組a的首地址,做加法運算加1時,實際地址增加一個它所指向的數(shù)據(jù)類型的長度。在C語言中,多維數(shù)組在計算機中是按行存儲的,所以在本題中要通過指針訪問二維數(shù)組中的數(shù)據(jù),必須將二維下標轉(zhuǎn)換為一維下標。 【3.39】答案:① '\0' 或 0 ② ++ 注釋:在C語言中,進行字符串處理時,必須注意串結(jié)束標記'\0',它是在進行串處理時的最基本的要求,所以①中要填入'\0'。為了使用putchar輸出一個字符串,則必須有改變指針的運算,這里只能使用++運算。 【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 注釋:程序的主體是一個二重循環(huán),內(nèi)層for循環(huán)完成查找學生的工作。①處是進行結(jié)構(gòu)數(shù)組說明并初始化,按照結(jié)構(gòu)變量說明的格式規(guī)定,應(yīng)該填寫:strcut student。②處為if語句的邏輯條件,應(yīng)當是當查找到指定的學生后輸出學生的情況,因此應(yīng)當填寫:strcmp(stu[i].name,str)==0。③處應(yīng)當將控制退出內(nèi)層的for循環(huán),只能選擇break語句。 【3.45】答案:① p+n ② gets(p->name) ③ p+n 注釋:本程序是通過函數(shù)完成對于結(jié)構(gòu)數(shù)組的輸入和輸出操作。函數(shù)data_in和data_out十分相似,都是通過結(jié)構(gòu)指針p和結(jié)構(gòu)指針q來操作結(jié)構(gòu)數(shù)組的元素。由于指針q在兩個函數(shù)中的作用相同,所以①和③填寫的內(nèi)容也應(yīng)該是相同的;由for語句中的循環(huán)終止條件"p 【3.46】答案:① j=i-1 ② > ③ j-- ④ j+1 ⑤ j+1 注釋:程序的基本思想是:對于輸入的第i個整數(shù)num,從數(shù)組array中已有的元素中倒序開始查找。若數(shù)組array中的第j個元素的值大于num,則將數(shù)組中的元素j向后移動一個位置;否則,就應(yīng)將num插入到當前位置作為元素j。因此,程序的基本設(shè)計思想就是插入排序。 程序中內(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 注釋:程序在從鍵盤接受字符的同時就在建立起鏈表,所建立的鏈表本身就已經(jīng)是反序排列的,因此在反序輸出字符串的時候?qū)嶋H只需沿著鏈表的第一個結(jié)點開始,順序操作即可。 【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)存開辟指定字節(jié)數(shù)的存儲空間,并將此存儲空間的地址返回賦給尾指針tail,但是此地址為void型,應(yīng)將其強制轉(zhuǎn)換為所要求的結(jié)構(gòu)指針類型。 、谛麻_辟的結(jié)點的內(nèi)存地址存于tail所指向的已建立的鏈表的尾結(jié)點的結(jié)構(gòu)成員next,新結(jié)點連入鏈表以后,尾指針tail應(yīng)指向新的結(jié)點。 【3.52】答案:① (struct student *) ② (struct list *) ③ return(head) 【3.53】答案:① FILE ② !feof(fp) 注釋:FILE 是文件結(jié)構(gòu)類型名。feof()是測試文件結(jié)束標志的函數(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為命令行中字符串的個數(shù),此程序運行時輸入的字符串有可運行程序名、文件1和文件2,故argc不應(yīng)小于3。字符串指針argv[0]指向可運行程序名、字符串指針argv[1]指向輸入文件名、字符串指針argv[2]指向輸出文件名,由上所述②處給出循環(huán)條件是輸入文件是否結(jié)束,③處需要填出輸出文件名。最后兩處是關(guān)閉兩個文件,原則上關(guān)閉文件沒有順序要求,但習慣上是后打開的文件先關(guān)閉。 【3.56】答案:① *argv[1] ② (*funcp)(n) ③ s+=i 注釋:程序執(zhí)行時輸入的命令及參數(shù)的個數(shù)(操作系統(tǒng)規(guī)定用空格表示字符串的分隔)由系統(tǒng)賦給主函數(shù)的形數(shù)argc,輸入的命令和參數(shù)以字符串的格式保存,字符串的首地址分別賦給指針數(shù)組argv的各個元素,其中argv[1]是'+'或'-',分別表示累加或階乘。程序根據(jù)argv[1]所指向的字符串的內(nèi)容給指向函數(shù)的指針變量funcp賦值。②處要求的語句是根據(jù)指向函數(shù)的指針變量的內(nèi)容對相應(yīng)的函數(shù)實現(xiàn)調(diào)用,所以選擇A或B是錯誤的;據(jù)funcp是被調(diào)函數(shù)的地址,*funcp實現(xiàn)了對函數(shù)的調(diào)用,根運算符的結(jié)合性,(*funcp)表示取funcp的目標,而*funcp(n)則funcp先和(n)結(jié)合,funcp就被解釋為函數(shù)名,顯然是錯誤的。 【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)。