C# 練習題 數組結構


排序問題

上午

復習

----------------------------------------------------

 1.復習:冒泡排序

 

 問題:有一組數據,排序之前: -1    10   - 20    -30

      要求按從小到大的順序排序

 ---------------------------------------------------

 解答:

 1) 排序過程:

 

 第一輪:3次,最大值,冒到最后   10

 

         1) -1 10    不交換 -1    10   - 20    -30

         2)10  -20   交換   -1    -20   10     -30

         3)10 -30    交換   -1    -20   -30    10

-------------------------------------------------

  注:第一輪之后,數組變為: -1  -20   -30   10

-----------------------------------------------  

 第二輪:2次, -1    -20   -30 

          1)-1>-20      -20  -1     -30

          2) -1>--30     -20  -30    -1

------------------------------------------------    

   注:第一輪之后,數組變為: -20  -30   -1    10   

-----------------------------------------------

 

 第三輪: -20  -30            -1        10

       1) -20 > -30    -30  

 

           -30  -20   -1    10

-----------------------------------------------

   注:第三輪之后,數組變為: -30   -20   -1   10

-----------------------------------------------  

  2) 總結: 4個數按從小到大的順序排序,雙重for循環排序時:

 

  第1輪:3次

  第2輪:2次

  第3輪:1次

 

  

  //注:冒泡排序時,每經過一輪,都會找到那個大的數

    第一輪找到最大數,第二輪找到倒數第二個大的數,

    第三輪找到倒數第三個大的數

    ....所以,內層循環循環條件,不用每次都要比較到最后

    每次比較一輪后,找到了大數,下次時,就不需要再比較

    這個位置上的數字.所以 j < n.Length -1-i

 

  3) 核心代碼:

  for ( int i = 0 ; i < n.Length-1 ; i++ )//1

  {   

     for( int j = 0 ; j < n.Length-1-i ; j++ )//1 2

     {

         if( n[j]>n[j+1] )

         {

             int temp = n[j];   

             n[j] = n[j+1];

             n[j+1] = n[j];

         }

     }                  

  }

 

 ---------------------------------------------------

 2.復習二維數組

 

 

 1) 定義: int[,]  score ;

      

 

 2) 初始化:  元素的個數和每個元素的值

 

   靜態:  

       int[,]  score = { {50,60},{60,70},{59,40} }

   動態:new

       int[,]  score = new  int[3,2];

 

 3)特點:

 1.二維數組的表示:行和列  [行,列]   

 2. 二維數組中的每個元素描述由行和列配合描述

    數組名 [ 行的索引值,列的索引值]

 3. 二維數組的遍歷

    //二維數組的行數

 

    for (int i = 0 ; i < n.GetLength(0) ; i++ )

    {   //二維數組的列數

        for( int j = 0 ; j <n.GetLength(1); j++ )

        {

             Console.WriteLine( score[i,j] );

        }

    }

  注: 數組名.GetLength(0)獲取的是二維數組有多少行

      數組名.GetLength(1)獲取的是二維數組有多少列

 

 

練習:定義一個3行3列的二維數組,

        並求這個二維數組對角線之和.

 

   代碼詳見:DAY06_01_Array02 工程中的 LianXi2.cs

 

 

  4) 標准的二維數組,使用場景:

     適合規則的多行多列的數據操作: 比如:

        三消類的游戲

        掃雷游戲

 

  

 

  ---------------------------------------------------

    

 網站驗證碼

 

   補充功能: 4個驗證中不能有重復的字符

   說明:

 

   代碼詳見:DAY06_01_Array02 項目下:

             “網站驗證碼”  文件夾下的兩個類:

             CodeHomeWork1.cs  --- 未處理重復

             CodeHomeWork2.cs  --- 處理重復的驗證碼了

     

  -----------------------------------------------------

下午

