C语言程序设计题目!2012年广东省ACM大赛试题!进来看补充有题目!写下注释!
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/10 14:29:48
C语言程序设计题目!2012年广东省ACM大赛试题!进来看补充有题目!写下注释!
有一个圆柱体形状的大厅,顶面天花板和底面地面的圆直径为D,侧面圆柱面高为H,顶面圆的圆心处挂了一根长L的钢丝绳,绳子下垂,下端系在一个直径为d的圆盘面的圆心处,悬挂起来的圆盘面与绳子垂直.底面圆的圆心处安装了一盏电灯,灯光照射向大厅的侧面和顶面,但会被悬挂的圆盘所阻挡.请编写程序计算大厅顶面和侧面部分可能被灯光照亮部分的面积.对程序的输入,是四个整数:H,D,L,d,其意义如前所述,输出是一个整数,是经舍入近似,得到的与所求面积最接近的整数数值,程序应允许0
有一个圆柱体形状的大厅,顶面天花板和底面地面的圆直径为D,侧面圆柱面高为H,顶面圆的圆心处挂了一根长L的钢丝绳,绳子下垂,下端系在一个直径为d的圆盘面的圆心处,悬挂起来的圆盘面与绳子垂直.底面圆的圆心处安装了一盏电灯,灯光照射向大厅的侧面和顶面,但会被悬挂的圆盘所阻挡.请编写程序计算大厅顶面和侧面部分可能被灯光照亮部分的面积.对程序的输入,是四个整数:H,D,L,d,其意义如前所述,输出是一个整数,是经舍入近似,得到的与所求面积最接近的整数数值,程序应允许0
求黄色这块面积是吧
首先进行一个判断
L/H>=d/D,那么顶面完全黑暗;然后开始着手部分被照亮的情况.
已经知道的是圆柱体侧面积为D*pi*H;
顶部面积为 D^2/4*pi
阴影部分面积:d^2/4*pi*(H/(H-L))^2 前提L/H <= d/D
我先带入算一下是不是284:
侧面积=D*pi*H=276;
顶部面积=D^2/4*pi=50;
阴影部分面积:d^2/4*pi*(H/(H-L))^2=42;
经过计算276+50-42=284;理论正确之后我们开始加入代码:
#include<stdio.h>
#include<math.h>
#define pi 3.14
struct circle
{
int H,D,d,L;//定义好4个数据
int Bigarea();//顶部圆面积
int smallarea();//阴影面积
int cearea();//圆柱侧面积
bool barea();//直接测试阴影是否全部挡住了顶部
circle()
{
H=0;D=0;d=0;L=0;
}//构造函数
void setcircle(int,int,int,int);
};
int main()
{
circle A;//创建类A
int H,D,L,d;
printf("请输入圆柱体的高H:");
scanf("%d",&H);
while(!(H<1001&&H>0))
{
printf("圆柱体的高必须是0到1001之间,请重新输入:");
scanf("%d",&H);
}
printf("请输入圆柱体的直径D:");
scanf("%d",&D);
while(!(D<1001&&D>0))
{
printf("圆柱体的直径必须是0到1001之间,请重新输入:");
scanf("%d",&D);
}
printf("请输入绳子长度L:");
scanf("%d",&L);
while(!(L<1001&&L>0&&L<H))
{
printf("绳子的长度必须是0到1001之间,并且比大圆的高H要小请重新输入:");
scanf("%d",&L);
}
printf("请输入小圆直径d:");
scanf("%d",&d);
while(!(d<1001&&d>0&&d<D))
{
printf("圆环半径必须是0到1001之间,并且比大圆D要小请重新输入:");
scanf("%d",&d);
}
printf("确认:您输入的数据为:圆柱高度%d,底面直径:%d,绳子长度:%d ,小圆直径:%d\n",H,D,L,d);
A.setcircle(H,D,d,L);
if ( A.barea())
{
int mianji=A.Bigarea()+A.cearea()-A.smallarea();
printf("您输入的数据处理结果为:%d",mianji);
}
else
{
printf("您输入的数据处理结果为:顶部完全被阴影所遮挡住了!\n");
}
}
int circle::Bigarea()
{
return (D/2)*(D/2)*pi;
}
int circle::smallarea()
{
return (d/2)*(d/2)*pi*H*H/(H-L)/(H-L);
}
int circle::cearea()
{
return pi*D*H;
}
void circle::setcircle(int a,int b,int c,int d)
{
H=a;D=b;this->d=c;L=d;
}
bool circle::barea()
{
if(L/H < d/D)
return true;
else
return false;
}本来想在修改一下,结果已经提交的代码不能改,你先复制过去运行一下看看,我都已经注释了、
再问: 我们用的是VC6.0!!一堆的BUG!
再答: 把BUG 提示发我看看。我vs2003 一个错误都没有~ #include 你把这个改成 #include 百度把我的头文件变成了乱码~
再问: 前提L/H
首先进行一个判断
L/H>=d/D,那么顶面完全黑暗;然后开始着手部分被照亮的情况.
已经知道的是圆柱体侧面积为D*pi*H;
顶部面积为 D^2/4*pi
阴影部分面积:d^2/4*pi*(H/(H-L))^2 前提L/H <= d/D
我先带入算一下是不是284:
侧面积=D*pi*H=276;
顶部面积=D^2/4*pi=50;
阴影部分面积:d^2/4*pi*(H/(H-L))^2=42;
经过计算276+50-42=284;理论正确之后我们开始加入代码:
#include<stdio.h>
#include<math.h>
#define pi 3.14
struct circle
{
int H,D,d,L;//定义好4个数据
int Bigarea();//顶部圆面积
int smallarea();//阴影面积
int cearea();//圆柱侧面积
bool barea();//直接测试阴影是否全部挡住了顶部
circle()
{
H=0;D=0;d=0;L=0;
}//构造函数
void setcircle(int,int,int,int);
};
int main()
{
circle A;//创建类A
int H,D,L,d;
printf("请输入圆柱体的高H:");
scanf("%d",&H);
while(!(H<1001&&H>0))
{
printf("圆柱体的高必须是0到1001之间,请重新输入:");
scanf("%d",&H);
}
printf("请输入圆柱体的直径D:");
scanf("%d",&D);
while(!(D<1001&&D>0))
{
printf("圆柱体的直径必须是0到1001之间,请重新输入:");
scanf("%d",&D);
}
printf("请输入绳子长度L:");
scanf("%d",&L);
while(!(L<1001&&L>0&&L<H))
{
printf("绳子的长度必须是0到1001之间,并且比大圆的高H要小请重新输入:");
scanf("%d",&L);
}
printf("请输入小圆直径d:");
scanf("%d",&d);
while(!(d<1001&&d>0&&d<D))
{
printf("圆环半径必须是0到1001之间,并且比大圆D要小请重新输入:");
scanf("%d",&d);
}
printf("确认:您输入的数据为:圆柱高度%d,底面直径:%d,绳子长度:%d ,小圆直径:%d\n",H,D,L,d);
A.setcircle(H,D,d,L);
if ( A.barea())
{
int mianji=A.Bigarea()+A.cearea()-A.smallarea();
printf("您输入的数据处理结果为:%d",mianji);
}
else
{
printf("您输入的数据处理结果为:顶部完全被阴影所遮挡住了!\n");
}
}
int circle::Bigarea()
{
return (D/2)*(D/2)*pi;
}
int circle::smallarea()
{
return (d/2)*(d/2)*pi*H*H/(H-L)/(H-L);
}
int circle::cearea()
{
return pi*D*H;
}
void circle::setcircle(int a,int b,int c,int d)
{
H=a;D=b;this->d=c;L=d;
}
bool circle::barea()
{
if(L/H < d/D)
return true;
else
return false;
}本来想在修改一下,结果已经提交的代码不能改,你先复制过去运行一下看看,我都已经注释了、
再问: 我们用的是VC6.0!!一堆的BUG!
再答: 把BUG 提示发我看看。我vs2003 一个错误都没有~ #include 你把这个改成 #include 百度把我的头文件变成了乱码~
再问: 前提L/H