2017-12-01 2 views
0

私は、次の問題で注文されたMATLABスクリプトから簡単なテキストファイルを作成しようとしていますが、これは学期中の教室の成績を示しています。登録された20人の学生のための20のエントリーがあり、5つの宿題、中期スコア、および最終スコアがあります。MATLABに2つの列を追加するには?

CIN                         HW1       HW2       HW3       HW4       HW5      中期     最終

          90.0           80.5           70.6           70.4           40.6                         70.3

私が追加しようとしている最後の列は「最終スコア」と「レターグレード」です。私のコードと関数を加えたものは次のとおりです。

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

最小限の例を作成してください。 <5行が残るまで、コードを削除することができます。この時点で、ほとんどのユーザーは自分自身のエラーを認識します。私はあなたの質問でエラーをトリガする行を見ることができず、私はOctaveとMATLABが行番号を表示していると確信しています。別のポイントは、デバッグを学ぶべきだということです。時間を節約してくれます。一番上に 'debug_on_error(1)'を追加し、スクリプトをもう一度実行すると、エラー時に停止します。今、あなたはこの時点でvarsを評価し、その値があなたの期待値と一致するかどうかを確認することができます(あなたの場合はサイズです) – Andy

答えて

0

私があなたの質問を正しく理解している場合は、var = [new element]スタイルを使用して、2つの新しい列を結合するためにこのような構文を使用したいと思うでしょう。

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 
0

がコードにいくつかの問題があり、最も顕著なの(1)LGはに渡された(サイズ1×1の)スカラー、(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); 
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に変換する代わりに、セル配列を使用するか、または構造体配列または印刷機能で別のベクターを使用する方がよいでしょう。

関連する問題