C語言程序設(shè)計(復(fù)習(xí)一)_第1頁
C語言程序設(shè)計(復(fù)習(xí)一)_第2頁
C語言程序設(shè)計(復(fù)習(xí)一)_第3頁
C語言程序設(shè)計(復(fù)習(xí)一)_第4頁
C語言程序設(shè)計(復(fù)習(xí)一)_第5頁
已閱讀5頁,還剩198頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C程序設(shè)計§1.3簡單的C程序介紹

為了更好、更快地掌握C程序,我們先看幾個C語言程序:例1.main(){printf("Thisisacprogram\n");}例2.main()/*求兩個數(shù)之和*/

{

inta,b,sum;/*這是定義變量*/

a=123;b=456;sum=a+b;printf("sumis%d\n",sum);}例3.main()/*主函數(shù)*/{inta,b,c;/*定義變量*/scanf("%d,%d",&a,&b);/*輸入變量a和b的值*/c=max(a,b);/*調(diào)用max函數(shù),將得到的值賦給c*/printf("max=%d",c;)/*輸出c的值*/}intmax(x,y)intx,y;/*對形參x、y作類型定義*/{intz;//max函用到的變量z,也要加以定義

z=y;if(x>y)z=x;return(z);/*將z的值返回,通過max帶回調(diào)用處*/}通過分析,初步看到:1.C程序全部由一個一個的函數(shù)構(gòu)成。至少有一個主函數(shù)main(),其它函數(shù)可被主函數(shù)調(diào)用或相互調(diào)用。其它函數(shù)可為C函數(shù)庫中函數(shù),也可為自己編的函數(shù)。上述特點稱為程序的模塊化.2.

函數(shù)的構(gòu)成:

函數(shù)說明+函數(shù)體

函數(shù)體:

變量定義與執(zhí)行語句

可允許空函數(shù):

dump(){}函數(shù)說明包括:函數(shù)名、類型、屬性、參數(shù)等3.

函數(shù)的執(zhí)行一定從main()開始。盡管main()函數(shù)位置可自由。4.

書寫自由,一個語句可多行,一行可多個語句。5.

每一條語句必須有一個分號;6.C語言的輸入/出均以函數(shù)形式出現(xiàn)。scanf(),printf().7.

可用/

/對C語言加注釋第二章數(shù)據(jù)類型、運算符與表達式§2.1.數(shù)據(jù)類型

著名計算機科學(xué)家沃思提出:

程序=數(shù)據(jù)結(jié)構(gòu)+算法

所以,存放數(shù)據(jù)的方式直接反映了一種語言的數(shù)據(jù)表達能力。數(shù)據(jù)的存儲方式又稱之為:數(shù)據(jù)類型。

舉一個例子:以考生各科成績及總分排隊問題為列。

成績的存放–––以數(shù)組形式

排隊方法––––算法C數(shù)據(jù)類型豐富,分為:基本類型構(gòu)造類型指針類型空類型整型字符型實型單精度雙精度數(shù)組結(jié)構(gòu)體共用體數(shù)據(jù)有常量、變量之分,均為其中一種類型。枚舉例:#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}還可用一個符號表示一個常量符號常量2.2.2變量

程序執(zhí)行中可以改變的量稱為變量。變量包括變量名和變量值。變量名

用標(biāo)識符命名,對應(yīng)一定數(shù)量的內(nèi)存存貯單元,其單元數(shù)視變量類型而定。標(biāo)識符

由字母、數(shù)字、下劃線組成且由字母或下劃線開頭的字符串。

標(biāo)識符可用來命名變量及作為常量名、函數(shù)名、類型名、文件名等,一個程序內(nèi)不得有重復(fù)名。

如:_sum,sum,student_name,price等

習(xí)慣上,變量名、函數(shù)名等用小寫字母表示。常量名用大寫字母表示(以增加可讀性)。C語言中,變量須先定義,后使用如:intstudentstudent=30;

則若寫成student=30,則未定義,編譯時指出其錯。

一旦變量被定義,即可在編譯時為其分配相應(yīng)數(shù)量的單元,并檢查其運算的合法性?!?.3整型數(shù)據(jù)2.3.1整型常量整型常量

整型常數(shù)C語言提供了三種形式

十進制如:256,308,-120等八進制以數(shù)字0開頭表示的整數(shù)例:0235,0146-012等.0235=2×82+3×8+5=15710

0146=1×82+4×8+6=10210-012=-(1×8+2)=-1010十六進制以"0x"開頭的整型數(shù)

如:0x16,0x28§2.4實型數(shù)據(jù)2.4.1實型常量有二種表示形式

1.十進制形式如:0.126,523.64等2.

指數(shù)形式對于較大或較小的數(shù),可用指數(shù)形式

0.00001261.26E–512600001.26E+6或1.26E6'E','e'均可.§2.5字符型數(shù)據(jù)

用一對單引號括起來的單個字符。

如'a','A',二者不一樣.

此外,以"\"開頭后接一個字符或n個字符代表了一種特殊字符常量。–––轉(zhuǎn)義字符。

