数学不是我的优点之一,我想知道如何做到这一点正确(我可以一起破解,但这会很乱):
示例图:
谢谢你们。
集成解决方案
这就是我的目的:
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)));
}
}
答案 0 :(得分:5)
这是一个Java实现; C#翻译应该很简单。这假定为linear interpolation:
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)
)
);
}
然后我们有(as seen on 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
这是一个略微变化,也处理额外的点。它使用整数除法,不需要double
强制转换和Math.ceil
。使用Ternary/conditional ?:
operator(对于样式!)。
static int starsFor(int mark, int passMark, int maxMark, int numStars) {
return
(mark >= maxMark) ?
numStars
:
(mark < passMark) ?
0
:
1 + numStars * (mark - passMark) / (maxMark - passMark);
}
然后我们有(as seen on 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!
答案 1 :(得分:3)
以下功能可能会给您预期的结果
我使用的逻辑:
- 如果通过标记为75%,则75%= 1星级
- 并且您希望为用户提供最多5颗星
- 然后将剩余标记分成5个相等的部分(75到80,81到85,86到90,91到95和96 100)
- 根据此范围应用星星。
public int RateMyUser(int MaxStars, int MinThreshold, int MarksObtained)
{
int division = 0;
int stars = 0;
// this will give division of remaining score greater than passing percentage<br>
division = (100 - MinThreshold) / MaxStars;
if (MarksObtained >= MinThreshold)
{
// obtain the stars to be given
stars = (MarksObtained - MinThreshold) / division; // integer representing stars
return stars + 1;
}
return stars;
}
答案 2 :(得分:1)
这取决于分数的(预期)分布是什么以及星星的分布应该是什么。
对于线性分数和线性星的最简单示例,您可以使用以下内容:
Math.Max(0, ((score - passMark) / (100 - passMark) * (maxStars - 1) + 1))
答案 3 :(得分:1)
这应该可以解决问题,即使它是C99
int GetStarCount(double scorePercentage, int maxStars, double PassMark)
{
double classwidth = (1.0 - PassMark) / (double)(maxStars-1);
double delta = scorePercentage - PassMark;
if(scorePercentage < PassMark)
return 0;
return ceil(delta / classwidth)+1;
}
<强>更新强> 我应该写一下参数预计在0..1的范围内......(75%的密码== 0.75作为参数值)。