数学不是我的优点之一,我想知道如何正确地做到这一点(我可以一起破解,但这将是一团糟):
示例图:
多谢你们.
集成解决方案
这就是我的用途:
private const int NUMSTARS = 3;
public int starsFor(int pScore, int pPassMark)
{
if(pScore < pPassMark)
{
return 0;
}
else if (pScore == pPassMark)
{
return 1;
}
else
{
return (int)Math.Ceiling(NUMSTARS * ((pScore - pPassMark) / (double)(100 - pPassMark)));
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个Java实现; C#翻译应该很简单.假设线性插值:
public static int starsFor(int mark, int passMark, int numStars) {
if (mark < passMark)
return 0;
else if (mark == passMark)
return 1;
else
return (int) Math.ceil(
numStars * (
(mark - passMark) / (double) (100 - passMark)
)
);
}
Run Code Online (Sandbox Code Playgroud)
然后我们(如ideone.com上所见):
System.out.println(starsFor(70, 75, 5)); // 0
System.out.println(starsFor(75, 75, 5)); // 1
System.out.println(starsFor(80, 75, 5)); // 1
System.out.println(starsFor(81, 75, 5)); // 2
System.out.println(starsFor(93, 75, 5)); // 4
System.out.println(starsFor(99, 75, 5)); // 5
System.out.println(starsFor(100, 75, 5)); // 5
Run Code Online (Sandbox Code Playgroud)
这是一个略微变化,也处理额外的点.它使用整数除法,不需要double强制转换和Math.ceil.使用三元/条件?:运算符(对于样式!).
static int starsFor(int mark, int passMark, int maxMark, int numStars) {
return
(mark >= maxMark) ?
numStars
:
(mark < passMark) ?
0
:
1 + numStars * (mark - passMark) / (maxMark - passMark);
}
Run Code Online (Sandbox Code Playgroud)
然后我们(如ideone.com上所见):
Console.WriteLine(starsFor(50, 75, 100, 5)); // 0
Console.WriteLine(starsFor(75, 75, 100, 5)); // 1
Console.WriteLine(starsFor(79, 75, 100, 5)); // 1
Console.WriteLine(starsFor(80, 75, 100, 5)); // 2
Console.WriteLine(starsFor(93, 75, 100, 5)); // 4
Console.WriteLine(starsFor(100, 75, 100, 5)); // 5
Console.WriteLine(starsFor(110, 75, 100, 5)); // 5 no extra stars!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
282 次 |
| 最近记录: |