方法

  

  方法又稱為“函數”

  代碼重用性,降低冗余度

 

  1.方法的定義

    static  void  Main(string[] args)

    {         

    }   

   --方法名: Main(),

       命名規則:Pascal,每個單單詞首字母大寫

 

   --方法返回值:void 空,沒有任何返回值。除此之外

     還可以使用任意值類型,具體使用哪一種類型,根據

     方法完成的功能來定義。

       表示當執行了這個方法后,有沒有

       相應的內容返回給調用者。

 

   --參數列表.

         當有多個參數時,多個參數之間使用,分隔

         這些參數構成參數列表。

         參數分別:形式參數 ,又稱“形參”

                   實際參數,又稱“實參”

       形式參數:指的是方法定義時,在方法名后面的小括號

           寫的參數。當然,可以寫也可以不寫;

 

           static void  IsNarcNumber( int number )

           {  }

 

           上面的方法中就有一個參數,number,形式參數

 

      實際參數:指的是在其它的方法調用某一些方法時,

           調用時在方法名后面添加的有實際值的一些參數

           至於需要不需要傳遞參數,要根據方法定義時

           來決定的。

            int n = 60 ;

            IsNarcNumber( n );

 

  注:將實際參數傳遞給形式參數.在傳遞過程中,

       參數的類型和個數要匹配。否則會報錯。

 

   練習:水仙花數 narcissistic number

   1000以內所有的水仙花數

   要求:寫一個方法,該方法用於求1000以內所有水仙花數

   方法的名字:FindNarcNumber()

   方法的返回值:void  

       370    153     371   407

       370 = 3^3  +  7^3  +  0^3  = 370

 

  代碼詳見:DAY07_01_Method01 項目下 LianXi1.cs

--------------------------------------------------------

   練習2:

  

   在上面類中再來添加一個方法,基本形式:

   void   IsNarcNumber ( int number )

   ---該方法的返回值為 void

   ---方法有一個參數,參數為int類型,名為 number 。

   ---方法作用:用於判斷指定的數字是否是水仙花數。

    

 

   --方法體:方法中一組大括號中間的代碼塊內容

     方法體中可以寫一條語句,可以寫多條語句,

     也可以一條也不寫。

 

   --....

  2.方法的調用

 

        方法定義后,在合適的位置就可以去調用。

        調用時,如何調用呢?

       

            方法名( );    或

            方法名( 參數列表 );

  3.方法返回值

        當方法執行結束后,需不需要返回給調用者結果。

        如果不需要,定義方法返回值應該寫成:void.

        如果需要,不能寫void,得看具體情況。可以是:

        int  float  double 

 

  練習:定義一個工具類,工具類中有幾個方法:

        完成兩個數的四則運算,比如:有負責加法的方法

         int   Add( int a, int b )

        然后在主方法中調用該方法,並打印結果。

       

  代碼詳見:DAY07_01_Method01 項目下 CalculateUtil.cs

 

----------------------------------------------------

  練習:定義一個數組,並為數組元素賦值,然后

        找出數組中的最大值。要求:

 

        定義一個方法:int  GetMaxNumber(    )

        用於查找數組中最大的那個元素。

        找到之后,將這個元素的值返回。

                     

   思路:

       1.准備一個數組

       2.找出數組中的最大數

 

         1)定義 max 變量,為max 變量賦值

            假定整個數組的第一個元素就是最大值

            將第一個元素的值賦值給 max變量

                int max =  n[0]  ;

 

         2) 構建for循環,在循環體中完成:

                if語句,拿 max 先跟第一個元素判斷,

                 如果這個元素比max要大,為max 重新賦值

                 不大,不賦值,繼續max值與第二個元素判斷

                如果第二個元素比max大,max重新賦值

                 不大,不賦值,繼續max值與第三個元素...

            max 始終存儲都是整個數組的最大值。

 

 

       3.返回最大數

  

  代碼詳見:DAY07_01_Method01 項目下 LianXi2.cs

 

----------------------------------------------------

 

  補充知識點:局部變量 與 全局變量

 

  代碼詳見:DAY07_01_Method01 項目下 :

                  VarDemo1.cs

                  VarDemo2.cs

 

  4.方法的重載

  5.out  ref   params

day07   周三作業

 

一. 代碼題 

  定義三個方法:(必做)

  1) 寫一個方法,求一個int和一個float數的和 

      float sum(int a,float b)

  2) 寫一個方法,判斷鍵盤輸入的這個數是否是8的倍數

      bool  isEightNumber( int number)

  3) 寫一個方法,用於求鍵盤輸入的數字的階乘

      long  GetFac(int number)

 

  4) 下午已經實現在數組中查找數組的最大值了,

     請繼續完成功能,查找數組中的最小值。

 

 最后,要求:在Main()方法中調用並進行測試。

 

 