如\n––換行,\r––回車2.5.1字符常量其它如下表:字符形式\n\t\v\b\r\f\\\'\ddd\xxh功能換行橫向跳格(即跳到下一個輸出區(qū))豎向跳格退格回車走紙換頁反斜杠字符“\”單引號(撇號)字符1到3位8進制數(shù)所代表的字符1到2位16進制數(shù)所代表的字符其定義方式為:

charc1,c2;c1='A';c2='B';字符變量只占一個字節(jié)單元。2.5.2字符變量用來存放一個字符的變量.

一個字符存入一個字符變量。其對應(yīng)單元存放的是其ASCII碼,即ASCII碼的二進制形式。

由此:字符變量中的數(shù)據(jù)是一整型數(shù)據(jù)。輸出時既可輸出字符,亦可輸出整數(shù),且字符變量可作整數(shù)運算。2.5.3字符數(shù)據(jù)的實際存放形式例1:main(){charc1,c2;c1=97;c2=98;printf("%c%c",c1,c2)}運行結(jié)果ab

看如下幾個例子:例2:main(){charc1,c2;c1='a';c2='b';c1=c1–32;c2=c2–32;printf("%c%c",c1,c2)}運行結(jié)果AB例3:main(){inti;charc;i='a';c=97;printf("%c,%d\n",c,c);printf("%c,%d\n",i,i);}

運行結(jié)果:a,97a,97用雙引號括起來的字符串。

例:"GoodMorning!"

注意'A'與"A"是不同字符串存放時,在最后加上"/0"––空字符。

于是:GoodMorning!/02.5.4字符串常量"A"A/0但'A'

A注意:1.

字符串長度=實際字符個數(shù)+1,但最后\0不輸出.

printf("GoodMorning!")此處不寫/0。自動加上。2.

單個字符的字符串不能賦給字符變量。

例:charc;c="a";是錯誤的。§2.8算術(shù)運算符與算術(shù)表達式運算符:運算的符號表示。

C語言有豐富的運算功能,先簡述之2.8.1.C運算符1.

算術(shù)運算符+,–,,/,%,等3.

邏輯運算符!,&&,||2.

關(guān)系運算符>,<,==,>=,<=,!=4.

位運算符<<,>>,~,|,^,&.5.

賦值運算符=等6.

條件運算符?=7.

逗號運算符,8.

指針運算符*,&11.

分量運算符?,,12.

下標(biāo)運算符[]13.

其它運算符如函數(shù)的調(diào)用()9.

求字節(jié)數(shù)運算符sizeof10.

強制類型轉(zhuǎn)換運算符(類型)

2.8.2算術(shù)運算符和算術(shù)表達式一、基本算術(shù)運算符+

加法正值3+6,+3–減法負值6–4,–5乘法38/除法8/5%求余7%4的值為3注:

兩個整型數(shù)據(jù)相除(結(jié)果為整,一般向零靠攏)。–5/3–1“/”中,有一個float,則結(jié)果為double型,使用時千萬注意int/int出現(xiàn)數(shù)據(jù)丟失。四、自增,自減運算符設(shè)有inti=3;++自增1––自減1則:++i,i++都會使i變?yōu)?,但有區(qū)別:++i:先使i值+1,再使用i值;i++:先使用i值,再使i值+1.j=++i;j=4,i=4.(i=i+1;j=i;)j=i++;j=3,i=4.

(j=i;i=i+1)同理:––i,i––,均使i值–1,但:

又如:printf("i=%d\n",i++);

結(jié)果:i=3若:

printf("i=%d\n",++i);

結(jié)果:i=4––i:先使i值–1,再使用i值;i––:先使用i值,再使i值–1i=3;幾點注意:1.++和––運算法只能用于變量,不得用于常量和表達式.2.++,–

–,的結(jié)合性為從右至左,而一般算術(shù)運算符為從左至右。如:如5++,(a+b)++均為不合法.–i++"–"和"++"為同一優(yōu)先級.–i++相當(dāng)于–(i++)若i=3,則結(jié)果為–3,i為4.++,––主要用于循環(huán)變量自增或自減。第三章最簡單的C程序設(shè)計§3.1C語句概述C語句全部為可執(zhí)行語句,對應(yīng)若干機器操作指命令C程序由許多源文件組成。(分別編譯,然后連接)每一個源文件由預(yù)編譯命令和若干函數(shù)組成。每一個函數(shù)由說明部分和語句部分組成。其結(jié)構(gòu)如圖除說明部分外,重要部分為語句部分。C程序源程序文件1源程序文件i源程序文件n預(yù)編譯命令函數(shù)1函數(shù)n說明部分執(zhí)行部分(語句)……控制語句––改變語句的執(zhí)行順序共有9種控制語句:if()~else~(條件)for()~(循環(huán))while()~(循環(huán))do~while(循環(huán))continue(結(jié)束本次循環(huán))switch(多分支選擇)break(中止整個循環(huán))goto(轉(zhuǎn)移)return(函數(shù)返回)()表示條件,~表示語句

在C程序的順序、選擇、循環(huán)三種結(jié)構(gòu)中,選擇結(jié)構(gòu)是一重要結(jié)構(gòu)第四章邏輯運算和判斷選取控制問題:條件如何表達?邏輯運算、關(guān)系運算§4.1關(guān)系運算符

