ウォームアップする小さなC / C ++タスク

私は問題を解決することを提案します。 あるいは、面接中に求職者に解決策を提示することもできます( さらに )。 この問題は非常に簡単に解決できますが、以前に会ったことのない人や、勉強中または勉強した後にオペレータサイクルの特性を分析しようとした人が一時停止します。





unsigned char型の変数(条件による8ビット)を1つだけ使用し、条件付きifステートメントと条件付き3項演算(?:)を使用せずに1つのループステートメントを使用して、正確に256ステップのループを作成します。正確に256回。 特定の場合、このようなサイクルは、0から255までのすべての整数を出力できます。



問題解決



非表示のテキスト
#include <iostream> int main() { unsigned int i = 0; do { std::cout << i << " "; } while (++i); return 0; }
      
      







興味深いことに、問題で与えられた条件の全体はdoループの使用を必要とし、whileまたはforステートメントを回避することを可能にしません。 この問題を解決する際の主な間違いは、最後の2サイクルの適用であり、ほとんどの場合、ステップをスキップする(条件で256の代わりに255ステップを実行する)か、無限ループを作成します。 このエラーは、for / whileループが非常に頻繁に使用されるという事実が原因で、どこかで95%の比率の主観的な評価に遭遇しました:5%。



サイクルは、2つのアクションの実行を繰り返します:状態のチェックと本体の実行。 これらのアクションを交互に行う方法は、前提条件(while)と事後条件(do)のサイクルを区別します。 ループ間には多くの共通点があります。特に、条件付きifステートメントとループタイプの1つを使用すると、常に第2の種類のループのように動作する構造を作成できます(たとえば、do from whileおよびifを記述できます)。 したがって、問題の要件の1つは、条件演算子ifを使用しないでください。 それにもかかわらず、アクションの順序の違いは、2種類のサイクルに特性の違いを与えます。 第一に、前提条件のあるサイクルの本体は一度も実行されないことがありますが、後条件のあるサイクルの本体は常に少なくとも1回実行されます。 次に、for / whileループでは、条件チェックがループの本体より1回多く実行され、doでループ本体が条件チェックと同じ回数実行されるか、本体がループを強制的に中断する場合はさらに1回実行されます。 したがって、問題文の「正確に256ステップ」は冗長であり、「誰の本体、...は正確に256回実行されます」は冗長ではありません。 一般に、「256ステップのサイクル」という言葉は脆弱です。条件が256回チェックされ、ボディが255回実行された場合、サイクルは255ステップのみで構成されていると言えますか? 条件の確認が複雑な操作であり、副次的なアクションを実行することは明らかです。 以前は、中間制限が定式化されていました。条件をチェックするときに、ループ本体の必要な操作(出力など)を実行することの禁止です。 ただし、サイクルの本体を正確に256回実行するという要件は、より厳密で具体的であり、最終的には正確です。 より抽象的なレベルでは、条件を「アクション、次に条件」のシーケンスに変換します。アクションと条件は、連続する計算操作(、)、論理演算などによって接続されます。 。



最後に、C / C ++のNステップのサイクルイディオムは、for(int i = 0; i <N; i ++)です。 この設計の特性は、ループカウンターiが0からNまで(N + 1)の異なる値を取ることです。 したがって、正確に256個の値をとる8ビット型は、255ステップ以下でこのようなループを作成するためにのみ使用できます。



All Articles