12天學好C語言——記錄我的C語言學習之路(Day 1)
Day 1:
剛剛入門C語言,那麼肯定要先把什麼是C語言和大家講清楚,那麼大家看下面一段程式(program 1.1):
/*//program 1.1
#include<stdio.h> //編譯預處理指令,編譯系統要求提供程式中有關函式的資訊,而stdio是”standard input&output”的縮寫(標準輸入輸出)
//字尾.h的意思是header file(標頭檔案)
int main() //定義主函式(main函式是int型別,也就是整數型別,執行主函式會得到一個值,其值應該為int型別)
{ //函式開始的標誌
printf("this is a C program.\n"); // 輸出資訊
return 1; //函式執行完畢返回函式值1,因為必須返回一個int型別的值。
} //函式結束的標誌
*/
各位上機敲一下 program1.1 中的程式碼,感受一下C語言的魅力所在,C語言是最基礎的語言了,他是面向過程的語言,怎麼理解呢?比方說你做一道數學題,那麼C語言就是解題步驟了。如果你不會概率,你不會圓錐曲線方程,你不會函式,那麼你也看不懂這道數學題的解體思路。所以說,C語言是給計算機讀的,是給程式設計師看的,一般人看不懂,所以說是面向過程的。
下面看 program 1.2 ,在這個程式裡我們認識到了變數,也對變數進行了一系列的操作。
/*//program 1.2
#include<stdio.h>
int main()
{
int a=1,b=2,sum; //這裡的a,b,sum都是變數名,int為變數的型別
sum=a+b;
printf("sum is %d\n",sum); //在輸出時,變數sum取代了格式符%d,sum的計算結果是3,所以輸出的結果也是3。
return 1;
}*/
簡單的處理了一個變數的程式之後我們不妨再來看看C語言中更富有魅力的東西。為什麼要程式設計?因為我們用人腦無法處理大量的計算,那些人腦遙不可及的運算必須用計算機程式來實現,這就是計算機的優勢所在了。下面我們就來初步感受一下。 program 1.3 為大家展示的是一個函式max。大家可能多少了解C語言,如果學過那就再好不過了,老師肯定會讓大家先去寫一個max函式來比較兩個數字的大小並輸出最大值,在這裡我要為大家列舉一個新手經常犯的錯誤。錯誤程式碼如下:
/*//program 1.3
#include<stdio.h>
#include<math.h>
int main()
{
int a=1,b=3,c;
c=max(a,b); //我在這裡直接呼叫了max函式,但是程式是錯誤的,我已經寫了math.h的標頭檔案了,為什麼還是無法正確呼叫這個函式呢? 顯然問題的答案就是math.h裡面並沒有max這個函式,我們需要自己去寫一個比較兩個數大小的max函式。
printf("max is d%\n",c);
return 0;
}*/
正確程式碼如下:
/*//program 1.4
#include<stdio.h>
int main()
{
int a,b,c;
scanf(“%d,%d”,&a,&b); //這裡格式上兩個%d之間有“,”,所以說在輸入的時候一定要加上逗號。如果格式中什麼都不加,那麼也可以,只是要在輸入的時候加上空格或回車。scanf函式中包含兩部分,一個是你輸入的資料要按照什麼格式,後一部分就是輸入的兩個數存入到兩個地址中,&a就是變數a的地址,而&b就是變數b的地址,你定義的變數a,b,所以後面也要跟&a,&b,不能前面定義的a,b,而後面&e,&f
int max(int a,int b); //一定要在main函式中宣告,因為程式自上而下的進行,執行到下一句c=max(a,b)的時候使用到了max函式,如果不去宣告max函式,那麼程式是不認識max這個函式的,就會報錯。但是如果把下面max的定義部分程式碼提前到main函式的前面,那麼執行的時候就不用加這一句話了(如下面 program 1.5)。(但是為了程式的可讀性,還是要規範一點加上函式宣告)
c=max(a,b);
printf("c= %d\n",c);
return 0;
}
int max(int x,int y) //被呼叫的函式,函式名後面必須跟圓括號
{
int z;
if(x<=y)
z=y;
else
z=x;
return (z); //根據需要選擇返回值,而不是每一個函式後面都要return 0;
}
*/
在上面的函式中,函式宣告的地方我們看到聲明瞭兩個變數a,b,下面函式定義部分,我們也看到了,這裡的a,b是函式的形參變數,而在呼叫函式的時候( c=max(a,b); ),這裡的a,b有具體的值,是定義好的或者是手動輸入的,屬於實參。那麼形參和實參又有怎樣的區別呢?
我們可以這樣考慮:形參的本質是一個名字,不佔用記憶體空間。實參的本質是一個變數,已經佔用記憶體空間。
函式的形參和實參具有以下特點:
1. 形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只有在函式內部有效。函式呼叫結束返回主調函式後則不能再使用該形參變數。
2. 實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。
3. 實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生型別不匹配”的錯誤。
4. 函式呼叫中發生的資料傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函式呼叫過程中,形參的值發生改變,而實參中的值不會變化。
讀者一定要仔細把握上面的這幾句話,並深入理解,這很重要。走好一小步,夯實基礎,對以後的程式會有莫大的幫助。
/*//program 1.5
#include<stdio.h>
int max(int a,int b)
{
int z;
if(a<=b)
z=b;
else
z=a;
return(z);
}
int main(void) //函式名後面必須跟小括號,括號內寫引數名和引數型別,如果函式沒有引數,小括號中寫void或者是不寫
//一個程式總是從主函式(main函式)開始執行的,所以main函式的位置可以靠前也可以靠後
{
int a,b,c;
scanf("%d%d",&a,&b); //記住,scanf和printf都是庫函式,輸入輸出在C中實現函式化,C本身不提供輸入輸出的語句!!!!!
c=max(a,b);
printf("max is %d\n",c);
return 0;
}
void abc() //這是一個空函式,型別為void,這樣寫一個空函式在程式裡,是合法的
{
}
*/
像 program 1.5 ,在主函式中並沒有宣告max函式,但是由於在main函式前我們定義了一個max函式,所以程式“認識”這個函數了,所以程式依舊正常執行。
上面我們又提到了一個新的知識點,就是空函式,空函式只是沒有什麼作用,但是卻是合法的。比如下面程式 program 1.6,也是合法的。
/*//program 1.6
#include<stdio.h>
int main()
{
}
*/ //這也是沒有錯誤的
下面,我們要探討當遇到大量的迴圈資料的時候應該怎麼操作呢?比方說求1+3+5+…+99的結果。顯然這個式子我們不能把所有項都寫下來,這時候我們就要考慮迴圈了。(如:program 1.7)
/*//program 1.7
#include<stdio.h>
int main()
{
long p=0;
for (int n=1; n<=99; n=n+2) {
p=p+n;
}
printf("%ld",p);
return 0;
}
*/
上面的迴圈僅供讀者參考,具體的for迴圈如何實現,在後面的章節中有介紹。
在for迴圈中我們將處理好的變數p輸出,這裡我們必須要提一個事情,那就是在for迴圈中的什麼變數可以輸出,什麼變數無法輸出。這牽扯到一個變數釋放的問題,再看下面 program 1.8 。
/*//program 1.8
#include<stdio.h>
int main()
{
for(int i=1;i<=10;i++)
{
int j=4;
}
printf("%d",i); //這裡可以輸出i,因為i並沒有被釋放,而如果輸出j,j是被釋放的,換句話說輸出的時候j已經不存在了。因為大括號內宣告的變數隨大括號內的程式塊消失而釋放,而上面的i屬於main函式下的大括號,所以只有main函式結束時,i才被釋放,故在輸出語句中,i是存在的,可以輸出。這一點大家一定要小心注意!
return 0;
}
*/
不管是哪個版本的C語言書籍,肯定會在前幾章中就像大家介紹一個判斷是否是閏年的C程式。下面我們就來寫一下這個程式。(program 1.9)
/*//program 1.9
#include<stdio.h>
int main()
{
int year;
scanf("%d",&year); //輸入一個年份,判斷是不是閏年。這個地方我們需要注意一點,那就是scanf(“%d\n",&year); 這樣寫是錯誤的,因為\n不能加在scanf中
if((year%4==0&&year%100!=0)||(year%400==0)) //這一句就是整個程式的關鍵了,用了if語句,裡面分好幾個層次,用來分別判斷條件是否滿足。這裡的數學運算判斷符號過於簡單,請讀者自行查閱相關書籍進行學習,這裡不做解釋
printf("是閏年");
else
printf("不是閏年");
return 0;
}
*/
第一天我們粗略的認識了C語言最基本的變數,迴圈,判定語句,輸入輸出語句。並且對裡面經常犯的錯誤和模糊的定義做了解釋,上面的程式都很基礎,比較適合初學者去讀。之後的學習會逐漸深入,程式碼行數也會逐漸增加,變得越來越複雜。記住,程式設計和做數學題一樣,多寫多練就能成功。不要只是看書,看學習視訊,看別人的總結。這些都是輔助工具。最重要的還是去自己敲一敲程式碼,去多練習。在除錯程式的同時獲得收穫。15天學好C語言這篇連載的文章是我切身實踐並總結的,我的的確確只用了15天的時間並將每天的收穫記錄下來,這個過程所需時間不長,半個月而已,但是速成也不是那麼容易的,我建議讀者每天至少寫500行程式碼,15天之後你會感覺你對程式設計已經有初步瞭解了。