本文介紹
作者在校期間做班教課近兩年來的一些精華內(nèi)容悯许,既然現(xiàn)在已經(jīng)畢業(yè)了,把以前做成教程的內(nèi)容拿出來分享給大家辉阶,本文章也適用于初識C#使用想要學(xué)習(xí)C#的同學(xué)先壕,本文章課程內(nèi)容均是作者個人觀點(diǎn)意見看法,希望大家喜歡谆甜,支持的可以打個賞哈哈垃僚。
文章中幾句內(nèi)容,幾千字之內(nèi)說完整個C#語言规辱,未免有些唐突谆棺,一定會一些地方處理的不是得特別好,希望大家諒解按摘!
C#程序介紹
我們先來看一下C#程序的構(gòu)造
using System;
class program
{
static void Main(string[] args)
{
Console.WriteLine(“Hello World");
}
}
-
using System
C#命名空間 -
class program
C#程序主類名字 -
static void Main(String[] args)
C#程序主方法 應(yīng)用程序入口 -
Console.WriteLine
C#程序輸出函數(shù) 輸出到控制臺上
好啦包券,這樣我們就完整的寫好了一個簡單C#程序纫谅,這樣就是C#程序的構(gòu)造,接下來我們來看看C#程序的常用的變量
C#變量和常量
- 數(shù)字類型
我們只需要記住int和double類型就可以溅固,int代表整數(shù)付秕,double代表小數(shù)。
private int i=0; //定義一個整數(shù)變量并賦值為0
private double i
- 布爾類型
布爾類型顧名思義侍郭,布爾類型只包含兩種值那就是對或錯询吴,true和false
private bool b1;
private bool b2;
- 字符串類型
也是一個比較常用的類型,用于存儲一個字符串亮元。
private string s1;
好了知道這些我們就可以進(jìn)入C#程序設(shè)計了猛计,但是在學(xué)習(xí)整體代碼之前我們還需要了解一些東西*
來到C#世界前的踏板
控制臺輸入輸出
- 控制臺的輸入
console.Read(); //讀取一個字符
console.ReadLine(); //讀取一行字符
- 控制臺的輸出
console.WriteLine(); //將指定數(shù)據(jù)輸出到控制臺
自增自減運(yùn)算
-
自增運(yùn)算(++)
前置自增運(yùn)算符 :前置自增運(yùn)算符先對變量減1,然后使用變量爆捞;
后置自增運(yùn)算符 :后置自增運(yùn)算符先使用變量奉瘤,然后對變量減1 -
自減運(yùn)算(--)
前置自減運(yùn)算符 :前置自減運(yùn)算符先對變量減1,然后使用變量煮甥;
后置自減運(yùn)算符 :后置自減運(yùn)算符先使用變量盗温,然后對變量減1
** 好了該介紹的介紹完了,我們可以來到C#的小世界成肘,來探索C#的根源了 哈哈哈**
C#程序控制語句
IF語句
if(條件)
{
//如果條件成立卖局,則執(zhí)行這里
} else
{
//如果條件不成立,則執(zhí)行這里
}
我們在學(xué)習(xí)C#程序時候這幾個程序控制語句需要知道双霍,比如看這個if語句砚偶,顧名思義就是去判斷我們的給出的條件是否成立,成立執(zhí)行什么不成立執(zhí)行什么洒闸。
FOR循環(huán)
for(表達(dá)式1;表達(dá)式2;表達(dá)式3)
{
語句塊染坯;
}
for循環(huán)用于我們需要執(zhí)行循環(huán)的操作時候使用,比如我們循環(huán)輸出1到100中能被7整除的數(shù)
int i;
for(i=1;i<100;i++){
if(i%7 == 0) Console.WriteLiine(i);
}
- 這里我們使用循環(huán)操作用于循環(huán)出1到100的100個數(shù)顷蟀,然后一一去和7相除看看是否能被整除如果整除我們就輸出這個數(shù)酒请。
- 這里表達(dá)式1時循環(huán)體中的初始值骡技,表達(dá)式2時循環(huán)的終止條件鸣个,表達(dá)式3時循環(huán)體自增的步伐,這里我們自增的步伐是1布朦,第一次循環(huán)i是1囤萤,第二循環(huán)則變成了2。
好了我們基本上介紹完了基礎(chǔ)要領(lǐng)是趴,我們來看幾道考試必考的題目涛舍,來活動活動
!K敉尽富雅!這里我們先要說道一個重點(diǎn)5!就是我們做編碼没佑,一定不要去背代碼毕贼,一定要學(xué)會去理解代碼,然后把我們需要解題的過程分步記錄下來蛤奢,然后我們按照步驟去編寫代碼9硌ⅰ!啤贩!
習(xí)題1 (水仙花數(shù))
輸出100~999之間所有的水仙花數(shù)待秃,水仙花數(shù)各位數(shù)字的立方和等于這個三位數(shù)本身。例如:371就是一個水仙花數(shù)痹屹,371 = 33 + 73 + 13章郁。
這里先說什么是水仙花數(shù)呢?水仙花數(shù)就百位上的數(shù)字的立方加上十位上的數(shù)的立方再加上個位上的數(shù)的立方和為這個數(shù)本身志衍,這樣的數(shù)就是水仙花數(shù)驱犹。
這里我們先說說水仙花數(shù)的過程吧
由題目可知我們要求100到999內(nèi)的水仙花數(shù),所以呢我們要做一個100到999的循環(huán)足画,然后判斷每一個數(shù)是不是水仙花數(shù)雄驹。
第一步 寫出100到999的循環(huán)
第二步 取出百位十位個位上三個數(shù)
第三步 判斷這個數(shù)是不是水仙花數(shù),并輸出
這里我們給出代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/**
* 水仙花數(shù)
*/
namespace Demo5
{
class 水仙花數(shù)
{
static void main(string[] args)
{
for (int i = 100; i <= 999; i++) {
int a = i % 10;
int b = (i % 100) / 10;
int c = i / 100;
if (a*a*a + b*b*b + c*c*c == i){
Console.WriteLine(i);
}
}
Console.ReadKey();
}
}
}
- 這里我們說明一下淹辞,十位上的數(shù)是怎么取出來的医舆,哈哈,這里我們先對這個百位數(shù)除10取出商值象缀,假若這里百位數(shù)是123蔬将,除以10之后的商為12,然后再對商值除10進(jìn)行取余便得出商值2央星,到這里便取出了十位數(shù)2霞怀!哈哈,明白了嘛!
習(xí)題2(回文數(shù))
編寫一個程序來判斷輸入的五位數(shù)是不是回文數(shù)莉给?
我們先來說明一下什么是回文數(shù)毙石?例如12321 45654 這樣的數(shù) 以中間數(shù)為分割 左右對稱的數(shù)就是回文數(shù)。我們的任務(wù)就是去判斷這個數(shù)是不是回文數(shù)
我們這里分出兩個方法來解釋這個回文數(shù)颓遏。第一種比較簡單學(xué)校的要求徐矩,去判斷一個5位數(shù)是不是回文數(shù),我們?nèi)フ莆者@個就可以啦叁幢,另一鐘方法我們用字符串去判斷是不是回文數(shù)滤灯,這種方法可以判斷5位以上的數(shù)是不是回文數(shù)。
這里我們先列出代碼
//這里我們只寫主函數(shù)里的代碼啦
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/**
* 回文數(shù)
*/
namespace Demo5
{
class 回文數(shù)
{
static void main(string[] args) {
int n;
n = int.Parse(Console.ReadLine());
int a, b, c, d;
a = n / 10000; 萬位數(shù)
b = (n / 1000) % 10; 千位數(shù)
c = n / 10 % 10; 十位數(shù)
d = n % 10;個位數(shù)
if((a==d)&&(b==c)){
Console.WriteLine("是");
}else{
Console.WriteLine("不是");
}
}
}
}
這里的步驟也比較簡單,分別取出萬位數(shù)鳞骤、千位數(shù)窒百、十位數(shù)、個位數(shù)豫尽,然后判斷萬位數(shù)和個位數(shù)是否相同贝咙,十位數(shù)和千位數(shù)是否相相同,如果都相同則說明這是個回文數(shù)
接下來我們來給出下一種方法
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string a;
a=Console.ReadLine();
int len = a.Length-1;
int x,y;
for (x = 0,y = len - x; x <= (len+1)/ 2; ++x,--y)
{
if (a[x]!=a[y])
{
Console.WriteLine("不是回文");
break;
}
}
if(x>=y)
{
Console.WriteLine("是回文");
}
Console.ReadKey();
}
}
}
這里是循環(huán)去判斷一一對應(yīng)的位置上的數(shù)字是否相同拂募,如果有一個不同則跳出循環(huán)庭猩,說明它不是個回文數(shù),如果一一相同則說明它是個回文數(shù)陈症。這里我們就不做步驟講解了蔼水,如果有興趣的同學(xué)可以評論或者加我,我再給你們一一詳解录肯。
習(xí)題3(循環(huán)的應(yīng)用實(shí)例)
編寫一個C#控制臺應(yīng)用程序趴腋,依次輸出100~200之間的素數(shù)(素數(shù)是這樣的整數(shù),它除了能表示為它自己和1的乘積以外论咏,不能表示為任何其他兩個整數(shù)的乘積)优炬,要求每5個素數(shù)換行顯示?
- 同理,我們先說明下什么是素數(shù)厅贪?素數(shù)就是一個正整數(shù)蠢护,除了被1和素數(shù)本身整除的數(shù)就是素數(shù)
同理,我們這里一樣先說明下使用編程求出100到200中素數(shù)的過程
第一步 寫出100到200的循環(huán) 做出100到200的循環(huán)用于判斷100到200中每一個數(shù)是不是素數(shù)
第二步 判斷循環(huán)中的這個數(shù)是不是素數(shù)
第三步 輸出素數(shù) 如果這個數(shù)是第五個數(shù) 輸出換行符
我們這里給出代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo5
{
class 循環(huán)素數(shù)
{
static void main(string[] args) {
int i, j, n = 0;
for (i = 100; i <= 200; i++) {
for (j = 2; j < i; j++)
{
//從2開始到n-1用循環(huán)中的數(shù)與之相除养涮,如果整除這個數(shù)變不是素數(shù)
if (i % j == 0) break;
if (j == i - 1)
{
Console.Write(i + " ");
n++;
}
}
if (n % 5 == 0) Console.WriteLine(); //如果是第5個數(shù)換行
}
Console.ReadKey();
}
}
}
數(shù)組
數(shù)組顧名思義葵硕,就是存了一組數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)叫做數(shù)組,如下數(shù)組的定義
//靜態(tài)數(shù)組的定義
int [] arr={1,2,3,4,5};
int []array={25,14,13,8,7}
//動態(tài)數(shù)組的定義
int[] arr = new int[5];
動態(tài)數(shù)組的定義贯吓,int[] arr = new int[5];懈凹,arr是數(shù)組的名字。5是動態(tài)數(shù)組的長度悄谐。
習(xí)題3(數(shù)組的應(yīng)用實(shí)例)
包含十個元素的整型數(shù)組:int[] arr = { 32, 87, 3, 589, 12, 4076, 2000, 8, 622, 127 }介评。請使用冒泡排序,將它們按照從大到小的順序重新排列并輸出爬舰。
- 冒泡排序的基本思想:以升序為例们陆,含有n個元素的數(shù)組原則上要進(jìn)行n-1趟排序。對于每一趟的排序洼专,從第一個數(shù)開始棒掠,依次比較相鄰兩個數(shù)的大小孵构。如果前一個數(shù)比后一個數(shù)大屁商,則進(jìn)行交換。這樣一趟過后,最大的數(shù)將會出現(xiàn)稱為最末位的數(shù)組元素蜡镶。第二趟則去掉最后一個數(shù)雾袱,對前n-1個數(shù)再按照上面的步驟找出最大數(shù),該數(shù)將稱為倒數(shù)第二位的數(shù)組元素官还,......芹橡,n-1趟過后,就完成了排序
既然是這樣望伦,我們來說說冒牌排序的編程過程思路
第一步 定義數(shù)組
第二步 做一次循環(huán) 從頭到尾
第三步 做嵌套循環(huán) 從外層循環(huán)的頭到外層循環(huán)的尾 依次比較大小 將大的數(shù)交換
第四步 輸出數(shù)組
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
int[] arr = { 32, 87, 3, 589, 12, 4076, 2000, 8, 622, 127 };
int temp;
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = 0; j < arr.Length-i-1; j++)
{
if (arr[j] < arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
foreach (int a in arr) //數(shù)組中的循環(huán) 可以使用for循環(huán)林说,使用i值來讀出數(shù)組中數(shù)據(jù),也可以使用foreach循環(huán)數(shù)組
{
Console.Write(a + " ");
}
}
}
}
習(xí)題4(楊輝三角)
輸出楊輝三角
楊輝三角的屬性特點(diǎn)如下
每個數(shù)等于它上方兩數(shù)之和屯伞。
每行數(shù)字左右對稱腿箩,由1開始逐漸變大。
第n行的數(shù)字有n項劣摇。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
哈哈珠移,看起來是不是特別的復(fù)雜,其實(shí)很簡單的末融,這里一共是5行钧惧,第一行1個數(shù),第二行2個數(shù)勾习,第三行3個數(shù)浓瞪,一次往下每一個數(shù),是上一行對應(yīng)兩個2之和巧婶,再加上每一行前加上n-i個空格追逮,依次類推整體輸出后就是楊輝三角!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/**
* 楊輝三角
*/
namespace Demo5
{
class 楊輝三角
{
static void main(string[] args) {
Console.WriteLine("楊輝三角");
int n = int.Parse(Console.ReadLine());
int[][] a = new int[n][];
for (int i = 0; i < a.Length; i++) {
a[i] = new int[i + 2];
a[i][0] = 1;
a[i][i + 1] = 0;
for (int j = 1; j < a[i].Length - 1; j++) {
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
}
for (int i = 0; i < a.Length; i++) {
for (int j = 0; j < a.Length-i; j++) {
Console.Write(" ");
}
for (int j = 0; j < a[i].Length; j++) {
if (a[i][j] != 0)
Console.Write(a[i][j]+" ");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}
函數(shù)
函數(shù)是什么呢粹舵?顧名思義钮孵,早在我們初中數(shù)學(xué)就學(xué)過函數(shù),例如f(x)=x+x^2眼滤,這里如果我們代入x為2巴席,這個函數(shù)是不是會給我們一個值值為6,c#中的函數(shù)和我們初中學(xué)的函數(shù)概念是一樣的诅需,在這里我們管這個值叫做返回值漾唉,x則是參數(shù)。
下面我們通過一段代碼來熟悉下函數(shù)的定義構(gòu)造和用法
注意:主類中寫自定義函數(shù)堰塌,需要加上static
習(xí)題5 函數(shù)求和
class Program
{
static int add(int x, int y)
{
int sum;
sum = x + y;
return sum; //函數(shù)的返回值赵刑,返回誰?在這里定義
}
static void Main(string[] args)
{
int ret;
ret = add(3,5);
Console.WriteLine(ret);
}
}
- 這里我們定義了一個叫做add的函數(shù)
int add(int x ,int y);
這里的返回值是int
類型场刑,參數(shù)是兩個參數(shù)int x
和int y
猜绣。 - 當(dāng)我們在主函數(shù)里調(diào)用這個子函數(shù)并傳入2個參數(shù)分別分3和5,然后執(zhí)行到子函數(shù)中惩妇,子函數(shù)中執(zhí)行兩個數(shù)相加并返回喇潘,獲得8,在主函數(shù)中我們使用ret去獲取這個值,最后我們輸出這個數(shù)。這樣就是子函數(shù)啦。
遞歸
- 相信大家都應(yīng)該知道或者聽說過遞歸壁畸,想必大家看了書本、課件上的遞歸的介紹和編碼一定會感覺非常困惑茅茂,怎么會這么復(fù)雜捏萍?其實(shí)遞歸非常的簡單。
- 我們從一道遞歸例題(斐波那契數(shù)列)說起空闲,來理解遞歸的原理照弥。斐波那契數(shù)列(1 1 2 3 5 8 13 21)數(shù)列上每一個數(shù)都是前兩個數(shù)的和,這樣我們就可以總結(jié)出一個公式进副!
- 當(dāng)n=1,n=2時候數(shù)列上的值為1
當(dāng)n>2數(shù)列上的值為(n-2)+(n-1)兩個數(shù)的和 - 這樣我們可以寫出遞歸函數(shù)代碼
if(n==1) return 1;
if(n==2) return 1;
if(n>2) return f(n-1)+f(n-2);
我們需要定義一個遞歸函數(shù)这揣,名字為f,參數(shù)為n影斑,返回值類型為int類型给赞,這樣我們給出全部代碼
namespace Fibonacci_Sequence
{
class Program
{
static int f(int n) //自定義遞歸函數(shù)
{
if (n == 1) return 1;
if (n == 2) return 1;
if (n > 2 ) return f(n-1) + f(n-2);
}
static void Main(string[] args)
{
int n= 10;
int fib = f(n);
Console.WriteLine(fib);
}
}
- 我們可以根據(jù)這個遞歸公式列出所有取出的值
f(1) = 1
f(2) = 1
f(3) = f(2) + f(1) = 2
f(4) = f(3) + f(2) = 3
...
附加練習(xí) 階乘遞歸
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/**
* 函數(shù)階乘
*/
namespace Demo5
{
class 函數(shù)階乘
{
static int f(int n) {
int ret = 0;
if (n < 0) Console.WriteLine("請輸入一個非負(fù)整數(shù)");
if (n == 0 || n == 1)
ret = 1;
else ret = n * f(n - 1);
return ret;
}
static void main(string[] args) {
int n = int.Parse(Console.ReadLine());
int result = f(n);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
這樣看起來是不是簡單一些,其他的遞歸也類似矫户,先寫出遞歸方程片迅,然后做成遞歸函數(shù)編碼,然后再在主函數(shù)中調(diào)用皆辽,這樣遞歸就可以實(shí)現(xiàn)了柑蛇!
面向?qū)ο缶幊蹋悾?/h1>
- 之前我們學(xué)習(xí)到的所有內(nèi)容是不是和C語言有些類似?但是我們?yōu)槭裁匆獙W(xué)習(xí)C#呢驱闷,因為他比C語言要更靈活一些耻台,一些處理更加方便一些,比如這章我們說到的面向?qū)ο缶幊獭?/li>
- 面向?qū)ο缶幊炭樟恚裁词敲嫦驅(qū)ο缶幊膛璧ⅲ科鋵?shí)就是類和類的實(shí)例化,所什么又是類呢扼菠?在我們學(xué)習(xí)C語言的時候摄杂,假若我們求一個長方形的面積,我們只需要知道場長和寬就可以求出長方形的面積循榆,但是我沒每次要求長方形面積的時候析恢,我們都需要重新寫一下這個函數(shù)方程才能求出長方形的面積,但是我們有了面向?qū)ο缶幊讨螅悾┪覀兙筒辉傩枰看味既ブ匦聦懸粋€方程去求面積秧饮!
- **所以我們只需要將這個長方形的長和寬還有求長方形面積的公式封裝起來映挂,以后我們每次需要求長方形面積的時候我們只需要實(shí)例化這個封裝類就可以使用這個長方形泽篮,并可以根據(jù)長和寬求出長方形面積了!
**
**
接下來讓我們進(jìn)入C#類的編程吧袖肥,在這里我們先要了解一些東西咪辱,關(guān)于面向?qū)ο缶幊痰闹R
- **屬性讀寫(get set訪問器) ** 當(dāng)我們在類中定義了一些變量振劳,在其他類中是無法直接訪問的(public屬性除外)椎组,這時候我們就需要索引器來幫助我們?nèi)〕龀蓡T變量(類中定義變量)
- 構(gòu)造函數(shù) 當(dāng)我們實(shí)例化類的時,幫助我們初始化類中成員變量(下面會詳細(xì)講解什么實(shí)例化)
-
重載構(gòu)造函數(shù) 構(gòu)造函數(shù)可以有多個历恐,當(dāng)我們傳入?yún)?shù)不同時寸癌,會執(zhí)行不同的構(gòu)造函數(shù)
接下來讓我們通過一段代碼來理解下什么是面向?qū)ο缶幊贪桑?/em>
習(xí)題6 自定義類
自定義類長方形,類中包含長方形的屬性長和寬弱贼,包含構(gòu)造函數(shù)和屬性讀寫(get set訪問器)蒸苇,還包括長方形求面積函數(shù)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Demo5
{
class RectAngle {
private int l;
private int w;
public RectAngle(int l, int w) {
this.l = l;
this.w = w;
}
public void Calc() {
int square = l * w;
Console.WriteLine(square);
}
}
class 自定義長方體類
{
static void main(string[] args)
{
RectAngle r = new RectAngle(int.Parse(Console.ReadLine()), int.Parse(Console.ReadLine()));
r.Calc();
}
}
}
- 我們先來說一下什么是實(shí)例化,當(dāng)我們制作了一個長方形類吮旅,這個類代表的是所有的長方形溪烤,我們無法使用它來計算長方形面積因為我們沒有長方形的長寬,我們需要把這個單獨(dú)拿出來并賦值它長和寬庇勃,這樣我們就可以根據(jù)長和寬求出長方形的面積了檬嘀。
- 屬性讀寫?WTF责嚷?其實(shí)屬性讀寫不需要你去寫鸳兽,我們使用的VS可以自動幫我們生成,在我們定義了一個private成員變量之后罕拂,在vs中右鍵重構(gòu)方法vs即可以幫助我們完成屬性讀寫的get set方法
- 構(gòu)造方法
索引器
索引器的聲明類似于屬性的聲明揍异,是由get和set訪問器組成,索引器提供了對類中的數(shù)組元素的直接訪問功能爆班。即衷掷,如果一個類定義了索引器,這個類的實(shí)例就可以使用數(shù)據(jù)訪問運(yùn)算符“[]”對數(shù)組元素進(jìn)行訪問
其實(shí)索引器很簡單柿菩,如下索引器的定義
string[] arr = new string[5];
public string this[int index]
{
get
{
return arr[index];
}
set
{
arr[index] = value;
}
}
- 我們需要在類中先聲明一個數(shù)組棍鳖,這樣才能方便我們使用索引器來直接訪問我們類中數(shù)組中的數(shù)據(jù)
string[] arr = new string[5];
- 其次,我們定義一個索引器
public string this[int index]
public后string
屬性是和數(shù)組的數(shù)據(jù)類型相同碗旅,this
是必要的關(guān)鍵字渡处!int index
表示我們需要的角標(biāo)存儲值 - 索引器內(nèi)get和set方法和屬性賦值取值一樣,
get
返回arr[index]
數(shù)組上的第index個值祟辟,set
方法賦值為value
医瘫,這里注意了這個值務(wù)必寫成value
!
習(xí)題7 索引器的使用
**(1)編寫一個類IndexTest旧困,定義一個長度為5的字符串型數(shù)組arr醇份,定義一個形參為int類型的索引器實(shí)現(xiàn)對數(shù)組arr的讀寫操作稼锅。
(2)在Program類的Main方法中,實(shí)例化一個IndexTest對象僚纷,使用索引器實(shí)現(xiàn)對arr的讀寫操作矩距。
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
class IndexTest //自定義類
{
string[] arr = new string[5];//定義數(shù)組
public string this[int index]//定義索引器
{
get
{
return arr[index];
}
set
{
arr[index] = value;
}
}
}
class Program //主類
{
static void Main(string[] args) //主方法
{
IndexTest it = new IndexTest();
for (int i = 0; i < 5; i++)
{
Console.Write("數(shù)組元素{0}:",i+1);
it[i] = Console.ReadLine();
}
for (int i = 0; i < 5; i++)
{
Console.WriteLine(it[i]);
}
}
}
}
附加練習(xí)
類的索引器讀寫練習(xí)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/**
* 類的索引器
*/
namespace Demo5
{
class Book
{
string bid;
public string Bid //讀寫屬性
{
get { return bid; }
set { bid = value; }
}
string bname;
public string Bname
{
get { return bname; }
set { bname = value; }
}
}
class Library
{
Book[] book;
public Library(int len)
{
book = new Book[len];
}
public Book this[int index]//類數(shù)組索引器
{
get
{
return book[index];
}
set
{
book[index] = value;
}
}
}
class 類索引器
{
static void main(string[] args)
{
int length = int.Parse(Console.ReadLine());
Library lib = new Library(length);
for (int i = 0; i < length; i++)
{
Book b = new Book();
b.Bid = Console.ReadLine();
b.Bname = Console.ReadLine();
lib[i] = b;
}
for (int i=0; i<length; i++)
{
Console.WriteLine(lib[i].Bid + " " + lib[i].Bname);
}
}
}
}
繼承
- 繼承的內(nèi)容相對簡單,我們舉個例子怖竭,我們創(chuàng)建了一個形狀(shape)的類锥债,這個類中只定義了形狀的名字
class shape{
public string name;
}
- 繼承定義
子類 : 父類
class son : father
子類son繼承于father - 但是當(dāng)我們想要去使用這么一個形狀時候,我們想把他設(shè)置成矩形痊臭,因為我們矩形是有長和寬的哮肚,這時候我們應(yīng)該再加入兩個變量長和寬,但是我們還想讓矩形是繼承于形狀的广匙,我們該怎么做呢允趟?
class rect : shape { //設(shè)置類的繼承!Q恢隆潮剪!使用 :
int a,b; //定義長和寬
//同樣我們這里也一樣繼承父類中name屬性,以供使用
}
- 同樣繼承可以繼承父類中所有的內(nèi)容(包括成員方法分唾,成員變量)同樣可以重寫父類中的內(nèi)容(成員方法抗碰,成員變量)
我們通過一道例題來理解下繼承是怎么運(yùn)作的
習(xí)題8 繼承
**
(1)定義一個矩形類Rectangle,包含受保護(hù)的長和寬兩個成員字段鳍寂,計算面積的方法改含,構(gòu)造函數(shù)實(shí)現(xiàn)對長和寬的初始化。
(2)編寫一個長方體類Rectangular迄汛,繼承自矩形類捍壤,具有高度成員變量,計算體積的方法鞍爱,構(gòu)造函數(shù)實(shí)現(xiàn)對長鹃觉、寬和高度的初始化。
(3)在類Program的Main方法中睹逃,計算長度為10盗扇,寬度為20,高度為5的長方體的底面積和體積沉填。
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
class Rectangle
{
protected double length;
protected double width;
public Rectangle(double length, double width)
{
this.length = length;
this.width = width;
}
public double GetArea()
{
return length * width;
}
}
class Rectangular : Rectangle
{
public double height;
public Rectangular(double length, double width, double height):base(length, width)
//重點(diǎn)1 下面詳解
{
this.height = height;
}
new public double GetArea(){
//重點(diǎn)2 下面詳解
return 2*(length*width + width*height + length*height);
}
public double GetVolume()
{
return length * width * height;
}
}
class Program
{
static void Main(String[] args)
{
Rectangular cft = new Rectangular(10, 20, 5);
Console.WriteLine("長方體的底面積:" + cft.GetArea());
Console.WriteLine("長方體的體積:" + cft.GetVolume());
}
}
}
-
重點(diǎn)1 子類使用base關(guān)鍵字調(diào)用父類構(gòu)造函數(shù)
因為C#中子類不能繼承父類的構(gòu)造方法疗隶,所以我們在子類構(gòu)造方法中使用base關(guān)鍵字來實(shí)現(xiàn)父類中的構(gòu)造方法,完成成員變量的初始化翼闹。
這里我們長方體的構(gòu)造方法初始化賦值長方形的長和寬斑鼻,和長方體的高,我們通過使用父類長方形中的構(gòu)造方法猎荠,完成長和寬的初始化坚弱,然后再子類中完成長方體的高的初始化賦值蜀备。 -
重點(diǎn)2 使用new關(guān)鍵字隱藏父類成員
我們長方體子類繼承于長方形父類,因為我們長方形計算面積是長*寬荒叶,但是我們長方體的面積就是6個面的面積和碾阁,所以我們要重寫父類求面積方法并隱藏父類中求面積方法
這時我們使用new關(guān)鍵字來隱藏父類方法,并掩蓋父類方法些楣,成為子類獨(dú)立方法脂凶,類似于多態(tài)重寫(override)。
習(xí)題9 繼承練習(xí)
**
(1)定義一個汽車類Vehicle戈毒,包含的字段有車輪個數(shù)wheels和車重weight艰猬,構(gòu)造函數(shù)實(shí)現(xiàn)對wheels和weight的初始化横堡,打印汽車信息的ShowVehicle方法埋市。
(2)小車類Car是Vehicle的子類,包含的字段有載客人數(shù)loader命贴,構(gòu)造函數(shù)實(shí)現(xiàn)對wheels道宅、weight和loader的初始化,打印小車信息的ShowCar方法胸蛛。
(3)卡車類Truck是Car類的子類污茵,包含的字段有載重量payload,構(gòu)造函數(shù)實(shí)現(xiàn)對wheels葬项、weight泞当、loader和payload的初始化,打印卡車信息的ShowTruck方法民珍。
(4)在類Program的Main方法中襟士,分別實(shí)例化Vehicle(4個車輪,1000kg車重)嚷量、Car(4個車輪陋桂,1500kg車重,載客4人)和Truck(6個車輪蝶溶,2000kg車重嗜历,載客2人,載重量4000kg)對象抖所,打印相應(yīng)的信息梨州。
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
class Vehicle
{
public int wheels;
public double weight;
public Vehicle(int w1, double w2)
{
wheels = w1;
weight = w2;
}
public void ShowVehicle()
{
Console.WriteLine("Vehicle 車輪:" + wheels +"; 車重:" + weight);
}
}
class Car : Vehicle
{
public int loader;
public Car(int l, int w1, double w2) : base(w1, w2)
{
loader = l;
}
public void ShowCar()
{
Console.WriteLine("Car 車輪:" + wheels +"; 車重:" + weight + "; 人數(shù):" + loader);
}
}
class Truck : Car
{
public double payload;
public Truck(double p, int l, int w1, double w2) : base(l, w1, w2)
{
payload = p;
loader = l;
}
public void ShowTruck()
{
Console.WriteLine("Truck 車輪:" + wheels + "; 車重:" +weight + "; 人數(shù):" + loader + "; 載重量:" + payload);
}
}
class Program
{
static void Main(String[] args)
{
Vehicle v = new Vehicle(4, 1000);
v.ShowVehicle();
Car c = new Car(4, 4 , 1500);
c.ShowCar();
Truck t = new Truck(4000, 2, 6, 2000);
t.ShowTruck();
}
}
}
代碼內(nèi)容均差不多,如果有不懂得內(nèi)容田轧,可以留言評論或者添加我的個人微信暴匠,歡迎大家向我提問。
多態(tài)
- 我們按照學(xué)校內(nèi)容來說說多態(tài)的內(nèi)容涯鲁,按照我的理解巷查,抽象類接口不應(yīng)該算作多態(tài)里有序,抽象類接口能做得事情比僅僅多態(tài)的能力大很多,哈哈岛请,我們這里還是按照學(xué)校內(nèi)容說旭寿,所以這里我們同樣把多態(tài)的內(nèi)容分成3個章節(jié)來說,虛方法崇败,抽象類盅称,接口
-
虛方法
由于我們在父類中實(shí)現(xiàn)的方法要在子類中重寫,所以我們要在父類中需要重寫的方法前面加上virtual關(guān)鍵字后室,這樣可以讓子類中了解到父類中的這個方法是可以重寫的ww缩膝,我們在子類中使用override關(guān)鍵字來重寫父類中的虛方法
虛方法定義
//父類中虛方法的聲明
public virtual 方法名(參數(shù));
//子類中虛方法的重寫
public override 方法名(參數(shù));
我們來通過一個例題來了解下虛方法的定義實(shí)現(xiàn)和運(yùn)用,仔細(xì)看看代碼和注釋岸霹!
習(xí)題10 虛方法的定義實(shí)現(xiàn)和運(yùn)用
**
1.創(chuàng)建
People類疾层,該類中包含:成員變量:姓名(name);虛方法:問好(SpeakHello)贡避,輸出“Hello”痛黎。
2.創(chuàng)建ChinesePeople類,是People的子類刮吧,按中國方式重寫父類方法SpeakHello 輸出“某某說:你好湖饱,吃了嗎”,構(gòu)造方法ChinesePeople(string name)實(shí)現(xiàn)父類中name的初始化杀捻,方法ChineseGongfu輸出“中國功夫”井厌。
3.創(chuàng)建AmericanPeople類,是People的子類致讥,按美國方式重寫父類方法SpeakHello 輸出“某某say:How are you?”仅仆,構(gòu)造方法AmericanPeople(string name)實(shí)現(xiàn)父類中name的初始化,方法AmericanBoxing輸出“美國拳擊”拄踪。
4.在Program類的Main方法中蝇恶,分別使用“Liming”和“Tom”創(chuàng)ChinesePeople和AmericanPeople對象,測試程序惶桐。
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
public class People //定義父類
{
protected string name;
public virtual void SpeakHello() //定義父類中的虛方法
{
Console.WriteLine("Hello");
}
}
class ChinesePeople : People //定義子類 繼承于父類People
{
public ChinesePeople(string name)//構(gòu)造方法
{
this.name = name;
}
public override void SpeakHello() //重寫父類中的虛方法
{
Console.WriteLine(name + "說:你好撮弧,吃了么?");
}
public void ChineseGongfu() //定義子類中私有public方法
{
Console.WriteLine("中國功夫");
}
}
class AmericanPeople : People //定義子類 繼承于主類People
{
public AmericanPeople(String name) //定義構(gòu)造方法
{
this.name = name;
}
public override void SpeakHello() //重寫父類虛方法
{
Console.WriteLine(name + " says:How are you?");
}
public void AmericanBoxing() //定義子類私有Public方法
{
Console.WriteLine("美國拳擊");
}
}
class Program
{
static void Main(string[] args) //住方法
{
ChinesePeople chinese = new ChinesePeople("Liming"); //實(shí)例化
chinese.SpeakHello(); //調(diào)用子類重寫方法
chinese.ChineseGongfu();
AmericanPeople american = new AmericanPeople("Tom"); //實(shí)例化
american.SpeakHello();//調(diào)用子類重寫方法
american.AmericanBoxing();
}
}
}
多態(tài):參數(shù)不同姚糊,相同的類執(zhí)行的功能不同贿衍。多態(tài)是一項讓程序員將改變的事物與未改變的事物分離分開來的重要特征。只有普通的方法調(diào)用可以是多態(tài)的救恨,構(gòu)造器并不具備多態(tài)性(構(gòu)造器實(shí)際是static方法贸辈,只不過該static聲明是隱性的)
抽象類 接口OOP
我們面向?qū)ο缶幊汤锩鎯煞N實(shí)現(xiàn)OOP(Object Oriented Programming)編程的方法:抽象,接口肠槽。
final(不能被繼承)與abstract(只能被繼承)永遠(yuǎn)不能同時修飾類擎淤。抽象類
1.抽象方法:只有聲明奢啥,沒有實(shí)現(xiàn)。
2.抽象表示:abstract void fun();
3.抽象方法必須用abstract修飾嘴拢。如果一個類含有抽象方法桩盲,由此類為抽象 類,抽象類必須用abstract修改席吴。
4.包含抽象方法的類赌结。但是一個類若不包含抽象方法,用abstract修飾也是抽象類孝冒。但是如果一個抽象類中沒有抽象方法柬姚,抽象類的設(shè)計即沒有意義。
5.因為抽象類中無具體方法庄涡,所以不能進(jìn)行實(shí)例化量承。
6.所以抽象類是為繼承而生的,如果定義了抽象類而不去繼承它啼染,則創(chuàng)建抽象類的則沒有意義宴合。
7.定義一個父類焕梅,若父類中一個方法在父類中沒有實(shí)現(xiàn)的意義迹鹅,必須通過子類完成各種實(shí)現(xiàn),則可將此方法定義成抽象方法贞言,則這個父類為抽象類斜棚。抽象類的目的
- 抽象類就是為了繼承而存在的,為子類提供一個公共的類型该窗;
- 封裝子類中的重復(fù)內(nèi)容(成員變量和方法)弟蚀;
- 定義抽象方法,子類雖然有不同的實(shí)現(xiàn)酗失,但該方法的定義是一致的义钉。
- 抽象類中包含抽象方法,抽象方法的聲明格式為:
public abstract void cry();
抽象方法是一種特殊的方法:它只有聲明规肴,而沒有具體的實(shí)現(xiàn)
抽象類例子:
abstract class Animal {
public abstract void cry();
}
-
接口
接口類說白了捶闸,就是一個類的模板,一個類的規(guī)定拖刃,如果你屬于這類删壮,你就必須遵循我的規(guī)定,少一個都不行兑牡,但是具體你怎么去做央碟,我不管,那是你的事均函,哈哈亿虽。
接口是抽象方法的集合菱涤,是一種形式,一種標(biāo)準(zhǔn)洛勉,就像契約模式狸窘,如果實(shí)現(xiàn)了這個接口,那么就必須確保使用這些方法坯认。接口中的方法必須都是抽象方法翻擒,并且接口中所有的方法不能有具體的實(shí)現(xiàn),接口中成員變量只能是public static final這種形式牛哺,相當(dāng)于常量陋气,不可以修改的(一般不在接口中定義成員變量)
接口類 說的太不嚴(yán)謹(jǐn)了,應(yīng)該添加引號引润,需要知道接口并不是類巩趁。不過說接口是模板比較正確。
- 但我認(rèn)為 接口是對行為的抽象淳附。什么叫行為的抽象议慰?那先要說說行為。類是對現(xiàn)實(shí)的抽象嘛奴曙,所以用現(xiàn)實(shí)來舉個例子别凹。
人的說話是不是天生的?自然不是洽糟,如果天生會說話炉菲,那一般出現(xiàn)在重生小說里面。說話需要通過后天學(xué)習(xí)坤溃,如果不學(xué)習(xí)(例如新聞中被狼收養(yǎng)的孩子)就不會說話(狼孩只會狼嚎)拍霜。在這里,說話就是一種行為薪介,是通過學(xué)習(xí)祠饺,通過思想支配表現(xiàn)出來的≈可以說道偷,說(人)話就是一個接口,正常人實(shí)現(xiàn)了該接口烂完,所以能夠說話试疙,而狼孩實(shí)現(xiàn)的是狼嚎接口,所以他會狼嚎抠蚣,而不會說話祝旷。
這個例子的結(jié)論是,行為是人非天生的(不能直接繼承的),需要通過后天學(xué)習(xí)(繼承接口)的外在活動怀跛。
通過對行為的抽象距贷,體現(xiàn)在面向?qū)ο笳Z言中,那就是接口吻谋,它是不適合在類中直接體現(xiàn)(或用來描述類)(類又可能需要)的方法的集合忠蝗。
接口中可包含變量和方法。變量只能用(默認(rèn)也是漓拾,其他修飾編譯報錯)public static final修飾阁最。方法只能是(默認(rèn)也是,其他修飾編譯報錯)public abstract修飾骇两。一般不在接口中定義變量速种。
接口的注意事項
(1) 類中實(shí)現(xiàn)的方法必須與接口中聲明的方法保持一致,如返回類型低千,參數(shù)列表
(2)繼承接口的類必須實(shí)現(xiàn)接口中聲明的所有方法
(3)接口是不能被實(shí)例化的配阵,接口中聲明的所有抽象方法都必須由子類實(shí)現(xiàn)
哈哈哈,解釋的也比較抽象示血,不明白想要學(xué)習(xí)的棋傍,歡迎來和我私聊,嘿嘿
- 我們來通過兩道例題來看看抽象類难审、接口是怎么定義和實(shí)現(xiàn)
習(xí)題11 抽象類習(xí)題練習(xí)
**
(1)編寫一個抽象類Shape瘫拣,該類具有兩個double類型字段:周長length和面積area,具有兩個抽象的方法:計算周長GetLength()和計算面積GetArea()剔宪。
(2)圓形類Circle繼承類Shape拂铡,成員變量radius表示半徑,構(gòu)造函數(shù)實(shí)現(xiàn)radius的初始化葱绒,實(shí)現(xiàn)抽象類Shape中的兩個抽象方法。
(3)編寫一個錐體類Cone斗锭,里面包含兩個成員變量:Shape類型的底面bottom和double類型的高h(yuǎn)eight地淀,方法GetVolume計算體積(體積=底面積*高/3)構(gòu)造函數(shù)實(shí)現(xiàn)成員變量的初始化。
(4)在Program類中岖是,包含一個靜態(tài)的方法void Compute(Shape s)帮毁,通過該方法能夠計算并輸出一切圖形的周長和面積;在Main函數(shù)中調(diào)用Compute法豺撑,計算并輸出半徑為5的圓形的周長和面積烈疚,并算出以該圓形為底,高度為10的錐體的體積聪轿。
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
public abstract class Shape //定義一個抽象類
{
public double length, area;
public abstract double GetLength(); //定義抽象方法
public abstract double GetArea();//定義抽象方法
}
class Circle : Shape//定義子類繼承于抽象類shape
{
double radius;
public Circle(double radius) //定義構(gòu)造方法
{
this.radius = radius;
}
public override double GetLength() //重寫父類抽象方法
{
length = 2 * 3.14 * radius;
return length;
}
public override double GetArea() //重寫父類抽象方法
{
area = 3.14 * radius * radius;
return area;
}
}
class Cone //定義自定義類
{
Shape bottom;
double height;
public Cone(Shape bottom, double height)
{
this.bottom = bottom;
this.height = height;
}
public double GetVolume()
{
return bottom.GetArea() * height / 3;
}
}
class Program //主類
{
public static void Compute(Shape s) //主類私有方法 傳入?yún)?shù)為抽象類
{
Console.WriteLine("周長為:" + s.GetLength());
Console.WriteLine("面積為:" + s.GetArea());
}
static void Main(string[] args) //主方法
{
Circle c = new Circle(5); //實(shí)例化
Console.WriteLine("創(chuàng)建一個底面為圓形的錐體");
Cone cone = new Cone(c, 10);
Compute(c);
Console.WriteLine("體積為:" + cone.GetVolume());
}
}
}
重點(diǎn)
- 在子類繼承抽象父類時爷肝,使用override重寫父類的抽象方法
習(xí)題12 接口 使用接口寫個計算器,完成加減乘除運(yùn)算。
**
(1)定義接口ICompute含有一個方法int Compute(int m,int n)灯抛。
(2)設(shè)計Add金赦、Subtract、Multiply和Divide四個類分別實(shí)現(xiàn)此接口对嚼,完加減乘除運(yùn)算夹抗。
(3)設(shè)計一個類UseCompute,含有方法:
public void UseCom(ICompute com, int one, int two)
要求:
1.用傳遞過來的對象調(diào)用接口的Compute方法完成運(yùn)算纵竖;
2.輸出運(yùn)算的結(jié)果漠烧。
(4)在Program類的Main方法中,調(diào)用UseCompute中的方法UseCom來完成25和5的加減乘除運(yùn)算靡砌。
**
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication
{
interface ICompute //定義接口
{
int Compute(int m, int n); //定義接口內(nèi)的方法
}
class Add : ICompute //定義自定義類實(shí)現(xiàn)接口
{
public int Compute(int m, int n) //實(shí)現(xiàn)接口內(nèi)的方法
{
return n + m;
}
}
class Subtract : ICompute//定義自定義類實(shí)現(xiàn)接口
{
public int Compute(int m, int n)//實(shí)現(xiàn)接口內(nèi)的方法
{
return m - n;
}
}
class Multiply : ICompute//定義自定義類實(shí)現(xiàn)接口
{
public int Compute(int m, int n)//實(shí)現(xiàn)接口內(nèi)的方法
{
return n * m;
}
}
class Divide : ICompute//定義自定義類實(shí)現(xiàn)接口
{
public int Compute(int m, int n)//實(shí)現(xiàn)接口內(nèi)的方法
{
return m / n;
}
}
class UseCompute //自定義了UseCompute
{
public void UseCom(ICompute com, int one, int two)
{
int result = com.Compute(one, two);
Console.WriteLine("結(jié)果是" + result);
}
}
class Program//主類
{
static void Main(string[] args)//住方法
{
Add add = new Add();
Subtract sub = new Subtract();
Multiply mul = new Multiply();
Divide div = new Divide();
UseCompute c = new UseCompute();
//實(shí)例化對象
c.UseCom(add, 25, 5);
c.UseCom(sub, 25, 5);
c.UseCom(mul, 25, 5);
c.UseCom(div, 25, 5);
}
}
}