2

ですから、正しく機能すれば、他のことはできないようです。

私がやっているのは、プログラミングの基本を自分で学ぼうとする単位変換器を書くことです。私はそれに少し慣れていません。これが実際に私の最初のwhileループであると言うほど新しいです。だから私はコードを書いていて、それからプログラミングにいくらか経験豊富な友人としてやっていると私にそうするように言われました。これは、前述のコードをメソッドに分離します。自分でやり方がわからなかったので、VS2010自動メソッド作成を使用しました。問題の完全なソースコードはここにありますhttp://pastebin.com/9mZPPtWr問題のビットはこれです

`

      else if (type == "cups")

      {

        Console.WriteLine("Enter a number of liters to be converted into cups.");
        amount = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");

      }`

カップをコンソールに入力しました。他のすべてのエントリ/入力が正常に機能し、ループが毎回選択ビットにループバックしているにもかかわらず、コードのそのセクションを機能させることができないようです。表示されないだけで、1時間作業を続けていますが、信じられないほど明白なもの、または信じられないほど難解なものが欠けていると思い始めています。また、繰り返しコードがたくさんあるので、繰り返しを少なくするためにそれを単純化する方法があるかどうか疑問に思いました。

ありがとう、そして私はそれが読みやすくそして理解できることを望みます。私のコードがおそらくそうではないとしても。また、Accelerated C#から開始コード(トップビット)を取得しました。必要に応じて、私の質問について詳しく説明します。

4

5 に答える 5

4

私はあなたのコードを実行しました、そして(単純なエラーを修正した後)あなたが参照するならばそれは正しくelseに入ります。

入力内容をエコーバックして、入力の入力ミスがないことを確認することをお勧めします。

エラーはあなたが持っているということでした

終わり

それ自体で一列に。おそらくあなたは値を割り当てるつもりでした。

于 2012-08-23T22:47:13.510 に答える
2

まず、141行目にエラーがあります。そのdone単語を削除してください。コピー&ペーストの間違いだったと思います。第二に:ここであなたはあなたのコードが次のようになっていると言います:

else if (type == "cups")

      {

        Console.WriteLine("Enter a number of liters to be converted into cups.");
        amount = Convert.ToDouble(Console.ReadLine());
        Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");

      }

しかし、あなたがそこにリンクを与えた解決策には次のものがあります:

else if(type == "cups")
                    {

                        Console.WriteLine("Enter a number of liters to be converted into cups.");
                        amount = Convert.ToDouble(Console.ReadLine());
                        Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");

                    }

私はそれがただの不注意であることを提案します。コードは正常に機能します。置き換えるだけです。

Console.WriteLine(cupsTolitConverter.Convert(amount) + " centimeters to said number of inches.");

Console.WriteLine(cupsTolitConverter.Convert(amount) + " cups to said number of liters.");

あなたのソリューションで。

コードを単純化し、繰り返しを削除することについて話します。もちろん、それを行う方法はあります。この手順は、コードリファクタリングと呼ばれます。たとえば、プロジェクトに次のように記述しました。

...
else if(type == "grams")
                    {

                        amount = gramsToOunces(ozToGramsConverter, ref done);

                    }
...

あなたの評価はamountgramsToOunces()メソッドに置き換えられました。これもある程度のコードリファクタリングです。あなたはあなたのコードの一般的な部分を取り、それらが何に依存しているかを見る必要があります。例えば:

private static double MilesToFeet(UnitConverter milesToFeetConverter, ref int done)
        {

            double amount;
            Console.WriteLine("Enter a number of miles to be converted to feet.");
            amount = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine(milesToFeetConverter.Convert(amount) + " feet to said number of miles.");

            return amount;

        }

すべてのconvertメソッドにはそのような構造があります。すべての方法で同じことをします。同じ命令メッセージを出力します...同じ量の変数を宣言し、その値をコンソール入力に設定します...その後、ほぼ同じ情報メッセージを書き込みます。代わりに、これらすべてを1つのメソッドに入れることができるN個のメソッドを使用します。まず、コンバータークラスを拡張する必要があります。さらに2つの文字列フィールドフィールドを追加します。FromUnitおよびToUnit。なぜ???メソッドのパラメーターとしてコンバーターインスタンスを指定するためです。また、このインスタンスを使用して、このコンバーターに関する詳細情報を保存したり、後で情報メッセージを作成したりできます。例えば:

public class UnitConverter
    {
        double ratio;
        public string From { get; set; }
        public string To { get; set; }
        public UnitConverter(double unitratio) { ratio = unitratio; }
        public double Convert(double unit) { return unit * ratio; }
    }

それよりも、コンバーターのインスタンスを作成するときに、これらのプロパティに適切な値を設定します。

UnitConverter milesToFeetConverter = new UnitConverter(5280) { From = "miles" , To = "feet"};

