2015年8月10日 星期一

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

1 則留言:

  1. 不需排序,只須找最大與最小值即可一個迴圈內的二條算式完成。

    回覆刪除