一、先来看一个诡异的程序

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#来说也是一个好习惯。。
好吧,就到这了,希望能抛砖引玉 ,希望大家能体会到点什么。。