2015年8月10日 星期一

[C][瘋狂程設][04_分支] A017:三角形種類

A017:三角形種類


三角形種類

輸入為三角形三邊長(正整數) a b c,輸出三角形類型(英文)
 isosceles triangle(等腰三角形)
 not a triangle(不成三角形)
 regular triangle(正三角形)
 rectangular triangle(直角三角形)
 obtuse triangle(鈍角三角形)
 acute triangle(銳角三角形)
 isosceles righttriangle(等腰直角三角形)

Input

 1 1 5

Output

not a triangle

Notes:


1.先將三角三個邊長做排序:

2.判別不成三角形,若邊長無法構成三角形,則程式結束:

 //situation:not a triangle
 if(side1+side2<=side3){
  printf("not a triangle");
  return 0;
 } 

3.先判別正三角形或等腰三角形,若為等腰三角形,則程式結束,不需要辨別是鈍角或銳角

 //situation:regular or isosceles
 if((side1==side2) && (side2==side3)){
  printf("regular triangle");
  return 0;
 }else if((side1==side2) || (side2==side3)){
  printf("isosceles triangle");
  return 0;
 }

4.判別鈍角、銳角、直角三角形

int test_side_square(int *a,int *b,int *c){

 int value,a2=(*a)*(*a),b2=(*b)*(*b),c2=(*c)*(*c);;
 
 //value=0, means: rectangular triangle(直角三角形)
 //value=1, means: obtuse triangle(鈍角三角形) 
 //value=-1,means: acute triangle(銳角三角形)
 (c2==(a2+b2))?(value=0):(c2>(a2+b2))?(value=1):(value=-1);
 
 return value;
}

5.若為直角三角形,則需要進一步辦別是否具有等腰性質:

 //situation:obtuse or acute;rectangular or isosceles righttriangle,
 result=test_side_square(&side1,&side2,&side3); 
 if(result!=0){
  (result<0)?printf("acute triangle"):printf("obtuse triangle");
 }else{
  (side1==side2)?printf("isosceles righttriangle"):printf("rectangular triangle");
 }

Code:

#include <stdio.h>

void swap(int *a,int *b){
 if(*a>*b){
  *a^=*b;
  *b^=*a;
  *a^=*b;
 }
}

int test_side_square(int *a,int *b,int *c){

 int value,a2=(*a)*(*a),b2=(*b)*(*b),c2=(*c)*(*c);;
 
 //value=0, means: rectangular triangle(直角三角形)
 //value=1, means: obtuse triangle(鈍角三角形) 
 //value=-1,means: acute triangle(銳角三角形)
 (c2==(a2+b2))?(value=0):(c2>(a2+b2))?(value=1):(value=-1);
 
 return value;
}

int main(void){

 int side1,side2,side3,result;
  
 scanf("%d %d %d",&side1,&side2,&side3);
 //printf("%d %d %d",side1,side2,side3);

 //sort the length of side
 swap(&side1,&side2);
 swap(&side2,&side3);
 swap(&side1,&side2);

 //situation:not a triangle
 if(side1+side2<=side3){
  printf("not a triangle");
  return 0;
 } 

 //situation:regular or isosceles
 if((side1==side2) && (side2==side3)){
  printf("regular triangle");
  return 0;
 }else if((side1==side2) || (side2==side3)){
  printf("isosceles triangle");
  return 0;
 }
 
 //situation:obtuse or acute;rectangular or isosceles righttriangle,
 result=test_side_square(&side1,&side2,&side3); 
 if(result!=0){
  (result<0)?printf("acute triangle"):printf("obtuse triangle");
 }else{
  (side1==side2)?printf("isosceles righttriangle"):printf("rectangular triangle");
 }
 
 return 0;
}


1 則留言:

  1. 以整數為邊長的三角形,不可能是等腰直角三角形。

    回覆刪除