ホームページ  >  記事  >  バックエンド開発  >  C#でのプログラム関数実装とコード選択についての考え方

C#でのプログラム関数実装とコード選択についての考え方

黄舟
黄舟オリジナル
2017-09-25 11:17:311278ブラウズ

私は C# 言語に触れてまだ数日しか経っていませんが、高レベルで詳細な研究記事を書こうと思ったら、おそらく推測や非論理的な推論に満ちています。これまでのところ、言語の入門知識 (ほとんどのプログラマの入門儀式である「Hello, world!」の出力)、データとデータ型、データ操作、プログラム関数の実装プロセスとループ、配列とセットに分かれています。小さな知識の点から学んだ知識を連続的に応用するまで、記述言語を使用してアプリケーションの問題を解決し、その記述をコードで表現するなど、それほど多くの困難に耐える必要はありませんでした。

授業の初めに、3つの興味深い質問をしたのを覚えています。最初の質問は、飼い主が草、羊、オオカミを川を越えて運ぶことについてです。オオカミは羊を食べ、羊は草を食べます。飼い主が川を渡ることができるのは 1 つだけです。この質問は、生徒の思考方法を導くために使用されているように感じます。ところで、生徒が問題を分析して答えるための明確なアイデアを持っているかどうかを観察し、羊が単独で、または一緒にのみ存在できる重要なポイントを見つけます。問題がうまく解決できるように、彼らの所有者。 2 番目の問題は、3 人の僧侶と 3 人のモンスターが川を渡ることです。ボートは一度に 2 人しか輸送できません。モンスターの数が僧侶の数よりも多い場合、ゲームは終了します。この問題は、問題をどのように考えるかというテストでもありますが、モンスターと僧侶の輸送プロセスの正確さにも注意を払う必要があります。まず、すべての僧侶が安全に向こう側に到着することを確認し、問題を解決する必要があります。このセンター。 3 番目の問題は、終わった後、隣のクラスメートが 27 秒かかるかもしれないと言ったので、何度もやり直しました (29 秒しかかかりませんでした)。要件は、30 秒間しか光らないライトを使用して 5 人を橋を渡らせることです。そのライトを使って通過できるのは 1 秒、3 秒、6 秒、8 秒です。もちろん、この問題は理解する必要があります。重要な点は、1 秒の子供を使って逆方向に光を走らせ、12 秒の老人と 8 秒の太った男性を一度に追い越さなければならないことです。試してみたところ、1s の子が 2 回返される限り、3s の子は 1 回返されることがわかりました。1 回のパスでは、最も時間がかかった 2 桁が一度に通過されます。他のソート設定がどのように設定されていても、そうではありません。最終結果に影響します。

この有意義な開会式を振り返り、C# の世界に戻りますが、実際、この 2 つは異なるコードの同じ実装効果について書いてみましょう。


まず簡単な例を見てみましょう。水仙番号を見つけるとき、答えにある各桁の値を解く必要があります。


int i = 100;while (i < 1000)
{    int a = i / 100 % 10;    int b = i / 10 % 10;    int c = i % 10;    if (a * a * a + b * b * b + c * c * c == i)
    {
        Console.WriteLine(i);
    }
    i++;
}

そして、私は答えるときに 2 つの異なる方法を使用しました。1 つ目は:


int i = 100;while (i < 1000)
{    int a = i /100;    int b = i % 10 / 10;    int c = i % 10;    if (a * a * a + b * b * b + c * c * c == i)
    {
        Console.WriteLine(i);
    }
    i++;
}

2 つ目の方法は:


int i = 100;while (i < 1000)
{    int a = i / 100;    int b = (i  - a * 100) / 10;    int c = i -a * 100 - b * 10;    if (a * a * a + b * b * b + c * c * c == i)
    {
        Console.WriteLine(i);
    }
    i++;
}

以上ですコードが異なる理由は、問題分析と運用時の考え方が異なるためです。 1 つ目は、求めた桁数の後の内容を破棄し、数値 10 の余りを取得する方法です。これは、削除後に残った数値の一の桁が常に求めた桁数の値に対応するためです。 2 番目の方法も、数値を分割し、求めた桁数の 10 の倍数である数値の余りを求め、求めた桁数より前の数値をすべて破棄します。取得される最初の桁は常に の数値になります。求めた数値を入力し、除算を使用して目的の値を取得します。 3 番目の方法は行き止まりで、余分なものをすべて切り取って削除するだけです。全体として、さまざまなアイデアや問題解決方法がコードの実装に影響することはありませんが、短くてエレガントなコードを選択すると、コード全体の美しさが向上する可能性があるため、これには注意が必要です。私自身の洞察に関しては、理解しやすいコードを選択することを優先する必要があります。同時に、知識を広げ、さまざまなアイデアを実装する方法をさらに考える必要があります。


