信息學奧林匹克競賽C語言課程膠片4-定向改編V1.0_第1頁
信息學奧林匹克競賽C語言課程膠片4-定向改編V1.0_第2頁
信息學奧林匹克競賽C語言課程膠片4-定向改編V1.0_第3頁
信息學奧林匹克競賽C語言課程膠片4-定向改編V1.0_第4頁
信息學奧林匹克競賽C語言課程膠片4-定向改編V1.0_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言Part 4 for NOI1. 數(shù)組2. 函數(shù)問題:有如下幾組數(shù)據(jù),它們分別該如何存儲呢?一個班學生的學習成績一行文字一個矩陣這些數(shù)據(jù)的特點是:具有相同的數(shù)據(jù)類型使用過程中需要保留原始數(shù)據(jù) C語言為這些數(shù)據(jù),提供了一種構(gòu)造數(shù)據(jù)類型:數(shù)組。數(shù)組是一組具有是一組具有相同數(shù)據(jù)類型相同數(shù)據(jù)類型的數(shù)據(jù)的的數(shù)據(jù)的有序集合。有序集合。一維數(shù)組類型說明符 數(shù)組名常量表達式;例如: intint a a1010; ;它表示定義了一個整形數(shù)組,數(shù)組名為a a,此數(shù)組有1010個元素。數(shù)組名定名規(guī)則和變量名相同,遵循標識符定名規(guī)則。在定義數(shù)組時,需要指定數(shù)組中元素的個數(shù),方括弧中的常量表達式用來表示元素的個

2、數(shù),即數(shù)組長度。例如,指定a10,表示a數(shù)組有10個元素,注意下標是從0開始的,不存在數(shù)組元素a10。C89規(guī)定常量表達式中可以包括常量和符號常量,但不能包含變量,即不允許對數(shù)組的大小作動態(tài)定義,數(shù)組的大小不依賴于程序運行過程中變量的值。例如,下面這樣定義數(shù)組是不行的:一位數(shù)組變長數(shù)組(C89C89不允許,C99C99允許)float afloat a0 0; ; / /* * 數(shù)組大小為0 0沒有意義 * */ /intint b(2)(3); b(2)(3); / /* * 不能使用圓括號 * */ / 下標可以是整型常量,也可以是整型表達式A2+1, a2A2+1, a2* *3, a7

3、/3 3, a7/3 int n; scanf(%d, &n); int arrayn; if(n 0) array0 = 100; printf(array0=%dn, array0); else printf(array length is zero.n);數(shù)組的存儲 一維數(shù)組: floatfloat markmark100;100;一個元素占4個字節(jié) 每個數(shù)據(jù)元素占用的字節(jié)數(shù),就是基本類型的字節(jié)數(shù) int i, a10; for (i = 0; i 0; i-) printf(%d , ai); printf(n);例7.1:10元素一維數(shù)組倒序輸出初始化在定義數(shù)組時對數(shù)組元素賦

4、以初值。例如: :intint a a1010=0=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9;9;將數(shù)組元素的初值依次放在一對花括弧內(nèi)。可以只給一部分元素賦值。例如: :intint a a1010=0=0,1 1,2 2,3 3,4;4; 定義a數(shù)組有10個元素,但花括弧內(nèi)只提供5個初值,這表示只給前面5個元素賦初值,后5個元素值為0。如果想使一個數(shù)組中全部元素值為0 0,可以寫成intint a a1010=0=0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0; 0; 或 intint a a1010=0;=0;不能寫成:intint a

5、 a1010=0=0* *10;10;這是與FORTRAN語言不同的,不能給數(shù)組整體賦初值。在對全部數(shù)組元素賦初值時,由于數(shù)據(jù)的個數(shù)已經(jīng)確定,因此可以不指定數(shù)組長度。例如: :intint a a5 5=1=1,2 2,3 3,4 4,5; 5; 也可以寫成 int a=1,2,3,4,5; 在第二種寫法中,花括弧中有5個數(shù),系統(tǒng)就會據(jù)此自動定義a數(shù)組的長度為5。但若數(shù)組長度與提供初值的個數(shù)不相同,則數(shù)組長度不能省略。例如,想定義數(shù)組長度為10,就不能省略數(shù)組長度的定義,而必須寫成 intint a a1010=1=1,2 2,3 3,4 4,5; 5; 只初始化前5個元素,后5個元素為0例7