次に、作成済みのすべてのメソッド(gramsToOunces、kmatesToMilesなど)を表すメソッドを作成しましょう。

private static void MakeConversion(UnitConverter customConverter)
        {
            Console.WriteLine("Enter a number of {0} to be converted to {1}.",customConverter.From, customConverter.To);
            double amount = Convert.ToDouble(Console.ReadLine());
            string message = string.Format("{0} {1} to said number of {2}", amount, customConverter.To, customConverter.From);
            Console.WriteLine(message);
        }

これで、すべてのメソッドを削除できます。ifブロックでは、同じことを行うさまざまなメソッドを呼び出す代わりに、さまざまなパラメーターを使用して、この1つのメソッドを呼び出すことができます。

else if(type == "miles"){MakeConversion(milesToFeetConverter); }

これらすべての操作の後、ソリューションは次のようになります。

using System;

namespace ConsoleApplication2
{
    public class UnitConverter
    {
        double ratio;
        public string From { get; set; }
        public string To { get; set; }
        public UnitConverter(double unitratio) { ratio = unitratio; }
        public double Convert(double unit) { return unit * ratio; }
    }

    class Test
    {
        private static void MakeConversion(UnitConverter customConverter)
        {
            Console.WriteLine("Enter a number of {0} to be converted to {1}.",customConverter.From, customConverter.To);
            double amount = Convert.ToDouble(Console.ReadLine());
            string message = string.Format("{0} {1} to said number of {2}", amount, customConverter.To, customConverter.From);
            Console.WriteLine(message);
        }

        public static void Main()
        {                 
            UnitConverter feetToInchesConverter = new UnitConverter(12) { From = "feet", To = "inches"};
            UnitConverter milesToFeetConverter = new UnitConverter(5280) { From = "miles" , To = "feet"};
            UnitConverter kmsToMilesConverter = new UnitConverter(1.609) { From = "kilometers", To = "miles"};
            UnitConverter centToInchesConverter = new UnitConverter(2.54) { From = "centimeters", To = "inches" };
            UnitConverter ozToGramsConverter = new UnitConverter(28.349) { From = "ounces", To = "grams" };
            UnitConverter cupsTolitConverter = new UnitConverter(4.226) { From = "cups", To = "litters" };

            string type;
            int done;

            done = 0;

            while(done == 0)
            {
                {
                    type = Console.ReadLine();

                    if(type == "centi")
                    {
                        MakeConversion(centToInchesConverter);
                    }

                    else if(type == "feet")
                    {
                        MakeConversion(feetToInchesConverter);
                    }

                    else if(type == "km")
                    {
                        MakeConversion(kmsToMilesConverter);
                    }

                    else if(type == "miles")
                    {
                        MakeConversion(milesToFeetConverter);
                    }

                    else if(type == "grams")
                    {
                        MakeConversion(ozToGramsConverter);
                    }

                    else if(type == "cups")
                    {
                        MakeConversion(cupsTolitConverter);
                    }

                    else if(type == "end")
                    {
                        done = 1;
                    }
                }
            }
        }
    }
}

当然のことながら、コードをより簡単かつ明確にするために、より多くのことを行うことができます。ifをcaseに置き換え、MakeConversionメソッドを直接UnitConverterクラスに置き換え、クラスのアーキテクチャを変更します。それはあなたが何ができるかについての私の提案だけです。ただし、まず最初に、ounメソッドとクラスの記述方法を学習し、VisualStudioメソッドジェネレーターを使用しないでください。メソッドの記述方法を自分で知っておく必要があります。私はどういうわけかそれを説明しようとしました、それが役に立ったことを願っています

于 2012-08-23T23:41:41.060 に答える
0

ページリンク先のコードの141行目は次のとおりです。

141 - done

その変数では何も実行せず、セミコロンで終了しません。

(Visual Studioエディターを使用していないため、プログラムが機能していると思われるため、コンパイル時エラーが発生しました。プログラムを実行するたびに、古いバージョンを実行している可能性があります。Visualをダウンロードして使用できることを願っています。学習時間を増やし、混乱時間を減らすStudio Express。頑張ってください)

于 2012-08-23T22:48:24.263 に答える
-1

「Ifelse」がヒットしない場合は、前の条件がtrueであるか、条件がfalseであるかのいずれかを意味します。

'=='演算子は、文字列を比較するときに大文字と小文字を区別する ため、必ずそれを考慮に入れてください。これはより複雑なトピックであり、後で進むにつれて意味があります。

幸運を!

于 2012-08-23T22:50:51.953 に答える
-3

私の提案:Nunitを使用して、その単体テストを作成します。Nunitは期待値と実際の値を示し、これが機能しない理由がわかります。

于 2012-08-23T22:46:43.620 に答える