2023年電大計(jì)算機(jī)科學(xué)與技術(shù)c語言各章練習(xí)題答案_第1頁
2023年電大計(jì)算機(jī)科學(xué)與技術(shù)c語言各章練習(xí)題答案_第2頁
2023年電大計(jì)算機(jī)科學(xué)與技術(shù)c語言各章練習(xí)題答案_第3頁
2023年電大計(jì)算機(jī)科學(xué)與技術(shù)c語言各章練習(xí)題答案_第4頁
2023年電大計(jì)算機(jī)科學(xué)與技術(shù)c語言各章練習(xí)題答案_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

各章練習(xí)題答案C語言概述簡(jiǎn)答題答:C語言單詞分為保存字、標(biāo)記符、字面常量、運(yùn)算符和分隔符5類。答:首字符必須是英文字母或下劃線;其余位置上的字符必須是英文字母、十進(jìn)制數(shù)字符號(hào)或下劃線。答:它們的首字符不同,此外各自尚有具體的格式規(guī)定。其中,數(shù)值字面常量以數(shù)字、正負(fù)號(hào)或小數(shù)點(diǎn)(如.01表達(dá)0.01)開頭,字符字面常量必須用單引號(hào)括起來,字符串字面常量必須用雙引號(hào)括起來,標(biāo)記符首字符必須是英文字母或下劃線。答:分類如下。數(shù)值常量3個(gè):25-8+3.42字符常量3個(gè):'4''D''+'字符串7個(gè):"x1""-28""y=m+1""a12.c""else""+""intx;"標(biāo)記符7個(gè):x2ncountmainHlistxyMaxA_1保存字3個(gè):intvoidif運(yùn)算符1個(gè):+分隔符0個(gè):非法數(shù)據(jù)1個(gè):3ab以上共計(jì)25個(gè)。答:C語句除空語句外,按照語句功能,可分為以下8類:類型定義語句、變量定義語句、函數(shù)原型語句、表達(dá)式語句、復(fù)合語句、選擇語句、循環(huán)語句和跳轉(zhuǎn)語句。在以上8類語句中,前3類屬于說明性語句,后5類屬于執(zhí)行性語句。答:其格式為:#include<頭文獻(xiàn)>或#include“頭文獻(xiàn)"。對(duì)于每條預(yù)解決包含命令,在預(yù)解決階段將把該命令置換為所指定“頭文獻(xiàn)”中的所有內(nèi)容,換句話說,是用該“頭文獻(xiàn)”保存的所有內(nèi)容代替該預(yù)解決包含命令行。對(duì)于上述給出的兩種包含命令格式,系統(tǒng)解決時(shí)的查找頭文獻(xiàn)的途徑有所不同。對(duì)于第一種格式(即尖括號(hào)格式),將從C語言系統(tǒng)層次目錄中查找頭文獻(xiàn),若查找不到則給犯錯(cuò)誤信息;對(duì)于第二種格式(即雙引號(hào)格式),假如頭文獻(xiàn)名沒有給出磁盤號(hào)和途徑名,則一方面從當(dāng)前工作目錄(即包含該命令的程序文獻(xiàn)所屬的目錄)中查找頭文獻(xiàn),若查找不到,再接著從C語言系統(tǒng)層次目錄中查找頭文獻(xiàn),若還是查找不到則給犯錯(cuò)誤信息。在第二種格式中,假如頭文獻(xiàn)名帶有磁盤號(hào)和途徑名,則只在該指定途徑中查找頭文獻(xiàn),若查找不到則給犯錯(cuò)誤信息。(關(guān)于第二種格式中頭文獻(xiàn)名帶有磁盤號(hào)和途徑名的情況,教材的敘述是錯(cuò)誤的)答:第一步需要上機(jī)建立相應(yīng)的工作區(qū)和項(xiàng)目并建立、輸入和編輯該程序中的相應(yīng)文獻(xiàn),通常一方面建立主文獻(xiàn);第二步對(duì)每個(gè)程序文獻(xiàn)進(jìn)行編譯生成各自的目的代碼文獻(xiàn),通常主文獻(xiàn)被一方面編譯并生成目的文獻(xiàn);第三步使主目的文獻(xiàn)與同一程序中的其他目的代碼文獻(xiàn)以及有關(guān)C語言系統(tǒng)庫函數(shù)文獻(xiàn)相連接,生成一個(gè)可執(zhí)行文獻(xiàn);第四步運(yùn)營最后生成的可執(zhí)行文獻(xiàn)。選擇題1.B 2.C 3.A 4.D 5.A 6.B 7.D?8.C上機(jī)實(shí)驗(yàn)題程序代碼:#include<stdio.h>voidmain(){?intx,y; x=5;y=6;?printf("x+y=%d,",x+y);?printf("x*y=%d\n",x*y);}運(yùn)營結(jié)果:x+y=11,x*y=30程序代碼:#include<stdio.h>intcube(int);voidmain(){ printf("cube(3)=%d\n",cube(3)); printf("cube(5)=%d\n",cube(5)); printf("cube(8)=%d\n",cube(8));}intcube(intx){returnx*x*x;}運(yùn)營結(jié)果:cube(3)=27cube(5)=125cube(8)=512程序代碼:A.主程序文獻(xiàn)代碼:#include<stdio.h>#include"abc.cpp"voidmain(){ doublea,b,c; doubleaverageValue; a=2;b=3;c=4;?averageValue=AVE(a,b,c); printf("averageValue:%lf\n",averageValue);?averageValue=AVE(a+1,b+2,c+5);?printf("averageValue:%Lf\n",averageValue);}B.abc.cpp文獻(xiàn)代碼:(新建時(shí)選擇“File|New|C++SourceFile”。注意去掉“Addtoproject…:”前面的勾,以后新建其他程序文獻(xiàn)或頭文獻(xiàn)時(shí)還要勾上)doubleAVE(doublex,doubley,doublez){?return(x+y+z)/3;}運(yùn)營結(jié)果:averageValue:3.000000averageValue:5.666667程序代碼:A.主程序文獻(xiàn)代碼:#include<stdio.h>#include"example.h"voidmain(){ inta,b,c; printf("請(qǐng)輸入任意三個(gè)整數(shù):"); scanf("%d%d%d",&a,&b,&c); printf("求和:%d\n",Sum(a,b,c));?printf("乘積:%d\n",Product(a,b,c));}B.example.h頭文獻(xiàn)代碼:(新建時(shí)選擇“File|New|C/C++HeaderFile”。注意勾上“Addtoproject…:”前面的勾)intSum(int,int,int);intProduct(int,int,int);C.另一個(gè)程序文獻(xiàn)的代碼:(新建時(shí)選擇“File|New|C++SourceFile”。注意勾上“Addtoproject…:”前面的勾)intSum(inta,intb,intc){?returna+b+c;}intProduct(inta,intb,intc){ returna*b*c;}運(yùn)營結(jié)果隨輸入不同而不同,請(qǐng)自行記錄

