《C語言程序設計項目式教程》課件-CORE-03_第1頁
《C語言程序設計項目式教程》課件-CORE-03_第2頁
《C語言程序設計項目式教程》課件-CORE-03_第3頁
《C語言程序設計項目式教程》課件-CORE-03_第4頁
《C語言程序設計項目式教程》課件-CORE-03_第5頁
已閱讀5頁,還剩38頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

學習目標了解符號常量的用法掌握一維數組的定義和使用掌握二維數組及字符數組的定義和使用掌握邏輯運算,學會編寫復雜條件具備函數嵌套調用,及函數之間數據傳輸的能力學習路徑任務一在屏幕上顯示2019年1月的日歷,每行一周符號常量的定義

符號常量在使用之前必須先定義,其一般格式為:

其中#define是一條預處理命令(預處理命令都以"#"開頭),稱為宏定義命令,其功能是把該標識符定義為其后的常量值。一經定義,以后在程序中所有出現該標識符的地方均代之以該常量值(雙引號括起的除外)

#define標識符(符號常量名)常量值邏輯運算

(2)邏輯運算符的優先級和結合性

三個邏輯運算符中,邏輯非“!”的優先級最高,具有右結合性,其次是邏輯與“&&”,最后是邏輯或“||”,邏輯與和邏輯或都具有左結合性。它們的優先級為:!>&&>||。當一個復雜的表達式中既有算術運算符、關系運算符,還有邏輯運算符時,它們之間的優先級如下:算術運算符>關系運算符>邏輯運算符。使用符號常量的原因對于一個成熟的程序員來說,在一個程序中,反復多次使用的常量,都定義為符號常量,這是為什么呢?這主要是因為在程序中使用符號常量有明顯的好處。(1)見名知意,清晰明了。為了便于記憶,常常用一個能夠表示意義的單詞或字母組合來為符號常量命名,增強了程序的可讀性。(2)避免反復書寫,減少出錯率。如果一個程序中多次使用一個常量,就要多次書寫,而定義了符號常量,只需要書寫一次數值,在使用的地方用符號替代就可以了,能夠有效地減少出錯概率。(3)一改全改,方便實用。當程序中多次出現同一個常量需要修改時,必須逐個修改,很可能出錯。而用符號常量,在需要修改時,只需修改定義,就可以做到“一改全改”,非常方便。任務二并排顯示2019年前3個月的日歷,每行顯示每個月的同一周為什么要用數組

C語言引入了數組的概念,是為了方便在計算機中描述事物的某些特征及這些特征之間的聯系。數組相當于是由若干數據類型相同的變量組成的一個有序的集合,可以通過一個統一的數組名稱和一個位置編號的方式來訪問數組中的數據。下面通過介紹一個整型一維數組a,該數組中包含10個元素,用來表示10個學生成績。

通過數組名及其后面方括號[]內的下標,就可以引用數組中該元素。數組中第一個元素是下標為0的元素。因此,數組a的第1個元素記為a[0],數組a的第2個元素記為a[1],依次類推,數組a的第10個元素記為a[9],一般來說,數組a的第n個元素記為a[n-1]

一維數組的引用

聲明了數組以后,如何來使用數組中的元素呢?C語言規定只能逐個引用數組元素而不能一次引用整個數組,數組元素是組成數組的基本單元。數組元素也是一種變量,其標識方法為在數組名后跟一個下標,下標表示了元素在數組中的順序號。一維數組的引用格式如下:引用一維數組時應注意:(1)數組名是表示要引用哪一個數組中的元素,這個數組必須已經聲明。(2)下標用一對中括號[]括起來,它表示要引用數組中的第幾個元素,可以是變量表達式也可以是常量表達式。如為小數時,C編譯將自動取整。舉例如下代碼所示:數組名[下標]num[3];num[i+j];num[i++];一維數組的引用

(3)C語言規定,數組下標從0開始。一個含有n個元素的數組,數組下標的取值范圍為[0,n-1],舉例如下代碼所示:

其中,整型數組num的下標只能取0、1、2三個值,即可以引用數組元素num[0]、num[1]、num[2]。

如將上述程序段中第二行改為:num[3]=k;則錯誤,引用num[3]是超界的,它表示數組中的第四個元素。C語言編譯時并不指出“下標超界”的錯誤,而是把num[2]下面一個單元的內容作為num[3]引用,從而引起程序潛在的錯誤。因此,引用數組元素時要特別小心。intnum[3],k=10;num[0]=k;一維數組的初始化

