我正在尝试从MATLAB脚本创建一个简单的文本文件,该脚本在以下事项中排序,说明了整个学期的课堂成绩。 20名学生参加了20个参赛作品,有5个作业,中期成绩和最终成绩。
我要添加的最后几列是“最终得分”和“字母等级”。我的代码以及添加的功能是:
clc
clear
f1 = fopen('grades.txt', 'w');
ID = randi([100000000 999999999],1,20);
HW1 = 100*rand(1,20);
HW2 = 100*rand(1,20);
HW3 = 100*rand(1,20);
HW4 = 100*rand(1,20);
HW5 = 100*rand(1,20);
MD = randi([0 100], 1,20);
Final = randi([0 100], 1,20);
FG = (.2*(HW1+HW2+HW3+HW4+HW5))+(.4*MD)+(.4*Final);
LG = getLetterGrade(FG(1,20))
T = [ID;HW1;HW2;HW3;HW4;HW5;MD;Final;FG;LG];
fprintf(f1,'\nStudentID\n\t HW1\t\t HW2\t\t HW3\t\t HW4\t\t HW5\t\t Midterm\t Final\t\t Final Grade\t\t Letter Grade\t\t \r\n');
fprintf(f1,'%i\n\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.1f\n\t\t %3.2f\n\t\t %c\n\t\t \r\n', T);
fclose(f1)
function letterGrade = getLetterGrade(FG)
if FG > 90
letterGrade = 'A';
elseif FG <= 89 && FG > 80
letterGrade = 'B';
elseif FG <= 79 && FG > 70
letterGrade = 'C';
else
letterGrade = 'F';
end
end
然而,我一直收到错误。
LG = C
error: vertical dimensions mismatch (9x20 vs 1x1)
任何帮助将不胜感激。
Edit1:我忘了提。在最终得分中,它将作业得分,中期得分和最终得分相加为整数。此外,字母等级反映了最终得分中的字母等级(90 + = A; 80 + = B; 70 + = C; <70 =失败)。
答案 0 :(得分:1)
你应该重写你的getLetterGrade
,以便它可以处理矢量输入并返回一个矢量:
function letterGrade = getLetterGrade (FG)
score = [90;80;70;0];
lg = 'ABCF';
[m, idx] = max (FG(:).' >= score);
letterGrade = lg(idx);
end
getLetterGrade ([100 90 80.5 70.6 70.4 40.6])
给出
ans = AABCCF
我不会将此添加到T,而是在打印函数中使用单元数组或更好的结构数组或单独的向量。
答案 1 :(得分:0)
如果我理解你的问题,你会想要使用这样的语法来加入2个新列,使用var = [new element]样式。
octave:1> g = [1 2 3 4 5]
g = 1 2 3 4 5
octave:2> x = 6
x = 6
octave:3> l = [g x]
l = 1 2 3 4 5 6
答案 2 :(得分:0)
代码有几个问题,最值得注意的是(1)LG
是一个标量(大小为1x1),(2)你不能连接数字和单元格数组,以及(3)传递给的格式字符串fprintf格式不正确。此代码更正了这些问题:
% initialize grades
N = 20;
ID = randi([100000000 999999999], 1, N);
HW1 = 100*rand(1, N);
HW2 = 100*rand(1, N);
HW3 = 100*rand(1, N);
HW4 = 100*rand(1, N);
HW5 = 100*rand(1, N);
MD = randi([0 100], 1, N);
Final = randi([0 100], 1, N);
FG = (.2*(HW1+HW2+HW3+HW4+HW5))+(.4*MD)+(.4*Final);
% calculate letter grades
LG = repmat({'F'}, size(FG));
I = FG > 90; LG(I) = repmat({'A'}, sum(I), 1);
I = FG <= 89 & FG > 80; LG(I) = repmat({'B'}, sum(I), 1);
I = FG <= 79 & FG > 70; LG(I) = repmat({'C'}, sum(I), 1);
% write to file
T = cat(1, ...
num2cell([ID ; HW1 ; HW2 ; HW3 ; HW4 ; HW5 ; MD ; Final ; FG]), ...
LG);
f1 = fopen('grades.txt', 'w');
fprintf(f1, 'StudentID\tHW1\tHW2\tHW3\tHW4\tHW5\tMidterm\tFinal\tFinal Grade\tLetter Grade\t\n');
fprintf(f1, '%i\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.1f\t%3.2f\t%c\t\n', T{:});
fclose(f1);