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;
}
不需排序,只須找最大與最小值即可一個迴圈內的二條算式完成。
回覆刪除