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

来源:互联网 发布:php双轨直销系统源码 编辑:程序博客网 时间:2024/05/16 11:40

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

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


#include <stdio.h>#include <stdlib.h>#defineEPSINON1e-3#defineABS(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);elsemid = 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("等边三角形。");elseputs("等腰锐角三角形。");}}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;}