基本數(shù)據(jù)類型與表達(dá)式2.1選擇題1.D?2.A?3.B 4.B?5.D 6.C 7.C?8.A 9.C 10.D11.B 12.C 13.A2.2把下列數(shù)學(xué)算式或不等式表達(dá)成C表達(dá)式1.2.0*x*(1+x*x/3.0)2.(1+exp(x))/(1-exp(x))3.(-b+sqrt(b*b-4.0*a*c))/2/a4.1/(3.0*x*log(2.0*x+k))5.pow(sin(x+3.14159/4),3)/(3+pow(cos(x-3.14159/4),3))6.pow(1+exp(x+1),n)/77.0<=x&&x<=208.(a*x-b*y)!=c9.(4*x+7*y-2)==3*a*b10.(3.0*x+2)!=0&&fabs((2.0*x*x+1)/(3.0*x+2))<=5/*(3.0*x+2)先判斷避免去0*/11.a(chǎn)ge>=55||pay>=82012.!strcmp(place,"江蘇")&&!strcmp(sex,"女")/*strcmp函數(shù)詳見教材第127頁*/13.('a'<=ch&&ch<='z')||('A'<=ch&&ch<='Z')14.s[2]=='0'&&(s[1]=='x'||s[1]=='X')/*s[1]、s[2]為數(shù)組元素,詳見第4章*/2.3求出下列邏輯表達(dá)式的相反式1.!x2.x!=03.x<104.p==NULL||x==465.x<=0||x>=106.ch!='d'&&ch!='D'7.!p||p->data==x/*p->data是對(duì)結(jié)構(gòu)成員的間接訪問,詳見教材第193頁7.3*/8.i>=n&&a[i]%3?。?/*a[i]為數(shù)組元素,詳見第4章*/2.4根據(jù)下列題目規(guī)定編寫出相應(yīng)程序1.(題目中僅規(guī)定兩邊之和大于等于第三邊是不對(duì)的。兩邊之和等于第三邊只能連成直線(根據(jù)公式計(jì)算面積也為0),不能組成三角形。邊長(zhǎng)也不應(yīng)為負(fù)數(shù)。故應(yīng)規(guī)定兩邊之和大于第三邊,且任一邊長(zhǎng)大于0。但是目前沒有學(xué)習(xí)第3章的if語句,程序自身無法控制在碰到不能構(gòu)成三角形的情況時(shí)如何解決,需要用戶輸入時(shí)自行掌握。)#include<stdio.h>#include<math.h>voidmain(){?doublea,b,c,s;?printf("請(qǐng)輸入三角形三條邊長(zhǎng):"); scanf("%lf%lf%lf",&a,&b,&c); s=(a+b+c)/2; printf("該三角形面積為:%lf\n",sqrt(s*(s-a)*(s-b)*(s-c)));}2.(每年都是上一年的110%,即1.1倍,5年后則將是1.1的5次方。其實(shí)只有5次方,為什么一定要用pow(1.1,5)呢^_^?1.1*1.1*1.1*1.1*1.1效率多高!但是要注意人數(shù)是沒有零頭的,所以要ceil()一下。之所以用ceil()而不是floor()是為了保證完畢任務(wù),一個(gè)都不能少,呵呵。本題這樣算出來的是4832人。但是更嚴(yán)格的做法就是要每年都ceil()一下,否則中間某個(gè)年份招生人數(shù)就有零頭了,本題這樣算出來的是4836人。只是那樣的話就成了:ceil(ceil(ceil(ceil(ceil(3000*1.1)*1.1)*1.1)*1.1)*1.1)暈吧,哈哈。要想不暈,得學(xué)好第3章的循環(huán)語句。)#include<stdio.h>#include<math.h>voidmain(){ printf("5年后計(jì)劃招生%lf人。\n",ceil(3000*pow(1.1,5)));}3.(算術(shù)平均值:求和之后除以n,幾何平均值:乘積的n次方根(即1.0/n次方)。為了防止數(shù)值過大溢出(超過整數(shù)類型的范圍),所以對(duì)第一個(gè)數(shù)就使用了強(qiáng)制類型轉(zhuǎn)換為double。此外本題計(jì)算乘積的4次方根,規(guī)定輸入的四個(gè)整數(shù)假如全都不為0,則應(yīng)有0、2或4個(gè)為正,否則乘積為負(fù),無實(shí)數(shù)4次方根。)#include<stdio.h>#include<math.h>voidmain(){?inta,b,c,d;?printf("請(qǐng)輸入4個(gè)整數(shù):"); scanf("%d%d%d%d",&a,&b,&c,&d);?printf("算術(shù)平均值:%lf,幾何平均值:%lf。\n",??((double)a+b+c+d)/4, ?pow((double)a*b*c*d,1.0/4));}4.(唯一規(guī)定:a和b不能是相反數(shù),即a不等于-b。拜托,拜托!)#include<stdio.h>#include<mat(yī)h.h>voidmain(){?doublea,b; printf("請(qǐng)輸入a和b的值:"); scanf("%lf%lf",&a,&b); printf("x=%lf,y=%lf\n",? 2*a*sin(a)/3/(a+b),? 2*b*cos(b)/3/(a+b));}上機(jī)實(shí)驗(yàn)題1.#include<stdio.h>#include<stdlib.h>#include<time.h>constintN=10;voidmain(){?inti,x,y,z,c=0; srand(time(0)); for(i=1;i<=N;i++){??x=rand()%90+10;//[0+10,89+10]? y=rand()%90+10;//[0+10,89+10]? printf("%d+%d=",x,y);? scanf("%d",&z); if(x+y==z)c++;//本題回答對(duì)的?} printf("最后得分:%d\n",c*10);}2.(與教材不同,使用了'\t'。這是制表符,相稱于按Tab鍵排版。由于使用了'\t',所以%10.2lf也省略為%.2lf,即不限定寬度,只限定小數(shù)位數(shù)為2位。注意教材上第一個(gè)printf語句中,"cos"誤為"con"了。請(qǐng)嘗試將while改為for、do~while。)#include<stdio.h>#include<math.h>constdoubleRAD=3.14159/180;voidmain(){?inti=0;?printf("\ti\tsin\tcos\n"); while(i<=90){ printf("\t%d\t%.2lf\t%.2lf\n",i,sin(i*RAD),cos(i*RAD));? i+=5;?}}3.(正整數(shù)范圍大約21億多,故輸入的數(shù)以9位或以下(小于10億)為宜,牢記牢記!)#include<stdio.h>voidmain(){?intnum,rem; printf("輸入一個(gè)整數(shù):"); scanf("%d",&num);?do{? rem=num%10;//得到個(gè)位的值? /*去掉個(gè)位,這樣下次的個(gè)位就是現(xiàn)在的十位。??每次如此,即可逐次得到從個(gè)位到最高位的各位*/ ?num/=10; //輸出現(xiàn)在的個(gè)位。由于從個(gè)位開始逐位輸出,所以順序反過來了 printf("%d",rem);??/*循環(huán)必須用do~while,這樣當(dāng)num為0時(shí)也會(huì)循環(huán)一次,輸出一個(gè)0。 開始不為0時(shí),當(dāng)去掉最高位后num自然也就是0了,結(jié)束循環(huán)*/?}while(num>0);??printf("\n");}4.(呵呵,for語句與教材的不同。其中表達(dá)式1可以省略,這不奇怪;每次循環(huán)ch++和d1++都執(zhí)行一次,所以表達(dá)式2只需要判斷ch<='F',這也不奇怪。兩條printf合成一句,大多數(shù)同學(xué)也會(huì)。但是ch++和d1++怎么和printf合并成表達(dá)式3?因素在于由于是后綴++,所以給printf()的值事實(shí)上都是d1和ch,值給了printf()之后才增長(zhǎng)1,所以++事實(shí)上仍然是在printf()輸出之后做的。)#include<stdio.h>voidmain(){ charch='A',d1='a';?for(;? ch<='F'; ?printf("%c:%d,%c:%d\n",ch++,ch,d1++,d1));}5.(比教材多了一點(diǎn)換行,程序排版好看點(diǎn)。注意有整數(shù)除法,所以y不能為0,并且輸入除法答案的時(shí)候要舍去小數(shù)部分啊!)#include<stdio.h>voidmain(){ intx,y,z,c=0; printf("輸入兩個(gè)整數(shù):"); scanf("%d%d",&x,&y); printf("%d+%d=",x,y);scanf("%d",&z);if(x+y==z)c++; printf("%d-%d=",x,y);scanf("%d",&z);if(x-y==z)c++; printf("%d*%d=",x,y);scanf("%d",&z);if(x*y==z)c++; printf("%d/%d=",x,y);scanf("%d",&z);if(x/y==z)c++; printf("%d%%%d=",x,y);scanf("%d",&z);if(x%y==z)c++; printf("\n共5道題,答對(duì)%d道題\n",c);}?流程控制語句3.1選擇題1.A 2.B?3.C?4.D 5*.C?6.B?7.C?8.B 9.A?10.D(問題一:第5小題。一般而言,循環(huán)體每次執(zhí)行完之后都會(huì)執(zhí)行<表達(dá)式3>,然后再計(jì)算<表達(dá)式2>,判斷是否中止循環(huán),即使在循環(huán)體中碰到continue也不會(huì)跳過<表達(dá)式3>的執(zhí)行。但是,假如在循環(huán)體中執(zhí)行break則會(huì)立即終止循環(huán),也就是說<表達(dá)式3>會(huì)被跳過,在這種情況下,循環(huán)體就被多執(zhí)行了一次。)3.2寫出下列程序運(yùn)營結(jié)果并上機(jī)驗(yàn)證1.(第一個(gè)if改用條件表達(dá)式,注意最后一個(gè)printf之前的一行,每執(zhí)行一個(gè)賦值語句,相關(guān)變量的值就被改變了,變量的新值參與下一個(gè)賦值語句中的運(yùn)算,所以執(zhí)行了a+=b;b+=a;之后,b和a的值不等。)#include<stdio.h>voidmain(){?inta=2,b=5,c;?c=(a+b>10)?(a*b):(3*a+2*b);?if(c>=20)printf("%d",c*c); elseif(a>b)printf("%d",3*(a+b)); elseprintf("%d",4*c-5); printf("\n"); a+=b;b+=a;c+=a+b; printf("a=%d,b=%d,c=%d\n",a,b,c);}2.(注意三處:x+=2、switch(x-1)、除了case10之后有break,別的沒有break。)#include<stdio.h>voidmain(){ intx; for(x=5;x<12;x+=2){//x:57911??switch(x-1){ ?case4:printf("%d\n",x);//x:5? case7:printf("%d\n",2*x+1);//x:5? case10:printf("%d\n",3*x-1);break;//x:511 default:printf("default\n");//x:79? }?}}3.(規(guī)定輸入的數(shù)在第96頁)#include<stdio.h>voidmain(){?ints0,s1,s2,x; s0=s1=s2=0; printf("從鍵盤輸入一組整數(shù)(以-1結(jié)束):\n");?scanf("%d",&x);?while(x!=-1){//-1結(jié)束 ?switch(x%3){??case0:s0+=x;break;//能被3整除的數(shù)之和??case1:s1+=x;break;//除以3余1的數(shù)之和 ?case2:s2+=x;break;//除以3余2的數(shù)之和? } scanf("%d",&x);?}?printf("s0=%d,s1=%d,s2=%d\n",s0,s1,s2);}4.(學(xué)會(huì)數(shù)數(shù),呵呵。)#include<stdio.h>voidmain(){ intc1=0,c2=0,c3=0; inti,j,k;?for(i=0;i<5;i++){ for(j=i;j<5;j++)c1++;//循環(huán)5+4+3+2+1=15次? for(k=5;k>=i;k--)c2++;//循環(huán)6+5+4+3+2=20次 c3++;//5次?} printf("%d%d%d\n",c1,c2,c3);}5.#include<stdio.h>constintB=2;voidmain(){?inti=0,p=1,s=1;?while(s<100){//s>=100循環(huán)才結(jié)束??i++;p*=B;s+=p;??//循環(huán)次數(shù)??i p?s??//1 ??1?2?3 ?//2????2?4?7??//3? ??3 8?15 ?//4 ? 4 16?31??//5 ? ?5 32 63 ?//6?? ?6 64 127?} printf("i=%d\n",i); printf("s=%d\n",s);}6.(對(duì)正整數(shù)10~16分解質(zhì)因數(shù)。)#include<stdio.h>voidmain(){ inti; for(i=10;i<=16;i++){? intj=2,k=i;//j從最小的質(zhì)數(shù)2開始??printf("%d:",i);? do{? /*在下面的循環(huán)中,假如k能被j整除,則j必為k的質(zhì)因數(shù)。由于j是從最小的質(zhì)數(shù)2開始逐個(gè)增長(zhǎng)的,只要可以整除k的j都會(huì)完全被while循環(huán)分解(k/=j),所以當(dāng)j增長(zhǎng)到合數(shù)j'時(shí),j'的各個(gè)質(zhì)因數(shù)(均小于j')都已經(jīng)被分解完畢,故而此時(shí)的k已經(jīng)不能被j'整除了。j必為k的質(zhì)因數(shù)。合數(shù)就是可以被1和自身之外的數(shù)整除的數(shù),即:j'=p1*p2*p3*…*pn,其中pi為質(zhì)數(shù),且pi<j',i=1,2,3,…,n,n>1。*/???while(k%j==0){printf("%d",j);k/=j;}?? j++;? }while(k>=j);??printf("\n"); }}7.(不要光靠數(shù)數(shù)啊,呵呵。)#include<stdio.h>constintT=6;voidmain(){ inti,j,k=0; for(i=1;i<=T;i+=2)//i:135??for(j=2;j<=T;j++)//j:23456 if(i+j==T)printf("+");//(i,j):(1,5)(3,3)?? elseif(i*j==T)printf("*");//(i,j):(1,6)(3,2) ? elsek++;//共循環(huán)3*5=15次,上面兩種情況4次,這里11次 printf("\nk=%d\n",k);}8.(對(duì)照第6小題。這里的while循環(huán)和第6小題的while很像吧?不錯(cuò),這里的i和第6小題的j類似,是用來尋找質(zhì)因數(shù)的。只是由于while的條件表達(dá)式不同,尋找的是x和y兩者的公共質(zhì)因數(shù)i。p將所有的公共質(zhì)因數(shù)i乘起來,得到的是兩者的最大公約數(shù)。最小公倍數(shù)本應(yīng)當(dāng)是兩數(shù)乘積除以最大公約數(shù),但是由于在while循環(huán)中x和y已經(jīng)各自除以所有的公共質(zhì)因數(shù),也就是說x和y各自都已經(jīng)除以一次最大公約數(shù)了,總共除了兩次,所以最后反而要乘回來一次。因此printf中的附加參數(shù)是p*x*y。)#include<stdio.h>voidmain(){?intx,y;?inti=2,p=1; printf("請(qǐng)輸入兩個(gè)正整數(shù)x和y:"); scanf("%d%d",&x,&y);?do{??while(x%i==0&&y%i==0){???p*=i;? x/=i; ??y/=i; }? i++;?}while(x>=i&&y>=i); printf("x和y的最小公倍數(shù)為%d\n",p*x*y);}3.3指出下列程序功能并上機(jī)驗(yàn)證1.(程序功能:計(jì)算數(shù)學(xué)公式,其中n從鍵盤輸入,規(guī)定n>=2。本程序用到了函數(shù)定義的知識(shí)。)#include<stdio.h>doublef1(intn){//函數(shù)f1:規(guī)定一個(gè)整型參數(shù),計(jì)算結(jié)果(返回值)為實(shí)數(shù) inti;?doublesign=1,s=1; for(i=2;i<=n;i++){//從2開始累加至n ?s+=sign/(i*i);//sign含義見下。s每次加上(-1)i/i2 ?sign*=-1;//sign每次都乘以-1,初值為1=(-1)2,故sign=(-1)i?}?returns;//返回計(jì)算結(jié)果s}voidmain(){?inta; printf("輸入一個(gè)大于等于2的整數(shù):");?doscanf("%d",&a);while(a<=1);//輸入的數(shù)a不大于等于2則要重新輸入 printf("%lf\n",f1(a));//調(diào)用f1(a)計(jì)算,并將計(jì)算結(jié)果輸出}2.(與第2章上機(jī)實(shí)驗(yàn)題第3小題功能相同,請(qǐng)參照閱讀。注意48是'0'的ASCII碼,由于'0'~'9'在ASCII碼表中連續(xù)排列,所以數(shù)字0~9加上48就成為相應(yīng)的數(shù)字字符。)#include<stdio.h>voidmain(){?intx;?printf("輸入一個(gè)整數(shù):");?scanf("%d",&x); while(x){ ?intk=x%10;? printf("%c",k+48); x=x/10;?}?printf("\n");}3.(答案很簡(jiǎn)樸!看到最后兩行printf就行了,呵呵??荚嚳歼@題多好??!函數(shù)f2求兩數(shù)的最小公倍數(shù),與本章練習(xí)題3.2的第8小題的算法同樣。函數(shù)f1求兩數(shù)的最大公約數(shù),雖然f2中求最小公倍數(shù)的同時(shí)也得到了最大公約數(shù)p,但f1的效率高得多。f1采用的算法稱為輾轉(zhuǎn)相除法,又稱歐幾里得算法,具體描述見教材第82頁對(duì)程序3-12的說明。輾轉(zhuǎn)相除法的證明:設(shè)a整除以b的余數(shù)為r,即a=q*b+r,其中q為整數(shù)。將a和b的最大公約數(shù)寫作gcd(a,b),b和r的最大公約數(shù)則為gcd(b,r)。由于r=a-q*b,而a、b均能被gcd(a,b)整除,所以r顯然也能被gcd(a,b)整除。既然b和r都能被gcd(a,b)整除,則gcd(a,b)是b和r的公約數(shù),所以gcd(a,b)不也許大于b和r的最大公約數(shù)gcd(b,r)。反過來,由于b和r均能被gcd(b,r)整除,而a=q*b+r,所以a也能被gcd(b,r)整除。既然a和b都能被gcd(b,r)整除,則gcd(b,r)是a和b的公約數(shù),從而不也許大于a和b的最大公約數(shù)gcd(a,b)。繞了半天,我們得到gcd(a,b)<=gcd(b,r)并且gcd(b,r)<=gcd(a,b),那么就只能有:gcd(a,b)=gcd(b,r)。即,a和b的最大公約數(shù)必然也是它們的余數(shù)和它們的最大公約數(shù)。這樣,可以進(jìn)行輾轉(zhuǎn)相除,迅速將參與運(yùn)算的兩個(gè)數(shù)變小,不久得到結(jié)果。)#include<stdio.h>intf1(inta,intb){ intr;?while(b!=0){? r=a%b; a=b;b=r;?} //此時(shí)有b=0。由于循環(huán)結(jié)束前進(jìn)行了a=b;b=r;的賦值,所以實(shí)際是最后一次求得的?//余數(shù)r=0,也就是最后一次循環(huán)時(shí)(執(zhí)行a=b;b=r;前)有a=n*b,其中n為整數(shù)。?//這時(shí)的a和b的最大公約數(shù)自然是b,也就是執(zhí)行了a=b;后的a是最大公約數(shù)。 returna;}intf2(inta,intb){ inti=2,p=1; do{ ?while(a%i==0&&b%i==0){? p*=i;a/=i;b/=i;??}??i++;?}while(a>=i&&b>=i);?returnp*a*b;}voidmain(){?inta,b; printf("輸入兩個(gè)正整數(shù):"); doscanf("%d%d",&a,&b);while(a<=0||b<=0);?printf("%d和%d的最大公約數(shù):%d\n",a,b,f1(a,b)); printf("%d和%d的最小公倍數(shù):%d\n",a,b,f2(a,b));}4.(教材錯(cuò)誤:ff函數(shù)中的scanf語句應(yīng)在switch語句之前。程序功能:出10道20以內(nèi)整數(shù)加減乘除運(yùn)算題,記錄用戶得分。每做對(duì)一題得10分。)#include<stdio.h>#include<stdlib.h>#include<time.h>constintN=10;intff(intx,inty,charop);voidmain(){?inti,a,b,c=0,d;?charop;?srand(time(0)); for(i=0;i<N;i++){? a=rand()%20+1; b=rand()%20+1;??d=rand()%4;? if(d==0)op='+'; elseif(d==1)op='-'; elseif(d==2)op='*'; ?elseop='/';??if(ff(a,b,op))c++; }?printf("得分:%d\n",c*10);}intff(intx,inty,charop){?intz; printf("%d%c%d=",x,op,y); scanf("%d",&z);//判斷對(duì)op指定的運(yùn)算,用戶給出的答案是否對(duì)的。返回判斷結(jié)果(邏輯值)?switch(op){?case'+':returnx+y==z;//都return了,就不用break了?case'-':returnx-y==z; case'*':returnx*y==z; case'/':returnx/y==z;?//盡管本程序可以不要default,但ff也許用于別處,op也許會(huì)被指定錯(cuò)誤的值?//檢查非法參數(shù)取值,這是好習(xí)慣。但是簡(jiǎn)樸地exit在大程序中是不好的解決?default:{printf("運(yùn)算符錯(cuò)!\n");exit(1);} }}3.4根據(jù)下列題目規(guī)定編寫程序并上機(jī)得到運(yùn)營結(jié)果1.(不要用pow函數(shù)啊,同志!整數(shù)的整數(shù)次方,還是這個(gè)好。假如只求一兩個(gè)高次冪,則有更高效的辦法而不要象下面那樣逐次乘上去。此外高次冪要小心溢出整數(shù)范圍。后記:糗事一件,居然開始的時(shí)候習(xí)慣性地把p*=3寫成p*=i了,最終結(jié)果就成了1。哈哈,我還納悶,這個(gè)程序怎么會(huì)錯(cuò)呢?)#include<stdio.h>voidmain(){ inti,p=1,sum=0;?for(i=0;i<=10;i++){? sum+=p;??p*=3;?}?printf("%d\n",sum);}2.(見注釋。)#include<stdio.h>voidmain(){?inti,sum;?for(i=0,sum=0;sum<1000;){? i+=2; sum+=i*i; }?//循環(huán)結(jié)束時(shí),sum已經(jīng)大于等于1000,即多加了一項(xiàng)//所以最大的n應(yīng)是前一項(xiàng),即i-2?printf("%d\n",i-2);}3.(注意printf里x<=0為假時(shí)的求值表達(dá)式。對(duì)于多項(xiàng)式計(jì)算,反復(fù)用高項(xiàng)系數(shù)乘以自變量加低項(xiàng)系數(shù),可以極大地減少乘法次數(shù)。即,對(duì)于多項(xiàng)式,可以寫成:((...((an*x+an-1)*x+an-2)*x...+a2)*x+a1)*x+a0假如按本來的多項(xiàng)式計(jì)算,不作任何優(yōu)化,則需要n+(n-1)+...+2+1=(n+1)n/2次乘法;而改造后只需要n次乘法。當(dāng)n較大時(shí)兩者的差異是明顯的。)#include<stdio.h>#include<math.h>constdoublea=1.0;voidmain(){?doublex; printf("請(qǐng)輸入一個(gè)實(shí)數(shù)x:"); scanf("%lf",&x); printf("y=%lf\n",??(x<=0)????sqrt(a*a+x*x) :((3*a*a*x+4)*a*x-1) );}4.(一般教材當(dāng)然認(rèn)為這種題目應(yīng)當(dāng)用雙重循環(huán),對(duì)a、b的所有也許取值情況所有判斷一下不定方程是否成立。對(duì)于復(fù)雜一點(diǎn)的方程也許不得不如此,但是這兒用那種辦法顯然笨死了!對(duì)每個(gè)a的取值,計(jì)算相應(yīng)的b,然后看b是否符合條件這不就夠了嗎?記住由于求b用了整數(shù)除法,所以得到的b只是真正的解的整數(shù)部分。所以在判斷b是否在15~36之間的同時(shí)還要檢查b是不是真的是原方程的解。由于本方程很簡(jiǎn)樸,所以直接重新計(jì)算一下就行了。此外,假如用b作為循環(huán)變量,只需要從15循環(huán)到36,循環(huán)22次,比用a更快。)#include<stdio.h>#include<math.h>voidmain(){?inta; for(a=6;a<=30;a++){??intb=(126-2*a)/5;//復(fù)合語句開頭也可以定義變量??if(15<=b&&b<=36&&(2*a+5*b)==126)? printf("(%d,%d)",a,b); }?printf("\n");}?數(shù)組和字符串4.1選擇題1.B?2.C?3.B?4.D 5.A 6.C?7.A?8.D 9.B?10.D4.2寫出下列程序運(yùn)營結(jié)果并上機(jī)驗(yàn)證1.(i1:a中奇數(shù)個(gè)數(shù);i2:a中偶數(shù)個(gè)數(shù)。此題即形考冊(cè)作業(yè)2第三大題第1小題。)#include<stdio.h>voidmain(){?inta[10]={12,39,26,41,55,63,72,40,83,95}; inti,i1=0,i2=0; for(i=0;i<10;i++) ?(a[i]%2)?i1++:i2++;?printf("%d%d\n",i1,i2);}2.(將a中元素逆序后輸出。)#include<stdio.h>#defineN8voidmain(){ inta[N]={36,25,48,14,55,40,32,66};?inti,x;?for(i=0;i<N/2;i++){//逆序? x=a[i];a[i]=a[N-1-i];a[N-1-i]=x; } for(i=0;i<N;i++)printf("%d",a[i]);//輸出 printf("\n");}3.(記錄數(shù)組a中所有元素有多少個(gè)小于b中各元素(且不小于b中該元素之前的各元素),并輸出。此程序粗看非常無聊,實(shí)則在生活中可以找出很多實(shí)例:例如買鞋子——a是一堆人,他們的腳有大有小;b是鞋子尺碼,只有幾種,并且從小到大排列。鞋子當(dāng)然不能買小了,應(yīng)當(dāng)稍大一點(diǎn),但是又不能太大。那么,對(duì)于a中所有的人,b中各種尺碼的鞋子應(yīng)當(dāng)買多少雙呢?用這個(gè)程序就可以記錄出來,結(jié)果是分別應(yīng)當(dāng)購買c[i]雙尺碼為b[i]的鞋子。)#include<stdio.h>#defineN10#defineM4voidmain(){ inta[N]={76,83,54,62,40,75,90,92,77,84}; intb[M]={60,76,90,101}; intc[M]={0};?inti,j; for(i=0;i<N;i++){ ?j=0; ?while(a[i]>=b[j])j++; c[j]++;?} for(i=0;i<M;i++)printf("%d",c[i]);?printf("\n");}4.(在二維數(shù)組a中找最大元素,輸出其值和下標(biāo)。此題功能與形考冊(cè)作業(yè)2第三大題第5小題的相同,只是a中數(shù)據(jù)不同。)#include<stdio.h>voidmain(){ inta[3][4]={{1,2,7,8},{5,6,11,12},{9,10,3,4}};?intx=a[0][0];?intii=0,jj=0;?inti,j; for(i=0;i<3;i++) ?for(j=0;j<4;j++)?? if(a[i][j]>x){x=a[i][j];ii=i;jj=j;}?printf("a[%d,%d]=%d\n",ii,jj,a[ii][jj]);}5.(通過比較找出最大字符串,將其存到s1中;同時(shí)找出最小字符串,將其存到s2中。第二個(gè)if前加else可提高一點(diǎn)效率,由于假如a[i]已經(jīng)比s1大了,自然就不也許比s2小,只需要在a[i]不大于s1時(shí)才有必要和s2比較。此題功能與形考冊(cè)作業(yè)2第三大題第2小題的相同,但本題采用數(shù)組,需要反復(fù)調(diào)用strcpy復(fù)制字符串,效率較低。)#include<stdio.h>#include<string.h>voidmain(){ chara[5][10]={"student","worker","soldier","peasant","cadre"};?chars1[10],s2[10];?inti;?strcpy(s1,a[0]);strcpy(s2,a[0]);?for(i=1;i<5;i++){??if(strcmp(a[i],s1)>0)strcpy(s1,a[i]); elseif(strcmp(a[i],s2)<0)strcpy(s2,a[i]);?} printf("%s%s\n",s1,s2);}4.3指出下列函數(shù)功能并上機(jī)調(diào)試和驗(yàn)證(本題需要一點(diǎn)函數(shù)的知識(shí)。數(shù)組作為函數(shù)參數(shù)聲明時(shí)不需要指定第一維大?。?.(將一維整型數(shù)組a的前n個(gè)元素中大于等于60的數(shù)換到小于60的數(shù)后面保存。)voidf1(inta[],intn){?inti=0,j=n-1,x; do{ while(a[i]<60)i++;//找到第一個(gè)大于等于60的數(shù) while(a[j]>=60)j--;//找到最后一個(gè)小于60的數(shù)? //假如大于等于60的數(shù)在前面則換到后面去 ?if(i<j){x=a[i];a[i]=a[j];a[j]=x;i++;j--;} }while(i<j);//循環(huán),直到大于等于60的數(shù)所有在小于60的數(shù)之后}2.(輸出雙精度數(shù)數(shù)組a的前n個(gè)元素中不小于平均值的元素,然后回車。此題與形考冊(cè)作業(yè)3第四大題第6小題類似,但本函數(shù)并未記錄和返回符合條件的元素個(gè)數(shù),而是輸出它們。)voidf2(doublea[],intn){ inti;doublesum=0;?for(i=0;i<n;i++)sum+=a[i];?sum/=n;?for(i=0;i<n;i++) ?if(a[i]>=sum)printf("%2.0lf",a[i]); printf("\n");}3.(記錄并輸出一維字符數(shù)組a中逗號(hào)、分號(hào)、左右圓括號(hào)、左右方括號(hào)、左右花括號(hào)的個(gè)數(shù)并輸出。函數(shù)最后一句多了個(gè)%)voidf3(chara[]){ inti,c[5]={0}; for(i=0;a[i];i++)??switch(a[i]){ case',':c[0]++;break; case';':c[1]++;break; ?case'(': case')':c[2]++;break;??case'[': ?case']':c[3]++;break; case'{':? case'}':c[4]++;break; } for(i=0;i<5;i++)printf("%d",c[i]);?printf("\n");}4.(用選擇排序法按照字符串長(zhǎng)度進(jìn)行升序排序。本函數(shù)中反復(fù)調(diào)用strlen求字符串長(zhǎng)度,要花費(fèi)較多時(shí)間,可考慮用一個(gè)整型數(shù)組保存字符串長(zhǎng)度以減少對(duì)strlen的調(diào)用。)voidf4(chara[][N],unsignedintm){?unsignedinti,j,k,w;?for(i=1;i<m;i++){ ?charx[N];??w=i-1;k=strlen(a[i-1]); ?for(j=i;j<m;j++)? if(strlen(a[j])<k){k=strlen(a[j]);w=j;}??strcpy(x,a[i-1]);strcpy(a[i-1],a[w]);strcpy(a[w],x);?}}4.4根據(jù)下列題目規(guī)定編寫程序并上機(jī)調(diào)試和運(yùn)營1.(又是斐波納契數(shù)列!由于要逆序顯示,所以要在算出最后一項(xiàng)后再開始顯示,可以用數(shù)組先保存計(jì)算結(jié)果。當(dāng)然,也可以使用第6章學(xué)到的遞歸函數(shù)。)#include<stdio.h>voidmain(){ intfibonacci[20]={0,1},i; for(i=2;i<sizeof(fibonacci)/sizeof(fibonacci[0]);i++)? fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];?for(i=sizeof(fibonacci)/sizeof(fibonacci[0]);i--;) printf("%d",fibonacci[i]);?printf("\n");}2.(長(zhǎng)度不超過50個(gè)字符,大小就最多為51。)#include<stdio.h>voidmain(){?charline[51];?inti,count[10]={0}; printf("請(qǐng)輸入一行字符串(不超過50個(gè)字符):\n"); gets(line);//允許空格 for(i=0;line[i];i++){ intdigit=line[i]-'0';??if(digit>=0&&digit<=9)//是十進(jìn)制數(shù)字字符???count[digit]++;?} for(i=0;i<10;i++)??printf("%d",count[i]); printf("\n");}3.(無語??慈尾欢?再次無語??词尾欢??還是先看看第3章吧。)#include<stdio.h>voidmain(){?inta[][4]={ {3,0,4,5},? ?{6,2,1,7}, ????{4,1,5,8}};?intb[][4]={ {1,4,0,3},?? ? {2,5,1,6},?? ??{0,7,4,4},? ? {9,3,6,0}}; //乘積矩陣行數(shù)等于第一個(gè)矩陣的行數(shù),列數(shù)等于第二個(gè)矩陣的列數(shù) intc[sizeof(a)/sizeof(a[0])][sizeof(b[0])/sizeof(b[0][0])]; inti,j,k; for(i=0;i<sizeof(a)/sizeof(a[0]);i++)? for(j=0;j<sizeof(b[0])/sizeof(b[0][0]);j++)? for(c[i][j]=0,k=0;k<sizeof(b)/sizeof(b[0]);k++) ???c[i][j]+=a[i][k]*b[k][j];?for(i=0;i<sizeof(a)/sizeof(a[0]);i++,printf("\n"))? for(j=0;j<sizeof(b[0])/sizeof(b[0][0]);j++) ?printf("%10d",c[i][j]);}4.(此題題意不明:什么叫做“每個(gè)同學(xué)的總成績(jī)和平均值”?“每個(gè)同學(xué)的總成績(jī)”應(yīng)當(dāng)是指對(duì)于每個(gè)學(xué)生將其各門課程成績(jī)累加起來的數(shù)值??墒恰捌骄怠蹦??是指每一個(gè)同學(xué)的總成績(jī)按課程門數(shù)M平均,還是所有同學(xué)的總成績(jī)加起來按學(xué)生人數(shù)N平均?此外此程序中scanf的第一個(gè)參數(shù)里%d前面必須有空格,后面不能有空格,否則仿佛會(huì)有問題。想念C++里的cin>>,多么方便?。?include<stdio.h>#defineN3#defineM2voidmain(){ inta[N][M]; inti,j,sum;?for(i=0;i<N;i++){? printf("請(qǐng)輸入第%d位同學(xué)所有%d門功課的成績(jī):",i+1,M); ?for(j=0;j<M;j++)?? scanf("%d",a[i]+j); } printf("\n");?for(sum=0,i=0;i<N;i++){? intsumi=0;//該生總成績(jī)? for(j=0;j<M;j++)? ?sumi+=a[i][j];??printf("第%d位同學(xué)%d門課程總成績(jī)%d分,平均%5.2lf分\n",i+1,M,sumi,(double)sumi/M); ?sum+=sumi;//各生成績(jī)匯總?}?printf("\n所有同學(xué)平均總成績(jī)%5.2lf分\n",(float)sum/N);}

