入門級 C語言期末複習(1)——基本概述

期末將至,希望同學們能好好複習,成績理想,在此寫下一些本學期的學習體會,希望能幫到大家。

寫程序前的準備

我們這門課程的核心能力就是寫程序,但是寫一個程序不僅僅是敲幾行代碼這麼簡單,寫程序是一個綜合的過程需要我們分析問題、設計算法、編寫程序、編譯程序、調試程序、日後我們還需要編寫程序文檔。這些步驟缺一不可,而且都很重要。

有的同學看見一道題目想了想就直接開始在電腦上敲了,其實這是不對的,對於我們而言,在敲代碼之前,首先要審題,把題目要求看懂,比方說【判斷點是否在圓上】這一題,之前我就看見有同學判斷的是點是否在園內,這樣犯錯得不到分是很冤的。
在這裏插入圖片描述
其次一定要有全局思考的過程,要非常清楚整個程序的思路流程,我的個人建議是:最好把程序思路寫一遍,哪裏需要注意的,哪裏是實現算法的關鍵地方,哪裏容易忽略的,都應該在草稿紙上呈現出來。因爲當你思考整個程序的時候,一些細節就可以注意到,這樣你在打代碼的時候就不會疏漏。倘若是一邊打代碼,一邊思考,很容易就會忽略重要的東西,最糟糕的是,當你把代碼全部寫好後,一編譯,全是錯誤,辛辛苦苦把錯誤改正好後,一運行,結果跟自己想的不同,然後又重新開始看自己的代碼哪裏有問題(當然有時候這個環節不可避免,改程序會在後面講到)。

在紙上把流程寫好後,把代碼打好,對於我們來說就是一個不難的事情了。從這點看來,我們實際上就是工程師,把我們已掌握的知識進行組合,再用程序這個工具加以實現。對於工程師來所,圖紙是最重要的東西,有了圖紙,萬丈高樓才能搭建起來。

當然了,之前講到,程序有錯誤是難以避免的,我們儘可能在準備階段減少問題發生的可能性,但一旦問題發生了,我們還得去改正。

程序錯誤

程序錯誤無非就是三類,一是語法錯誤,這個是很容易改正的,因爲編譯器會報錯。但有的語法在codeblocks上沒問題,但是在OJ系統上是過不了的。暫時發現了幾個,跟大家分享下:

1、 gets函數和puts函數在現在codeblocks的版本中是包含在stdio.h中的,一些數學函數如abs等在stdio.h中也是有的,這時後如果你沒有寫 <string.h>或<math.h>,OJ系統是判定你錯誤的。
2、 在寫多個函數時最好現在main函數前聲明,然後再在main函數下方寫已聲明的函數,否者的話,OJ系統有可能報錯。
3、 定義結構體時,應該在main函數前定義,如果在main函數裏面定義結構體,OJ系統會現實編譯錯誤。
4、 沒有return 0;有超時的可能性


第二類的錯誤是運行錯誤,即由於編譯成功了,但是由於程序中的不合理操作,導致無法繼續正常運行的錯誤,例如:

1、 死循環。
2、 用scanf語句輸入時變量前沒有取地址“&”.
3、 鏈表“斷開”了(上一個結點的指針域不能指向下一個結點)

第三類錯誤是邏輯錯誤,這類錯誤往往比較難以發現和改正.

有時候表現爲自己的結果和預期結果不同,這種可通過跟蹤變量來改錯。也就是Debug,當然也可以直接在程序的不同位置輸出數據來跟蹤變量的變化情況。

有的時候,表現爲自己測試的數據正確,提交到OJ上判定爲錯,這時候情況呢比較棘手,需要通過自己設計數據來判斷髮現錯誤,一般可以設計邊界值,特殊值。例如尋找鞍點這一道題,有沒有可能鞍點在第一個位置但是程序判斷不到呢,有沒有可能鞍點有兩個呢,有沒有可能有重複數據呢,這些數據都是可以自己輸入判斷的,如果在設計最開始沒有考慮到這些問題,就要在改程序的時候去驗證,去改正。

代碼風格

回到寫代碼這個問題上,首先希望大家能有一個好的代碼風格,雖然C語言對源代碼的格式沒有特別規定,可以將幾條語句寫在一行,也可以換行不縮進,但是這樣的程序可讀性差,不易於理解。一方面不方便自己查改,另一方面不方便與人交流,再者當以後我們的程序寫的很長的時候,不好的代碼風格可能會影響你的思路開展。我們可以參照下課本的代碼,或者我們寫的題解的代碼風格也基本和書本上是一致的。大家可以參照下面的例子:【學生信息管理】。

