C#本質論學習 ☞三

趙明威發表於2012-11-16

一、先來看一個詭異的程式

C++書上的一個題,拿出來剖析一下,用C#的觀點重新來做

本程式 的目的是求一個數所有的質因數, 沒有使用子函式的呼叫,第一個for使用的極其詭異,但是也保持了與第二個for的良好的連線,但是實現的過程是比較複雜的,深入的理解是有些困難的。藉助本例說一下子函式和引數的作用。

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

namespace QualityFactor
{
  class Program
  {
      static void Main()
      {
          int a, i;
          a = int.Parse(Console.ReadLine());
          start:for (; a > 1; )
          {
             for (i = 2; i <= a; i++)
            {    /*把i的值先設為2可以把所有的偶數中的2都找出來,但是那個i++感覺就有點浪費了,再遇到i                    是大於2的偶數的話就不執行了*/
                if (a % i == 0)
                {
                    Console.Write("{0}、", i);
                    a /= i;
                    goto start;    
//如果滿足條件跳出第二層迴圈,從標示的位置繼續執行,這感覺是比較好的,在C++上可以用break跳出。
                }
              }
            }
         }
       }
   }    

enter image description here
大家幫忙算一下時間複雜度吧,有點亂。
作為改進吧,將上面的兩個for迴圈變為一個

  int  a, i;
  a = int.Parse(Console.ReadLine());
   for (i = 2; i <= a; i++)
    {
       if (a % i == 0)
       {
        Console.Write("{0}、", i);
         a /= i;
        i--;
        }  
    }

在沒有子函式的呼叫的時候,這個程式只能解決這一件事情,而且相信大家對這個程式的雜亂程度會很頭疼了。改進的那個感覺還行,但是新的方法往往是具有很強的實用性和強大的功能的,那就一起來學習另外的基本的方法吧,子函式和引數的應用。


二、子函式和引數

子函式的使用:可以提高程式碼的重用,減少重複程式碼,增強程式碼的可讀性,不知道拯救了多少人的時間,這是最重要的。另外對於軟體的升級和程式的改進都是有好處的,相信很多的程式設計師都很是瞭解了。
引數的宣告:在C#中 引數的行為和命名規範和區域性變數一模一樣的,形參與主函式中的實參是對應的關係 這樣才能進行值或者是地址的傳遞。

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

namespace QualityFactor
{
   class Program
   {
     //判斷是否為素數的函式宣告需要呼叫實參如果,引數定義不可以省略
    static bool PrimeNum(int m)
    {
        int i;
        bool returnvalue = true;
        //returnvalue 的應用解決了返回值的難題,如果在迴圈中執行返回值的話不太合適
        //我弄了很久,最後提醒的是“ 並非所有的程式碼路徑都返回值”,為了保險起見吧,
        //還是用一個標記表示為好。也希望大師講解!!
        if (m == 2)
        {
            returnvalue=true;
        }
        else

        {
            for (i = 2; i < Math.Sqrt(m); i++)
            {
                if (m % i == 0)
                {
                    returnvalue = false;//如果不是素數returnvalue為false。否則為true
                }
            }
         }
        return returnvalue;

    }
    static void Main()
    {
        int a,i;
        Console.Write("請輸入要分解的a的值 a=");
        a = int.Parse(Console.ReadLine());
        for (i = 2; i <= a; i++)
        {
            if (PrimeNum(i)&&a%i==0)
            {/*判斷素數和能被a整除的數*/
                a /= i;
                Console.Write("{0}、",i);
                i--;
            }
         }
      }
   }
}  

enter image description here
雖然從長度上來講的話,用子函式會長了點,但是在一個函式中的其他場合還是比較用幫助的,你可以清楚的明吧函式每個部分的含義,如果在主函式的最後要判斷素數,或者輸出素數就可以方便的呼叫了。
另外如果子函式的數目比較多的話,必須得對子函式進行提前宣告。。這是C++中的用法,對於C#來說也是一個好習慣。。
好吧,就到這了,希望能拋磚引玉 ,希望大家能體會到點什麼。。

相關文章