2.1 C#語法的學習(一) && 循環


准備工作

下面讓我們以管理員身份運行Visual Studio,新建一個控制台項目,開始C#語法的學習。
以管理員身份運行Visual Studio的問題,請直接搜索關鍵詞:以管理員身份運行 Visual Studio。

可以看到,連官方都有正解的,你沒有理由不會!剩下的內容請自行摸索,很簡單。
打開Visual Studio后,完成初始化設置,新建一個.net core的控制台,命名為CSharpGrammarLearnConsole。


Visual Studio的使用

在開始學習C#前,最好先對Visual Studio有個初步的了解

在菜單欄的View(視圖)中,可以對工具欄、各種窗口的顯示、隱藏進行修改,也可以通過拖拽,更改各個窗體的位置。這個根據個人的習慣和使用進行調整即可。

在調試過程中,Visual Studio會發生變化,對於調試來說,比較重要的窗口有LocalsImmediate WindowWatch
如圖所示,在代碼上打上斷點(紅點),程序會停在這里,然后可以在Locals窗口查看並修改當前的變量,Immediate Window則可以進行一些即時的運算,Watch則是自定義Locals,可以輸入一些自己的關注點,以便多次調試的時候查看變化。
更多詳細的教程可以看歡迎使用 Visual Studio IDE
Visual Studio比較重要的技能包括項目管理、調試和遠程調試、git版本控制、生成與發布、擴展與更新Visual Studio。其他內容比如代碼分析、性能測試等等,個人認為可以按需學習,用到的時候再看都可以。

控制台程序

控制台程序有一個入口,是Program的Main()方法,運行程序后,程序會從Main()方法開始執行。

學習資料 && 學習方式

C#的教學文章、視頻,中文的、英文的、官方的、非官方的,很多很多,我在此不贅述,就推薦兩個個官方的和一個非官方的吧。
C# 官方文檔
.NET 官方文檔
菜鳥教程-C# 教程
看了之后是不是覺得有點無從下手,或者不知道可以用它來干什么?很正常,正經的、歸納性的教程就是這樣,因為它們更專注於知識點本身,其存在的意義是使大家學會使用XXX,比如學會理解並使用數組、屬性、委托和事件。
但它們並不會告訴你數組可以用來完成什么工作,在哪些場景推薦使用它,哪些場景不推薦,它們更多的時候是用來查閱的。比如我很久沒有使用委托和事件了,不記得該怎么寫了,我也會查一下關鍵詞,隨便找一篇文章掃一眼恢復一下記憶—————不必為這種行為感到羞恥,人的大腦不會記住所有事,而語法、語言對於開發者來說也不是非常重要的東西(初學者除外)。計算機思維、設計模式、解決一個問題的思路,這些才是重要的、需要深入理解的東西。
講C#語法這部分,我想更多的以解決某個問題,促成計算機思維的方式來完成。然后重點講幾個重要的思想:排序窮舉遞歸循環
在具體的語法上面不會做過多贅述,具體的、不明白的地方,看看上面提到的百科全書式的文檔,都可以解決,我在用到的時候也會把具體的鏈接貼出來,請大家放心。希望大家可以和我一起來學習。

第一個問題

求1+2+3+„„+10的和。

數學解法

我們都知道,運算

1+2+3+4+5+6+7+8+9+10=55

但C#是不能寫1+2+3+4+5+6+7+8+9+10=?這種等式的,等號左邊不能寫表達式,右邊也不能寫?。
所以我們細想一下,實際上我們計算的方式是(不考慮1+9=10,2+8=10這種計算,按順序執行求和)

1+2=3
3+3=6
6+4=10
......
45+10=55

看明白了么?第一個數字和第二個數字求和,然后求和結果去同第三個數字求和,一直求和到最后一個數字。
理解了如何計算出55這個結果,我們就可以開始寫代碼了。

C#寫法

首先定義一個記錄結果的變量

var result=0;

(強烈不建議命名x,y,z blabla,命名一定要有意義!有意義!有意義!重要的事情說三遍——————當然有時候命名會又臭又長,但是還是要好好命名~)
然后我們開始計算

result = result + 1;

