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

下載本文檔

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

文檔簡介

C程序設計§1.3簡單的C程序介紹

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

{

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

a=123;b=456;sum=a+b;printf("sumis%d\n",sum);}例3.main()/*主函數*/{inta,b,c;/*定義變量*/scanf("%d,%d",&a,&b);/*輸入變量a和b的值*/c=max(a,b);/*調用max函數,將得到的值賦給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帶回調用處*/}通過分析,初步看到:1.C程序全部由一個一個的函數構成。至少有一個主函數main(),其它函數可被主函數調用或相互調用。其它函數可為C函數庫中函數,也可為自己編的函數。上述特點稱為程序的模塊化.2.

函數的構成:

函數說明+函數體

函數體:

變量定義與執行語句

可允許空函數:

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

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

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

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

可用/

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

著名計算機科學家沃思提出:

程序=數據結構+算法

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

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

成績的存放–––以數組形式

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

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

用標識符命名,對應一定數量的內存存貯單元,其單元數視變量類型而定。標識符

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

標識符可用來命名變量及作為常量名、函數名、類型名、文件名等,一個程序內不得有重復名。

如:_sum,sum,student_name,price等

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

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

一旦變量被定義,即可在編譯時為其分配相應數量的單元,并檢查其運算的合法性。§2.3整型數據2.3.1整型常量整型常量

整型常數C語言提供了三種形式

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

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

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

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

指數形式對于較大或較小的數,可用指數形式

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

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

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

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

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

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

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

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

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

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

例:"GoodMorning!"

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

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

A注意:1.

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

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

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

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

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

算術運算符+,–,,/,%,等3.

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

關系運算符>,<,==,>=,<=,!=4.

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

賦值運算符=等6.

條件運算符?=7.

逗號運算符,8.

指針運算符*,&11.

分量運算符?,,12.

下標運算符[]13.

其它運算符如函數的調用()9.

求字節數運算符sizeof10.

強制類型轉換運算符(類型)

2.8.2算術運算符和算術表達式一、基本算術運算符+

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

兩個整型數據相除(結果為整,一般向零靠攏)。–5/3–1“/”中,有一個float,則結果為double型,使用時千萬注意int/int出現數據丟失。四、自增,自減運算符設有inti=3;++自增1––自減1則:++i,i++都會使i變為4,但有區別:++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++);

結果:i=3若:

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

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

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

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

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

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

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

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

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

邏輯表達式

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

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

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

直到型APFTA直到P為真

先執行A,再判斷P,若為F,再執行A,如此反復,直到P為T.

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

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

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

if(表達式)

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

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

表達式為0,執行語句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.表達式可以是邏輯、關系,甚至是算術表達式。2.上述形式中的語句必須以分號結束3.上述形式中的語句可以是由{}括起來的復合語句。此時,在{}外可以不用分號.注意的問題: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輸入兩個實數,按代數值由小到大次序輸出這兩個數。

3.6,–3.2–3.20,3.60運行情況如下:例4.2輸入三個數,按大小順序輸出。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)內嵌ifelse內嵌注意:else與最近的if配對.一般形式在上述形式的if語句中,又可以是if語句–––稱為嵌套。if(表達式2)語句1if(表達式3)語句3else語句2else語句4例:if()if()語句2else語句3if(){if()語句1}

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

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

case常量表達式2:語句2

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

根據成績等級打印百分數段.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");}

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