關(guān)系運算比較運算,如:a>3為一比較運算,當(dāng)a=5,a>3成立。結(jié)果稱為“真”,否則,如:a=1,a>3不成立,為假。上述表達式a>3稱為關(guān)系表達式。4.1.1

關(guān)系運算符及其優(yōu)先次序1.<,<=,>,>=為同一優(yōu)先級,==,!=等為同一優(yōu)先級,但前者高于后者。2.關(guān)系運算符優(yōu)先級低于算術(shù)運算符。C語言提供了六種關(guān)系運算符

<<=>>===!=優(yōu)先級為:3.關(guān)系運算符優(yōu)先級高于賦值運算符。如下圖:算術(shù)運算符賦值運算符關(guān)系運算符高低舉例:c>a+bc>(a+b)a>b!=c(a>b)!=ca==b<ca==(b<c)a=b>ca=(b>c)4.1.2

關(guān)系表達式關(guān)系表達式的結(jié)果值規(guī)定為1或0.如:a>b,a+b>b+c,(a=3)>(b=5),'a'>'b',(a>b)>(b<c)完整的定義:用關(guān)系運算符將兩個表達式(算術(shù)、關(guān)系、邏輯、賦值、字符等表達式)連接起來的式子。1––結(jié)果為真(成立)0––結(jié)果為假(不成立)§4.2邏輯運算符和邏輯表達式

用邏輯運算符將關(guān)系表達式、邏輯表達式連接起來的式子–––邏輯表達式。a&&b當(dāng)a,b均為1時,才為1a||b當(dāng)a,b中有一個為1時,才為1!a當(dāng)a為1,!a為0,反之為1.由此看到:||和&&為雙目運算符.!為單目運算符。4.2.2

邏輯表達式

1.邏輯表達式的值與關(guān)系表達式值一樣,真為1,假為0。例:a=4則!a值為0.此處只要a0,為真.則!a值為0.a=4,b=5a&&b為1

前面已定義了邏輯表達式,以下看一看邏輯表達式的值及具體的運算。程序的三種基本結(jié)構(gòu)

從結(jié)構(gòu)化程序設(shè)計角度出發(fā),程序有三種結(jié)構(gòu):·順序結(jié)構(gòu)·選擇結(jié)構(gòu)·循環(huán)結(jié)構(gòu)1.順序結(jié)構(gòu)表示ABAB先執(zhí)行A,再執(zhí)行B.2.選擇結(jié)構(gòu)表示為ABPTFBTPFA存在某條件P,若P為真,則執(zhí)行A,否則執(zhí)行B。3.循環(huán)結(jié)構(gòu)表示為PFTAAP為T(1)當(dāng)型結(jié)構(gòu)當(dāng)P條件成立時(T),反復(fù)執(zhí)行A,直到P為“假”時才停止循環(huán).有兩種結(jié)構(gòu):當(dāng)型和直到型(2)

直到型APFTA直到P為真

先執(zhí)行A,再判斷P,若為F,再執(zhí)行A,如此反復(fù),直到P為T.

另外:由選擇結(jié)構(gòu)可以派生出另一種基本結(jié)構(gòu)––多分支結(jié)構(gòu).KK=K1A1A2AiAn……K=K2K=Ki

已證明:上述三種結(jié)構(gòu)組成的程序可以解決全部的問題,所以任何一種高級語言都具備上述三種結(jié)構(gòu)。§4.3if語句–––條件判斷4.3.1if的三種形式功能:當(dāng)表達式值非0時,執(zhí)行語句A,否則不執(zhí)行語句A.表達式語句A=00例如:

if(x>y)printf("%d",x)形式1

if(表達式)

語句A其流程圖:形式2if(表達式)

語句Aelse語句B功能:表達式為非0,執(zhí)行語句A

表達式為0,執(zhí)行語句B表達式語句A語句B0=0例:if(x>y) printf("%d",x); elseprintf("%d",y);形式3if(表達式1)

語句1

elseif(表達式2)

語句2elseif(表達式3)

語句3……elseif(表達式n)語句nelse

語句n流程:表達1表達2表達3表達n語句1語句2語句3語句n語句n語句1……0=0=0000如:if(3)prinft("o.k");if('a')…1.表達式可以是邏輯、關(guān)系,甚至是算術(shù)表達式。2.上述形式中的語句必須以分號結(jié)束3.上述形式中的語句可以是由{}括起來的復(fù)合語句。此時,在{}外可以不用分號.注意的問題:main(){floata,b,t;

scanf("%f,%f",&a,&b);if(a>b)

{t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}例4.1輸入兩個實數(shù),按代數(shù)值由小到大次序輸出這兩個數(shù)。

3.6,–3.2–3.20,3.60運行情況如下:例4.2輸入三個數(shù),按大小順序輸出。main()

{floata,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b)

{t=a;a=b;b=t;}if(a>c)

{t=a;a=c;c=t;}if(b>c)

{t=b;b=c;c=t;}printf("%5.2f,%5.2f,%5.2f",a,b,c);}運行情況如下:3,7,11.00,3.00,7.004.3.2.if語句的嵌套if(表達式1)內(nèi)嵌ifelse內(nèi)嵌注意:else與最近的if配對.一般形式在上述形式的if語句中,又可以是if語句–––稱為嵌套。if(表達式2)語句1if(表達式3)語句3else語句2else語句4例:if()if()語句2else語句3if(){if()語句1}

