大学cc++语言程序设计课后答案 阳小华主编.docx
《大学cc++语言程序设计课后答案 阳小华主编.docx》由会员分享,可在线阅读,更多相关《大学cc++语言程序设计课后答案 阳小华主编.docx(37页珍藏版)》请在冰豆网上搜索。
大学cc++语言程序设计课后答案阳小华主编
习题答案
习题1(参考答案)
1.程序与算法的概念及二者的区别是什么?
程序:
为了实现特定目标或解决特定问题而用计算机语言偏写的指令序列,它由算法和数据结构组成。
算法:
(Algorithm)是在有限步骤内求解某一问题所使用的一组定义明确的规则。
通俗地讲,就是计算机解题的步骤。
算法与程序的区别:
计算机程序是算法的一个实例,同一个算法可以用不同的计算机语言来表达。
2.简述程序设计语言发展的过程
程序设计语言经过最初的机器代码到今天接近自然语言的表达,经过了四代的演变。
一般认为机器语言是第一代,符号语言即汇编语言为第二代,面向过程的高级语言为第三代,面对象的编程语言为第四代。
3.简述高级程序设计语言中面向过程与面向对象的概念。
“面向过程”是一种以过程为中心的编程思想。
首先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步地实现,使用的时候依次调用函数即可。
一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。
“面向对象”是一种以事物为中心的编程思想。
面向对象的方法主要是将事物对象化,对象包括属性与行为。
面向过程与面向对象的区别:
在面向过程的程序设计中,程序员把精力放在计算机具体执行操作的过程上,编程关注的是如何使用函数去实现既定的功能;而在面向对象的程序设计中,技术人员将注意力集中在对象上,把对象看做程序运行时的基本成分。
编程关注的是如何把相关的功能(包括函数和数据)有组织地捆绑到一个对象身上。
4.C语言程序的特点是什么?
(1)C语言非常紧凑、简洁,使用方便、灵活,有32个关键字,有9种流程控制语句。
(2)C语言运算符丰富,共有45个标准运算符,具有很强的表达式功能,同一功能表达式往往可以采用多种形式来实现。
(3)数据类型丰富。
C语言的数据类型有整型、实型、字符型、数组类型、结构类型、共用类型和指针类型,而且还可以用它们来组成更复杂的数据结构,加之C语言提供了功能强大的控制结构,因而使用C语言能非常方便地进行结构化和模块化程序设计,适合于大型程序的编写、调试。
(4)用C语言可直接访问物理地址,能进行二进制位运算等操作,即可直接同机器硬件打交道。
它具有“高级语言”和“低级语言”的双重特征,既能用于系统软件程序设计,又能用于通用软件程序设计。
(5)C语言生成的目标代码质量高、程序执行速度快。
一般只比用汇编语言生成的目标代码的效率低20%左右。
(6)可移植性好。
5.源程序执行过程中,有哪些步骤?
C语言源程序的执行要经过:
编辑、编译、链接、运行等步骤。
6.简述MATLAB的主要应用领域有哪些?
MATLAB软件是矩阵实验室(MatrixLaboratory)的简称,是美国MathWorks公司开发的商业数学软件,主要包括MATLAB和Simulink两大部分。
它和Mathematica、Maple并称为三大数学软件。
MATLAB软件可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序,主要应用于工程计算、控制设计、信号处理与通信、图像处理、信号检测、金融建模设计与分析等领域,代表了当今国际科学计算软件的先进水平。
习题2(参考答案)
一、选择题
勘误:
3.以下定义语句中正确的是()。
A.inta=b=0;B.charA=65+1;b='b';
C.floata=1,*b=&a,*c=&b;D.doublea=0.0,b=1.1;
4.已知intx=10,y=3,表达式x/y的值是()。
15.在C语言中提供的合法的关键字是()。
A.switchB.cherC.CaseD.default
26.下列不可作为C语言赋值语句的是()。
A.x=3,y=5;B.a=b=6;C.i--;D.y=int(x);
40.下列变量定义中合法的是()。
A.float_a=1-.1e-1;B.doubleb=1+5e2.5;
C.longdo=0xfdaL;D.float2_and=1-e-3;
44.以下选项中不属于字符常量的是()。
A.'C'B."C"C.'\xCC0'D.'\072'
46题与17题重了
47题A项选择:
a==1后面加分号就合法了,所以只有“B”项合法
1
2
3
4
5
6
7
8
9
10
C
A
BD
C
B
B
C
B
A
D
11
12
13
14
15
16
17
18
19
20
C
C
D
A
AD
B
C
A
D
C
21
22
23
24
25
26
27
28
29
30
C
D
A
D
B
C
C
C
A
D
31
32
33
34
35
36
37
38
39
40
C
D
B
C
A
D
B
C
D
A
41
42
43
44
45
46
47
48
49
50
B
D
B
BC
A
C
B
A
D
D
二、填空题
1.
255
2.
a/(b*c)
3.
20
4.
1.0
5.
x==0或(x==0)?
1:
0
6.
x<-5||x>5
7.
97或字符‘a’
8.
0
9.
2.5
10.
3.5
11.
3
12.
9,11,9,10
13.
a+=a;24,a-=2;10,a*=2+3;60,a%=(n%=2);0,a/=a+a;0,a+=a-=a*=a;0
14.
8
15.
2
习题3(参考答案)
1.编程实现:
用字符输入/输出函数输入3个字符,将它们反向输出。
参考代码(尽量运用本章所学知识)
#include
main( )
{charc1,c2,c3;
c1=getchar();c2=getchar();c3=getchar();
putchar(c3);putchar(c2);putchar(c1);
}
2.编程实现:
用格式输入/输出函数输入3个字符,将它们反向输出并输出它们的ASCII值。
参考代码(尽量运用本章所学知识)
#include
main( )
{charc1,c2,c3;
scanf("%c%c%c",&c1,&c2,&c3) ;
printf("%c%d,%c%d,%c%d",c3,c3,c2,c2,c1,c1) ;
}
3.变量k为float类型,调用函数:
scanf("%d",&k);
不能使变量k得到正确数值的原因是:
scanf("%d",&k);中的格式控制类型与变量k的定义类型不匹配,应将%d改为%f.
习题4答案
勘误:
6.若有以下定义:
中B答案的switch((int)x)
选择题
1.B2.A3.B4.B5.C6.B
阅读程序,写结果
7.128.139.*0**2*
10
if(s>=90)
m=4;
elseif(s>=80)
m=3;
elseif(s>=70)
m=2;
elseif(s>=60)
m=1;
else
m=0;
11有4个整数a,b,c,d,编写程序按大小输出
#include
main()
{inta,b,c,d,t;
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a
if(aif(aif(bif(bif(cprintf("%4d%4d%4d%4d",a,b,c,d);
}
12据所输入的3条边长值,判断它们能否构成三角形,如能构成,再判断是等腰三角形、直角三角形还是一般三角形。
源程序:
#include
#include"math.h"
main()
{floata,b,c,s,area;
scanf("%f%f%f",&a,&b,&c);
if((a+b>c)&&(a+c>b)&&(b+c>a)&&(fabs(a-b){
if(a==b&&b==c)
printf("等边三角形");
elseif(a==b||b==c||a==c)
printf("等腰三角形");
elseif((a*a+b*b==c*c)||(a*a+c*c==b*b)||(b*b+c*c==a*a))
printf("直角三角形");
elseprintf("一般三角形");
}
elseprintf("不能组成三角形");
}
13输入一个整数,如果能被3,4,5同时整除,则输出“YES”,否则输出“NO”。
#include
main()
{intt,flag;
scanf("%d",&t);
if(t%3==0&&t%4==0&&t%5==0)
printf("YES");
else
printf("NO");
}
14年号,判断是否为闰年。
判别闰年的条件是:
能被4整除但不能被100整除的年是闰年,能被400整除的年也是闰年。
#include
main()
{intyear;
printf("inputtheyear:
");
scanf("%d",&year);
if(year%4==0&&year%100!
=0||year%400==0)
printf("%disleapyear\n",year);
else
printf("%dis'tleapyear\n",year);
}
15下面程序根据以下函数关系,对输入的每个x值,计算出y值。
请分析程序填空。
x
y
x>10
3x+10
1x(x+2)
x≤1
x2
#include
main()
{doublex,y;
scanf("%lf",&x);
if(x>10)y=3*x+10;
elseif(x>1)y=x*x+2*x;
elsey=x*x-3*x+10;
printf("%lf\n",y);
}
习题5答案
选择题
1.A2.A3.D4.C5.D
6.A7.D8.D9.B10.C
阅读程序,写结果
11.1-212.2013.***14.2,4,6,8,10,
15.46.00000016.852
17.利用公式
公式求π。
#include
#include
main()
{doublepi=0,i=1,j=1,k;
do{
k=i/j;
pi=pi+k;
i=-i;
j=j+2;
}while(fabs(k)>1.0e-6);
printf("piis%lf",4*pi);
}
18.求两个数的最大公约数和最小公倍数。
最大公约数:
用大数整除小数,得到余数1;再用小数整除余数1,得到余数2;再用余数1整除余数2,……直到余数为0。
最小公倍数:
两数相乘再除以最大公约数。
#include
#include
main()
{intm,n,r,x,y;
scanf("%d%d",&m,&n);
x=m;
y=n;
if(mwhile((r=m%n)!
=0)
{m=n;
n=r;
}
printf("themaxcommondivisoris%d,themincommonmultipleis%d",n,x*y/n);
}
19.从三个红球、五个白球、六个黑球中任意取出六个球,且其中必须有白球,编程输出所有可能的组合。
#include
main()
{inti,j,k;
printf("\nhongbaihei\n");
for(i=0;i<=3;i++)
for(j=1;j<=5;j++)
{k=6-i-j;
if(k>=0)printf("%3d%3d%3d\n",i,j,k);
}
}
20.如果一个数等于其所有真因子(不包括该数本身)之和,则该数为完数。
例如:
6的真因子有1、2、3,且6=1+2+3,故6为完数。
求[2,1000]内的:
(1)最大的完数;
(2)完数数目。
#include
main()
{inta,i,m,number=0,max=0;
for(a=1;a<=1000;a++)
{m=0;
for(i=1;i<=a/2;i++)
if(a%i==0)m=m+i;
if(m==a){number++,max=m;}
}
printf("numberis%d,maxis%d\n",number,max);
}
第6章函数与编译预处理
一、选择题
1.C2.A3.A4.D5.A6.A7.C
8.B9.B10.C11.B12.B13.A14.D
15.C16.C17.C18.C19.A20.D21.B
22.B23.C24.A25.C26.D27.C28.D
二、写出下列程序的运行结果
1.72.123.94.8,175.56
6.8,87.369128.109.7
5
10.645411.30012.613.2
三、编程题(以下各题均用函数实现)
1.超级素数:
一个素数依次从低位去掉一位、两位……若所得的数依然是素数,如239就是超级素数。
试求100~9999之内:
(1)超级素数的个数;
(2)所有超级素数之和;
(3)最大的超级素数。
解:
(1)spn=30
(2)sps=10012(3)spm=7393
2.其平方等于某两个整数平方和的正整数称为弦数,例如因52=32+42,故5是弦数,求(121,130)这间的弦数个数以及最大和最小的弦数。
解:
n=4max=130min=122
3.有一个8层灯塔,每层所点灯数都等于该层上一层的两倍,一共有765盏灯,求塔底的灯数。
解:
384
4.编写程序,求
的结果。
解:
4037913
5.已知y=
,其中,f(x,n)=1-x2/2!
+x4/4!
-…(-1)nx2n/(2n)!
(n≥0),当x=5.6,n=7时,求y的值。
解:
-0.074521
6.编写程序,求三个数的最小公倍数。
#include
intfun(intx,inty,intz)
{intj,t,m,n;
j=1;
t=j%x;
m=j%y;
n=j%z;
while(t!
=0||m!
=0||n!
=0)
{j=j+1;
t=j%x;
m=j%y;
n=j%z;
}
returnj;
}
main()
{
intx1,x2,x3,j;
printf("Inputx1x2x3:
");
scanf("%d%d%d",&x1,&x2,&x3);
printf("x1=%d,x2=%d,x3=%d\n",x1,x2,x3);
j=fun(x1,x2,x3);
printf("Theminimalcommonmultipleis:
%d\n",j);
}
7.已知:
,编写程序,求S的值。
例如,当k为10时,S的值应为:
1.533852。
#include
#include
doublefun(intk)
{
intn;
doubles,w,p,q;
n=1;
s=1.0;
while(n<=k)
{w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
returns;
}
main()
{
printf("%f\n",fun(10));
}
第7章数组
一、选择题
1.C2.A3.C4.D5.D6.C7.A
8.A9.A10.B11.A12.D13.D14.C
15.C16.D17.D18.D19.B20.A21.B
22.B23.B24.C25.D26.D27.D28.D29.C
二、写出下列程序的运行结果
1.abcdabcdabcdabcdbcdabcdabcdcdabcdd2.4
3.1,2,3,8,7,6,5,4,9,10,4.9,8
三、程序填空
1.
(1)k
(2)-1
2.
(1)n%base
(2)[d]
3.
(1)x[i++]或y[i++]
(2)i++
4.
(1)‘a’+h-10
(2)s[i]=(n<9)?
n+’0’:
’a’+n-10
5.
(1)s[i]!
=’\0’
(2)s[j++]=s[i]
6.
(1)s[j]!
=’\0’&&t[k]!
=’\0’
(2)t[k]==’\0’
四、编程题(每个程序的数据结构均用数组)
1.编写程序:
从键盘上输入一个字符,用折半查找法找出该字符在已排序的字符串a中的位置。
若该字符不在a中则输出**。
#include
main()
{
charc,a[10]="abcdefghi";
inttop,bot,mid;
printf("inputc:
\n");
scanf("%c",&c);
printf("c=\'%c\'\n",c);
for(top=0,bot=10;top<=bot;)
{
mid=(top+bot)/2;
if(c==a[mid])
{
printf("Thepositionis%d\n",mid+1);
break;
}
elseif(c>a[mid])top=mid+1;
elsebot=mid-1;
}
if(top>bot)printf("*"\n);
}
2.编写程序:
输出某数列的前20项,该数列第1、2项分别为0和1,以后每个奇数编号的项是前两项之和,每个偶数编号的项是前两项之差的绝对值。
生成的20个数存在一维数组x中,并按每行4项的形式输出。
#include
#include
main()
{
intx[21],i;
x[1]=0,x[2]=1;
i=3;
do
{
x[i]=x[i-2]+x[i-1];
x[i+1]=fabs((double)(x[i-1]-x[i]));
i=i+2;
}while(i<=20);
for(i=1;i<=20;i++)
{
printf("%6d",x[i]);
if(i%4==0)printf("\n");
}
}
3.编写程序:
将s所指字符串中除了下标为奇数、同时ASCII值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新串放在t所指的数组中。
例如:
若s所指字符串中的内容为:
“ABCDEFG12345”,则最后t所指的数组中的内容应是:
“135”。
#include
#include
voidfun(char*s,chart[])
{
inti,j=0;
for(i=1;iif(i%2==1&&s[i]%2!
=0)t[j++]=s[i];
t[j]='\0';
}
main()
{
chars[100],t[100];
printf("\nPleaseenterstrings:
");
scanf("%s",s);
fun(s,t);
printf("\nTheresultis:
%s\n",t);
}
4.编写程序:
一个自然数平方的末几位与该数相同时,称此数为自同构数。
例如,因252=625,故25为自同构数。
求出[1,700]之间的:
①最大的自同构数;②自同构数数目。
#include
main()
{
inti,n,ns,flag,count,r,rs;
staticinta[50];
count=0;
for(i=1;i<700;i++)
{
n=i;
ns=i*i;flag=1;
while(n>0&&flag)
{
r=n%10;n=n/10;
rs=ns%10;ns=ns/10;
if(rs!
=r)flag=0;
}
if(flag)
{
a[count]=i;count++;
printf("%5d",i);
}
}
printf("\ncount=%d,max=%d\n",count,a[count-1]);
}
(1)最大的自同构数:
625
(2)自同构数数目:
7个(1、5、6、25、76、376、625)
5.已知:
f(0)=f
(1)=1
f
(2)=0
f(n)=f(n-1)-2*f(n-2)+f(n-3)(n>2)
编写程序:
求f(0)~f(50)中的最大值。
#include
main()
{
intn;
doublef[181],max=0;
f[0]=f[1]=1;f[2]=0;
for(n=3;n<=50;n++)
{
f[n]=f[n-1]-2*f[n-2]+f[n-3];
if(max}
printf("\nmax=%.0lf",max);
}
f(0)到f(50)中的最大值:
598325
6.编写程序:
自然数1~1000按顺时针围成一圈,首先取出1,然后顺时针方向按步长L=50取数(已取出的数不再参加计数),直至所有的数均取完为止,最后一个取出的数是多少?
#include
main()
{
inta[1001],i,s=0,n=1;
for(i=1;i<=1000;i+