這里和數學公式的概念完全不同。
在數學里,這是等式,表示result 等於 result + 1,這個等式並不成立。
而在計算機語言里,這里是賦值,是告訴計算機,計算result + 1的值,並且把值賦給result。所以這個語句執行完畢后,result將等於1。
C#語言中的等式,是雙等號==,意義也與數學的等式有所差別,在此不擴展來說。
然后我們繼續計算

result = result + 1;
result = result + 2;
result = result + 3;
result = result + 4;
result = result + 5;
result = result + 6;
result = result + 7;
result = result + 8;
result = result + 9;
result = result + 10;

然后輸出結果

Console.WriteLine(result);

點擊菜單欄下方工具欄中的綠色啟動按鈕,即可運行程序。

得到結果:

至此,我們完成了把一個問題通過代碼來解決的過程。我們做了什么?分析問題-描述算法-把算法寫成代碼。
不論是什么開發語言,什么問題,都是這樣的過程。如果邏輯、算法是不清晰的,代碼也是沒有辦法寫的。

或許有人會問,1-10求和,我自己也能算,我為什么還需要學習計算機如何計算?因為計算機不僅可以計算1-10,還可以快速的計算1-100、1-10000、1-99987的求和啊,計算機可以幫助人們快速進行大量的計算,這也是我們學習計算機的目的之一。
下面我們繼續分析我們的代碼,上述的寫法固然可以得到正確的答案,但寫的太過冗余,比如如果求和1-100,不是要寫100行代碼么?這肯定不科學。
累加求和工作內容是固定且重復的,我們可不可以換種輕松的方式來寫呢?這時候我們需要一個新的概念,循環

循環

循環的詳細描述和用法可以看C# 循環,我們直接開始使用吧~
我們現在轉變一下思路:
我們有一個記錄循環次數的變量i,
我們需要10次循環,讓i從1遞增到10(包括10),
則每次計算result = result + i,
最后得到的result就是最終結果。
所以代碼是

var result = 0;
for (int i = 1; i <= 10; i++)
{
	result = result + i;
}
Console.WriteLine(result);

是不是簡潔很多?而且發現沒有,只需要修改10這個數字,我就可以求和1-任意數字的累加和!
那么問題又來了,我想計算1-999、1-8976,應該怎么辦呢?我們或許需要交互來幫助我們完成工作。

交互

我們日常的鼠標點擊、鍵盤輸入,其實都是交互。比如,鼠標點擊了文本框的某一行,光標到達了這一行的某個位置,其實是我們輸入了點擊這個位置的操作,計算機輸出“光標達到這一行”的結果。比如,鍵盤按下A,文本框輸出a,鍵盤按下Shift+A,文本框輸出A,都是計算機根據我們的指令完成工作。
所以同樣的,現在我們的工作是,詢問程序使用者,求和1-多少,並且輸出結果。
在控制台程序中,我們需要用到Console類來幫助我們完成工作。

//詢問
Console.WriteLine($"求和1+2+3,,,+n,請輸入n的具體數字。");
//得到輸入
var n= Console.ReadLine();
//C#是強類型,轉換類型
var endNumber = int.Parse(n);
var result = 0;
for (int i = 1; i <= endNumber; i++)
{
	result = result + i;
}
Console.WriteLine(result);

這是一個正確的程序,但並不是一個健壯的程序,比如輸入的不是數字,而是其他字符串,就會報錯:

對於一個開發者來說,我們不能信任用戶的任何輸入,我們需要用我們的代碼作為武器,去規避、預防、解決這些錯誤的輸入。

判斷