else…所以:必要時加{}.if()語句1else§4.4switch語句–––開關(guān)語句

問題:當(dāng)某一表達式有n個取值,每一取值執(zhí)行一語句,則如果用內(nèi)嵌if十分繁鎖,而用switch簡單.一般形式:switch(表達式){case常量表達式1:語句1

case常量表達式2:語句2

case常量表達式n:語句ndefault:語句n+1}例:

根據(jù)成績等級打印百分?jǐn)?shù)段.switch(grade){case'A':printf("85~100\n");case'B':printf("70~84\n");case'C':printf("60~69\n");case'D':printf("<60\n");default:printf("error\n");}

根據(jù)表達式的取值,判斷其與哪一個常量表達式相等。如=表達式i,則自語句i開始執(zhí)行,直到語句n+1止。若與所有常量表達式值不相等,則從default后的語句開始執(zhí)行。功能:以上存在一個問題:沒有完全起到分支作用。解決辦法:增加break語句,使之跳出switch結(jié)構(gòu)。switch(表達式)

{case常表1:語句1;

break;

case常表2:語句2;

break;……

case常表n:語句n;

break;default:語句n+1;}注:

1.

常表值必須互不相等,否則二異性。2.case順序無關(guān)緊要。3.

不一定非用break不可,有時幾種情況合并執(zhí)行一組語句。switch(grade){case'A':case'B':case'C':printf(">60\n");break;case'D':printf("<60\n");break;}第五章循環(huán)控制§5.1概述

前面已介紹了順序結(jié)構(gòu),選擇結(jié)構(gòu),本章介紹循環(huán)結(jié)構(gòu)。如:

sum=1+2+3+…+100;實際問題:

一組重復(fù)執(zhí)行的語句。則用循環(huán)結(jié)構(gòu)解決。C語言用四種形式循環(huán)2.

while語句3.

do…while語句4.

for語句1.if語句與goto語句§5.3while語句1.形式:while(表達式)語句2.執(zhí)行過程:先判斷表達式的值。若0.則執(zhí)行其后面的語句,否則while執(zhí)行完畢。專門的當(dāng)型循環(huán)語句––while語句3.

流程圖:表達式語句0=0下一語句將上述例子用while語句寫出

while(i<=100){sum+=i;i++;}語句中應(yīng)有使表達式=0的語句。否則會出現(xiàn)無限循環(huán)–––"死"循環(huán)。注:

while后面的語句一般為復(fù)合語句,即:加{}§5.4do…while語句

一種專門的“直到型”循環(huán)語句。2.執(zhí)行過程:先執(zhí)行語句,再判表達式的值,若0,再執(zhí)行語句,否則結(jié)束循環(huán)3.流程:語句表達式0=01.形式:do語句while(表達式);main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);printf("%d",sum);}程序如下:while語句與do…while語句的區(qū)別:當(dāng)?shù)谝淮螆?zhí)行時,若表達式=0時,則while語句與dowhile有所不同,dowhile執(zhí)行一次后面的語句,而while不執(zhí)行?!?.5for語句1.形式

首先計算表達式1,接著執(zhí)行表達式2,若表達式2的值0,則執(zhí)行語句,接著計算表達式3,再判斷表達式2的值.依此重復(fù)下去,直到表達式2的值=0(假)。一種形式更為靈活的循環(huán)語句。2.執(zhí)行過程for(表達式1;表達式2;表達式3)語句3.

流程:計算表達式1求表達式2值語句計算表達式3結(jié)束for語句=0(假)0(真)用for語句寫出上述例子for用while代替的流程表達式1;

while(表達式2){語句表達式3;}for(i=1;i<=100;i++)sum+=i;for語句完全可以用while代替,但for直觀、簡單、方便4.for語句的幾種特例例:任意輸入兩個整數(shù)a,b,求main(){inti,j,a,b,sum;printf("pleaseinputtwonumber!\n")scanf("a=%d,b=%d",&a,&b);i=a;j=b;可以省略表達式1,但須保留分號;這時在for之前就得賦值給循環(huán)變量;if(a>b){i=b;j=a;}for(;i<=j;i++)sum=sum+i;printf("\nsum=%d",sum);}

表達式2一般不可省略,否則為無限循環(huán)相當(dāng)于:while(1){sum=sum+i;i++;}例:for(i=1;;i++)sum=sum+i;相當(dāng)于條件永真、永不為0,若用while表示

表達式3亦可省略,但在循環(huán)體中須有語句修改循環(huán)變量;以使表達式2在某一時刻為0而正常結(jié)束循環(huán)。例:for(sum=0,i=1;i<=100;){sum=sum+v;i++;}

若同時省略表達式1,表達式3,則相當(dāng)于while(表達式2)語句。相當(dāng)于

while(i<=100)

{

sum+=i;i++;}例:for(;i<=100,){sum+=i;i++;}§5.6

循環(huán)的嵌套

