2011-09-17 12 views
5

まず、これは私のCS296クラスのため、すべてがmain()関数内になければならず、ループ、スイッチ、if文以外は使用できません。私のC++の宿題のデザインについての質問

とにかく、クラスの学生数とその名前を入力するようにプログラムに指示します。次に、A-Zのアルファベット順に並んでいる学生に基づいて、どの生徒がラインの前にいなければならず、どちらの生徒がラインの後ろにいるかを表示します。

プログラムは実行されますが、デザインが悪いと感じます。具体的にどのように私はカウント変数を使用しています。おそらくそれについてのフィードバックを得ることを望んでいた。ありがとう!

int main(void) 
{ 
    string front, back, student; 
    unsigned short count = 1, students; 

    cout << "Enter the number of students in the class. Valid range is 1 - 25." << endl 
     << endl 
     << "Students: "; 
    cin >> students; 

    while (students < 1 || students > 25) 
    { 
     cout << endl 
      << "ERROR: Valid range is 1 - 25" << endl 
      << endl 
      << "Students: "; 
     cin >> students; 
    } 

    cout << endl 
     << "Enter the name of student " << count << ": "; 
    cin.ignore(); 
    getline(cin, student); 

    front = back = student; 

    for (count = 2; count <= students; count++) 
    { 
     cout << "Enter the name of student " << count << ": "; 
     getline(cin, student); 

     if (student < front) 
      front = student; 
     else if (student > back) 
      back = student; 
    } 

    cout << endl 
     << front << " should be at the head of the line." << endl 
     << back << " should be at the end of the line." << endl; 

    return 0; 
} 
+0

宿題として明確に識別するのにうまくいっています。 –

+1

私はそれが全く悪いとは思わない。私はおそらく、ストリームの抽出とgetlineを 'if(...)'チェックに入れて、操作が成功したかどうかを調べます。 –

答えて

6

いいえ、これは問題ありません。スペックは、カウントを入力して、あなたがやったこととまったく同じ数の生徒を入力する必要がありました。

プログラムは悪いですが、「すべてがmain()関数内になければなりません」のようなばかげた仕様のためです。実装に関係するものではありません。

このレベルの宿題の場合、私は学生からそのようなものを得ることができてうれしいです。コンパイルされていないコード、どこからでも1文字の変数名、または間違ったインデントや混在したタブ/スペースのフォーマットされていないモーフから素敵な変更を行います:-)

+1

コードの良さに同意します。 –

+0

ありがとう! (=私は本当にプログラミングを楽しんでいますし、私が使用することが許されているC++機能の限界内に留まって宿題問題を解決できる最もクリーンな最も効率的な方法を見つけようとしています。まだカバーされていないのですが、それには理由があると確信しています。 –

+1

私は自分で学習を積極的に妨げている先生を見つけます。彼らはあなたがあなたが間違っていることや、あなたが不正行為をすることを学び、実際にプログラミングに関心があることは決してないとあなたが思っているので、どちらかといえば愚かです。私は私のCS専攻の最初の年になりました。そして、これまでのところ、JavaとCの両方で、私はstdのほとんどを使うことができました。 lib。 (クイックソートのエクササイズではqsort()を除いて)、事前にプログラミング経験を持っていたので、私の課題はかなり苦しくなりませんでした。 – danielkza

1

私は完全に合理的なデザインのようですアルゴリズム的な観点。あなたはリストを読んでいるときにリストの最小値と最大値を見つけているだけで、最初の要素と最後に最初の要素を初期化するのは難しい部分です。あなたはそれが少し素敵なので、同じようにするために、DO-しばらく使用できます。

+0

'do {...} while();'ループの主な難点は、入力されたすべての値が最初のサイクルの値よりも低くなるように 'front'文字列を初期化していることです。入力した値を毎回 'front'と' back'の両方と比較しなければなりません。そうすれば、両方が最初のサイクルで設定されます( 'else if'の' else'を失うことによって)。 –

+0

ええ、そういうわけで、最初の名前はループ外に入力しなければならないようでした。私は最初の反復のためにループにif条件を置くことができたと思うが、それはもっと悪いと思う。 –

1

を(< 25カウント)しながら、与えられた {MAX、MIN と比較し、 を//読み込む}

がそうあなただけが2人の生徒を保管する場合は、エントリ数を25に制限する必要は特にありません。ユーザー(あなた)が25を超える名前を追加する場合は、番号の検証以外は変更する必要はありません。実際、ユーザーに学生数をカウントさせる明らかな理由はありません。コードはcinのEOFに達するまで生徒の読書を続けることができます。しかし、仕様書に「名前の数を入力してください」と書かれていれば、あなたのコードはそれをしなくてはなりません。しかし、あなたは早いEOFを許可し、ユーザが約束された20人の代わりに3人の名前しか入力しなければ、ループを正常に終了させるべきです。

あなた自身の機能を使用できないことは残念です。 1つを使用して次の名前のプロンプトを表示し、コードの繰り返しを減らすことができます。

これらの制約がある場合、コードは合理的です。ループ内のより複雑なチェックを犠牲にして、「ループ外のファーストネームを読む」を避けることができます。おそらくトレードオフはあなたが書いたものに賛成するでしょう。

+0

制限が1〜25の唯一の理由は、割り当てがそれを求めたからです。それ以外の場合は、私は同意します。 (= –