排序問題
上午
復習
----------------------------------------------------
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類型。
