ページ 11

再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 11:56
by c++初心者
こんにちは。
学校の宿題がわからなくて困っています。助けてください。

課題についての説明なのですが。

eng-stud-.txtというファイルの中に
Jon Doe  // 名前
111111111 //IDナンバー
93 85 //(左)英語のスコア (右)歴史のスコア
Jane Smith
999999999
87 91
Mary Jones
123456789
83 71
Bo Jack
987654321
65 97
Adam French
765678655
100 8
Amy Lee
984754340
78 64
Chris Wilson
345839487
95 98
Jon Wood
472398740
77 75
Mike Jones
472675608
88 88

というようなデータが入っています。

僕のプログラムはそれを読み取り、

90点以上ならA
80点以上ならB
70点以上ならC
60以下ならFというようなグレードをつけ、

最後に結果を表示させます。

プログラムはほぼ完成しています(完成してると思われます)。
しかし、最後に結果をアルファベット順、スコアの高い(低い)順、IDナンバー順のように並べかえなければいけないのですが、いろいろ試したのですが、しっかりとした順番になりません。
それから/* in */ /* out */ /* inout */ のコメントを入れなければいけないのですが、正しくできているのかわかりません。

教えてください。よろしくお願いします。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 13:24
by たいちう
sort_low_histだけ直してみました。
我慢できる範囲で原型通りに。
// sorting order for history from lowest
void sort_low_hist(/* inout */StudentGrade st[/url]
                  ,/* in */int num)
{
    int passCount;
    int sIndx;
    int minIndx;
    for (passCount = 0; passCount < num - 1; passCount++)
    {
        minIndx = passCount;
        for (sIndx = passCount + 1; sIndx < num; sIndx++)
        {
            if (st[sIndx].hist201 == st[minIndx].hist201)
            {
                if (st[sIndx].lname == st[minIndx].lname)
                {
                    if (st[sIndx].fname < st[minIndx].fname)
                        minIndx = sIndx;
                }
                else if (st[sIndx].lname < st[minIndx].lname)
                    minIndx = sIndx;
            }
            else if (st[sIndx].hist201 < st[minIndx].hist201)
                minIndx = sIndx;
        }
        StudentGrade temp = st[minIndx];
        st[minIndx] = st[passCount];
        st[passCount] = temp;
    }
}
他のソート以外には、stud_num・etotal・htotalの初期化がされていない事に気付きました。
細かい点は他にも色々指摘がありそうです。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 13:51
by c++初心者
たいちうさん、返信ありがとうございます。

試してみましたが、このような結果になりました。

Which order would you like?
Enter:
0 for Lastname
1 for English scores starting from lowest
2 for English scores starting from highest
3 for History scores starting from lowest
4 for History scores starting from highest
5 for ID number
:3
Student Name Student ID Eng101 Hist201
------------ ---------- ------ -------
Adam French 765678655 100(A) 8(F)
Mary Jones 123456789 83(B) 71(C)
Jon Doe 111111111 93(A) 85(B)
Mike Jones 472675608 88(B) 88(B)
Amy Lee 984754340 78(C) 64(D)
Jon Wood 472398740 77(C) 75(C)
Jane Smith 999999999 87(B) 91(A)
Bo Jack 987654321 65(D) 97(A)
Chris Wilson 345839487 95(A) 98(A)
Class Average: 85.11 75.22


結果はまだバラバラのままです…。

細かくどこに問題があるのか教えていただけませんか?たくさんあるのはわかっていますが……教えていただいたほうが勉強になるので。

ありがとうございました。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 14:00
by たいちう
> 細かくどこに問題があるのか教えていただけませんか?

まずはどう直したのか教えてもらわないと。
それとソートができていないということは、私の言う細かい点以前の問題ですよ。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 14:19
by c++初心者
僕のプログラムのソートの中の問題をうかがったのですが、言葉足らずですみませんでした。

見たところtempの長い列を直されたようですが、そこに問題があるのでしょうか?

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 14:39
by たいちう
> 見たところtempの長い列を直されたようですが、
> そこに問題があるのでしょうか?

そこに問題は2つあります。

1つは無駄に長い処理を書いていること。
私が書いたように1行の代入で済むところを、
わざわざ7行で書いています。
何か特殊な意図があるのですか?

2つ目はソートが間違っていること。
最初の問題点は無駄にソースコードを長くするだけですが、
それによってプログラムが判りにくくなったため、
2つ目の問題を引き起こしています。

自分で書いたソースコードの代入部分を、
/* st[minIndx]とst[passCount]を入れ替える */
という風にコメントに置き換えて、
私の書いたソースコードと慎重に比較してください。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 22:28
by c++初心者
たいちうさん、できました!

並び替えをする部分が二つ目のループに入っていたのが原因だったようですね。

ありがとうございました。

よろしければ、in, out, inout のコメントについても知りたいのですが、教えていただけないでしょうか?

よろしくお願いします。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月21日(水) 22:54
by Poco
> よろしければ、in, out, inout のコメントについても知りたいのですが、教えていただけないでしょうか?

ある関数内で、渡された引数を参照する場合はin。
ある関数から抜けたときに引数として渡した変数の値が変わっているものはout。
その両方を満たすものはinoutとなります。

outとなる引数は、C言語の場合だと、配列型かポインタ型になります。

#配列型やポインタ型だからといって必ずしもoutになるわけではありません。

Re:再び学校の宿題に困ってます。助けてください。

Posted: 2010年4月22日(木) 15:08
by c++初心者
ぽこさん、ありがとうございました。

間違って、コメントしていたようなので修正しました。