在這里,我們可以使用TryParse方法來替換Parse方法。
同時,我們使用了一個if-else的判斷條件(C# 判斷)。
關於判斷更多的內容可以看“2.5 C#語法的學習(五) && 判斷”。

var endNumber = 0;
bool isSuccess=int.TryParse(n,out endNumber);
if (isSuccess)
{
	var result = 0;
	for (int i = 1; i <= endNumber; i++)
	{
		result = result + i;
	}
	Console.WriteLine(result);
}
else
{
	Console.WriteLine($"錯誤的輸入{n}");
}

TryParse方法嘗試將n轉換為int類型,並且賦值給endNumber。isSuccess的結果則是TryParse是否執行成功。
所以,我們使用isSuccess+if-else語句進行判斷:如果isSuccess==true,則進行累加求和計算,如果isSuccess!=true,則輸出錯誤提示。
至此,我們學會了處理異常的輸入。
但這里似乎還是有一些不方便的地方,比如我如果想多次求和,1-100、1-999,我只能選擇:打開一次程序-輸入數字-得到結果-關閉程序,然后再次打開程序,重復操作。而且當我錄入錯誤的時候,我還是只能關閉程序,再次打開重新輸入。這並不合理。我們期望的效果是,這個程序可以多次計算求和,並且在我們不需要的時候,被我們手動關閉。
我們在求和的時候,用到了循環,來重復的完成一些工作,那么現在我們是不是可以繼續使用循環,來解決現在的問題呢?循環整個輸入-計算-輸出的過程,就可以了~(看到了么,重復性的工作,用循環來解決)

//這里是一個無限循環,一般在開發中不常見,容易出現問題
while (true)
{
	//我們需要循環的方法
}

實現效果:

小結

1.Visual Studio的基本使用
2.等號與雙等號在C#中的不同含義
3.循環
4.交互
5.判斷
6.程序的正確性與健壯性

延展

1.不能信任用戶的輸入,在早期有非常嚴重的體現,就是sql注入。黑客通過系統的漏洞,通過輸入不正常的、帶有惡意的文本,非法獲得系統數據,並對系統進行攻擊,讓開發者苦不堪言。所以對用戶輸入的審查,是至關重要的。現在大部分用戶輸入的校驗都在前端、客戶端完成,即在沒有調用服務的時候,就對輸入進行排查,不合法直接不提交數據。
2.while(判斷條件)/do-while(判斷條件)使用時一定要注意,有時候可能會造成無限循環。
比如,下面這種忘記給number計數。

var number = 0;
while (number < 100)
{
	//完成某件事情

	//忘記寫這句話
	//number++;
}

或者更復雜一點,認為判斷條件會在某個時間點為false以跳出循環,但某些情況下並不會實現。這種在開發過程中也並不一定會調試出來,可能開發過程中遇不到這種情況。比如嘗試下載圖片,下載圖片完成才能進行下一步操作(顯示圖片)。正常情況下,下載完成-展示圖片,沒有問題,但如果遇到網絡原因,造成下載圖片失敗,這種代碼就會一直卡在這一步,造成無限循環。
那正常情況下應該怎么處理呢?不知道?我們可以馬上知道。
把你的手機wifi、流量都關掉,然后打開淘寶,隨便點一件商品,或者打開微信,隨便看一篇文章——————這也是一種借鑒的思維,不知道,就去找類似的、你覺得它可能會出現的地方。
然后我們就知道了,它會告訴我們,你的網絡崩潰了。那我們的程序是不是應該這樣做:
(1)嘗試下載圖片,並計數嘗試下載次數
(2)如果下載成功,展示圖片,完成工作
(3)如果下載失敗,判斷嘗試下載次數,
次數沒有達到上限100次,則回到(1)重復下載工作
次數達到上限,告知用戶下載失敗了並指引他后續操作,完成工作
這樣的邏輯讓這項工作成功、失敗的時候,都有了一個“結束”的地方,保證了程序的健壯性。
轉換成C#代碼如下:
當且僅當嘗試下載次數小於100,且下載沒有成功時,執行下載操作。

bool isDownloadSuccess = false;
var number = 0;
while (number < 100 && isDownloadSuccess==false)
{
	//下載圖片
	//如果下載圖片成功,則設置:
	//isDownloadSuccess = true;

	//計數下載次數
	number++;
}

這里還有一個小小的點,下載圖片(特別是下載別人家的內容)過於頻繁可能會被封掉,被判定是爬蟲,所以可以在每次循環的末尾加上一個短時間的、手動的休眠Thread.Sleep(500);

示例代碼

上述的大部分代碼被上傳到CumulativeSum
在Program的Main()方法中取消注釋,就可以運行。

題外話

這篇真的是寫的,越寫越多越寫越多,感覺要說的太多了,跟寫小論文似的。
因為定位是零基礎,所以寫的很細,很口水,很簡單。后面我也會寫得很細,但是相同的問題就會一筆帶過,不再重復,所以一定要仔細看哦~


免責聲明!

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



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