图2,结构Person和Employee虽然内部构造相同,但使用了不同的名称,所以er1和pr1属于不同类型,直接赋值语法会报错,不过你可以使用强制类型转换,霸王硬上弓。
上一下机就明白了
思路:
总表面积就是两个侧面积+两个大圆面积-两个小圆面积。
算法不止一种,这里不是重点。重点是如何转换成编程思想。
1、根据题意,要使用结构体封装参数,因此需定义一个包含全部圆环参数的结构类型。
2、圆环参数需要输入,因此要定义一个输入函数,负责输入参数,验证参数,并存储到对应的结构变量。
3、解析功能需求,实现体积和面积分别需要计算圆的面积、周长和柱侧面积。所以程序应包含所有实现功能的函数,分别为:计算圆面积,计算圆周长,计算圆柱侧面积,计算圆柱体积。
(这里部分函数很简单,你可能想为什么不直接写在main函数中,因为这些代码在项目中可能会被多次重复调用,写成独立函数调用更简洁,且方便阅读、修改,这是一种编程思想)。
以下是我写代码,已详细备注:
#include <stdio.h>
#define PI 3.1415926
typedef struct ringClass//定义一个圆环结构类型
{
double r//外圆半径
double rh//内圆半径
double h//高
}RC
void SetRC(RC *prc)//给圆环结构输入赋值,参数传递结构变量地址!
double getRP(double pr)//获取圆周长的函数,参数是圆的半径
double getrRA(double pr)//获取圆面积的函数,参数是圆的半径
double getRCArea(RC rc)//获取圆环体表面积的函数
double getRCVolume(RC rc)//获取圆环体体积的函数
int main( )
{
RC rc={0,0,0}//定义一个圆环结构变量并初始化
SetRC(&rc)
printf("圆环表面结为:%lf\n",getRCArea(rc))
printf("圆环的体积为:%lf\n",getRCVolume(rc))
return 0
}
void SetRC(RC *prc)//给圆环结构输入赋值
{
printf("请输入分别圆环的参数:\n")
printf("外圆半径:"),scanf("%lf",&(prc->r))
printf("内圆半径:"),scanf("%lf",&(prc->rh))
printf("圆环的高:"),scanf("%lf",&(prc->h))
if(prc->r<=prc->rh)
{
printf("无效输入!外圆半径必须大于内圆半径\n\n")
SetRC(prc)
}
else printf("输入成功,参数为:r=%lf,rh=%lf,h=%lf\n",prc->r,prc->rh,prc->h)
}
double getRCVolume(RC rc)//获取环体积
{
double d1,d2,v1,v2
d1=getrRA(rc.r)//获取外圆柱顶圆面积
d2=getrRA(rc.rh)//获取内圆柱顶圆面积
v1=d1*rc.h//获取大圆柱体体积
v2=d2*rc.h//获取小圆柱体体积
return v1-v2//圆环体积就是大圆柱-小圆柱
}
double getRCArea(RC rc)//获取环表面积
{
double pr1,pr2,c1,c2,d1,d2
pr1=getRP(rc.r)//获取外圆柱体顶圆周长
pr2=getRP(rc.rh)//获取内圆柱体顶圆周长
c1=pr1*rc.h//获取外圆柱体的侧面积,顶圆周长乘以高
c2=pr2*rc.h//获取内圆柱体的侧面积
d1=getrRA(rc.r)//获取外圆柱顶圆面积
d2=getrRA(rc.rh)//获取内圆柱顶圆面积
return c1+c2+d1+d1-d2-d2//总表面积就是两个侧面积+两个大圆面积-两个小圆面积
}
double getRP(double pr)//获取圆周长
{
return 2*PI*pr
}
double getrRA(double pr)//获取圆面积
{
return PI*pr*pr
}