9

状況に応じて、一方が他方よりも特定の利点を持つという概念は理解していますが、すべての状況で交換可能ですか? 私の教科書は書いている

for (init; test; step) {
    statements; 
} 

と同じです

init; 
while (test) { 
    statements; 
    step; 
} 

for ループで次のプログラムをどのように書き直しますか? 次のプログラムを for ループ形式に作り直すと、init とテストの値を設定するのに問題があります。

import acm.program.*;

public class DigitSum extends ConsoleProgram{  
public void run() {
     println("this program sums the digits in an integer");
     int n = readInt("enter a positive number: ");
     int dsum = 0;
     while ( n > 0) {
       dsum += n % 10;
       n /=10;
     }
    }
   }
4

7 に答える 7

9
int dsum = 0;
for(int n = readInt("enter a positive number: "); n > 0; n /=10) {
   dsum += n % 10;
 }
于 2013-01-17T07:05:58.037 に答える
5

これを書くのをやめられないので、指摘しておきます。

あなたの for ループ: -

for (init; test; step) {
    statements; 
} 

あなたが投稿したwhileループと同一ではありません。for ループのinitはループの外では見えませんが、while ループでは見えます。つまり、ループinitの一部で宣言された変数のスコープについてです。forちょうどループの中にあります。

したがって、これが for ループの正確な変換です: -

{
    init; 
    while (test) { 
        statements; 
        step; 
    }
} 

あなたの特定のケースの変換に関する限り、私はあなたがすでに答えを得たと思います.


上記の説明により、while ループの正確な変換は@Eric's上記のバージョンとは少し異なり、次のようになります。

int dsum = 0;
int n = 0;
for(n = readInt("enter a positive number: "); n > 0; n /=10) {
    dsum += n % 10;
}

これには、for ループの外側@Eric'sにループ変数の宣言があるという点で、回答からの変更がほとんどないことに注意してください。nこれは、私が行った説明から導き出されたものです。

于 2013-01-17T07:09:50.597 に答える
3

イニシャライザで宣言された変数のスコープのほかに、 がfor別の動作を示す場合があります。これは、 が存在する場合continueです。

for (init; test; update) {
    if(sometest) { continue; }
    statements; 
} 

と同一ではありません

init; 
while (test) { 
    if(sometest) { continue; }
    statements; 
    update; 
} 

whileループcontinueではスキップするため、updateループはスキップされforません。

最も端的な例でこれを示すために、次の 2 つのループを考えてみましょう (@Cruncher に感謝します)。

// terminates
for(int xa=0; xa<10; xa++) { continue; }

// loops forever
int xa=0;
while(xa<10) { continue; xa++; }
于 2013-05-10T00:55:56.280 に答える
1

はい。ただし、次の 2 点を除きます。

  1. 「For」を使用すると、その中で条件(=変数、ところで-複数の変数!)を宣言して初期化できます。その後、「For」サイクルを離れると、自動的にクリーンアップされます。
    一方、「While」では、自分で初期化する必要があります-「While」の外側で、クリーンアップ-変数(条件用)が宣言された場所の可視性を離れる場合にのみ。

  2. 「For」には、コレクションと配列の反復のための便利な構文 (およびその後のすべてのクリーンアップ) があります。

あなたのコードを次のように書き直します。

import acm.program.*;

public class DigitSum extends ConsoleProgram{  
public void run() {
     println("this program sums the digits in an integer");
     for(int n = readInt("enter a positive number: "), dsum = 0; n > 0; n /=10) {
         dsum += n % 10;
     }
    }
   }

忘れないでください - init では、複数の変数の宣言/初期化を行うことができます

于 2013-01-17T07:12:52.853 に答える
1

+1、良い質問

2つの違いは、ほとんどが目を楽しませてくれます。ある例では、一方が他方よりも単純に読みやすい場合があります。あなたの例では、以下は1行のコードで同等のforループです。ただし、この場合、while ループの方が読みやすくなります。

public void run() {
  println("this program sums the digits in an integer");
  for (n = readInt("enter a positive number: "), dsum=0; n > 0; dsum+=n%10, n/=10);
}
于 2013-01-17T07:11:46.533 に答える
0

これはうまくいくはずです。whileループをこれに置き換えます。初期化部分を空のままにしてください。

    for(;n>0;n=n/10)
    {
        dsum+=n%10;
    }
于 2013-01-17T07:07:04.213 に答える
0

一体、どのような困難を抱えているのか

int n = readInt("enter a positive number: ");
for(n;n>0;n=n/10)
{dsum+=n%10;
}
于 2013-01-17T07:10:02.960 に答える