與使用變量一樣,一維數組在使用之間必須進行聲明。一維數組的聲明格式如下:數據類型數組名[常量表達式];(1)數據類型用來聲明數組中各個數據元素的類型,如int、float、char等。在任何一個數組中,數據元素的類型都是一致的。(2)數組名的命名規則與變量名的命名規則一樣。(3)數組名中存放的是一個地址常量,它代表整個數組的首地址。同一數組中的所有元素,在內存單元中按其下標的順序占用一段連續的存儲單元。一維數組的邏輯結構與存儲結構是相同的,數組a的存儲結構為:(4)常量表達式的值表示數組元素的個數。常量表達式必須是整數或者整數表達式而不能有變量。常量表達式是放在一對中括號[]中。一維數組的初始化

數組聲明后,必須對其元素進行初始化。數組初始化是指在數組聲明時給數組元素賦予初值。可以在運行時顯示地初始化數組,也可以像普通變量一樣,在聲明數組同時初始化數組元素。這種方法是在編譯階段進行的,可以減少運行時間,提高效率。一維數組的初始格式如下:數據類型數組名[常量表達式]={初值表}任務三顯示2019年全年日歷,每3個月一排,每行顯示相鄰3個月的同一周二維數組的聲明

具有多個下標的數組稱為多維數組,其中最常用的是二維數組,主要用來表示數值表格。二維數組的聲明格式如下:

聲明二維數組時應注意:(1)與一維聲明基本相同,只多了一個常量表達式,表示二維。第一個常量表達式為行下標,聲明了這個數組的行數,第二個常量表達式為列下標,聲明了每行的列數。因此,元素個數=行數*列數。如上面二維數組a由3×4=12個元素組成。

數據類型數組名[常量表達式][常量表達式];二維數組的聲明(2)C語言把二維數組看成是一維數組,基元素又是一個一維數組。例如,a有三個元素a[0],a[1]和a[2],它們各自又可以看作為一個包含5個元素的一維數組(3)二維數組的元素在內存中按線性方式存放,即按行存放,先存放第一行的元素,再存放第二行的元素。數組a的存放順序為:

a[0][0]→a[0][1]→a[0][2]→a[0][3]→a[1][0]→a[1][1]→a[1][2]……→a[2][3]二維數組的引用

二維數組的引用格式如下:引用二維數組元素時,對數組下標的值要求與引用一維數組相同,即行或列下標表達式的值只能從0到數組所規定的下標上界之間的整數。數組名[下標]二維數組的初始化

在聲明二維數組同時,可以用下列方法給數組元素初始化:(1)按存放順序,舉例如下:二維數組的初始化

(2)按行分段初始化,舉例如下:結果與第一種方法相同,但更為直觀。有幾組用逗號分隔的大括號,就代表二維數組有幾行,而每組大括號有幾個用逗號分隔的數值,就代表該行有幾列。最后將所有的初始化內容用一對大括號括起來。這種方法特別適用于對數組部分元素賦初值,系統自動將沒有賦值的元素賦值成0,舉例如下:二維數組的初始化

(3)聲明同時對數組元素全部賦值,可省略第一維的長度,但必須指定其他維的長度,如下所示:根據初值的個數,編譯系統會自動確定第一維的下標,如下所示:編譯系統會根據初值數據的行數自動確定第一維下標的長度inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[][4]={{1},{},{9,10}};/*數組a中各元素如圖3-13(c)所示。*/字符數組與字符串的關系

用字符數組表示字符串時需注意:(1)'\0'代表字符串結束,處理字符數組時,一旦遇到該字符,剩下的字符就不再處理。(2)在進行字符串處理時,'\0'不作為字符串的有效字符進行處理,它只起到判別作用。(3)'\0'在字符數組中,仍占用一個單元,如字符串"program"的長度為7,但它卻占用了字符數組8個的單元的大小。因此,大小為n的字符數組最多只能存放長度為n-1的字符串,需要預留出字符串結束符'\0'的位置。字符數組的聲明

字符數組的聲明與前面介紹的類似。例如charc[10];/*一維字符數組,每個元素占用1個字節內存單元*/charc[3][4];/*二維字符數組,每個元素占用1個字節內存單元*/字符數組初始化字符數組可以使用這兩種方法來進行初始化。使用字符常量初始化數組,舉例如下(2)使用字符串常量(字符串)初始化數組,舉例如下:charc[10]={'C','','L','a','n','g','u','a','g','e'};/*聲明同時對各個元素賦初值*/charc[]={"CLanguage"};/*此時數組c長度為11*/charc[]="CLanguage";/*大括號也可以省略*/輸入輸出字符串

