3

ユーザーに尋ねるループを実装してから、入力の有効性を確認する必要があります(この場合、無効な番号を印刷する必要があります)。それを実装するためのより良い方法は何ですか?

私たちのプログラミング教授は私たちに使用を許可していませんbreak、そしてfor(;;)彼が言うように、それは悪い習慣です。あれは正しいですか?

例1:

int i = 0;

while(i == 0) {
  cout << "...: ";
  cin >> i;

  /*... Loop body ...*/

  if (i == 0)
    cout << "Not a valid number" << endl;
}

例2:

int i = 0;

do {
  cout << "...: ";
  cin >> i;

  /*... Loop body ...*/

  if (i == 0)
    cout << "Not a valid number" << endl;

} while (i == 0) // Better while(true) and use break ?

例3:

int i = 0;

for ( ;; ) {
  cout << "...: ";
  cin >> i;

  /*... Loop body ...*/

  if (i == 0)
    cout << "Not a valid number" << endl;
  else
    break;
}
4

4 に答える 4

2

あなたの場合、2番目の構成(do..while)は、読者がコードの機能を確認するのに最も直感的であり、これは重要です。

最初のものはそれほど悪くはありませんが、最後のものは貧弱です。「for」構造は通常、事前に制限が設定された反復回数が限られている場合に使用されます。必ずしもそうである必要はありませんが、直感的にはそれがforループの使用方法です。

(ちなみに、ユーザーが数字ではない文字列を入力した場合は、cinの失敗フラグをクリアする必要がありますが、それは実際にはここで尋ねられる質問ではありません)。

于 2012-10-25T17:42:14.667 に答える
2

ゼロを整数として受け入れる必要はありませんか? 特別な意味を持つ入力数値に依存しないことをお勧めします。

ループの意味が、タスクが完了するまで無限にループすることである場合、明確にwhile(true). 私はおそらく次のようなことをするでしょう(C++ 11が必要です):(またはboost lexical_castを使用します)

#include <iostream>
#include <string>
#include <stdexcept>

int infini_asker(){
  while (true) {
    std::cout << "...: ";
    std::string tmp;
    std::cin >> tmp;
    int i;
    try{
      i=std::stoi(tmp);
    }catch(std::invalid_argument){
      continue;
    }catch(std::out_of_range){
      continue;
    }
    return i;
  } 
}

int main(){
  int num=infini_asker();
  std::cout << " got:" <<num << std::endl;
}
于 2012-10-25T17:55:38.007 に答える
1

例 1 の変更が最良の形式のようです。

while(true) {
    cout << "...: ";
    cin >> i;

    /*... other stuff ...*/

    // Do your input validation here:
    // Note that it's much better to whitelist what is
    // acceptable input as opposed to checking all of the
    // possible cases of invalid input
    if (...) { // where .. is the condition for valid input
        break
    } 
}

do-while ループは、ネストされたロジックを少なくとも 1 回実行する必要があるという点を理解したい特別な場合のために予約する必要があります。do-while でできることは何でも while(...) でできる

for(;;) は多くのプログラマーにとってなじみのない構文ですが (1 年前は意味がわかりませんでした)、一方 while(true) ははるかに明白です。

于 2012-10-25T17:37:57.023 に答える
0

それらはすべて機能します。Shmiddty が for(;;) は良いプログラミング習慣ではないと言っているように。例 2 のようにしますが、私はプロのプログラマーではありません。

于 2012-10-25T17:36:39.543 に答える