C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案
C语言第6—8章课后习题答案
第六章循环语句
6.1输入两个正数,求最大公约数和最小公倍数.
#include
void main()
{ int a,b,num1,num2,temp;
printf("请输入两个正整数:\");
scanf("%d,%d",&num1,&num2);
if(num1<num2)< bdsfid="73" p=""></num2)<>
{
temp=num1;
num1=num2;
num2=temp;
}
a=num1,b=num2;
while(b!=0)
{
temp=a%b;
a=b;
b=temp;
}
printf("它们的最大公约数为:%d\",a);
printf("它们的最小公倍数为:%d\",num1*num2/a);
}
编译已通过
6.2输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数. 解:
#include
void main()
{
char c;
int letters=0,space=0,degit=0,other=0;
printf("请输入一行字符:\");
while((c=getchar())!='\')
{
if(c>='a'&&c<='z' || c>'A'&&c<='Z')
letters++;
else if(c==' ')
space++;
else if(c>='0'&&c<='9')
digit++;
else
other++;
}
printf("其中:字母数=%d 空格数=%d 数字数=%d 其它字符数=%d\",letters,space, digit,other);
}
6.3求s(n)=a+aa+aaa+…+aa…a之值,其中a是一个数字,n表示a的位数。
解:
void main()
{
int a,n,count=1,sn=0,tn=0;
printf("请输入a和n的值:\");
scanf("%d,%d",&a,&n);
printf("a=%d n=%d \",a,n);
while(count<=n)
{
tn=tn+a;
sn=sn+tn;
a=a*10;
++count;
}
printf("a+aa+aaa+…=%d\",sn); }
6.4 求(即1+2!+3!+4!+…+20!) void main()
{
float n,s=0,t=1;
for(n=1;n<=20;n++)
{
t=t*n;
s=s+t;
}
printf("1!+2!+…+20!=%e\",s); }
阶乘利用递归,再求和:
#include
using namespace std;
long Func(int n)
{
if(1==n)
return n;
if(n>1)
return n*Func(n-1);
}
main()
{
int i=1;
while (i<=6)
{
s=s+Func(i);
i++;
}
cout<<s<<endl;< bdsfid="160" p=""></s<<endl;<> }
6.5 求。
void main()
{
int k,N1=100,N2=50,N3=10;
float s1=0.0,s2=0.0,s3=0.0;
for(k=1;k<=N1;k++)/*计算1到100的和*/
{
s1=s1+k;
}
for(k=1;k<=N2;k++)/*计算1到50各数平方和*/ {
s2=s2+k*k;
}
for(k=1;k<=N3;k++) /*计算1到10各数倒数之和*/ { s3=s3+1.0/k;
}
printf("总和=%8.2f\",s1+s2+s3);
}
已通过
int main()
{
int k=1,i=11,j=51;
while(k<=10)
{
s=s+k+k*k+1.0/k;
while(k==10 && i<=50)
{
s=s+i+i*i;
while(i=50 && j<=100)
{
s=s+j;
j++;
}
i++;
}
k++;
}}
6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。
#include
void main()
{
int i,j,k,n;
printf(" 水仙花数是:\");
for(n=100;n<1000;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%d\",n);
}
}
printf("\");
}
编译已通过153 370 371 407
6.7一个数如果恰好等于它的因子之和,这个数就称为“完数”。
编程序找出1000之内的所有完数,并按下面格式输出其因子。
#include
#define M 1000 /*定义寻找范围*/
void main()
{
int k0,k1,k2,k3,k4,k5,k6,k7,k8,k9;
int i,j,n,s;
for(j=2;j<=M;j++)
{
n=0; s=j;
for(i=1;i<j;i++)< bdsfid="231" p=""></j;i++)<>
{
if((j%i)= =0)
{
n++;
s=s-i;
switch(n)/*将每个因子赋给k0,k1…k9*/
case 1: k0=i; break;
case 2: k1=i; break;
case 3: k2=i; break;
case 4: k3=i; break;
case 5: k4=i; break;
case 6: k5=i; break;
case 7: k6=i; break;
case 8: k7=i; break;
case 9: k8=i; break;
case 10: k9=i; break;
} } }
if(s==0)
{
printf("%d是一个完数,它的因子是",j); if(n>1) printf("%d,%d",k0,k1);
if(n>2)
printf(",%d",k2);
if(n>3)
printf(",%d",k3);
if(n>4)
printf(",%d",k4);
if(n>5)
printf(",%d",k5);
if(n>6)
printf(",%d",k6);
if(n>7)
printf(",%d",k7);
if(n>8)
printf(",%d",k8);
if(n>9)
printf(",%d",k9);
printf("\");
} } }
方法二:此题用数组方法更为简单.
void main()
{ int k[10];
int i,j,n,s;
for(j=2;j<=1000;j++)
{
n=-1;
s=j;
for(i=1;i<j;i++)< bdsfid="280" p=""></j;i++)<>
if((j%i)==0)
{
n++;
s=s-i;
k[n]=i;/*将每个因子赋给k0,k1...k9*/
}
}
if(s= =0)
{
printf("%d是一个完数,它的因子是:",j);
for(i=0;i<n;i++)< bdsfid="292" p=""></n;i++)<>
printf("%d,",k[i]);
printf("%d\",k[n]);
} } }
6.8 有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13,…求出这个数列的前20项之和. 解:
#include
void main()
{
int n,t,number=20;
float a=2,b=1,s=0;
for(n=1;n<=number;n++)
{
s=s+a/b;
t=a,a=a+b,b=t;
}
printf("总和=%9.6f\",s);
}
编译已通过=32.660259
6.9球反弹问题
#include
void main()
{
float sn=100.0,hn=sn/2;
int n;
for(n=2;n<=10;n++)
{
sn=sn+2*hn;/*第n次落地时共经过的米数*/ hn=hn/2;/*第n次反跳高度*/
}
printf("第10次落地时共经过%f米\",sn); printf("第10次反弹%f米.\",hn);
}
编译已通过
经过299.609375m
反弹0.097656m
6.10猴子吃桃问题
#include
void main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{
x1=(x2+1)*2;
x2=x1;
day--;
}
printf("桃子总数=%d\",x1);
}
编译已通过=1534
上面的程序是从最后一天计算,一直到第一天。
当while第一次循环,既day=9的时候,X1此时计算的是第9天的桃子数。
而X2既是X1前一天的桃子数。
计算出第9天的桃子数后,把X1的值赋值给X2,那么X2此时X2就表示第9天的桃子数,再通过while的循环,可以逐步求出第7天,第6天...一直到第一天的桃子数. 这里X2=X1,就是一个赋值的过程,为的是求前一天的桃子数.
6.11用迭代法求x= 。
求平方根的迭代公式为:要求前后两次求出的差的绝对值小于0.00001。
#include
#include
void main()
{
float x0,x1,a;
scanf("%f",&a);
x1=a/2;
do
{
x0=x1;
x1=(x0+a/x0)/2;
}while(fabs(x0-x1)>=0.00001);
printf("%.3f\",x1);
} 编译已通过
6.12 用牛顿迭代法求方程在1.5附近的根。
#include
void main()
{
double x,y;x=1.5;
do
{
y=2*x*x*x-4*x*x+3*x-6;
x=x-y/(6*x*x-8*x+3);
}while(y!=0);
printf("x=%.3f\",x);
} 编译已通过x=2.000
6.13用二分法求方程在(-10,10)之间的根: #include void main()
{
double x1,x2,y1,y2;x1=-10;x2=10;
do
{
y1=2*x1*x1*x1-4*x1*x1+3*x1-6;
x1=x1-y1/(6*x1*x1-8*x1+3);
}while(y1!=0);
do
{
y2=2*x2*x2*x2-4*x2*x2+3*x2-6;
x2=x2-y2/(6*x2*x2-8*x2+3);
}while(y2!=0);
printf("x1=%.3f,x2=%.3f\",x1,x2);
}
编译已通过
x1=2.000,x2=2.000
6.14打印图案
#include
void main()
{
int i,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(" ");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("\");
}}
编译已通过
6.15乒乓比赛
#include
void main()
{
char i,j,k; /*i是a的对手;j是b的对手;k是c的对手*/ for(i='x';i<='z';i++)
{
for(j='x';j<='z';j++)
if(i!=j)
for(k='x';k<='z';k++)
{
if(i!=k && j!=k)
{
if(i!='x' && k!='x' && k!='z')
printf("顺序为:\a--%c\b--%c\c--%c\",i,j,k);
} } }}
}编译已通过
7.1用筛选法求100之内的素数.
/*用筛选法求100之内的素数*/
#include
#define N 101
void main()
{int i,j,line,a[N];
for(i=2;i
6 for(i=2;i<sqrl(n);i++)< bdsfid="447" p=""></sqrl(n);i++)<> for(j=i+1;j<n;j++)< bdsfid="449" p=""></n;j++)<>
{if(a[i]!=0 && a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;
11 printf("\");
for(i=2,line=0;i<n;i++)< bdsfid="455" p=""></n;i++)<> { if(a[i]!=0)
{printf("%5d",a[i]);
line++;
if(line==10)
{printf("\");
line=0;}
21 }
6,11,21没通过
7.2用选择法对10个数排序. /*选择法排序.*/
#include
#define N 10
void main()
{ int i,j,min,temp,a[N];
/*输入数据*/
printf("请输入十个数:\"); for (i=0;i<n;i++)< bdsfid="473" p=""></n;i++)<>
{ printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf("\");
for(i=0;i<n;i++)< bdsfid="479" p=""></n;i++)<>
printf("%5d",a[i]);
printf("\");
/*排序*/
for (i=0;i<n-1;i++)< bdsfid="484" p=""></n-1;i++)<>
{ min=i;
for(j=i+1;j<n;j++)< bdsfid="487" p=""></n;j++)<>
if(a[min]>a[j]) min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
/*输出*/
printf("\排序结果如下:\"); for(i=0;i<n;i++)< bdsfid="495" p=""></n;i++)<>
printf("%5d",a[i]);
}
编译已通过
7.3对角线和:
/*计算矩阵对角线元素之和*/ #include
#include
void main()
{
int a[3][3];
int i,j;//i为行j为列
int sum=0;
int sum1=0;
//输入
for( i=0; i<=2; i++)
{
for( j=0; j<=2; j++)
{
printf (" 请输入第%d行第%d列的数:", i+1, j+1); scanf ("%d",&a[i][j]);
}
printf("\");
}
//求和
for( i=0; i<=2; i++)
{
for( j=0; j<=2; j++)
{
if(i==j)
sum = sum+a[i][j];
if(i+j==2)
sum1= sum1+a[i][j];
} }
7.4插入数据到数组
/*插入数据到数组*/
#include
void main()
{
int a[11]={1,3,6,9,13,15,19,27,30,80}; int temp1,temp2,number,end,i,j; printf("初始数组如下:");
for (i=0;i<10;i++)
printf("%5d",a[i]);
printf("\");
printf("输入插入数据: ");
scanf("%d",&number);
end=a[9];
if(number>end)
a[10]=number;
else
{
for(i=0;i<10;i++)
{
if(a[i]>number)
{
temp1=a[i];
a[i]=number;
for(j=i+1;j<11;j++)
{
temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
} } }
for(i=0;i<11;i++)
printf("%6d",a[i]);
printf("\");
}编译已通过
7.5将一个数组逆序存放。
/*数组逆序存放*/
#include
#define N 5
void main()
{
int a[N]={8,6,5,4,1},i,temp;
printf("\ 初始数组:\");
for(i=0;i<n;i++)< bdsfid="576" p=""></n;i++)<> printf("%4d",a[i]);
for(i=0;i<="" bdsfid="579" p="">
{
temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("\ 交换后的数组:\");
for(i=0;i<n;i++)< bdsfid="587" p=""></n;i++)<> printf("%4d",a[i]);
}无错误
7.6杨辉三角
/*打印杨辉三角形*/
#include
#define N 10
void main()
{
int i,j,a[N][N];
for(i=0;i<n;i++)< bdsfid="599" p=""></n;i++)<> {
a[i][i]=1;
a[i][0]=1;
}
for(i=2;i<n;i++)< bdsfid="605" p=""></n;i++)<> for(j=1;j<=i-1;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<n;i++)< bdsfid="609" p=""></n;i++)<> {
for(j=0;j<=i;j++)
printf("%6d",a[i][j]);
printf("\");
}
printf("\");
}
7.8鞍点
/*查找鞍点*/
#define N 10
#define M 10
main()
{ int i,j,k,m,n,flag1,flag2,a[N][M],max,maxi,maxj; printf("\输入行数n:");
scanf("%d",&n);
printf("\输入列数m:");
scanf("%d",&m);
for(i=0;i<n;i++)< bdsfid="628" p=""></n;i++)<>
{ printf("第%d行?\",i);
for(j=0;j<m,j++);< bdsfid="631" p=""></m,j++);<> scanf("%d",&a[i][j];
}
for(i=0;i<n;i++)< bdsfid="635" p=""></n;i++)<>
{ for(j=0;j<m;j++)< bdsfid="637" p=""></m;j++)<> printf("%5d",a[i][j]);
pritf("\");
}
flag2=0;
for(i=0;i<n;i++)< bdsfid="643" p=""></n;i++)<>
{ max=a[i][0];
for(j=0;j<m;j++)< bdsfid="646" p=""></m;j++)<>
if(a[i][j]>max)
{ max=a[i][j];
maxj=j;
}
for (k=0,flag1=1;k<="" p="">
if(max>a[k][max])
flag1=0;
if(flag1)
{ printf("\第%d行,第%d列的%d是鞍点\",i,maxj,max);
flag2=1;
} }
if(!flag2)
printf("\ 矩阵中无鞍点! \");
}
7.9变量说明:top,bott:查找区间两端点的下标;loca:查找成功与否
的开关变量. /*折半查找*/
#include
#define N 15
main()
{ int i,j,number,top,bott,min,loca,a[N],flag;
char c;
printf("输入15个数(a[i]>[i-1])\);
scanf("%d",&a[0]);
i=1;
while(i<n)< bdsfid="673" p=""></n)<>
{ scanf("%d",&a[i]);
if(a[i]>=a[i-1])
i++;
esle
{printf("请重输入a[i]");
printf("必须大于%d\",a[i-1]);
}
}
printf("\");
for(i=0;i<n;i++)< bdsfid="684" p=""></n;i++)<> printf("%4d",a[i]);
printf("\");
flag=1;
while(flag)
{
printf("请输入查找数据:");
scanf("%d",&number);
loca=0;
top=0;
bott=N-1;
if((numbera[N-1]))
loca=-1;
while((loca==0)&&(top<=bott))
{ min=(bott+top)/2;
if(number==a[min])
{ loca=min;
printf("%d位于表中第%d个数\",number,loca+1);
}
else if(number<a[min])< bdsfid="705" p=""></a[min])<> bott=min-1;
else
top=min+1;
}
if(loca==0||loca==-1)
printf("%d不在表中\",number); printf("是否继续查找?Y/N!\");
c=getchar();
if(c=='N'||c=='n')
flag=0;
}
}
7.10/*统计字符数*/
#include
void main()
{ int i,j,uppn,lown,dign,span,othn; char text[3][80];
uppn=lown=dign=span=othn=0;
for(i=0;i<3;i++)
{ printf("\请输入第%d行:\",i); gets(text[i]);
for(j=0;j<80 && text[i][j]!='\\0';j++) {if(text[i][j]>='A' && text[i][j]<='Z') uppn+=1;
else if(text[i][j]>='a' && text[i][j]<='z') lown+=1;
else if(text[i][j]>='1' && text[i][j]<='9') dign+=1;
else if(text[i][j]=' ')
span+=1;
else
othn+=1;
}
}
for(i=0;i<3;i++)
printf("%s=n",text[i]);
printf("大写字母数:%d\",uppn); printf("小写字母数:%d\",lown); printf("数字个数:%d\",dign);
printf("空格个数:%d\",span);
printf("其它字符:%d\",othn);
}
编译已通过
7.11/*打印图案*/
#include
void main()
{static char a[5]={'*','*','*','*','*'};
int i,j,k;
char space=' ';
for(i=0;i<=5;i++)
{printf("\");
for(j=1;j<=3*i;j++)
printf("%lc",space);
for(k=0;k<=5;k++)
printf("%3c",a[k]);
}
}
7.12
/*译电文*/
#include
void main()
{
int i,n;
char ch[80],tran[80];
printf("请输入字符:");
gets(ch);
printf("\密码是:%s",ch);
i=0;
while(ch[i]!='\\0')
{
if((ch[i]>='A')&&(ch[i]<='Z'))
tran[i]=26+64-ch[i]+1+64;
else if((ch[i]>='a')&&(ch[i]<='z'))
tran[i]=26+96-ch[i]+1+96;
else
tran[i]=ch[i];
i++;
}
n=i;
printf("\原文是:");
for(i=0;i<n;i++)< bdsfid="781" p=""></n;i++)<> putchar(tran[i]);
printf("\");
} 编译已通过
7.13
/*连接两个字符串(不用'stract')*/
#include
void main()
{
char s1[80],s2[40];
int i=0,j=0;
printf("\请输入字符串1:");
scanf("%s",s1);
printf("请输入字符串2:");
scanf("%s",s2);
while(s1[i]!='\\0')
i++;
while(s2[j]!='\\0')
s1[i++]=s2[j++];
s1[i]='\\0';
printf("连接后字符串为:%s\",s1);
}编译已通过
7.14
/*字符串比较*/
#include
void main()
{
int i,resu;
char s1[100],s2[100];
printf("请输入字符串1:");
gets(s1);
printf("请输入字符串2:");
gets(s2);
i=0;
while((s1[i]==s2[i]) && (s1[i]!='\\0')) i++;
if(s1[i]=='\\0' && s2[i]=='\\0')resu=0; else
resu=s1[i]-s2[i];
printf("%s与%s比较结果是%d\",s1,s2,resu);
}编译已通过
7.15
/*字符串复制*/
#include
#include
void main()
{
char from[80],to[80];
int i;
printf("请输入字符串1:");
scanf("%s",to);
printf("请输入字符串2:");
scanf("%s",from);
for(i=0;i<=strlen(from);i++)
to[i]=from[i];
printf("复制字符串为:%s\",to);
}
第8章函数参考答案
【知识要点】
C语言的基本组成单位函数。
C是由一个且仅有一个主函数( main)和若干个子函数组成.子函数可有可无。
一个C语言源程序执行,从主函数开始,以主函数结束。
C语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。
采用了函数模块式的结构的特点:程序的层次结构清晰,便于程序的编写、阅读和调试。
C语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。
如:
数学函数#include
字符函数#include
字符串函数#include
输入输出函数#include
动态存储分配函数#include #include
清屏函数#include
日期和时间函数#include
函数可以嵌套调用,而不可嵌套定义。
函数的值:函数的值的数据类型由函数定义时所决定的。
调用函数时可有返回值和无返回值两种。
有返回值的函数在函数体内必有一条或多条return 语句,无返回值的函数定义为void类型,且在函数体无return 语句。
函数调用时参数的传递:主调函数和被调函数之间数据传递有两种,数值传递和地址传递。
【习题参考答案】
8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。
【解析】用碾转相除法求最大公约数。
最小公倍数=两个整数之积/最大公约数。
#include
int gcf(int x,int y) /*求两整数的最大公约数*/
{int t,r;
if (x<y)< bdsfid="875" p=""></y)<>
{t=x;x=y;y=t;}
while ((r=x%y)!=0)
{ x=y;
y=r;
}
return y;
}
int lcm(int x,int y,int h) /*求两整数的最小公倍数*/
{
return(x*y/h);
}
void main ( )
{ int a,b,df,sc; /* df:所求的最大公约数,sc:所求的最小公倍数*/ printf("Input a,b\");
scanf(“%d%d”,&a,&b);
df=gcf(a,b);
printf(“G.C.F=%d\”,df);
sc=lcm(a,b,df);
printf(“L.C.M=%d\”,sc);
}
8.2 求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大于0,等于0和小于0时的根,并输出结果。
从主函数输入a,b,c 的值。
# include
void real_root(float a,float b,float disc) /*求方程的两个不相同的实根*/
{float x1,x2;
x1=(-b+sqrt(disc))/(2*a);
x2=(-b-sqrt(disc))/(2*a);
printf("x1=%5.2f\x2=%5.2f\",x1,x2);
}
void equal_root(float a,float b) /*求方程的两个相同的实根*/
{ float x1,x2;
x1=x2=(-b)/(2*a);
printf("x1=%5.2f\x2=%5.2f\",x1,x2);
}
void imaginary_root(float a,float b,float disc) /*求方程的两个
不相同的虚根*/
{ float p,q;
p=-b/(2*a);
q=sqrt(disc)/(2*a);
printf("x1=%5.2f+%5.2fi\x2=%5.2f-%5.2fi\",p,q,p,q);
}
void main ( )
{
float a,b,c,disc;
printf("\Input a,b,c:\");
scanf("%f%f%f",&a,&b,&c);
disc=b*b-4*a*c;。