在C語言中,有兩個函數可以在控制臺(顯示器)上輸出字符串,它們分別是:puts():輸出字符串并自動換行,該函數只能輸出字符串。printf():通過格式控制符%s輸出字符串,不能自動換行。除了字符串,printf()還能輸出其他類型的數據。同樣在C語言中,有兩個函數可以讓用戶從鍵盤上輸入字符串,它們分別是:scanf():通過格式控制符%s輸入字符串。除了字符串,scanf()還能輸入其他類型的數據。gets():直接輸入字符串,并且只能輸入字符串。輸入輸出字符串使用格式符“%c”,以單個字符形式輸入輸出①在用鍵盤輸入字符串時,通常以回車符或空格符結束一個字符串的輸入。如本例,當輸入“abcdabcdabcd”時,實際存入字符數組c中的字符只有“abcd”,這一點請注意。②在未知字符串長度情況下,聲明字符數組長度時應盡量長些,但這勢必會造成資源浪費。我們可以用字符串初始化字符數組,就顯得方便多了。輸入輸出字符串使用格式符“%s”,以字符串整體形式輸入或輸出(1)輸出字符串時不包括'\0'。(2)用“%s”格式將字符串整體輸出時,在printf函數中輸出項應是字符數組名,而不是數組元素名。如printf("%s",c[i])是錯誤的。(3)如果數組長度字符串實際長度時,printf函數也只輸出到第一個'\0'為止。(4)使用scanf輸入整個字符串時,輸入項是字符數組名,不要再加地址符&,并且它應該是已經被聲明過。如:scanf("%s",c[i])或scanf("%s",&c[i])都是錯誤的。(5)利用scanf函數輸入多個字符串以空格分隔。字符串處理函數gets()函數gets()函數使用時格式如下所示:(1)與使用scanf的“%s”格式輸入字符串不同,gets()函數接受的字符串可以包含空格。(2)scanf()函數可以采用多個“%s”格式可以同時輸入多個字符串,而gets()函數一次只能輸入一個字符串,以回車符作為字符輸入結束。gets(字符數組名);字符串處理函數puts()函數puts()函數使用時格式如下所示:作用:將數組中的以‘\0’結束的字符串輸出,輸出完畢自動換行。它的功能與printf()的“%s”格式的功能基本相同,只是每次只能輸出一個字符串。puts(字符數組名);字符串處理函數strcat()字符串連接函數strcat()字符串連接函數使用時格式如下所示:作用:將字符數組1中的字符串結束符'\0'刪除,將字符數組2連接到字符數組1后面,并返回字符數組1的首地址。strcat(字符數組1,字符數組2);字符串處理函數strcpy()函數strcpy()函數使用時格如下所示:作用:把字符串數組2的內容拷貝到字符數組1中,拷貝結束后,系統會自動在字符數組1中加入結束符'\0'。strcpy(字符數組1,字符數組2);字符串處理函數strcmp()函數strcmp()函數使用時格式如下所示:作用:比較兩個字符串的大小,比較時對兩個字符串自左至右逐個字符按ASCII碼值大小比較,直到出現不同字符或'\0'為止。比較結果由函數值返回。字符串1>字符串2,函數返回值是正整數,為兩個字符串中第一個不同字符的ASCII碼值的差值。在字符串比較時,字符串結束符'\0'也參加比較。字符串1<字符串2,函數返回值是負整數,其它同上。字符串1=字符串2,函數返回值為0。C語言規定,不能使用“==”比較兩個字符串,只能用strcmp()函數來處理。strcmp(字符數組1,字符數組2);字符串處理函數strlen()函數strlen()函數使用時格式如下所示:作用:測試字符串長度,函數的返回值為字符實際長度,不包含“\0”。strlen(字符數組名/字符串);任務四輸入年份,顯示該年的日歷,每3個月一排,每行顯示相鄰3個月的同一周任務技能變量(1)變量的作用域

函數形參變量只在被調用期間才分配內存單元,調用結束立即釋放。這一點表明形參變量只有在函數內才是有效的,離開該函數就不能再使用了。這種變量有效性的范圍稱變量的作用域。不僅對于形參變量,C語言中所有的變量都有自己的作用域。變量說明的方式不同,其作用域也不同。在C語言中,按作用域范圍不同可分為局部變量和全局變量。任務技能變量(2)局部變量

