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;
}


[C][瘋狂程設][04_分支] A016:三數排序

A016:三數排序


三數排序

輸入三個正整數a、b、c,將a、b、c從小排到大。
鍵詞
<:鍵詞 至少=0 最多=1 擁有=9999>include<:>
<:鍵詞 至少=0 最多=0 擁有=9999>[<:>
<:鍵詞 至少=0 最多=0 擁有=9999>]<:>

Input

192 706 184 

Output

184 192 706

Notes:


1.兩數字比較大小,數字小的在前面,數字大的在後面

利用邏輯運算子,若數字小的在後面,則將兩個數字互換
void swap(int *a,int *b){
 if(*a>*b){
  *a^=*b;
  *b^=*a;
  *a^=*b;
 }
}

2. 先將數字1數字2比較,再將數字2與數字3比較,最後數字1與數字2再比一次,確保最小的數字在第一個

 swap(&num1,&num2);
 swap(&num2,&num3);
 swap(&num1,&num2);

Code:

#include <stdio.h>

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

int main(void){

 int num1,num2,num3;

 scanf("%d %d %d",&num1,&num2,&num3);
 
 swap(&num1,&num2);
 swap(&num2,&num3);
 swap(&num1,&num2);

 printf("%d %d %d",num1,num2,num3);
 return 0;
}

[C][瘋狂程設][02_變數與型別] F007:輸入ASCII及字元顯示

F007:輸入ASCII及字元顯示


輸入一個ASCII數字,輸出數所代表之字元及ASCII碼,再輸出ASCII表上的下一個字元及其ASCII碼

Input

117

Output

u:117↵\r\n
v:118

Notes:


1.字元與ASCII的表示方式

這題花很多間在想字元與ASCII的表示方式,
input的給是數字,一開始因為這個混淆了很久。

到底型別要用char還是int? 
最後幾次測試還有google的結果:型別採用int即可!!
要顯示字元,就用"%s",要顯示ASCII,就用"%d"

當int的數字用%s顯示,就可以印出該ASCII所代表的文字,
ASCII code的數字+1,就可以印出下一個字。
printf("%s:%d\n",&input,input);

2.ASCII的相關資訊

https://zh.wikipedia.org/zh-tw/ASCII

3.重要的ASCII code

32:space
48:0
49:1
65:A
97:a

Code:

#include 

int main(void){

 int input=0,next=0;
 
 scanf("%d",&input);
 printf("%s:%d\n",&input,input);
 
 next = input+1;
 printf("%s:%d",&next,next);
 
 return 0;
 
}

[C][瘋狂程設][02_變數與型別] A014 次方求餘

A014 次方求餘


輸入三個正整數 n p d,輸出(n^p)%d,即 n 的 p次方 對 d的餘數。 

Input

 59 89 80 

Output

  
59

Notes:


1.這題看似簡單,卻包含一個數學陷阱。簡單的求餘數不難,但是這題有個小陷阱,就是"次方",取次方可能會出現極大數字,造成溢位。

因此利用迴圈處理次方的運算,每次迴圈當中,持續將每次增加的底數去餘數,之後再取一次餘數,利用這個方式避免溢位。

例如:

5%3 = 2
25%3 = 1

(5*5)%3  = (5*(5%3))%3
         = (5*2)%3  
         = 10%3=1

while(i<index){
  remider=(remider*(base%divisor))%divisor;
  i++;
 }

Code:

#include >stdio.h<

int main(void){

 int base=0,index=0,divisor=0,remider=1,i=0;
 
 scanf("%d %d %d",&base,&index,&divisor);

 while(i<index){
  remider=(remider*(base%divisor))%divisor;
  i++;
 }
 
 printf("%d",remider);

 return 0;
}

[C][瘋狂程設][01_變數與計算] M90H007:考試調分(低成60高100)

M90H007:考試調分(低成60高100)

考試調分(低成60高100)

