一、数字题
1、 用函数指针指向要调用的函数,规定在2处指向函数f1,在3处使f指向函数f2,当调用正确时,程序输出:
X1=5.000000,x2=3.000000,x1*x1+x1*x2=40.000000
double fun(double a , double b)
{double (*f)(); double r1,r2;f=f1;r1=f(a);f=f2;
r2=(*f)(a,b);return r1+r2;}
2、 2用函数指针指向要调用的函数,规定在2处指向函数f1,在3处使f指向函数f2,当调用正确时,程序输出:
X1=5.000000,x2=3.000000,x1*x1+x1*x2=40.000000
double fun(double x , double y)
{if(i= =1) return f1(x);
else return f2(x,y);}
3、 将形参n所指变量中各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回所指变量,例如,输入一个数:27638496,新的数:739
Void fun(unsigned long *n)
{ unsigned long x=0,I;int t;i=1;
while(*n){t=*n%10;if(t%2!=0){x=x+t*i;i=i*10;}*n=*n/10;}*n=x;}
4、 将形参n所指变量中各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新的数,并作为函数值返回。例如,输入一个数:27638496,新的数:64862
unsigned long fun(unsigned long n)
{ unsigned long x=0;int t;while(n){t=t%10;if(i%2= =0)x=10*x+t;n=n/10;}return x;}
5、 将形参n所指变量中各位上为偶数的数取出,并按原来从高位到低位的顺序组成一个新的数,并作为函数值返回。例如,输入一个数:27638496,新的数:26846
unsigned long fun(unsigned long n)
{ unsigned long x=0,s,i;int t;s=n;i=1;while(s){t=s%10;if(i%2==0)x=x+t*i;i=i*10;}s=s/10;}return x;}
6、 求方程ax2+bx+c=0的根。例如,当a=1,b=2,c=1时,方程的两个根是:x1= -1.00,x2= -1.00
main()
{float a,b,c,disc,x1,x2,p,q;
scanf(“%f,%,f,%f”,&a,&b,&c);disc=b*b-4*a*c;clrscr();printf(“******the result******\n”);
If(disc>=0){x1=(-b+sqrt(disc))/(2*a); x1=(-b-sqrt(disc))/(2*a);printf(“x1=%6.2f,x2=%6.2f\n”,x1,x2);}
else{p=-b/(2*a);q=sqrt(fabs(disc))/(2*a);
printf(“x1=%6.2f+%6.2f i\n”,p,q);
printf(“x2=%6.2f-%6.2f i\n”,p,q);}}
7、 输出方程组A+B=56,A+2B=72的一组正整数解。结果是:A=40,B=16。
main()
{int i,j;clrscr();
for(i=0;i<100;i++)
for(j=0;j<100;j++) if(i+j= =56&&i+2*j= =72)printf(“A=%2d,B=%2d”,i ,j);}
8、 求方程ax2+bx+c=0的两个实数根。例如,当a=1,b=2,c=1时,方程的两个根是:x1= -1.00,x2= -1.00
main()
{ float a,b,c,disc,x1,x2,
clrscr();
do{printf(“input a,b,c:”);scanf(“%f,%f,%f”,&a,&b,&c);disc=b*b-4*a*c;
if(disc<0)printf(“disc=%f\ninput again!\n”,disc)}
while(disc<0);printf(“******the result******\n”);
x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a);printf(“\nx1=%6.2f\nx2=%6.2f”,x1,x2);}
9、 判断一个数的个位数字和百位数字之和是否等于其十位上的数字,是则返回“yes!”,否则返回“no!”
Char *fun(int n)
{int g,s,b;g=n%10;s=n/10%10;b=n/100%10;if(g+b= =s)retrun “yes!”;else return “no!”;}
10、输入一个长整数,如果这个数是负数,则取它的绝对数,并显示出来。例如:输入:-3847652,结果为3847652
main()
{long int n;clrscr();pritntf(“enter the data;\n”);scanf(“%ld”,&n);printf(“***the absolute value***\n”);
if(n<0)n= -n;printf(“\n\n”);printf(“%d”,n);}
11、计算如下公式的值。A1=1,A2=1/(1+A1),A3=1/(1+A2)-------AN=1/(1+AN+1)若n=10,则应输出:0.618056
float fun(int n)
{float A=1;int i;for(i=1;i<=n;i++)A=1.0/(1+A);return A;}
12、计算并输出下列数的前N项之和SN,直到SN+1大于q为止。SN=2/1+3/2+4/3+------N+1/N例如,q的值为50.0,则函数的值为50.416687。
double fun(double q)
{int n;double s;n=2;s=2.0;while(s<=q){s=s+(double)(n+1)/n;n++}printf(“n=%d\n”,n);return s;}
13、计算s=f(-n)+f(-n+1)+------+f(0)+f(1)+f(2)+------+f(n)的值,当n为5时,S的值为:10.407143(函数省略)。
float fun(double x)
{if(x= =0.0 || x= =2.0)return 0.0;else if(x<0.0) return (x-1)/(x-2);else return (x+1)/(x+2);}
double fun(int n)
{int i;double s=0.0,y;for(i=-n;i<=n;i++){y=f(1.0*i);s+=y;}return s;}
14、求1!+2!+3!+-------N!的和,若N=6则和为873。
main()
{int j,n;long s=0,t=1;
clrscr();
printf(“\n input n:\n”);scanf(“%d”,&n);
for(i=1;i<=n;i++){t=t*i;s=s+t;}printf(“1!+2!+3!+-------+%d!=%ld\n”,n,s);}
15、计算Sn=1/1-1/3+1/5-1/7+-------1/(2n+1)的值,当n的值为15时,输出的结果是:s=0.769788,N=15。
Void fun(float *sn,int n )
{int i,j=1;float s=0.0;for(i=0;i<=n;i++){s=s+j*1.0/(2*i+1);j*=-1;} *sn =s;}
main()
{int n=15;float s;fun(&s,n);}
16、计算SN的值:SN=1/1+3/1+5/4+------+(2N-1)/(SN-1),当N=50时,SN=71.433699
double fun(int n)
{double s=1.0,s1=0.0;int k;for(k=2;k<=n;k++){s1=s;s+=(2*k-1)/s1;}return s;}
17、计算SN的值:s=13/31*35/53*57/75*-----*(2k-1)(2k+1)/ (2k+1) (2k-1) 当k=5时,S=338.215158
double fun(int n)
{ double s=1.0;double f=0.0; double p=0.0;int i=0;int k;for(k=1;k<=n;k++){f=2*k-1;p=2*k+1;
for(i=1;i<2*k+1;i++)f*=2*k-1; for(i=1;i<=2*k-1;i++)p*=2*k+1;s*=f/p;}return s;}
18、计算下式:s=3/23-5/42+7/62+-----+(-1)n-1*(2*n+1)/(2n)2,直到(2*n+1)/(2n)2的绝对值小于等于10-3,并把计算的结果作为函数值返回。例如:若E的值为1E-3,函数值为0.551690.
double fun(double e)
{int i,k;double s,t,x;s=0;k=1;i=2;x=3/4;while(x>e){s=s+k*x;k=k*(-1);t=2*i;x=(2*i+1)/(t*t);i++}return s;}
19、求P的值p=m!/(n!*(m-n)!),例如:m=11,m=4时,运算结果为330.000000.
long jc(int m)
{long s=1;int i;for(i=1;i<=m;i++)s=s*i;return s;}
Float fun(int m,int n)
{float p;p=1.0*jc(m)/jc(n)/jc(m-n);return p;}
20、计算S的值:s=(1*3)/22+(3*5)/42+ (5*7)/62+-----(2*n-1)/(2*n+1)2,当形参N的值为10时,函数的返回值9.612558
double fun(int n)
{int i;double s,t;s=0;for(i=1;i<=n;i++){t=2.0*i;s=s+(2.0*i-1)* (2.0*i+1)/(t*t); }return s;}
21、计算S的值:s=(1*3)/22-(3*5)/42+ (5*7)/62------(2*n-1)/(2*n+1)2,当形参N的值为10时,函数的返回值-0.204491
double fun(int n)
{int i,k;double s,t;s=0;k=1;for(i=1;i<=n;i++){t=2*i;s=s+k*(2*i-1)* (2*i+1)/(t*t);k=k*(-1);}return s;}
22、计算下式:s=1/22+3/42+5/62+------(2N-1)/(2N)2
double fun(double e)
{int i;double s,x;s=0;i=0;x=1.0;while(x>e){i++;x=(2.0*i)/ ((2.0*i)* (2.0*i));s=s+x;}return s;}
23、判断某一个年份是否为闰年,例如,1900年不是闰年,2004是闰年。
int fun(int n)
{int flag=0;if(n%4= =0){if(n%100!=0)flag=1;}
if(n%400= =0)flag=1;return flag;}
24、从键盘输入3个整数,然后找出最大的数并输出。例如,输入12,45,43最大值为45
main()
{int a,b,c,max;clrscr();
printf(“\ninput three numbers:\n”);scanf(“%d,%d,%d”,&a,&b,&c);printf(“%d,%d,%d”,a,b,c);
if(a>b)max=a;else max=b;if(max<c)max=c; printf(“max=%d\n”,max);}
25、从键盘输入一个整数n,输出n对应的裴波那契数列。
main()
{inti,n=0;scanf(“%d”,&n);
for(i=0;i<=n;i++)printf(“%d”,fun(i));}
Int fun(int n)
{if(n= =0) return 0;else if(n= =1)return 1;
else return fun(n-1)+fun(n-2);}
26、找出100至x(x<999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。
当n值为500时,各位数字之和为15的整数有:159,168,177----共有26个。
fun(int x)
{intn,s1,s2,s3,t;n=0;t=100while(t<=x){s1=t%10;s2=(t/10)%10;s3=t/100;if(s1+s2+s3= =15){printf(“%d”,t);n++;}++t;}return n;}
27、找出100—999之间(含100和999)各位上的数字之和为X(X为一个正整数)的整数,然后输出。符合条件的整数个数作为函数值返回。当x值为5时,满足条件的数为:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500----共有15个。
int fun(int x)
{int n,s1,s2,s3,t;n=0;t=100; while(t<=999){s1=t%10; s2=(t/10)%10;s3=t/100;if(s1+s2+s3= =x){printf(“%d”,t);n++;}t++;}
return n;}
28、打印出1~1000中满足:个位数字的立方等于其本身所有数。本题结果为:1,64,125,216,729
main()
{int i,g,clrscr();for(i=1;i<1000;i++){g=i%10;if(g*g*g= = i)printf(“%4d”,i);}}
29、打印出满足个位的数字,十位上的数字和百位上的数字都相等的所有三位数。本题的打印结果为:111,222,333,444
555,666,777,888,999
main()
{int g,s,b; clrscr();for(g=1;g<10;g++)for(s=1;s<10;s++) for(b=1;b<10;b++){if(g= =s&&s= =b)printf(“%5d”,g+s*10+b*100);}}
30、求两个正整数m和n的最大公约和最小公倍数
main()
{int a,b,n,m,t; clrscr();printf(“\n input two numbers:\n”);scanf(“%d,%d”,&n,&m);if(n<m){a=m;b=n;}else{a=n;b=m;}
While(b!=0){t=a%b;a=b;b=t}printf(“greatest common divisor:%d\n”,a);printf(“leas common multiple:%d\n”,n*m/a);}
31、从键盘输入只有两个整数参与运算的一个四则运算式,然后计算出它的值。注意数字全部为正整数。例如:输入
308*28,结果为8624.000000
main()
{int a=0,b=0,flag=1,fg=1;
float result;char *p,ch;
char str[10];clrscr();
printf(“\n input a string \n”);gets(str);p=str;
while(*p){if(*p>=’0’&&*p<=’9’&&flag= = 1)a=a*10+*p –‘0’;else if(fg){ch=*p ;flag=2;fg=0;}
if(*p>=’0’&&*p<=’9’&&flag= = 2) b=b*10+*p –‘0’;p++;}
switch(ch)
{case ‘+’:result=a+b;break; case’-’: result=a-b;break; case’*’: result=a*b;break; case’/’: result=(float)(a/b);break;}
Print (“\n result=%f”,result);}
32、计算两个自然数n和m(m<10000)之间所有数的和(n和m从键盘输入),例如:n=1,m=100时,sum=5050
main()
{int n,m;long sum;sum=0;printf(“\n input n,m\n”);
scanf(“%d,%d”,&n,&m);
while(n<=m){sum+=n;n++;}printf(“sum=%ld\n”,sum);}
33、求k!(k<13)并通过函数名传回主函数。例如:若k=0,输出3628800.
long fun(int k)
{if(k>0)return(k*fun(k-1));else if(k= =0)return 1L;}
34、求n!,例如:7!=5040
main()
{int i,n;long f=1;printf(“input n:”);scanf(“%d”,&n);
for(i=1;i<=n;i++)f*=i;printf(“%d!=%ld\n”,n,f);}
35、把从键盘输入的3个整数按从小到大输出,若输入33,78,25则输出25,33,78
main()
{int x,y,z,t;clrscr();
printf(“input x,y,z\n”);
scanf(“%d%d%d”,&x,&y,&z);if(x>y){t=x;x=y;y=t;} if(x>z){t=z;z=x;x=t;}
if(y>z){t=y;y=z;z=t;}printf(“******the result******\n”);printf(“from small to big:%d%d%d\n”,x,y,z);}
36、将十进制正整数m转换成k进制(2≤k≥9)数的数字输出,例如:若输入8和2,则应输出1000
Void fun(int m,int k)
{int aa[20],i;for(i=0; m;i++){aa[i]=m%k;m/=k;}for(;i;i--;i++)printf(“%d”,aa[i-1]);}
37、求二分之一圆的面积,若圆的半径为19.527,则输出为:s=598.950017。
float fun(float r)
{return 3.14159*r*r/2.0;}
main()
{float x;printf(“enter x:”);scanf(“%f”,&x);printf(“s=%f\n”,fun(x));}
38、读入一个整数k(2≤k≥10000)打印它们所有质因子,若输入的整数3410,则应输出:2,5,11,31
Isprime(int n)
{int i,m;m=1;for(i=0;
i<n;i++)if(!(n%i))
{m=0;break;}return m;}
main()
{int j,k;printf(------);
scanf(“%d”,&k);printf(-----);for(j=2;j<=k;j++)if(!(k%j))&&(isprime(j))printf(“\n%4d”,j);printf(“\n”);}
39、计算并输出n(包括n)以内能被3或7整除的所有自然数的倒数之和,例如当n为32后,输出为s=1.226323
double fun(int n)
{int i;double sum=0.0;if(n>0&&n<=100){for(i=1;i<=n;i++)if(i%3= = 0|| i%7= = 0)sum+=1.0/i;}return sum;}
40、求出1到1000之内能被7或11整除但不能同时被7和11整除的所有整数放在数组a中,通过n返回这些数的个数
Void fun(int *a,int *n)
{int i,j=0;for(i=1;i<=1000;i++)if(((i%7= =0)||(i%11= =0))&&i%77!=0)a[j++]=i;*n=j;}
Main()
{int aa[1000],n,k;fun(aa,&n);for(k=0;k<n;k++)if((k+1)%10= =0)printf(“\n”);else printf(“%5d’,aa[k]);}
41、统计长整数n的各个位上出现数字1,2,3,的次数,并通过外部(全局)变量c1,c2,c3返回主函数,当n=123114350,结果应该:c1=3,c2=1,c3=2。
Void fun(long n)
{ c1=c2=c3=0;while(n)
{switch(n%10)
{case 1:c1++;break; case 2:c2++;break; case 3:c3++;}n/=10;}}
42、计算并输出high以内最大的10个素数之和,若high的值为100,则函数的值为732。
int fun(int high)
{int sum=0,n=0,j,yes;
while((high>=2)&&(n<10)){yes=1;for(j=2;j<=high/2;j++)if(high%j= =0){yes=0;break;}
if(yes){sum+=high;n++}high--;}return sum;}
43、统计所有小于等于n(n>2)的素数的个数,素数的个数作为函数值返回。
int fun(int n)
{int i,j,count=0;printf(----);for(i=3;i<=n;i++)
{for(j=2;j<i;j++)if(i%j= = 0)break;
If(j>=i){count++;printf(-----);}}return count;}
44、求1~100(不包含100)以内所有素数的平均数。最后结果为42.40.
Main()
{int i,j,n=0,flag,float aver=0;j=2;
for(j=;j<100;j++){flag=1;for(i=2;i<j;i++)if(j%i= =0){flag=0;break;}
If(flag= =1){n++;aver+=
j;}}printf(“\n\n average=%4.2f”,aver/n);}
45 、用筛选法可得到2~n(n<10000)之间所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删去
( 把数表中相应位置的值置成0);接着从数表中找下一个非0数,并从数表中删去该数的所有倍数,以此类推,直到所找的下一个数等于n为止,这样会得到一个序列:2,3,5,7,11,13,17,19,23-----
Int fun(int n)
{int a[10000],i,j,count=0;
for(i=2;i<=n;i++)a[i]=i;i=2;
While(i<n){for(j=a[i]*2;j<=n;j+=a[i])a[j]=0;i++;while(a[i]= =0)i++;}printf(“”);
For(i=2;i<=n;i++)if(a[i]!=0){count++;printf(---);}
46、判断一个数是否为素数,该数是素数时,函数返回字符串:”yes!”,否则返回”no!”
Char *fun(int n)
{int i,m;m=1;
for(i=2;i<=n;i++)if(n%i= =0){m=0;break;}if(m= =1&&n>1)1)return (“yes!”);else return (“no!’);}
47、寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组bb中,函数返回素数的个数。例如,输入6和21,则输出为:7,11,13,17,19,21.
Int fun(int n,int m,int bb[N])
(int i ,j,k=0,flag; for(j=n;j<=m;j++){flag=1;for(i=2;i<j;i++)if(j%i= =0){flag=0;break;}if(flag= =1)bb[k++]=j;}return k;)
48、甲乙丙丁四人同时开始放鞭炮,甲每隔t1秒放一次,乙每隔t2秒放一次,丙每隔t3秒放一次,丁每隔t4秒放一次,每人各放n次。函数fun的功能根据形参提供的值,求出总共听到多少次鞭炮声作为函数值返回。注意,当几个鞭炮同时炸响只算一次响声,第一次响声是在第0秒。例如,若t1=7,t2=5,t3=6,t4=4,n=10,则总共可听到28次鞭炮声。
#difine ok(i,t,n) ((i%t= =0)&&(i/t<n))
Int fun(int t1,int t2,int t3,int t4,int n)
{int count ,t,maxt=t1;if(maxt<t2)maxt=t2; if(maxt<t3)maxt=t3; if(maxt<t4)maxt=t4;count=1;
for(t=1;t<maxt*(n-1);t++){if(ok(t,t1,n))|| if(ok(t,t2,n))|| if(ok(t,t3,n))|| if(ok(t,t4,n))count++;}return count;}
49、从三个形参a,b,c中找出中间的那个数,作为函数值返回。例如,当a=3,b=5,c=4时中数为4.
int fun(int a,int b,int c)
{int t;t=(a>b)?(b>c)?b:a>c?c:a))((a>c?a:((b>c?c:b));return t;}
二、数组题
50、删除w数组中下标为k的元素中的值。
arrout(int *w,int m)
{int k;for(k=0;k<m;k++)printf(“%d”,w[k]);prntf(----);}
arrdel(int *w,int n,int k)
{int i;for(i=k;i<n-1;i++)w[i]= w[i+1];n--;return n;}
getindex(int n)
{int i;do{printf(“\nenter the index[0<=i<%d]:”,n);scanf(“%d”,&i);}while(i<0||i>n-1);return i;}
51、从数组xx中找出个位和百位的数字相等的所有无符号整数,结果保存在数组yy中,其个数由函数fun返回。当xx[8]={135,78,72,32,222,424,333,141,541}时,bb[6]={787,232,222,424,333,141}.
int fun(int xx[],int bb[],int num)
{int i,n=0;int g,b;for(i=0;i<num;i++){g=xx[i]%10;b=xx[i]/100;if(g= =b)bb[n++]=xx[i];}return n;}
52、从键盘输入一组无符号整数并保存在数组xx[N]中,以整数0结束输入,要求这些数的最大位数不超过4位,编写函数从数组xx中找出个位和十位的数字之和大于5的所有无符号整数,结果保存在数组yy中,个数由函数fun返回。当xx[8]={123,11,25,222,42,333,14,5451}时,bb[4]={25,42,333,5451}.
Int fun(int xx[],int bb[],int num)
{int I,n=0;int g,s;for(i=0;i<num;i++){g=xx[i]%10;s=xx[i]/10%10;if((g+s)>5)bb[n++]=xx[i];}return n;}
53、求一维数组x[N]的平均值,并对所得结果进行四舍五入(保留两位小数)。例如:当x[10]={15.6,19.9,16.7,15.2,18.3,12.1,15.5,11.0,10.0,16.0},结果为:avg=15.030000.
Double fun(double x[10])
{int i;long t;double avg=0.0;double sum=0.0;for(i=0;i<10;i++)sum+=x[i];avg=sum/10;avg=avg*1000;t=(avg+5)/10;
avg=(double)t/100;return avg;}
54、求出能够整除x且不是偶数的各整数,并放在数组pp中,这些除数的个数由n返回。例如,若x的值为30,则有四个数符合要求,它们是1,3,5,15.
Void fun(int x,int pp[],int *n)
{inti,j=0;for(i=1;i<=x;i+=2)if((x%i)= =0)pp[j++]=i;
*n=j;}
Main()
{int x,aa[1000];n,i;printf(---);scanf(“%d”,&x);fun(x,aa,&n);for(i=0i<n;i++)printf(“%d”,aa[i]);printf(“\n”);}
55、求能够整除x且是偶数的数,把这些数保存在数组bb中,并按从大到小的数序输出。当x=20时,依次输出20,10,4,2.
Void fun(int k,int bb[])
{int i;int j=0;for(i=1;i<=k;i++){if(k%i= =0&&i%2= =0)bb[j++]=i;}printf(“\n\n”);for(i=--j;i>=0;i--)printf(“%d”,bb[i]);}
56、在主函数中,从键盘输入若干个数放入数组x中,用0结束输入但不计入数组。编写函数:输出数组元素中小于平均值的元素。例如:数组中的值依次1,2,2,12,5,15则程序的运行结果为1,2,2,5
Void fun(int x[],int n)
{double sum=0.0;double average=0.0;int i=0;for(i=0;i<n;i++)sum+=x[i];average=sum/n; for(i=0;i<n;i++)if(x[i]<average)
{if(i%5= =0)printf(“\n”;printf(“%d”,x[i]);}}
57、将n个人员的考试成绩进行分段统计,考试成绩放在a数组中,各分段的人数存放b数组中:成绩为60到69的人数
存放到b[0]中,成绩为70到79的人数存放到b[1]中,------,成绩为60分以下的人数存到b[5]中,当a数组中的数据
为:93,85,77,68,59,43,94,75,98。调用函数后,b数组中存放的数据是:1,2,1,3,0,2
void fun(int a[],int b[],int n)
{int i;for(i=0;i<6;i++)
b[i]=0; for(i=0;i<n;i++)
if(a[i]<60)b[5]++;else b[(a[i]-60)/10]++;}
main()
{inti,a[100]={---},b[6];fun(a,b,9);printf(----);for(i=0;i<6;i++)printf(“%d”,b[i]);printf(“\n”);}
58、对a数组中n个人员的工资进行分到统计,各段的人数存到b数组中:工资为1000以下的人数存到b[0]中,工资为1000到1999的人数存到b[1]中,-----。
Void fun(int a[],int b[],int n)
{inti;for(i=0;i<6;i++)b[i]=0;for(i=0;i<n;i++)if(a[i]>=5000)b[5]++;else b[a[i]/100]++;}
Main()
{inti,a[100]={---},b[6];fun(a,b,9);printf(“the result is:”); for(i=0;i<6;i++)printf(“%d”,b[i]);printf(“\n”);}
59、从键盘输入学生的成绩,统计各分数段学生的人数,A类为90~100分,B类为80~90,------,当成绩为0时结束成绩输入,例如:输入89,99,45,64,56,78,88,74,66,55,0是结果为A:1,B:2,C:2,D:2,E:3
Main()
{float score[N];int bb[5];int grade,i=-1,n=0;char ch=’A’;printf(---);do{i++;n++;printf(“score[%d]=”,i);scanf(“%f”,&score[i]);}
While(score[i]!=0);for(i=0;i<5;i++)bb[i]=0; for(i=0;i<n-1;i++){grade=score[i]/10;switch(grade){case 10:case 9:bb[0]++;
Break; case 8:bb[1]++;break; case 7:bb[2]++;break; case 6:bb[3]++;break;default :bb[4]++;}}
for(i=0;i<5;i++)printf(“\n%c:%d”,ch+i,b[i]);}
60、删去一维数组所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数,例如:若一维数组中的数据是:1,1,1,2,2,2,3,4,4,5,5,6,6,7,7,8,9,9,10,10,删除后的内容应该是:1,2,3,4,5,6,7,8,9,10
Int fun(int a[],int n)
{int i,t,j=0,t=a[0];for(i=1;i<n;i++)if(t= =a[i]);else {a[j++]=t;t=a[i];}a[j++]=t;return j;}
61、将形参a所指数组中的前半部分元素中的值和后半部分元素中的值对换,形参n中存放数组中数据的个数,若n为
奇数,则中间的元素不动,例如:1,2,3,4,5,6,7,8,9,则调换后为:6,7,8,9,5,1,2,3,4
Void fun(int a[],int n)
{int i,t,p;p=(n%2= =0)?n/2:n/2+1;for(i=0;i<n/2;i++){t=a[i];a[i]=a[p+i]; a[p+i]=t;}}
62、从键盘输入一组整数,使用条件表达式找出最大的整数,例如:1,2,3,5,4,0时,最大的数为:5.
Main()
{int num[N];int i=-1;int max=0;printf(---);do{i++;printf(“num[%d]=”,i);scanf(“%d”,&num[i]);max=max<num[i]?num[i]:max}
While(num[i]!=0);printf(“max=%d\n”,max);}
63、把a数组中的n个数,和b数组中逆序的n个数一一对应相乘、求平方,结果保存在c数组中。例如:当a数组中的值是:1,3,5,7,8,b数组中的值是:2,3,4,5,8,调用该函数后,c中存放的数据是:64、225、400、441、256.
Void fun(int a[],int b[],int c[],int n)
{inti;for(i=0;i<n;i++)c[i]=(a[i]*b[n-1-i]*(a[i]*b[n-1-i]));}
main()
{inti;a[100]={1,3,5,7,8},b[100]={2,3,4,5,8},c[100];fun(a,b,c,5);printf(----);for(i=0;i<5;i++)
Printf(“%d”,c[i]);printf(“\n’);}
64、在x数组中放入n个采样值,计算并输出方差值。例如n=8,输入:193.199,195.673,195.757-----,结果为1.135901。
Float fun(float x[],int n)
{int j;float xa=0.0,s;for(j=0;j<n;j++)xa+=x[j]/n;s=0; for(j=0;j<n;j++)s+=(x[j]-xa)*(x[j]-xa)/n;return s;}
65、计算并输出给定10个数的方差(公式省略),给定的10个数为:15.0,19.0,16.0,15.0,18.0,12.0,15.0,11.0,10.0,16.0输出为
S=2.758623
double fun(double x[10])
{int i;doble avg=0.0;double sum=0.0;double abs=0.0;double sd;for(i=0;i<10;i++)sum+=x[i];avg=sum/10; for(i=0;i<10;i++)
abs+=(x[i]-avg)* (x[i]-avg);sd=sqrt(abs/10);return sd;}
66、从键盘输入一个下标n,把数组aa中比元素aa[n]小的元素 放在它的左边,比它大的元素放在它的右边,排列成新的数组仍然保存在原数组中。如数组aa={33,67,42,58,25,76,85,16,41,56},若输入3,则结果输出为33,42,25,16,41,56,58,67,76,85.
Void fun(int a[],int n)
{int i,j=0,k=0,t;int bb[N];t=aa[n];for(i=0;i<N;i++){if(aa[i]>t)bb[j++]=aa[i]; if(aa[i]<t)aa[k++]=aa[i];}aa[k++]=t;for(i=0;i<j;i++
K++)aa[k]=bb[i];}
67、交换数组aa中最大和最小两个元素的位置,结果依然保存在原数组中,其它元素位置不变。例如,输入33,67,42,58,25,76,85,16,41,56,则输出33,67,42,58,25,76,16,85,41,56
void fun(int aa[])
{int i,j,t;int max=0,min=0;for(i=0;i<N;i++){if(aa[max]<aa[i])max=i ;if(aa[min]>aa[i])min=i;}t=aa[max];aa[max]=aa[min];
aa[min]=t;}
68、把一维数组中的元素逆置,结果仍然保存在原数组中。
main()
{int i,j,t;int bb[N];for(i=0;i<N;i++)bb[i]=i;printf(---);for(i=0;i<N;i++)printf(“%d”,bb[i]);for(j=0,--i;j<=i;j++,i--){t=bb[j];
bb[j]=bb[i]; bb[i]=t;}printf(---);for(i=0;i<N;i++)printf(“%4d”,bb[i]);}
69、把形参a所指数组中的奇数按原顺序一次存放到a[0],a[1],a[2]……中,把偶数从数组中删除,奇数个数通过函数值返回。例如:若a所指数组中的数据最初排列为:9,1,4,2,3,6,5,8,7,删除偶数后a所指数组中的数据为:9,1,3,5,7,返回值为5.
void fun(int a[],int n)
{int i,j;j=0;for(i=0;i<n;i++)if(a[i]%2= = 1){a[j]=a[i];++j;return j;}}
70、把数组aa中的奇数元素按原来的先后顺序放在原数组后面。例如:输入33,67,42,58,25,76,85,16,41,56,则输出42,58,76,16,56,33,67,25,85,41.
void fun(int aa[])
{int i,j=0,k=0;int bb[N]; for(i=0;i<N;i++){if(aa[i]%2! = 0)bb[k++]=aa[i];else aa[j++]=aa[i];for(i=0;i<k;i++,j++)aa[j]=bb[i];}
71、把数组aa中元素下标为奇数的元素按从大到小的顺序重新保存在原数组中其他元素位置不变。例如:若输入33,67,42,58,25,76,85,16,41,56。则输出结果为:33,76,42,67,25,58,85,56,41,16.
void fun(int aa[])
{int i,j,t;for(i=1;i<N;i=i+2){for(j=i;j<N;j=j+2)if(aa[i]<aa[j]){t=aa[j];aa[j]= aa[i]; aa[i]=t;}}}
72、把数组aa中下标为偶数的元素按从小到大的顺序重新保存在原数组中,其它元素位置不变。例如输入:33,67,42,58,25,76,85,16,41,56,则输出结果为;25,67,33,58,41,76,42,16,85,56
void fun(int aa[])
{inti,j,t;for(i=0;i<N;i=i+2){ for(j=i;j<N;j=j+2) if(aa[i]>aa[j]){t=aa[j];aa[j]= aa[i]; aa[i]=t;}}}
73、把数组aa中的偶数元素按原来的先后顺序放在原数组后面,例如:输入33,67,42,58,25,76,85,16,41,56。则输出结果为:33,67,25,85,41,42,58,76,16,56
void fun(int aa[])
{int i,j=0,k=0;int bb[N]; for(i=0;i<N;i++){if(aa[i]%2= = 0)bb[k++]=aa[i];else aa[j++]=aa[i];for(i=0;i<k;i++,j++)aa[j]=bb[i];}
74、逆置数组元素中的值,若a所指数组中的的数据一次为1,2,3,4,5,6,7,8,9,则逆置后一次为:9,8,7,6,5,4,3,2,1.
void fun(int aa[],int n)
{int i,j;for(i=0;i<n/2;i++)
{t=a[i]; a[i]= a[n-1-i]; a[n-1-i]=t;}}
75、求100(不包括100)以内能被2或5整除,但不能同时被2或5整除的自然数。结果保存在数组bb中,函数fun返回数组bb元素的个数。
Int fun(int bb[])
{int i,j;for(i=1,j=0;i<100;i++)if((i%2!=0&&i%5= =0)||( i%2= =0&&i%5! =0))bb[j++]=i;return j}
76、如果数组aa的前一个元素比后一个元素小,则把它保存在数组,bb中并输出,若输入40,51,62,33,35,52,48,95,66,73,则结果输出40,51,33,35,48,66。
Main()
{int I,n=0;int aa[N]={----};int bb[N];for(i=0;i<N-1;i++)if(aa[i]<aa[i+1])bb[n++]=aa[i];printf(---);for(i=0;i<n;i++)
printf(“bb[%d]=%2d”,i,bb[i]);}
77、把1—100间的所有素数保存在数组aa中,输出这些素数并计算它们的和。
main()
{int n,i,j,k,flag,sum;int aa[50];sum=0;k=0;for(i=2;i<100;i++){flag=1;for(j=2;j<i&&flag;j++)if(i%j= =0){flag=0;}if(flag){
Sum=+i;aa[k++]=i;}}printf(---);for(i=0;i<k;i++){if(i%10= =0)printf(“\n’);printf(“%4d”,aa[i]);}printf(“\nsum=%d’,sum);}
78、把一个整数插入到一个已经按从小到大排序的数组中,插入后数组仍然有序。例如:在数组bb[N]={12,23,31,44,51,63,71,79,85,95}中插入93,结果为:bb[N](11,21,31,41,51,61,71,79,81,93,95)
main()
{int i,j;int n;int bb[N+1]={----};printf(---);scanf(“%d’,&n);prinf(“\n%d’,n);printf(---);for(i=0;i<N;i++){if(n<=bb[i])
{for(j=N;j>i;j--)bb[j]=bb[j-1];bb[j]=n;break;}}if(i= =N)bb[i]=n;printf(---);for(i=0;i<N+1;i++)prinf(“%4d”,bb[i]);}
79、计算x所指数组中N个数的平均值,平均值通过形参返回主函数,将小于平均值且最接近平均值的数作为函数值返回,在主函数中输出,例如:有10个正数:46,30,32,40,6,17,45,15,48,26,平均值为30.5主函数中输出:m=30.0
double fun(double x[],double *av)
{int i,j;double d,s;s=0;for(i=0;i<N;i++)s=s+x[i];*av=s/ N;d=32767;for(i=0;i<N;i++)if(x[i]<*av&&*av-x[i]<=d)
{d=*av-x[i];j=i;}return x[j];}
80、计算形参x所指数组中N个数的平均值作为函数返回;并将大于平均值的数放在形参y所指数组中,在主函数中输出。例如:有10个正数:46,30,32,40,6,17,45,15,48,26,平均值为30.5,主函数中输出:46,32,40,45,48
double fun(double x[],double *y)
{ int i,j;double av;av=0; for(i=0;i<N;i++)av=av+x[i]/N; for(i=j=0;i<N;i++)if(x[i]>av)y[j++]=x[i] ;y[j]= -1;return av;}
81、计算形参x所指数组中N个数的平均值,将所指数组中大于平均值的数据移至数组的前部,小于等于平均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。例如有10个整数:46,30,32,40,6,17,45,15,48,26,平均值为30.5,移动后的输出为46,32,40,45,48,30,6,7,15,26.
double fun(double *x)
{ int i,j;double s, av,y[N];s=0; for(i=0;i<N;i++)s=s+x[i];av=s/N; for(i=j=0;i<N;i++)if(x[i]>av){y[j++]=x[i];x[i]= -1;}
for(i=0;i<N;i++)if(x[i]!= -1) y[j++]=x[i]; for(i=0;i<N;i++)x[i]=y[i];return av;}
82、计算形参x所指数组中N个数的平均值作为函数返回;将小于平均值的数放在数组的前部,平均值作为函数返回,例如有10个整数:46,30,32,40,6,17,45,15,48,26,平均值为30.5,主函数输出为:30,6,17,15,26,46,32,40,45,48
double fun(double *x)
{ int i,j;double av,y[N];av=0; for(i=0;i<N;i++) av+=x[i]/N; for(i=j=0;i<N;i++)if(x[i]<av){y[j]=x[i];x[i]= -1;j++;}j=0;
While(i<N){if(x[i]!= -1) y[j++]=x[i];i++;} for(i=0;i<N;i++)x[i]=y[i];return av;}
83、计算scroe中m个人的平均成绩aver,将低于aver的成绩放在below中,通过函数名返回人数。当scroe={10,20,30,40,50,60,70,80,90},m=9时,函数返回的人数应该是4,below={10,20,30,40}。
Int fun(int score[],int m,int below[])
{int i,j=0;float aver=0.0;for(i=0;i<m;i++)aver+=score[i];aver/=(float)m; for(i=0;i<m;i++)if(score[i]<aver)below[j++]=score[i];
return j;}
main()
{int i,b,below[9];int score[9]={----};n=fun(score,9,below);printf(----);for(i=0;i<n;i++)printf(“%d”,below[i]);}
84、计算每个学生成绩的平均分,例如当scroe[N][M]={83.5,82,86,65,67},{80,91.5,84,99,95},{90.5,95,86,95,97}时,三个学生的平均分为:76.7,89.9,92.7
main()
{int i,j;static float score[N][M]={---};float bb[N];clrscr();for(i=0;i<N;i++)bb[i]=0; for(i=0;i<N;i++){ for(j=0;j<M;j++)
bb[i]+=score[i][j];bb[i]/=M;} for(i=0;i<N;i++)printf(“\nstudent%d\taverage=%5.1f”,i+1,bb[i]);}
85、把形参a所指数组中的最小值放在元素a[0]中,接着把形参a所指数组中的最大值放在a[1]元素中;再把a所指数组中的次小值放在a[2]中,把a所指数组中的次大值放在a[3];其余以此类推。例如:若a所指数组中的数据最初排列为:9,1,4,2,3,6,5,8,7;则按规则移动后数据排列为:1,9,2,8,3,7,4,6,5.
void fun(int a[],int n)
{inti,j,max,min,px,pn,t;for(i=0;i<n-1;i+=2){max=min=a[i];px=pn=i;for(j=i+1;j<n-1;j++){if(max<a[j]){max=a[j];px=j;} if(min>a[j]){min=a[j];pn=j;}}if(pn!=i){t=a[i];a[i]=min;a[pn]=t;if(px= =i)px=pn;}if(px!=i+1){t=a[i+1]; a[i+1]=max;a[px]=t;}}}
86、把数组bb中的数按从小到大的排列,若输入2,3,5,4,1,则结果为:1,2,3,4,5.
Void fun(int bb[],int n)
{int i,j,t;for(i=0;i<n;i++)f
or(j=0;j<n-1;j++)if(bb[j]>bb[j+1]){t=bb[j]; bb[j]= bb[j+1]; bb[j+1]=t;}}
87、从数组xx中找出个位和百位的数字相等的所有无符号整数,结果保存在数组yy中,其个数由函数fun返回。例如:当xx[8]={1111,2413,2321,2222,4245,3333,1414,5335}时,bb[6]={1111,2321,2222,4245,3333,1414}。
int fun(int xx[],int bb[],int num)
{int i,n=0;int g,b;for(i=0;i<num,i++){g=xx[i]%10;b=xx[i]/100%10;if(g= =b)bb[n++]=x[i];}return n;}
88、调用随机函数产生20个互不相同的整数,放在形参a所指数组中(此数组在主函数中已置0)
Void fun(int *a)
{int i,x,n=0;x=rand()%20;
while(n<N){for(j=0;j<n;j++)if(x= =a[i])break;if(i= = n){a[n]=x;
n++;}x=rand()%20;}}
89、计算NXN维矩阵元素的方差,结果由函数返回。例如:A= ---,S= ---的计算结果是14.414 -----
double fun(int a[][N],int n)
{int i,j;int k;double s=0.0;double sd=0.0;for(i=0;i<n;i++) for(j=0;j<n;j++)s+=a[i][j];aver=s/(n*n); for(i=0;i<n;i++)
for(j=0;j<n;j++)f+=(a[i][j]-aver)* (a[i][j]-aver);f/=(n*n);sd=sqrt(f);return sd;}
90、按行统计NXN维矩阵元素中的最大值,并把这些值按从小到大的顺序保存在数组b中。
Void fun(int a[][N],int b[],int n)
{ int i,j;int t;
for(i=0;i<n;i++) for(j=0;j<n;j++)if(b[i]<a[i][j]) b[i]=a[i][j]; for(i=0;i<n;i++) for(j=0;j<n;j++)if(b[i]<b[j])
{t=b[i];b[i]=b[j];b[j]=t;}}}
91、计算一个NXN矩阵的周边元素平均值。当N=4时:平均值为3.917。a= -----
double fun(int a[][N],int n)
{ int i,j;int k;double s=0.0;double aver=0.0;printf(---);for(i=0;i<n;i++) {for(j=0;j<n;j++){a[i][j]=rand()%10;printf(“%d”,a[i][j]);
if(i= = 0 || i= =n-1|| j= =0 || j= =n-1)s+=a[i][j];
}printf(“\n’);}k=4*n-4;aver=s/k;return aver;
92、输出一个NXN矩阵,对非对角线上 的元素赋值为0,对角线元素赋值为1.
Main()
{int bb[N][N],int i,j,n;printf(---);scanf(“%d”,&n); for(i=0;i<n;i++) for(j=0;j<n;j++){b[i][j]=0;if(i= =j) b[i][j]=1; if(j= =n-1-i)
b[i][j]=1;------}}
93、计算3名学生的平均成绩。例如:当scroe[N][M] ={83.5,82,86,65,67},{80,91.5,84,99,95},{90.5,95,86,95,97}时,五门学科的平均分为84.5,89.5,85.3,86.3,86.3.
main()
{int i,j;static float score[N][M]={---};bb[N];clrscr();for(i=0;i<M;i++)
bb[i]=0.0; for(i=0;i<N;i++){ for(j=0;j<M;j++)
bb[j]+=score[i][j]; } for(i=0;i<M;i++)printf(“\nstudent%d\taverage=%5.1f”,i+1,bb[i]/N);return 0;}
94、输出一个NXN矩阵,要求非周边元素赋值0,周边元素赋值1.
main()
{int bb[N][N];int i,j,n;clrscr();printf(----);scanf(“%d”,&n); for(i=0;i<n;i++) for(j=0;j<n;j++){if(i= =0 ||i= =n-1||j= =0|| i= =n-1)
bb[i][j]=1;else bb[i][j]=0;} for(i=0;i<n;i++){----} for(j=0;j<n;j++)printf(“%4d”,bb[i][j]);}}
95、输出一个3X3的矩阵,要求必须使用行指针表示输出变量。
main()
{static int array[3][3]={----};int (*p)[3],j,i;p=array;for(i=0;i<3;i++){printf(“\n\n”) ; for(j=0;j<3;j++) printf(“%4d”,*(*(p+i)+j);}}
96、根据形参m(2≤m≤9),在二维数组中存放一张m行m列的表格。例如输入2则输出为:---,若输入4:----
fun(int a[][M],int m)
{int j,k;for(j=0;j<m;j++) for(k=0;k<m;k++)a[j][k]=(k+1)*(j+1);}
Main()
{int i,j,n;printf(---);scanf(“%d”,&n);fun(a,n) for(i=0;i<n;i++); for(j=0;j<n;j++) printf(“%4d”,a[i][j]);printf(“\n”);}
97、实现矩阵(3行3列)的转置(即行列互换)。例如输入下面的矩阵:100 200 300
400 500 600
700 800 900
程序输出: 100 400 700
200 500 800
300 600 900
int fun(int array[3][3])
{int i,j;
int arr[3][3]={--}; memcpy(arr,array,9*sizeof(int)) for(i=0;i<3;i++) for(j=0;j<3;j++)array[i][j]=arr[j][i];}
Main()
{int i,j;int array[3][3]={---}; for(i=0;i<3;i++) {for(j=0;j<3;j++)printf(“%7d”, array[i][j]);printf(“\n”);}
fun(array);printf(---);for(i=0;i<3;i++) {for(j=0;j<3;j++)printf(“%7d”, array[i][j]);printf(“\n”;)}}
98、有NXN矩阵,根据给定的m(m<=N)值,将每行元素中的值均右移m个位置,左边置为0.例如,N=3,m=2,有下列矩阵
1 2 3
4 5 6
7 8 9
程序执行结果为:
0 0 1
0 0 4
0 0 7
Void fun(int (*t)[N],int m)
{int i,j;for(i=0;i<N;i++){ for(j= N-1-m;j>=0;j--)
t[i][j+m]= t[i][j];for
(j=0;j<m;j++) t[i][j]=0;}}
99、将a所指4*3的矩阵中第k行的元素与第0行的元素交换。例如有如下矩阵: 1 2 3
4 5 6
7 8 9
10 11 12
若k为2,程序执行结果为:7 8 9
4 5 6
1 2 3
10 11 12
Void fun(int (*a)[N],int k)
{int i,temp; for(i=0;i<N;i++)temp=a[0][i]; a[0][i]= a[k][i]; a[k][i]=temp;}}
100、将NXN矩阵中元素的值按列右移1个位置,右边被移出矩阵的元素绕回左边。例如,N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
计算结果为: 3 1 2
4 5 6
9 7 8
Void fun(int (*t)[N])
{int i,j,x; for(i=0;i<N;i++){x=t[i][N-1];for(j=N-1;j>0;j++) t[i][j]= t[i][j-1]; t[i][0]=x;}}
101、有NXN矩阵,将矩阵的外围元素顺时针逆转。操作顺序是:首先将第一行元素的值存入临时数组r,然后使第一列成为第一行,最后一行成为第一列,最后一列成为第一行,临时数组中的元素成为最后一列。例如,若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
计算结果为: 7 4 1
8 5 2
9 6 3
Void fun(int (*t)[N])
{int j,r[N]; for(j=0;j<N;j++) r[j]= t[0][j]; for(j=0;j<N;j++) t [0] [N-j-1] = t[j][0]; for(j=0;j<N;j++)t[j][0]=t[N-1][j];
for(j=N-1;j>=0;j--) t[N-1][ N-1-j]= t[j][ N-1]; for(j=N-1;j>=0;j--) t[j][ N-1]=r[j];}
102、将NXN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换。例如,若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
交换后为:3 2 1
5 6 4
8 7 9
Void fun(int t[][N],int n)
{int i,s; for(i=0;i<n;i++){s=t[i][i]; t[i][i]= t[i][n-i-1]; t[i][n-i-1]=s;}}
103、计算NXN矩阵主对角线元素和反向对角线元素之和,并作为函数值返回。例如:若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
函数首先累加1、5、9,然后累加3、5、7函数的返回值为30.
Void fun(int t[][N],int n)
{int i,sum;sum=0;for(i=0;i<n;i++)sum+=t[i][i]; for(i=0;i<n;i++)sum+=t[i][n-i-1];return sum;}
104、建立一个NXN矩阵,矩阵元素的构成规律是:最外层元素的值全部为1,从外向内第2层元素的值全部为2,第3层元素的值全部为3,……以此类推。例如,若N=5,生成的矩阵为: 1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
Void fun(int (*a)[N])
{int i,j,k,m;if(N%2==0)m=N/2;else m=N/2+1;for(i=0;i<m;i++){for(j=i;j<N-1;j++)a[i][j]= a[N-i-1][j]=i+1;
For(i=i+1;k<N-I;k++)a[k][i]= a[k][N-i-1]=i+1;}}
105、在3X4的矩阵中找出在行上最大、在列上最小的那个元素,若没有符合条件的元素则输出相应信息。例如:
1 2 13 4
7 8 10 6
3 5 9 7
程序执行结果为:9
Void fun(int (*a)[N])
{int i=0,j,find=0,rmax,c,k;while((i<M)&&(!find)){rmax=a[i][0];c=0; for(j=1;i<N;j++)if(rmax<a[i][j]){ rmax=a[i][j];c=j;}
Find=1;k=0; while((k<M)&& find){if(k!=i&&a[k][c]<=rmax)find=0;k++;}if(find)printf(“--”,i,c,a[i][c]);i++;}if(!find)-----}
106、有NXN矩阵,以主对角线为对称线,对称元素相加并将结果存放在左下三角元素中,右上三角元素为0. 例如:若N=3,有下列矩阵:
1 2 3
4 5 6
7 8 9
计算结果为:1 0 0
6 5 0
8 14 9
Void fun(int (*t)[N])
{int i,j;for(i=1;i<N;i++){for(j=0;j<i;j++){t[i][j]= t[i][j]+ t[j][i]; t[j][i]=0;}}}
107、找出NXN矩阵中每列元素中的最大值,并按顺序存放于形参B所指的一维数组中。
Void fun(int (*a)[N],int *b)
{int i,j; for(i=0;i<N;i++){b[i]=a[0][i];for(j=0;j<i;j++)if(b[i]<a[j][i]) b[i]=a[j][i];}
main()
{int x[N][ N] ={----};y[N];I,j;printf(---);for(i=0;i<N;i++) {for(j=0;j<N;j++)printf(“%4d”, x[i][j]); printf(“\n”);}fun(x,y);
Printf(---);for(j=0;j<N;j++) printf(“%3d”, y[j]); printf(“\n”);}
108、判定形参a所指的NXN(规定N为奇数)的矩阵是否是“幻方”,若是函数返回值为1,不是函数值返回为0. “幻方”的判定条件是:矩阵每行每列主对角线及反对角线上元素之和都相等。例如一下3X3的矩阵就是一个“幻方”。
4 9 2
3 5 7
8 1 6
int fun(int (*a)[N])
{int I,j,m1,m2,row,colum;m1=m2=0; for(i=0;i<N;i++){j=N-i-1;m1+=a[i][i]; m2+=a[i][j];}if(m1!=m2)return 0;
for(i=0;i<N;i++){row=colum=0; for(j=0;j<N;j++){ row+= a[i][j]; colum+= a[j][i];}if(row!=colum)||(row!=m1)}return 0;}
return 1;}
109、将a所指3X5矩阵中第K列的元素左移到第0列、第K列以后的每列元素一次绕到右边。例如有一下矩阵:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
若K为2,顺序执行结果为:3 4 5 1 2
3 4 5 1 2
3 4 5 1 2
void fun(int (*a)[N],int k)
{int i,j,p,temp;for(p=1;p<=k;p++) for(i=0;i<M;i++){temp= a[i][0]; for(j=0;j<N-1;j++) a[i][j]= a[i][j+1]; a[i][N-1]=temp;}}
三、字符题
110、依次取出字符串中所有的小写字母以形成新的字符串,并取代原字符串。
void fun(char *s)
{int i=0; char *p=s;while(*p){if(*p>=’ a’&&*p<=’ z’)s[i]=*p;i++;}p++;}s[i]=’\0’;}
111、把字符串str中的数字字符转换成数字并存放到整型数组bb中,例如:str=“Bcd123e456hui890”,结果为:123456890.
int fun(char s[],int bb[],int num)
{int I,n=0;for(i=0;i<num;i++){if(s[i]>=’0’&& s[i]<=’9’)} bb[n]= s[i]-’0’;n++;}}return n;}
112、若形参ch中是数字字符“0”—“9”,则“0”转换成“9”,“1”转换成“8,”“2”转换成“7”……,“9”转换成“0”;若是其它字符串则保持不变;并将转换后的结果为函数值返回。
Char fun(char ch)
{if(ch>=’0’&& ch<=’9’)return ‘9’-(ch-‘0’);return ch;}
113、把s串中所有的字母改写成该字母的下一个字母,字母z改写成字母a。大写字母仍为大写字母,小写字母仍为小写字母,其它的字符不变。例如:s串中原有的字符串为:Mn123Zxy,则调用该函数后,s串中的内容为:No.123Ayz。
fun(char *s)
{ char *p=s;while(*p){if(*p= =’ z’)*p=’А’;else if(*p= =’ z’)p=’ a’; else if (isalpha(*p))*p=(*p)+1;p++;}}
114、数组str全由大小写字母字符组成。编写函数:把str中的字母转换成紧接着的下一个字母,如果原来的字母为“z”或“Z”,则相应的转换成“a”或“A”,结果保存在原函数中。例如,若输入“StudentZz”,则输出“TuvefouAa”。
void fun(char s[])
{int i;for(i=0;s[i]!=’\0’;i++){if(s[i]= = ‘z’|| s[i]= = ‘Z’)s[i]-=25;else s[i]+=1;}}
115、给定程序的功能是将大写字母转换为对应小写字母之后的第五个字母;若下写字母为v—z,,使小写字母的值减21。转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换后为小写字母f;若形参是字母W,则转换为小写字母b。
Char fun(char c)
{if(c>=’ A’&& c<=’ Z’)c=c+32; if(c>=’ a’&& c<=’ u’)c=c+5;else if(c>=’ v’&& c<=’ z’)c=c-21;return c;}
Main()
(char c1,c2;printf(---);c1=getchar();if(isupper(c1)){c2=fun(c1);printf(“---”,c1,c2);else printf(---);})
116、将字符串tt中的大写字母都改为对应的小写字母,其它字符不变。例如,若输入“Are you come from sihuan?”,则输入“are you come from sichuan?”。
Char *fun(char tt[])
{int i;for(i=0; tt[i];i++){if((tt[i]>=’A’) &&(tt[i]<=’Z’)) tt[i]+=32;}return (tt);}
117、把一个字符串中的所有小写字母字符全部转换成大写字母字符,其它字符不变,结果保存到原来的字符串中。如,当str[N]=“123 abcdef ABCDEF!”结果输出:“123 ABCDEF ABCDEF!”
Void main()
{int j;char str1[N]=”123abcdef ABCDEF!”;char *pf=str;clrscr();printf(---);puts(str);j=0;while(*(pf+j)){
if(*(pf+j)>=’a’&&*(pf+j)<=’z’){ *(pf+j)= *(pf+j)-32;j++;}else j++;}printf(---);puts(str);system(“pause”); }
118、把从主函数中输入的由数字字符组成的字符串转换成一个无符号长整数,并且逆序输出。结果由函数返回。例如:123456,结果输出654321.
unsignde long fun(char *s)
{ unsignde long t=0;int k;int i=0;i=strlen(s);
for(--i;i>0;i++){k=s[i]-‘0’;t=t*10+k;}return t;}
119、把字符数组str中ASCII码为奇数的小写字母转换成对应的大写字母,结果仍保存在原数组中。若输入“abcdefg”,则输出“ABCDEFG”。
Void fun(char s[])
{int i;for(i=0;s[i]!=’\0’;i++){if(s[i]%2!=0)s[i]-=32;}}
120、把字符数组str中字符下标为奇数的小写字母转换成对应的大写字母,结果扔保存在原数组中。例如:输入“acegikm”则输出“aCeGiKm”。
Void fun(char s[])
{ int i=0;while(s[i]!=’\0’) {if(s[i]%2!=0)s[i]-=32;i++;}}
121、把字符串中的内容逆置。例如:字符串中原有的字符串为abcde,执行后的结果为edcba。
Void fun(char *s)
{ int i=0;n=strlen(s); for(;i<n/2;i++){t=*(s+i); *(s+i)= *(s+n-1-i); *(s+n-1-i)=t;}}
122、把一个整数转换成字符串,并倒叙保存在字符串数组str中。例如:当n=13572468时,str=“86427531”。
Void fun(long int n)
{int i=0;while(n>0){
str[i]=n%10+’0’;n/=10;i++;} str[i]=’\0’;}
123、把从主函数中输入的字符串str2倒置后接在字符串str1后面。例如:str1=“How do”, str2=“?od uoy”,结果输出为“How do you do ”。
void fun(char *str1, char *str2)
{int i=0,j=0,k=0,n;char ch;char *p1=str1; char *p2=str2;while(*(p1+i))i++; while(*(p2+j))j++;n=j--;for(;k<j/2;k++,j--)
{ch=*(p2+k); *(p2+k)= *(p2+j); *(p2+j)=ch;} *(p2+n)=’\0’; for(;*p2;i++)*(p1+i)=*p2++;*(p1+i)=’\0’;}
124、把从主函数中输入的字符串str2接在字符串str1后面。例如:str1=“How do”, str2=“you do ?”, 结果输出为“How do you do ”。
void fun(char *str1, char *str2)
{ int i=0; char *p1=str1; char *p2=str2; while(*(p1+i))i++; for(;*p2;i++)*(p1+i)=*p2++;*(p1+i)=’\0’;}}
125、把字符串str中的字符向前移动一位,原来的第一个字符移动到字符串尾,结果仍保存在原字符串中。例如:输入“how do you do?”,则输出结果为“ow do you do?h”。
Main()
{cha str[N],ch;int i;clrscr();printf(---);gets(str); printf(---);puts(str);ch=str[0];for(i=0;str[i+1];i++) str[i] =str[i+1];str[i]=ch;
printf(---);puts(str);}
126、把字符串str1中下标为偶数的字符保存在字符串str2中并输出。若str1=“cdefghij”,则str2=“cegi”。
Main()
{char str1[LEN],str2[LEN]; char *p1=str1,*p2=str2;int i=0,j=0;clrscr();printf(---);scanf(“%s”,str1); printf(---);while(*(p1+j))
{printf(“%c”,*( p1+j));j++}for(i=0;i<j;i+=2)*p2++=*(str1+i);*p2=’\0’;printf(“the new string is\n”,str2);}
127、从一个字符串中截取前面若干个给定长度的子字符串。例如:当str1=“cdefghij”,然后哦输入4则str2=“cdef”。
Main()
{ charstr1[LEN],str2[LEN]; int n, i;clrscr();printf(---);
gets(str1); printf(---);for(i=0;i<n;i++) str2[i]= str1[i]; str2[i]=’\0’;
printf(“the the new string is\n”,str2);}
128、若形参ch中是小写英文字母,则转换成对应的大写英文字母;若ch中是大写英文字母,则转换成对应的小写英文字母
char fun(char ch)
{if((ch>=’a’)&& (ch<=’z’))return ch-‘a’+’A’;if(isupper(ch))return ch-‘a’+’A’;return ch;}
129、把字符串str中的字符按字符的ASCII码降序排列。例如,如果输入“cdefgh”,则输出为“hgfedc”。
Void fun(char s[],int n)
{int i,j;char ch;for(i=0;i<n;i++) for(j=i;j<n;j++)if(s[i]<s[j]){ch= s[j] ;s[j] = s[i]; s[i]=ch;}}
130、用字符串str2替换字符串str1前面的所有字符。例如,如果输入str1=“abced”, str2=“fk”,则输出“fkced”。
Main()
{charstr1[81],str2[81] ;char*p1=str1,*p2=str2;clrscr();do{printf(---);gets(str1); printf(---);gets(str2);}
while(strlen(str1)< strlen(str2));while(*p2) *p1++=*p2++; printf(---);puts(str1);}
131、判断字符ch是否与串str中的某个字符相同;若相同,什么也不做,若不同则插在串的最后。
Void fun(char *str,char ch)
{while(*str&&*str!=ch)
str++;if(str!=ch)
{str[0]=ch;str[1]=0;}}
Main()
{chars[81],c;printf(----);gets(s); printf(----);c=getchar();fun(s,c); printf(----);}
132、把s串中所有的字符前移一个位置,串中的第一个字符移到最后。若s串中原有的字符串为:Mn.123xyZ,则调用函数后,s串中的内容为:n.123xyZM。
Fun(char *s)
{char b[N];sprintf(b,”%s%c”,
s+1,*s);strcpy(s,b);}
Main()
{char a[N];printf(---);gets(a); printf(---);puts(a);fun(a); printf(---);puts(a);}
133、将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后顺序。例如,形参a所指的字符串为:def35adh3kjsdf7。执行结果为:defadhkjsdf3537。
Void fun(char *s)
{int i,j=0,k=0;char t1[80],t2[80] ; for(i=0;s[i]!=’\0’;i++) if(s[i]>=’0’&& s[i]<=’9’){ t2[j]=s[i];j++;}else t1[k++]=s[i];
t2[j]=0; t1[k]=0; for(i=0;i<k;i++)s[i]=t1[i]; for(i=0;i<j;i++) s[k+i]=t2[i];}
134、将s所指字符串中的所有字母字符顺序前移,其它字符顺序后移,处理后新字符串的首地址作为函数值返回。例如,s所指字符串为:asd123fgh543df,处理后新字符串为:asdfghdf123543。
Char *fun(char *s)
{ int i,j ,k,n;char *p,*t;n=strlen(s)++;t=(char *)malloc(n*sizeof(char)); pt=(char *)malloc(n*sizeof(char));j=0;k=0;
for(i=0;i<n;i++)if(((s[i]>=’a’&&( s[i]<=’z’))|| s[i]>=’A’ &&( s[i]<=’Z’))){ t [j]=s[i];j++;}else {p[k]=s[i];k++;}}
for(i=0;i<k;i++) t [j+i]=p[i];t[j+k]=0;return t;}
135、将s所指字符串中的所有数字字符顺序前移,其它字符顺序后移,处理后新字符串的首地址作为函数值返回。例如,s所指字符串为:asd123fgh##43df, 处理后新字符串为:123543asdfgh##df。
Char *fun(char *s)
{ int i,j ,k,n;char *p,*t;n=strlen(s)+1;t=(char *)malloc(n*sizeof(char)); pt=(char *)malloc(n*sizeof(char));j=0;k=0;
for(i=0;i<n;i++){if(sdigit(s[i])){p [j]=s[i];j++;}else {t[k]=s[i];k++;}}
for(i=0;i<k;i++) p[j+i]=t[i];p[j+k]=0;return p;}
136、将s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动。例如,形参s所指字符串为:abcdefgh,执行结果为:ahcbedgf。
void fun(char *s)
{ int i,j ,k,n;char c;n=0; for(i=0;s[i]!=’\0’;i++)n++;if(n%2= =0)k=n-1;else k=n-2;c=s[k]; for(i=k-2;i>=1;i=i-2)s[i+2]= s[i]; s[1]=c;}
137、对形参s所指字符串中下标为奇数的字符按ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符数组中,形成一个新串。例如,形参s所指的字符串为:baawrskjghzlicda,执行后p所指字符数组中的字符串应为:aachjlsw。
void fun(char *s,char *p)
{ int i,j ,n,x,t;n=0; for(i=0;s[i]!=’\0’;i++)n++; for(i=1;i<n-2;i++){t=i; for(j=i+2;j<n;j+=2)if(s[t]> s[j])t=j;if(t!=i){
x= s[i]; s[i]= s[t]; s[t]=x;for(i=1,j=0;i<n;i=i+2,j++)p[j]=s[i]; p[j]=0;}
138、把形参s所指字符串中最右边的n个字符复制到形参t所指字符数组中,形成一个新串。若s所指字符串的长度小于n,则将整个字符串复制到形参t所指字符数组中。例如,形参s所指字符串为:abcdefgh,n的值为5,程序执行后t所指字符数组中的字符串为:defgh。
void fun(char *s,int n,char *t)
{int len,i,j=0;len=strlen(s)
;if(n>=len)strcpy(t,s);else {for(i=len-n;i<len-1;i++)t[j++]=s[i]; t[j]=’\0’;}}
139、把字符串str转换成任意进制的数,结果保存在数组xx中,由函数返回转换后数组xx的实际长度。其中x表示str原来的进制,y表示要转换成的进制,输入str=“1111”,x=2,y=10,结果输出15,x=10,y=2,结果输出:1111。
Int fun(char *str,int x,int y)
{int sum;int i=0;char *p=str; for(i=0;i<N;i++)xx[i]=0;sum=*p-‘0’;p++;while(*p){ sum=sum*x+*p-‘0’;p++;}i=0;while(sum!=0) {
xx[i]=sum%y;sum=sum/y;i++;}return i;}
140、字符串str由数字字符0和1组成(长度不超过8个字符),可看作二进制数,编写函数:把str字符串转换成十进制数,结果由函数返回。例如,输入“1001”,结果输出:9。
Int fun(char *str)
{int n;char *p=str;n=*p-‘0’;p++;while(*p){n=n*2+*p-‘0’;p++;return n;}}
141、找出形参s所指字符串中出现频率最高的字母(不区分大小写),并统计其出现的次数。例如,形参s所指字符串为abcAbsantrless,程序执行后的输出结果为:letter“a”:3 times letter “s”:3 times。
void fun(char *s)
{int k[26]={0},n,i,
max=0;char ch;while(*s)
{if(isalpha(*s)){ch=tolower(*s);n=ch-‘a’;k[n]+=1;}s++;if(max<k[n]) max=k[n];
printf(---);for(i=0;i<26;i++)if(k[i]= =max) printf(---);}}
142、按0到9统计一个字符串中的奇数数字字符各自出现的次数,结果保存在数组num中。若输入“x=112385713.456+0.909*bc”。则结果为1=3,3=2,5=2,7=1,9=2.
Void fun(char *tt,int num[])
{int i,j;int bb[10];char *p=tt; for(i=0;i<10;i++){num[i]=0;bb[i]=0;}while(*p){if(*p>=’0’&&*p<=’9’)bb[*p-‘0’]++;p++;}
for(i=1,j=0;i<10;i=i+2,j++)num[j]=bb[i];}
143、从字符串str中取出所有数字字符,并分别计算,然后把结果保存在数组b中并输出,把其它字符串保存在b[10]中。例如:当str=“ab123456789cde090”时,即诶过为:0:1,1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1,9:2,other character:5。
main()
{int i,b[11];char *str=”ab123456789cde090”;char *p=str;clrscr();printf(----);puts(str);for(i=0;i<11;i++)b[i]=0;
While(*p){switch(*p){case’0’:b[0]++;break; case’1’:b[1]++;break; case’2’:b[2]++;break; case’3’:b[3]++;break;
case’4’:b[4]++;break; case’5’:b[5]++;break; case’6’:b[6]++;break; case’7’:b[7]++;break; case’8’:b[8]++;break;
case’9’:b[9]++;break;default: b[10]++;}p++;} printf(----);for(i=0;i<10;i++)printf(“\n%d:%d”,i,b[i]);printf(“\nothe character: %d”, b[i]);}
144、统计字符串str中的单词个数,结果有变量num传回,例如:str=“how do you do”,结果为:num=4。
Void fun(char *s,int *num)
{int i,n=0;for(i=0;i<*num;i++){if(s[i]>=’a’&& s[i]<=’z’&&(s[i+1]=’ ‘|| s[i+1]=’ \0‘))n++;}*num=n;}
145、分类统计一个字符串原音字母和其它字母的个数(不区分大小写)。例如,输入aeiouAOUpqrt,结果为A:2,E:1,I:1,0:2,U:2,other:4。
Void fun(char *str,int bb[])
{char *p=str;int i=0;for(i=0;i<6;i++)bb[i]=0; While(*p){switch(*p){case ‘A’: case ‘a’:bb[0]++;break;
case ‘E’: case ‘e’:bb[1]++;break; case ‘I’: case ‘i’:bb[2]++;break; case ‘O’: case ‘o’:bb[3]++;break;
case ‘U’: case ‘u’:bb[4]++;break;default :bb[5]++;}p++;}}
146、从“a”到“z”统计一个字符串中所有字母字符各自出现的次数,结果保存在数组alf中。(不区分大小写,不能使用字符串库函数)。例如,输入:“A=abc+5*c”,结果为:a=2,b=1,c=2。
Void fun(char *tt,int alf[])
{int i;char *p=tt; for(i=0;i<26;i++) alf[i]=0; While(*p) {if(*p>=’A’&& *p <=’Z’)*p+=32; if(*p>=’a’&& *p <=’z’)
Alf*p-‘a’]++;p++;}}
147、查找str中值为x的元素,返回该字符序列中值为x的元素个数,并把这些值为x的元素下标依次保存在数组bb中。例如,在“abcdefahij”中查找“a”,结果为:2个“a”,下标一次为0、6。
Int fun(char *str,char ch)
{int i=0,n=0;char t=ch;char *p=str;while(*p){if(*p= =t)bb[n++]=i;p++;i++;}return n;}
148、str为一个字符序列,序列由字符0和1组成。查找该字符序列中0字符连续出现的最长长度(即0字符的个数),如果有几个0字符串长度相同,只记录最后一个0字符串的相关信息。通过m和k返回最长0字符串的长度和最后0字符的下标。如果输入“01001000”,结果为:0字符串最长长度为3,起始和结尾下标依次为5、7。
Void fun(char *str,int *m,int *k)
{int i,j=0;int bb[N];char *p=str;*m=0;*k=0;for(i=0;i<N;i++)bb[i]=0;i=0; while(*(p+i)){if(*(p+i)= =’0’){ bb[j]++;i++;}else
{j++;i++;}if(*m<=bb[j]){ *m=bb[j];*k=i-1;}}}
149、统计一个长度为n的字符串在另一个字符串出现的次数。若输入的字符串为:asd ascasdfg asd as asd mlosd,子字符串为asd,则应输出4。
Int fun(char *str, char *substr)
{int n;char *p,*r;n=0;while(*str){p=str;r=substr;while(*r)if(*r= =*p){r++;p++;}else break;if(*r= =’\0’)n++;str++;}return n;}
150、返回字符数组中指i定字符的个数。
Int fun(char s[],char ch)
{int i=0,n=0;while(s[i])
{if(s[i]==ch)n++;i++;}
return n;}
151、分别统计字符串中大写字母和小写字母的个数。例如,给字符串ss输入:AaaaBBb123CCccccd则输出结果应为:upper=5,lower=9。
Void fun(char *s,int *a,int *b)
{while(*s){if(*s>=’A’&&*s<=’Z’)(*a)++; if(*s>=’a’&&*s<=’z’)(*b)++;s++;}}
Main()
{char s[100];int upper=0,lower=0;printf(--);gets(s); fun(s,&upper,&lower);printf(“\nupper=%dlower=%d\n”,upper,lower);}
152、对指定字符串在字符串a中出现的次数进行统计,统计的数据存到b数组中。其中:字符“Z”出现的次数存放到b[0]中,字符“Y”出现的次数存放到b[1]中,字符“X”出现的次数存放到b[2]中,字符“W”出现的次数存放到b[3]中,字符“V”出现的次数存放到b[4]中,其它字符出现 的次数存放在b[5]中。例如,当a中的字符串为“AYYZXW1Y+ZWVP”,调用函数后b中存放数据应是:2、3、1、2、1、4。
Void fun(char *a,int b[])
{int i;for(i=0;i<6;i++)
b[i]=0;for(i=0;i<strlen(a);i++)if(a[i]>=’V’&& a[i]<=’Z’)b[4-(a[i]-‘V’)]++;else b[5]++;}
Main()
{int I,b[6];char a[100]={---};fun(a,b);printf(---);for(i=0;i<6;i++)printf(“%d”,b[i]); printf(\n”);}
153、统计形参s所指字符串中数字字符出现的次数,例如,形参s所指的字符串为:abcdef35adgh3kjsdf7。输出结果为:4
Void fun(char *s,int *t)
{int i,n;n=0;for(i=0;s[i]!=NULL;i++) if(a[i]>=’0’&& a[i]<=’9’)n++;*t=n;}
154、将形参s所指字符串中数字字符转换成对应的数值,计算出这些数值的累加和作为函数值返回。例如,形参s所指字符串为abs5def126jkm3,程序执行后的输出结果为:22。
Int fun(char *s)
{int sum=0;while(*s)
{isdigit(*s)sum+=*s-48;s++;}return sum;}
155、按条件删除一个字符串指定字符一半的数目,如果该字符串所包含的指定字符串的个数是奇数,则不予删除,如果其数目是偶数,则删除原字符串后半部分的指定字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,c中存放指定的字符。例如:当a输入“abababa”,c=“a”时b的输出为“ababa”,则b的输出为“ababa”。
Void fun(char a[],char b[],char c)
{int i=0,j=0;int n=0;int m=0;while(a[i]!=’\0’){if(a[i]= =c)n++;i++}i=0;if(n%2){while(a[j]!=’\0’){ b[j]= a[j];j++;}j++;} b[j]=’\0’;
}else { while(a[i]!=’\0’){ b[j++]= a[i]; if(a[i]= =c)m++;if((m>n/2)&&( a[i]= =c))j- -;i++;} b[j]=’\0’;}}
156、只保留字符串中的大写字母,删除其它字符。
void fun(char *s)
{int i=0,j=0;char *p=s;while(*(p+i)){if(*(p+i)>=’A’&&*(p+i)<=’Z’){s[j++]=*(p+i);}i++;}s[i]’\0’;m=j;}
157、把字符串下标能被2或3整除的字符从字符串str中删除,把剩余的字符重新保存在字符串str中。例如,若输入“abcdefghijk”,则输出为“bfh”。
void fun(char s[],int n)
{int i,k;k=0;for(i=0;i<n;i++){s[k++]=s[i];if((i%2= =0)|| (i%3= =0))k--;}s[k]=’\0’;}
158、把字符下标为非素数的字符从字符串str中删除,把字符下标为素数的字符重新保存在字符串str中,例如,输入“abcdefghijkl”,输出“cdfhl”。
void fun(char s[],int n)
{int i,j,k,flag;k=0; for(i=0;i<n;i++){if(i>1) s[k++]=s[i];flag=1;for(j=2;j<I;&&flag;j++)if(i%j= =0){flag=0;k--;}s[k]=’\0’;}}
159、删除字符数组中小于等于指定字符的字符,指定字符从键盘输入,结果仍保存在数组中,例如,输入“abcdefghij”,指定字符为“d”,则结果输出“defghij”。
void fun(char s[],char ch)
{int i=0;j=0;while(s[i]){if(s[i]<ch)i++;else {s[j++]=s[i];i++;} } s[j]=’\0’;}
160、把ASCII码为偶数的字符从字符串str中删除,结果仍然保存在字符串str中,例如,输入abcdef,则输出ace。
void fun(char s[],int n)
{int i,j;j=0;for(i=0;i<n;i++){ if(s[i]%2! =0) s[j++]=s[i]; }s[j]=’\0’;}
161、把ASCII码为奇数的字符从字符串str中删除,结果仍然保存在字符串str中,例如,输入abcdef,则输出bdf。
void fun(char s[],int n)
{inti,j;j=0;for(i=0;i<n;i++)
{ if(s[i]%2= =0) s[j++]=s[i]; }s[j]=’\0’;}}
162、从键盘输入一个字符串及一个指定字符,然后把这个字符串及后面的所有字符全部删除。结果仍然保存在原串中。例如,输入“abcdef”,指定字符为“e”,则输出为“abcd”。
main()
{int i=0;char str[N];char ch;printf(---);gets(str);printf(---);scanf(“%c”,%ch);while(str[i]!=’\0’){if(str[i]= =ch)break;i++;}
str[i] =’\0’; printf(---);puts(str);}
163、把字符串str1中的非空格字符拷贝到字符串str2中。例如,str1=“glad to see you!”,则str2=“gladtoseeyou!”。
main()
{static char str1[N]=”--”;
char str2[N];int i=0,j=0;clrscr();printf(--);puts(str1);while(str1[i]){if(str1[i]!=’ ’)str2[j++]=str1[i];
i++;}printf(---);for(i=0;i<j;i++)printf(“%c”,str2[i]);}
164、把一个二维字符数组每行字符串最大的字符拷贝到字符数组s中。如果str[3]={“dfjh”,“efknls”,“owys”},则s=“hsy”。
main()
{int i=0;char *str[3]={---};char **p;char s[8];p=str;for(i=0;i<3;i++){s[i]=*p[i];while(*p[i]){if(s[i]<*p[i]) s[i]= *p[i];
p[i]++;}}s[i]=’\0’;printf(---);puts(s);}
165、从键盘输入若干字符放到一个字符数组中当按回车键时结束输入,最后输出这个字符数组中的所有字符。
main()
{int i=0;char s[81];char *p=s;printf(--);for(i=0;i<80;i++){s[i]=getchar();if(s[i]= = ‘\n’)break;s[i]=’\0’; printf(--);
While(*p)putchar(*p++);}
166、把一个字符串中的字符(字母)按从大到小排序,并把这个全部由字母组成的字符串保存在原串中,函数返回这个字符串的长度。输入“crxbr2.3”,如果为bcirx,字符串长度为5。
Int fun(char *str)
{int i=0,j=0,k=0,m=0;char t;char *p=str;while(*p) {if((*p>=’A’&&*p<=’Z’)|| (*p>=’a’&&*p<=’z’))*(str+i++)=*p;p++;}
*(str+i)=’\0’;p=str;while(*(p+j)){k=j;m=j;while(*(p+k)){if(*(p+k)<*(str+m)){t=*(str+m); *(str+m)= *(p+k); *(p+k)=t;}k++;} j++;}return i;}
167、从键盘输入一组字符串,以“*”结束输入,并显示出这个字符串。例如,输入abcdefghi*,结果显示abcdefghi。
Main()
{int i= -1;j=0;char str[N];printf(--);do{i++;scanf(“%c”,&str[i]);}while(str[i]!=’*’); printf(--);while(j<i){printf(“%c”,str[j]);j++;}
168、判断一个数是否为回文数。当字符串是回文时,函数返回字符串:yes!否则函数返回字符串:no!,并在主函数中输出。
char *fun(char *str)
{char *p1,*p2;int i,t=0; p1=str; p2=str+strlen(str)-1;for(i=0;i<= strlen(str)/2;i++)if(*p1++!=*p2---){t=1;break;}if(t= =0) return “yes!”;else return “no!”; }
169、判断形参s所指字符串是否为回文,若是函数返回值为1,不是函数返回值为0.
int fun(char *s)
{char *lp,*rp;lp=s;rp=s+strlen(s)-1;while(---){lp++;rp- -;}if(lp<rp)return 0;else return 1;
170、比较字符串str1和str2的大小,并返回比较的结果。例如:当str1=“cdef”, str2=“ced”时,函数返回fun返回“>”。
char *fun(char *str1, char *str2)
{ char *p1=str1,*p2=str2; while(*p1&&*p2){if(*p1<*p2)return “<”; if(*p1>*p2)return “>”;p1++;p2++;}
if(*p1= =*p2)return “ = =”; f(*p1= =’\0’) return “<”;else return “>”}
171、利用指针数组对形参ss所指字符串数组中的字符串按由长到短的顺序排序,并输出结果。Ss所指字符串数组中共有N个字符串,且串长小于M。
Void fun(char (*ss)[M])
{char *ps[N],*tp;int i,j,k;for(i=0;i<N;i++) ps[i] = ss[i]; for(i=0;i<N-1;i++)
{k=i;for(j=i+1;j<N1;j++)if(strlen(ps[k])< strlen(* (ps+j)
)k=j;tp= ps[i];ps[i]=
ps[k];ps[k]=tp;}printf(---);for(i=0;i<N;i++)put(ps[i];)
172、用冒泡法对6个字符串进行排序。
Fun(char *pstr[6])
{int i,j;char *p;} for(i=0;i<5;i++){ for(j=i+1;j<6;j++){if(strcmp(*(pstr+i), *(pstr+j))>0){p=*(pstr+i);pstr[i]= pstr[j];*(pstr+i)=p;}
173、将仅在字符串s中出现而不在字符串t中出现的字符,和仅在字符串t中出现而不在字符串s中出现的字符,构成一个新字符串放在u中,u中的字符按原字符串中字符顺序排序,不去掉重复字符。例如:当s=“112345”,t=“24677”时,u中的字符为“1135677”。
Void fun(char *s, char *t, char *u)
{int i,j,s1,t1;s1=strlen(s);
t1=strlen(t); for(i=0;i<s1;i++){ for(j=0;j<t1;j++)if(s[i]= = t[j])break;if(j>=t1)*u++=s[i];}
for(i=0;i<ts1;i++){ for(j=0;j<s1;j++) if(t[i]= = s[j])break; if(j>=s1)*u++=t[i];}*u=’\0’;}
174、将既在字符串s中出现,又在字符串t中出现的字符形成一个新字符串放在u中,u中的字符按原字符串中字符顺序排序,不去掉重复字符。例如:当s=“122345”,t=“2467”时,u中的字符为“24”。
Void fun(char *s, char *t, char *u)
{int i,j,s1,t1,k,u1=0;
s1=strlen(s);t1=strlen(t); for(i=0;i<s1;i++){ for(j=0;j<t1;j++)if(s[i]= = t[j])break;if(j<t1){for(k=0;k<u1;k++) if(s[i]= = u[k])break; if(k>=u1) u[u1++]=s[i];} u[u1]=’\0’;}
175、将未在字符串s中出现而在字符串t中出现的字符,形成一个新字符串放在u中,u中的字符按原字符串中字符顺序排序,不去掉重复字符。例如:当s=“12345”,t=“2467”时,u中的字符为“67”。
Void fun(char *s, char *t, char *u)
{ int i,j,s1,t1,k,u1=0;s1=
strlen(s);t1=strlen(t); for(i=0;i<t1;i++){ for(j=0;j<s1;j++)if(t[i]= = s[j])break;if(j>=s1)
for(k=0;k<u1;k++) if(t[i]= = u[k])break; f(k>=u1) u[u1++]=t[i];} u[u1]=’\0’;}
176、将在字符串s中出现,而未在字符串t中出现的字符形成一个新字符串放在u中,u中的字符按原字符串中字符顺序排序,不去掉重复字符。例如:当s=“112345”,t=“24677”时,u中的字符为“1135”。
Void fun(char *s, char *t, char *u)
{int i,j,s1,t1;s1=strlen(s);t1=strlen(t); for(i=0;i<s1;i++){ for(j=0;j<t1;j++)if(s[i]= = t[j])break;if(j>=t1)*u++=s[i];}*u=’\0’;}
177、将在字符串s中下标为奇数位置上的字符,紧随其后重复出现一次,放在一个字符串t中,t中字符按原字符串中字符出现的逆序排列。(注意0为偶数)例如:当s中字符串为“1234567”时,则t中字符串应为:“664422”。
void fun(char *s, char *t)
{int i,j,s1;s1=strlen(s);if(s1%2)s1- =2;else s1- -;for(i=s1,j=0;i>=0;i- =2){t[2*j]=s[i]; t[2*j+1]=s[i];i++;} t[2*j]=’\0’;}
178、将在字符串s尾部开始,按逆序把在其中出现的每相邻的两个字符交换位置,并依次把每个字符紧随其后重复出现一次,放在一个字符串t中,例如:当s中字符串为“12345”时,则t中字符串应为:“4455223311”。
void fun(char *s, char *t)
{int i,j,s1;s1=strlen(s); for(i=s1-1,j=0;i>=0;i- =2){if(i-1>=0)t[j++]=s[i-1]; if(i-1> =0)t[j++]=s[i-1]; t[j++]=s[i]; t[j++]=s[i];t[j]= ’\0;}
main()
{char s[100],t[100];printf(---);scanf(“%s”,s);fun(s,t);printf(---);}
179、将在字符串s尾部开始,按逆序把在其中出现的每相邻的两个字符,紧随其后重复出现一次,放在一个字符串t中,若字符串s中头部有剩余的单个字符也重复,放在t的最后。例如:当s中字符串为“1234567”时,则t中字符串应为:“664422”。
void fun(char *s, char *t)
{int i,j,s1;s1=strlen(s); for(i=s1-1,j=0;i>=0;i- =2){if(i-1>=0)t[j++]=s[i-1]; if(i-1> =0)t[j++]=s[i-1]; t[j++]=s[i]; if(i-1> =0)t[j++]=s[i-1];t[j]=’\0’;}
main()
{char s[1000],t[1000];printf(---);scanf(“%s”,s);fun(s,t);printf(---);}
180、将在字符串s中出现,而未在字符串t中出现的字符形成一个新字符串放在u中,u中的字符按原字符串中字符顺序按逆序排列,不去掉重复字符。例如:当s=“112345”,t=“2467”时,u中的字符为“5311”。
Void fun(char *s, char *t, char *u)
{int i,j,s1,t1,u1;char r,*up=u;s1=strlen(s);t1=strlen(t); for(i=0;i<s1;i++){ for(j=0;j<t1;j++)if(s[i]= = t[j])break;if(j>=t1)
*u++=s[i];}*u=’\0’;u1=strlen(up); for(i=0;i<u1/2;i++){r=up[i]; up[i]= up[u1-1-i]; up[u1-1-i]=r;}}
181、把在字符串s中出现的每隔字符,紧随其后重复出现一次,形成一个新串放在t中,且在t中把原相邻字符的位置进行了交换。例如:当s中的字符串为:“12345”时,则t中的字符串应为:“2211443355”。
void fun(char *s, char *t)
{int i,j,s1;s1=strlen(s);for(i=0,j=0;i<s1;i+ =2){if(i+1<s1){t[2*j]=s[i+1]; t[2*j+1]=s[i+1];j++;} t[2*j]=s[i]; t[2*j+1]= s[i];j++;}
t[2*s1]=’\0’;}
main()
{char s[100],t[100];printf(---);scanf(“%s”,s);fun(s,t);printf(---);}
182、求出形参ss所指字符串数组中最长字符的长度,其余字符串左边用字符*补齐,使其与最长的字符串等长。
Void fun(char (*ss)[N])
{int k=0,i,j,n,len;for(i=0;i<M;i++){len=strlen(ss[i]);if(i= =0) n=len;if(len>n){n=len;k=i;}} for(i=0;i<M;i++) if(i! =k){m=n;
len=strlen(ss[i]); for(j=len;j>=0;j--)ss[i][m- -]=ss[i][j]; for(j=0;j<n-len;j++)ss[i][j]=’*’;}}
183、求出形参ss所指字符串数组中最长字符的长度,其余字符串右边用字符*补齐,使其与最长的字符串等长
Void fun(char (*ss)[N])
{ int i,j,n,len=0; for(i=0;i<M;i++){n=strlen(ss[i]);if(i= =0) len= n; if(len<n) len =n;}for(i=0;i<M;i++);for(j=0;j<len-n;j++)
ss[i][n+j]=’*’; ss[i][n+1+j]=’\0’;}}
184、在形参s所指字符串中的每个数字字符之后插入一个*号。例如,形参s所指字符串为:def35adh3kjsdf7*。执行结果为:def3*5adh3*kjsdf7*。
Void fun(char *s)
{int I,j,n;for(i=0;s[i]!=’\0’;i++)if(s[i]>=’0’&& s[i]<=’9’){n=0;while(s[i+1+n]!=0)n++;for(j=i+n+1;j>i;j--) s[j+1]= s[j];
s[j+1]=’*’;i=i+1;}}
185、在形参s所指字符串中寻找与参数c形同的字符,并在其后插入一个与之相同的字符,若找不到相同字符则函数不做任何额处理。例如,s所指字符串为:baacda,c中的字符为:a,执行后s所指字符串为:baaaacdaa。
Void fun(char *s,char c)
{int i,j,n;for(i=0;s[i]!=0;i++)if(s[i]= =c){n=0;while(s[i1+n]!=’\0’ )n++;for(j=i+n+1;j>i;j--) s[j+1]= s[j]; s[j+1]=c;i=i+1;}}
186、将a和b所指的两个字符串转换成面值相同的整数,并进行相加作为函数值返回,规定字符串中只含9以下数字字符。例如,主函数中输入字符串:32486和12345,在函数中输出的函数值为:44831.
long ctod(char *s)
{long d=0;while(*s)if(
isdigit(*s)){d=d*10+*s-‘0’;s++;}return d;}
long fun(char *a, char *b)
{return ctod(a)+ ctod(b);}
187、在形参ss所指字符串数组中查找与形参t所指字符串相同的串,找到后返回该串在字符串数组中的位置(下标值),未找到则返回-1。 ss所指字符串数组中共有N个内容不同的字符串,且串长小于M。
Int fun(char (*ss)[M],char *t)
{int i;for(i=0;i<N;i++)if(strcmp(ss[i],t) = =0)return i;return -1;}
main()
{char ch[N][M]={---};t[M];int n,i;printf(--);for(i=0;i<N;i++)puts(ch[i]); printf(--);printf(--);gets(t);n=fun(ch,t);if(n= =-1) printf(--);
else printf(--);}
188、在形参ss所指字符串数组中查找含有形参substr所指字符串并输出,若没找到则输出相应信息,ss所指字符串数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1,s2)的功能是在s1串中查找s2子串,若没有,函数值为0,若有为非0.
Void fun(char (*ss)[M],char *substr)
{int i,find=0;for(i=0;i<N;i++)if(strsrr(ss[i],substr)l=NULL){ find=1; puts(ss[i]); printf(--);if(find= =0) printf(--);}}
189、求ss所指字符串数组中长度最长的字符串所在的行小标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长小于N。
int fun(char (*ss)[N],int *n)
{int i,k=0,len=0; for(i=0;i<M;i++){len=strlen(ss[i]);if(i= =0)*n=len;if(len >*n){ *n=len ;k=i;}}return (k);}
190、求ss所指字符串数组中长度最短的字符串所在的行小标,作为函数值返回,并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串,且串长小于N。
int fun(char (*ss)[N],int *n)
{int i,k=0,len=N; for(i=0;i<M;i++){len=strlen(ss[i]);if(i= =0)*n=len;if(len <*n){ *n=len ;k=i;}}return (k);}
191、在形参ss所指字符串数组中,删除所有串长超过K的字符串,函数返回所剩字符串的个数,ss所指字符串数组中共有N个字符串,且串长小于M。
int fun(char (*ss)[M],int k)
{int i,j=0,len; for(i=0;i<N;i++){len=strlen(ss[i]);if(len<=k)strcpy(ss[j++],ss[i]);}return j;}
192、在形参ss所指字符串数组中,将所有串长超过K的字符串右边的字符删除,只保留左边的K个字符串,数组中共有N个字符串,且串长小于M。
int fun(char (*ss)[M],int k)
{int i;while(i<N){ss[i][k]
}=0;i++;}}
193、计算出形参s所指字符串中包含的单词个数作为函数值返回。为便于统计,规定各单词之间用空格隔开。例如:形参s所指字符串为:This is a C language program,函数的返回值为6。
int fun(char *s)
{int n=0,flag=0;while(*s!=’\0’){if(*s!=’ ’&&flag= =0){n++;flag=1;} if(*s!=’ ’) flag=0;s++;}return n;}
四、结构体
194、将形参s所指字符串所有ASCII码值小于97的字符存入形参t所指字符数组中,形成新串,并统计出符合条件的字符个数作为函数值返回,例如,形参s所指字符串为:Abc@1X56*,程序执行后t所指字符数组中的字符串应为:A@156*。
int fun(char *s, char *t)
{ int n=0; while(*s){*(t+n)=*s;n++;}s++;}*(t+n)=0; return n;}
四、结构题
195、建立一个带头结点的单向链表并输出到文件“out98.dat”和屏幕上,各结点的值为对应下标,链表的结点数及输出的文件名作为参数传入。
Void fun(int n,char *filename)
{NODE *h,*p,*s;FILE *pf;int i;h=p=(NODE *)malloc(sizeof(NODE));h->data=0;for(i=1;i<n;i++){ s=(NODE *)malloc
sizeof(NODE)); s->data=i; p->next=s; p=p->next; p->next=NULL;if((pf=fopen(filename,”w”))= =NULL)printf(---);exit(0);}
fprintf(pf,”--”); printf(---);while(p)(fprintf(pf,”%3d”,p->data);if(p->next!=NULL){fprintf(pf,”>”);printf(“->”);}p=p->next);}
fprintf(pf,”\n”);printf(“\n”);fclose(pf);p=h;while(p){s=p;p=p->next;free(s);}
196、给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据域中的数据从小到大顺序链接。函数的功能是:把形参x的值放入一个新结点并插入到链表中,插入后各结点仍保持从小到大顺序排列。
Void fun(SLIST *h,int x)
{ SLIST *p,*q,*s;s=( SLIST *)malloc(sizeof(SLIST ));s->data=x;q=h;p=h->next;while(p!=NULL&&x>p->data){q=p;p=p->next;}
s->next=p;q->next=s;}}
197、对N名学生的学习成绩,按从高到底的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
STU *fun(STU a[],int m)
{ STU b[N],*tt;int I,j,k;tt=( STU *)malloc(sizeof(STU)*m);for(i=0;i<N;i++)b[i]=a[i];for(k=0;k<m;k++)
{for(i=j=0;i<N;i++)if(b[i].order> b[j].order)j=i;tt[k]=b[j]; b[j].order =0;}return tt;}
198、函数的功能是将存学生数据的结构体数组,按照姓名的字典序(从小到大排序)。
Void fun(struct student a[],int n)
{ struct student t;int i,j;for(i=0; i<n-1;i++) for(j=i+1; j<n;j++)if(strcmp(a[i].name, a[j].name))>0
t= a[i]; a[i]= a[j]; a[j]=t;}
199、给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。
Void fun(SLIST *p)
{ SLIST *t, *s; t=p->next;s=p;while(t->next!=NULL){s=t;t=t->next;}printf(“%d”, t->data); t->next =NULL;free(t);}
200、已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体中,给定程序的功能是找出成绩最低的学生记录,并通过形参返回主函数。
fun(STU a[],STU s)
{ STU h;int I;h=a[0];for(i=1;i<N;i++)if(a[i].s<h.s)h=a[i];*s=h;}
201、给定程序中已建立一个带有头结点的单向链表,链表中的各结点按数据域递增有序链接。删除链表中的数据域相同的结点,使之只保留一个。
Void fun(SLIST *h)
{ SLIST *p,*q; p=h->next;if(p!=NULL){q=p->next;while(q!=NULL) if(p->data= = q->data){ p->next =q->next; free(q); q=p->next;}
Else{p=q; q=q->next;}}}
202、建立一个带有头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。
Int fun(NODE *h)
{int sum=0; NODE *p;p=h->next;while(p){if(p->data%2= =0)sum+=p->data ;p= p->next ;}return sum; }
203、在带有头结点的单向链表中,查找数据域值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回0值。
Void outlist(SLIST *)
Int fun(SLIST *h,char ch )
{ SLIST *p;int n=0;p=h->next;while(p!=0){n++;if(p->data= =ch)return n;else p= p->next ;}return 0;}
main()
{ SLIST *head;int k;char ch;char a[N]={---};head=creatlist(a);outlist(head);printf(---);scanf(“%c”,&ch);k=fun(head,ch);if(k= =0)
printf(---);else printf(---);}
204、统计出带有头结点的单向链表中的结点个数,存放在形参n所指的存储单元中。
void fun(SLIST *h,int *n )
{ SLIST *p;(*n)=0; p=h->next; while(p){ (*n)++; p=p->next;}}
main()
{ SLIST *head;int a[N]={---},num;head= creatlist(a); outlist(head); fun(head,&num); printf(---);}
205、计算出带有头结点的单向链表中各结点数据域之和作为函数值返回。
int fun(SLIST *h)
{ SLIST *p;int s=0; p=h->next; while(p){ s+=p->data; p=p->next;}return s;}
main()
{ SLIST *head;int a[N]={---},num;head= creatlist(a); outlist(head); printf“\nsum=%d\n”, fun(head); }
206、人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组str中,且编号唯一函数fun的功能是;找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。
STU fun(STU *std,char *num)
{int I;STU a={"",9999,99,99};for(i=0;i<N;i++)if(strcmp(std[i].num,num)=0}return (std[i]);return a;}
207、人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在形参k所指的数组中。
int fun(STU*std,STU*k,int year)
{int i,n=0;
for(i=0;j<N;i++)if(std[i].year==year)k[n++]=std[i];return (n);}
208、通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a。
void modify(STU*ss,float a)
{int i;for(i=0;i<3;i++)
ss->score[i]*=a;}
main()
{STU std={…}float a;printf("…");show(std);printf("\nInput a number:");scanf("%f",&a);modify(&std,a);
printf("\nA result of modifying:\n");show(std);}
209、将形参指针所指结构体数组中的二个元素按num成员进行升序排列。Void fun(PERSON std[3])
void fun(PERSON std[3])
{PERSON temp;if(std[0];num>std[1].num){temp=std[0];std[0]=std[1];std[1]=temp;}if(std[0].num>std[2].num){temp=std[0];std[0]=std[2];
std[2]=temp;}if(std[1].num>std[2].num){temp=std[1];std[1]=std[2];std[2]=temp;}}
main()
{PERSON std[]={…};int i;fun(std);printf("\nThe result is :\n");for(i=0;i<3;i++)printf("%d,%s\n",std[i].num,std[i].name);}
210、将形参std所指结构体数组中年龄最大者的数据作为函数值返回。
STD fun(STD std[],int n){STD max;int i;max= *std;for(i=1;i<n;i++)if(max.age<std[i].age)max=std[i];return max;}
main()
{STD std[5]={…};STD max;max=fun(std,5);printf("\nThe result :\n");printf("…",max.name,max.age);}
211、程序通过定义学生结构体变量,存储了学生的学员、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。例如:a所指变量中的学号、姓名、和三门课的成绩依次是:10002、”LiSi”、95、80、88。
void fun(struct student a)
{struct student b;int i;b=a;b.sno=10002;strcpy(b.name,"Lisi");printf(…);printf(…);for (i=0;i<3;i++)
printf("%6.0f",b.score[i]);}
212、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量S中的数据进行修改,并把a中地址和为函数值返回主函数,在主函中输出修改后的数据。例如:a所指变量S的学号、姓名和三门课的成绩依次是:10001、“ZhangSan”、95、80、88,修改后输出t中的数据应为:10002、“LiSi”、96、81、89。
struct student *fun(struct student*a)
{int i;a->sno=10002;
strcpy(a->name,"LiSi");for(i=0;i<3;i++)a->score[i]+=1;return a;}
213、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。例如:b所指变量t的学号、姓名和三门课的成绩依次是:10002、“ZhangQi”、95、85、87,修改后输出t中的数据应为:10004、“Lijie”、93、85、87。
void fun(struct student b)
{b->sno=10004;strcpy(b->name,“Lijie”);}
main()
{struct student t={1002…87};int i;
printf(…);printf(…);for(i=0;i<3;i++)printf(…);fun(&t);……
214、将不带头节点的单向链表结点数据域中的数据从小到大排序,即若原链表结点数据为:10,4,2,8,6,排序后链表结点数据域从头数据域从头尾的数值为2,4,6,8,10。
void fun(NODE *h)
{NODE *p,*q;int t;p=h->next;
while(p)
{q=p->next;while(q){if(p->data>=q->data){t=p->data;p->data=q->data;q->data=t;}q=q->next;}p=p->next;}}
215、将不带并没有节点的单向链表结点数据域中的数据从小到大排序,即若朱链表结点数据为:10,4,2,8,6,排序后链表结点数据域从头尾的数值为:2,4,6,8,10。
void fun(NODE *h)
{NODE *p,*q;int t;while(p){q=p->next;while(q){if(p->data>q->data){t=p->data;p->data=q->data;
q->data=t;}q=q->next;}p=p->next;}}
216、将不带头节点的单向链表逆置,即若原链表中从头至尾结点数据域依次为2,4,6,8,10;逆置后,从头至尾结点数据域依次为:10,8,6,4,2。
void fun(NODE *h)
{Node *p,*q,*r;p=h->next;if(p= =0)return 0;q=p->next;p->next=NULL;while(q){r=q->next;q->next=p;p=q;q=r;}h->next=p;})
五、文件题
217、把文本文件B中的内容追加到文本文件A的内容之后。例如,文件B的内容为“I’mten.”,文件A的内容为“I’mastudent!”,追加之后文件A的内容为“I’mastudent!”,追加之后文件A的内容为“I’m a student!I’m ten.”
main()
{FILE *fp,*fp1,*fp2;int i;char c[N],t,ch;if((fp=fopen("A.dat","r"))==NULL){printf("fileA cannot be opened\n");exit(0);}printf("\n A contents are:\n\n");for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}
fclose(fp);if((fp=fopen("B.dat","r"))==NULL){printf("file B cannot be opened\n");
exit(0);}printf("\n\n\nB contents are:\n\n");for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;putchar(c[i]);}fclose(fp);if((fp=fopen("B.dat","r"))==NULL){printf("file B cannot be opened\n");
exit(0);}printf("\n\n\nB contents are:\n\n");for(i=0;(ch=fgetc(fp))!=EOF;i++)
{c[i]=ch;putchar(c[i];}fclose(fp);if((fp1=fopen("A.dat","a"))&&(fp2=fopen("B.dat","r")))
{while((ch=fgetc(fp2))!=EOF)fputc(ch,fp1);}else
{printf("Can not open A B !\n");}fclose(fp2);fclose(fp1);printf("\n***new A contents***\n\n");
if((fp=fopen("A.dat","r"))==NULL){printf("file A cannot be opened\n");exit(0);}
for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;put char(c[i]);}fclose(fp);}
218、先以只写方式打开文件“out99.dat”,再把字符串str中的字符保存到这个磁盘文件中。
main()
{FILE *fp;int i=0;char ch;char str[N]="I'm a student!";
if((fp=fopen("out99.dat","w"))= =NULL){printf(cannot open out99.dat\n");exit(0);}while(str[i]){ch=str[i];
fputc(ch,fp);puthcar(ch);i++;}fclose(fp);}
219、从键盘输入若干行文件(每行不超过80个字符),写到文件myfile4.txt中,用-1作为字符串输入结束的标志。然后将文件的内容读显示在屏幕上。
void WriteText(FILE *fw)
{char str[81];printf("\nEnter string with -1")!=0){fputs(str,fw);fputs("\n",fw);gets(str);}}
void ReadText(FILE *fr){char str[81];printf("\nEnter string with -1 to end :\n");
gets(str);while(strcmp(str,"-1")!=0){fputs(str,fw);fputs("\n",fw);gets(str);}}
void ReadText(FILE *fr)
{char str,81,fr);
while(!feof(fr)){printf("%s",str);
fgets(str,81,fr);}}
220、将自然数1~10以及它们的平方根写到名为myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。
int fun(char *fname)
{FILE *fp;int i,n;float x;if((fp=fopen(fname,"r"))==NULL)return 0;
for(i=1;i<=10;i++)fprintf(fp,"%d%f\n",i,sqrt((double)i));printf("\nSucceed!\n");fclose(fp);
printf("\nThe data in file:\n");if((fp=fopen(fname,"r"))==NULL)return0;fscanf(fp,"%d%f",&n,&x);
while(!feof(fp)){printf("%d %f\n",n,x);fscanf(fp,"%d%f",&n,&x);}fclose(fp);return 1;}
221、将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值是1,失败时返回值为0。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放在变量tfname中。
int fun(char *source,char*target)
{FILE *fs,*ft;char ch;if((fs=fopen(source,"r"))==NULL)return 0;if((fs=fopen(target,"w"))==NULL)
return 0;printf("\nThe data in file:\n");ch=fgetc(fs);while(!feof(fs)){putchar(ch);fputc(ch,ft);ch=fgetc(fs);}
fclose(fs);fclose(ft);printf("\n\n");return 1;}
222、建立班级通讯录、通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为myfile5.dat的二进制文件中。
int fun(STYPE *std)
{FILE *fp;int i;if((fp=fopen("myfile5.dat","wb"))==NULL)return(0);printf("\noutput data to file!\n");
for(i=0;i<N;i++)fwrite(&std[i].sizeof(STYPE),1,fp);fclose(fp);return (1);}
223、将形参给定的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
void fun(char *s,int a,double f)
{FILE *fp;char ch;fp=fopen("file1.txt","w");fprintf(fp,"%s %d %f\n",s,a,f);
fclose(fp);fp=fopen("file1.txt","r");printf("\nThe result :\n\n");ch=fgetc(fp);while(!feof(fp))
{putchar(ch);ch=fgetc(fp);}putchar(‘\n’);fclose(fp);}
224、将形参给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将字符串转换成相应的整数、浮点数,然后将显示在屏幕上。
void fun(char *s,int a,double f)
{FILE *fp;int a1;double f1;charstr[100],str1[100],str2[100];fp=fopen("file1.txt","w");
fprintf(fp,"%s%d%f\n",s,a,f);fclose(fp);fp=fopen("file1.txt","r");fscanf(fp,"%s%s%s",str,str1,str2);
fclose(fp);a1=stoi(str1);f1=atof(str2);printf("%s%d%f",str,a1,f1);}
225、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是从形参filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中读入学生数据,并按照学号从小到大排序后,再用二进制方式把排序后的学生数据输出到filename所指的文件中,覆盖原来的文件内容。
void fun(char *filename)
{FILE *fp;int i,j;STU s[N],t;fp=fopen(filename,"rb");fread(s,sizeof(STU),N,fp);
fclose(fp);for(i=0;i<N-1;i++)for(j=i+1;j<N;j++)if(s[i].sno>s[j]);s[j]=t;}
fp=fopen(filename,"wb");fwrite(s,sizeof(STU),N,fp);fclose(fp);}
226、程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到student.dat文件中。函数fun的功能是从指定文件中找出指定学号的学生数据,读入此学生数据,对该生的分数进行修改,使每门课的分数加3分,修改后重写文件中该学生的数据,即用该学生的新数据覆盖原数据,其它学生数据不变,若找不到,则什么都做。
Void fun(char *filename,long sno)
{FILE *fp;STU n;int i;fp=fopen(filename,"rb+");while(!feof(fp)}{fread(&n,sizeof(STU),1,fp);if(n.sno= =sno)break;}
if(!fcof(fp)){for(i=0;i<3;i++)n.score[i]+=3;fseek(fp,-(long)sizeof(STU),SEEK CUR);fwrite(&n,sizeof(STU),1,fp);}fclose(fp);