首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-02-06 
我用c写的 创建三角形/*名称:创建三角形需求:任意输入三条线段的长度,判断它们可以组成一个什么形状的三角

我用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亿分之一 */

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

热点排行