しかし、ここまでくると、上記は単なる数学の問題で、コーディングの考え方と何の関係があるのか​​と疑問に思う人もいるかもしれません。次に、私と他の人の間でのさまざまな実装アイデアを見てみましょう。この質問は、配列を作成して値を割り当てた後、ユーザーが検索する数値を入力して、その数値が配列内に存在するかどうかを判断できるようにするものです。

int[] nums = { 4, 8, 12, 333, -9, 1 };bool isFind = false;for (int i = 0; i < nums.Length; i++)
{    if (nums[i] == n)
    {
        isFind = true;        break;
    }
}if (isFind)
{
    Console.WriteLine("数组中存在该数");
}else{
    Console.WriteLine("数组中不存在该数");
}

私の考え方は次のとおりです:


int[] nums = { 4, 8, 12, 333, -9, 1 };
Console.Write("请输入需要查找的数字:");int input2 = int.Parse(Console.ReadLine());for (int i = 0; i < 5; i++)
 {   if (nums[i] == input2)
       Console.WriteLine("在数组中查找到该数值,该数为数组中的第" + (i + 1) + "项!");   if(i==4&&nums[i]!=input2)
       Console.WriteLine("未在数组中找到对应项!");
 }

 

  第一种代码是通过定义一个bool类型数据isFind,如果找到,就改变isFind的数据,然后通过isFind的数据完成实现。而我在思考时,是想如果没有找到,那么循环完成后循环次数就会达到最大值,但是此时最后一位数与输入的数相同,两个输出对应条件都能满足,所以,排查到最后并且最后一位的值也不等,才能满足输出未找到结果。通过这样的分析,就写出了这两段代码。这就是不同思路采用不同代码来实现相同功能的方式。


 

  关于不同代码实现相同功能,还有一个最经典的例子,是不能不提的,那就是数组和集合的排序,下面介绍三种思路:交换排序、冒泡排序和选择排序。

  交换排序中心思想是从第一个数组项开始,固定nums[i],依次第i+1个后面的数据进行比较,如果有比num[i]小的值,就对其进行交换。


for( int i = 0; i < arrays.Length - 1;  i++)
{    for(int  j = i+1; j < arrays.Length; j++)
   {       if(arrays[i]>arrays[j])
         {             int temp=arrays[i];
             arrays[i]=arrays[j];
             arrays[j]=temp;
         }
   }
}

 

  冒泡排序是将最大的数沉到底部,先将最后一个位置固定,再从第一个数开始比较,每遇到一个大的数,这个数就与后一位交换,就像气泡一样,这个变动的寻找中的值越滚越大,直到最后一位。这时,再确定倒数第二位,再次进行替换。(第二个for循环中,每次循环,nums[j]的值总是逐渐变大。)实现代码如下:

 


for(int i = nums.Length - 1; i > 0; i--)
{    for(int j = 0; j < i; j++)
    {        if( nums[j] > nums[j+1] )
            {               int temp = nums[j];
               nums[j] = nums[j+1];
               nums[j+1] = temp;
            }
   }
}

 

  选择排序从第一个数开始,先假设第一个数为最小的数,将其与后面每一个数进行比较,如果遇到小的,就记录这个数的下标,循环完成后,记录的下标对应的数一定是数据组的最小值,此时替换最小值到第一位。后面依次循环,完成排序。


for(int i = 0; i < nums.Length - 1; i++)
{    int index = 1;    for(int j = i+1; j < nums.Length; j++)
     {        if(nums[j])<nums[index])
           {
                index=j;
           }
     }     int temp = nums[i];
     nums[i] = nums[index];
     nums[index] = temp;
}

  有上面三种排序方法可以看出,只要能够实现功能,思路和代码并不重要。只要能找到解决问题的关键点,并围绕关键点弄懂解决问题的方法,根据方法确定流程,再完成代码的编写,这样想要达到功能的实现并不难。不过为了整个代码的便于查看和修改,在使用这些代码时,在能够理解代码书写的思路前提下,尽量使用结构优良,语句简洁的语句。当然,如果一些方法难以理解,最好还是使用自己理解的代码书写,便于自己完成查看和修改,如果必要,注释也是必不可少。

  总而言之,多观察别人的思路,多看多想多开拓,总是没有坏处。毕竟是编程,难以理解或者使用不熟练,解决的方法还是多练多敲,没有其他的捷径。

以上がC#でのプログラム関数実装とコード選択についての考え方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。