第一篇:广工C Anyview 参考答案
C Anyview 7-9章作业参考答案
/********** 【习题7.010】写一函数求3个整数中最小的数。**********/ int min(int x, int y, int z)/* 返回3个整数x,y和z中最小的数 */ {
if(x>y)
x=y;
if(x>z)
x=z;
return x;
}
/********** 【习题7.020】编写函数,求用1元、5元和10元三种纸币 支付n元钱共有多少种支付法?
例如,16元可有6种支付方法:
方法
10元
0
0
0
0
5元
0
0
1元 11 **********/ int change(int n){ int i,j,k,m=0;for(i=0;i<=n;i++)
for(j=0;j<=n/5;j++)
for(k=0;k<=n/10;k++)
if(i+5*j+10*k==n)
m++;
return m;
} /********** 【习题7.030】先编写一个判断素数的函数。再编写一个函数 将一个偶数表示为两个素数之和,并返回其中较小的素数。
注:素数指只能被1和自身整除的正整数。规定0,1不是素数。**********/ int prime(int n)
/* 判断素数,如果是素数返回1,不是素数则返回0 */ { int t;
if(n==1)
return 0;
for(t=2;t<=(n/2);t++)
if(n%t==0)
return 0;
return 1;}
int f(int i)
/* 将偶数i表示为两个素数之和,返回其中较小的素数*/ { int n;for(n=3;n<=i;n++)if(prime(i-n)&&prime(n))return n;}
/********** 【习题7.050】编写函数,将字符串中ASCII码最小的字符 放在第一个字符位置,其余字符依次往后移。**********/ void func(char *str)/* 将字符串str中ASCII码最小的字符放在第一个 */ /* 字符位置,其余字符依次往后移。
*/ { int i=1,m=0,k;for(m=0,i=1;str[i]!=' ';i++){ if(str[m]>str[i])m=i;} k=str[m];for(i=m-1;i>=0;i--)str[i+1]=str[i];str[0]=k;}
/**********
7.051 系统给定外部字符串s和整型数组c[26](不需 要自行定义)。编写程序,将字符串s中26个字母(不 区分大小写)出现的次数依次统计到数组c中。例如,当s=“AbcijKaBcdEXyzuvwx”时,数组c的26个元素 值依次为:2 2 2 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 2 1 1。**********/ void main(){ int i,j;for(j=0;j<26;j++){ c[j]=0;for(i=0;s[i]!=' ';i++)if(s[i]=='A'+j||s[i]=='a'+j)c[j]++;} }
/********** 【习题7.060】编写函数将一个nxn的二维数组按“次对角线”翻转。例如:翻转前的数组
翻转后的数组
2 3
6 3 5 6---> 8 5 2 8 9
4 1 **********/ void invert(char a[N][N]){ int i,j;int b[N][N];for(i=0;i for(i=0;i } /********** 【习题7.064】编写函数将一个NxN的二维数组“水平”翻转。例如:翻转前的数组 翻转后的数组 2 3 8 9 5 6---> 4 5 6 8 9 2 3 **********/ void invertH(char a[N][N]){ int i,j;int b[N][N];for(i=0;i /********** 【习题7.065】编写函数将一个NxN的二维数组“垂直”翻转。例如:翻转前的数组 翻转后的数组 2 3 2 1 5 6---> 6 5 4 8 9 8 7 **********/ void invertV(char a[N][N]){ int i,j;int b[N][N];for(i=0;i /********** 【习题7.068】编写函数将一个NxN的二维数组的 周边元素“逆时针”轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 3 6 5 6---> 1 5 9 8 9 7 8 **********/ void turningAnticlockwise(char a[N][N]){ int i; char t=a[0][0]; for(i=0;i a[0][i]=a[0][i+1]; for(i=0;i a[i][2]=a[i+1][2]; for(i=0;i a[2][2-i]=a[2][2-i-1]; a[2][0]=a[1][0]; a[1][0]=t; } /********** 【习题7.072】编写函数将一个NxN的二维数组a的元素 按行向右轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 1 2 5 6---> 6 4 5 8 9 7 8 **********/ void turningRight(char a[N][N]){ int b[N][N],i,j;for(i=0;i for(i=0;i /********** 【习题7.075】编写函数将一个NxN的二维数组a的元素 按行向左轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 3 1 5 6---> 5 6 4 8 9 9 7 **********/ void turningLeft(char a[N][N]){ int b[N][N],i,j;for(i=0;i for(i=0;i /********** 【习题7.082】编写函数将一个NxN的二维数组a的元素 按列向下轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 8 9 5 6---> 1 2 3 8 9 5 6 **********/ void turningDown(char a[N][N]){ int b[N][N],i,j;for(i=1;i for(i=0;i /********** 【习题7.085】编写函数将一个NxN的二维数组a的元素 按列向上轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 5 6 5 6---> 7 8 9 8 9 2 3 **********/ void turningUp(char a[N][N]){ int b[N][N],i,j;for(i=0;i for(i=0;i /********** 【习题7.103】编写函数,求整数m和n的最大公约数,并作为函数的返回值。**********/ int gdc(int m, int n){ int a,r; if(m a=m,m=n,n=a; while((r=m%n)!=0) { m=n;n=r; } return n;} /********** 【习题7.105】 编写函数,求整数m和n的最小公倍数,并作为函数的返回值。**********/ int lcm(int m, int n){ int t,r,h; h=m*n; if(m {t=m;m=n;n=t;} while((r=m%n)!=0) { m=n;n=r; } return h/n;} /********** 7.110 系统给定外部字符数组变量s和数组长度n(不需要自行 定义)。main函数的功能是:把字符串s中所有小写字母转换为 大写字母,其他字符不变。例如,当s=“68abcdEFGhijkLM86” 时,转换后s=“68ABCDEFGHIJKLM86”。 请仅在空缺处填入合适内容,使其实现上述功能。**********/ void main(){ int i; /*** 1 ***/i=0;; while(i { if(*(s+i)>='a' && *(s+i)<='z') *(s+i)=/*** 2 ***/*(s+i)-32; /*** 3 ***/ i++; } } /********** 【习题7.115】 编写函数,将两个两位数的正整数a、b合并形成 一个整数c且作为函数值返回。合并的方式是:将a的十位和个位 数分别作为c的千位和十位数,b的十位和个位数分别作为c的百位 和个位数。例如,若a=45,b=12,则该函数返回值为4152。**********/ int func(int a, int b){ int c;c=a/10*1000+a%10*10+b/10*100+b%10;return c;} /********** 7.120 系统给定外部长整型变量n和字符数组变量s(不需要自行 定义)。main函数的功能是:把n的整数值转换成字符串,并逆序 保存在s中。例如,当n=20120826时,由n转换得到s=“62802102”。请仅在空缺处填入合适内容,使其实现上述功能。**********/ void main(){ int i=0; while(/*** 1 ***/n>0) { s[i]= /*** 2 ***/n%10+'0'; /*** 3 ***/ n/=10; i++; } s[i]=' ';} /********** 7.121 系统给定外部长整型变量n和字符数组变量s(不需要自行 定义)。main函数的功能是:把n的整数值转换成字符串,并保存 在s中。例如,当n=20120826时,由n转换得到s=“20120826”。请仅在空缺处填入合适内容,使其实现上述功能。**********/ void main(){ int i=0,k; char c[10]; while(/*** 1 ***/ 10*n/10!=0) { c[i]= /*** 2 ***/n%10; n/=10; i++; } s[i--]=' '; k=i; while(i>=0) { s[i]=/*** 3 ***/c[k-i]+'0'; i--; } } /********** 【习题7.125】编写函数,对非负浮点数r的值的第三位小数四舍五入,返回保留2位小数的值。例如:若r的值为8.32488,则函数返回8.32; 若r的值为8.32533,则返回8.33。**********/ float func(float r){ int a,b;a=r*1000;b=a%10;if(b<5)r=(a-b)*0.001;else r=(a-b+10)*0.001;return r;} /********** 【习题7.135】假设n是一个k(k≥2)位的正整数,编写函数,求出由n的低k-1位构成的数并作为函数值返回。例如:若n值 为5923,则函数返回923;若n值为923,则函数返回23。**********/ int func(int n){ int i,j,k=n,m=1; while(k>=10) k/=10,i++;for(j=1;j<=i;j++)m=m*10;n=n-k*m; return n;} /********** 【习题7.175】编写函数,求n以内(不包括n)同时能被3与7 整除的所有自然数之和的平方根,并作为函数值返回。例如,若n为100时,函数返回值应为14.49138。**********/ float func(int n){ int i;float s;for(i=0;i {if(i%3==0&&i%7==0) s=s+i;} s=sqrt(s); return(s);} /********** 【习题7.184】编写函数,根据公式s=1+1/(1+2)+1/(1+2+3)+ „„1/(1+2+3+„+n)计算s,并作函数值返回。例如:若n的值 为11时,函数的值为1.833333。**********/ float func(int n){ int i;float j=1.0,s=1.0;for(i=2;i<=n;i++){j=j+i;s=s+1/j;} return(s);} /********** 【习题7.187】编写函数,计算并输出下列级数和: 1/(1*2)+1/(2*3)+1/(3*4)+ „ +1/(n*(n+1)),并返回结果。例如,当n=10时,函数值为0.90909。**********/ float func(int n){ int i;float x,y;for(i=1;i<=n;i++){x=i*(i+1);y=y+1/x;} return(y);} /********** 【习题7.195】编写函数,求m!/(n!(m-n)!)的值,结果由函数值 返回。m与n为两个正整数且要求m>n。例如:m=12,n=8时,运行 结果为495.000000。**********/ float func(int m, int n){ int i,j,k,l;float x=1.0,y=1.0,z=1.0;if(m<=n)l=m,m=n,n=l;for(i=1;i<=m;i++)x=x*i;for(j=1;j<=n;j++)y=y*j;for(k=1;k<=m-n;k++)z=z*k;z=x/(z*y);return(z); } /********** 【习题7.205】编写函数,计算并返回给定整数n除了1与自身 之外的所有因子之和。例如,若n=8,则函数返回6(=2+4)。**********/ int func(int n){ int i,j,k;for(i=1;i<=0.5*n;i++) for(j=1;j<=n;j++) if(i*j==n) k=k+i+j; k=k-1-n; k=k/2; return(k); } /********** 【习题7.255】编写函数,根据以下公式返回π的值 π/2 = 1+1!/3+2!/(3*5)+...+n!/(3*5*7*...*(2*n+1))要求满足精度eps,即一旦有小于eps的项值加入后停止迭代。例如,若精度eps=0.0005,则返回值为3.141106。**********/ float func(float eps){ int i;float x=1,y=1,z;for(i=1;(x/y)>=eps;i++){x=x*i;y=y*(2*i+1);z=z+x/y;} z=2*z+2;return(z); } /********** 【习题7.265】编写函数,将数组s所存字符串中下标和ASCII码 均为偶数的字符,依次存入数组t中,并构成一个新串。例如,若s中的字符串值为ABCD123456,则t中的串值应为246。**********/ void func(char s[], char t[]){ int i,j,m=0;for(i=0;s[i]!=0;i++) if((i%2==0)&&(s[i]%2==0))t[j]=s[i],j++; } /********** 【习题7.275】假定字符串s中可能含有字符'*'。请编写函数,若字符串s的尾部连续的'*'多于n个,则删除多余的'*'。例如,若s=“*****A*BCDE**F*******”且n=4,则调用函数后,字符串 s=“****A*BCDE**F****”;若n≥7,则字符串s中的内容不变。注意:函数中不得调用C语言提供的字符串函数。**********/ void func(char s[], int n){ int i,j,k,d=0,c=0,t=0;while(s[d++])c++;for(i=c-1;i>=0;i--) {if(s[i]=='*') t++; else break;} if(t>n) {k=t-n; s[c-k]=' ';} } /********** 【习题7.315】编写函数,求出1到n之间(含n)能被7或11整除的 所有整数并依次存入数组a中,函数值为这些数的个数。例如,若n=15,则依次存入数组a中的数为7、11和14,函数值为3。**********/ int func(int n, int a[]){ int i,j=0;for(i=1;i<=n;i++)if((i%7==0)||(i%11==0))a[j]=i,j++;return(j);} /********** 【习题7.317】编写函数,求出1到n之间(含n)都能被c和d整除 的所有整数并依次存入数组a中,函数值为这些数的个数。例如,若n=20,c=2,d=3,则依次存入数组a中的数为6、12和18,函 数值为3。**********/ int func(int n, int c, int d, int a[]){ int i,j; for(i=1;i<=n;i++) if((i%c==0)&&(i%d==0)) a[j]=i,j++; return(j);} /********** 【习题7.325】假设数组a存放了n个人的年龄。编写函数,用 数组c统计各年龄段的人数,其中c[0]为0至9岁年龄段的人数,c[1]为10至19岁年龄段的人数,c[2]为20至29岁年龄段的人 数,其余依此类推,c[10]为100岁(含100)以上年龄的人数。**********/ void func(int n, int a[], int c[]){ int i,b;for(i=0;i<=10;i++)c[i]=0; for(i=0;i /********** 【习题7.335】假设字符数组a中存放了按由小到大连续存放的 字符构成的字符串(后跟一个' '作为结束符)。编写函数,删去字符串中所有重复的字符(各自只保留一个),并使得保 留的字符仍构成一个字符串(连续存放,' '作为结束符)。 函数返回a中保留的字符串长度。例如,若a中的字符串值为: AAABBCDFFFHHHKLMMM 则删除重复字符之后,函数返回值为9,a中的字符串值为: ABCDFHKLM **********/ int func(char a[]){ int i;//while(a[i]!=' ')//i++;char c[26];int j=1,k;c[0]=a[0];for(i=1;a[i]!=' ';i++)if(a[i]!=a[i-1])c[j]=a[i],j++;while(c[k]!=' ')k++;for(i=0;i<=k;i++)a[i]=c[i];return(k); } /********** 【习题7.345】假设字符数组s中存放了一行字符串,含有由小写 字母组成的若干单词,单词之间由若干个空格隔开(串的开头没 有空格)。编写函数,统计一行字符串中单词的个数,并作为函 数值返回。**********/ int func(char s[]){ int i,j;for(i=0;s[i]!=0;i++)if(s[i]==' ')j++;j+=1;for(i=0;s[i]!=0;i++)if((s[i]==' ')&&(s[i+1]==' '))j--;return(j);} /********** 【习题7.355】假定字符串s中可能含有字符'*'。请编写函数,将字符串s中前导'*'全部移到字符串的尾部。例如,若s的串 值为***A*BC*DEF*G**,移动后,串值应为A*BC*DEF*G*****。注意:不得调用C语言提供的字符串函数。**********/ void func(char s[]){ int i,j=0,k=0;char b[100]; for(i=0;s[i]!=' ';i++) { if(s[i]=='*') k++; else break; } for(i=k;s[i]!=' ';i++) { b[j]=s[i]; j++; } for(i=0;i { if(i s[i]=b[i]; else s[i]='*'; } s[i]=' '; } /********** 【习题7.513】编写函数,计算并返回数组a中头n个 元素的乘积。 **********/ long func(int a[], int n){ int i,s=1; for(i=0;i s=s*a[i]; return(s);} /********** 【习题7.523】编写函数,计算并返回数组a中头n个 元素的平方和。 **********/ long func(int a[], int n){ int i,s; for(i=0;i s=s+a[i]*a[i]; return(s);} /********** 【习题7.533】假设某班选举班长,k位候选人的 号码分别为1至k,n张选票已存入数组v(每个元 素值在1至k之间)。编写函数,用数组c统计各位 候选人的得票(c[i]为i号候选人的得票数)。 **********/ void func(int v[], int n, int k, int c[]){ int i,j;for(j=0;j<=k;j++)c[j]=0;for(i=0;i /********** 【习题7.535】假设某班选举班长,k位候选人的 号码分别为1至k,n张选票已存入数组v(每个元 素值在1至k之间)。编写函数,用数组c统计各位 候选人的得票(c[i]为i号候选人的得票数),并 返回得票最高的人的号码。 **********/ int func(int v[], int n, int k, int c[]){ int i,j,max;for(i=0;i<5;i++) c[i]=0;for(i=0;i c[v[i]]++; max=c[0];for(i=1;i<=k;i++) if(max { j=i; max=c[i]; } return j; } /********** 【习题7.563】编写函数,把长整数n的各位数字从低 位到高位依次存储在数组d中,并返回n的位数。例如,若n=2579,则n的位数为4,d[0..3]=9,7,5,2。**********/ int func(long n, int d[]){int i;while(n>0){d[i]=n%10,i++;n=n/10;} return(i);} /********** 【习题7.565】编写函数,把长整数n的各位数字从高 位到低位依次存储在数组d中,并返回n的位数。例如,若n=2579,则n的位数为4,d[0..3]=2,5,7,9。**********/ int func(long n, int d[]){ int i,j;int a[25];for(i=0;n!=0;i++) { a[i]=n%10; n=n/10; } j=i; for(i=0;i d[i]=a[j-i-1]; return j;} /********** 【习题7.655】编写函数,用数组num统计字符串s中各元音字母(即:A、E、I、O、U)的个数。注意:不分大、小写。例如,若s=“THIs is a book”,则num[0..4]={1,0,2,2,0}。**********/ void func(char *s, int *num)/* 功能:用数组num统计符串s中元音字母出现的个数 */ { int i;num[0]=0, num[1]=0,num[2]=0,num[3]=0,num[4]=0; for(i=0;s[i]!=' ';i++) if((s[i]=='a')||(s[i]=='A')) num[0]++; for(i=0;s[i]!=' ';i++) if((s[i]=='e')||(s[i]=='E')) num[1]++; for(i=0;s[i]!=' ';i++) if((s[i]=='i')||(s[i]=='I')) num[2]++; for(i=0;s[i]!=' ';i++) if((s[i]=='o')||(s[i]=='O')) num[3]++; for(i=0;s[i]!=' ';i++) if((s[i]=='u')||(s[i]=='U')) num[4]++; } /**【习题7.675】假设在数组s中存放了n位学生的成绩。编写函数,用数组p统计各分数段的人数,其中p[0]为 不足60分的人数,p[1]为60至69分的人数,p[2]为70 至79分的人数,p[3]为80至89分的人数,p[4]为90至 100分的人数。**********/ void func(int s[], int n, int p[]){ int i; for(i=0;i<5;i++) p[i]=0; for(i=0;i {if(s[i]<60) p[0]++; if((s[i]>=60)&&(s[i]<70)) p[1]++; if((s[i]>=70)&&(s[i]<80)) p[2]++; if((s[i]>=80)&&(s[i]<90)) p[3]++; if((s[i]>=90)&&(s[i]<=100)) p[4]++;} } /********** 【习题7.685】编写函数,从小到大依次求出能整除m的各整数,并存放在数组d中,这些除数的个数由n返回。例如,若m=20,则 有6个数能整除它,依次是1,2,4,5,10,20。**********/ void func(int m, int d[], int *n){ int i,j;for(i=1;i<=m;i++)if(m%i==0)d[j]=i, j++;*n=j;} /********** 【习题7.755】通信时经常用到加密技术,把消息加密后再传输。编写一个用于加密消息的函数,把字符串str中的小写字母改成 “(其ASCII码加上字符串key中每个字符ASCII码的平方)除以128 所得的余数”作为ASCII码对应的字符,其它的字符不变,其中 str称为消息原文,key称为密钥。请思考:如何解密恢复原文,这种加密方法能准确地恢复原文吗? **********/ void func(char *str,char *key)/* 功能:用key作为密钥对字符串str进行加密处理 */ { int i,j,k; for(i=0;key[i]!=' ';i++) k=k+key[i]*key[i]; for(j=0;str[j]!=' ';j++) if((str[j]<='z')&&(str[j]>= 'a')) str[j]=(str[j]+k)%128;} int min(int x, int y, int z)/* 返回3个整数x,y和z中最小的数 */ { if(x>y) x=y; if(x>z) x=z; return(x); } /********** 【习题8.011】请编写函数func(char s[], char t[], int n),由数组s中长度为n的字符序列构造其逆序列,并存储在数组t中。例如,由给定字符序列s=“are”求得逆序列t=“era”;由s=“time” 求得t=“emit”。**********/ void func(char s[], char t[], int n) /* 数组s的前n个元素存放给定的字符序列,数组t的前n个元素存放s的逆序列。 注意:数组的下标从0开始。*/ { int i;for(i=0;i } /********** 【习题8.012】请编写函数func(char*s, char *t),由字符 串s构造其逆串t。例如,由给定串s=“are”求得逆串t=“era”; 由s=“time”求得t=“emit”。**********/ void func(char *s, char *t) /* s是给定字符串的起始地址,t是求得s的逆串的起始地址 */ { int i,j;for(j=0;s[j]!=' ';j++);for(i=0;i /********** 【习题8.015】对长度为n的字符串s1,除首、尾字符外,将 其余字符按ASCII码降序排列,组合成一个新的字符串s2。**********/ void func(char *s1, char *s2, int n)/* s1为字符串的起始地址,s2为新字符串的起始地址,n为字符串的长度。 要求:s1串不能发生改变,s2串存放新的字符串。*/ { int i,j; char t; n=strlen(s1); for(i=0;i *(s2+i)=*(s1+i); for(j=1;j for(i=1;i<=n-2-j;i++) { if(*(s2+i)<*(s2+i+1)) { t=*(s2+i); *(s2+i)=*(s2+i+1); *(s2+i+1)=t; } }} /********** 【习题8.016】对字符串s1,除首、尾字符外,将其余字符 按ASCII码降序排列,组合成一个新的字符串s2。**********/ void func(char *s1, char *s2){int n;n=strlen(s1);int i,j,k;char t; for(i=0;i s2[i]=s1[i]; s2[i]=' '; for(i=1;i { k=i; for(j=i+1;j if(s2[k] k=j; t=s2[i]; s2[i]=s2[k]; s2[k]=t; } } /********** 【习题8.020】在字符串s中查找字符c,如果找到,返回字符c 首次出现在字符串s中的位置指针;否则,返回空指针NULL。**********/ char *match(char *s, char c) /* 返回字符在串s中首次出现的位置指针 */ { int i; for(i=0;s[i]!=' ';i++) if(s[i]==c) return(s+i); return(NULL); } /* 8.030 先编写一个判断素数的函数。再编写一个函数将一个 偶数表示为两个素数之和,并返回其中较小的素数。 注:素数指只能被1和自身整除的正整数。规定0,1不是素数。 */ int prime(int n) /* 判断素数,如果是素数返回1,不是素数则返回0 */ { int t; if(n==1) return 0; for(t=2;t<=(n/2);t++) if(n%t==0) return 0; return 1;} int f(int i) /* 将偶数i表示为两个素数之和,返回其中较小的素数*/ { int n;for(n=3;n<=i;n++)if(prime(i-n)&&prime(n))return n;} /********** 【习题8.033】编写函数,计算年份year中第yearday天相应的月 和日。例如,调用函数month_day(2000,61,&m,&d)之后,m=3,d=1,即2000年的第61天是3月1日。**********/ int month_day(int year, int yearday, int *pmonth, int *pday)/* year是年,yearday是天数,若year和yearday合理,则*pmonth和*pday是计算得出的月和日,函数返回1; 否则,函数返回0。*/ { int s[12]={31,28,31,30,31,30,31,31,30,31,30,31},m; if(year%4==0&&year%100!=0||year%400==0) s[1]=29;if(year<1||yearday<1||(s[1]==28&&yearday>365)||(s[1]==29&&yearday>366)) return 0; else for(m=0;yearday-s[m]>0&&m<12;m++) yearday-=s[m]; if(yearday==0) { m=m-1; yearday=s[m]; } *pmonth=m+1; *pday=yearday; return 1; } /********** 【习题8.044】请编写一个函数func,通过略去非数字字符,将字符串 s转换为一个整数(不得调用C语言提供的将字符串转换为整数的函数)。**********/ long func(char *s) /* s是一个数字字符串的地址,函数返回值为由s含有的数字字符转换得到的数(包含正负数情况) */ { int i,j=1,k=0,flag=1;long n=0;for(i=0;s[i];i++){ if(s[i]=='+'&&flag) { flag=0; j=1; } if(s[i]=='-'&&flag) { flag=0; j=-1; } if(s[i]>47&&s[i]<58) { n=n*10; n=n+(s[i]-'0'); } if(n)flag=0;} n=n*j;return n;} /* 8.050 编写函数,将字符串中ASCII码最小的字符放在第一 个字符位置,其余字符依次往后移。 */ void func(char *str)/* 将字符串str中ASCII码最小的字符放在第一个 */ /* 字符位置,其余字符依次往后移。 */ { int i=1,m=0,k;for(m=0,i=1;str[i]!=' ';i++){ if(str[m]>str[i])m=i;} k=str[m];for(i=m-1;i>=0;i--)str[i+1]=str[i];str[0]=k;} /* 8.060 编写函数将一个nxn的二维数组按“次对角线”翻转。 例如:翻转前的数组 翻转后的数组 2 3 6 3 5 6---> 8 5 2 8 9 4 1 */ void invert(char a[N][N]){ int i,j;int b[N][N];for(i=0;i for(i=0;i /* 8.064 编写函数将一个NxN的二维数组“水平”翻转。 例如:翻转前的数组 翻转后的数组 2 3 8 9 5 6---> 4 5 6 8 9 2 3 */ void invertH(char a[N][N]){ int i,j;int b[N][N];for(i=0;i /* 8.065 编写函数将一个NxN的二维数组“垂直”翻转。 例如:翻转前的数组 翻转后的数组 2 3 2 1 5 6---> 6 5 4 8 9 8 7 */ void invertV(char a[N][N]){ int i,j;int b[N][N];for(i=0;i /* 8.067 编写函数将一个NxN的二维数组的周边元素“顺时针”轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 1 2 5 6---> 7 5 3 8 9 9 6 */ void turningClockwise(char a[N][N]){ int i,j,row=0,column=0;int tmp,t;int flag=1; for(i=0;i for(i=0;i /*8.068 编写函数将一个NxN的二维数组的周边元素“逆时针”轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 3 6 5 6---> 1 5 9 8 9 7 8 */ void turningAnticlockwise(char a[N][N]){ int i; char t=a[0][0]; for(i=0;i a[0][i]=a[0][i+1]; for(i=0;i a[i][2]=a[i+1][2]; for(i=0;i a[2][2-i]=a[2][2-i-1]; a[2][0]=a[1][0]; a[1][0]=t;} /* 8.072 编写函数将一个NxN的二维数组a的元素按行向右轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 1 2 5 6---> 6 4 5 8 9 7 8 */ void turningRight(char a[N][N]){ int b[N][N],i,j;for(i=0;i for(i=0;i /* 8.075 编写函数将一个NxN的二维数组a的元素按行向左轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 3 1 5 6---> 5 6 4 8 9 9 7 */ void turningLeft(char a[N][N]){ int b[N][N],i,j;for(i=0;i for(i=0;i /* 8.082 编写函数将一个NxN的二维数组a的元素按列向下轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 8 9 5 6---> 1 2 3 8 9 5 6 */ void turningDown(char a[N][N]){ int b[N][N],i,j;for(i=1;i for(i=0;i /* 8.085 编写函数将一个NxN的二维数组a的元素按列向上轮转1位。 例如:轮转前的数组 轮转后的数组 2 3 5 6 5 6---> 7 8 9 8 9 2 3 */ void turningUp(char a[N][N]){ int b[N][N],i,j;for(i=0;i for(i=0;i /********** 8.103 编写函数,求整数m和n的最大公约数,并作为函数的返回值。**********/ int gdc(int m, int n){ int a,r; if(m a=m,m=n,n=a; while((r=m%n)!=0) { m=n;n=r; } return(n);} /********** 【习题8.105】请编写一个函数findmax(int []s, int n),返回数组s中 n(>0)个整数中的最大值。注意:要求在函数中采用指针(而不是下标)来 处理数组元素。**********/ int findmax(int s[], int n) /* 返回s中n(>0)个整数的最大值。 注意:要求在函数中采用指针(而不是下标)来处理数组元素。*/ { int i,m=*(s+i);for(i=0;*(s+i)!=' ';i++)if(m<*(s+i))m=*(s+i);return(m);} /********** 【习题8.124】请编写一个函数min3adj(int s[], int n),数组s中 有n(>0)个整数,返回在s中相邻三个数的和中的最小值。**********/ int min3adj(int s[], int n) /* 数组s含n(>=3)个整数,返回在s中相邻三个数的和中的最小值。*/ { int i,j;int sum[20]={0};int min = 0;for(i=0;i for(j=0;j<3;j++) { sum[i] += s[i+j]; } } sum[i+1]=' ';min = sum[0];for(i=0;i if(sum[i] { min = sum[i]; } } return min;} /********** 【习题8.132】编写函数,通过指针参数sum将x和y的 和赋给相应实际参数。例如,若x=134、y=378,则sum 的实参变量被赋值512。**********/ void func(int x, int y, int *sum){ *sum=x+y; } /********** 【习题8.136】编写函数,返回指针参数x和y所指向的 变量的值之和。**********/ int func(int *x, int *y){ return(*x+*y);} /********** 【习题8.138】编写函数,比较指针参数x和y分别 指向的变量,若前者的值较大,则交换两者的值,并返回1;否则无须交换,返回0。**********/ int func(int *x, int *y){ int m;if(*x>*y){m=*x;*x=*y;*y=m;return(1);} else return(0); } /********** 【习题8.143】假设指针a指向某数组中的一个元素。编写函数,在从元素*a开始的n个元素范围内,向后 查找给定值x,一旦找到值等于x的元素,则返回该元 素的序号;若找不到,则返回0。例如,假定a指向的 10个元素依次为5,6,3,0,-4,8,9,-6,8,-7,若x=5,则返回1;若x=8,则返回6;若y=4,则返回0。**********/ int func(int n, int *a, int x){ int i;for(i=0;*(a+i)!=' ';i++)if(*(a+i)==x)return(i+1);return(0);} /********** 【习题8.146】假设指针a指向某数组中的一个元素。编写函数,对从元素*a开始的n个元素,统计并返回 值为x的元素个数(若不存在这样的元素,则返回0)。**********/ int func(int n, int *a, int x){ int i,k;for(i=0;*(a+i)!=' ';i++)if(*(a+i)==x)k++;return(k);return(0);} /********** 【习题8.203】编写函数,返回指针参数s所指向的字 符串的长度。例如,若该串为“I am a student.”,则函数返回值是15。注意:字符串结束符是' ',不 计入长度。不允许调用库函数strlen()。**********/ int func(char *s){ int i;for(i=0;*(s+i)!=' ';i++);return(i);} /********** 【习题8.212】编写函数,在指针参数s所指向的字 符串中顺序查找由c指定的字符。一旦找到,则返回 该字符在串中的序号(串的首个字符的序号为1),否则返回0。例如,若该串为“I am a student.”,c='t',则函数返回值为9。注意:字符串结束符是 ' ',不允许调用字符串库函数。**********/ int func(char *s, char c){ int i; for(i=0;*(s+i)!=' ';i++) if(*(s+i)==c) return(i+1); return(0);} /********** 【习题8.215】编写函数,在指针参数s所指向的字 符串中统计并返回由c指定的字符的个数。例如,若 该串为“I am a student.”,c='t',则函数返回值 为2。注意:字符串结束符是' ',不允许调用字符 串库函数。**********/ int func(char *s, char c){ int i,k; for(i=0;*(s+i)!=' ';i++) if(*(s+i)==c) k++; return(k); return(0);} /********** 【习题8.222】编写函数,复制指针参数s指向的字 符串到由指针参数t已经指向的存储区域。注意: 字符串结束符是' ',不允许调用字符串库函数。**********/ void func(char *s, char *t){ int i;for(i=0;*(s+i)!=' ';i++)*(t+i)=*(s+i);} /********** 【习题8.225】编写函数,由指针参数s指向的字 符串头n个字符构造一个字符串,并存储到到由指 针参数t已经指向的存储区域。例如,若s指向的 字符串为“I am a student.”,n=4,则t指向的 串为“I am”。注意:字符串结束符是' ',不允 许调用字符串库函数。**********/ void func(char *s, int n, char *t){ int i;for(i=0;i /********** 【习题8.228】编写函数,由指针参数s指向的字 符串后n个字符构造一个字符串,并存储到到由指 针参数t已经指向的存储区域。例如,若s指向的 字符串为“I am a student.”,n=8,则t指向的 串为“student.”。注意:字符串结束符是' ',不允许调用字符串库函数。**********/ void func(char *s, int n, char *t){ int i,j,n1; while(s[i]){ i++;} n1=i;for(j=0,i=n1-n;s[i]!=' ';i++) t[j++]=s[i]; t[j]=' ';} /********** 【习题8.231】编写函数,由指针参数s指向的字 符串中第i个字符开始的n个字符构造一个字符串,并存储到到由指针参数t已经指向的存储区域。例 如,若s指向的串为“I am a student.”,i=8,n=7,则t指向的串为“student”。注意:字符串 结束符是' ',不允许调用字符串库函数。**********/ void func(char *s, int i, int n, char *t){ int j;for(j=0;j