用JavaScript输出成绩

时间:2017-06-23 00:49:18

标签: javascript switch-statement

给定一个函数myGrading我需要返回发送与给定分数对应的字母等级的文本。

  • (100-90) - > 'A'
  • (89-80) - > 'B'
  • (79-70) - > 'C'
  • (69 - 60) - > 'd'
  • (59 - 0) - > 'F'

  • 基本上,如果给定分数大于100或小于0,则应返回“INVALID SCORE”。

  • 如果得分在给定范围的0到2(含)之间,则返回带有' - '的字母
  • 如果分数在给定范围的8到9(含)之间,则返回带有'+'的字母
  • 没有F +,也没有F - 。

所以我做的是我用switch语句提出了一个函数:

function myGrading(score) {
  var gscore;

  switch(true) {
    case (score <= 100 && score >= 90):
       gscore = 'A';
        break;
    case (score <= 89 && score >= 80):
        gscore = 'B';
         break;
    case (score <= 79 && score >= 70):
        gscore = 'C';
         break;
       case (score <= 69 && score >= 60):
        gscore = 'D';
         break;
    case (score <= 59 && score >= 0):
        gscore = 'F';
        break;

    case (score > 100 && score < 0):
        gscore = 'INVALID SCORE';
        break; 

     case (score <= 2 && score >= 0):
        gscore += '-';
        break; 

      case (score <= 9 && score >= 8):
        gscore += '+';
        break; 

    default:
      return 'INVALID SCORE';
}

  return gscore;
}

var output = convertScoreToGradeWithPlusAndMinus(91);
console.log(output); // --> MUST OUTPUT 'A-'

现在上面的代码没有显示正确的答案。知道我做错了什么吗?

6 个答案:

答案 0 :(得分:1)

你需要采取逻辑从开关盒中追加标志,因为它们永远不会在那里执行。重构您的代码如下:

&#13;
&#13;
function myGrading(score) {
  var gscore;

  switch(true) {
    case (score <= 100 && score >= 90):
       gscore = 'A';
        break;
    case (score <= 89 && score >= 80):
        gscore = 'B';
         break;
    case (score <= 79 && score >= 70):
        gscore = 'C';
         break;
       case (score <= 69 && score >= 60):
        gscore = 'D';
         break;
    case (score <= 59 && score >= 0):
        gscore = 'F';
        break;

    case (score > 100 && score < 0):
        gscore = 'INVALID SCORE';
        break; 

    default:
      return 'INVALID SCORE';
  }
  
  var last_digit = score%10;
  if(last_digit <=2 && last_digit >= 0 && score != 100){
    gscore+='-';
  }
  else if((last_digit <=9 && last_digit >= 7) || score == 100){
    gscore+='+';
  }

  return gscore;
};

console.log(myGrading(91));
console.log(myGrading(75));
console.log(myGrading(100));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果您考虑范围0-10而不是0-100,则可以将逻辑减少到:

function myGrading (score) {

  // Edge cases
  if (score < 0 || score > 100) return 'INVALID SCORE';
  if (score == 100) return 'A+';

  // Important values
  var decimal = score % 10;
  score = Math.floor(score / 10); // <- here we reduce the range to 0-9

              // 0    1    2    3    4    5    6    7    8    9
  var scores = ['F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A'];
  var grade = scores[score];

  if (grade != 'F') {
    if (decimal <= 2) grade += '-';
    else if (decimal >= 8) grade += '+';
  }

  return grade;
}

希望它有所帮助。

答案 2 :(得分:1)

我在研究如何解决此问题时遇到了这个问题。抱歉,我知道这是一个老话题,但是我希望通过发布,也许我可以对我提出的解决方案有一些看法,以了解它是否更好,如果不是,它的缺点是什么。这应该可以动态处理作为对象传递给它的任何分发类型。

// An object with the letter grade as key and the floor value of the grade as its value
const distribution = {
  A: 90,
  B: 80,
  C: 70,
  D: 60,
  F: 0
};