與其它語言一樣,當(dāng)循環(huán)體中又包含了另一個完整的循環(huán)語句時–––嵌套。C有三種循環(huán)語句,均可以相互嵌套:

while(){…while() …{}}§5.7

幾種循環(huán)的比較1.對于同一問題,四種循環(huán)可相互替代。但不提倡用goto.2.for循環(huán)功能強于while,do…while.但若不是明顯地給出循環(huán)變量初終值(或修改條件),則應(yīng)用while或do…while.以增強程序的結(jié)構(gòu)化和可讀性。3.要防止無限循環(huán)––死循環(huán)。4.循環(huán)過程中,為了結(jié)束本次循環(huán)或跳出整個循環(huán)。分別要用到continue和break語句?!?.8

break語句和contiune語句

問題:計算圓的面積r2,半徑取1,2,3,4…,當(dāng)面積>100時結(jié)束。for(r=1;r<=10;r++){area=pirr;if(area>100)break;

}printf("%f",area);}5.8.1break語句

從結(jié)構(gòu)化程序要求出發(fā),用break,退出循環(huán),進入下一條語句。

注:break只能用于循環(huán)語句和switch語句。5.8.2continuce語句

main(){intn;for(n=100;n<200;n++)if(n%3!=0)printf("%d",n);}問題:編寫程序,打印100~200中不能被3整除的數(shù)。換一種方式:main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);}}continue語句起了結(jié)束本次循環(huán)的作用?!?.9

程序舉例例1:

求Fibonacci數(shù)例:1,1,2,3,5,8,…前40個數(shù)。程序要點:每輸出4個數(shù)時換行。f1=f1+f2;

f2=f2+f1;交替的結(jié)果正好為一序列規(guī)律:

