0

私が使用している本 (さまざまな種類のループに関する章の要約) の演習では、ユーザーに単一の文字を入力するように継続的に要求するプログラムを作成するように指示されました。次の 2 つの仕様があります。

  1. 「$」文字が入力されると、プログラムは終了するはずです。
  2. プログラムは、入力された期間の数を集計し、プログラムの終了時に合計を出力する必要があります。基本的には、入力プロンプトをループする -> ピリオドをカウントする -> このカウントを表示し、「$」が入力されたときにプログラムを終了するという考え方です。

ここに私が持っているコードがあります:

// Takes character input, tallies periods, stops on dollar sign

#include <iostream>
using namespace std;

int main() {

    char i; // input received
    int j = 0; // counter for # of periods

    cout << "This program will accept single-character entries and report the number of periods you've entered.\n";

    for (;;) {
        do {
            cout << "Please enter a single character, using $ to stop: ";
            cin >> i;

            if(i == '.')
                j++;
        } while(i != '$');

    if(i == '$')
        cout << "Total number of periods entered is " << j << " .";
        break;

    }
    return 0;
}

プログラムは正常に動作し、コードは効率的に見えます。間違っている場合は修正してください。私にとって奇妙に思えるのは、コードの大部分で無限の for{} ループが使用されていることです。この章ではこれを 1 回か 2 回使用したので、この方法でループ関数を作成する方法は、私が現在知っている唯一の方法です。

おそらくそれは言語の経験が浅いだけかもしれませんが、ここでのループの使用は(;;)C ++での典型的な出来事ですか? パラメーターが定義されていないループを使用する構文は、私が必要としていたことには意味があるように思えますが、for(;;){} ブロック全体は依然として奇妙に見えます。

4

3 に答える 3

4

if外側のループも、内側のループの後のチェックも必要ありません。

また、読み取り時にエラーまたは EOF をチェックするため、次のようにコーディングします。

int periods;
char ch;

std::cout << "Please enter a single character, using $ to stop: ";
for (periods = 0; std::cin >> ch && ch != '$'; )
{
    if (ch == '.')
        periods++;
    std::cout << "Please enter a single character, using $ to stop: ";
}

std::cout << "Total number of periods entered is " << periods << " .";
于 2013-06-30T06:51:31.853 に答える
1

永久ループは、電子機器ではより一般的です。メインは次のようになることもあります。

void main()
{
    Init();
    while (1);
}

この場合、メイン関数は割り込みが処理されるのを待ちます。

通常、永久ループは使用しませんが、問題を解決するための標準的な方法ではないだけで、悪い決定ではありません。

次のようなコードを考えてみましょう:

while (1)
{
...
    if (condition)
        break;
}

次のように変更できます。

while (!condition)
{
...
}

ループを少なくとも 1 回実行する必要がある場合は、do-while ループを使用できます。

于 2013-06-30T09:58:42.530 に答える
1

の使用や、私が本やコードのスニペットの例でほぼ独占的に見for (;;)たようなもの。while (1)本格的なプログラムでこれを見たことはありませんが、おそらくあまり一般的ではありません。ただし、通常、ループ内には少なくとも 1 つの式 (場合によってはそれ以上) があります。しか使えbreaksませんが、可読性を損ないます。次の点を考慮してください。

for (;;){
    // do some stuff here
    if (anexpression) break;
}

do {
    // do some stuff here
} while (anexpression);

読みやすいのはどっち?私は後者の方が好きですが、それは単なる意見です。ループを記述する方法は他にもたくさんあります (つまり):

evaluateinput:

if (anexpression) goto evaluateinput;
于 2013-06-30T07:16:46.957 に答える