#include <stdio.h>

struct student
{
   
   
    int screo[11];
};
typedef struct student DEG;

int main()
{
   
   
    DEG stu[1005],t;
    int i,j,n,m,sum[20],t1;					//變量取名儘量望名知意
    double ave[20];
    scanf("%d%d",&n,&m);
											//一個較爲完整的功能塊結束後可以適當換行
    for (i=0;i<n;i++)
    {
   
   										//用大括號後縮進一個Tab
        for(j=0;j<m;j++)                    //讀入數據(做適當的註釋,方便自己和他人的理解)
        {
   
   
            scanf("%d",&stu[i].screo[j]);   //注意結構體的使用
            sum[i]+=stu[i].screo[j];
        }
    }

    for (i=0;i<m;i++)                       //注意m,n的使用
    {
   
   
        for (j=0;j<n;j++)
        {
   
   
            ave[i]+=stu[j].screo[i];
        }
        ave[i]/=n;                          //算出平均分
    }

    for (i=0;i<n-1;i++)                     //冒泡排序
    {
   
   
        for (j=0;j<n-1-i;j++)
        {
   
   
            if (sum[j]<sum[j+1])            //交換學生信息的同時還要交換總分
            {
   
   
                t=stu[j];
                stu[j]=stu[j+1];
                stu[j+1]=t;

                t1=sum[j];
                sum[j]=sum[j+1];
                sum[j+1]=t1;
            }
        }
    }

    for (i=0;i<n;i++)                       //輸出數據
    {
   
   
        for (j=0;j<m;j++)
        {
   
   
            printf("%d ",stu[i].screo[j]);
        }
        printf("\n");
    }

    for (i=0;i<m;i++)
    printf("%.1lf ",ave[i]);

    return 0;
}

數據類型

關於數據類型,分爲基本類型,構造類型,指針類型,和空類型(void)。基本類型的大類是整型、浮點型、字符型,只是在此基礎上還可以細分,如有無符號,精度是單精度還是雙精度等。基本使用上我們都懂,只是我們應該注重細節,加深理解。

整型的運用大家都比較熟練。浮點型大家記住沒有特別要求就用double類型就好了,用float的話,某些情況下OJ有可能會判錯,但是用double的話也要記得輸入時要用“lf”的格式字符。這裏要注意1.23e3是浮點型數據的一種表示方法,代表1.23*10^3。關於字符型的使用,大家要記得轉義字符的使用,我們比較常用的是‘\n’、‘\0’,但還又其他的一些轉義字符的使用,大家翻課本回憶下。

講到數據類型就不得不提及數據存儲的問題了,大家得清楚數據在內存中存儲的原理,例如,聲明瞭整型數據類型a後(int a),系統就爲其開闢了一個4個字節(不同類型字節數不同)的空間,專門用於存放數據(以二進制的形式),並且給這4個字節命名爲a,當你要使用這個數據是,通過變量名a就可以直接調用,亦或者你取a的地址,知道了這個數據所在的位置,你就可以通過地址直接定位到數據的位置使用。通過改動內存中這4個字節中存儲的內容,就可以實現改變數據。理解清楚這一點後,對後面指針和鏈表的學習非常有幫助。

數據的存儲,比較特別的是字符型的存儲,在內存中是以ASCII碼的形式存儲的,其實也可以理解爲用特定的一些數字代表特定的字符,這就意味着,字符型是可以做運算的。

對於不同數據類型之間的運算和數據類型數據的轉換,大家也要注意。自動類型轉化,浮點型和整型之間的計算,字符型和整型之間,都是一個怎麼樣的運算關係。強制類型轉換,在判斷整數如何使用。這裏設計的細節比較多,而且課上都講過,大家看看書,回憶一下,回憶不起來也沒有關係,看書也可以看懂。

運算符和表達式

就運算符和表達式來說,值得注意的是數據的運算規則,尤其是一些比較細的地方,例如整型相除向0取整的規則,求模結果的符號與被除數的相同,自加自減運算(i++、++i)中,是先計算結果還是先運算的問題。還有各種運算符的優先級,結合性,大家都要搞清楚。在書本208頁,有“運算符及其特徵的表格”內容比較詳細,大家可以稍加記憶。在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章