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

C# 我在Visual Studio 2013上的C代码无法正常工作,c#,visual-studio-2013,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 ConsoleApp

我正在努力成为一个受过教育的懒惰的化学学生,通过制作一个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。一切就绪后,我将向列表中添加更多元素,以及更多不同类型的计算

我会采纳建设性的意见


提前非常感谢。

当元素为两个时,代码中存在问题。您正在将第一个元素值指定给myMassCalculation对象,将第二个元素值指定给myTwoMassCalculation。调用DoCalculation时,myTwoMassCalculation.Element1'和myTwoMassCalculation.Amount1没有值。这就是为什么它给出了错误的答案。进行以下更改并重试:

            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;
我会这样做:

为元素名称字符串创建一个类,无论该数字是双精度还是十进制

创建一个静态字典,按名称索引

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

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;
        }
    }
}
如果需要,转换为LINQ


这是一个很好的方法,应该会教你很多东西。我不打算花时间和精力来编写它,但稍后我可能会带着一个例子回来。

我对您的代码进行了一点重构。它将以同样的方式工作,但不会因用户输入不当而崩溃


你得到了一个错误,或者只是预期的结果不正常?你说的“不正常工作”到底是什么意思?它工作,但每次我试图计算2种元素的化合物,如NaCl,代码忽略了第一种元素,只计算第二种元素,我试图让TwoMassCalculation类从MassCalculation派生出来,我假设TwoMassCalculation类将继承MassCalculation的所有特性。你可以在第141行看到我的观点:第二类质量计算:质量计算。你可以说我在努力避免复制粘贴。谢谢你的建议。我很感激你的建议。你的想法可以大大提高我的编码技能。目前我还没有掌握数组、集合、字典和LINQ的操作。我会记下这些建议,并把我的思想投入到积极的思考中。你的代码把我的思想吹走了。当我学到足够的知识来理解它时,我会把你的代码作为一个学习的例子。非常感谢你!虽然我很感激您为创建一个完美的工作代码所做的努力,但我仍然在寻找我的代码不能按我希望的方式工作的原因。“我想迈出一小步,一路走到顶峰。”EricDuong另一个家伙已经给出了为什么它不起作用的答案。我不想发布副本。学习愉快@很好的一个。我刚开完会回来写这篇文章。你帮我节省了时间:+1