F1=1,F2=1Fn=Fn–1+Fn–2(n>2)程序如下:main(){longintf1,f2; inti; f1=1;f2=1; for(i=1;i<=20;i++) { printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}f1=1,f2=1fori=1to20

輸出f1,f2f1=f1+f2f2=f2+f1圖5.13運行結(jié)果為:15342331597109467502551422935245782415781718553772584177111211393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155

判一個數(shù)m是否為素數(shù)的方法:

每打印10個數(shù),換一次行。當(dāng)用2,3,…的整數(shù)去除它時均不能除盡,則為素數(shù)。程序如下:#include<stdio.h>

#include<math.h>main()

{例2.

求100~200的素數(shù).intm,k,i,n=0;for(m=101;m<=200;m=m+2)

{

if(n%10==0)printf("\n");

k=sqrt(m);for(i=2;i<=k;i++)

if(m%i==0)break;if(i>=k+1){printf("%d",m);n=n+1;}}}101103107109113127131137139149151157163167173179181191193197199運行結(jié)果如下:一.冒泡法:排序過程:(1)比較第一個數(shù)與第二個數(shù),若a[0]>a[1],則交換;然后比較第二個數(shù)與第三個數(shù);依次類推,直至第n-1個數(shù)和第n個數(shù)比較為止——第一趟冒泡排序,結(jié)果最大的數(shù)被安置在最后一個元素位置上(2)對前n-1個數(shù)進行第二趟冒泡排序,結(jié)果使次大的數(shù)被安置在第n-1個元素位置(3)重復(fù)上述過程,共經(jīng)過n-1趟冒泡排序后,排序結(jié)束。#include<stdio.h>main(){inta[11],i,j,t;printf("Input10numbers:\n");for(i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");

for(j=1;j<=9;j++)for(i=1;i<=10-j;i++)

if(a[i]>a[i+1])

{t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("Thesortednumbers:\n");for(i=1;i<11;i++)printf("%d",a[i]);}二、

排序問題–––計算機處理數(shù)據(jù)的一個重要問題排序算法較多,一種最簡單的算法–––選擇排序法用得較多。基本思路:設(shè)有n個數(shù),需將它們從小到大順序排列。則:2.在剩下的n–1個元素中,找出第二小的元素并把它放在第二個位置上。3.對上述過程重復(fù),直至剩下一個元素。1.從n個元素中,通過比較,找出最小元素,放在第一個位置上。例:8,4,20,100,28,1,兩次交換第2次:1,4,20,100,28,8–––

一次交換第3次:1,4,8,100,28,20–––

一次交換第4次:1,4,8,28,100,20,1,4,8,20,100,28兩次交換第5次:1,4,8,20,28,100–––

一次交換第1次:4,8,20,100,28,11,8,20,100,28,4

從以上例子可以看到:用到兩種循環(huán),第一種循環(huán)––找第i小的元素,第二種循––對其后的元素的一一比較。流程圖:初始化輸入n個元素a數(shù)組i1ji+1a[i]>a[j]交換a[i]a[j]BANoYesjj+1j>nii+1i>n–1打印結(jié)果結(jié)束內(nèi)循環(huán)外循環(huán)BANoYesYesNo程序:main(){inta[11];inti,j,t;printf("pleaseinput10n~:\n");for(i=1;i<=n;i++)scanf("%d",&a[i]);printf("\n");for(i=1;i<=9;i++)for(j=i+1;j<=10;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}printf("thesortednumbers:\n");for(i=1;i<=10;i++)printf(“%d”,a[i]);}第六章數(shù)組

前面所用到的數(shù)據(jù)均為基本類型(整、實、字符),為了豐富數(shù)據(jù)類型,須提供強有力的數(shù)據(jù)表達方式。C語言提供了一種構(gòu)造類型數(shù)據(jù)–––由基本類型按某一規(guī)則組合在一起。

其中數(shù)組:同一種(基本)類型按一定順序組合在一起的數(shù)據(jù)類型?!?.1

一維數(shù)組6.1.1一維數(shù)組的定義1.數(shù)組名的確定方法同變量名。2.C語言用方括號[]表示數(shù)組元數(shù)個數(shù)。形式:類型說明符數(shù)組名[常量表達式];例:inta[20];floatx[100];3.常量表達式為常量和符號常量。不允許有變量,其表達式的值代表了元素的個數(shù)。例:inta[20];

表示有20個元素且元素從0開始編排:a[0],a[1]…,a[19]4.可在定義時對靜態(tài)數(shù)組和外部存儲(全局)數(shù)組賦初值,方法如下:

對部分元素賦初值

staticinta[10]={0,1,2,3,4};靜態(tài)

對全部元素賦初值

staticinta[10]={10,11,12,13,14,15,16,17,18,19,}如此,只有前5個元素初值確定,后5個元素由系統(tǒng)設(shè)置。如對數(shù)組元素賦同一初值,必須一一寫出:staticinta[10]={0,0,0,0,0,0,0,0,0,0};若賦全部元素的初值,可省略常量表達式

…a[]={0,1,2,3};

表示a[4],即只有4個元素。6.1.2一維數(shù)組的引用2.引用方式:數(shù)組名[下標(biāo)]

代表了一個元素,等價一個同類型的變量。3.一般地,一維數(shù)組各元素分配在連續(xù)地內(nèi)存單元之中。1.須象使用變量那樣,先定義,后使用例:a[0]5+a[1]6為正確的算術(shù)表達式§6.2二維數(shù)組6.2.1二維數(shù)組的定義1.不可將定義寫為inta[4,10]。形式類型說明符數(shù)組名[常量表達式][常量表達式]例:inta[4][10];floatx[8][20];2.可將二維數(shù)組的元素看成為若干個特殊的一維數(shù)組。

如:

intb[3][4];則:有三個特殊的一維數(shù)組b[0],b[1],b[2],每一個又有四個元素:b[0][0],b[0][1],b[0][2],b[0][3],b[1][0],b[1][1],b[1][2],b[1][3],b[2][0],b[2][1],b[2][2],b[2][3],3.二維數(shù)組的存放方式為:按行存放。由此可推廣至三維、n維數(shù)組的定義和存放。即:最右邊的下標(biāo)變化最快。4.初始化:

按行給二維數(shù)組賦初值:staticinta[3][4]={{1,2,3,4},{5,6,7,8,},{9,10,11,12,}};可以去掉其中的{}。

可以對部分元素賦初值,但需表達清楚。如:staticinta[3][4]={{1,2},{3},{8}}。則相當(dāng)于120030008000可通過賦初值決定數(shù)組大小。如為二維,則只可省略第一維的大小.staticinta[][4]={1,2,3,…,12};6.2.2二維數(shù)組元素的引用形式:數(shù)組名[下標(biāo)][下標(biāo)]

其中的下標(biāo)為整型表達式,但不得越界。與一維數(shù)組元素一樣,二維數(shù)組元素相當(dāng)于同類型的簡單變量。6.2.3程序舉例a=123456b=142536程序如下:main(){staticinta[2][3]={{1,2,3},{4,5,6}};staticintb[3][2],i,j;例1

將一個二維數(shù)組行和列元素互換,存到另一個二維數(shù)組中。例如:printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}}運行結(jié)果如下:

arraya:123456arrayb:142536例2.有一個3×4的矩陣,要求編程序求出其中值最大的那個元素的值,以及所在的行號和列號。max=a[0][0]fori=0to2forj=0to3a[i][j]>maxmax=a[i][j]row=icolum=j輸出:max和row,colum真假二維數(shù)組一般用二重循環(huán)據(jù)此寫出以下程序:main(){inti,j,row=0,colum=0,max;staticinta[3][4]={{1,2,3,4},{9,8,7,6},{–10,10,–5,2}}max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;

}printf("max=%d,row=%d,colum=%d\n",max,row,colum);}輸出結(jié)果為:

max=10,row=2,colum=1§6.3字符數(shù)組6.3.1字符數(shù)組的定義類型名數(shù)組名大小1.初始化:

直接給出字符串中的各字符

staticchara[4]={'G','o','o','d'};

存放字符數(shù)據(jù)。字符串–––用字符數(shù)組存放。charc[10];若字符多于元素個數(shù),則語法錯,反之,后而補"\0"可以去掉定義時的大小設(shè)置,而通過自動賦值決定 長度(大小)staticcharx[]={'I','','a','m','','a','','s','t','u','d','e','n','t'};2.字符數(shù)組的引用每一個字符數(shù)組元素相當(dāng)于一個字符變量。格式符:%c–––逐個輸入/輸出字符。

