Javascript 制作一个计算总GPA的函数
好吧,那么我假设取一系列的分数,然后计算平均绩点。它总是像Nan一样出现,我忘了如何改变它。。。我也不认为我的GPA变量是正确的。 函数必须包含一个包含字母等级数组的参数,例如[A+,A-,C,B-,A] 该函数必须找到当前GPAJavascript 制作一个计算总GPA的函数,javascript,Javascript,好吧,那么我假设取一系列的分数,然后计算平均绩点。它总是像Nan一样出现,我忘了如何改变它。。。我也不认为我的GPA变量是正确的。 函数必须包含一个包含字母等级数组的参数,例如[A+,A-,C,B-,A] 该函数必须找到当前GPA var letter = ""; var GPA; function calculateTotalGPA(letter) { var counter = 0; for (var i = 0; i < letter.length; i+
var letter = "";
var GPA;
function calculateTotalGPA(letter) {
var counter = 0;
for (var i = 0; i < letter.length; i++) {
if (letter == "A+") {
GPA = 4;
counter++;
}
if (letter == "A") {
GPA = 4;
counter++;
}
if (letter == "A-") {
GPA = 3.67;
counter++;
}
if (letter == "B+") {
GPA = 3.33;
counter++;
}
if (letter == "B") {
GPA = 3;
counter++;
}
if (letter == "B-") {
GPA = 2.67;
counter++;
}
if (letter == "C+") {
GPA = 2.33;
counter++;
}
if (letter == "C") {
GPA = 2;
counter++;
}
if (letter == "C-") {
GPA = 1.67;
counter++;
}
if (letter == "D") {
GPA = 1;
counter++;
}
if (letter == "F") {
GPA = 0;
counter++;
}
}
return (GPA / counter);
}
有更好的方法来编写这段代码,但我认为显示当前代码的错误比建议完全不同的东西更有用 在if语句中,您正在检查字母是否等于字符串,但字母是否是字符串数组,因此您希望检查循环索引i处的元素 i、 e.变化
if (letter == "A+") {
到
您希望在除以计数器之前计算总GPA点数,但当前您在每次迭代时重置GPA
改变
GPA = 4;
到
还是速记
GPA += 4;
在进入for循环之前,还要初始化变量
var GPA = 0;
正如评论中提到的,您还可以做其他事情来优化代码。请允许我提供一些建议,首先,我看不出您的for语句有什么意义,它与计算无关。变量letter和GPA的范围似乎很奇怪,这两个变量在计算函数的范围之外,可能最好至少在计算函数内移动GPA声明 关于计算函数本身,我的建议是创建一个JSON对象,并像使用字典一样使用它,这类似于键值对象,例如:
var GPAs = {
"A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
};
然后您可以使用字母像数组一样访问它们:
您的整个功能将如下所示:
function calculateGPA(letter) {
var GPAs = {
"A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
};
return GPAs[letter];
}
要从数组中获取总数,有多种方法可以实现,其中一种方法是使用array.prototype.reduce,例如:
["A", "A"].reduce(function(a,letter){
a=a+calculateGPA(letter); return a;
},0);
将CalculatePatotal函数缩减为类似以下内容:
function calculateGPATotal(arrayOfLetters){
var GPAs = {
"A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
};
return arrayOfLetters.reduce(function(a,letter){ a=a+GPAs[letter]; return a;},0) / arrayOfLetters.length;
}
请注意,我使用的是ArayaFoLeLeTe.Stand而不是计数器,这似乎是出于同样的目的。
考虑使用一个数组……考虑使用一个开关盒。字母。长度可以保存到一个变量。@标记ToTalpPa和CurrungGPA的确切含义?我建议你离开计算机并找出如何做。手工计算。例如,如果你得到A、B+和B,那么GPA是多少?如果你可以手工操作,你将更容易找出你的代码有什么错误。几乎正确,但他的输入是一个数组,他需要根据他当前的代码计算平均GPA,我认为需要计数器,并且需要循环遍历数组字母,因为OP在input中描述为字母数组grades@andrex我更新了答案,纠正了这个被忽略的关于阵列的细节。这是一个非常高级的答案,对于初学者来说很困惑,但是如果它能起到作用,我会保证。天哪,谢谢!我似乎总是相当接近我的所有代码,然后只是忘记了一些小的方面,把我搞砸了function calculateGPA(letter) {
var GPAs = {
"A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
};
return GPAs[letter];
}
["A", "A"].reduce(function(a,letter){
a=a+calculateGPA(letter); return a;
},0);
function calculateGPATotal(arrayOfLetters){
var GPAs = {
"A" : 4,"A-":3.67,"B+":3.33,"B":3,"B-":2.67,"C+":2.33,"C":2,"C-":1.67,"D":1,"F":0
};
return arrayOfLetters.reduce(function(a,letter){ a=a+GPAs[letter]; return a;},0) / arrayOfLetters.length;
}