通过计算帮助选择,而不使用if语句

时间:2016-09-19 22:28:31

标签: c

问题

给定椭圆体的三个轴的长度计算物体的体积并确定 形状是球体(D),球体(P)还是斜角椭球体(C)。

  • 一个球体由三个轴中的两个共同长度组成。
  • 在一个球体中,所有三个轴的长度都相同。
  • 斜角椭圆体没有两条相同长度的轴。

禁止使用选择,包括逻辑和关系运算符。

到目前为止,这是我的代码:

*/
#include<stdio.h>
#define PI 3.1416

int main (void)
{
  //Local Declarations
  double axis1;
  double axis2;
  double axis3;
  double Vellipsoid;
  int factor;


  //Statements
  printf("Enter the length of all three axes: ");
  scanf("%lf %lf %lf", &axis1, &axis2, &axis3);
  Vellipsoid = ( 4 * PI * axis1 * axis2 * axis3 ) / 3;



  printf("\nObject volume: %10.2lf \n ", Vellipsoid);
  printf("Object Shape: ");

 return 0;
} //main

问题

我需要帮助编码以显示以下执行的方式:

示例输出#1(形状为球体):
输入所有三个轴的长度:10 5 10
对象量:2094.40
物体形状:D

示例输出#2(形状是球体):
输入所有三个轴的长度:7 7 7
对象量:1436.76
物体形状:P

示例输出#3(形状是斜角椭球):
输入所有三个轴的长度:9 4 6
对象量:904.78
对象形状:C

我如何能够对此进行编码,以便我可以将这些字符显示为类型形状的名称。

任何想法/例子都将不胜感激!

1 个答案:

答案 0 :(得分:0)

由于逻辑(&&||!)和关系(<<=>>=运算符出来了,我也不允许按位,这就是纯粹的平等:==

您可以先使用数学为这些案例定义一些指标。假设您的轴名为A,B,C。您可以确定:

  • Sphere:A - BB - C为零。
  • Spheroid:A - BB - CC - A中只有一个为零。
  • Scalene:A - BB - CC - A均为非零。

所以你可以按如下方式编写代码:

int abz = (axis1 - axis2) == 0.0;
int bcz = (axis2 - axis3) == 0.0;
int caz = (axis3 - axis1) == 0.0;
int is_sphere = (abz + bcz) == 2;
int is_spheroid = (abz + bcz + caz) == 1;
int is_scalene = (abz + bcz + caz) == 0;

请注意is_sphereis_spheroidis_scalene如何基于(差不多)相同计算的不同值:is_sphere除外,我们总是如此使用abz + bcz + caz。所以让我们改变它以使用相同的计算:

int is_sphere = (abz + bcz + caz) == 3;

现在,你也不允许选择,所以case语句和if语句都没有了。所以你甚至不需要is_XXXX值(它们只是为了说明)。相反,您可以使用数组:

char shape[4] = { 'C', 'D', '?', 'P' };
printf( "Shape: %c\n", shape[abz+bcz+caz] );

请注意,由于相等的传递属性,实际上不可能存在第3个值'?'

当然,这仍然是不必要的复杂。我们已经在使用平等。为什么要减去?

int abz = (axis1 == axis2);
int bcz = (axis2 == axis3);
int caz = (axis3 == axis1);

除非绝对必要,否则我建议你不要养成做这种无分支代码的习惯。在行业中,只有在具有合法优化要求时才能执行此操作。所有其他时间,您应该编写清晰且易于理解的代码。