一、基礎研究
觀察這兩個程序:
Menu.h:
Ues.c:
程序執行的結果是在屏幕上顯示一個三行的菜單:
用戶按鍵選擇菜單的某一項可以在屏幕上顯示該項所表示的彩色字符串:
它是如何實現的呢?我們先來看看menu.h。程序構造了一個結構體,並將菜單的相關信息都放在結構體裡。這裡有個問題:我們之前定義結構體都是用struct 類型名,但是這裡是用typedef struct,這裡是給struct的結構體起了一個名字為後面的ItemType,如果是struct加類型名則結構體的名字是struct後面跟的類型名,即typedef struct{}a;等價於struct a{};。
之後對函數menu進行了定義和聲明,我們看到這裡是在聲明之後直接定義的,那麼能不能去掉聲明呢?在文件中去掉聲明後發現完全能夠正常運行。在函數menu裡實現了顯示菜單項和檢測用戶按鍵、根據按鍵調用相關函數的功能,menu函數的參數為一個結構體指針,這個指針指向用戶初始化的菜單信息結構體,還有整型變量n表示所要實現菜單選項的個數,n主要是用來控制循環的次數的。在顯示菜單項的功能裡,用strlen來獲得菜單項字符串的長度並進行判斷,如果字符串的長度超過字符數組的長度,則提示錯誤並返回。
在use.c裡比較特別的是它在輸出字符串時讓每一個字符順序地變換顏色,是在for(n=0;str[n];n++)scr[n]=str[n]+(n+1)*0x100;裡實現的,每個字符的值都會加0x100,因為我們知道屏幕上每個字符都是兩個字節顯示的,低字節存放要顯示的字符的ascall,高字節存放的是表示顏色等屬性的值,這裡每個字符的值加0x100,相當於高位的屬性值加1,所以會變換一種顏色。
弄明白整個程序後,我們發現在頭文件menu.h裡定義了程序要使用的數據類型,定義了程序的入口函數menu,在menu裡實現了程序擴展所不需要改的功能,給出了跳轉到具體函數的方法,然後具體的初始化和子函數功能的實現則在use.c裡實現。也就是說,頭文件裡實現的是程序的共性,c文件裡實現的是程序的個性。我們在頭文件裡定義的數據要能夠連接頭文件和c文件,這樣使用起來便於擴展和修改,如果我們要修改一個功能,只需要在use.c文件裡更改初始化的值或實現的函數內容就行了。那麼對於程序a.c的功能,我們要把抽象的數據和通用的函數封裝起來,再集中初始化和調用。
將程序a.c修改如下:
h文件為:
c文件為:
這樣我們將輸入、輸出、判斷放在h文件裡,將子函數功能的實現和函數指針數組的初始化放在main函數裡,這樣我們要添加新功能可以在main函數裡修改就行了。
(1)Strlen與sizeof的區別。
答:(1)strlen是函數,sizeof是運算符。
(2)sizeof可以用類型做參數,strlen只能用char*做參數,且必須是以''\0''結尾的。
(3)大部分編譯程序在編譯的時候就把sizeof計算過了。
(4)strlen的結果要在運行的時候才能計算出來,時用來計算字符串的長度,不是類型占內存的大小。
我們在設計程序時要弄清楚哪些是共性、哪些是個性,把共性放在頭文件裡,把個性放在c文件裡,這樣可以做到簡潔清晰易擴展。所以我們能夠在main函數裡寫子函數實現功能的擴展。
要掌握一門語言,必須先掌握它的思想。c語言作為一門比較底層的語言,它的思想與計算機底層原理息息相關,但是這裡的分文件實現程序逐漸的接近了高級語言的思想,應該說高級語言的思想就是從中衍生出來的,我們要不斷比較、思考,才能真正掌握c語言的思想。