>  기사  >  백엔드 개발  >  C#의 프로그램 기능 구현 및 코드 선택에 대한 생각

C#의 프로그램 기능 구현 및 코드 선택에 대한 생각

黄舟
黄舟원래의
2017-09-25 11:17:311278검색

저는 C# 언어를 접한 지 며칠밖에 되지 않았습니다. 높은 수준의 심도 있는 연구 논문을 쓰고자 한다면 아마도 추측과 비논리적인 추론으로 가득 차 있을 것입니다. 지금까지 언어에 대한 입문 지식(대부분 프로그래머의 입문 의식 - "Hello, world!" 출력), 데이터 및 데이터 유형, 데이터 작업, 프로그램 기능 구현 프로세스 및 루프, 배열 및 세트로 나누어져 있습니다. 작은 지식 포인트부터 학습한 지식을 시리즈로 적용하는 것까지 기술적인 언어를 사용하여 응용 문제를 해결하고, 이러한 기술적인 문장을 코드로 표현하는 등 많은 어려움을 겪을 필요가 없었습니다.

 수업 초반에 세 가지 흥미로운 질문을 했던 기억이 나네요. 첫 번째 질문은 주인이 풀, 양, 늑대를 강 건너편으로 운반하는 것에 관한 것입니다. 늑대는 양을 먹고 양은 풀을 먹습니다. 주인이 강을 건너갈 수 있는 것은 한 가지뿐입니다. 이 질문은 학생들의 사고 방식을 안내하는 데 사용되는 느낌을 줍니다. 그런데 학생들이 문제를 분석하고 답할 명확한 아이디어가 있는지 관찰하고 양은 혼자 또는 함께만 존재할 수 있다는 핵심을 찾습니다. 문제가 잘 해결될 수 있도록 소유자. 두 번째 문제는 승려 3명과 몬스터 3마리가 강을 건너는 문제인데, 배는 한 번에 2명씩 수송할 수 있으며, 몬스터 수가 승려 수보다 많아지면 게임이 종료됩니다. 문제는 문제를 어떻게 생각하느냐에 대한 시험이기도 하지만, 몬스터와 스님의 이동 과정의 정확성에도 주의를 기울여야 하며, 모든 스님들이 먼저 반대편에 안전하게 도달할 수 있도록 하고, 주변의 문제를 해결해야 합니다. 이 센터. 세 번째 질문은 나에게 깊은 인상을 남겼고, 옆에 있던 친구가 27초 정도 걸릴 수 있다고 해서 계속해서 시도했다(29초밖에 안 걸렸다). 요구사항은 5명이 다리를 건너도록 안내하기 위해 30초 동안만 빛을 발하는 것입니다. 한 번에 2명만이 그 빛을 가지고 지나갈 수 있습니다. 5명이 걸리는 시간은 1초, 3초, 6초, 8초입니다. 그리고 12s는 물론 이 문제를 파악해야 합니다. 핵심은 1s의 아이를 이용해 반대 방향으로 빛을 달리게 하려는 것이고, 12s의 노인과 8s의 뚱뚱한 남자는 한 번에 통과해야 한다는 것입니다. 시도한 결과, 1s 자식이 두 번 반환되는 한 3s 자식은 한 번 반환되는 것으로 나타났습니다. 한 번의 패스에서는 다른 정렬 설정을 어떻게 설정하더라도 가장 오래 걸리는 두 자리가 한 번에 통과되지 않습니다. 최종 결과에 영향을 미칩니다.

이 의미 있는 개막식을 되돌아보고, 다시 C#의 세계로 돌아와서, 사실 둘은 공통점이 많습니다. 이제 서로 다른 코드의 동일한 구현 효과에 대해 써보겠습니다!


먼저 간단한 예를 들어보겠습니다. 수선화 번호를 찾을 때 각 백 자리의 값을 풀어야 합니다.


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++;
}

저는 두 가지 방법으로 답변했는데 첫 번째 방법은


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++;
}

두 번째 방법은


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++;
}

위 내용은 모두 정확하고 달성 가능한 코드. 코드가 다른 이유는 작업 중 문제 분석과 사고에 대한 관점이 다르기 때문입니다. 첫 번째는 찾는 자릿수 뒤의 내용을 버리고 숫자의 나머지 부분을 10으로 취하는 것입니다. 왜냐하면 절제 후 남은 숫자의 일 자리는 항상 찾는 숫자의 값과 일치하기 때문입니다. 두 번째 방법은 숫자를 나누고, 구하는 자릿수의 10의 배수인 나머지 숫자를 찾아 구하는 자릿수 이전의 숫자를 모두 버리는 것입니다. 얻은 첫 번째 숫자는 항상 자릿수입니다. 값을 찾은 다음 나누기를 사용하여 원하는 값을 얻습니다. 세 번째 방법은 막다른 골목입니다. 초과분을 모두 잘라낸 다음 제거하면 됩니다. 전체적으로 다양한 아이디어와 문제 해결 방법이 코드 구현에 영향을 미치지는 않지만 짧고 우아한 코드를 선택하면 전체 코드의 아름다움을 향상시킬 수 있다는 점은 여전히 ​​주목할 필요가 있습니다. 나 자신의 통찰에 있어서는 내가 쉽게 사용할 수 있도록 내가 이해할 수 있는 코드를 선택하는 것을 우선시해야 하며, 동시에 지식을 확장하고 다양한 아이디어를 구현하는 방법에 대해서도 더 많이 생각해야 합니다.


 그러나 이 시점에서 일부 사람들은 위의 내용이 단지 수학 문제일 뿐이며 코딩 아이디어와 어떤 관련이 있는지 의문을 가질 수 있습니다. 그러면 나와 다른 사람들의 다양한 구현 아이디어를 살펴보겠습니다. 이 질문은 배열을 만들고 값을 할당한 후 사용자가 찾을 숫자를 입력하고 해당 숫자가 배열에 존재하는지 확인하는 것에 관한 것입니다.


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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.