//低级
#include<stdio.h>
#include<math.h>
#define S(a,b,c) ((a+b+c)/2.0)
int getarea(double a,double b,double c,double *area){
if(a<0||b<0||c<0)
return 1;
if(!area)
return 2;
if(a+b<=c||b+c<=a||a+c<=b)
return 3;
double t=S(a,b,c);
*area=sqrt(t*(t-a)*(t-b)*(t-c));
return 0;
}
int main() {
double x=0; //c语言中所有变量需要赋初值
double y=0;
double z=0;
double area=0;
int ret=0;
scanf("%lf%lf%lf",&x,&y,&z);
ret=getarea(x,y,z,&area);
if(ret==1)
printf("边长输入错误");
else if(ret==2)
printf("存储地址有误");
else if(ret==3)
printf("无法构成三角形");
else
printf("%.2lf",area);
return 0;
}
不足:可读性差,未考虑scanf能否正确输入情况
枚举类型的使用方法
#include<stdio.h>
#include<math.h>
#define S(a,b,c) ((a+b+c)/2.0)
enum ResultType{NORMAL,LENLESSZERO,NULLPTR,NOTFORM,UNKNOWN};
typedef enum ResultType resulttype;
resulttype getarea(double a,double b,double c,double *area){
if(a<0||b<0||c<0)
return LENLESSZERO;
if(!area)
return NULLPTR;
if(a+b<=c||b+c<=a||a+c<=b)
return NOTFORM;
double t=S(a,b,c);
*area=sqrt(t*(t-a)*(t-b)*(t-c));
return NORMAL;
}
int main() {
double x=0;
double y=0;
double z=0;
double area=0;
char temp[100]={0};
resulttype ret=UNKNOWN;
while(scanf("%lf,%lf,%lf", &x, &y, &z)!=3){
gets(temp); //清除缓冲区中scanf没有正确读入的字符,如abc,防止下一次执行scanf时候,scanf去读缓冲区非法字符而无限循环
printf("请重新输入:");
}
// int v=0;
// while(v!=3){
// printf("请输入边长:");
// v=scanf("%lf,%lf,%lf", &x, &y, &z);
// if(v!=3){
// gets(temp);
// printf("请重新输入:");
// }
// }
ret=getarea(x,y,z,&area);
if(ret==LENLESSZERO)
printf("边长输入错误");
else if(ret==NULLPTR)
printf("存储地址有误");
else if(ret==NOTFORM)
printf("无法构成三角形");
else
printf("%.2lf",area);
return 0;
}