%s–––整個串一次輸入/輸出。1.輸出(用%s)

用%s輸出時,不輸出‘\0’.

在printf中須直接寫數(shù)組名.

staticcharc[]={"Iamastudent"};printf("%s",c);6.3.2字符數(shù)組的輸入輸出若數(shù)組長度大于字符串長度,則遇到‘\0’

即停止輸出

staticcharc[10]="china";printf("%s",c);輸出時遇到第一個‘\0’即結(jié)束。2.輸入(用%s)輸入多個字符串,可用空格隔開。

Staticcharstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);輸入字符串時,系統(tǒng)自動加上‘\0’則:輸入Howareyou?str1:How\0str2:are\0str3:you\0輸入:Howareyou則只會將How輸入,且存為scanf中須用地址量,數(shù)組名表示地址量。str:How\0……

但若:staticcharstr[13]scanf("%s",str);6.3.4字符串?dāng)?shù)組舉例例:輸入一行字符,統(tǒng)計其中有多少個單詞,單詞之間用空格分隔開。程序如下:

#include"stdio.h" main() { charstring[81]; inti,num=0,word=0;charc;gets(string);for(i=0;(c=string[i])!='\0';i++) if(c=='')word=0; elseif(word==0) { word=1; num++; }printf("Thereare%dwordsintheline\n",num);}運行情況如下:

Iamaboy.Thereare4wordsintheline第七章函數(shù)§7.1概述1)除main外,其它為系統(tǒng)函數(shù)、自編函數(shù),系統(tǒng)函數(shù):由系統(tǒng)提供,用戶可調(diào)用。自編函數(shù):由用戶按語法規(guī)則編寫。C程序由一個main和任意個函數(shù)組成。

2)

除main函數(shù)外,其它函數(shù)可相互調(diào)用main()abcdxz3)函數(shù)不可嵌套定義,具有全局性、平行性,4)函數(shù)分為有參與無參函數(shù)5)程序從main開始執(zhí)行,最后又回到main函數(shù)結(jié)束?!?.2定義與調(diào)用類型標(biāo)識符函數(shù)名(){說明部分語句

}類型標(biāo)識符:表示返回值類型。1.無參函數(shù)定義形式調(diào)用方式函數(shù)名();若有返回值可出現(xiàn)在表達式中無返值可單獨出現(xiàn)類型標(biāo)識符函數(shù)名(形參表列)

形參說明

{說明部分語句

}2.有參函數(shù)

定義形式例:

求二數(shù)之最大值

intmax(intx,inty)

{

intz;

z=x>y?x:y;

return(z);

}出現(xiàn)return語句,返回值一般與函數(shù)類型一致.調(diào)用方式函數(shù)名(實參表列);

無值返回:

有值返回:3.形參與實參調(diào)用時:

實參值單向傳遞形參。

函數(shù)被調(diào)用時,臨時分配單元給形參,調(diào)用完畢,這些單元被釋放。注:

實參可為表達式,其值傳遞。實參:出現(xiàn)在調(diào)用函數(shù)中,形參:出現(xiàn)被調(diào)用函數(shù)中。

實參、形參類型一致。

可在形參表列中對形參說明。4.函數(shù)返回值變量等

通過return語句將返回值傳給函數(shù)名,可有多個return.

返回值類型為函數(shù)類型。一般return中的返回值類型應(yīng)與函數(shù)定義時的類型一致,不一致時,以函數(shù)定義類型為準(zhǔn)。return(表達式);由函數(shù)名只能得到一個返回值。5.調(diào)用函數(shù)應(yīng)對被調(diào)用函數(shù)的返回值類型作出說明:(函數(shù)名相當(dāng)于一變量,但應(yīng)有所區(qū)別)例:

求二實數(shù)之和

main(){floatadd();floata,b,c;

scanf("%f,%f",&a,&b);c=add(a,b);類型符函數(shù)名();它不同于函數(shù)的定義(功能定義)printf("sum=%f";c);}floatadd(floatx,floaty){floatz;z=x+y;returnz;}

以下幾種情況可省略對被調(diào)函數(shù)的說明:當(dāng)返回值為整型、字符型。在調(diào)用之前定義函數(shù)。

在整個文件的開頭定義函數(shù)。6.實參傳遞給形參時,實參的計算有的系統(tǒng)自左至右,有的自右至左。7.調(diào)用系統(tǒng)函數(shù),需根據(jù)系統(tǒng)提供的手冊而確定是否要加上預(yù)編譯命令,如:getchar()需加include"stdio.h"§7.3嵌套調(diào)用

函數(shù)不能嵌套定義,但可嵌套調(diào)用a(){調(diào)用b}b(){}main{調(diào)用a}求取大于50小于100的能被3整除的數(shù)的和。#include<stdio.h>intsum(intx,inty){ints=0;intcheck(int); for(inti=x;i<y;i++) s=s+check(i); returns;}intcheck(inty){if((y%3)==0)returny;elsereturn0;}voidmain(){ inta=51,b=100; printf("求和為:%d\n",sum(a,b));}§7.4遞歸調(diào)用

遞歸:

