C語言程序設計課件_第1頁
C語言程序設計課件_第2頁
C語言程序設計課件_第3頁
C語言程序設計課件_第4頁
C語言程序設計課件_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

-.z.程序設計語言一般分為機器語言、匯編語言和高級語言三大類。1.機器語言對于計算機來說,一組機器指令就是程序,稱為機器語言程序。2.匯編語言為了便于理解與記憶,人們采用能幫助記憶的英文縮寫符號(稱為指令助記符)來代替機器語言指令代碼中的操作碼,用地址符號來代替地址碼。3.高級語言機器語言和匯編語言都是面向機器的語言,一般稱為低級語言。例2.1編寫一個C程序,其功能是顯示字符串“Howdoyoudo!”。其C程序如下:*include"stdio.h"main(){printf("Howdoyoudo!\n");}下面針對一般的C程序作幾點說明:(1)一個完整的C語言程序可以由多個函數(shù)組成,但必須包含一個且只能包含一個名為main的函數(shù)(主函數(shù))。程序總是從main函數(shù)開始執(zhí)行。(2)在一個C函數(shù)模塊中,由左右花括號{}括起來的部分是函數(shù)體,其中的語句系列實現(xiàn)函數(shù)的預定功能。(3)C程序中的每一個語句必須以“;”結束,但書寫格式是自由的。(4)*include是編譯預處理命令,其作用是將雙引號或尖括號括起來的文件容讀到該命令的位置處。(5)在C程序的任何位置處都可以用/*......*/作注釋,以提高程序的可讀性。整型常量及其變量的定義1.整型常量在C語言中,有3種類型的整型常量:基本整型常量、長整型常量、無符號整型常量。在C語言中,不管是哪種類型的整型常量,都可以用3種數(shù)制表示。(1)十進制整型常量。(2)十六進制整型常量。(3)八進制整型常量。2.整型變量的定義在C程序中,用于存放整型數(shù)據(jù)的變量稱為整型變量。在C語言中,可以定義基本整型、長整型、短整型和無符號整型等4種類型的整型變量。它們的定義方式如下。(1)基本整型變量定義基本整型變量的形式如下:int變量表列;(2)長整型定義長整型變量的形式如下:long[int]變量表列;(3)短整型定義短整型變量的形式如下:short[int]變量表列;(4)無符號整型定義無符號基本整型變量的形式如下:unsigned[int]變量表列;①一個類型說明語句可以同時定義多個同類型的變量,各變量之間用逗號“,”分隔。②用類型說明語句定義的變量只是說明了為這些變量分配了存儲空間,以便用于存放與之相同類型的數(shù)據(jù),在未對這些變量賦值前,這些變量中(即存儲空間中)的值是隨機的。③C語言允許在定義變量的同時為變量賦初值。④在為整型變量初始化或賦值時,C編譯系統(tǒng)自動將被賦數(shù)據(jù)轉換成與相應變量的類型一致。⑤由于各種整型變量所占的字節(jié)數(shù)有限,因此,它們所能存放的整數(shù)有一定的圍。實型常量及其變量的定義1.實型(浮點型)常量(1)十進制數(shù)形式(2)指數(shù)形式(科學記數(shù)法)2.實型變量的定義在C程序中,用于存放實型數(shù)據(jù)的變量稱為實型變量。在C語言中,實型變量有單精度與雙精度兩種。單精度float雙精度double字符型常量及其變量的定義1.字符型常量'\n'換行'\r'回車'\b'退格'\t'制表(橫向跳格)'\''單引號(單撇號)'\"'雙引號(雙撇號)'\ddd'1~3位八進制數(shù)所代表的ASCII碼字符'\*hh'1~2位十六進制數(shù)所代表的ASCII碼字符'\f'走紙換頁‘\\’反斜杠字符2.字符型變量的定義字符型變量的定義方式如下:char變量表列;數(shù)據(jù)的輸入與輸出應包括以下幾項:①輸入(出)的設備②輸入(出)的格式③輸入(出)的容格式輸出函數(shù)格式輸出函數(shù)的一般形式如下:printf(*“格式控制”,輸出表);其中格式控制部分要用一對雙撇號括起來,它用于說明輸出項目所采用的格式。1.整型格式說明符(1)十進制形式(2)八進制形式(3)十六進制形式2.實型格式說明符如果以十進制數(shù)形式輸出實型數(shù)據(jù),其格式說明符為%f或%m.nf如果以指數(shù)形式輸出實型數(shù)據(jù),其格式說明符為%e或%m.ne3.字符型格式說明符字符型數(shù)據(jù)的格式說明符為%c或%mc(1)輸出表中各輸出項目之間要用“,”分隔。(2)格式控制中的各格式說明符與輸出表中的各輸出項目在個數(shù)、次序、類型等方面必須一一對應。(3)格式控制中除格式說明符外的其他字符將按原樣輸出。(4)在輸出格式說明符中,如果帶有寬度說明,則在左邊沒有數(shù)字的位置上用空格填滿(即輸出的數(shù)字是右對齊)。但如果在寬度說明前加一個負號(-),則輸出為左對齊,即在右邊補空格。格式輸入函數(shù)格式輸入函數(shù)的一般形式如下:scanf(“格式控制”,存地址表);1.整型格式說明符(1)十進制形式用于輸入十進制形式的整型數(shù)據(jù)。(2)八進制形式用于輸入八進制形式的整型數(shù)據(jù)。(3)十六進制形式用于輸入十六進制形式的整型數(shù)據(jù)。2.實型格式說明符用于輸入的單精度實型格式說明符為%f或%e用于輸入的雙精度實型格式說明符為%lf3.字符型格式說明符用于輸入的字符型格式說明符為%c或%mc賦值運算賦值運算符為“=”。賦值表達式為變量名=表達式(1)在C語言中,“=”為賦值運算符,而不是等號;(2)賦值運算符“=”左邊必須是變量名,不能是表達式;(3)賦值運算符“=”兩端的類型不一致時,系統(tǒng)將自動進行類型轉換。算術運算在C語言中,基本的算術運算符有以下幾個:+加法運算符(雙目運算符),或正值運算符(單目運算符)。如*+y,+*。-減法運算符(雙目運算符),或負值運算符(單目運算符)。如a-3,-*。*乘法運算符(雙目運算符)。如3**。/除法運算符(雙目運算符)。如*/y。%模余運算符(雙目運算符)。只適用于整型數(shù)據(jù),如9%4的值為1,11%3的值為2等。關系運算在C語言中,基本的關系運算符有以下6個:<小于<=小于或等于>大于>=大于或等于==等于!=不等于結果只有兩個:true或者false執(zhí)行int*=2,y=3;后表達式*=(y==3)的值是(1)邏輯運算在C語言中,邏輯常量只有兩種:值非零表示“真”,值為零表示“假”。其基本的邏輯運算符有以下3個:&&(邏輯與)兩個量都為真時為真(1),否則為假(0)||(邏輯或)兩個量中只要有一個為真時為真(1),只有都為假時為假(0)!(邏輯非)一個量為真時為假(0),假時為真(1)自增++與自減--運算符增1運算符“++”和減1運算符“--”是兩個單目(只有一個運算對象)運算符,它們的運算對象只能是整型或字符型變量。增1運算符是將運算對象的值增1;減1運算符是將運算對象的值減1。假設定義變量inta=5;intb;前綴自增b=++a;//a=6b=6后綴自增b=a++;//a=6b=5sizeof運算符sizeof運算符有以下兩種用法:(1)用于求得表達式計算結果所占存的字節(jié)數(shù)。其一般形式為sizeof表達式(2)用于求得*種數(shù)據(jù)類型的量所占存的字節(jié)數(shù)。其一般形式為sizeof(類型名)逗號運算符逗號“,”是C程序中常見的符號。在C語言中,逗號除作為分隔符使用外,還可以作為運算符來使用,稱為逗號運算符。逗號表達式的一般形式為子表達式1,子表達式2,…,子表達式n在使用逗號運算符(逗號表達式)時,要注意以下幾點:(1)逗號運算符是所有運算符中級別最低的一種運算符。(2)一個逗號表達式又可以與另一個表達式(可以是逗號表達式,也可以不是逗號表達式)連接成新的逗號表達式。(3)在許多情況下,使用逗號表達式的目的僅僅是為了得到各個子表達式的值,而并不一定要得到或使用整個逗號表達式的值。C語言中的宏定義有兩種形式:符號常量定義與帶參數(shù)的宏定義。符號常量定義在C語言中,允許將程序中多處用到的“字符串”定義成一個符號常量。在C語言中定義符號常量的一般形式如下:*define符號常量名字符串①由于C語言中的所有變量名、函數(shù)名等都使用小寫字母,因此,符號常量名一般用大寫字母表示,以便與C語言中的保留關鍵字相區(qū)別。②C編譯系統(tǒng)對定義的符號常量的處理只是進行簡單的替換,不作任何語法檢查。③*define是一個命令,而不是語句,因此在行末不能加“;”,并且應獨立占一行。④*define命令一般應出現(xiàn)在程序中函數(shù)的外面,其作用域圍是從*define符號常量名字符串到*undef符號常量名(或文件末)帶參數(shù)的宏定義帶參數(shù)的宏定義的一般形式為*define宏名(參數(shù)表)字符串其中字符串中應包含在參數(shù)表中所指定的參數(shù),并且,當參數(shù)表中的參數(shù)多于一個時,各參數(shù)之間要用逗號分隔。在使用帶參數(shù)的宏定義時,應注意以下兩個問題。(1)在使用帶參數(shù)的宏定義時,一般應將宏定義字符串中的參數(shù)都要用括號括起來,否則經(jīng)過宏展開后,可能會出現(xiàn)意想不到的錯誤。(2)在使用帶參數(shù)的宏定義時,除了應將宏定義字符串中的參數(shù)都要用括號括起來,還需要將整個字符串部分也要用括號括起來,否則經(jīng)過宏展開后,還會可能出現(xiàn)意想不到的錯誤。書寫一個求最大值的宏定義*defineMA*(a,b)((a>b)"(a),(b))3.1語句與復合語句在C語言中,一個表達式后面跟隨一個分號就構成了一個語句,這種語句稱為表達式語句。在C語言中,分號(;)是表達式語句的終結符,而不是語句之間的分隔符,也就是說,分號是表達式語句的一個組成部分,只不過它位于表達式的后面。在一個函數(shù)體部,由左、右花括號括起來的語句稱為復合語句,它的一般形式為{說明部分;語句部分;}3.2if語句If語句的形式為if(表達式)語句這種選擇結構的流程圖如圖3.1所示。下面對if語句作幾點說明:(1)if語句中的邏輯表達式(即條件)必須要用一對圓括號括起來。(2)if語句后的語句可以是復合語句。(3)一個if語句最后需要強調(diào)的是,在使用if語句時,一定要注意邏輯表達式的正確寫法,特別是在連續(xù)使用多個if語句時更要注意。3.3if…else結構在C語言中,if…else結構的語句形式為if(表達式)語句1else語句2下面對if…else結構作以下幾點說明:(1)if…else結構中的語句1與語句2都可以是復合語句。(2)在if…else結構中,語句1與語句2都可以是空語句。(3)在if…else結構中,如果在else前面有多個if語句,則else與最近的if配對。(4)如果有多個if……else結構嵌套如下:if(表達式1)語句1elseif(表達式2)語句2else…elseif(表達式n)語句nelse語句n+1則可簡寫成if(表達式1)語句1elseif(表達式2)語句2…elseif(表達式n)語句nelse語句n+1在if…else結構中,如果語句1與語句2都是單一的賦值語句,并且都是給同一個變量賦值,則可以用條件運算符來進行處理。下面對條件表達式作幾點說明:(1)條件運算符優(yōu)先級要比賦值運算符高。(2)條件運算符的優(yōu)先級比關系運算符與算術運算符都要低,因此,條件表達式中的“表達式1”、“表達式2”與“表達式3”都不必用括號括起來。(3)條件運算符的結合方向為“從右到左”。在C語言中提供了一個直接實現(xiàn)多路分支選擇的結構,稱為switch結構,其一般形式如下:switch(表達式){case常量表達式1:語句1case常量表達式2:語句2…case常量表達式n:語句ndefault:語句n+1}下面對switch結構作幾點說明:(1)switch結構中的表達式、常量表達式1、…、常量表達式n必須是整型或字符型。這是因為,在switch結構中,其分支數(shù)一般是有限的,并且是離散的,因此,其表達式的值也應是有限的,且是離散的。(2)同一個switch結構中的常量表達式值必須互不相同,否則就會出現(xiàn)矛盾的現(xiàn)象,即對于“表達式”的同一個值對應多種執(zhí)行方案,這是錯誤的。(3)在switch結構中,case與default的順序可以任意,各case之間的順序也可以任意。(4)在執(zhí)行switch結構時,當執(zhí)行完*case后的語句后,將順序執(zhí)行后面case后的語句,直到遇break語句才退出整個switch結構的執(zhí)行。(5)在switch結構中,如果沒有default且“表達式”值不等于任何case后常量表達式的值,則直接退出switch結構而轉到其后的語句執(zhí)行。例3.12計算獎金。當企業(yè)利潤P等于或低于0.5萬元時,獎金為利潤的1%;當0.5<P≤1萬元時,超過0.5萬元部分的獎金為利潤的1.5%,0.5萬元以下仍按1%計算;當1<P≤2萬元時,1萬元以下部分仍按前面的方法計算,超過1萬元的部分其獎金按利潤的2%計算;當2<P≤5萬元時,2萬元以下部分仍按前面的方法計算,超過2萬元部分的獎金按利潤的2.5%計算;當5<P≤10萬元時,5萬元以下部分仍按前面的方法計算,超過5萬元部分的獎金按利潤的3%計算;當P>10萬元時,10萬元以下部分仍按前面的方法計算,超過10萬元部分按3.5%計算。其中P由鍵盤輸入,計算并輸出相應的獎金數(shù)W。根據(jù)圖3.5所示的流程圖,用if…elseif結構寫出C程序如下:*include"stdio.h"main(){floatp,w;printf("inputp:");scanf("%f",&p);if(p<=0.0)w=0.0;elseif(p<=0.5)w=0.01*p;elseif(p<=1.0)w=0.005+0.015*(p-0.5);elseif(p<=2.0)w=0.0125+0.02*(p-1.0);elseif(p<=5.0)w=0.0325+0.025*(p-2.0);elseif(p<=10.0)w=0.1075+0.03*(p-5.0);elsew=0.2575+0.035*(p-10.0);printf("w=%f\n",w);}例3.14求解一元二次方程A*2+B*+C=0。相應的C程序如下:*include"stdio.h"*include"math.h"main(){doublea,b,c,d,*1,*2,p;printf("inputa,b,c:");scanf("%lf%lf%lf",&a,&b,&c);if(a==0.0){if(b==0.0)printf("ERR\n");elseprintf("*=%f\n",-c/b);}elseif(b==0.0){d=c/a;if(d<=0.0){printf("*1=%f\n",sqrt(-d));printf("*2=%f\n",-sqrt(-d));}else{printf("*1=+j%f\n",sqrt(d));printf("*2=-j%f\n",sqrt(d));}elseif(c==0.0){printf("*1=0.0\n");printf("*2=%f\n",-b/a);}else{d=b*b-4*a*c;if(d>=0.0){d=sqrt(d);if(b>0.0)*1=(-b-d)/(2*a);else*1=(-b+d)/(2*a);*2=c/(a**1);printf("*1=%f\n",*1);printf("*2=%f\n",*2);}else{d=sqrt(-d)/(2*a);p=-b/(2*a);printf("*1=%f+j%f\n",p,d);printf("*2=%f-j%f\n",p,d);}}}當型循環(huán)結構當型循環(huán)結構的流程圖如圖4.1所示。while循環(huán)實現(xiàn)當型循環(huán)結構的C語句形式為while(表達式)循環(huán)體語句功能:當表達式值≠0時,執(zhí)行循環(huán)體,執(zhí)行完后繼續(xù)判斷表達式值,只有當表達式值=0時才退出循環(huán)。例4.2從鍵盤輸入各學生成績,并對90分以上(包括90分)的學生人數(shù)進行計數(shù),直到輸入的成績?yōu)樨摓橹?,最后輸出成績?0分以上的學生人數(shù)。其流程圖如圖4.3所示。其中變量count為整型,用于對90分以上的學生人數(shù)進行計數(shù)。相應的C程序如下:*include"stdio.h"main(){intcount;floatgrade;count=0;scanf("%f",&grade);while(grade>=0.0){if(grade>=90.0)count=count+1;scanf("%f",&grade);}printf("count=%d\n",count);}直到型循環(huán)結構直到型循環(huán)結構的流程圖如圖4.4所示。do__while循環(huán)do_while循環(huán)的執(zhí)行過程是,首先執(zhí)行循環(huán)體,然后判斷條件(即計算邏輯表達式),如果條件滿足(即邏輯表達式值為真),則退出循環(huán)結構;如果條件不滿足(即邏輯表達式值為假),則繼續(xù)執(zhí)行循環(huán)體。實現(xiàn)直到型循環(huán)結構的C語句形式為do循環(huán)體語句while(表達式);功能:先執(zhí)行循環(huán)體,然后判斷表達式值,若表達式值≠0,則再次執(zhí)行循環(huán)體,如此循環(huán),直到表達式值=0為止。例4.3計算并輸出下列級數(shù)和:直到*項的絕對值小于為止相應的流程圖如圖4.5所示。其中f用于改變每一項的符號,因為這是一個各項符號相間的級數(shù)。相應的C程序如下:*include"stdio.h"main(){intk;doublesum,d,f;sum=1.0;k=1;f=1.0;do{k=k+1;f=-f;d=1.0/(k*(k+1));sum=sum+f*d;}while(d>=1.0e-4);printf("sum=%lf\n",sum);}當型循環(huán)結構與直到型循環(huán)結構的區(qū)別與聯(lián)系當型循環(huán)結構與直到型循環(huán)結構既有共同之處,又有區(qū)別。主要體現(xiàn)在以下幾個方面。(1)在while循環(huán)中,其循環(huán)體可以一次也不執(zhí)行(即執(zhí)行while循環(huán)結構的一開始,其條件就不滿足)。(2)不管是while循環(huán)結構還是do—while循環(huán)結構,在循環(huán)體部必須要有能改變條件(即邏輯表達式值)的語句,否則將造成死循環(huán)。(3)對于有些問題既可以用while循環(huán)結構來處理,也可以用do—while循環(huán)結構來處理。(4)不管是while循環(huán)結構還是do—while循環(huán)結構,其循環(huán)體如果包含一個以上的語句,應以復合語句形式出現(xiàn)。C語言提供的for循環(huán)屬于當型循環(huán)結構,其一般形式為for(表達式1;表達式2;表達式3)循環(huán)體語句(組)它等價于下列的當型循環(huán)結構:表達式1;while(表達式2){循環(huán)體語句表達式3;}下面對for循環(huán)語句作幾點說明:(1)在for語句中,三個表達式中的任何一個表達式均可省略,但其中的兩個“;”不能省略。(2)下列兩個循環(huán)都是死循環(huán):for(表達式1;;表達式3)循環(huán)體與for(;;)循環(huán)體因為它們都沒有用于判斷循環(huán)是否結束的條件(即表達式2)。(3)for循環(huán)本質上也是當型循環(huán)結構,只不過它對于事先可以確定循環(huán)次數(shù)的問題特別方便。(4)在for循環(huán)中,循環(huán)體也可以是復合語句(即用一對花括號{}括起來的語句組)。循環(huán)的嵌套所謂循環(huán)的嵌套是指一個循環(huán)體又包含了另一個完整的循環(huán)結構。C語言允許循環(huán)結構嵌套多層。循環(huán)的嵌套結構又稱為多重循環(huán)。例4.6計算并輸出10以(包括10)所有自然數(shù)的階乘值。即計算1!,2!,3!,4!,5!,6!,7!,8!,9!,10!。采用的方法是,對于10以的每一個自然數(shù)分別求它們的階乘值。其流程圖如圖4.7所示。顯然,這是一個二重循環(huán)結構。相應的C程序如下:*include"stdio.h"main(){intn,k;doubles;for(n=1;n<=10;n=n+1){s=1.0; for(k=1;k<=n;k=k+1)s=s*k; printf("%2d!=%16.7f\n",n,s);}}break語句C語言中的break語句有以下兩個功能:(1)跳出switch結構;(2)退出當前循環(huán)結構,包括while結構、do…while結構和for循環(huán)結構。continue語句continue語句的功能是結束本次循環(huán)的執(zhí)行,但不退出循環(huán)結構。下面舉兩個例子來說明continue語句的使用。例4.10輸出100~200之間所有能被7或9整除的自然數(shù)。相應的C程序如下:*include"stdio.h"main(){intn;for(n=100;n<=200;n=n+1){if(n%7!=0)&&(n%9!=0))continue;/*結束本次循環(huán),繼續(xù)進行下次循環(huán)*/printf("%d\n",n);}實際上,上述程序等價于*include"stdio.h"main(){intn;for(n=100;n<=200;n=n+1){if(n%7==0)||(n%9==0))printf("%d\n",n);}}函數(shù)的概念在C語言中,函數(shù)分為以下兩種。(1)標準庫函數(shù)這種函數(shù)用戶不必定義,但可直接使用。例如scanf(),printf(),fabs(),sqrt(),e*p(),sin(),cos()等都是C語言中常用的庫函數(shù)。(2)用戶自己定義的函數(shù)這種函數(shù)用以解決用戶的專門問題,一般由用戶自己編寫。例5.1從鍵盤輸入兩個正整數(shù)m與n(m≥n),求的值(即求)。其C程序如下:*include"stdio.h"main()/*主函數(shù)*/{intm,n;intp();/*說明本函數(shù)中要調(diào)用的函數(shù)p()是整型*/scanf("%d,%d",&m,&n);if(m>=n)printf("%d\n",p(m)/p(m-n));elseprintf("m<n!\n");}intp(k)/*計算階乘值的函數(shù)*/intk;{ints,i;s=1;for(i=1;i<=k;i=i+1)s=s*i;return(s);}下面對函數(shù)作幾點說明:(1)一個完整的C程序可以由若干個函數(shù)組成,其中必須有一個且只能有一個主函數(shù)main()。(2)一個完整C程序中的所有函數(shù)可以放在一個文件中,也可以放在多個文件中。①在編譯命令行中鍵入各個函數(shù)所在的文件名(各文件名之間用空格分隔)。②在主函數(shù)中用*include語句將各函數(shù)所在的文件包含進來。(3)C語言中的函數(shù)沒有從屬關系,各函數(shù)之間互相獨立,可以互相調(diào)用。函數(shù)的定義在C語言中,函數(shù)定義的一般形式為類型標識符函數(shù)名(形參表列)形參類型說明{說明部分語句部分}在定義C函數(shù)時要注意以下幾點。(1)函數(shù)類型標識符同變量類型說明符,它表示返回的函數(shù)值類型。(2)如果省略函數(shù)的類型標識符,則默認為是int型。(3)C語言允許定義空函數(shù)。如dummy(){}(4)函數(shù)中返回語句的形式為return(表達式);或return表達式;(5)如果“形參表列”中有多個形式參數(shù),則它們之間要用“,”分隔。(6)C語言允許在形參表中直接對形參的類型進行說明。函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為函數(shù)名(實參表列)(1)函數(shù)調(diào)用可以出現(xiàn)在表達式中(有函數(shù)值返回);也可以單獨作為一個語句(無函數(shù)值返回)。(2)實參表中的各實參可以是表達式,但它們的類型和個數(shù)應與函數(shù)中的形參一一對應。(3)在調(diào)用函數(shù)中,通常要對被調(diào)用函數(shù)的返回值類型進行說明(一般在調(diào)用函數(shù)的函數(shù)體中的說明部分),包括函數(shù)類型、函數(shù)名和一對圓括號。例5.2下列程序的功能是計算輸出一個圓臺兩底面積之和。*include"stdio.h"main(){doubler1,r2;doubleq();printf("inputr1,r2:");scanf("%lf,%lf",&r1,&r2);printf("s=%f\n",q(r1,r2));}doubleq(*,y)double*,y;{doubles;s=3.1415926*(***+y*y);return(s);}但C語言規(guī)定,在以下幾種情況下可以不在調(diào)用函數(shù)中對被調(diào)用函數(shù)作類型說明:①被調(diào)用函數(shù)為整型或字符型,自動按整型處理。②被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用函數(shù)之前。③在調(diào)用函數(shù)之前已經(jīng)由別的函數(shù)(它可能也要調(diào)用該被調(diào)用函數(shù))對被調(diào)用函數(shù)作了類型說明。(4)C語言雖不允許嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù)。形參與實參的結合方式1.地址結合所謂地址結合,是指在一個模塊調(diào)用另一個模塊時,并不是將調(diào)用模塊中的實參值直接傳送給被調(diào)用模塊中的形參,而只是將存放實參的地址傳送給形參。2.數(shù)值結合所謂數(shù)值結合,是指調(diào)用模塊中的實參地址與被調(diào)用模塊中的形參地址是互相獨立的,在一個模塊調(diào)用另一個模塊時,直接將實參值傳送給形參被存放在形參地址中。例5.3分析下列C程序:voidswap(*,y)int*,y;{intt;t=*;*=y(tǒng);y=t;return;}*include"stdio.h"main(){int*,y;scanf("*=%d,y=%d",&*,&y);swap(*,y);printf("*=%d,y=%d\n",*,y);}在這個程序中共有兩個函數(shù)。在主函數(shù)中分別為整型變量*與y輸入數(shù)據(jù),然后調(diào)用函數(shù)swap(*,y)。而函數(shù)swap(*,y)的功能是實現(xiàn)變量*值與y值的交換。但在實際運行該程序時,如果從鍵盤輸入*=6,y=8則輸出的結果為*=6,y=8即沒有達到交換的目的。這是因為在主函數(shù)中調(diào)用函數(shù)swap()時,只是將實參*和y的值分別傳遞給了swap()函數(shù)中的形參*和y,但由于主函數(shù)中的實參*和y與函數(shù)swap()中的形參*和y在計算機中的存儲地址是不同的,因此,在函數(shù)swap()中雖然交換了形參*與y的值,但實參*與y的值實際上沒有改變,即它們沒有被交換。由此可以看出,在形參與實參為數(shù)值結合的情況下,實參與形參在計算機存中的存儲地址不是同一個,因此,即使在被調(diào)用函數(shù)中改變了形參值,調(diào)用函數(shù)中的實參值也是不會被改變的。局部變量與全局變量1.局部變量在函數(shù)部定義的變量稱為局部變量。函數(shù)部定義的變量只在該函數(shù)圍有效,因此,不同函數(shù)中的局部變量可以重名,互不混淆。2.全局變量在函數(shù)外定義的變量稱為全局變量除非十分必要,一般不提倡使用全局變量,其原因有以下幾點:①由于全局變量屬于程序中的所有函數(shù),因此,在程序的執(zhí)行過程中,全局變量都需要占用存儲空間,即使實際正在執(zhí)行的函數(shù)中根本用不著這些全局變量,它們也要占用存儲空間。②在函數(shù)中使用全局變量后,要求在所有調(diào)用該函數(shù)的調(diào)用程序中都要使用這些全局變量,從而會降低函數(shù)的通用性。③在函數(shù)中使用全局變量后,使各函數(shù)模塊之間的互相影響比較大,從而使函數(shù)模塊的“聚性”差,而與其他模塊的“耦合性”強。④在函數(shù)中使用全局變量后,會降低程序的清晰性,可讀性差。動態(tài)存儲變量與靜態(tài)存儲變量1.用戶程序的存儲分配一般來說,用戶程序在計算機中的存儲分配如圖5.1所示。其中:程序區(qū)用于存放程序;靜態(tài)存儲區(qū)是在程序開始執(zhí)行時就分配的固定存儲單元,如全局變量;動態(tài)存儲區(qū)是在函數(shù)調(diào)用過程中進行動態(tài)分配的存儲單元,如函數(shù)形參、自動變量、函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等。2.變量的存儲類型①數(shù)據(jù)類型:如整型(int)、實型(float)、字符型(char)、雙精度型(double)等。②數(shù)據(jù)的存儲類型:分為自動類型(auto)、靜態(tài)類型(static)、寄存器類型(register)、外部類型(e*tern)。例5.4計算并輸出1~5的階乘值。其C程序如下:intfac(n)intn;{staticintf=1;f=f*n;return(f);}*include"stdio.h"main(){inti;for(i=1;i<=5;i=i+1)printf("%d!=%d\n",i,fac(i));}下面對靜態(tài)存儲變量作幾點說明:①形參不能定義成靜態(tài)類型。②對局部靜態(tài)變量賦初值是在編譯時進行的,在調(diào)用時不再賦初值;而對自動變量賦初值是在調(diào)用時進行的,每次調(diào)用將重新賦初值。③定義局部靜態(tài)變量時若不賦初值,則在編譯時將自動賦初值0;但在定義自動變量時若不賦初值,則其初值為隨機值。④若無多大必要,盡量不用局部靜態(tài)變量。3.外部變量全局變量如果在文件開頭定義,則在整個文件圍的所有函數(shù)都可以使用該變量。一般來說,全局變量有以下幾種用法:①在同一文件中,為了使全局變量定義點之前的函數(shù)中也能使用該全局變量,則應在函數(shù)中用e*tern加以說明。②使一個文件中的函數(shù)也能用另一個文件中的全局變量。③利用靜態(tài)外部變量,使全局變量只能被本文件中的函數(shù)引用。部函數(shù)與外部函數(shù)在C語言中,函數(shù)可以分為部函數(shù)與外部函數(shù)。只能被本文件中其他函數(shù)調(diào)用的函數(shù)稱為部函數(shù),部函數(shù)又稱為靜態(tài)函數(shù)。定義部函數(shù)的形式如下:static類型標識符函數(shù)名(形參表)定義外部函數(shù)的形式如下:[e*tern]類型標識符函數(shù)名(形參表)人們在解決一些復雜問題時,為了降低問題的復雜程度(如問題的規(guī)模等),一般總是將問題逐層分解,最后歸結為一些最簡單的問題。例5.5編寫一個C函數(shù),對于輸入的參數(shù)n,依次打印輸出自然數(shù)1到n。這是一個很簡單的問題,實際上不用遞歸就能解決,其C函數(shù)如下:*include"stdio.h"wrt(intn){intk;for(k=1;k<=n;k++)printf("%d\n",k);return;}解決這個問題還可以用以下的遞歸函數(shù)來實現(xiàn):*include"stdio.h"wrt1(intn){if(n!=0){wrt1(n-1);printf("%d\n",n);}return;}功能:對于輸入的參數(shù)n,依次打印輸出自然數(shù)1到n自己調(diào)用自己的過程稱為遞歸調(diào)用過程。在C語言中,自己調(diào)用自己的函數(shù)稱為遞歸函數(shù)。遞歸分為直接遞歸與間接遞歸兩種。所謂直接遞歸,是指直接調(diào)用函數(shù)本身。例5.6編寫一個函數(shù),其功能是判斷給定的正整數(shù)是否是素數(shù),若是素數(shù)則返回函數(shù)值1,否則返回函數(shù)值0。其C函數(shù)如下:*include"math.h"sushu(intn){intk,i,flag;k=sqrt((double)n);i=2;flag=0;while((i<=k)&&(flag==0)){if(n%i==0)flag=1;i=i+1;}return(!flag);}例5.8Hanoi塔問題。相傳古代印度有一座Bramah廟,廟中有三根插在黃銅板上的寶石柱,在其中的一根柱子上放了64個金盤子,大盤在下,小盤在上,稱為Hanoi塔。有一天,廟里的和尚們想把這些盤子從一根柱子上移到另一根柱子上,規(guī)定每次只允許移動一個盤子,并且,在移動過程中都不允許出現(xiàn)大盤子壓在小盤子上面的現(xiàn)象,但在移動盤子的過程中可以利用三根柱子中的任何一根。為了使問題具有普遍性,假設圓盤數(shù)為n,按直徑從小到大依次編號為1,2,…,n;三根柱子的名稱分別為*,Y,Z。開始時,n個圓盤按從大到小的順序(即下面放大圓盤,上面放小圓盤)放在*柱子上,現(xiàn)在要將*柱子上的n個圓盤移到Z柱子上,其移動的原則如上所述。這個問題稱為n階Hanoi塔問題。可以寫出C程序如下:*include"stdio.h"main(){intn;char*='*',y='Y',z='Z';voidhanoi();printf("inputn=");scanf("%d",&n);hanoi(n,*,y,z);}voidhanoi(n,*,y,z)intn;char*,y,z;{voidmove();if(n==1)move(*,n,z);else{hanoi(n-1,*,z,y);move(*,n,z);hanoi(n-1,y,*,z);}return;}voidmove(*,n,z)intn;char*,z;{printf("%c(%d)---->%c\n",*,n,z);}編譯預處理功能是C語言的一個重要特點。所謂編譯預處理,是指C語言編譯系統(tǒng)首先對程序模塊中的編譯預處理命令進行處理。C語言提供的編譯預處理命令主要有以下3種:(1)宏定義;(2)文件包含命令;(3)條件編譯命令。編譯預處理命令一般是在函數(shù)體的外面。正確使用編譯預處理命令,可以編寫出易于調(diào)試、易于移植的程序模塊。文件包含命令文件包含是指一個源文件可以將另一個指定的源文件包括進來。文件包含命令的一般形式為*include〈文件名〉或*include"文件名"其功能是將指定文件中的全部容讀到該命令所在的位置后一起被編譯。在使用文件包含命令時,要注意以下幾個問題:(1)當*include命令指定的文件中的容改變時,包含這個文件的所有源文件都應該重新進行編譯處理;(2)一個*include命令只能指定一個被包含文件,如果需要包含多個文件,則要用多個*include命令實現(xiàn);(3)被包含的文件應該是源文件,不能是經(jīng)編譯后的目標文件;(4)文件包含可以嵌套使用,即被包含的文件中還可以使用*include命令;(5)由*include命令所指定的文件中可以有任何語言成分,因此,通??梢詫⒔?jīng)常使用的、具有公用性質的符號常量、帶參數(shù)的宏定義以及外部變量等集中起來放在這種文件中,以盡量避免一些重復操作。6.1一維數(shù)組一維數(shù)組的定義與引用定義一維數(shù)組的一般形式如下:類型說明符數(shù)組名[常量表達式];其中類型說明符是定義數(shù)組中各元素的數(shù)據(jù)類型,常量表達式是說明數(shù)組的大小(即數(shù)組中元素的個數(shù)。數(shù)組的說明與變量的說明一樣,其作用是為數(shù)組分配存儲空間。關于數(shù)組的說明要注意以下幾個問題:(1)數(shù)組名的命名規(guī)則與變量名相同。(2)說明數(shù)組大小的常量表達式必須為整型,并且用方括號括起來(不能用圓括號)。(3)說明數(shù)組大小的常量表達式中可以包含符號常量,但不能是變量。例6.1下面的程序說明了如何對數(shù)組定義和引用數(shù)組元素:*include"stdio.h"*defineN5main(){inti,a[N];for(i=0;i<N;i=i+1)a[i]=i;for(i=0;i<N;i=i+1)printf("%5d",a[i]);printf("\n");}在這個程序中,首先定義了一個長度為5的整型一維數(shù)組a,然后利用for循環(huán)對其中的每一個元素(a[0]~a[4])進行賦值,最后利用for循環(huán)輸出這5個元素值。在C語言中,凡是一般簡單變量可以使用的地方都可以使用數(shù)組元素。一維數(shù)組的初始化在C語言中,給數(shù)組元素提供數(shù)據(jù)的方法有以下3種。(1)利用賦值語句逐個對數(shù)組中的元素進行賦值。(2)利用輸入函數(shù)逐個輸入數(shù)組中的各個元素。例如,*include"stdio.h"main(){inti,a[5];for(i=0;i<5;i=i+1)scanf("%d",&a[i]);}其中&a[i]表示取數(shù)組元素a[i]的地址。(3)初始化。下面對靜態(tài)一維數(shù)組的初始化作三點說明:(1)可以只給數(shù)組的前若干個元素賦初值,此時后面的元素均將自動賦以初值0。(2)在對全部元素賦初值時,說明語句中可以不指定數(shù)組長度,其長度默認為與初值表中數(shù)據(jù)的個數(shù)相同。(3)雖然標準C語言規(guī)定只能對“靜態(tài)存儲”的數(shù)組進行初始化,即除了可以對外部(全局)數(shù)組進行初始化外,還可以對用static說明的局部數(shù)組進行初始化。例6.3分析下列程序的輸出結果:*include"stdio.h"main(){intk,*[5];staticinty[5];intz[5]={0,0,0};for(k=0;k<5;k++){printf("%5d%5d%5d",*[k],y[k],z[k]);printf("\n");}}6.2二維數(shù)組二維數(shù)組的定義與引用定義二維數(shù)組的一般形式如下:類型說明符數(shù)組名[常量表達式1][常量表達式2];二維數(shù)組的初始化與一維數(shù)組一樣,也可以對靜態(tài)存儲的二維數(shù)組進行初始化。在對二維數(shù)組進行初始化時要注意以下幾點。(1)在分行給二維數(shù)組賦初值時,對于每一行都可以只對前幾個元素賦初值,后面未賦初值的元素系統(tǒng)將自動賦初值0;并且,還可以只對前幾行元素賦初值。(2)在給全部元素賦初值時,說明語句中可以省略第一維的長度說明。(3)在分行賦初值時,也可以省略第一維的長度說明6.3字符數(shù)組與字符串字符數(shù)組的定義與初始化定義字符數(shù)組的一般形式如下:char數(shù)組名[常量表達式];一維字符數(shù)組char數(shù)組名[常量表達式1][常量表達式2];二維字符數(shù)組(1)當對字符數(shù)組中所有元素賦初值時,數(shù)組的長度說明可以省略。(2)可以只對前若干元素賦初值。(3)雖然標準C語言規(guī)定只能對“靜態(tài)存儲”的字符數(shù)組進行初始化,即除了可以對外部(全局)字符數(shù)組進行初始化外,還可以對用static說明的局部字符數(shù)組進行初始化。字符串C語言規(guī)定,字符串常量(簡稱字符串)要用一對雙撇號括起來。在一個字符串常量中,最后還包括一個結束符‘\0’。C語言允許用字符串常量對字符數(shù)組進行初始化。字符數(shù)組與字符串的輸入與輸出1.輸入輸出一個字符(格式說明符為%c)在用于輸入時,輸入項為數(shù)組元素地址。在具體輸入時,各字符之間不要分隔,字符也不要用單撇號括起來。在用于輸出時,輸出項為數(shù)組元素。2.輸入輸出一個字符串(格式說明符為%s)在用格式說明符%s進行輸入輸出時,其輸入輸出項均為數(shù)組名。但在輸入時,相鄰兩個字符串之間要用空格分隔,系統(tǒng)將自動地在字符串最后加結束符'\0'。字符串處理函數(shù)下面簡單介紹一些常用的字符串處理函數(shù)。(1)puts(字符數(shù)組名)功能:輸出一個字符串到終端。(2)gets(字符數(shù)組名)功能:從終端輸入一個字符串到字符數(shù)組,并返回字符數(shù)組的地址。(3)strcat(字符數(shù)組1,字符串2)功能:將字符串2連接到字符串1的后面,并返回字符串1的地址。(4)strcpy(字符數(shù)組1,字符串2)功能:字符串2拷貝到字符數(shù)組1中。(5)strcmp(字符串1,字符串2)功能:比較字符串。這個函數(shù)的返回值如下:若字符串1=字符串2,則返回值為0;若字符串1>字符串2,則返回值為正整數(shù);若字符串1<字符串2,則返回值為負整數(shù)。(6)strlen(字符串)功能:測試字符串長度。(7)大小寫轉換函數(shù)大小寫轉換函數(shù)有以下兩個:strlwr(字符串)將字符串寫字母轉換成小寫字母。strupr(字符串)將字符串中小寫字母轉換成大寫字母。6.4數(shù)組作為函數(shù)參數(shù)形參數(shù)組與實參數(shù)組的結合例6.8用選擇法對無序序列進行排序。C程序如下:/*select.c*/select(b,n)intn,b[];{inti,j,k,d;for(i=0;i<=n-2;i=i+1){k=i;for(j=i+1;j<=n-1;j=j+1)if(b[j]<b[k])k=j;if(k!=i){d=b[i];b[i]=b[k];b[k]=d;}}}/*e*.c*/*include"stdio.h"*include"select.c"main(){intk;static

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論