C语言小程序,一、判断三角型类型

最近回炉重造C语言,陆续写一些比较短的代码,选择其中的一些贴到这里,都是在Linux下的代码,Windows未测试。

第一个判断三角形的类型,两个浮点型数据不能直接判断相等,为了输入方便一些,自己设置的精度比较低,10^(-3)。

#include <stdio.h>
#include <stdlib.h>
#define EPSINON         1e-3
#define ABS(a)          (((a)>0)?(a):(-a)) //?:不支持表达式嵌套
#define ZERO(x)         ((x)>-EPSINON && (x)<EPSINON)
#define MAX(a,b)        (((a)>(b))?(a):(b))
#define MIN(a,b)        (((a)<(b))?(a):(b))

float a, b, c;
float max, mid, min;
char input_err_flag = 0;
char judge_err_flag = 0;

int equal(float a, float b)
{
        float tmp;
        tmp = a - b;
        tmp = ZERO(ABS(tmp));
        return tmp;
}

void input(void)
{
        a = b = c = 0;
        printf("输入三条边的值:");
        scanf("%f %f %f",&a, &b, &c);
        if(!(a>0) || !(b>0) || !(c>0))
        {
                input_err_flag = 1;
        }
}

void sort(void)
{
        max = MAX(MAX(a,b),c);
        min = MIN(MIN(a,b),c);
        if(MAX(a,b) < c)
                mid = MAX(a,b);
        else
                mid = MAX(MIN(a,b),c);
}

void judge(void)
{
        float max_square, mid_square, min_square, tmp;
        if(max >= (mid+min))
        {
                judge_err_flag = 1;
        }
        else
        {
                max_square = max * max;
                mid_square = mid * mid;
                min_square = min * min;
                tmp = mid_square + min_square;
                if(equal(mid,min) || equal(max, mid))
                {
                        if(equal(mid, min))
                        {
                                if(mid == max)
                                        puts("等边三角形。");
                                else if(equal(max_square, tmp))
                                        puts("等腰直角三角形。");
                                else if(max_square < tmp)
                                        puts("等腰锐角三角形。");
                                else 
                                        puts("等腰钝角三角形。");
                        }
                        else
                        {
                                if(equal(min, mid))
                                        puts("等边三角形。");
                                else
                                        puts("等腰锐角三角形。");
                        }
                }
                else if(equal(max_square, tmp)) 
                        puts("直角三角形。");
                else if(max_square < tmp)
                        puts("锐角三角形。");
                else 
                        puts("钝角三角形。");
        }
}

int main(void)
{
        char cs, ch;

        do
        {
                input();
                sort();
                judge();

                if(input_err_flag)
                {
                        input_err_flag = 0;
                        while((cs=getchar())!='\n' && (cs=getchar())!=EOF);
                        printf("输入错误,a b c必须大于零,是否新输入(y/n):");
                }
                else if(judge_err_flag)
                {
                        judge_err_flag = 0;
                        while((cs=getchar())!='\n' && (cs=getchar())!=EOF);
                        printf("组不成三角形,是否重新输入(y/n):");
                }
                else
                {
                        while((cs=getchar())!='\n' && (cs=getchar())!=EOF);
                        printf("是否再输入一组数据(y/n):");
                }
                ch = getchar();
        }
        while(ch=='y' || ch=='Y' || ch=='\n');
        puts("Goodbye!");

        return 0;
}