6、.2 用數(shù)組來處理,求解Fibonacci數(shù)列 Fibonacci數(shù)列公式:已知: : a a1 1=a=a2 2=1, a=1, an n=a=an-1n-1+a+an-2 n-2 即:1,1,2,3,5,8,13:1,1,2,3,5,8,13 int i; int f20=1, 1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i = 0; i 20; i+) if(i%5 = 0) printf(n); printf(%12d, fi); 使用冒泡排序,按升序排序例7.3 假如有n個人,希望按年齡對他們進行排序 例7.3input 10 numbers:1 2 3

7、 6 5 4 7 8 9 11the sorted numbers:1 2 3 4 5 6 7 8 9 11 int a10; int i,j,t; printf(input 10 numbers:n); for(i=0; i10; i+) scanf(%d, &ai); printf(n); for(j=0; j9; j+) for(i=0; i ai+1) t = ai; ai = ai+1; ai+1 = t; printf(the sorted numbers:n); for(i=0; i10; i+) printf(%d , ai); printf(n); 類型說明符 數(shù)組名

8、常量表達式常量表達式; 例如:定義a a為3 34(34(3行4 4列) )的數(shù)組,b b為5 510(510(5行1010列) )的數(shù)組。如下: float afloat a3 34 4,b b5 51010; 不能寫成 float afloat a3 3,4 4,b b5 5,1010; ;二維數(shù)組 二維數(shù)組中的元素在內(nèi)存中的排列順序是:按行存放,即先順序存放第一行的元素,再存放第二行的元素 a34數(shù)組存放二維數(shù)組在內(nèi)存中的存放二維數(shù)組元素的表示形式為:二維數(shù)組元素的表示形式為:數(shù)組名下標下標數(shù)組名下標下標 例如:例如: a a2 23 3下標可以是整型表達式,下標可以是整型表達式,如如

9、a a2-12-12 2* *2-12-1數(shù)組元素可以出現(xiàn)在表達式中,也可以被賦值,例如數(shù)組元素可以出現(xiàn)在表達式中,也可以被賦值,例如:b b1 12 2=a=a2 23 3/2/2不要寫成不要寫成 a a2 2,3 3,a a2-12-1,2 2* *2-12-1形式形式二維數(shù)組的引用數(shù)據(jù)類型 數(shù)組名 常量表達式1常量表達式2初始化數(shù)據(jù);分行賦初值,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;寫在一個大括號中,按排列順序賦初值,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;對部分元素賦初值,如: int a34=1,5,9; 也可以對

10、各行中的某一元素賦初值,如 int a34=1,0,6,0,0,11;也可以只對某幾行元素賦初值。如:int a34=1,5,6; 如果對全部元素都賦初值,則定義數(shù)組時對第一維的長度可以不指定,但第二維的長度不能省。如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等價于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;在定義時也可以只對部分元素賦初值而省略第一維的長度,但應(yīng)分行賦初值。如:int a4=0,0,3,0,10;二維數(shù)組初始化例7.4 將一個二維數(shù)組行和列元素互換,存到另一個二維數(shù)組中642531a642531b int a32 =

11、1, 2, 3, 4, 5, 6; int b23, i, j; printf(array a:n); for (i=0; i=2; i+) for (j=0; j=1; j+) printf(%5d, aij); bji = aij; printf(n); printf(array b:n); for (i=0; i=1; i+) for(j=0; j=2; j+) printf(%5d, bij); printf(n); int i,j,row=0,colum=0,max; int a34=1,2,3,4, 9,8,7,6, -10,10,-5,2; /此處初始化應(yīng)該改為輸入函數(shù) max=

12、a00; for (i=0; i=2; i+) for (j=0; jmax) max=aij; row=i; colum=j; printf(max=%d,row=%d,colum=%dn, max, row, colum);例7.5: 有一個34的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號 定義方法與前面介紹的類似。例如: char cchar c1010; ; 用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個元素存放一個字符。字符數(shù)組字符數(shù)組初始化 對字符數(shù)組初始化,最容易理解的方式是逐個字符賦給數(shù)組中各元素。如: char c10= I, ,a,m,,h,a

