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