javascript Codewars:Grasshopper - Grade Book Challenge

vatpfxk5  于 2023-06-20  发布在  Java
关注(0)|答案(4)|浏览(89)

这是其中的一个时候,解决方案是盯着我的权利,在脸上,但我似乎找不到它!所以请对我耐心点。kata instruction如下:
完成该函数,以便它找到传递给它的三个分数的平均值,并返回与该等级相关联的字母值。

Numerical Score       Letter Grade

90 <= score <= 100    'A'
80 <= score < 90      'B'
70 <= score < 80      'C'
60 <= score < 70      'D'
0 <= score < 60       'F'

测试值均在0和100之间。不需要检查负值或大于100的值。
以下是我的解决方案:

function getGrade (s1, s2, s3) {
  var score = (s1 + s2 + s3) / 3;
  if (90 <= score && score >= 100) {
      return 'A';
  } else if (80 <= score && score > 90) {
    return 'B';
  } else if (70 <= score && score > 80) {
    return 'C';
  } else if (60 <= score && score > 70) {
    return 'D';
  } else if (0 <= score && score > 60) {
    return 'F';
  }
}

getGrade(5,40,93);
getGrade(30,85,96);
getGrade(92,70,40);

我怎么也想不出我做错了什么。

jchrr9hc

jchrr9hc1#

你在if语句中的条件全错了。这些都是合适的条件

function getGrade (s1, s2, s3) {
  var score = (s1 + s2 + s3) / 3;
  if (score >= 90 && score <= 100) {
      return 'A';
  } else if (score >= 80 && score < 90) {
    return 'B';
  } else if (score >= 70&& score < 80) {
    return 'C';
  } else if (score >= 60  && score < 70) {
    return 'D';
  } else {
    return 'F';
  }
}
sycxhyv7

sycxhyv72#

你的条件是错误的,你不需要在同一个if中进行多次检查。将你的代码改为:

function getGrade (s1, s2, s3) {
  var score = (s1 + s2 + s3) / 3;
  if (score >= 90 && score <= 100) {
      return 'A';
  } else if (score >= 80 && score < 90) {
    return 'B';
  } else if (score >= 70 && score < 80) {
    return 'C';
  } else if (score >= 60 && score < 70) {
    return 'D';
  } else{
    return 'F';
  }
}

console.log(getGrade(5,40,93));
console.log(getGrade(30,85,96));
console.log(getGrade(92,70,40));
np8igboo

np8igboo3#

您可以只使用if子句而不使用else部分,并且只检查下限,因为您已经检查了上限。
由于给定的范围介于0100之间,因此缺少对上限100的检查。

function getGrade(s1, s2, s3) {
    var score = (s1 + s2 + s3) / 3;
    if (score >= 90) {
        return 'A';
    }
    if (score >= 80) {
        return 'B';
    }
    if (score >= 70) {
        return 'C';
    }
    if (score >= 60) {
        return 'D';
    }
    return 'F';
}

console.log(getGrade(5, 40, 93));
console.log(getGrade(30, 85, 96));
console.log(getGrade(92, 70, 40));
klh5stk1

klh5stk14#

每当你发现自己在写一长串if-else语句时,看看你是否能找到一个模式并使用一个查找表。在这里,我们只有5个等级桶,但如果我们有20个或100个呢?您可以看到if-else方法是不可扩展的。
在本例中,如果我们使用字符串"FFFFFFDCBAA",那么我们已经枚举了所有5个等级桶,让我们在将分数除以10后索引到。代码如下:"FFFFFFDCBAA"[score/10|0]其中| 0是取整运算,去掉小数。额外的"A"处理100的情况。
其次,函数(s1, s2, s3)的参数没有意义。为什么是3分?如果我们有4个score,或者20个score,函数就不能使用,我们必须用正确数量的参数重写整个函数(20个参数的函数会很难看)。我知道这个头文件是kata作者给你的,但是我们没有理由不能让它使用(...args)处理任何数量的参数,并且仍然通过测试。如果我们使用args.reduce((a, e) => a + e, 0) / args.length取参数的平均值,我们得到以下解决方案:

const sum = a => a.reduce((a, e) => a + e, 0);
const avg = a => sum(a) / a.length;
const getGrade = (...args) => "FFFFFFDCBAA"[avg(args)/10|0];

[
  [0],
  [0, 100, 50],
  [90, 95, 100],
  [80, 60],
  [81, 79],
  [80, 59],
].forEach(test => console.log(`${test} => ${getGrade(...test)}`));

相关问题