最近回炉重造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())!=' ' && (cs=getchar())!=EOF); printf("输入错误,a b c必须大于零,是否新输入(y/n):"); } else if(judge_err_flag) { judge_err_flag = 0; while((cs=getchar())!=' ' && (cs=getchar())!=EOF); printf("组不成三角形,是否重新输入(y/n):"); } else { while((cs=getchar())!=' ' && (cs=getchar())!=EOF); printf("是否再输入一组数据(y/n):"); } ch = getchar(); } while(ch=='y' || ch=='Y' || ch==' '); puts("Goodbye!"); return 0; }