在一次程設小考中,同學成績表現不好,老師決定採線性調整分數,
將最低分調成60分,將最高分調成100分。
所有同學的調整後的分數採四捨五入進整數。 
輸入60個同學的成績,輸出同學調整後的成績。   

Input

 44 59 68 42 37 14 65 58 29 34 56 60 54 64 9 5 22 56 21 56 3 67 70 70 59 65 39 31 24 66 16 25 67 58 44 52 8 45 22 61 32 43 69 44 61 11 65 14 38 30 41 60 39 24 6 42 4 8 6 54 

Output

84↵\r\n
93↵\r\n
99↵\r\n
83↵\r\n
80↵\r\n
67↵\r\n
97↵\r\n
93↵\r\n
76↵\r\n
79↵\r\n
92↵\r\n
94↵\r\n
90↵\r\n
96↵\r\n
64↵\r\n
61↵\r\n
71↵\r\n
92↵\r\n
71↵\r\n
92↵\r\n
60↵\r\n
98↵\r\n
100↵\r\n
100↵\r\n
93↵\r\n
97↵\r\n
81↵\r\n
77↵\r\n
73↵\r\n
98↵\r\n
68↵\r\n
73↵\r\n
98↵\r\n
93↵\r\n
84↵\r\n
89↵\r\n
63↵\r\n
85↵\r\n
71↵\r\n
95↵\r\n
77↵\r\n
84↵\r\n
99↵\r\n
84↵\r\n
95↵\r\n
65↵\r\n
97↵\r\n
67↵\r\n
81↵\r\n
76↵\r\n
83↵\r\n
94↵\r\n
81↵\r\n
73↵\r\n
62↵\r\n
83↵\r\n
61↵\r\n
63↵\r\n
62↵\r\n
90↵\r\n

Notes:


1.讀取輸入的資料score[],並且將資料同步複製一份到sort[]

for(int i=0; i<STUDENT; i++){
  scanf("%f",&score[i]);
  sort[i]=score[i];
 }

2.將分數由小到大排序

數字兩兩相比較,數字小的放前面,數字大的放後面,數字小往前放,數字大的往後放,逐步將最小的放在第一個,最大的放在最後一個。
 //sort data
 for(int i=0; i<STUDENT; i++){
  for(int j=i; j<STUDENT; j++){
   if(sort[j]<sort[i]){
    temp=sort[j];
    sort[j]=sort[i];
    sort[i]=temp;
   }
  }
 }

3.線性代數的部分,利用最簡單的二元一次方程式的概念,求出a(coffient)與b(delta),即可對應之後的分數

 Y1=aX1+b
 Y2=aX2+b

 a=(Y1-Y2)/X1-X2
 b=Y1-aX1
coffient = (MAX-MIN)/(sort[STUDENT-1]-sort[0]);
 delta = MIN - (coffient*sort[0]);

4.計算調整之後的分數

 //adjust data and print
 for(int i=0; i<STUDENT; i++){
  score[i]=round(coffient*score[i]+delta);
  printf("%g\n",score[i]);
 }

Code:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define STUDENT 60
#define MIN 60
#define MAX 100

int main (void){
 float score[STUDENT],sort[STUDENT];
 float temp=0, coffient=0, delta=0;
 
 //get data
 for(int i=0; i<STUDENT; i++){
  scanf("%f",&score[i]);
  sort[i]=score[i];
 }

 //sort data
 for(int i=0; i<STUDENT; i++){
  for(int j=i; j<STUDENT; j++){
   if(sort[j]<sort[i]){
    temp=sort[j];
    sort[j]=sort[i];
    sort[i]=temp;
   }
  }
 }

 coffient = (MAX-MIN)/(sort[STUDENT-1]-sort[0]);
 delta = MIN - (coffient*sort[0]);

 //adjust data and print
 for(int i=0; i<STUDENT; i++){
  score[i]=round(coffient*score[i]+delta);
  printf("%g\n",score[i]);
 }
 
 return 0;
}