{case常表1:語句1;

break;

case常表2:語句2;

break;……

case常表n:語句n;

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

1.

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

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

前面已介紹了順序結構,選擇結構,本章介紹循環結構。如:

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

一組重復執行的語句。則用循環結構解決。C語言用四種形式循環2.

while語句3.

do…while語句4.

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

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

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

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

一種專門的“直到型”循環語句。2.執行過程:先執行語句,再判表達式的值,若0,再執行語句,否則結束循環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語句的區別:當第一次執行時,若表達式=0時,則while語句與dowhile有所不同,dowhile執行一次后面的語句,而while不執行。§5.5for語句1.形式

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

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

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

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

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

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

while(i<=100)

{

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

循環的嵌套

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

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

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

break語句和contiune語句

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

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

從結構化程序要求出發,用break,退出循環,進入下一條語句。

注:break只能用于循環語句和switch語句。5.8.2continuce語句

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

程序舉例例1:

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

f2=f2+f1;交替的結果正好為一序列規律:

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運行結果為:15342331597109467502551422935245782415781718553772584177111211393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155

判一個數m是否為素數的方法:

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

#include<math.h>main()

{例2.

求100~200的素數.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運行結果如下:一.冒泡法:排序過程:(1)比較第一個數與第二個數,若a[0]>a[1],則交換;然后比較第二個數與第三個數;依次類推,直至第n-1個數和第n個數比較為止——第一趟冒泡排序,結果最大的數被安置在最后一個元素位置上(2)對前n-1個數進行第二趟冒泡排序,結果使次大的數被安置在第n-1個元素位置(3)重復上述過程,共經過n-1趟冒泡排序后,排序結束。#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]);}二、

排序問題–––計算機處理數據的一個重要問題排序算法較多,一種最簡單的算法–––選擇排序法用得較多。基本思路:設有n個數,需將它們從小到大順序排列。則:2.在剩下的n–1個元素中,找出第二小的元素并把它放在第二個位置上。3.對上述過程重復,直至剩下一個元素。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

從以上例子可以看到:用到兩種循環,第一種循環––找第i小的元素,第二種循––對其后的元素的一一比較。流程圖:初始化輸入n個元素a數組i1ji+1a[i]>a[j]交換a[i]a[j]BANoYesjj+1j>nii+1i>n–1打印結果結束內循環外循環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]);}第六章數組

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

其中數組:同一種(基本)類型按一定順序組合在一起的數據類型。§6.1

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

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

對部分元素賦初值

staticinta[10]={0,1,2,3,4};靜態

對全部元素賦初值

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

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

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

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

如:

intb[3][4];則:有三個特殊的一維數組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.二維數組的存放方式為:按行存放。由此可推廣至三維、n維數組的定義和存放。即:最右邊的下標變化最快。4.初始化:

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

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

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

將一個二維數組行和列元素互換,存到另一個二維數組中。例如: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");}}運行結果如下:

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真假二維數組一般用二重循環據此寫出以下程序: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);}輸出結果為:

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

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

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

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

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

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

在printf中須直接寫數組名.

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

即停止輸出

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

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

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

#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第七章函數§7.1概述1)除main外,其它為系統函數、自編函數,系統函數:由系統提供,用戶可調用。自編函數:由用戶按語法規則編寫。C程序由一個main和任意個函數組成。

2)

除main函數外,其它函數可相互調用main()abcdxz3)函數不可嵌套定義,具有全局性、平行性,4)函數分為有參與無參函數5)程序從main開始執行,最后又回到main函數結束。§7.2定義與調用類型標識符函數名(){說明部分語句

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

形參說明

{說明部分語句

}2.有參函數

定義形式例:

求二數之最大值

intmax(intx,inty)

{

intz;

z=x>y?x:y;

return(z);

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

無值返回:

有值返回:3.形參與實參調用時:

實參值單向傳遞形參。

函數被調用時,臨時分配單元給形參,調用完畢,這些單元被釋放。注:

實參可為表達式,其值傳遞。實參:出現在調用函數中,形參:出現被調用函數中。

實參、形參類型一致。

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

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

返回值類型為函數類型。一般return中的返回值類型應與函數定義時的類型一致,不一致時,以函數定義類型為準。return(表達式);由函數名只能得到一個返回值。5.調用函數應對被調用函數的返回值類型作出說明:(函數名相當于一變量,但應有所區別)例:

求二實數之和

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

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

以下幾種情況可省略對被調函數的說明:當返回值為整型、字符型。在調用之前定義函數。

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

函數不能嵌套定義,但可嵌套調用a(){調用b}b(){}main{調用a}求取大于50小于100的能被3整除的數的和。#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遞歸調用

遞歸:

一個函數在其函數體中又出現直接或間接地調用自身的語句.直接調用

intf(intx){inty,z;

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

intf1

(intx){inty,z;

z=f2(y);}

intf2

(intt)

{inta,b;

a=f1

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

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

條件成立,調用遞歸,否則結束。一個最常用的例子:

求n!1.從數學上定義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.執行過程:

設輸入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

當變成機器代碼時,將其拉成直線(線性程序代碼)。例: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兩個函數:move(getone,putone)

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

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

調用時塔用字符常量'A','B','C'表示。§7.5數組作為函數參數分為兩種情況:1.

數組元素作為實參2.

數組名同時為形、實參一、數組元素作為實參

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

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

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特點:

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

有一個一維數組score,

溫馨提示

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

評論

0/150

提交評論