2012-05-09 10 views
1

で一定のゼロ値は私はほとんど私の小さなコンソールアプリの作業、唯一の問題は、変数totalCommが値0C#コンソールアプリケーション - 変数

私はすべてを試みを持つ保持していることですが、私はおそらくちょうど小さなを見落としてしまいました問題を解決する修正。

事前に感謝

フィリップ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace CommissionCalculator 
{ 
class Program 
    { 
    public static void Main() 
    { 
     double total; 
     double comm = 0; 
     double totalComm = 0; 
     string name = ""; 

     string inputLetter = ""; 
     int whilecount = 0;   

     while (inputLetter != "z") 
     { 
      if (whilecount == 0) 
      { 
       Title(); 
       whilecount = whilecount + 1; 
      } 

      getNameSales(out inputLetter, out name, out total, comm, totalComm); 

      calcComm(total, out comm); 

      outputVar(name, total, comm); 

      totalCommCalc(comm, totalComm); 
     } 
    } 

    public static void Title() 
    { 
     Console.WriteLine("\n   Sunshine Hot Tubs \n  Sales Commissions Report\n"); 
    } 

    public static void getNameSales(out string inputLetter, out string name, out double total, double comm, double totalComm) 
    { 
     name = ""; 
     inputLetter = ""; 
     total = 0; 

     Console.WriteLine("\nEnter salespersons initial a,b or e or enter z to quit"); 

     inputLetter = Console.ReadLine(); 

      if (inputLetter == "a") 
      { 
       name = "Andrea"; 

       string inValue; 
       double sale = 0; 
       total = 0; 

       for (int count = 1; count <= 3; ++count) 
       { 
        Console.WriteLine("Please enter sale: "); 
        inValue = Console.ReadLine(); 
        sale = Convert.ToDouble(inValue); 

        total = total + sale; 
       } 
      } 
      else if (inputLetter == "b") 
      { 
       name = "Brittany"; 

       string inValue; 
       double sale = 0; 
       total = 0; 

       for (int count = 1; count <= 3; ++count) 
       { 
        Console.WriteLine("Please enter sale: "); 
        inValue = Console.ReadLine(); 
        sale = Convert.ToDouble(inValue); 

        total = total + sale; 
       } 
      } 
      else if (inputLetter == "e") 
      { 
       name = "Eric"; 

       string inValue; 
       double sale = 0; 
       total = 0; 

       for (int count = 1; count <= 3; ++count) 
       { 
        Console.WriteLine("Please enter sale: "); 
        inValue = Console.ReadLine(); 
        sale = Convert.ToDouble(inValue); 

        total = total + sale; 
       } 
      } 
      else if (inputLetter == "z") 
      { 
       totalCommCalc(comm, totalComm); 

       Console.WriteLine("Total commssion paid: {0:C}", totalComm); 

       Console.ReadKey(); 
      } 
     } 

    public static void calcComm(double total, out double comm) 
    { 
     comm = total * 0.2; 
    } 

    public static double totalCommCalc(double comm, double totalComm) 
    {    
     totalComm = totalComm + comm; 

     return totalComm; 
    } 

    public static void outputVar(string name, double total, double comm)   
    { 
     Console.WriteLine("\n Name\t  Total sales\t  Commission \n{0}  \t {1}  \t  {2}", name, total, comm);    
    } 
    } 
} 

答えて

1

totalCommはtotalCommCalcにによって渡されます。 参照で渡すか、totalCommCalcから戻してtotalCommに割り当てます。

変数が値渡しの場合は、コピーが呼び出したメソッドのスタックに配置されます。そのコピーに対する変更はオリジナルには影響しません。あなたは参照で渡すとき

、元のアドレスがスタックに配置され、かつは元には影響を与えないを変更します。

オプション1:

// Passed by reference. 
// Changes affect original. 
// Has side effects. See http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29 
totalCommCalc(comm, ref totalComm); 

オプション2:side effectsを有するコードを理解し、それが成長するように維持することが困難であることができるように

// Preferred. Passed by value. 
// Result is assigned to a variable. 
// No side effects. 
totalComm = totalCommCalc(comm, totalComm); 

私は、第二の形態を好むだろう。

+0

あなたは私に最高のことを説明したので、私はあなたの答えを受け入れました。私は本当にC#で新しいです、あなたが大きな頭痛から私を救ってくれてありがとう:D –

0

「totalCommCalc」への呼び出しは、戻り値を格納したり、他の方法のようにoutキーワードを使用する必要がありますどちらか。あなたの他のメソッドとの一貫性のために、私はアウトを使用し、戻り値を削除します。

totalCommCalc(comm, out totalComm); 

OR

totalComm = totalCommCalc(comm, totalComm) 
+0

「出力」として機能しません。入力値は必須です。 –

0

あなたは参照でないによってtotalCommに渡しています。 totalCommへの変更を維持する場合は、refパラメータ、または必要に応じてに戻り、関数の値をに戻します。

.... 
getNameSales(out inputLetter, out name, out total, comm, ref totalComm); 
.... 

public static void getNameSales(out string inputLetter, out string name, out double total, double comm, ref double totalComm) 
0

いけない(@Eric Jによると:side effects有するコードは、それが成長するように理解し維持するために困難であることができる)refを使用:

ちょうど一行すなわち、割り当てを変更し、参照により通過する

あなたの変数は関数の返り値です。

totalComm = totalCommCalc(comm, totalComm); 

これだけです。

+0

これは間違っています、メソッドのボディを見てください。 – gdoron

+0

+ =、just =は不要です。 –

+0

@ EricJ .:感謝と編集 –

関連する問題