學弟學妹們就要到了,被老師安排讓準備一些內容適合給新生小白講課的,這裡內容我給精簡了一部分,希望對大家有所幫助,錯誤之處多大指正。
C 語言是一種通用的、面向過程式的電腦程式設計語言。1972 年,為了移植與開發 UNIX 作業系統,丹尼斯·裡奇在貝爾電話實驗室設計開發了 C 語言。
C 語言是一種廣泛使用的計算機語言,它與 Java 程式語言一樣普及,二者在現代軟體程式設計師之間都得到廣泛使用。
當前最新的 C 語言標準為 C18 ,在它之前的 C 語言標準有 C17、C11...C99 等。
這個肯定是沒有的,學習編程是很枯燥的的以惡搞過程,自己一個人對著電腦屏幕敲代碼。身邊如果只有一個人那實在是太孤獨了,在學習編程的過程當中,大環境是直觀重要的,你需要不斷和他人交流編程當中的問題,解答他人的問題。學而不思則罔,思而不學則殆。
我的大學期間,宿舍室友都是熱愛學習的那種,幾個人學習代碼,敲代碼,偶爾出去喝個酒啥的,小日子還算是比較愜意的。
在學習編程的時候,我們經常也會因為一些問題產生爭吵,但是整體的情況下,還是在學習。學習的氛圍很重要,如果你的室友是天天大聲音打遊戲到凌晨的那種,我覺得你需要加入一些技術交流社區或者技術群來就行交流,哪怕作為小白的你在裡面水群都是可以的,水著水著就成大牛的存在。
同時也有幾個不同專業的同學,相互在一起學習編程,主要還是交流,遇到問題不要閉門造車。
這個是有的,首先是你需要知道編程是什麼,他們作什麼,你為什麼要學編程。在編程的學習當中,數學和英語是必須的,數學是重中之重,沒有一個好的數學邏輯,學代碼會很吃力,但是英語差的情況下,看代碼、看bug是比較吃力的。當然也有一種特殊的存在,數學很好,英語很差,但是能寫代碼。在看代碼和排bug的時候,只認識這些的編程的關鍵詞,英文類的報告書和任務書都可以看懂,英語口語也可以(關於代碼的),但是只要碰到英語考試,成績鐵定涼涼那種。
在學習編程的時候,你一定要有自身的見解和思想。很多同學學習編程的時候喜歡直接看教程,看了一遍下來知道什麼是什麼,但是寫代碼就是寫不出來,這是無效的。學習編程的英文不可怕,在我看來,歇息編程你需要先聊城程序的執行是什麼的,程序的三大結構,程序的邏輯該怎麼去設計,然後是了解函數、數組、指針等相關概念,然後是結構體、數據結構。如果這時候你學習到了面向對象的編程,那你一定要對照結構體類,在它們兩個之間尋找異同之處。
這樣差不多你已經有自己的編程思想了。遇到編程,首先想的不是代碼怎麼寫,而是這個邏輯是什麼樣的,我該怎麼去通過代碼來設計這個邏輯。
編程時將數學問題轉成代碼來處理的,如何讓將數學公式轉成代碼,通過編程來求解這個問題,那麼你已經算是編程的小牛。
知道什麼是編程——程序執行的流程——三大結構——編程的邏輯——數組函數指針——結構體——數據結構
這一條在融會貫通的情況下,你已經是大牛。你所缺少的就是實戰,用實際的項目來驗證自己的所學所想,學以致用。以戰養戰,百戰不殆。
最後祝願大家在程序猿的道路上持之以恆,越奮越勇。
工欲善其事,必先利其器。我們在學習程式語言之前,必須得先學會使用編程軟體。C語言的編程軟體有很多,以下我為大家介紹幾款
【啊哈C】
我在出學C語言的時候使用的就是啊哈C的編譯器,同時我的C語言入門書籍也是《啊哈C語言》。這是一本少兒編程讀物,儘管我當時已經20歲,但是絲毫不影響我學習的積極性。
可以看到這個界面相對很簡單很簡潔的,它不需要新建項目的,敲代碼直接擼就完事。在這裡也推薦初學者去購買一本《啊哈C語言》來進行真正「零基礎」的入門。
啊哈C編譯適用的那些對電腦沒有接觸的萌新們,萌新的起步從這了開始。安裝過程實在是臺過於小白,所以筆者在此不介紹了,大家下載後一路雙擊就完事了。
【VC++6.0】
這個也曾經是一代神器的存在,我剛上大學的編程課用的還是這款編譯器,很實用,但是隨著C語言的升級,這塊你編譯器也逐漸有些跟不上腳步。使用相比啊哈C較為複雜一些,但是比較貼近於項目,每次寫代碼需要新建項目、新建源文.烏七八糟的一大堆。
由於VC++6.0過於老,大家有興趣的可以參考如下的教程進行下載。哆啦A夢的傳送門:
*http://xinzhi.wenda.so.com/a/1541512838207957
整體界面是這樣的。
(PS:不考慮功能的前提下,這個顏色+英文讓初學程序的我很不爽QAQ~)
【DEV C++】
這個和VC++也是處於同一級別的存在,使用難度中等,功能方面比VC++6.0要強,就目前C語言的版本來說,還是比較適合的。安裝教程:哆啦A夢的傳送門:
*https://blog.csdn.net/weixin_38451800/article/details/86367291
界面如下所示。
【VC++2010】
我大一下學期參加了計算機等級考試,當時報名考的是二級C語言。當時學校教的是VC++6.0,然後考試前信心百倍,考試時候突然發現最後的編程答題用的VC++2010,瞬間內心慌得一批。幸好之前玩過Visual Stdio,勉勉強強通關,學編程一定要戒驕戒躁,這是我最深刻的體會。
VC++2010的安裝:哆啦A夢的傳送門:
*https://www.cnblogs.com/Mrt-02/archive/2011/07/24/2115617.html
同時配圖一張。
【Visual Stdio】
Visual Stdio簡稱VS,根據不同的年限版本有著不同的名稱。我目前所使用的是Visual Stdio 2019版本,簡稱VS2019。這是一代神奇,大多數程序猿對在使用它進行編程。VS不僅僅可以寫C語言,只要你環境配置的好,C++、Java、Python、C#等,都可以運行。當然這個你要是全裝的話,很龐大。我第一此在安裝VS的時候,全裝,結果給C盤裝了小60GB的文件,當時真是說不出的酸爽。VS安裝之後想徹底卸載乾淨比較麻煩,所以大家一定要仔細斟酌。
Visual Stdio的安裝大家可以去官網下載。
【最最最後】
關於這裡提到的編程軟體,大家可以根據自身的情況來選擇。其中涉及的安裝包大家可以自行下載,也可以從我們的官網的資源部位進行下載,同時配套的安裝視頻我們也會在隨後同步上線。我們的C語言課程涉及使用啊哈C編譯器進行講解,用什麼編譯器一樣的,學編程你需要掌握的是這個邏輯,這個思維。
大道三千,殊歸同途。編程思想是互通的,不同的是你敲出來的代碼和你使用的軟體。諸君共勉。
我們將代碼輸入,點擊運行按鍵,它會讓你先保存一下代碼,然後出現提示你編譯成功(前提是你的代碼沒錯誤的情況下),我們再點擊彈出來的「確定」按鍵就可以看到執行效果的。
下面的黑黑的顯示的就是程序的執行效果,在屏幕顯示了Hello World!,然後換行輸出了請按任意鍵繼續,然後按下任意鍵關閉程序。
【程序的構成】
程序的第一行 #include 是預處理器指令,告訴 C 編譯器在實際編譯之前要包含 stdio.h 文件。
下一行 #include 是預處理器指令,告訴 C 編譯器在實際編譯之前要包含 stdlib.h 文件。
下一行 int main() 是主函數,程序從這裡開始執行。
下一行 printf(...) 是 C 中另一個可用的函數,會在屏幕上顯示消息 "Hello, World!"。
下一行 system(「pause」) 是 Windows系統的指令,等待操作的方式,按下任意鍵擦灰繼續操作。
下一行 return 0; 終止 main() 函數,並返回值 0。
任何程序的執行從main開始,由上向下,依次執行逐條語句(順序結構)。
【框架】
這裡給寫到的是C語言的一個框架格式,所以的C語言代碼的格式都是這樣的。面對一個現實生活中的問題,我們通過寫代碼的方式讓計算機幫我們解決掉,這就是編程!
我們在小學階段就已經開始通過方程的概念來接觸變量和常量的問題,我們在方程式Y=kX+b的方程式當中,Y是隨著X的變化二變化,所以我們稱X為自變量,Y為因變量。
在面對現實當中的問題,我們通過編程的方式來解決這個問題,這就是編程。那什麼叫做編程的方式呢?
對於一個問題,必定存在輸入和輸出。輸入的是解決這個問題需要的參數,輸出的是這個問題處理的結果。舉個例子,我們現在想要做大量的加減乘除計算,但是人為手動的來計算實在是關於麻煩,十幾條還好,一旦超出了幾千條幾萬條,我們就需要來藉助計算器來解決這個問題。
我們可以購買以購買計算器來進行計算,我們也可以通過編程來解決這個計算。在這裡,我們需要解決的問題是大量的計算,輸入的是需要計算的數據,輸出的是這些數據計算的結果。
對於現在我來說,我可能會在建立Excel表格,然後編程讀取文件,計算後保存數據到這個表格等等(雖然Excel自身就有加減乘除計算的能力)。
我們在編程當中,對於這些需要輸入輸出的內容,我們稱為變量常量。
我們先來聊一聊變量常量的數據類型。
【數據類型】
C語言的數據類型遠遠不止這幾種,在此次教程裡面,我們做到循序漸進,一點點的進階。上程序,
這個程序給大家計算了1+1等於2,我們定義了一個變量a並初始化賦值為1,我們定義了一個變量b並初始化賦值為1,我們定義了一個變量並將a+b的結果賦值給了c,最後我們在屏幕輸出了c。a和b就是我們的輸入,而c就是我們的輸出。
我們這個問題是需要來計算1+1的結果,我們輸入了兩個變量a和b,我們輸出了一個結果c。這就是數學問題代碼解決。我初學編程是在高中階段,當時的數學題實在是讓人頭大不管是函數,又或者是什麼計算類的數學題,實在是頭大。但是學了編程之後,稍微複雜點的數學計算都可以通過編程來計算。在數學的函數圖像問題,很多函數圖像我們畫不出來或者研究不出來,我就可以通過編程來做一個函數圖像生成器,輸入函數式,輸出這個函數的曲線,這就是編程。
我們再來一個程序,我們來計算下圓的周長和面積。在這個問題當中,我們需要解決的問題是通過輸入以一個圓的半徑,計算得到圓的周長和面積。
我們來回顧下,圓的周長和面積公式。
圓的周長:l=2Πr
圓的面積:s=Πr*r
現在我們來上代碼。
#include <stdio.h> //導入stdio.h文件#include <stdlib.h> //導入stdlib.h文件int main(){ float PI = 3.1415926; //定義單精度浮點類型變量PI,初始化賦值為3.1415926 int r = 5; //定義整型變量r,初始化賦值為5 float l = 2*PI*r; //定義單精度浮點類型變量l,初始化賦值為2*PI*r float s = PI*r*r; //定義單精度浮點類型變量s,初始化賦值為PI*r*r printf("圓的周長是%f\n",l); //屏幕輸出周長 printf("圓的面積是%f\n",s); //屏幕輸出面積 system("pause"); //等待操作 return 0; //返回值為0}這裡的介紹大家可以參考1+1的問題,也歡迎大家在我們的QQ群提出自己的見解以及看法。
【左值右式定則】
在我們程序裡面,關於變量或是常量,我們都按照「左值右式」的原則來定義。
左值右式——左邊是數值,右邊是算式。
在編程裡面,我們的數值是保存在變量裡面的,所在等號的左邊,是變量,用於存儲計算的結果。對數據的計算,是一個算式,這個算式在等號的右邊。
int r = 5;//r是變量,是數值;5是算式,常量式
float l = 2*PI*r;l是變量,是數值;2*PI*r是算式,變量式。
變量是左值,因此可以出現在賦值號的左邊。數值型的字面值是右值,因此不能被賦值,不能出現在賦值號的左邊。
【什麼是變量,什麼是常量?】
在程序執行的過程當中,數據可變的我們稱為變量,數據不可變的我們稱為常量。
常量長用於定義一些固定的量,比如圓周率Π;變量是程序在執行過程當中,用於臨時存儲和計算的量。
【輸入和輸出】
在一個程序當中,人和電腦的交互(人機互動)是很必要。我們需要從鍵盤輸入內容,同時在屏幕輸出內容,在這裡的輸入和輸出,就是我們人機互動的接口。
我們在程序開頭有#include 和#include 兩個文件的導入。
include的英文意思是包含的意思,這裡是將stdio.h文件和stdlib.h文件加載到當前的程序當中,這兩個文件是編譯系統內部的文件,我們用到的int、float、printf等等都是定義在這些文件裡面。
stdio,Standard Input Output,標準化輸入輸出
stdlib,Standard Library,標準庫
在C語言當中,我們使用scanf獲得鍵盤的輸入;使用printf在屏幕輸出顯示。
#include <stdio.h>#include <stdlib.h>int main(){ float PI = 3.1415926; int r; printf("請輸入圓的半徑:"); scanf("%d",&r); float l = 2*PI*r; float s = PI*r*r; printf("圓的周長是%f\n",l); printf("圓的面積是%f\n",s); system("pause"); return 0;}在這裡我們可以通過鍵盤輸入一個數字,通過scanf,這個數字會保存到整型變量r裡面,在下面的程序當中,在調用r的同時,r就是我們輸入的的數字,代入計算。(PS:關於scanf和printf的內容會在後面開一章詳細講解)
【結語】
把實際生活中的問題,通過代碼來告知電腦,電腦給我們處理之後,告知我們結果的這一過程,就是編程。
身為程序猿的我們,寫代碼就是我們在和電腦進行溝通、進行告知的一個過程。在這裡,「數學公式代碼化」這一思想尤為的重要。
【順序結構】
在程序執行的過程當中,程序從main'函數開始,由上向下逐行語句依次執行,這就是順序結構。**
程序的邏輯感很強,嚴格、一行不差的執行,如果程序計算的結果和你預測的結果存在偏差,那麼這就是你的問題。要麼你預測錯誤,要麼你代碼邏輯錯誤。
#include <stdio.h>#include <stdlib.h>int main(){ printf("Hello World!\n"); system("pause"); return 0;}對於這個程序來說,程序在執行的時候,先是加載stdio.h和stdlib.h兩個文件,然後進入到main函數,main函數內的第一行是printf("Hello World!\n");,這行執行後,會在屏幕輸出個「Hello World!」同時加一個換行;然後執行的是system(「pause」);,這一是等待操作,它會提示你按下任意鍵繼續,這裡主要是用來停止程序,方便大家觀看程序的執行效果,我們在調試程序的時候,想看到程序逐條執行的效果時,也可以使用這個語句;最後的是return 0,是程序的結束標示。
順序結構在所有的程式語言都是通用的,不僅僅是在C語言。
【選擇結構】
我們解決問題的時候,經常也會碰到需要選擇的界面,根據當前的情況,我們來做出下一步如何執行的決定。
在程序裡面,我們稱為選擇結構。選擇結構有以下幾種。
【單分支選擇結構】
#include <stdio.h>#include <stdlib.h>int main(){ int a; scanf("%d",&a); if(a<10) { printf("您輸入的數小於10\n"); } system("pause"); return 0;}我在這裡輸入了5,通過scanf,我把5賦值給了a,此時a=5。接下來進入到了我們的if位置,我們此時的判定體為a<10。在a=5的情況下,這個判定肯定是成立的,所以下面大括號的內容printf("您輸入的數小於10\n");得到執行。那麼如果我輸入的比10大會怎麼樣呢?那肯定是條件不成立,不會執行的。
【雙分支選擇結構】
#include <stdio.h>#include <stdlib.h>int main(){ int a; scanf("%d",&a); if(a<10) { printf("您輸入的數字小於10!\n"); }else{ printf("您輸入的數字大於10!\n"); } system("pause"); return 0;}條件體成立,執行一個內容,條件體不成立,執行另外一個內容。這就是雙支選擇結構。大家可以自行構想下邏輯。
【多分支選擇結構】
#include <stdio.h>#include <stdlib.h>int main(){ int a; scanf("%d",&a); if(a<10) { printf("您輸入的數字小於10!\n"); }else if(a>10) { printf("您輸入的數字大於10!\n"); }else{ printf("您輸入的數字等於10!\n"); } system("pause"); return 0;}多分支選擇結構用於處理選項較多的情況,這裡的邏輯大家自行理解一下,可以參考上面的介紹,也歡迎大家在QQ群進行討論交流。
【選項選擇結構】
如果出現可供選擇少的情況下,我們可以通過if else的方式來處理,那麼如果有幾十種幾百種選項呢?麻煩的很!
這個時候我們就要用到選項選擇結構switch...case...default。
switch(判定的內容){ case 選項1:執行體1;break;case 選項2:執行體2;break;case 選項3:執行體3;break;case 選項4:執行體4;break;. default:默認執行體;}#include <stdio.h>#include <stdlib.h>int main(){ int a; printf("input integer number: "); scanf("%d",&a); switch(a) { case 1: printf("Monday\n"); break; case 2: printf("Tuesday\n"); break; case 3: printf("Wednesday\n"); break; case 4: printf("Thursday\n"); break; case 5: printf("Friday\n"); break; case 6: printf("Saturday\n"); break; case 7: printf("Sunday\n"); break; default:printf("error\n"); } system("pause"); return 0;}我們通過鍵盤輸入一個數字存儲在變量a當中,通過switch...case來判定a的數值,從而選擇對應的語句執行;而最後的default是在所有的case都不行的情況來執行default的內容。
當所有的case都不適合switch的時候別害怕,你還有有個default。 當所有的人都愛你的時候別擔心,你還有我。 ————隔壁老王【結語】
三大結構是任何編程的組成核心,不管你學習哪一門程式語言。關於break的內容,我們會在後面詳細講到,敬請期待!
我們可以完成的任務,為什麼要讓機器來做,要讓電腦來處理?
因為機器人可以不知疲倦、不厭其煩的進行無聊的、重複性極強的、危險的工作。
程序的執行從main函數開始,由上向下的執行;在碰到條件的時候,我們讓其判定進行一個選擇執行;那麼對於需要重複性的工作,則需要通過循環來進行。
循環結構有以下四種。我們均以1到99的和為例,向大家展示。
【for循環】
#include <stdio.h>#include <stdlib.h>int main(){ int i; //定義整型變量i int sum = 0; //定義整型變量sum,用於存儲累加的和 //for循環實現累加計算 for(i=0;i<100;i++) { sum = sum + i; //將每次i的值加到sum } printf("Sum = %d\n",sum); //輸出累加的結果 system("pause"); return 0;}在我們的這組實例代碼當中,初始化i=0,判定i是否小於100,每次執行語句後i的值加1;在執行體的部位我們執行了sum = sum+1即把每次i的值加到了sum變量上面,根據「左值右式」,注意左邊的sum和右邊的sum含義是完全不一樣的。
【while循環】
#include <stdio.h>#include <stdlib.h>int main(){ int i; int sum = 0; i = 0; //初始化 while(i<100) //判定體 { sum = sum + i; //執行體 i++; //自變體 } printf("sum = %d\n",sum); system("pause"); return 0;}這個是while循環實現1到99累加和的計算,邏輯大家先自行理解,可在我們交流群就行討論。
【do...while循環】
初始化do{ 執行體;自變體;}while(判定體);#include <stdio.h>#include <stdlib.h>int main(){ int i; int sum = 0; i = 0; do { sum = sum + i; i++; }while(i<100); printf("sum = %d\n",sum); system("pause"); return 0;}這個是do...while循環的結構,實現0到99的累加和,同樣可以參考上面的內容。
【三個循環的異同與「欄杆問題」】
for循環,又稱為「計數循環「。我們可以在for循環裡面指定這個循環內容執行執行多少次。
while循環,又稱為」條件循環「。滿足while的條件循環的內容就執行,否則循環內容不執行。
程序的三大結構,順序結構、選擇結構、循環結構,我們先用順序結構來解讀下著兩個循環的相同之處。程序的執行從main'』函數開始,從上向下的執行。
到了for循環和while循環這裡,先執行的是初始化,然後是判定,判定符合條件後,執行相關的語句,最後經過自變體來修改判定變量。兩種循環的邏輯是相同的,但是在寫法和用途方面存在不同。
do...while循環當中,先是執行了初始化,然後是執行需要執行的語句,然後是執行自變體修改判定變量,最後才來判定。
也就是說,for循環和while循環是先判定,後執行;而do...while循環是先執行,後判定。這兩個有什麼問題呢?
我在學校的時候經常需要去菜鳥驛站去快遞,每次都是排隊去的,到取快遞快遞前的時候,他會先問我是不是xxx,如果是,他才把快遞給我,然後繼續下一個同學。但是有一次情況,他先把快遞給我了,然後問我是不是xxx,但是我不叫xxx,這個時候他已經把快遞給我了的,是不是就出現錯誤了呢?
在現實的世界當中,快遞員給錯了快遞可以要回,但是在程序的世界當中,這就是bug!
先判定後執行,先執行後判定。這個邏輯大家一定要理解。
我們再來聊聊什麼是」欄杆問題「。
我們計數喜歡是從1開始計數,但是在程序的世界裡,計數是從0開始的。
在for(i=0;i<100;i++)這個過程裡面,循環是執行了100次,是0到99,這個也是初學者比較迷惑的一個問題。建議大家去購買《編程珠璣》一書,裡面對於這些細節講解的十分詳細。
【死亡循環——goto】
我糾結了再三,決定還是來聊聊死亡循環的問題,這個循環不建議大家來玩。
#include <stdio.h>#include <stdlib.h>int main(){ A: printf("Hello World!\n"); goto A; system("pause"); return 0;}這個循環就是通過goto跳轉到執行的位置,然後執行。goto循環時一個執行的存在,我們在學校上機課的時候實驗過,用goto循環來不停的創建線程,成功把電腦噎死(大概幾秒鐘的時間)。goto循環了解即可,不要使用,使用後需要電腦重裝系統的童鞋可以在我們的QQ群尋求技術幫助(QAQ)。
【break和continue】
break,打破,擊破,打碎。
continue,繼續。
我們在循環過程當中,我們碰到了一個結果想要提前跳出循環的時候,可以直接使用break語句。例如,
#include <stdio.h>#include <stdlib.h>int main(){ int i; for(i = 0;i<10;i++) //循環 { printf("i = %d\n",i); if(i == 5) //如果i等於5 { break; //提前結束循環 } } system("pause"); return 0;}在這裡循環只執行了5次就被break掉了的。
在程序執行的過程當中,我們想跳過某個執行,繼續循環可以使用continue。例如,
#include <stdio.h>#include <stdlib.h>int main(){ int i; for(i = 0;i<10;i++) { if(i == 5) { continue; } printf("i = %d\n",i); } system("pause"); return 0;}在執行到i等於5的時候,我直接給給continue掉,直接開始了新一輪的循環。
高中時候的體育課上,老師讓我們跑十圈熱熱身身,當我跑到第五圈的時候,同學告訴我班主任找我,那我就只能break掉跑圈的循環。老師有時候會在操場計著圈數,由此我跑過去了老師沒看到,直接就把我continue,好傢夥,最後評定我只跑了9圈,再加一圈。(QAQ)