5.若給fun函數(shù)的形參s傳送字符串:"ㄩㄩ 6354abcc"(其中ㄩ表示空格字符),則函數(shù)的返回值是__________。
# include
long fun(char s[])
{ long n;int sign;
for(; isspace(*s); s++);
sign=(*s==’-’ )?-1:l;
if(*s==’+’ ||*s==’-’) s++;
for(n=0; isdigit(*s); s++) n=10*n+(*s-’0’);
return sign *n;
}
【解】函數(shù)fun的第一個(gè)for循環(huán)跳過字符串的前導(dǎo)空白符,接著分析第一個(gè)非空白符是否是負(fù)號(hào),若是置變量sign為-1;否則,置變量sign為1。接著的if語句在第一個(gè)非空白字符是負(fù)號(hào)或正號(hào)時(shí),跳過該字符。以后的for循環(huán)將后面的數(shù)字符當(dāng)作十進(jìn)制數(shù)的各位數(shù)字譯出一個(gè)長整數(shù)n。遇字符a時(shí),結(jié)束譯數(shù)循環(huán)。最后,函數(shù)返回sign與n的乘積。所以若調(diào)用函數(shù)時(shí)提供的實(shí)參是"ㄩㄩ6354abc",函數(shù)返回值是整數(shù)6354。
6.下面函數(shù)要求計(jì)算兩個(gè)整數(shù)X、y之和,并通過形參Z傳回該和值,請(qǐng)?zhí)羁铡?
void add(int x,int y,________z)
{_________=x+ y; return;}
【解】函數(shù)希望通過形參z傳送結(jié)果,形參z必須是指針類型的,由于返回整型結(jié)果,所以z的說明是int *z。函數(shù)返回前必須先把結(jié)果通過形參z間接引用(寫成* z)傳回。7.以下函數(shù)用來在w數(shù)組中插入x。在n所指向的存儲(chǔ)單元中存放著w數(shù)組中的字符個(gè)數(shù)。數(shù)組W中的字符已按從小到大的順序排列,插入后數(shù)組W中的字符仍有序。請(qǐng)?zhí)羁铡?
void fun(char *w,char x, int *n)
{ int i, p;
p=0;
w[*n]=x;
whlie( x>w[p] ) p++;
for(i=* n; i>p;i--) w[i]=_____________;
w[p] = x;
++ *n;
}
【解】在用數(shù)組實(shí)現(xiàn)的有序序列中插入內(nèi)容,必須先尋找插入位置。插入位置找到后,需將插入位置之后的元素向后移動(dòng)一個(gè)位置,留出插入點(diǎn)。最后,將元素插入,并增加序列的元素個(gè)數(shù)。函數(shù)為了簡化尋找插入位置循環(huán)的循環(huán)條件,預(yù)先在序列的最后置人插入值。插入位置之后的元素向后移動(dòng)一個(gè)位置必須從最后一個(gè)元素開始往前逆序移動(dòng),是將前一個(gè)元素向后移,所以在空框處應(yīng)填入w[i-l] 。
8.函數(shù)my_cmp()的功能是比較字符串s和t的大小,當(dāng)S等于t時(shí)返回0,否則返回s和t的第一個(gè)不同字符的ASCII碼差值,即s>t時(shí)返回正值,當(dāng)s my_cmp( char *s, char * t)
{while(*s==* t)
{ if(*s==’\0’) return 0 ;
++s;++t;
}
return____________;
}
【解】兩字符串大小比較必須從它們的首字符開始,在對(duì)應(yīng)字將相等情況下循環(huán),直至不相等結(jié)束。相等時(shí),老字符率已到了字符串的結(jié)束標(biāo)記符,則兩字符率相同,函數(shù)退回0值;如還有后繼字符,則準(zhǔn)備比較下一對(duì)字符。對(duì)應(yīng)字符不相同,循環(huán)結(jié)束。循環(huán)結(jié)束時(shí),就以兩個(gè)當(dāng)前字符的差返回。所以在空框處應(yīng)填入*s-*t,保證在s>t時(shí)返回正值,當(dāng)s
6.3 程序分析題
1.閱讀函數(shù),寫出函數(shù)的主要功能:
ch(int *p1,int *p2)
{ int p;
if(*pl>*p2) { p=* pl;*pl=*p2;* p2=p; }
}
【解】函數(shù)辦有兩個(gè)指針形參p1和p2,函數(shù)體通過*pl和*p2間接引用它們所指變量。當(dāng)pl所指變量的位大于p2所指變量的值時(shí),交換兩形參所指變量的值。所以函數(shù)的功能當(dāng)形參1所指變量比形參2所指變量的值大時(shí),交換這兩個(gè)變量的值。調(diào)用該函數(shù)能保證形參1所指變量的值不大于形參2所指變量的值。
2.閱讀函數(shù),寫出函數(shù)的主要功能:
float av(a,n)
float a[];
int n;
{ int i; float s;
for(i=0,s= 0;i return s/n;
}
【解】函數(shù)有一個(gè)數(shù)組形參a和一個(gè)整型形參n。函數(shù)首先用循環(huán)求數(shù)組a的前n個(gè)元素和,然后將和除以n。即求數(shù)組元素的平均值。
3.閱讀下面程序,寫出運(yùn)算結(jié)果。
unsigned fun6( unsigned num)
{ unsigned k=l;
do { k*= num;num/=10;}
while(n) ;
return k;
}
main()
{ unsigned n=26;
printf("%d\n", fun6(n));
}
【解】函數(shù)有一個(gè)形參num,循環(huán)前變量 k置 1,循環(huán)中,表達(dá)式num是取num的個(gè)位,將num的個(gè)位值累乘于k中,然后num除以10。循環(huán)直至num為0結(jié)束,這是逐一求出num十進(jìn)制表示的各位數(shù)字,并累乘于變量k的循環(huán)。函數(shù)最后返回k。函數(shù)fun6的功能是求整數(shù)的各位十進(jìn)數(shù)字積。所以程序輸出12。
6.4 程序設(shè)計(jì)題
1.編一個(gè)名為root的函數(shù),求方程ax*x + bx + c=0的b*b-4ac,并作為函數(shù)的返回值。其中的a、b、c作為函數(shù)的形式參數(shù)。
【解】該函數(shù)應(yīng)設(shè)3個(gè)形參,分別表示一元二次方程的三個(gè)系數(shù)。函數(shù)按公式求出結(jié)果返回即可:
double root(double a,double b,double c)
{ return b*b+4.0*a*c;
}
2.編一個(gè)函數(shù),若參數(shù)y為閏年,則返回1;否則返回0。
【解】由每四年一個(gè)閏年,但每100年少一個(gè)閏年,每400年又增加一個(gè)閏年的約定。記年份為y,則y年是閏年的條件是:
(y能被4整除,但不能被100整除)或(y能被400整除)
用邏輯表達(dá)式可描述如下:
(y%4==0 && y0) ||y@0==0
寫成函數(shù)為:
int isLeap(int y)
{ return( y% 4==0 && y% 100) || y@0== 0;
}
3.編一個(gè)無返回值,名為root2的函數(shù),要求如下:
形式參數(shù): a,b,c單精度實(shí)型,root單精度實(shí)型數(shù)組名。
功能:計(jì)算ax*x +bx+c=0的兩個(gè)實(shí)根(設(shè)b*b-4ac> 0)存入數(shù)組root[2]中。
【解】函數(shù)根據(jù)形參。a,b,c的值,首先計(jì)算d=b*b-4*a*c。考慮到實(shí)數(shù)運(yùn)算時(shí)的計(jì)算誤差,兩個(gè)幾乎相等的數(shù)相減有效位數(shù)也幾乎全部丟失的情況,應(yīng)先求出絕對(duì)值大的根,然后利用報(bào)與系數(shù)之間的關(guān)系,再求絕對(duì)值小的根。函數(shù)定義如下:
void root2( float a,float b,float c, float root[])
{ float re,im,d=b*b-4.0*a*c;/*求判別式*/
re=-b/(2.0*);
if(d>=0.0) { /*有兩個(gè)實(shí)根,先求絕對(duì)值大的根*/
im=(float)sqrt((double)d)/(2.0*a) ;
root[0] =re+(b<0.0? im:-im);
root[1]=c/(a*root[0]);
}
}
更多軟考資料請(qǐng)?jiān)L問:考試吧軟件水平考試欄目