二.寫出下列程序的運行結果(必做)

 

 class  MethodDemo1

 {

    static  void   Main(string[] args)

    {

         int a = 10 ;

         Change( a );

         Console.WriteLine( a );

    }

    static void Change( int a )

    {

         a = 20 ;

    }  

 }

 

 (2)

 class  MethodDemo2

 {

    static void Main(string[] args)

    {

         int a = 10 ; //a是局部變量

          Change( a );

         Console.WriteLine( a );/10

    }

 

    static int Change( int  a )

    {

         a += 20 ; //a =a +20 =30

         return a;

    }  

 }

 

 (3)

 class  MethodDemo3

 {

    static void Main(string[] args)

    {

         int a = 10 ;

         a = Change( a );

         Console.WriteLine( a );

    }

    static int Change( int b )

    {

         b+=20 ;

         return b;

    }  

 }

 

三、編程題

 

 1.  考查:數組的應用 (必做)

      定義一個3行3列的二維數組,通過隨機數為數組元素賦值

      隨機數(0,10)之間。

      要求:找到數組中的最大數和最小數。

      提示:二維數組中查找最大數和最小數,和一維數組是

      一樣的。也是定義max變量,然后構建雙重for循環,

      在內層循環體中進行判斷。

 

 2. 考查:數組的應用 (選做)

    定義一個方法,方法用於:

    在數組中指定位置插入指定的元素值

    

    int[] num = {1,-100,2,-200,3};

    int[] newNum = {*,*,*,*,*,* }

    請輸入要插入元素的位置:2

    請輸入要插入元素的值:  4

    

   1.定義一個新數組,新數組長度為原數組長度+1

   2.將num數組中所有元素復制到新數組中

     int[] newNum = {1,-100,2,-200,3,* }

   3.提示用戶輸入在哪個位置插入元素:2

     提示用戶插入元素的值:1000

   4.最后遍歷新數組:

          {  1,-100,2,-200, 3,  0 }

 

 

 四、拓展分析題。

  方法使用經驗總結:

  當我們使用方法時會發現,要定義一個方法,完成某一個

  功能,方法的形式寫起來可以有多種,如何找到復用性最

  高,且 可讀性更強、質量更高的那個方法呢?

  一般遵循以下兩個規則:

 

  1) 方法只負責完成功能,它表示一段功能代碼塊的封裝,

      定義時,只需要給它合適的參數。使用時,調用者只要

      按照定義的形式傳遞合適的實際值即可。

 

  2) 在方法中,一般不要有打印輸出等語句。如果真不能

      寫 打印輸出語句,那么如果在方法在計算出了相應

      結果,如何將結果告訴調用者呢?----利用返回值。

 

      也就是說,在定義方法時,根據方法完成的功能,盡量給

      方法合適的返回值,最好不要是空。

      這樣的好處是:當調用者調用該方法時,只要傳遞類型

      相同,個數相同的參數,方法就可以幫助我們實現功能,

      至於傳遞的值是多少,其實方法不關心。

      方法做完操作之后,會將處理結果返回給調用者。

      如果調用者需要結果,則可以定義變量或做其它處理 。

      如果不需要,也不會影響程序的健壯性。

 

 

 下面在Test類中定義了三個方法,完成的功能都是計算兩個

  數的和。根據方法的使用規則,請分析哪個方法綜合是

  最合適的,然后在Main()方法中分別調用這幾個方法,體會

  方法的使用。

 

 

 class  Test

 {

   static void Main(string[] args)

   {

 

 

   }

 

   static  void   Add1( int a, int b )

   {

        int  sum  = a + b ;

        Console.WriteLine( sum );

   }

 

   static  int   Add2( int a, int b )

   {

        return  a + b ;

   }

 

   static  int   Add3( )

   {

        int a = 10 ;

        int b = 20 ;

        int sum = a + b ;

        Console.WriteLine( sum ); ;

   }

 

 }

  

如何引入BigInteger

注:

如果對一個大的數字求階乘,long類型接收的結果會變成0,

 原因:階乘結果已經超過了long類型的最大范圍。如何解決?

 引用 BigInteger 。

 第一步:右擊當前項目下的“引用”---添加引用,

  在打開的對話框中搜索 Numerics 內容,然后將查找到的選中

  最后選擇“確定”。

 第二步:在當前.cs文件的最上面,添加:using   System.Numerics;這句話。

 第三步:修改 GetFac()方法的返回值類型為:BigInteger,

  同時,修改這個方法中定義接收結果的sum變量的類型也是

  BigInteger類型。

  注:如果Main()方法中需要結果,應該將返回結果的類型也定義

  為 BigInteger類型。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM