、問題は、制御フローは、あなたはそれがないと思う何をしないということです。これは一般的な初心者の問題です。
あなたの提案はです。デバッガの使い方を学ぶ初心者は、コーディングの問題を解決するためにツールを使用できないという奇妙な考えがしばしばあります。むしろ、彼らは単にそれを読むだけでプログラムの欠陥を推論しなければなりません。プログラムが1ページ以上になると、それは人間にとって不可能になります。デバッガはあなたの親友ですので、その機能を理解してください本当によく。
この場合、デバッガでコードをステップ実行すると、ループ状態が評価されていてループがスキップされていることがわかります。この時点で、「なぜこれがゼロを返すのですか」と尋ねることはありません。「なぜループ本体はいつもスキップされていますか?」と尋ねるでしょう。明らかに、それは実際にはここでの問題なので、より生産的な質問があります。
コードをデバッガでステップ実行せずに記述しないでください。すべての変数を監視し、値がどのように変化するかを監視します(デバッガは値を変更した直後にウォッチウィンドウの変数を強調表示します)。また、制御フローと変数の変更が期待通りのものであることを確認します。静かな疑念に注意を払う。何か普通ではないと思われる場合は、を追跡してとし、それが正しい理由を知るか、それが正しいかどうかを確認するか、
実際の問題について:15、30、45、60が... 3と5両方のすべての倍数であることを覚えていますが、一度だけの和に追加します。 Project Eulerの問題を解決する際のアドバイスは、可能な限り解決しようとしているようなコードを書くことです。問題を「擬似コード」で最初に書き出してみてください。私はこれを次のように擬似コードします:
sum = 0
for each positive number under 1000:
if number is multiple of three or five then:
add number to sum
擬似コードがあれば、その微妙なことに気付くことができます。同様に、には1000が含まれます?問題は「1000未満」または「1000以上」と言いますか?ループ状態がそれを考慮していることを確認してください。等々。
問題が実際に解決されているようにプログラムが近づくほど、正しい可能性が高くなります。
WOW!ありがとうございました!私は、2番目のパラメータがtrueの場合、ループは実行を続行するのではなく、終了すると考えました。コードは、x * y = qの場合、q/xの残りがゼロになるロジックを実行するので、合計が実際に倍数であることを決して確認しません。 – sam
ええ、ループ条件はループを続行するためにはtrueを返さなければなりません。あなたの研究で幸運を祈ってください。オイラーは素晴らしいサイトですが、私は自分自身のほとんどを(そして "それのほとんどは"私は "残りは私にとっては難しかった:D)を意味しています。 –