一個函數(shù)在其函數(shù)體中又出現(xiàn)直接或間接地調(diào)用自身的語句.直接調(diào)用

intf(intx){inty,z;

z=f(y);}間接調(diào)用

intf1

(intx){inty,z;

z=f2(y);}

intf2

(intt)

{inta,b;

a=f1

(b);}以上僅給出了遞歸的概念.顯然:

上述例子會無限遞歸(無限執(zhí)行)。所以,在遞歸調(diào)用時都有條件限制。n!=1(n=0,1)n(n–1)!(n>1)即:

條件成立,調(diào)用遞歸,否則結(jié)束。一個最常用的例子:

求n!1.從數(shù)學(xué)上定義2.程序

floatfac(intn){

floatf;if(n<0)printf("inputerror!\n");elseif(n==0||n==1)f=1;

elsef=nfac(n–1);return(f);}voidmain()

{

intn;floaty;printf("inputainteger!")scanf("%d",&n);y=fac(n);printf("%d!=%15.0f",n,y);}3.執(zhí)行過程:

設(shè)輸入n5main(){

f=5fac(4);

}fac(4){

f=4fac(3);

returnf;}fac(3){

f=3fac(2);

returnf;}–fac=4!n=4n=3fac=3!fac(2){

f=2fac(1);

returnf;}fac(1){

f=f(1);

returnf;}n=1fac=1n=2fac=2!可簡化表示為n=1n=2n=3n=4fac=4!fac=3!fac=2!fac=1n=5

當(dāng)變成機器代碼時,將其拉成直線(線性程序代碼)。例:P118漢諾塔(Hanoi)問題BCAn個盤子保證小(上),大(下)問題:

將A塔上n個盤子移至C(借助于B)。移動時,保證三個塔始終是大盤在下,小盤在上。必須用遞歸方式解決1)

先將A塔n–1個盤子借助于C移至B上2)將A上剩下的一個移至C上.3)將B上n–1個盤子借助于A移至C上.可以看到:1)、3)為同一問題,都為n–1個盤子借助于一個空塔移至另一塔上。程序如下:

voidmove(chargetone,charputone)

{printf("%c––>%c\n",getone,putone);

}voidhanoi(intn,one,chartwo,charthree)/*將n個盤從one借助two,移動three*/{if(n==1)move(one,three);else{hanoi(n–1,one,three,two);move(one,three);hanoi(n–1,two,one,three);}}

voidmain(){intm;printf("inputthenumberofdisdes":);scanf("%d",&m);printf("Thesteptomoving%3ddisdes:\n",m);hanoi(m,'A','B','C');}運行情況如下:

inputthenumberofdisdes:3Thesteptomoving3diskes:A>CA>BC>BA>CB>AB>CA>C兩個函數(shù):move(getone,putone)

表示從getone塔移一個盤子至putone塔hanoi(n,one,two,three)

表示n個盤子從one塔借助于two塔(空)移至three塔。

調(diào)用時塔用字符常量'A','B','C'表示?!?.5數(shù)組作為函數(shù)參數(shù)分為兩種情況:1.

數(shù)組元素作為實參2.

數(shù)組名同時為形、實參一、數(shù)組元素作為實參

由于數(shù)組元素與相同類型的簡單變量地位完全一樣;因此,數(shù)組元素作函數(shù)參數(shù)也和簡單變量一樣,也是值的單向傳遞intx,a[10];如:

xa[5]即a[5]為一元素,與x完全一樣。例:設(shè)有兩個同樣大小的一維數(shù)組,a[10],b[10]將相應(yīng)元素比較,統(tǒng)計a中大于b中對應(yīng)元素的個數(shù),小于的個數(shù),相等時的個數(shù)。程序如下:

main()

{

intlarge(int,int);inta[10],b[10],i,n=0,m=0,k=0;printf("enterarraya:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");printf("enterarrayb:\n");for(i=0;i<10;i++)scanf("%d",&b[i]);printf("\n");

for(i=0;i<10;i++){

if(large(a[i],b[i])==1)n=n+1;

elseif(large(a[i],b[i])==0)m=m+1;

elsek=k+1;

}printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k);if(n>k)printf("arrayaislargerthanarrayb\n");elseif(n<k)

printf("arrayaissmallerthanarrayb\n");else

printf("arrayaisequaltoarrayb\n");}intlarge(intx,inty){

intflag;if(x>y)flag=1;elseif(x==y)flag=0;elseflag=-1;return(flag);}運行情況如下:

enterarraya:1357986420enterarrayb:5389–1–35604a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthanarrayb特點:

直接用數(shù)組名作參數(shù)時,則為地址傳送(不是值傳送),即實參數(shù)組的首地址傳遞給形參數(shù)組首地址。所以,實參、形參數(shù)組共享相同的內(nèi)存單元。1.形參數(shù)組可不指定大小,也可用另一參數(shù)作大小,以確定使用實數(shù)組的元素個數(shù)。2.形參、實參數(shù)組必須類型一致。3.多維數(shù)組方式一樣,僅第一維大小的說明可省略二、數(shù)組名作實、形參例1.

有一個一維數(shù)組score,

溫馨提示

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

評論

0/150

提交評論