局部變量也稱為內部變量。局部變量是在函數體內聲明的變量。其作用域僅限于函數內,離開聲明它的函數后就失去作用。任務技能變量關于局部變量的作用域的幾點說明:(1)main()中定義的變量也只能在main()中使用,不能在其它函數中使用。同時,main()中也不能使用其它函數中定義的變量,因為main()也是一個函數,它與其它函數是平行關系。這一點與其它語言不同的,應予以注意。(2)形參變量是屬于被調函數的局部變量,實參變量是屬于主調函數的局部變量。(3)允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發生混淆。(4)在復合語句中也可定義變量,其作用域只在復合語句范圍內。任務技能變量(3)全局變量全局變量也稱為外部變量,它是在任何一個函數體外定義的變量,它不屬于任何函數,它屬于整個源程序文件,即其作用域是從其定義之處到整個源程序結束。在一個函數中既可以使用本函數中的局部變量,又可以使用有效的全局變量。在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。任務技能變量關于局部變量和全局變量的幾點說明:(1)對于局部變量的定義和聲明,可以不加區分。但對于全局變量則不然,全局變量的定義和聲明有不同的涵義。全局變量的定義必須在所有函數體之外,且只能有一次。(2)全局變量可加強函數模塊之間的數據聯系,但是又使函數要依賴這些變量,因而使得函數的獨立性降低。從模塊化程序設計的觀點來看這是不利的,因此在不必要時盡量不要使用全局變量。(3)在同一源文件中,允許全局變量和局部變量同名。在局部變量的作用域內,全局變量不起作用。(4)外部變量和全局變量是對同一類變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量從它的存儲方式提出的,表示了它的生存期。當一個源程序由若干個源文件組成時,在一個源文件中定義的外部變量在其它的源文件中也有效。(5)程序在內存中存在期間,外部變量始終存在,不會隨著函數的調用或退出而存在或消失。任務技能變量(4)變量的存儲類型變量的存儲方式可分為靜態存儲和動態存儲兩種。靜態存儲變量通常是在變量定義時就分配存儲單元并一直保持不變,直至整個程序結束。動態存儲變量是在程序執行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數的形參,在函數定義時并不給形參分配存儲單元,只是在函數被調用時,才予以分配,調用函數完畢立即釋放。如果一個函數被多次調用,則反復地分配、釋放形參變量的存儲單元。從以上分析可知,靜態存儲變量是一直存在的,而動態存儲變量則時而存在時而消失。這種由于變量存儲方式不同而產生的特性稱變量的生存期。生存期表示了變量存在的時間。生存期和作用域是從時間和空間這兩個不同的角度來描述變量的特性,這兩者既有聯系,又有區別。一個變量究竟屬于哪一種存儲方式,并不能僅從其作用域來判斷,還應有明確的存儲類型說明。在C語言中,對變量的存儲類型說明有四種:自動變量(auto)、靜態變量(static)、外部變量(extern)和寄存器變量(register)。自動變量和寄存器變量屬于動態存儲方式,外部變量和靜態變量屬于靜態存儲方式。在介紹了變量的存儲類型之后,可以知道對一個變量的說明不僅應說明其數據類型,還應說明其存儲類型。任務技能變量自動變量

自動變量具有以下特點:(1)自動變量的作用域僅限于定義該變量的個體內。在函數中定義的自動變量,只在該函數內有效。在復合語句中定義的自動變量只在該復合語句中有效。(2)自動變量屬于動態存儲方式,只有在定義該變量的函數被調用時才給它分配存儲單元,開始它的生存期。函數調用結束,釋放存儲單元,結束生存期。因此函數調用結束之后,自動變量的值不能保留。在復合語句中定義的自動變量,在退出復合語句后也不能再使用,否則將引起錯誤。(3)由于自動變量的作用域和生存期都局限于定義它的個體內(函數或復合語句內),因此不同的個體中允許使用同名的變量而不會混淆。即使在函數內定義的自動變量也可與該函數內部的復合語句中定義的自動變量同名。例如,例9-6中的變量k。任務技能變量靜態變量靜態變量的類型說明符是static,屬于靜態存儲方式。但是屬于靜態存儲方式的量不一定就是靜態變量,例如外部變量雖屬于靜態存儲方式,但不一定是靜態變量,必須由static加以定義后才能成為靜態外部變量,或稱靜態全局變量。靜態局部變量具有以下特點:①靜態局部變量在函數內定義,但不象自動變量那樣,當調用時就存在,退出函數時就消失。靜態局部變量始終存在著,也就是說它的生存期為整個源程序。②靜態局部變量的生存期雖然為整個源程序,但是其作用域仍與自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數后,盡管該變量還繼續存在,但不能使用它。③對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。任務技能變量靜態全局變量全局變量的聲明之前加上sta

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論