13、,p,p,y; 如果在定義字符數(shù)組時不進行初始化,則數(shù)組中各元如果在定義字符數(shù)組時不進行初始化,則數(shù)組中各元 素的值是不可預(yù)料的。素的值是不可預(yù)料的。 如果花括弧中提供的初值個數(shù)如果花括弧中提供的初值個數(shù)( (即字符個數(shù)即字符個數(shù)) )大于數(shù)組大于數(shù)組長度,則按語法錯誤處理。長度,則按語法錯誤處理。 char cchar c1010=c=c, ,pp,rr,oo,gg,rr,aa,m; m; 字符數(shù)組的部分初始化 如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦如果初值個數(shù)小于數(shù)組長度,則只將這些字符賦給數(shù)組中前面那些元素,其余的元素自動定為空給數(shù)組中前面那些元素,其余的元素自動定為空字符字符( (

14、即即0)0)。例如:。例如: 數(shù)字數(shù)組初始化時自動確定長度 如果提供的初值個數(shù)與預(yù)定的數(shù)組長度相同,在定義時可如果提供的初值個數(shù)與預(yù)定的數(shù)組長度相同,在定義時可以省略數(shù)組長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。以省略數(shù)組長度,系統(tǒng)會自動根據(jù)初值個數(shù)確定數(shù)組長度。例如:例如: 也可以定義和初始化一個二維字符數(shù)組。例如:也可以定義和初始化一個二維字符數(shù)組。例如: char diamondchar diamond5 55 5= = , ,* *, ,* *, ,* *,* *, , , ,* *, ,* *, ,* *, , ,* *char cchar c=I, ,a,m, ,h,=I, ,a,

15、m, ,h,a,p,p,y;a,p,p,y;數(shù)組數(shù)組c c的長度自動定為的長度自動定為1010。 char c=I, , a, m, , a, , b, o, y, .; int i, len = 0; len = strlen(c); printf(strlen(c)=%dn, len); len = sizeof(c); printf(sizeof(c)=%dn, len); for(i = 0; i len; i+) printf(%c, ci); printf(n);例7.6 輸出一個字符串 char diamond5= , , *, , *, , *, *, , , , *, , *

16、, , *, , , *; int i, j; for (i=0; i5; i+) for (j=0; j5; j+) printf(%c, diamondij); printf(n); 例7.7 使用星號模擬一個鉆石圖形 為了測定字符串的實際長度,C C語言規(guī)定了一個語言規(guī)定了一個“字符串字符串結(jié)束標志結(jié)束標志”,以字符,以字符00作為標志。作為標志。如果有一個字符串,前面9個字符都不是空字符(即0) ,而第10個字符是0,則此字符串的有效字符為9個。系統(tǒng)對字系統(tǒng)對字符串常量也自動加一個符串常量也自動加一個00作為結(jié)束符。作為結(jié)束符。 00代表代表ASCIIASCII碼為碼為0 0的字符,從

17、的字符,從ASCIIASCII碼表中可以查到,碼表中可以查到,ASCIIASCII碼為碼為0 0的字符不是一個可以顯示的字符,而是一個的字符不是一個可以顯示的字符,而是一個“空操作符空操作符”,即它什么也不干。用它來作為字符串結(jié)束,即它什么也不干。用它來作為字符串結(jié)束標志不會產(chǎn)生附加的操作或增加有效字符,只起一個供辨標志不會產(chǎn)生附加的操作或增加有效字符,只起一個供辨別的標志。別的標志。字符串結(jié)束符 /char c=I, , a, m, , a, , b, o, y, ., 0; /如果c不加0, strlen(c)值和sizeof(c)有什么不同 /char c11=I, , a, m, ,

18、a, , b, o, y, .; /char c=I, , a, m, , a, , b, o, y, .; /char c=“I am a boy.”; /相當于加0初始化 /char c20=“I am a boy.”; /11之后使用0填充 char c=I am a boy.; int i, len = 0; len = strlen(c); printf(strlen(c)=%dn, len); len = sizeof(c); printf(sizeof(c)=%dn, len); for(i = 0; i len; i+) printf(%c, ci); printf(“n”);

19、字符串初始化字符數(shù)組并不要求它的最后一個字符為0,甚至可以不包含0 。例如:char char c=c=C,h,i,n,aC,h,i,n,a;這樣寫完全是合法的。但是由于系統(tǒng)對字符串常量自動加一個0 。因此,人們?yōu)榱耸固幚矸椒ㄒ恢拢谧址麛?shù)組中也常人為地加上一個0 。如: char char c=c=C,h,i,n,aC,h,i,n,a,0;,0;這樣做,這樣做是為了便于引用字符數(shù)組中的字符串。char c=Pascal Program;printf(Please input Hello:n);for (int i=0; i5; i+) char ch = getchar(); ci = ch

