c语言练习题答案.docx
《c语言练习题答案.docx》由会员分享,可在线阅读,更多相关《c语言练习题答案.docx(38页珍藏版)》请在冰点文库上搜索。
c语言练习题答案
2.1合法的为:
t3_var
2.2选择填空
(1)C
(2)B
(3)A
(4)B
(5)D
(6)D
(7)D
(8)CB
2.3
(1)sqrt(a*a+b*b)/(2*c)
或sqrt(pow(a,2)+pow(b,2))/(2*c)
(2)fabs((a+b)*(c+d)+2)
(3)(log(x)+sin(y))/2(注:
y应为弧度)
例:
若y值为30°,sin(y)应写成sin(3.14/180*30),不能直接写成sin(30)
(4)2*3.1415*r
或#definePI3.1415
表达式写为:
2*PI*r
(5)1/(1+1.0/x)
(6)(sin(3.14/180*30)+2*exp(x))/(2*y+pow(y,x))
习题3答案
3.1答案:
表达式语句,函数调用语句,控制语句,空语句和复合语句。
3.2答案:
(1)C
(2)D
3.3答案:
(1)错误:
在scanf函数中,参数应是a,b两个变量的地址。
改正:
scanf("%d,%d",&a,&b);
(2)错误:
数据输出格式与数据类型不匹配。
改正:
printf("%f",f);
(3)错误:
数据输入格式与数据类型不匹配。
改正:
scanf("%lf%ld",&var,&a);
(4)错误:
在scanf函数中的输入格式控制串中多了’\n’,a,b前面少了’&’。
改正:
scanf("%d,%d",&a,&b);
(5)错误:
%f的输入格式不应有精度控制。
改正:
scanf("%5f",&f);
(6)错误:
程序输入错误使得变量a,b的值不是6,2。
改正:
应输入a=6,b=2↙
3.4答案:
(1)aabbccabc
(2)011
(3)68
(4)3.500000
(5)129
139
(6)129
139
(7)-1,65535,177777,ffff
(8)123.400002,1.234000e+002,123.4
3.5已知三角形的三边长a,b,c,计算求三角形面积的公式为:
=
area=
要求编写程序,从键盘输入a,b,c的值,计算并输出三角形的面积area。
参考答案:
因为1/2在C语言中的值为0,整个表达式为0,s值始终是0,所以结果是错误的。
程序如下:
#include
#include
main()
{
floata,b,c;/*a,b,c为三边变量*/
floats,area;
printf("Inputa,b,c:
");
scanf("%f,%f,%f",&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%.2f\n",area);
}
程序运行结果:
Inputa,b,c:
3,4,5↙
area=6.00
3.6编程从键盘输入圆的半径r,计算并输出圆的周长和面积。
程序参考答案:
#include
#definePI3.14
main()
{
floatr;/*r为半径变量*/
floatcircum,area;
printf("Inputr:
");
scanf("%f",&r);
circum=2*PI*r;
area=PI*r*r,
printf("circum=%.2f,area=%.2f\n",circum,area);
}
程序运行结果:
Inputr:
5↙
circum=31.40,area=78.50
4.1简答题:
所谓算法,就是一个有穷规则的集合,其中的规则确定了一个解决某一特定类型问题的运算序列。
简单的说,就是为解决一个具体问题而采取的确定的有限的操作步骤,当然这里我们所说的算法仅指计算机算法,即计算机能执行的算法。
每个程序都要依靠算法和数据结构,在某些特殊领域,例如计算机图形学、数据结构、语法分析、数值分析、人工智能和模拟仿真等等,解决问题的能力几乎完全依赖于最新的算法和数据结构。
因此,针对某一应用领域,要想开发出高质高效的程序,除了要熟练掌握程序设计语言这种工具和必要的程序设计方法以外,更重要的是要多了解、多积累并逐渐学会自己设计一些好的算法。
结构化程序设计是一种进行程序设计的原则和方法,按照这种原则和方法设计出的程序的特点是:
结构清晰,容易阅读,容易修改,容易验证。
结构化程序设计的基本思想归纳起来有以下几点:
●采用顺序、选择和循环三种基本结构作为程序设计的基本单元,避免无限制地使用goto语句而使流程任意转向。
●三种基本结构应具有如下良好特性:
1只有一个入口。
2只有一个出口。
3无死语句,即不存在永远都执行不到的语句。
4无死循环,即不存在永远都执行不完的循环。
●程序设计采用“自顶向下、逐步求精”和模块化的方法。
自顶向下(Top-down)方法是先写出结构简单清晰的主程序来表达整个问题,在此问题中包含复杂的子问题用子程序来实现,若子问题中还包含复杂的子问题,再用另外一个子程序来解决,直到每一细节都可以用高级语言清楚表达为止。
逐步求精技术可以理解为是一种不断地自底向上的修正所补充的自顶向下的程序设计方法。
4.2选择题
C
C
D
B
D
A
4.3写出下列程序的运行结果。
over!
right
right
right?
abcdefg$abcdefgEnd!
abcdefgEnd!
******
******
******
******
4.4阅读程序,按要求,在空白处填写适当的表达式或语句,使程序完整,并符合题目要求。
(year%4==0&&year%100!
=0)||(year%400==0)
flag
①(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')
②ch<='9'&&ch>='0'
③ch==''
fahr
celsius=5.0/9*(fahr-20)
fahr=fahr+step
4.5编程判断输入整数的正负性和奇偶性。
流程图如图4-1。
#include
main()
{
intm;
scanf("%d",&m);/*输入一个整数*/
if(m>=0)/*是否为正数*/
{
if(m%2==0)/*是正数,且能被2整除,是正偶数*/
{
printf("%disapositiveeven\n",m);
}
else/*不能被2整除,是正奇数*/
{
printf("%disapositiveodd\n",m);
}
}/*if(m>=0)结束*/
else
{
if(m%2==0)
{
printf("%disanegativeeven\n",m);/*是负偶数*/
}
else
{
printf("%disanegativeodd\n",m);/*是负奇数*/
}
}
}
程序运行结果如下:
第一次运行:
6↙
6isapositiveeven
第二次运行:
-7↙
6isanegativeodd
4.6编程计算分段函数:
,输入x,打印出y值。
流程图如图4-2。
#include
#include
main()
{
intx;
doubley;
scanf("%d",&x);/*输入一个整数*/
if(x>0)
{
y=exp(-x);/*如果大于0,计算y=exp(-x)的值*/
}
elseif(x==0)
{
y=1;/*x=0,则y=1*/
}
else
{
y=-exp(x);/*x<0,则y=-exp(x)*/
`}
printf("y=%f\n",y);
}
程序运行结果如下:
第一次运行:
4↙
y=0.018316
第二次运行:
0↙
y=1.000000
第三次运行:
-4↙
y=-0.018316
4.7输入三角形的三条边a,b,c,判断它们能否构成三角形,若能则指出是何种三角形:
等腰三角形、直角三角形、一般三角形。
流程图如图4-3。
#include
#include
#defineLIMIT1e-1
main()
{
floata,b,c;
intflag=1;
scanf("%f,%f,%f",&a,&b,&c);/*输入三角形的三条边*/
if((a+b)>c
&&((b+c)>a)
&&((a+c)>b))/*三角形的基本条件*/
{
if(fabs(a-b)<=LIMIT
||fabs(b-c)<=LIMIT
||fabs(c-a)<=LIMIT)/*等腰三角形的条件*/
{
printf("等腰");
flag=0;
}
if(fabs(a*a+b*b-c*c)<=LIMIT
||fabs(a*a+c*c-b*b)<=LIMIT
||fabs(c*c+b*b-a*a)<=LIMIT)/*直角三角形的条件*/
{
printf("直角");
flag=0;
}
if(flag)
{
printf("一般");
}
printf("三角形\n");
}
else
{
printf("不是三角形\n");
}
}
程序运行结果如下:
第一次运行:
3,4,5↙
直角三角形
第二次运行:
4,4,5↙
等腰三角形
第三次运行:
10,10,14.14↙
等腰直角三角形
第四次运行:
3,4,9↙
不是三角形
4.8在屏幕上显示一张如下所示的时间表:
*****Time*****
1morning
2afternoon
3night
Pleaseenteryourchoice:
操作人员根据提示进行选择,程序根据输入的时间序号显示相应的问候信息,选择1时显示"Goodmorning",选择2时显示"Goodafternoon",选择3时显示"Goodnight",对于其它选择显示"Selectionerror!
",用switch语句编程实现。
算法思想:
使用printf函数输出一个简单的菜单语句,通过switch语句进行选择。
需要注意的问题是:
输入选项是字符型的,所以在case后的数字要加单引号。
#include
main()
{
charc;
printf("*****Time*****\n");
printf("1morning\n");
printf("2afternoon\n");
printf("3night\n");
printf("pleaseenteryourchoice");/*建立相应的菜单*/
c=getchar();/*输入选项*/
switch(c)/*通过switch选择*/
{
case'1':
printf("Goodmorning\n");
break;
case'2':
printf("Goodafternoon\n");
break;
case'3':
printf("Goodnight\n");
break;
default:
printf("Selectionerror!
\n");
}
}
程序运行结果如下:
第一次运行:
*****Time*****
1morning
2afternoon
3night
Pleaseenteryourchoice:
1↙
Goodmoning
第二次运行:
*****Time*****
1morning
2afternoon
3night
Pleaseenteryourchoice:
3↙
Goodnight
4.9读入一个年份和月份,打印出该月有多少天(考虑闰年),用switch语句编程。
#include
main()
{
intyear,month;
scanf("%d,%d",&year,&month);/*输入相应的年和月*/
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
printf("31days\n");
break;
case2:
if((year%4==0&&year%100!
=0)||(year%400==0))
{
printf("29days\n");/*闰年的2月有29天*/
}
else
{
printf("28days\n");/*平年的2月有28天*/
}
break;
case4:
case6:
case9:
case11:
printf("30days\n");
break;
default:
printf("Inputerror!
\n");
}
}
程序运行结果如下:
第一次运行:
1988,5↙
31days
第二次运行:
1988,2↙
29days
第三次运行:
1989,2↙
28days
4.10编程计算1+3+5+7+……+99+101的值。
算法一:
利用for循环语句实现,在循环体外为sum赋初值0。
流程图如图4-4。
#include
main()
{
inti,sum=0;
for(i=1;i<=101;i=i+2)
{
sum=sum+i;
}
printf("sum=%d\n",sum);
}
算法二:
利用while循环语句实现,在循环体外为i和sum赋初值。
#include
main()
{
inti=1,sum=0;
while(i<=101)
{
sum=sum+i;
i=i+2;
}
printf("sum=%d\n",sum);
}
程序运行结果如下:
sum=2601
4.11编程计算1*2*3+3*4*5+……+99*100*101的值。
算法思想:
用累加算法,通项公式为:
term=i*(i+1)*(i+2);i=1,3,…,99。
或者为:
term=(i-1)*i*(i+1);i=2,4,…,100。
步长为2。
流程图如图4-5。
#include
main()
{
inti;
longterm,sum=0;
for(i=1;i<=99;i=i+2)
{
term=i*(i+1)*(i+2);
sum=sum+term;
}
printf("sum=%ld",sum);
}
程序运行结果如下:
sum=13002450
4.12编程计算1!
+2!
+3!
+4!
+……+10!
的值。
算法一:
用累加算法,累加项为term=term*i;;i=1,2,…10。
term初值为1,使用单重循环完成。
流程图如图4-6。
#include
main()
{
longterm=1,sum=0;
inti;
for(i=1;i<=10;i++)
{
term=term*i;
sum=sum+term;
}
printf("1!
+2!
+...+10!
=%ld\n",sum);
}
算法二:
用内层循环求阶乘,外层循环控制累加的项数。
#include
main()
{
longterm,sum=0;
inti,j;
for(i=1;i<=10;i++)
{
term=1;
for(j=1;j<=i;j++)
{
term=term*j;
}
sum=sum+term;
}
printf("1!
+2!
+…+10!
=%ld\n",sum);
}
程序运行结果为:
1!
+2!
+…+10!
=4037913
4.13编程计算a+aa+aaa+….+aa..a(n个a)的值,n和a的值由键盘输入。
算法思想:
用累加算法,累加项为term=term*10+a;i=1,2,…n。
term初值为0。
流程图如图4-7。
#include
main()
{
longterm=0,sum=0;
inta,i,n;
printf("Inputa,n:
");
scanf("%d,%d",&a,&n);/*输入a,n的值*/
for(i=1;i<=n;i++)
{
term=term*10+a;/*求出累加项*/
sum=sum+term;/*进行累加*/
}
printf("sum=%ld\n",sum);
}
程序运行如下:
Inputa,n:
2,4↙
sum=2468
4.14利用
前100项之积计算π。
算法一:
采用累乘方法,累乘项为term=n*n/((n-1)*(n+1));n=2,4,…,100,步长为2。
流程图如图4-8。
#include
main()
{
floatterm,result=1;/*累乘项初值应为1*/
intn;
for(n=2;n<=100;n=n+2)
{
term=(float)(n*n)/((n-1)*(n+1));/*计算累乘项*/
result=result*term;
}
printf("result=%f\n",2*result);
}
算法二:
采用累乘方法,累乘项为term=2*n*2*n/((2*n-1)*(2*n+1));n=1,2,…,50,步长为1。
#include
main()
{
floatresult=1,term;
intn;
for(n=1;n<=50;n++)
{
term=(float)(2*n*2*n)/((2*n-1)*(2*n+1));/*计算累乘项*/
result=result*term;
}
printf("result=%f\n",2*result);
}
程序运行结果为:
result=3.126078
4.15利用泰勒级数计算
的近似值,
,当最后一项的绝对值小于10-5时认为达到精度要求,要求统计总共累加了多少项。
算法思想:
采用累加算法:
e=e+term;寻找累加项的构成规律:
利用前项计算后项比寻找统一的累加项表示形式要简单一些,由
可以发现前后项之间的关系是:
termn=termn-1÷n,写成C语句便是:
term=term/n;term初值为1.0,n初值也为1,n按n=n+1变化。
统计累加项数只要设置一个计数器变量即可,这里,计数器变量取名为count,初值为0,在循环体中每累加一项就加一次1。
流程图如图4-9。
#include
main()
{
intn=1,count=1;
floate=1.0,term=1.0;
while(fabs(term)>=1e-5)
{
term=term/n;
e=e+term;
n++;
count++;
}
printf("e=%f,count=%d\n",e,count);
}
程序运行结果为:
e=2.178282,count=10
4.16计算1-1/2+1/3-1/4+……+1/99-1/100+……,直到最后一项的绝对值小于10-4为止。
算法思想:
采用累加算法,累加项通式为:
term=sign/n;分子sign=-sign;初值为1,分母n=n+1;初值为1。
流程图如图4-10。
#include
#include
main()
{
intn=1;
floatterm=1.0,sign=1,sum=0;
while(fabs(term)>=1e-4)/*判断末项大小*/
{
term=sign/n;/*求出累加项*/
sum=sum+term;/*累加*/
sign=-sign;/*改变项的符号*/
n++;/*分母加1*/
}
printf("sum=%f\n",sum);
}
程序运行结果为:
sum=0.693092
4.17利用泰勒级数计算sin(x)
sin(x)≈x-x3/3!
+x5/5!
-x7/7!
+x9/9!
-…
要求最后一项的绝对值小于10-5,并统计出此时累加了多少项。
算法思想:
x由键盘输入,采用累加算法,sum=sum+term,sum初值为x,利用前项求后项的方法计算累加项:
term=-term*x*x/((n+1)*(n+2));term初值