13.阅读下面程序,写出运算结果。
#include ―stdio.h‖
int binary (int x, int a[ ], int n) 输出结果: 1 { int low=0,high=n-1,mid; while(low<=high){ mid=(low+high)/2; if(x>a[mid]) high=mid-1; else if(x
void main ( )
{ static int a[ ]={4,0,2,3,1}; int i,t,j; for(i=1;i<5;i++){ t=a[i]; j=i-1;
while(j>=0&&t>a[j]){ a[j+1]=a[j]; j--; } a[j+1]=t; }
printf(―%d\\n‖,binary(3,a,5)); }
14.阅读下面程序,写出运算结果。
#include
#include
{ double f (double, int); printf(―\\n‖,f(2.0,14)); }
double f (double x, int n) { double t; if(n==1) t=x; else {
if(n/2*2==n) t=x*f(x,n/2); else t=x*pow(f(x,n/2),2.0); } return t; }
15.阅读下面程序,写出运算结果。
#include
double t (double a,double(*f)(double))
59
输出结果: 256.000000 { return(*f)(a*a); } double f(double x) { return 2.0*x; } double g(double x) { return 2.0+x; } void main ( )
{ x=4.0; u=t(x,f); v=t(x,g); printf(―u=%5.3fv=%5.3f\\n‖,u,v); }
四、程序设计题
1.编一个名为root的函数,求方程ax2+bx+c=0的b2-4ac,并作为函数的返回值。其中的a、b、c作为函数的形式参数。 解:float root (float a, float b, float c)
{ return (b*b-4*a*c); }
2.编一个函数,若有参数y为闰年,则返回1,否则返回0。 解:int year (int y)
{ if ((y%4==0&&y0!=0)||y@0==0) return 1; else return 0; }
3.编一个无返回值、名为root2的函数,要求如下: 形式参数:a,b,c单精度实型,root单精度实型数组名。
功能:计算ax2+bx+c=0的两个实根(设b2-4ac>0)存入root[2]中。 解:#include
void root2 (float root[2], float a, float b, float c) { float p;
p=sqrt(b*b-4*a*c); root[0]=(-b+p)/(2*a); root[1]=(-b-p)/(2*a); }
4.编一个无返回值、名为max_min的函数,对两个整数实参能求出它们的最大公约数和最小公倍数并显示。
解:void max_min (int m, int n)
{ int a=m, b=n, t, r;
if(m printf(―%d 和 %d 的最大公约数是%\\n‖,a,b,n); printf(―%d 和 %d 的最小公倍数是%\\n‖,a,b,a*b/n); } 60 5.编一个能判断一个整数是否是素数的函数,并用它求出3到100之间的所有素数。 解:#include #include int prime (int m) for(a=3; a<=100; a++) { int k,i; if(prime(a) printf(―=‖,a); k=sqrt(m); printf(―\\n‖); for(i=2;i<=k;i++) } if(m%i==0) return 0; return 1; } 6.编一个名为days的函数,要求如下: 形式参数:整数y,m,d分别表示年、月、日。 功能:计算该日是该年的第几天。 返回值:整数第几天。 解:int days (int y, int m, int d) { int n; switch (1) { case 1: n=0; if(m==1) break; case 2: n=n+31; if(m==2) break; case 3: n=n+28; if(m==3) break; case 4: n=n+31; if(m==4) break; case 5: n=n+30; if(m==5) break; case 6: n=n+31; if(m==6) break; case 7: n=n+30; if(m==7) break; case 8: n=n+31; if(m==8) break; case 9: n=n+31; if(m==9) break; case 10: n=n+30; if(m==10) break; case 11: n=n+31; if(m==11) break; case 12: n=n+30; } n=n+d; if(m>2) if((y%4==0&&y0!==0)||(y@0==0)) return n; } 7.编一个无返回值,名为trus的函数,要求如下:形式参数:s1[2][3], s2[3][2] 整型数组。 功能:将s1数组转置后存入s2数组中。 解:void trus (int s1[2][3], int s2[3][2]) { int i,j; for(i=0;i<2;i++) for(j=0;j<3;j++) s2[j][i]=s1[i][j]; } 61 n=n+1; 8.编一个名为countc函数,要求如下: 形式参数:array存放字符串的字符型数组名。 功能:统计array数组中大小写字母的数目。 返回值:字符串中大小写字母的数目。 解:include int countc (char array[ ]) { int i,n=0; for(i=0;i if(array[i]<=?A‘&&array[i]>=?Z‘) n++; return n; } 9.编一个名为link函数,要求如下: 形式参数:s1[40],s2[40],s3[80]存放字符串的字符型数组。 功能:将s2连接到s1后存入s3中。 返回值:连接后字符串的长度。 解:include int link (char s1[40], char s2[40], char s3[80]) { int i,k,n=0; for(i=0;i for(i=0;i 10.编一个函数,返回一维实型数组前n个元素的最大数、最小数和平均值。数组、n和最大数、最小数、平均值均作为函数的形式参数,本函数无返回值(用指针方法实现)。 解:void fun (float a[ ], int n, float *max, float *min, float *vag) { int i; *vag=a[0]; *max=a[0]; *min=a[0]; for(i=1;i { if(a[i]>*max) *max=a[i]; if(a[i]<*min) *min=a[i]; *vag=*vag+a[i]; } *vag=*vag/n; } 11.编一个函数,用“冒泡法”对字符数组中的字符按由小到大顺序排列。 要求字符数组作为形参。 解:void sortc (char a[ ]) { int n,i,j; char ch; 62 n=strlen(a); for(i=0;i { ch=a[j]; a[j]=a[j+1]; a[j+1]=ch; } } 12.编一个函数,能将十六进制转换成十进制。 形参:字符指针,指向放十六进制数的字符数组 返回值:十进制整数 解:#include int tv (char *s) { int m,n=0; while(*s!=?\\0‘) { if(isalpha(*s)) *s=toupper(*s); switch(*a){ case ?F‘: m=15; break; case ?E‘: m=14; break; case ?D‘: m=13; break; case ?C‘: m=12; break; case ?B‘: m=11; break; case ?A‘: m=10; break; default: m=*s-48; } n=n*16+m; s++; } return n; } 13.用递归法将一个整数转换成字符串。 解:#include < string.h> void convert (char *b) // 倒置数组 char a[255]; // 全局数组 { int l,i; void contw (int m) // 递归转换 char c,*p; { int n; l=strlen(b); p=b+l-1; static int i=1; for(i=1,b++; i 63 void main ( ) { int n; void contw (int m); void convert (char *b); printf(―输入一整数:‖); scanf(―%d‖,&n); if(n<0) {a[0]=?-‘; n=-m; } else a[0]=? ‘; contw(n); convert(a); printf(―字符串:%s\\n‖,a); return; } 64