西工大C语言大作业习题答案.docx
《西工大C语言大作业习题答案.docx》由会员分享,可在线阅读,更多相关《西工大C语言大作业习题答案.docx(17页珍藏版)》请在冰豆网上搜索。
西工大C语言大作业习题答案
童鞋们,快来呀!
答案!
答案!
no1.绘制余弦曲线
在屏幕上用“*”显示0~360度的余弦函数cos(x)曲线
*问题分析与算法设计
如果在程序中使用数组,这个问题十分简单。
但若规定不能使用数组,问题就变得不容易了。
关键在于余弦曲线在0~360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:
输出第一行信息后,只能向下一行输出,不能再返回到上一行。
为了获得本文要求的图形就必须在一行中一次输出两个“*”。
为了同时得到余弦函数cos(x)图形在一行上的两个点,考虑利用cos(x)的左右对称性。
将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形与180~360度的图形是左右对称的,若定义图形的总宽度为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。
程序中利用反余弦函数acos计算坐标(x,y)的对应关系。
使用这种方法编出的程序短小精炼,体现了一定的技巧。
*程序说明与注释
#include
#include
voidmain()
{
doubley;
intx,m;
for(y=1;y>=-1;y-=0.1)
{
m=acos(y)*10;
for(x=1;x printf("*");
for(;x<62-m;x++)printf("");
printf("*\\n");
}
}
no2.绘制余弦曲线和直线
在屏幕上显示0~360度的cos(x)曲线与直线f(x)=45*(y-1)+31的迭加图形。
其中cos(x)图形用“*”表示,f(x)用“+”表示,在两个图形相交的点上则用f(x)图形的符号。
*问题分析与算法设计
本题可以在上题的基础上进行修改。
图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。
为此,可以先判断图形的交点,再分别控制打印两个不同的图形。
*程序注释与说明
#include
#include
voidmain()
{
doubley;
intx,m,n,yy;
for(yy=0;yy<=20;yy++)
{
y=0.1*yy;
m=acos(1-y)*10;
n=45*(y-1)+31;
for(x=0;x<=62;x++)
if(x==m&&x==n)printf("+");
elseif(x==n)printf("+");
elseif(x==m||x==62-m)printf("*");
else printf("");
printf("\\n");
}
}
--------------------------------------------------------------------------------
no3.绘制圆
在屏幕上用“*”画一个空心的圆
*问题分析与算法设计
打印圆可利用图形的左右对称性。
根据圆的方程:
R*R=X*X+Y*Y
可以算出圆上每一点行和列的对应关系。
*程序说明与注释
#include
#include
voidmain()
{
doubley;
intx,m;
for(y=10;y>=-10;y--)
{
m=2.5*sqrt(100-y*y);
for(x=1;x<30-m;x++)printf("");
printf("*");
for(;x<30+m;x++)printf("");
printf("*\\n");
}
}
no4.歌星大奖赛
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。
选手最后得分为:
去掉一个最高分和一个最低分后其余8个分数的平均值。
请编写一个程序实现。
*问题分析与算法实现
这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。
*程序说明与注释
#include
voidmain()
{
intinteger,i,max,min,sum;
max=-32768;
min=32767;
sum=0;
for(i=1;i<=10;i++)
{
printf("Inputnumber%d=",i);
scanf("%d",&integer);
sum+=integer;
if(integer>max)max=integer;
if(integer }
printf("Canceledmaxscore:
%d\\nCanceledminscore:
%d\\n",max,min);
printf("Averagescore:
%d\\n",(sum-max-min)/8);
}
*运行结果
Inputnumber1=90
Inputnumber2=91
Inputnumber3=93
Inputnumber4=94
Inputnumber5=90
Inputnumber6=99
Inputnumber7=97
Inputnumber8=92
Inputnumber9=91
Inputnumber10=95
Canceledmaxscore:
99
Canceledminscore:
90
Averagescore:
92
*思考题
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接返平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
--------------------------------------------------------------------------------
no5.求最大数
问555555的约数中最大的三位数是多少?
*问题分析与算法设计
根据约数的定义,对于一个整数N,除去1和它自身外,凡能整除N的数即为N的约数。
因此,最简单的方法是用2到N-1之间的所有数去除N,即可求出N的全部约数。
本题只要求取约数中最大的三位数,则其取值范围可限制在100到999之间。
*程序说明与注释
#include
voidmain()
{
longi;
intj;
printf("Pleaseinputnumber:
");
scanf("%ld",&i);
for(j=999;j>=100;j--)
if(i%j==0)
{
printf("Themaxfactorwith3digitsin%ldis:
%d,\\n",i,j);
break;
}
}
*运行结果
输入:
555555
输出:
Themaxfactorwith3digitsin555555is:
777
no6.高次方数的尾数
求13的13次方的最后三位数
*问题分析与算法设计
解本题最直接的方法是:
将13累乘13次方截取最后三位即可。
但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。
事实上,题目仅要求最后三位的值,完全没有必要求13的13次方的完整结果。
研究乘法的规律发现:
乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。
利用这一规律,可以大大简化程序。
*程序说明与注释
#include
voidmain()
{
inti,x,y,last=1;
printf("InputXandY(X**Y):
");
scanf("%d**%d",&x,&y);
for(i=1;i<=y;i++)
last=last*x%1000;
printf("Thelast3digitsof%d**%dis:
%d\\n",x,y,last%1000);
}
*运行结果
InputXandY(X**Y):
13**13
Thelast3digitsof13**13is:
253
InputXandY(X**Y):
13**20
Thelast3digitsof13**20is:
801
--------------------------------------------------------------------------------
no8.借书方案知多少
小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
*问题分析与算法设计
本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。
首先对五本书从1至5进行编号,然后使用穷举的方法。
假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
*程序说明与注释
voidmain()
{
inta,b,c,count=0;
printf("TherearediffrentmethodsforXMtodistributebooksto3readers:
\\n");
for(a=1;a<=5;a++)
for(b=1;b<=5;b++)
for(c=1;a!
=b&&c<=5;c++)