20、;printf(%s, c);例7.8從鍵盤輸入Hello覆蓋Pascal Pragramchar c=Pascal Program;printf(Please input Hello:n);scanf(%s, c);printf(%s, c);char ch;scanf(%c, &ch);字符串存儲(1)用“%s”格式符輸出字符串時,printf函數(shù)中的輸出項是字符數(shù)組名,而不是數(shù)組元素名。如:寫成下面這樣是不對的:printf(%s,c0);(2)如果數(shù)組長度大于字符串實際長度,也只輸出到遇0結(jié)束。(3)輸出字符不包括結(jié)束符0。如:char c10=China; /* 字符串長度為

21、5,連0共占6個字節(jié) */printf(%s,c);只輸出字符串的有效字符“China”,而不是輸出10個字符。這就是用字符串結(jié)束標志的好處。(4)如果一個字符數(shù)組中包含一個以上0,則遇第一個0時輸出就結(jié)束。(5)可以用scanf函數(shù)輸入一個字符串。例如 scanf(%s,c);scanf函數(shù)中的輸入項c是已定義的字符數(shù)組名,輸入的字符串應(yīng)短于已定義的字符數(shù)組的長度。例如,定義 char c6;從鍵盤輸入: China系統(tǒng)自動在China后面加一個0結(jié)束符。函數(shù)printf和scanf printf(Please input 3 words:n); char str15, str25, str

22、35; scanf(%s%s%s, str1, str2, str3); printf(string 1:%s, string 2:%s, string 3:%s, str1, str2, str3);例7.9 從鍵盤輸入三個單詞到三個字符串中 printf(Please input a sentence:n); char str20; scanf(%s, str); printf(string:%s, str);例7.10 空格在scanf中的作用輸入How are you輸出How編譯器沿用英語句子的習慣,把空格作為scanf函數(shù)的分隔符號str不能寫為&str printf(Pl

23、ease input a sentence:n); char str20; scanf(%s, str); printf(address:%o, str);例7.11 使用八進制輸出一個字符串的地址%o 有符號八進制整數(shù)%i 有符號整數(shù)%u 無符號十進制整數(shù)%d 有符號十進制整數(shù)%s 字符串%x 有符號十六進制整數(shù)%a, %e, %f, %g 浮點數(shù)%c 字符% 轉(zhuǎn)義% 所期望的字符集函數(shù)形式函數(shù)形式功能功能gets(字符數(shù)組)從終端輸入一個字符串到字符數(shù)組puts(字符數(shù)組)輸出一個字符串(0結(jié)尾)到終端strcat(字符數(shù)組,字符數(shù)組)把兩個字符串連接起來strcpy(字符數(shù)組,字符數(shù)組)

24、復制字符串strcmp(字符數(shù)組,字符數(shù)組)比較兩個字符串,相等返回0,大于返回正整數(shù),否則返回負整數(shù)strlen(字符數(shù)組)返回字符串長度strlwr(字符數(shù)組)轉(zhuǎn)換為小寫字母strupr(字符數(shù)組)轉(zhuǎn)換為大寫字母字符串處理函數(shù) char string500; int i, num=0, word=0; char c; gets(string); for (i=0; (c=stringi)!=0; i+) if(c = ) word=0; else if(word = 0) word = 1; num+; printf(“There are %d words in the line.n”,

25、num);例7.12統(tǒng)計一段話的單詞數(shù)量 char string20; char str320; printf(Please input 3 sentences:n); for (int i=0; i 0) strcpy(string, str0); else strcpy(string,str1); if (strcmp(str2,string) 0) strcpy(string,str2); printf(nthe largest string is:n%sn, string);7.13 找出三個字符串中的最大者Please input 3 sentences:How are you.I

26、am a bad boy.Happy new year.the largest string is:I am a bad boy.1. 數(shù)組2. 函數(shù) 部件 組裝 一個C程序由一個或者多個源程序文件組成 一個源程序文件由一個或者多個程序模塊(部件)組成模塊化程序設(shè)計Function: 實現(xiàn)特定功能的程序模塊庫函數(shù)和用戶自定義函數(shù)無參函數(shù): 類型名 函數(shù)名() 函數(shù)體 有參函數(shù): 類型名 函數(shù)名(形式參數(shù)列表) 函數(shù)體 函數(shù)定義C89中標準的頭文件 定義宏assert() 字符處理 錯誤報告 定義與實現(xiàn)相關(guān)的浮點值勤 定義與實現(xiàn)相關(guān)的各種極限值 支持函數(shù)setlocale() 數(shù)學函數(shù)及其各種定

