确定从分数的一部分给出的星数

Kee*_*eno 4 c#

数学不是我的优点之一,我想知道如何正确地做到这一点(我可以一起破解,但这将是一团糟):

  • 我们对模块进行评分并以百分比形式给予用户分数
  • 我们希望以星级评分来奖励这些分数,但前提是他们的得分高于模块通过分数
  • 通过标记是可变的
  • 为了进一步打样,我们可以说明星的数量也是可变的
  • 如果他们通过,我希望他们总能获得至少1星

示例图:

  • 最大明星:3
  • 通过标记:75%
  • 用户得分75%,最低标记,所以奖励1星
  • 用户得分90%,这会是2星吗?

多谢你们.


集成解决方案

这就是我的用途:

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)

pol*_*nts 5

这是一个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)

C#/变异

这是一个略微变化,也处理额外的点.它使用整数除法,不需要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)