指針5.1選擇題1.B?2.A?3.C 4.C 5.D 6.A 7.B 8.C 9.B?10.D11.A?12.C?13.B?14.D 15.B(15用到了C++中的new進(jìn)行動(dòng)態(tài)分派,newint表達(dá)動(dòng)態(tài)分派一個(gè)int變量)5.2寫出下列程序運(yùn)營結(jié)果并上機(jī)驗(yàn)證1.(記錄并輸出數(shù)組a中2、3、5的倍數(shù)各有多少。注意三個(gè)if語句之間不能用else連起來,必須各自分開獨(dú)立成句。由于一個(gè)數(shù)也許同時(shí)是2、3、5中一個(gè)或多個(gè)數(shù)的倍數(shù),需要分別判斷。)#include<stdio.h>voidmain(){ inta[8]={25,18,36,42,17,54,30,63}; int*p=a;?intc2,c3,c5;? c2=c3=c5=0;?while(p<a+8){ ?if(*p%2==0)c2++; if(*p%3==0)c3++;??if(*p%5==0)c5++; ?p++;?} printf("%d%d%d\n",c2,c3,c5);}2.(輸出數(shù)組中第6~3項(xiàng)的值、它們的和以及平均值。)#include<stdio.h>voidmain(){?inta[8]={46,38,72,55,24,63,50,37};?ints=0;?int*p=a+2; while(p<a+6)s+=*p++; while(--p>=a+2)printf("%5d",*p); printf("\n");?printf("%5d%5.1lf\n",s,s/4.0);}3.(按照字典順序查找最大字符串并輸出。其間每當(dāng)找到一個(gè)更大的字符串a[i]時(shí),都會(huì)輸出a[0]~a[i-1]中最大的字符串。)#include<stdio.h>#include<string.h>voidmain(){?char*a[5]={"computer","telephone","typewriter","television","fridge"}; char*p=a[0];?inti; for(i=1;i<5;i++)??if(strcmp(a[i],p)==1){printf("%s",p);p=a[i];} printf("\n%s\n",p);}4.(無語。)#include<stdio.h>voidmain(){?intx=20,y=40,*p;?p=&x;?printf("%d",*p); *p=x+10;?p=&y; printf("%d\n",*p);?*p=y+20; printf("%d%d\n",x,y);}5.(計(jì)算i2+1,i=0,1,2,...,8。并逆序輸出其中不小于25的值。)#include<stdio.h>#include<stdlib.h>#defineNN8voidmain(){?inti,*p; int*x=malloc(sizeof(int)); int*a=calloc(NN,sizeof(int)); *x=25; for(i=0;i<NN;i++)a[i]=i*i+1;//1251017263750 p=a+NN-1;?do{? if(*p>=*x)printf("%d",*p--); ?elsebreak; }while(1);?printf("\n"); free(x);?free(a);}5.3指出下列函數(shù)功能并上機(jī)調(diào)試和驗(yàn)證1.(隨機(jī)生成和輸出m個(gè)0~99的整數(shù),計(jì)算其總和和平均值并輸出。其中m由用戶輸入。)#include<stdio.h>#include<stdlib.h>#include<time.h>voidmain(){?inti,m,*a,s=0; srand(time(0)); printf("從鍵盤上輸入一個(gè)整型數(shù)組的長(zhǎng)度:");?scanf("%d",&m); a=calloc(m,sizeof(int)); for(i=0;i<m;i++){ ?a[i]=rand()%100;? s+=a[i];? printf("%d",a[i]);?}?printf("\n總和:%d;平均值:%5.2lf\n",s,s*1.0/m);}2.(又是不可思議的事情!我在已有的工程項(xiàng)目中,把本來的程序文獻(xiàn)內(nèi)容所有刪除,然后輸入下面的代碼,居然報(bào)錯(cuò),說宏N為重定義(macroredefinition,也就是說VC編譯時(shí)認(rèn)為在下面的#define之前已經(jīng)在某處定義了宏N),刪掉那一行居然就沒警告了,通過實(shí)驗(yàn),發(fā)現(xiàn)此時(shí)N的值為10。盡管不知道確切的因素,但是我試著選擇了Build菜單下的Clean菜單項(xiàng),將所有編譯、鏈接生成的文獻(xiàn)所有清除,然后重新編譯鏈接,果然就沒問題了,特記于此,如有類似情況不妨試一下Clean。此外,可看看下面程序中關(guān)于calloc的注釋。)#include<stdio.h>#include<stdlib.h>#include<string.h>#defineN30voidmain(){ inti,m;?charx[N];?char(*a)[N]; printf("從鍵盤上輸入待解決字符串的個(gè)數(shù):");?scanf("%d",&m); //盡管結(jié)果同樣,但是從calloc參數(shù)的含義來講,應(yīng)當(dāng)寫成calloc(m,sizeof(a[0])) a=calloc(m*N,sizeof(char)); printf("從鍵盤上輸入%d個(gè)字符串:\n",m); for(i=0;i<m;i++)scanf("%s",a[i]);//不支持包含空格 printf("從鍵盤上輸入待查找的一個(gè)子串:");?scanf("%s",x); for(i=0;i<m;i++) ?if(strstr(a[i],x)!=NULL)printf("%s\n",a[i]);}函數(shù)6.1選擇題1.B?2.A 3.D 4.C?5.A 6.B?7.D一、顯然第2小題選項(xiàng)和題干對(duì)不上。題干中的intw[][N]應(yīng)改為charw[][N]二、第6小題中提到了“末尾遞歸”,這是遞歸的特例:只在函數(shù)返回前的最后一步進(jìn)行遞歸調(diào)用。末尾遞歸又稱“尾遞歸”。假如遞歸函數(shù)中只存在尾遞歸,則一般來說可以比較容易地改成循環(huán)程序,在兩次循環(huán)之間修改各變量(遞歸函數(shù)形參)的值即可。由于遞歸函數(shù)效率較低,所以只要能改成循環(huán)等非遞歸方式實(shí)現(xiàn)而不會(huì)使程序變得更難懂的,都應(yīng)當(dāng)避免使用遞歸方式實(shí)現(xiàn)。6.2寫出下列程序運(yùn)營結(jié)果并上機(jī)驗(yàn)證1.(同名覆蓋。注意同名變量b。)#include<stdio.h>intc=15;voidmain(){?inta=10,b=20; printf("%d%d%d\n",a,b,c); {? intb=a+15;??a=b/3;c=2*(a+b);??printf("%d%d%d\n",a,b,c);?} printf("%d%d%d\n",a,b,c);}2.(實(shí)參與形參的關(guān)系:實(shí)虛結(jié)合、按值傳遞。)#include<stdio.h>intf1(intx,inty){?x=x+y;y=x+y;?printf("x=%3d,y=%3d\n",x,y);?returnx+y;}voidmain(){ intx=5,y=8;?intz=f1(x,y);?printf("x=%3d,y=%3d,",x,y); printf("z=%3d\n",z);}3.(指針形參(含數(shù)組形參)的用途:高效傳遞大量數(shù)據(jù)(如下例中函數(shù)f2的形參a)、通過指針訪問甚至修改其指向的對(duì)象數(shù)據(jù)(如下例中函數(shù)f2的形參s)。)#include<stdio.h>voidf2(inta[],intn,int*s);voidmain(){?inta[5]={2,7,5,4,9};?intx; f2(a,5,&x); printf("%d\n",x);}voidf2(inta[],intn,int*s){ inti; *s=0;?for(i=0;i<n;i++)*s+=a[i];}4.(返回值類型為指針的指針函數(shù)。注意不能返回自動(dòng)局部變量的地址,由于返回后就超過其作用域和生存期,從而使返回的地址無效。寄存器變量本就沒有地址可言,自然不存在返回其地址的問題。)#include<stdio.h>#include<stdlib.h>#include<string.h>char*f3(constchar*x,constchar*y);voidmain(){?char*a="apple"; charb[10]="pear"; char*p;?p=f3(a,b);?printf("%s\n",p); free(p);}char*f3(constchar*x,constchar*y){?char*p=malloc(strlen(x)+strlen(y)+2); strcpy(p,x); strcat(p,"");?strcat(p,y);?returnp;}5.(二維數(shù)組參數(shù)。)#include<stdio.h>intf4(inta[][4],intm,intn){?inti,j,max=a[0][0]; for(i=0;i<m;i++)? for(j=0;j<n;j++) if(a[i][j]>max)max=a[i][j];?returnmax;}voidmain(){?inta[3][4]={???{25,38,46,72},?? {35,20,50,66},?? {18,74,38,69}?};?intx=f4(a,3,4); printf("x=%d\n",x);}6.3指出下列函數(shù)功能并上機(jī)調(diào)試和驗(yàn)證1.(計(jì)算并返回)intfun1(intn){ inti,p=1,s=0; for(i=1;i<=n;i++){??p*=i;s+=p; } returns;}2.(插入排序法升序排序。類似形考冊(cè)作業(yè)3第三大題第5小題,只是此處為升序排序,那兒是降序排序。)voidfun2(int*a,intn){?inti,j,x; for(i=1;i<n;i++){ ?x=a[i]; ?for(j=i-1;j>=0;j--) if(x<a[j])a[j+1]=a[j];//將x<a[j]改為x>a[j]則為降序排序? elsebreak; a[j+1]=x;?}}3.(將字符串b的內(nèi)容復(fù)制到字符指針a所指向的存儲(chǔ)空間中并返回。)char*fun3(char*a,constchar*b){?while(*b)*a++=*b++; *a=0; returna;}4.(本題與形考冊(cè)作業(yè)3第四大題第4小題雖然寫法有著微小的差別,但功能完全相同,都是把練習(xí)題3.2第8小題中求最小公倍數(shù)的算法改寫為遞歸形式。比起非遞歸形式,顯然難讀了很多,效率也低了。調(diào)用本函數(shù)求a和b的最小公倍數(shù)時(shí),形參k的實(shí)參應(yīng)當(dāng)固定給2,即應(yīng)當(dāng)調(diào)用:Multiple(a,b,2)。為了保證對(duì)的調(diào)用,不妨將本函數(shù)聲明為static,限制其他程序員在其程序文獻(xiàn)中調(diào)用,而在本函數(shù)的程序文獻(xiàn)中此外定義一個(gè)全局函數(shù)供其他程序員使用。如下:intLeastCommonMultiple(inta,intb){returnMultiple(a,b,2);})intMultiple(inta,intb,intk){ if(a>=k&&b>=k){? if(a%k==0&&b%k==0)returnk*Multiple(a/k,b/k,k); ?elsereturnMultiple(a,b,k+1); }?elsereturna*b;}5.(問題一:第一次調(diào)用時(shí)返回與x的十進(jìn)制形式各位數(shù)字順序相反的數(shù)。即,假如x為123,則函數(shù)最終返回321。以后的各次調(diào)用,最終返回結(jié)果與之前的調(diào)用有關(guān),不能擬定。第一次調(diào)用時(shí),x不斷地在遞歸過程中去掉低位(Contrary(x/10)),而這被去掉的低位則加到了y的后面(y=y*10+x%10),下次遞歸時(shí)x的較高一位也會(huì)被再次加到y(tǒng)后面,也就是說較高位會(huì)排到低位的后面,從而把x的各位數(shù)字順序反了過來。由于y為靜態(tài)變量,所以第二次調(diào)用開始時(shí),y不為0。x的新實(shí)參值各位將加在y本來的值之后,假如y或者x較大還也許由于超過無符號(hào)整型數(shù)的范圍而產(chǎn)生溢出,因此結(jié)果值難以預(yù)計(jì)。問題二:y及返回值類型與參數(shù)類型不一致,更容易導(dǎo)致溢出。應(yīng)統(tǒng)一為unsignedint。綜上,應(yīng)修改如下:unsignedintContrary(unsignedintx){ staticunsignedinty=0;?if(x){? y=y*10+x%10; returnContrary(x/10); }else{? unsignedinttemp=y(tǒng);? y=0; returntemp; }}最后,這顯然又是一個(gè)末尾遞歸,可以改成非遞歸形式如下:unsignedintContrary(unsignedintx){ unsignedinty=0;?while(x){ y=y(tǒng)*10+x%10;??x/=10; }?returny;})intContrary(unsignedintx){?staticinty=0;?if(x){??y=y*10+x%10;? Contrary(x/10); } returny;}6.4根據(jù)下列題目規(guī)定編寫程序并上機(jī)調(diào)試和運(yùn)營1.intfun1(inta[],intn){ if(n==0)return0; returna[n-1]*a[n-1]+fun1(a,n-1);}2.(參見4.2第1小題及形考冊(cè)作業(yè)2第三大題第1小題。)voidfun2(inta[],intn,int*c1,int*c2){?for(*c1=*c2=0;n--;)??(a[n]%2)?(*c1)++:(*c2)++;//(*c1)和(*c2)括號(hào)不能省略!}3.(參見3.3第3小題函數(shù)f1。)intfun5(intm,intn){?intr;?while(n!=0){? r=m%n; ?m=n;n=r; }?returnm;}?結(jié)構(gòu)與聯(lián)合7.1選擇題1.C 2.D?3.A 4.A 5.B?6.D?7.C?8.B 9.A?10.C本大題有如下問題:一、第1小題使用了C++語法:在C++中則可直接使用結(jié)構(gòu)名。而在C語言中,結(jié)構(gòu)名除非使用typedef定義為類型別名了,否則必須在其前面加關(guān)鍵字struct,形考冊(cè)作業(yè)4第一大題第1小題正是考核此點(diǎn)。所以本題中結(jié)構(gòu)定義應(yīng)改為:structA{inta,b;structA*c;};二、第3小題D*前應(yīng)當(dāng)有struct,因素同上。此外,不知道為什么,在VC98中采用默認(rèn)設(shè)立,通過實(shí)際編譯的結(jié)果是聯(lián)合成員b和c的地址偏移為8,也就是說在成員a之后有4個(gè)字節(jié)空閑沒用。所以實(shí)際的結(jié)構(gòu)大小為24。但是估計(jì)此處對(duì)的答案應(yīng)當(dāng)是20三、第5小題中“類型為Worker”也應(yīng)改為“類型為structWo(hù)rker”四、第10小題涉及鏈表的插入操作。p->next=f執(zhí)行后,則可以看作形成了以p為表頭指針的鏈表,其表頭為p所指向的結(jié)點(diǎn),之后是通過指針域鏈接的本來的鏈表。所以要將新的表頭指針p賦值給f,使f指向新的表頭結(jié)點(diǎn)。7.2寫出下列程序運(yùn)營結(jié)果并上機(jī)驗(yàn)證1.#include<stdio.h>structAAA{?inta[10];?intn;};structAAAx;voidmain(void){?inti; intb[6]={20,35,46,18,24,52}; x.n=6; for(i=0;i<x.n;i++)x.a[i]=b[i];//將b拷貝到x.a開頭?x.a[x.n]=37;x.n++;//增長(zhǎng)一個(gè)數(shù) for(i=0;i<x.n;i++)printf("%d",x.a[i]);//輸出?printf("\n");}2.#include<stdio.h>#include<stdlib.h>#include<string.h>structCCC{ char*a; intn;};voidm

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論