27、義 支持非局部跳轉(zhuǎn) 定義信號值 支持可變長度的變元列表 定義常用常數(shù)輸入輸出函數(shù)及其各種定義 動態(tài)存儲分配函數(shù)及其他各種聲明 字符串函數(shù)及其各種定義 支持系統(tǒng)時間函數(shù)C99新增的頭文件和庫 支持復數(shù)算法 給出對浮點狀態(tài)標記和浮點環(huán)境的其他方面的訪問 處理最大寬度整數(shù)的函數(shù),包含stdint.h 定義標準的、可移植的整型類型集合。 用于定義對應(yīng)各種運算符的宏 支持布爾數(shù)據(jù)類型類型。定義宏bool,以便兼容于C+ 定義一般類型的浮點宏 支持多字節(jié)和寬字節(jié)函數(shù)支持多字節(jié)和寬字節(jié)分類函數(shù) 無參函數(shù)的調(diào)用語句 函數(shù)名() 有參函數(shù)的調(diào)用語句 函數(shù)名(實參列表) 函數(shù)表達式 函數(shù)出現(xiàn)在表達式中,例如:c=

28、max(x,y)*2-100; 函數(shù)參數(shù) 另外一個函數(shù)的參數(shù),例如:printf(“%d”, max(a,b);函數(shù)調(diào)用#include void print_star();void print_message();int main() print_star(); print_message(); print_star(); return 0;void print_star() printf(*n);void print_message() printf( How are you!n);例8.1 使用無參函數(shù)輸出* How are you!*#include int main() int ma

29、x(int x, int y); int a, b, c; printf(Please input two number:); scanf(%d, %d, &a, &b); c = max(a, b); printf(The max is %dn, c); return 0;int max(int x, int y) int z; if(x y) z = x; else z = y; return (z);例8.2 輸入兩個整數(shù),輸出最大者。要求在主函數(shù)輸入兩個數(shù),用用戶自定義函數(shù)max求最大值,并在主函數(shù)中輸出最大值。int max(int, int); orint max(

30、int a, int b); 針對被調(diào)用函數(shù)的形參分配內(nèi)存單元 將實參對應(yīng)的值傳遞給形參 執(zhí)行被調(diào)用函數(shù)的函數(shù)體的語句 通過return語句將函數(shù)值帶回調(diào)用函數(shù) 調(diào)用結(jié)束,釋放形參單元函數(shù)調(diào)用過程 在函數(shù)調(diào)用之前要求進行被調(diào)用函數(shù)聲明delaration 函數(shù)原型便于編譯器對函數(shù)調(diào)用進行合法性檢查 合法性檢查內(nèi)容包括函數(shù)名、函數(shù)值類型、參數(shù)個數(shù)、參數(shù)類型、參數(shù)順序 檢查通過標準:一致或者兼容 兼容檢查能否進行類型轉(zhuǎn)換 被調(diào)用函數(shù)在調(diào)用位置之前,不用聲明 在源文件開頭聲明是全局性的,就不必在函數(shù)開頭聲明了函數(shù)原型function prototype函數(shù)原型的一般形式為函數(shù)原型的一般形式為(1)(

31、1) 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (參數(shù)類型參數(shù)類型1 1,參數(shù)類型,參數(shù)類型2)2);(2)(2) 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (參數(shù)類型參數(shù)類型1 1,參數(shù)名,參數(shù)名1 1,參數(shù)類型,參數(shù)類型2 2,參數(shù)名參數(shù)名2)2); 參數(shù):通過形式參數(shù)和實際參數(shù) 返回值:用return語句返回計算結(jié)果 全局變量:外部變量函數(shù)間傳遞數(shù)據(jù)的方法在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時,它們并不占內(nèi)存中的存儲單元。 只有在發(fā)生函數(shù)調(diào)用時,函數(shù)中的形參才被分配內(nèi)存單元。 在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。實參可以是常量、變量或表達式,如: (,); 但要求它們有確定的值。在調(diào)用時將實參的值賦給形參。在被定義的函數(shù)中,必須指定形參的類型實參與形參的類型應(yīng)相同或賦值兼容。在語言中,實參向?qū)π螀⒌臄?shù)據(jù)傳遞是“值傳遞”,單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。在內(nèi)存中,實參單元與形參單元是不同的單元。形參和實參return語句將被調(diào)用函數(shù)中的一個確定值帶回主調(diào)函數(shù)中去如果需要從被調(diào)用函數(shù)帶回一個函數(shù)值供主調(diào)函數(shù)使用,被調(diào)用函數(shù)中必須包含return語句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值可以不要return語句。 一個函數(shù)中可以有一個以上的return語句,執(zhí)行到哪一個return語

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論