读书人

小弟我用c写的 创建三角形

发布时间: 2012-02-06 15:52:44 作者: rapoo

我用c写的 创建三角形
/*
名称: 创建三角形

需求: 任意输入三条线段的长度,判断它们可以组成一个
什么形状的三角形(锐角三角形 钝角三角形 等腰三角形 等边三角形 直角三角形 等腰直角三角形)

实现: 首先判断输入的数据是否满足构建一个三角形,IsOk()实现此功能
如果不满足则要求重新输入一组数据,直到满足要求。

通过调用Form ()函数我们可以知道这是个什么形状的三角形

主函数规定了输入结束的条件

编译环境: VC6.0

版本号: beta 1
*/

#include <stdio.h>
#include <math.h>

bool IsOk (float x, float y, float z)
{// 判断这三条线段是否可以组成一个三角形
if (x > 0 && y > 0 && z > 0)
{
if ((x + y > z) && (fabs(x - y) < z))
//the same: if ((x + y > z) && ((x - y > 0) ? (x - y < z):(y - x < z)))
return true; // 满足条件
}
return false;
}

void Form (float x, float y, float z)
{// 判断三角形的形状

bool flag = false;
float temp;

if (x == y && x == z)
{
printf ( "等边三角形\n ");
}

else
{
if (x > y) // 前三个if语句是对x, y, z 进行从小到大的排序
{
temp = x;
x = y;
y = temp;
}
if (x > z)


{
temp = x;
x = z;
z = temp;
}
if (y > z)
{
temp = y;
y = z;
z = temp;
} // 至此 x <= y <= z

if (x == y || x == z || y == z) // 判断等腰
{
flag = true;
}

if (flag) // 当前是等腰三角形
{
if (x * x + y * y > z * z) // 两小边的平方和大于第三边的平方
{
printf ( "等腰锐角三角形\n ");
}
else if (x * x + y * y == z * z)
{
printf ( "等腰直角三角形\n ");
}
else
{
printf ( "等腰钝角三角形\n ");
}
}

else // 当前不是等腰三角形


{
if (x * x + y * y > z * z)
{
printf ( "锐角三角形\n ");
}
else if (x * x + y * y == z * z)
{
printf ( "直角三角形\n ");
}
else
{
printf ( "钝角三角形\n ");
}
}
}
}// Form()

int main (void)
{// 主函数
float x, y, z;
int check = 0;

printf ( "\n请输入三条边的长度\n ");
while (!check)
{
printf ( "\n第一条边(输入一次后请按回车)\n-> ");
scanf ( "%f ", &x);
printf ( "第二条边\n-> ");
scanf ( "%f ", &y);
printf ( "第三条边\n-> ");
scanf ( "%f ", &z);
getchar ();

while (!IsOk (x, y, z))
{// 当输入错误
printf ( "\n不满足三角形的条件!请输入正确的边长\n ");
printf ( "\n-> ");
scanf ( "%f ", &x);
printf ( "\n-> ");
scanf ( "%f ", &y);


printf ( "\n-> ");
scanf ( "%f ", &z);
}

printf ( "\n你输入的数据是:%2.2f %2.2f %2.2f\n ", x, y, z);
printf ( "\n由这三条边的长度可以推测该三角形是: ");
Form (x, y, z); // 判断三角形的形状
printf ( "\n <继续 0 > | <退出 1 > \n-> ");
scanf ( "%d ", &check);
if (check == 0)
printf ( "\n请任意输入三条边的长度\n ");
}
printf ( "\nBye!\n ");
return 0;
}

[解决办法]
其实楼主可以这样,用三角公式计算三个角,出现什么类型的角,就是什么三角形。记得要包括相应头文件
[解决办法]
楼主应该由不特殊的三角形到特殊的三角形,
那样显得更加有逻辑性,
而你是从简单判断的到不简单的,所以显得有些,琐碎
[解决办法]
没有对错误输入的处理,一旦输入有误就死循环,健壮性值得改善,
[解决办法]
1、编程基本常识:用double,不要用float。后者的精度低,而且在现代的计算机上往往速度更慢。

2、VC6支持的C语言没有内置的bool类型,错。不知道你是怎么编译通过的,除非你把它错存成了C++文件。
即使用GCC等支持bool类型的编译器,也要加入 <stdbool.h> 的头文件。VC建议你加一句:
typedef enum {
false, true
} bool;


3、程序健壮性太差,输入非数字后再读内容,就会造成死循环。
死循环的原因在于错误的数据阻塞了输入流。但对输入流用fflush()函数结果是未定义的(像comman_ndsc那样),当调用方把输入流重定向到文件就会出错。一种保持健壮性的合理的方式是:

while (scanf ( "%lf ", &x) != 1 || x <= 0) /* x是double类型 */
{
while (getchar() != '\n ') /* 将堵在输入流中的后半行字符读入并抛弃 */
;
puts( "输入有错!请重新输入第一条边的长度 ");
}


4、尽管C99中和多数编译器下都支持//形式的注释,但写C程序尽量还是只使用/* */形式的注释,以保证兼容性。

5、结构流程确实有些繁琐。

6、主函数应该写在文件开头,而被调的子函数在文件开头逐一声明。写代码应该注意自上而下的逻辑顺序。

7、对直角三角形的判断
if (x * x + y * y == z * z)
数学上正确,但编程是不准确的,因为浮点数总有一些舍入误差,因而对一些正确的输入却不能判断。比较常用的方法是
const double delta = 1e-5; /* 一个自定义的小量 */
if (fabs(x * x + y * y - z * z) < delta)
更好的方法则是把delta设为x,y,z的和的一个小量倍数,即
double delta = (x + y + z) * 1e-8; /* 允许误差在1亿分之一 */

再仔细看看吧,可改进的地方还是非常多的。

读书人网 >C语言

热点推荐