const getGrade = (score, distribution, maxScore = 100, minScore = 0) => {

  // Handle edge cases
  if (score > maxScore || score < minScore) {
    return "Error";
  }
  // Get an array of the letter grades
  const grades = Object.keys(distribution);

  // Sort the grades in descending order of the floor score of each grade
  grades.sort((a, b) => distribution[b] - distribution[a]);

  // Since the grades are sorted, the first grade to be lower than the score will be the correct grade to return
  const grade = grades.find(grade => distribution[grade] <= score);

  // No + or - for bottom grade
  if (grade === grades[grades.length - 1]) {
    return grade
  } else if (score - distribution[grade] <= 2) { // check and return "-" grades
    return grade += "-"
  } else if (score - distribution[grade] >= 8) { // check and return "+" grades
    return grade += "+"
  } else { // return normal grades
    return grade
  }
};

答案 3 :(得分:0)

我选择了类似于华盛顿的版本。检查边缘情况会变得愚蠢。

let letter = ['F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A', 'A'];
let plumin = ['-', '-', '-', null, null, null, null, null, '+', '+'];
let major = num  => letter[Math.floor(num / 10)];
let minor = num => num === 100 ? '+' : (plumin[num % 10] || '');
let grade = num => major(num) ? major(num) + minor(num): major(num);
console.log(grade(-10));
console.log(grade(0));
console.log(grade(1));
console.log(grade(25));
console.log(grade(65));
console.log(grade(77));
console.log(grade(88));
console.log(grade(95));
console.log(grade(100));
console.log(grade(110));

答案 4 :(得分:0)

这里尝试这会将等级从for到paragraf

    <html>
   <body>
   <form action="#" method="GET" id="forma">
   <input type="text" id="grade" name="grade"/>
   <input type="submit" id="submit" value="PRESS" onclick="myGrading(this);"/>
   </form>
   <p id='grades'></p>
   </body>
   </html>
   <script>



   function myGrading() {
     var gscore;
     var score = document.getElementById('grade').value
     switch(true) {
case (score <= 100 && score >= 90):
   gscore = 'A';
    break;
case (score <= 89 && score >= 80):
    gscore = 'B';
     break;
case (score <= 79 && score >= 70):
    gscore = 'C';
     break;
   case (score <= 69 && score >= 60):
    gscore = 'D';
     break;
case (score <= 59 && score >= 0):
    gscore = 'F';
    break;

case (score > 100 && score < 0):
    gscore = 'INVALID SCORE';
    break; 

 case (score <= 2 && score >= 0):
    gscore += '-';
    break; 

  case (score <= 9 && score >= 8):
    gscore += '+';
    break; 

default:
  return 'INVALID SCORE';
   }
          document.getElementById('grades').innerHTML=gscore;


   }




   </script>

答案 5 :(得分:0)

function convertScoreToGradeWithPlusAndMinus(score) {
  var grade = ''; //creating a variable keeps it cleaner.
  var scoreStr = score.toString(); //convert the score number into a string. This allows us to access indexes.

  if(score > 100 || score < 0) return 'INVALID SCORE'; //set the edge case first.

  if(score === 100) grade = 'A';
    else if(score >= 90) grade = 'A';
      else if(score >= 80) grade = 'B';
        else if(score >= 70) grade = 'C';
          else if(score >= 60) grade = 'D';
            else if(score >= 0) grade = 'F';
              
  
  if(grade !== 'F'){ //Negate 'F' before distributing + or - to letter grades.
    if(scoreStr.substring(1) >= 8 || score === 100) {
      grade += '+';
    } else if(scoreStr.substring(1) <=2) {
      grade += '-';
    }
  }

  return grade;
}
var output = convertScoreToGradeWithPlusAndMinus(91);
console.log(output); // --> 'A-'

这就是我解决同样问题的方法。

相关问题