1

ある並べ替えられていない配列内の項目が別の並べ替えられていない配列内にあるかどうかを確認しようとしている場合など、for が二重にネストされているとします。たとえば、 と の 2 つのリストがあるcandidatesとしcorruptPeopleます。candidatescorruptPeople

for( int i = 0 ; i < lenCandidates ; i++ )
{
    // veto candidates[i] if candidates[i] is in corruptPeople at all
    for( int j = 0 ; j < lenCorruptPeople ; j++ )
        if( candidates[i] == corruptPeople[j] )
             break_this_loop_and_then_continue_outer_loop ;

    // initiate the eligible candidates
    initiate( candidates[i] ) ;
}
4

4 に答える 4

3

これを行う1つの方法(私はピアレビューを受け入れています!)を使用していgotoます:

for( int i = 0 ; i < lenCandidates ; i++ )
{
    // veto candidates[i] if candidates[i] is in corruptPeople at all
    for( int j = 0 ; j < lenCorruptPeople ; j++ )
        if( candidates[i] == corruptPeople[j] )
             goto END_FOR ;

    // initiate the eligible candidates
    initiate( candidates[i] ) ;

    END_FOR:
    ; // seem to need an empty statement to make it compile
}

gotoこの文脈での使用について他の人が何を言わなければならないのか興味があります。との独断的な意見の相違はgoto、構造化プログラミングの独断的なアプリケーションを使用することを意味します..私が試してみたところ、これはかなり悪いように見えました。

于 2012-12-07T04:02:49.407 に答える
2

goto に頼るよりも、追加の変数を使用する方がはるかに優れています。

for( int i = 0 ; i < lenCandidates ; i++ )
{
    // veto candidates[i] if candidates[i] is in corruptPeople at all
    int corrupt = 0;
    for( int j = 0 ; j < lenCorruptPeople ; j++ )
        if( candidates[i] == corruptPeople[j] )
        {
            corrupt = 1;
            break;
        }

    // initiate the eligible candidates
    if (!corrupt) initiate( candidates[i] ) ;
}
于 2012-12-07T04:08:35.850 に答える
0

以下のコードはどうですか?何か不足していますか?

for( int i = 0 ; i < lenCandidates ; i++ )
{
    // veto candidates[i] if candidates[i] is in corruptPeople at all
    int j;
    for( j = 0 ; j < lenCorruptPeople ; j++ )
    {
        if( candidates[i] == corruptPeople[j] )
          break;
    }

    //j will be equal to lenCorruptPeople only when candidate is not in corrupt list   
    if(j==lenCorruptPeople)
    {
        initiate( candidates[i] ) ;
    }

}
于 2012-12-07T04:13:02.223 に答える