广工C Anyview 参考答案资料.docx
《广工C Anyview 参考答案资料.docx》由会员分享,可在线阅读,更多相关《广工C Anyview 参考答案资料.docx(81页珍藏版)》请在冰豆网上搜索。
广工CAnyview参考答案资料
CAnyview7-9章作业参考答案
/**********
【习题7.010】写一函数求3个整数中最小的数。
**********/
intmin(intx,inty,intz)
/*返回3个整数x,y和z中最小的数*/
{
if(x>y)
x=y;
if(x>z)
x=z;
returnx;
}
/**********
【习题7.020】编写函数,求用1元、5元和10元三种纸币
支付n元钱共有多少种支付法?
例如,16元可有6种支付方法:
方法123456
10元000011
5元012301
1元16116161
**********/
intchange(intn)
{
inti,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++;
returnm;
}
/**********
【习题7.030】先编写一个判断素数的函数。
再编写一个函数
将一个偶数表示为两个素数之和,并返回其中较小的素数。
注:
素数指只能被1和自身整除的正整数。
规定0,1不是素数。
**********/
intprime(intn)
/*判断素数,如果是素数返回1,不是素数则返回0*/
{intt;
if(n==1)
return0;
for(t=2;t<=(n/2);t++)
if(n%t==0)
return0;
return1;
}
intf(inti)
/*将偶数i表示为两个素数之和,返回其中较小的素数*/
{intn;
for(n=3;n<=i;n++)
if(prime(i-n)&&prime(n))
returnn;
}
/**********
【习题7.050】编写函数,将字符串中ASCII码最小的字符
放在第一个字符位置,其余字符依次往后移。
**********/
voidfunc(char*str)
/*将字符串str中ASCII码最小的字符放在第一个*/
/*字符位置,其余字符依次往后移。
*/
{
inti=1,m=0,k;
for(m=0,i=1;str[i]!
='\0';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个元素
值依次为:
222110001110000000
00111211。
**********/
voidmain()
{
inti,j;
for(j=0;j<26;j++)
{
c[j]=0;
for(i=0;s[i]!
='\0';i++)
if(s[i]=='A'+j||s[i]=='a'+j)
c[j]++;
}
}
/**********
【习题7.060】编写函数将一个nxn的二维数组按“次对角线”翻转。
例如:
翻转前的数组翻转后的数组
123963
456--->852
789741
**********/
voidinvert(chara[N][N])
{inti,j;
intb[N][N];
for(i=0;ifor(j=0;jb[i][j]=a[N-1-j][N-i-1];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.064】编写函数将一个NxN的二维数组“水平”翻转。
例如:
翻转前的数组翻转后的数组
123789
456--->456
789123
**********/
voidinvertH(chara[N][N])
{inti,j;
intb[N][N];
for(i=0;ifor(j=0;jb[i][j]=a[N-i-1][j];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.065】编写函数将一个NxN的二维数组“垂直”翻转。
例如:
翻转前的数组翻转后的数组
123321
456--->654
789987
**********/
voidinvertV(chara[N][N])
{
inti,j;
intb[N][N];
for(i=0;ifor(j=0;jb[i][j]=a[i][N-1-j];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.068】编写函数将一个NxN的二维数组的
周边元素“逆时针”轮转1位。
例如:
轮转前的数组轮转后的数组
123236
456--->159
789478
**********/
voidturningAnticlockwise(chara[N][N])
{inti;
chart=a[0][0];
for(i=0;ia[0][i]=a[0][i+1];
for(i=0;ia[i][2]=a[i+1][2];
for(i=0;ia[2][2-i]=a[2][2-i-1];
a[2][0]=a[1][0];
a[1][0]=t;
}
/**********
【习题7.072】编写函数将一个NxN的二维数组a的元素
按行向右轮转1位。
例如:
轮转前的数组轮转后的数组
123312
456--->645
789978
**********/
voidturningRight(chara[N][N])
{intb[N][N],i,j;
for(i=0;ifor(j=1;jb[i][0]=a[i][N-1],
b[i][j]=a[i][j-1];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.075】编写函数将一个NxN的二维数组a的元素
按行向左轮转1位。
例如:
轮转前的数组轮转后的数组
123231
456--->564
789897
**********/
voidturningLeft(chara[N][N])
{intb[N][N],i,j;
for(i=0;ifor(j=0;jb[i][N-1]=a[i][0],
b[i][j]=a[i][j+1];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.082】编写函数将一个NxN的二维数组a的元素
按列向下轮转1位。
例如:
轮转前的数组轮转后的数组
123789
456--->123
789456
**********/
voidturningDown(chara[N][N])
{
intb[N][N],i,j;
for(i=1;ifor(j=0;jb[0][j]=a[N-1][j],
b[i][j]=a[i-1][j];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.085】编写函数将一个NxN的二维数组a的元素
按列向上轮转1位。
例如:
轮转前的数组轮转后的数组
123456
456--->789
789123
**********/
voidturningUp(chara[N][N])
{
intb[N][N],i,j;
for(i=0;ifor(j=0;jb[N-1][j]=a[0][j],
b[i][j]=a[i+1][j];
for(i=0;ifor(j=0;ja[i][j]=b[i][j];
}
/**********
【习题7.103】编写函数,求整数m和n的最大公约数,
并作为函数的返回值。
**********/
intgdc(intm,intn)
{
inta,r;
if(ma=m,m=n,n=a;
while((r=m%n)!
=0)
{
m=n;n=r;
}
returnn;
}
/**********
【习题7.105】编写函数,求整数m和n的最小公倍数,
并作为函数的返回值。
**********/
intlcm(intm,intn)
{
intt,r,h;
h=m*n;
if(m{t=m;m=n;n=t;}
while((r=m%n)!
=0)
{
m=n;n=r;
}
returnh/n;
}
/**********
7.110系统给定外部字符数组变量s和数组长度n(不需要自行
定义)。
main函数的功能是:
把字符串s中所有小写字母转换为
大写字母,其他字符不变。
例如,当s="68abcdEFGhijkLM86"
时,转换后s="68ABCDEFGHIJKLM86"。
请仅在空缺处填入合适内容,使其实现上述功能。
**********/
voidmain()
{
inti;
/***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。
**********/
intfunc(inta,intb)
{intc;
c=a/10*1000+a%10*10+b/10*100+b%10;
returnc;
}
/**********
7.120系统给定外部长整型变量n和字符数组变量s(不需要自行
定义)。
main函数的功能是:
把n的整数值转换成字符串,并逆序
保存在s中。
例如,当n=20120826时,由n转换得到s="62802102"。
请仅在空缺处填入合适内容,使其实现上述功能。
**********/
voidmain()
{
inti=0;
while(/***1***/n>0)
{
s[i]=/***2***/n%10+'0';
/***3***/n/=10;
i++;
}
s[i]='\0';
}
/**********
7.121系统给定外部长整型变量n和字符数组变量s(不需要自行
定义)。
main函数的功能是:
把n的整数值转换成字符串,并保存
在s中。
例如,当n=20120826时,由n转换得到s="20120826"。
请仅在空缺处填入合适内容,使其实现上述功能。
**********/
voidmain()
{
inti=0,k;
charc[10];
while(/***1***/10*n/10!
=0)
{
c[i]=/***2***/n%10;
n/=10;
i++;
}
s[i--]='\0';
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。
**********/
floatfunc(floatr)
{inta,b;
a=r*1000;
b=a%10;
if(b<5)
r=(a-b)*0.001;
else
r=(a-b+10)*0.001;
returnr;
}
/**********
【习题7.135】假设n是一个k(k≥2)位的正整数,编写函数,
求出由n的低k-1位构成的数并作为函数值返回。
例如:
若n值
为5923,则函数返回923;若n值为923,则函数返回23。
**********/
intfunc(intn)
{
inti,j,k=n,m=1;
while(k>=10)
k/=10,i++;
for(j=1;j<=i;j++)
m=m*10;
n=n-k*m;
returnn;
}
/**********
【习题7.175】编写函数,求n以内(不包括n)同时能被3与7
整除的所有自然数之和的平方根,并作为函数值返回。
例如,
若n为100时,函数返回值应为14.49138。
**********/
floatfunc(intn)
{
inti;floats;
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。
**********/
floatfunc(intn)
{
inti;
floatj=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。
**********/
floatfunc(intn)
{
inti;
floatx,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。
**********/
floatfunc(intm,intn)
{
inti,j,k,l;
floatx=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)。
**********/
intfunc(intn)
{
inti,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。
**********/
floatfunc(floateps)
{
inti;
floatx=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。
**********/
voidfunc(chars[],chart[])
{
inti,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语言提供的字符串函数。
**********/
voidfunc(chars[],intn)
{
inti,j,k,d=0,c=0,t=0;
while(s[d++])
c++;
for(i=c-1;i>=0;i--)
{if(s[i]=='*')
t++;
elsebreak;}
if(t>n)
{k=t-n;
s[c-k]='\0';}
}
/**********
【习题7.315】编写函数,求出1到n之间(含n)能被7或11整除的
所有整数并依次存入数组a中,函数值为这些数的个数。
例如,
若n=15,则依次存入数组a中的数为7、11和14,函数值为3。
**********/
intfunc(intn,inta[])
{
inti,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。
**********/
intfunc(intn,intc,intd,inta[])
{
inti,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)以上年龄的人数。
**********/
voidfunc(intn,inta[],intc[])
{
inti,b;
for(i=0;i<=10;i++)
c[i]=0;
for(i=0;i{if(a[i]>=100)
c[10]++;
else{
b=a[i]/10;
c[b]++;
}}
}
/**********
【习题7.335】假设字符数组a中存放了按由小到大连续存放的
字符构成的字符串(后跟一个'\0'作为结束符)。
编写函数,
删去字符串中所有重复的字符(各自只保留一个),并使得保
留的字符仍构成一个字符串(连续存放,'\0'作为结束符)。
函数返回a中保留的字符串长度。
例如,若a中的字符串值为:
AAABBCDFFFHHHKLMMM
则删除重复字符之后,函数返回值为9,a中的字符串值为:
ABCDFHKLM
**********/
intfunc(chara[])
{
inti;
//while(a[i]!
='\0')
//i++;
charc[26];intj=1,k;
c[0]=a[0];
for(i=1;a[i]!
='\0';i++)
if(a[i]!
=a[i-1])
c[j]=a[i],j++;
while(c[k]!
='\0')
k++;
for(i=0;i<=k;i++)
a[i]=c[i];
return(k);
}
/**********
【习题7.345】假设字符数组s中存放了一行字符串,含有由小写
字母组成的若干单词,单词之间由若干个空格隔开(串的开头没
有空格)。
编写函数,统计一行字符串中单词的个数,并作为函
数值返回。
**********/
intfunc(ch