2011-02-06 7 views
0

私は初心者のC#プログラマーであり、スキルを向上させるためにProject Eulerを試してみることにしました。サイトの最初の問題は、1000以下で3と5の倍数の合計を求めることです。私は基本的に同じことを2回行っているので、基本数に段階的に掛ける方法を作って、すべての答えがtogethorまたは。スコープ外の変数を変更するC#

私は両方のパラメータの値に関係なく、常にゼロを返します。私は99%の変数の範囲と関係があると確信していますが、私はそれを修正する手がかりがありません。すべての助けに感謝します。条件が偽であるためので、事前に

おかげで、

サム

答えて

6

あなたのループが実際に実行されることはありません:

bool Escape = false; 
for (int mult = 1; Escape == true; mult++) 

Escapeは最初はfalseに設定されているので、最初のテストは失敗した(Escape == true戻りfalse)とループの本体はスキップされます。あなたは自分の定義されたスコープの外で変数にアクセスしようとしていた場合

コンパイラはあなたに言っただろう、そのためには、問題ではありません。 return文もありませんが、それはおそらくタイプミスです。

また、合計に加算する数値が実際には3または5の倍数であるかどうかをチェックすることはありません。その他の問題もあります(たとえば、iSumがループ内で宣言され、 〜0まで)、これは実践的なものなので、私はあなたにそれを働かせます。デバッガは、これらの:)

EDITようなケースではあなたの友達です:あなたは、実際のロジックでヘルプが必要な場合は、私がお手伝いさせていただきますが、私はあなたが可能な場合は自分でそれを仕事をしたい把握します。

+0

WOW!ありがとうございました!私は、2番目のパラメータがtrueの場合、ループは実行を続行するのではなく、終了すると考えました。コードは、x * y = qの場合、q/xの残りがゼロになるロジックを実行するので、合計が実際に倍数であることを決して確認しません。 – sam

+0

ええ、ループ条件はループを続行するためにはtrueを返さなければなりません。あなたの研究で幸運を祈ってください。オイラーは素晴らしいサイトですが、私は自分自身のほとんどを(そして "それのほとんどは"私は "残りは私にとっては難しかった:D)を意味しています。 –

0

それはループのために入力していません。

Escape == true 

はfalseを返します

アドバイス:forループを使用して

  • あなたは(1 MULT = int型のためにループ

    を破壊するための制限などの条件を使用する場合ははるかに簡単です。何か<制限;マルチ++)

    この方法では、ほとんどの場合、n EEDは、ループ内で状態を確認するために

  • ほとんどのプログラミング言語は、オペレータモジュロ除算を持っています。 http://en.wikipedia.org/wiki/Modulo_operation

    この問題は便利かもしれません。

0

このコードにはいくつかの問題があります。最初に、最も重要なことは、Escape変数を1回だけ使用していることです。 forループ内ではfalseに設定されることはありません。したがって、目的はまったくありません。削除する必要があります。次に、isumはforループ内で宣言されます。つまり、ループが実行されるたびに0に再初期化されます。これは、すべての倍数を加算するのではなく、最後の倍数だけを取得することを意味します。ここでは修正されたコードのサンプルです:他の人が指摘したように

int iSum = 0; 
for(int mult = 1; true; mult++) 
{ 
    int Number = Base * mult; 
    if(Number > limit) 
     return iSum; 
    else 
     iSum += Number; 
} 
3

、問題は、制御フローは、あなたはそれがないと思う何をしないということです。これは一般的な初心者の問題です。

あなたの提案はです。デバッガの使い方を学ぶ初心者は、コーディングの問題を解決するためにツールを使用できないという奇妙な考えがしばしばあります。むしろ、彼らは単にそれを読むだけでプログラムの欠陥を推論しなければなりません。プログラムが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以上」と言いますか?ループ状態がそれを考慮していることを確認してください。等々。

問題が実際に解決されているようにプログラムが近づくほど、正しい可能性が高くなります。

関連する問題