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