我在Visual Studio 2013上的C#代码无法正常工作

时间:2015-07-06 06:27:59

标签: c# visual-studio-2013

我正在努力成为一名受过教育的懒惰化学学生,通过制作一个可以为我进行化学计算的C#程序。为了制作代码,我必须很好地理解化学课程中的程序。

我是任何类型编程的新手,C#是我的第一语言。 该代码适用于1个元素计算,但不适用于2个元素计算。

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

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            MassCalculation myMassCalculation = new MassCalculation();
            TwoMassCalculation myTwoMassCalculation = new TwoMassCalculation();


            Console.WriteLine("How many elements are in the compound?");
            string userMainInput = Console.ReadLine();


            if (userMainInput == "1")
            {
                myMassCalculation.Amount1 = 1;

                Console.WriteLine("What is the ELEMENT?");

                string userInput1 = Console.ReadLine();

                Elements element;

                if (Enum.TryParse<Elements>(userInput1, true, out element))
                {
                    switch (element)
                    {
                        case Elements.Na:
                            myMassCalculation.Element1 = 22.990;
                            break;
                        case Elements.Cl:
                            myMassCalculation.Element1 = 35.453;
                            break;
                        default:
                            break;
                    }
                }
                Console.WriteLine("How many?");

                string userAmount1 = Console.ReadLine();
                int myAmount1 = int.Parse(userAmount1);
                myMassCalculation.Amount1 = myAmount1;

                myMassCalculation.DoCalculation();

                resultOfMassCalculation(myMassCalculation);
            }

            if (userMainInput == "2")
            {
                Console.WriteLine("What is the First ELEMENT?");

                string userInput1 = Console.ReadLine();

                Elements element;

                if (Enum.TryParse<Elements>(userInput1, true, out element))
                {
                    switch (element)
                    {
                        case Elements.Na:
                            myMassCalculation.Element1 = 22.990;
                            break;
                        case Elements.Cl:
                            myMassCalculation.Element1 = 35.453;
                            break;
                        default:
                            break;
                    }   
                }

                Console.WriteLine("How many?");

                string userAmount1 = Console.ReadLine();
                int myAmount1 = int.Parse(userAmount1);
                myMassCalculation.Amount1 = myAmount1;


                Console.WriteLine("What is the Second ELEMENT?");

                string userInput2 = Console.ReadLine();

                if (Enum.TryParse<Elements>(userInput2, true, out element))
                {
                    switch (element)
                    {
                        case Elements.Na:
                            myTwoMassCalculation.Element2 = 22.990;
                            break;
                        case Elements.Cl:
                            myTwoMassCalculation.Element2 = 35.453;
                            break;
                        default:
                            break;
                    }
                }

                Console.WriteLine("How many?");

                string userAmount2 = Console.ReadLine();
                int myAmount2 = int.Parse(userAmount2);
                myTwoMassCalculation.Amount2 = myAmount2;

                myTwoMassCalculation.DoCalculation();

                resultOfMassCalculation(myTwoMassCalculation);
            }


            Console.ReadLine();
        }
        private static void resultOfMassCalculation(MassCalculation calculation)
        {
            Console.Write("The Mass is {0}g/mol", calculation.DoCalculation());
        }
    }
    enum Elements
    {
        Na,
        Cl,
    }



    class MassCalculation
    {
        public double Element1 { get; set; }
        public int Amount1 { get; set; }

        public virtual double DoCalculation()
        {
            double result = Element1 * Amount1;
            return result;
        }
    }
    class TwoMassCalculation : MassCalculation
    {
        public double Element2 { get; set; }
        public int Amount2 { get; set; }

        public override double DoCalculation()
        {
            double result = Element1 * Amount1 + Element2 * Amount2;
            return result;
        }
    }
}

请帮忙!我知道这似乎有点不专业。我刚刚开始编程一周前,这是我能做的最好的。我需要指导。

代码中定义的唯一元素是Na和Cl,我正在尝试计算NaCl。当一切都到位后,我会在列表中添加更多元素,以及更多不同类型的计算。

我会采取建设性意见。

提前非常感谢你。

3 个答案:

答案 0 :(得分:2)

我重构了你的代码。它将以相同的方式工作,但不会因不适当的用户输入而崩溃

https://dotnetfiddle.net/CMQugr

using System;
using System.Collections.Generic;

namespace Test
{
    public class Program
    {
        public static Dictionary<string, double> Elements = new Dictionary<string, double>
        {
            {"Na",22.990},
            {"Cl",35.453}
        };

        public static void Main()
        {
            double result = 0;

            int elemenCountInput;
            do
            {
                Console.WriteLine("How many elements are in the compound?");
            } while (!Int32.TryParse(Console.ReadLine(), out elemenCountInput));

            for (int i = 0; i < elemenCountInput; i++)
            {
                string element;
                do
                {
                    Console.WriteLine("What is the {0} element", (i + 1));
                    element = Console.ReadLine();
                } while (!Elements.ContainsKey(element));

                int amount;
                do
                {
                    Console.WriteLine("How many");
                } while (!Int32.TryParse(Console.ReadLine(), out amount));

                result += Elements[element] * amount;
            }

            Console.Write("The Mass is {0}g/mol", result);
            Console.ReadLine();
        }
    }
}

答案 1 :(得分:1)

当元素为2时,代码中存在问题。您要将第一个元素值分配给&#34; myMassCalculation&#39;对象和第二个元素值为&#34; myTwoMassCalculation&#34;。当你打电话给&#34; DoCalculation()&#34; &#34; myTwoMassCalculation.Element1&#39;和&#34; myTwoMassCalculation.Amount1&#34;没有价值。这就是它给出错误答案的原因。进行以下更改并尝试:

            if (Enum.TryParse<Elements>(userInput1, true, out element))
            {
                switch (element)
                {
                    case Elements.Na:
                        myTwoMassCalculation.Element1 = 22.990;
                        break;
                    case Elements.Cl:
                        myTwoMassCalculation.Element1 = 35.453;
                        break;
                    default:
                        break;
                }   
            }

            Console.WriteLine("How many?");

            string userAmount1 = Console.ReadLine();
            int myAmount1 = int.Parse(userAmount1);
            myTwoMassCalculation.Amount1 = myAmount1;

答案 2 :(得分:1)

我会做类似的事情:

  1. 为元素创建一个类(名称(字符串),无论该数字是什么(双/小数)

  2. 创建一个按名称索引的静态字典。

  3. 将参数循环到Main(或循环输入命令),查找字典中的每个条目,然后执行计算。

  4. 如果需要,转换为LINQ。

  5. 这是一个很好的方法,应该教你很多。我不会为你写的(时间和愿望),但我可能会稍后再举一个例子。