1. 程式人生 > >12天學好C語言——記錄我的C語言學習之路(Day 1)

12天學好C語言——記錄我的C語言學習之路(Day 1)

12天學好C語言——記錄我的C語言學習之路

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天之後你會感覺你對程式設計已經有初步瞭解了。

相關推薦

12學好C語言——記錄C語言學習Day 1

12天學好C語言——記錄我的C語言學習之路 Day 1: 剛剛入門C語言,那麼肯定要先把什麼是C語言和大家講清楚,那麼大家看下面一段程式(program  1.1): /*//program 1.1 #include<stdio.h>  //編譯預處理指令,編譯

記錄的Python學習time庫的基本操作

1、time() 功能:獲取當前時間戳,即計算機內部時間值,浮點數  2、ctime() 功能:獲取當前時間並以易讀方式表示,返回字串 3、gmtime() 功能:獲取當前實踐,表示為計算機可處理的時間格式  4、時間格式化:如t=time.gmtime()  

記錄的Python學習關於turtle庫的基本用法

關於庫函式的匯入方法:①import <> ②import <> as <> ③ from tutle import <>   1、turtle.setup(width,height,startx,starty)  /

記錄--的被迫自動化

run 做什麽 jenkin 能夠 持續集成 經驗 單元 它的 框架 2019年5月6日 這剛五一小長假回來,還沒緩過勁,大領導今天忽然下達了個命令,大致意思是:‘你們都盡快學自動化啊,我們要把自動化盡快搞起來’ 我真的是三臉懵逼... 之前

的Python學習day1

python  一直以來都不喜歡開發,也比較排斥,於是大學分專業選擇了網絡工程。但是學院又不重視網絡,大四實習的時候都去培訓開發唯獨我選擇了繼續沿著網絡方向走下去。現在已經工作一年多了,傳統網絡工程師的需求已經非常小了。最終還是回到了開發,選擇了Python,開啟我人生的新征程。  這是到今天為止我寫過最長的

的spark學習:利用spark做迴歸分析

spark的機器學習庫(MLlib)下有簡單的迴歸分析方法,今天只說最簡單的線性迴歸,spark提供有兩個迴歸分析庫(mllib和ml),我學習的時候在網上也查了不少資料,有一個奇怪的現象是網上關於spark迴歸分析的資料基本全是mllib,關於ml的基本沒見到

C語言學習——初識C語言

                      C語言的學習之路(一)——初識C語言 從9月8日踏入大學校園,已近過去40多天了。這篇部落格也是踏入大學的第一篇部落格。內心很慌:因為自己

資料結構C語言學習1——緒論

小白學習資料結構,從基礎知識開始整理起。 1.資料結構是什麼? 2.資料結構在哪裡用? 3.資料結構怎麼用? 小白在開始學習資料結構,提出了這三個問題,希望到學習完成之後可以解決這三個問題。 小白從《大話資料結構》這本書開始學習。 基本概念: 資

資料結構學習C語言對陣列的簡單實現

以下的程式只是在觀看郝斌老師講解的(C語言資料結構)之後自己做得簡單練習。# include <stdio.h> # include <stdlib.h> typedef struct MyArray{ int * pBase; //存放陣列第一個

C++再學習

iter pointer lin clas 數組元素 對數 表達 自增 條件操作符 1. 移位操作符“ << ”和“ >> ”擁有中等優先級:其優先級比算術操作符低,但比關系操作符、賦值操作符和條件操作符優先級高 2. *iter++   後自增操作

C++再學習

我們 實參 對象傳遞 color virtual 轉換 版本 部分 尊重 1.繼承和動態綁定在兩個方面簡化了我們的程序   能夠容易地定義與其他類相似但又不相同的新類,能夠更容易地編寫忽略這些相似類型之間區別的程序  P471 2.之所以稱通過繼承而相關聯的類型為多態類型,

C++學習:關於C++提供的強制類型轉換

code 記錄 是不是 通過 行修改 單元 c語言 enum 表達式 C語言中提供了舊式的強制類型轉換方法。比如: int a =1; char *p = (char *)&a; 上述將a的地址單元強制轉換為char類型的指針。這裏暫且不說上述轉換結果是否合理,但

C++學習:虛繼承引入的執行效率

存取 ++ 移位 繼承 模型 虛函數 必須 執行 amp 這篇文章不知道取啥名字了,暫且這樣叫,直接看場景就明白了。節選自《深度探索C++對象模型》 Point3d origin, *pt = &origin; (1)origin.x = 0; (2)pt->

的linux學習-第00

因此 最終 我們 沒有 之路 成就感 如果 人類 而是 為什麽喜歡linux?為什麽要學linux?我也不清楚,也許因為它可以很小,也許因為它很穩定,也許它的可玩性高?Who knows。 “工作馬馬虎虎,只想在興趣和遊戲中尋覓快活,充其量只能獲得一時的快感,絕不能嘗到從心

如何學習爬蟲,的爬蟲學習,怎樣學好爬蟲的,爬蟲認知篇1

          作為一個小白來說,那就是---->我,看那多原理,等於天書,我看不懂,但是為啥是叫了解爬蟲,而不是懂裡邊內容,框架(Scrapy)怎麼寫的,我作為小白知道怎麼用,不就行了嗎,對不對,之後在瞭解深入.

C++學習47---C++類模板與模板類深入詳解

1、在c++的Template中很多地方都用到了typename與class這兩個關鍵字,而且有時候二者可以替換,那麼是不是這兩個關鍵字完全一樣呢? 事實上class用於定義類,在模板引入c++後,最初定義模板的方法為:template<class T>,這裡cl

SQL資料庫學習練習---C#登入介面連資料庫

目錄 參考文章: C#登入介面連資料庫 一、在資料庫中先建立一個數據庫。 資料庫命名為NamePwd,使用SQL語言建立兩個表,一個表命名為name,另一個表命名為pwd。在兩個表中都只建立一個列。 create table

4.6 基於Spring-Boot的Mysql+jpa的增刪改查學習記錄 > 的程式猿:第三十六章

1.專案結構       -JDK  1.8       -SpringBoot  2.0.6       -Thymeleaf       -Hot Start         1.1 後臺(5個)       java\com\example\demo\beans\user.java        

C++學習15---C++ 資源大全太全了

C++是在C語言的基礎上開發的一種集面向物件程式設計、泛型程式設計和過程化程式設計於一體的程式語言。應用較為廣泛,是一種靜態資料型別檢查的,支援多重程式設計的通用程式設計語言。 關於 C++ 框架、庫和資源的一些彙總列表。 內容包括:標準庫、Web應用框架、人工智慧、

XLua 學習C#訪問Lua

       這裡指的是C#主動發起對Lua資料結構的訪問。從Lua支援的資料型別來講,C#獲取Lua元素主要分為:基本資料型別(number,bool,string),複雜的資料型別(table),函式(function)。        本次測試的待獲取的L