2017-05-02 10 views
-2

私はこのコードを本から見ました。これは、クイックユニオンアルゴリズムについて語っています。しかし、私は2つのforループがどのように機能するかについてはあまり理解していません。誰もこのC++のループを私のために説明できますか?

#include <iostream> 
using namespace std; 
const int N = 10; 
// 
int main() 
{ 
    int i,j,p,q,id[N]; 
    for(i = 0; i < N; i++) { 
     id[i] = i; 
    } 
    while (cin >> p >> q){ 
     // how does these two for loops work? 
     for (i = p; i != id[i]; i = id[i]); 
     for (j = q; j != id[j]; j = id[j]); 
     if (i == j) continue; 
     id[i] = j; 
     cout << " " << p << " " << q << endl; 
    } 
} 
+0

私は何か本から何かをコピーするには何かtypo''dと思われる。 –

+0

@PhilMどのように?コンパイルしてコードを実行しただけでうまくいきます。 – SSD

+0

@SSDロジックが間違っています。デバッガでステップ実行してみてください。 ** whileループの最初の反復で、** for **ループの内側の**ループはすべて繰り返されないことに気付くでしょう。bc 'id = {0,1,2,3,4,5,6,7 、8,9} '。しかし、その後、 'id' _might_が変更されました。つまり、**内部ループ** forループ**は実際に繰り返します。 –

答えて

4
for (statement 1; statement 2; statement 3) { 

ステートメント1は、ループ(符号ブロック)を開始する前に実行されます。

文2は、ループ(コードブロック)を実行する条件を定義します。

ステートメント3は、ループ(コードブロック)が実行されるたびに実行されます。

例えば、(文1)が変数を設定している可能性があります(文2)が条件です。(文3)は関数をループしてからsomethingを実行するとどうなりますか?あなたのケースで

for (i = p; i != id[i]; i = id[i]); 
for (j = q; j != id[j]; j = id[j]); 

forループpに等しいiを設定し、その後限りiがIDに等しくないように[i]は、次いでiid [i]に等しい、条件を尋ねます。他のループと同じですが、今度は他の変数と同じです。

+0

となります。 pは最初に署名されます。 iがid [i]と等しくない場合、id [i]はiに署名されますか?私はそれを正しく理解していますか? – SSD

+0

@SSDはい。しかし、 'id'は各要素がそのインデックスと等しくなるように初期化されているので、** for ** **は** whileループの最初の反復で反復しないことが保証されています。 –

+0

私が作った編集を見て、私は今あなたのために自分自身をより明確にしました。 –

0

誰でもこのループを私のために説明できますか?

これは明らかです。regular for loop doesはC++です。混乱するかもしれない唯一のことは、ループのために、これら2です:

for (i = p; i != id[i]; i = id[i]); 
for (j = q; j != id[j]; j = id[j]); 

は空体(例えば、彼らは単に代わりに、ループ本体の;を持っている)を持っています。これは、この場合には、非常に混乱して、そしてそれは、whileループでより明らかであろう。第二のループのために同じ

i = p; 
while (i != id[i]) 
    i = id[i]; 

このループが何をするかそれほど明白ではないかもしれません:while (cin >> p >> q)

while (cin >> p >> q)は、C++でのiostreamからの入力を行うための一般的な方法です。

istream::operator>>はistreamへの参照を返し、cin >> p >> qの結果はcinです。 booleanコンテキストでcin(または他のistream)が使用されている場合は、operator boolを使用して、以前の入力操作のエラーがあるかどうかをチェックします。

関連する問題