




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第9章接口與函數(shù)庫第9章接口與函數(shù)庫內(nèi)容提要9.1預處理命令
9.2C的標準庫
9.3圖形庫
9.4屏幕控制函數(shù)庫
9.5自定義接口與接口設計的原則內(nèi)容提要9.1預處理命令9.2C的標準庫9.3圖形9.1預處理命令9.1.1概述9.1.2宏定義9.1.3文件包含9.1.4條件編譯9.1預處理命令9.1.1概述9.1.1概述
所謂預處理是指在進行編譯的第一遍掃描(詞法掃描和語法分析)之前所作的工作。預處理是C語言的一個重要功能,它由預處理程序負責完成。當對一個源文件進行編譯時,系統(tǒng)將自動引用預處理程序?qū)υ闯绦蛑械念A處理部分作處理,處理完畢自動進入對源程序的編譯。C語言提供了多種預處理功能,如宏定義、文件包含、條件編譯等。合理地使用預處理功能編寫的程序便于閱讀、修改、移植和調(diào)試,也有利于模塊化程序設計。9.1.1概述所謂預處理是指在進行編譯的第一9.1.2宏定義
在C語言源程序中允許用一個標識符來表示一個字符串,稱為“宏”。被定義為“宏”的標識符稱為“宏名”。在編譯預處理時,對程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預處理程序自動完成的。9.1.2宏定義在C語言源程序中允許用一個1、無參宏定義一般形式:#define標識符字符串“標識符”為所定義的宏名。“字符串”可以是常數(shù)、表達式、格式串等例如:#defineM(y*y+3*y)其作用是指定標識符M來代替表達式(y*y+3*y)1、無參宏定義一般形式:【例9.1】簡單的宏定義和宏調(diào)用#defineM(y*y+3*y)voidmain(){ints,y;printf("inputanumber:");scanf("%d",&y);s=3*M+4*M+5*M;printf("s=%d\n",s);}在預處理時經(jīng)宏展開后該語句變?yōu)椋簊=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);【例9.1】簡單的宏定義和宏調(diào)用#defineM(y*說明(1)宏定義是用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單的代換。必要時,宏定義中表達式兩邊要加括號。(2)宏定義是命令,不是語句,在行末不能加分號,如加上分號則連分號也一起代換。(3)宏定義一般寫在函數(shù)之外,其作用域為宏定義命令起到源程序結(jié)束。如要終止其作用域可使用#undef命令。(4)宏名在源程序中若用引號括起來,則預處理程序不對其作宏代換。說明(1)宏定義是用宏名來表示一個字符串,在宏展開時又以該說明(5)宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開時由預處理程序?qū)訉哟鷵Q。例如:#definePI3.1415926#defineSPI*y*y/*PI是已定義的宏名*/對語句:printf("%f",S);在宏代換后變?yōu)椋簆rintf("%f",3.1415926*y*y);說明(5)宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義說明(6)習慣上宏名用大寫字母表示,以便于與變量區(qū)別。(但也允許用小寫字母)(7)可用宏定義表示數(shù)據(jù)類型,使書寫方便。例如:
#defineSTUstructstu
在程序中可用STU作變量說明:
STUbody[5],*p;(8)對“輸出格式”作宏定義,可以減少書寫麻煩。說明(6)習慣上宏名用大寫字母表示,以便于與變量區(qū)別。(但也【例9.3】將輸出格式定義為宏#definePprintf#defineF"%d\n%f\n"voidmain(){inta=12,c=18,e=25;floatb=17.8,d=41.78,f=36.54;P(F,a,b);P(F,c,d);P(F,e,f);}【例9.3】將輸出格式定義為宏#definePprin2、帶參宏定義一般形式為:#define宏名(形參表)字符串在字符串中含有形參。帶參宏調(diào)用的一般形式為:宏名(實參表);例如:宏定義#defineM(y)y*y+3*y宏調(diào)用:k=M(5);宏展開后的語句為:k=5*5+3*52、帶參宏定義一般形式為:說明(1)帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)。如果把
#defineMAX(a,b)(a>b)?a:b
寫為:
#defineMAX(a,b)(a>b)?a:b
將被認為是無參宏定義說明(1)帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)。說明(2)在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因此不必作類型定義。(3)在宏定義中的形參是標識符,而宏調(diào)用中的實參可以是表達式。例如:
#defineSQ(y)(y)*(y)sq=360/SQ(a+1);
展開后得到如下語句:
sq=360/(a+1)*(a+1);
這與函數(shù)的調(diào)用是不同的,函數(shù)調(diào)用時要把實參表達式的值求出來再賦予形參。而宏代換中對實參表達式不作計算直接地照原樣代換。說明(2)在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因此不必作說明(4)在宏定義中,字符串內(nèi)的形參通常要用括號括起來以避免出錯。例如:
#defineSQ(y)y*ysq=360/SQ(a+1);
展開后得到如下語句:
sq=360/a+1*a+1;
必要時應將整個字符串括起來,例如:
#defineSQ(y)((y)*(y))sq=360/SQ(a+1);
展開后得到如下語句:
sq=360/((a+1)*(a+1));說明(4)在宏定義中,字符串內(nèi)的形參通常要用括號括起來以避免說明(5)帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同。(6)宏定義也可用來定義多個語句,在宏調(diào)用時,把這些語句又代換到源程序內(nèi)。說明(5)帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同。9.1.2文件包含一般形式為:
#include"文件名"
文件包含命令的功能是把指定的文件插入該命令行位置取代該命令行,從而把指定的文件和當前的源程序文件連成一個源文件。例如:
#include"stdio.h"#include"math.h"9.1.2文件包含一般形式為:說明(1)包含命令中的文件名可以用雙引號括起來,也可以用尖括號括起來。例如以下寫法都是允許的:
#include"stdio.h"#include<math.h>
但是這兩種形式是有區(qū)別的:使用尖括號表示在包含文件目錄中去查找(包含目錄是由用戶在設置環(huán)境時設置的),而不在源文件目錄去查找;使用雙引號則表示首先在當前的源文件目錄中查找,若未找到才到包含目錄中去查找。一般來說,系統(tǒng)定義的頭文件通常用尖括號,用戶自定義的頭文件通常用雙引號。說明(1)包含命令中的文件名可以用雙引號括起來,也可以用尖說明(2)一個#include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個#include命令。(3)文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。說明(2)一個#include命令只能指定一個被包含文件,若9.1.4條件編譯
條件編譯的功能可以按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標代碼文件。這對于程序的移植和調(diào)試是很有用的。9.1.4條件編譯條件編譯的功能可以按不同的1、第一種形式#ifdef標識符程序段1#else
程序段2#endif
它的功能是,如果標識符已被#define命令定義過則對程序段1進行編譯,否則對程序段2進行編譯。1、第一種形式#ifdef標識符2、第二種形式#ifndef標識符程序段1#else
程序段2#endif
與第一種形式的區(qū)別是將“ifdef”改為“ifndef”。它的功能是,如果標識符未被#define命令定義過則對程序段1進行編譯,否則對程序段2進行編譯。2、第二種形式#ifndef標識符3、第三種形式#if常量表達式程序段1#else
程序段2#endif
它的功能是,如常量表達式的值為真(非0),則對程序段1進行編譯,否則對程序段2進行編譯。3、第三種形式#if常量表達式9.2C的標準庫
盡管標準庫并不是C語言的組成部分,但是,凡是支持ANSIC的編譯器都提供了ANSIC建議的標準庫供用戶使用。標準庫是通過接口來使用的,即把提供該接口的頭文件包含在用戶程序中。對于字符型函數(shù)庫、字符串函數(shù)、動態(tài)存儲分配函數(shù)和標準I/O庫函數(shù)在前面有關章節(jié)已有介紹,完整的函數(shù)原型及其功能見附錄5。本節(jié)僅對標準I/O庫函數(shù)中格式說明進行介紹。9.2C的標準庫盡管標準庫并不是C語言的9.2.1格式輸出函數(shù)中的格式轉(zhuǎn)換符9.2.1格式輸出函數(shù)中的格式轉(zhuǎn)換符域?qū)捳f明字符域?qū)捳f明字符說明(1)在上表中除m和n是具體的正整數(shù)外,其余符號都可以出現(xiàn)在域?qū)捳f明中。(2)在域?qū)捳f明中還可以使用字符*來表示。用*號表示的域?qū)捳f明要求在輸出參數(shù)表中增加一個整型的參數(shù),表示輸出對象的最大寬度。使用這種方法能處理輸出寬度為變量或表達式的的情況。例如:
printf(“%*d\n”,max,100);
式中max為整型變量。輸出函數(shù)表示用整型格式輸出100,寬度為變量max的當前值。使用這種方法也能處理要求在指定的位置輸出某數(shù)據(jù)(輸出定位)的情形。在輸出由字符構成的圖案的程序中常常使用這種方法定位。說明(1)在上表中除m和n是具體的正整數(shù)外,其余符號都可以【例9.7】輸出由*號構成邊長為n的棱形圖案。#include<math.h>voidmain(){intn,i,j,k;printf("\nEnterthesidelength:");scanf("%d",&n);for(i=1-n;i<=n-1;i++){k=n-fabs(i);printf("%*c",40-k,'');/*輸出定位*/for(j=1;j<=2*k-1;j++)printf("%c",'*');printf("\n");}}【例9.7】輸出由*號構成邊長為n的棱形圖案。#includ9.2.2格式輸入函數(shù)中的格式轉(zhuǎn)換符9.2.2格式輸入函數(shù)中的格式轉(zhuǎn)換符說明(1)空格、制表符,它們在輸入時被忽略,常用作分隔符。(2)非%普通字符,它需要在輸入流中有完全同樣的字符與之匹配。(3)以%為開頭,以轉(zhuǎn)換字符為結(jié)尾的轉(zhuǎn)換說明符(見上頁表)。(4)在%與轉(zhuǎn)換字符之間可以有下列選項:賦值抑制符*(虛讀,不賦值)說明最大域?qū)挼恼麛?shù)指出參數(shù)所指變量的字母h、l或L說明(1)空格、制表符,它們在輸入時被忽略,常用作分隔符。9.5自定義接口與接口設計的原則
頭文件可以理解為用戶程序與庫之間的接口。程序設計人員也可以設計自己的庫和接口,將一些經(jīng)過嚴格測試的模塊經(jīng)過編譯后放入庫中,以便隱藏其實現(xiàn)細節(jié)。而在接口中對庫內(nèi)的模塊(函數(shù))進行原型聲明,以便用戶能方便地使用這些模塊的功能。其實用戶關心的就是他要使用的模塊的用法而并不關心其實現(xiàn)的細節(jié)。通過接口和庫把程序功能的實現(xiàn)者、庫的使用者和用戶之間隔開是程序抽象的一種途徑,是現(xiàn)代程序設計的重要方法。9.5自定義接口與接口設計的原則頭文件可以理自定義接口的例子
假設我們要設計單鏈表。首先定義表示鏈表結(jié)點的結(jié)構:
structstudent{longnum;floatscore;structstudent*next;};
對鏈表的操作有:建立鏈表、對鏈表排序、在鏈表中插入結(jié)點、刪除鏈表的指定結(jié)點、輸出(遍歷)鏈表。自定義接口的例子假設我們要設計單鏈表。首先定義表程序文件的結(jié)構
用戶程序、接口和庫文件之間的關系:
用戶文件
user.c(主程序)調(diào)用庫函數(shù)完成程序功能
接口文件
list.h庫函數(shù)中定義的所有函數(shù)的原型聲明
庫文件
list.c接口文件中所有函數(shù)原型的實現(xiàn)程序文件的結(jié)構用戶程序、接口和庫文件之間的關系:用戶文接口文件/*文件list.h*/#ifndef_LIST_H#define_LIST_Hstructstudent{longnum;floatscore;structstudent*next;};intn;structstudent*creat();voidprint(structstudent*);structstudent*insert(structstudent*,struct
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年捐款協(xié)議模板
- 二年級上冊數(shù)學教案-除法的初步認識(2)-西師大版
- 三年級上冊數(shù)學教學設計-5.1什么是周長 北師大版
- 六年級下冊數(shù)學教案-第一單元第3課時 問題解決(1) 西師大版
- 2025年購房合同模板文件
- 借住合同(2025年版)
- 學習2025年雷鋒精神六十二周年主題活動實施方案 (3份)-98
- 2025年學習雷鋒精神六十二周年主題活動方案
- 《線段、射線和直線》(教學設計)-2024-2025學年四年級上冊數(shù)學冀教版
- 《小小設計師》(教學設計)-2023-2024學年二年級下冊數(shù)學人教版
- 2024 年袋鼠數(shù)學競賽 等級E(中國區(qū))
- 2024年南京旅游職業(yè)學院單招職業(yè)適應性測試題庫匯編
- 2024-2030中國半導體閥門及管接頭市場現(xiàn)狀研究分析與發(fā)展前景預測報告
- 公務員面試考官培訓
- 2024年湖南生物機電職業(yè)技術學院單招職業(yè)技能測試題庫及一套參考答案
- 繽紛天地美食街運營方案
- 小學數(shù)學跨學科學習
- 2024年青島港灣職業(yè)技術學院單招職業(yè)技能測試題庫及答案解析
- 提高留置針規(guī)范使用率
- 4月23日幼兒園世界讀書日讀書繪本名人讀書故事春暖花開日正是讀書時課件
- 指導青年教師課堂教學活動方案
評論
0/150
提交評論