版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、高級語言自主學(xué)習(xí)內(nèi)容說明:帶“* ”的為自主學(xué)習(xí)的基本要求。 主要參考教材、C 程序設(shè)計 ( 第三版 ) 。一、進(jìn)制相關(guān)知識數(shù)值數(shù)據(jù)在計算機(jī)中以二進(jìn)制形式存放。相關(guān)概念如下:位(bit ):指一位二進(jìn)制代碼,它只具有0 和 1 兩個狀態(tài)。字節(jié)(byte ):8 位二進(jìn)制代碼為一個字節(jié), 它是衡量信息數(shù)量或存儲設(shè)備容量的單位。字( Word):字由字節(jié)構(gòu)成,一般為字節(jié)的整數(shù)倍。也是表示存儲容量的單位。字長:是指參與一次運(yùn)算的數(shù)的位數(shù),它與指令長度有著對應(yīng)關(guān)系。字長的大小還是衡量計算機(jī)精度和運(yùn)算速度的一項(xiàng)技術(shù)指標(biāo)。數(shù)值數(shù)據(jù)的表示最常用的十進(jìn)制,另外還有二進(jìn)制、八進(jìn)制、十六進(jìn)制等。二進(jìn)制是逢二進(jìn)一,
2、所有的數(shù)都用兩個數(shù)字符號 0 或 1 表示。二進(jìn)制的每一位只能表示 0 或 1。例如( 1) 10=(001) 2。計算機(jī)中的數(shù)值是以補(bǔ)碼表示的,正數(shù)的補(bǔ)碼和原碼相同;負(fù)數(shù)的補(bǔ)碼:將該數(shù)的絕對值的二進(jìn)制形式按位取反再加 1。求正數(shù)原碼的方法: 除基逆序取余至商為0 止。如 10 的原碼為 0 01010。求負(fù)數(shù)補(bǔ)碼示例。例如:求-10 的補(bǔ)碼:先求 10 的原碼(設(shè)為 2 個字節(jié)長):0000000000001010按位取反:1111111111110101再加 1,得 -10 的補(bǔ)碼:1111111111110110由此可知,左面的第一位是表示符號的。八進(jìn)制是逢八進(jìn)一,所有的數(shù)位都用數(shù)字符號
3、07 表示。二進(jìn)制的缺點(diǎn)是表示一個數(shù)需要的位數(shù)多,書寫數(shù)據(jù)和指令不方便。通常,為了方便起見,將二進(jìn)制數(shù)從低向高每三位組成一組。例如:有一個二進(jìn)制( )2,每三位一組,即:( 100,100,001, 100)2 可表示成八進(jìn)制數(shù)( 4414)8,如此表示使得每組的值大小是從 0(000) 7( 111),且數(shù)值逢八進(jìn)一,即為八進(jìn)制。十六進(jìn)制 是逢十六進(jìn)一,所有的數(shù)位都用數(shù)字符號09 及字母 AF(也可以用 af )表示; AF或 af 表示十進(jìn)制中的 1015。若將二進(jìn)制數(shù)每四位一組,每組的值大小是從0(0000 ) 15( 1111),且逢十六進(jìn)一,即為十六進(jìn)制。 用 A、B 、C、D 、E
4、、F 分別代表10 到 15 的 6 個數(shù)。上面的二進(jìn)制數(shù) ( 1001,0000, 1100) 2,可以表示成十進(jìn)制數(shù)(90C) 16。十進(jìn)制數(shù)轉(zhuǎn)換為其他進(jìn)制數(shù)的方法:對于整數(shù)部分,除以基數(shù)逆序取余至商為 0 止;對于小數(shù)部分:乘以基數(shù)順序取整至小數(shù)為 0 或達(dá)到需要的精度止。 如:(123)10=( 173)8=(7B)16十進(jìn)制數(shù) 123 轉(zhuǎn)換為十六進(jìn)制數(shù)和八進(jìn)制數(shù),用短除法,過程如下:16123167 110 78123815 381 70 1其他進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù),根據(jù)按權(quán)展開式計算。如:( 173) 8=3*8 0+7*8 1+1*8 2=(123) 10二 *、算法的流程圖描述
5、表示算法可以:用自然語言表示算法、用流程圖表示算法、用偽代碼表示算法、用計算機(jī)語言表示算法等。用流程圖表示算法,直觀形象,易于理解。一個流程圖包括:1. 表示相應(yīng)操作的框;2. 帶箭頭的流程線;3. 框內(nèi)外必要的文字說明。下圖所示是流程圖的基本要素。例 1:用流程圖表示求5! 的算法。例 2:有 50 個學(xué)生,要求將他們之中成績在80 分以上者打印出來。如果, n 表示學(xué)生學(xué)號,ni 表示第個學(xué)生學(xué)號;g 表示學(xué)生成績,gi 表示第個學(xué)生成績用流程圖表示算法如下:例 3:用流程圖表示判定閏年的算法。三種基本結(jié)構(gòu)改進(jìn)的流程圖結(jié)構(gòu)如下:順序結(jié)構(gòu):選擇結(jié)構(gòu):循環(huán)結(jié)構(gòu):三種基本結(jié)構(gòu)的共同特點(diǎn):只有一個
6、入口;只有一個出口;結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會被執(zhí)行到;結(jié)構(gòu)內(nèi)不存在“死循環(huán)” 。N-S 流程圖是另一種流程圖,是 1973 年美國學(xué)者提出的。三種基本結(jié)構(gòu)的描述如下:順序結(jié)構(gòu):選擇結(jié)構(gòu):循環(huán)結(jié)構(gòu):三、 C 語言運(yùn)算符的優(yōu)先級與使用形式優(yōu)先級運(yùn)算符名稱或含義使用形式數(shù)組名 常量表達(dá)式 數(shù)組下標(biāo)數(shù)組名 下標(biāo)表達(dá)式 (表達(dá)式)()圓括號函數(shù)名 ( 形參表 ).成員選擇(對象)對象 . 成員名1->成員選擇(指針)對象指針 -> 成員名-負(fù)號運(yùn)算符- 表達(dá)式(類型)強(qiáng)制類型轉(zhuǎn)換( 數(shù)據(jù)類型 ) 表達(dá)式+變量名+自增運(yùn)算符變量名 +- 變量名-自減運(yùn)算符變量名 -*取值運(yùn)算符* 指針變量2&
7、amp;取地址運(yùn)算符&變量名!邏輯非運(yùn)算符! 表達(dá)式按位取反運(yùn)算符表達(dá)式sizeof長度運(yùn)算符sizeof(表達(dá)式 )/除表達(dá)式1/表達(dá)式 2*乘表達(dá)式1*表達(dá)式 23%余數(shù)(取模)整型表達(dá)式1 / 整型表達(dá)式 2+加表達(dá)式 1+表達(dá)式 24-減表達(dá)式 1-表達(dá)式 2<<左移變量 <<表達(dá)式5>>右移變量 >>表達(dá)式>大于表達(dá)式 1>表達(dá)式 2>=大于等于表達(dá)式 1 >=表達(dá)式 2<小于表達(dá)式 1<表達(dá)式 26<=小于等于表達(dá)式 1 <=表達(dá)式 2=等于表達(dá)式 1 =表達(dá)式 27!=不等于表
8、達(dá)式 1 !=表達(dá)式 28&按位與表達(dá)式 1&表達(dá)式 29按位異或表達(dá)式 1表達(dá)式 210|按位或表達(dá)式 1|表達(dá)式 211&&邏輯與表達(dá)式 1 && 表達(dá)式 212|邏輯或表達(dá)式 1 |表達(dá)式 213?:條件運(yùn)算符表達(dá)式 1? 表達(dá)式 2:表達(dá)式 314=賦值運(yùn)算符變量 = 表達(dá)式/=除后賦值變量 /=表達(dá)式*=乘后賦值變量 *=表達(dá)式%=取模后賦值變量 %= 表達(dá)式+=加后賦值變量 +=表達(dá)式-=減后賦值變量 -=表達(dá)式<<=左移后賦值變量 <<=表達(dá)式>>=右移后賦值變量 >>=表達(dá)式&
9、;=按位與后賦值變量 &=表達(dá)式=按位異或后賦值變量 =表達(dá)式|=按位或后賦值變量 |=達(dá)式15,逗號運(yùn)算符表達(dá)式 1,表達(dá)式 2,四 *、C 語言輸入輸出在 C 語言中,所有的數(shù)據(jù)輸入 / 輸出都通過調(diào)用庫函數(shù)完成的。面向標(biāo)準(zhǔn)輸入輸出的庫函數(shù)調(diào)用前必須包含“ stdio.h ”。1、putchar函數(shù)putchar函數(shù)是字符輸出函數(shù),其功能是在顯示器上輸出單個字符。對控制字符則執(zhí)行控制功能,不在屏幕上顯示。其一般形式為:putchar( 字符變量 );例如:putchar('A');/輸出大寫字母Aputchar(x);/輸出字符變量 x 的值putchar('
10、;101');/也是輸出字符Aputchar('n');/換行2、getchar 函數(shù)getchar 函數(shù)的功能是從鍵盤上輸入一個字符。其一般形式為:getchar();通常把輸入的字符賦予一個字符變量,構(gòu)成賦值語句,如:char c=getchar();3、printf函數(shù)printf函數(shù)稱為格式輸出函數(shù),其功能是按用戶指定的格式,把指定的數(shù)據(jù)顯示到顯示器屏幕上。printf函數(shù)調(diào)用的一般形式為:printf(“格式控制字符串”,輸出表列);其中格式控制字符串用于指定輸出格式。 格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以 %開頭的字符串,在%后面跟
11、有各種格式字符,以說明輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等。如:“%d”表示按十進(jìn)制整型輸出;“%ld”表示按十進(jìn)制長整型輸出;“%c”表示按字符型輸出等。非格式字符串在輸出時原樣照印,在顯示中起提示作用。輸出表列中給出了各個輸出項(xiàng), 要求格式字符串和各輸出項(xiàng)在數(shù)量和類型上應(yīng)該一一對應(yīng)。格式字符串的一般形式為:標(biāo)志 輸出最小寬度 .精度 長度 類型其中方括號 中的項(xiàng)為可選項(xiàng)。各項(xiàng)的意義介紹如下:1) 類型:類型字符用以表示輸出數(shù)據(jù)的類型, 其格式符和意義如下表所示:格式字符意義d以十進(jìn)制形式輸出帶符號整數(shù) ( 正數(shù)不輸出符號 )o以八進(jìn)制形式輸出無符號整數(shù) ( 不輸出前綴 0)x,X以十六進(jìn)
12、制形式輸出無符號整數(shù)( 不輸出前綴 Ox)u以十進(jìn)制形式輸出無符號整數(shù)f以小數(shù)形式輸出單、雙精度實(shí)數(shù)e,E以指數(shù)形式輸出單、雙精度實(shí)數(shù)g,G以%f 或%e中較短的輸出寬度輸出單、雙精度實(shí)數(shù)c輸出單個字符s輸出字符串2) 標(biāo)志:標(biāo)志字符為 - 、+、#、空格四種,其意義下表所示:標(biāo)志意義- 結(jié)果左對齊,右邊填空格+ 輸出符號 ( 正號或負(fù)號 )空格輸出值為正時冠以空格,為負(fù)時冠以負(fù)號#對 c,s,d,u 類無影響;對 o 類, 在輸出時加前綴 o;對 x 類, 在輸出時加前綴 0x;對 e,g,f 類當(dāng)結(jié)果有小數(shù)時才給出小數(shù)點(diǎn)3) 輸出最小寬度 : 用十進(jìn)制整數(shù)來表示輸出的最少位數(shù)。 若實(shí)際位數(shù)
13、多于定義的寬度,則按實(shí)際位數(shù)輸出,若實(shí)際位數(shù)少于定義的寬度則補(bǔ)以空格或 0。4) 精度 : 精度格式符以“ . ”開頭,后跟十進(jìn)制整數(shù)。本項(xiàng)的意義是:如果輸出數(shù)字,則表示小數(shù)的位數(shù);如果輸出的是字符,則表示輸出字符的個數(shù);若實(shí)際位數(shù)大于所定義的精度數(shù),則截去超過的部分。5)長度 : 長度格式符為 h,l 兩種, h 表示按短整型量輸出, l 表示按長整型量輸出。4、scanf 函數(shù)scanf 函數(shù)稱為格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。 scanf 函數(shù)的一般形式為:scanf( “格式控制字符串”,地址表列);其中,格式控制字符串的作用與 printf 函數(shù)相
14、同,但一般不能有非格式字符串,也就是不能有提示字符串, 若有需要原樣輸入。 地址表列中給出各變量的地址。地址是由地址運(yùn)算符“ &”后跟變量名組成的,但字符數(shù)組名不需要地址符。例如, &a, &b 分別表示變量 a 和變量 b 的地址。這個地址就是編譯系統(tǒng)在內(nèi)存中給 a,b 變量分配的地址。變量的地址是編譯系統(tǒng)分配的,用戶不必關(guān)心具體的地址是多少。格式字符串的一般形式為:%* 輸入數(shù)據(jù)寬度 長度 類型其中有方括號 的項(xiàng)為任選項(xiàng)。各項(xiàng)的意義如下:1) 類型:表示輸入數(shù)據(jù)的類型,其格式符和意義如下表所示。格式字符意義d輸入十進(jìn)制整數(shù)o輸入八進(jìn)制整數(shù)x輸入十六進(jìn)制整數(shù)u輸入無符
15、號十進(jìn)制整數(shù)f 或 e輸入實(shí)型數(shù) ( 用小數(shù)形式或指數(shù)形式 )c輸入單個字符s輸入字符串2) “* ”符 : 用以表示該輸入項(xiàng) , 讀入后不賦予相應(yīng)的變量,即跳過該輸入值。如 :scanf("%d %*d %d",&a,&b);當(dāng)輸入為: 123時,把 1 賦予 a,2 被跳過, 3 賦予 b。3) 寬度 : 用十進(jìn)制整數(shù)指定輸入的寬度 ( 即字符數(shù) ) 。例如: scanf("%5d",&a);輸入: 12345678只把 12345 賦予變量 a,其余部分被截去。又如:scanf("%4d%4d",&
16、;a,&b);輸入: 12345678將把 1234 賦予 a,而把 5678 賦予 b。4) 長度 : 長度格式符為 l 和 h,l 表示輸入長整型數(shù)據(jù) ( 如%ld) 和雙精度浮點(diǎn)數(shù) ( 如 %lf) 。h 表示輸入短整型數(shù)據(jù)。使用 scanf 函數(shù)還必須注意以下幾點(diǎn):1) scanf 函數(shù)中沒有精度控制,如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數(shù)為 2 位的實(shí)數(shù)。2) scanf 中要求給出變量地址, 如給出變量名則會出錯。 如 scanf("%d",a);是非法的,應(yīng)改為 scnaf("
17、;%d",&a); 才是合法的。3) 在輸入多個數(shù)據(jù)時,若格式控制串中有非格式字符作輸入數(shù)據(jù)之間的間隔則在輸入時該間隔符須原樣輸入。如:int a,b,c;scanf ("%d,%d,%d",&a,&b,&c);輸入時必須如下輸入:1,2,34) 在輸入多個數(shù)值數(shù)據(jù)時,若格式控制串中沒有非格式字符作輸入數(shù)據(jù)之間的間隔則可用空格, TAB或回車作間隔。 C 編譯在碰到空格, TAB,回車或非法數(shù)據(jù) ( 如對“ %d”輸入“ 12A”時,A 即為非法數(shù)據(jù) ) 時即認(rèn)為該數(shù)據(jù)結(jié)束。5) 在輸入字符數(shù)據(jù)時,若格式控制串中無非格式字符,則認(rèn)為
18、所有輸入的字符均為有效字符。例如:scanf("%c%c%c",&a,&b,&c);輸入為:def則把 'd' 賦予 a, ' '賦予 b,'e'賦予 c。只有當(dāng)輸入為:def才能把 'd' 賦于 a,'e'賦予 b,'f'賦予 c。如果在格式控制中加入空格作為間隔,如:scanf ("%c %c %c",&a,&b,&c);則輸入時各數(shù)據(jù)之間可加空格。五 *、switch 語句與 do while 語句1、sw
19、itch 語句多分支結(jié)構(gòu)可以采用if語句嵌套的方法,也可以采用switch 語句。switch語句的格式:switch( 表達(dá)式 )case常量表達(dá)式 1: 語句序列 1case常量表達(dá)式 2: 語句序列 2case常量表達(dá)式 k: 語句序列 k default:語句序列 k+1 switch語句中的表達(dá)式及常量表達(dá)式一般應(yīng)為整型或字符型。執(zhí)行時,按表達(dá)式與 case 后的常量表達(dá)式的值進(jìn)行匹配, 匹配成功則執(zhí)行相應(yīng)語句序列 (多條語句情況下,也可以不用 ),否則執(zhí)行 default 后的語句序列。各個 case塊(含default塊)的順序可以交換。注意:各case塊的語句序列(處于最后面的
20、除外)中都需要用break語句跳出switch語句,否則語句將順序執(zhí)行下去。如:int n;cin>>n;switch(n)case 1: cout << 1 << endl;case 2: cout << 2 << endl;case 3: cout << 3 << endl;若輸入 1,則將輸出123若各 case 語句序列中含有break 語句,輸入 1,則將輸出1例:輸入年份 year 、月份 month 判斷該月的天數(shù)。解題思路:根據(jù)大月有 31天,小月有 30天, 2月有 28天或 29天(閏年)。
21、大月有 1、3、5、7、8、 10、12;小月有 4、6、9、11。#include<iostream>using namespace std;int main()int year, month;cin >> year >> month;switch(month)case 2:if (year % 4 =0 && year % 100 != 0 | year % 400 = 0)cout << 29 << endl;elsecout << 28 << endl;break;case 4:case
22、 6:case 9:case 11:cout << 30 << endl;break;case 1:case 3:case 5:case 7:case 8:case 10:case 12:cout << 31 << endl;break;default:cout << "Error!" << endl;return 0;練習(xí)題:成績轉(zhuǎn)換百分制成績轉(zhuǎn)換為五級計分制時,90 分以上為A,80 89 分為 B, 7079分為 C,6069 分為 D,059 分為 E。(建議使用 switch 語句完成)Inp
23、ut測試有多組,每組輸入1 個整數(shù) score 。處理到輸入結(jié)束。Output逐行輸出百分制成績score 對應(yīng)的字符等級。若score 非法,輸出 "error!"Sample Input161102Sample OutputEDerror!2、do while 語句do while循環(huán)語句格式:do循環(huán)體while( 循環(huán)條件 );do while語句先做一次循環(huán)體,再判斷循環(huán)條件,在滿足循環(huán)條件時反復(fù)執(zhí)行循環(huán)體。 循環(huán)體中需要有 循環(huán)變量改變使循環(huán)趨于結(jié)束的語句,以避免死循環(huán)。若循環(huán)體有多條語句,則必須以 構(gòu)成復(fù)合語句例 11:用 do while 循環(huán)求 1 ,n
24、累加和#include<iostream>using namespace std;int main()int n, sum;cin>>n;sum=0;int i=1;/循環(huán)變量賦初值do/ 循環(huán)體sum += i;i+;/循環(huán)變量改變使循環(huán)趨于結(jié)束while(i<=n);/滿足循環(huán)條件則執(zhí)行循環(huán)體cout << sum << endl;return 0;do while 語句與 while 語句的區(qū)別在于若一開始循環(huán)條件就不成立時, do while 語句執(zhí)行 1 次循環(huán)體, while 語句執(zhí)行 0 次循環(huán)體。思考:如何保證輸入的數(shù)據(jù)一定
25、在1 ,10 范圍內(nèi)?提示:使用 do while 語句,當(dāng)不在 1 ,10 范圍內(nèi)時重復(fù)輸入。六 * 、編譯預(yù)處理編譯預(yù)處理主要包括宏定義、文件包含、條件編譯,以#開始,不需要用分號結(jié)束,一般單獨(dú)寫在一行上。宏定義只是簡單字符串替換,經(jīng)常用來實(shí)現(xiàn)帶名常量定義,如:#define PI 3.1415926文件包含是指一個源文件可以將另外一個頭文件或源文件的全部內(nèi)容包含進(jìn)來,即將另外的文件包含到本文件之中。C+語言提供了 #include命令用來實(shí)現(xiàn)“文件包含”的操作。在 #include 命令中,文件名可以用雙引號或尖括號括起來:#include <文件名 >#include“文件
26、名”二者的區(qū)別是:用尖括弧時,系統(tǒng)到存放 C+庫函數(shù)頭文件所在的目錄中尋找要包含的文件, 這稱為標(biāo)準(zhǔn)方式; 用雙引號時, 系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含的文件,若找不到,再按標(biāo)準(zhǔn)方式查找(即再按尖括號的方式查找) 。一般來說,如果為調(diào)用庫函數(shù)而用 #include命令來包含相關(guān)的頭文件, 則用尖括號,以節(jié)省查找時間。如果要包含的是用戶自己編寫的文件 ( 這種文件一般都在當(dāng)前目錄中 ) ,一般用雙引號。條件編譯是帶 #的 if 語句(有多種形式),以 #endif 結(jié)束。我們在 Online Judge 系統(tǒng)中提交代碼時常常在 main 函數(shù)開始處寫上下面的語句:#ifndef ONLINE_
27、JUDGEfreopen("e:input.txt","r",stdin);freopen("e:output.txt","w",stdout);#endif上面的freopen函數(shù)分別以讀、 寫方式打開輸入文件e:input.txt和輸出文件e: output.txt,以便于在沒有定義符號常量ONLINE_JUDGE的本地代碼中以文件的方式來提供測試數(shù)據(jù)。宏定義( #define )命令亦稱宏替換命令,與其相關(guān)的還有取消宏定義( #undef )命令。宏定義命令的功能是用一個稱為宏名的標(biāo)識符代表一段字符串,后者稱
28、為宏替換體。 在預(yù)處理過程中, 把程序中出現(xiàn)的所有該宏名, 用替換體取而代之,其格式為:#define < 宏名 > < 宏替換體 >例如:#define YES 1#define PI 3.14159#define RAD PI/180#define PRT1 cout<<"n The Begin"#define Max (a,b)( a) >( b)?( a):( b)#define ZERO 0.000001其中:? # :指明為預(yù)處理命令。? define :指明為宏定義命令。? 宏名:為一標(biāo)識符,習(xí)慣上用大寫字母組成, 它
29、代替宏替換體出現(xiàn)在程序中。? 宏替換體:為一任意字符串。 它可能是一個數(shù)字常量, 可計算值的算術(shù)表達(dá)式,字符串常量也可以是一個語句。幾點(diǎn)說明:(1)宏定義可以作為常量說明。例如,符號常量YES 為整數(shù) 1 , PI 為浮點(diǎn)常量 3.14159 ,其作用類似于后面介紹的常量說明,但二者是有區(qū)別的。(2)宏名也可以出現(xiàn)在另一個宏定義的宏替換體中,例如:#define RAD PI/180當(dāng)然在這個宏定義之前應(yīng)已有宏名PI的定義。在預(yù)處理過程中要經(jīng)過兩重替換。(3)宏替換體可以是符號或字符串,例如:#define BEGIN #define END #define ERROR "n can
30、't find the file!n"前兩個宏定義, 使得在程序中可以像示程序塊的開始和結(jié)束;后一個宏定義可用Pascal語言那樣用 BEGIN、END表ERROR代替字符串“ can't findthe file!”輸出。(4)宏替換可以是可執(zhí)行的表達(dá)式語句,如上例中PRT1的定義,在程序中使用:PRT1;實(shí)際上是執(zhí)行一個字符串輸出語句cout<<"n The Begin"。(5)宏替換體也可以為空。其作用可在后文中見到,它表示該宏名已經(jīng)被定義過。如:#define ONLINE_JUDGE(6)一種復(fù)雜的宏替換是帶參數(shù)的宏替換,其格
31、式為:#define < 宏名 ><形參 > < 宏替換體 >其中的形參,可以在程序調(diào)用時用實(shí)參(表達(dá)式)替換。下面的例子說明其使用方法:#include<iostream>using namespace std;#define PUTOUT(k) cout<<k<<endl#define MAX(a,b) (a)>(b)?(a):(b)int main()int m=2,n=3,p;p=MAX(2*m, m+n);PUTOUT(p);PUTOUT(MAX(4,m);return 0;注意: <宏替換體 >
32、;中的參數(shù)最好都用“ () ”括起來,以避免簡單字符串替換。(7)取消宏定義命令,是用來改變原有定義內(nèi)容的手段,例如:#define ZERO 0.000001#undef ZERO條件編譯命令使得程序可以根據(jù)條件來決定哪部分程序參加編譯,哪部分程序不參加編譯。這種功能有助于程序員完成以下工作:(1)避免生成不必要的程序代碼。(2)在調(diào)試中加入若干調(diào)試語句。(3)使程序?qū)Σ煌嬎銠C(jī)和操作系統(tǒng)具有可移植性。條件編譯命令有4組:#if和 #endif#ifdef和 #endif#ifndef和#endif#elif和#else ,#endif其格式及規(guī)則為:#if < 常量表達(dá)式 >&
33、lt;程序段 >#endif常量表達(dá)式:由宏常量、const常量、枚舉值或字面常量組成的算術(shù)表達(dá)式,在預(yù)處理時可以計算出表達(dá)式的值, 值為0時后面的程序段不參加編譯, 值非0時參加編譯。#ifdef <標(biāo)識符 ><程序段 >#endif標(biāo)識符:如果該標(biāo)識符是一個已經(jīng)定義過的宏名,則該程序段參加編譯, 否則跳過這一程序段。#ifndef <標(biāo)識符 ><程序段 >#endif標(biāo)識符:如果該標(biāo)識符是一個已定義過的宏名,則該程序段不參加編譯, 否則參加編譯。這一類型的預(yù)處理命令經(jīng)常在實(shí)用程序中使用。#elif <常量表達(dá)式 ><程
34、序段 1>#else<程序段 2>#endif常量表達(dá)式:其值為 0 跳過程序段 1 ,編譯程序段 2 ;其值非 0 則編譯程序段 1 ,跳過程序段 2 。七 *、變量的作用域與存儲類別從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。外部變量(即全局變量)是在函數(shù)的外部定義的,它的作用域?yàn)閺淖兞慷x處開始,到本程序文件的末尾。 如果外部變量不在文件的開頭定義,其有效的作用范圍只限于定義處到文件終了。如果在定義點(diǎn)之前的函數(shù)想引用該外部變量,則應(yīng)該在引用之前用關(guān)鍵字extern對該變量作 “外部變量聲明”。表示該變量是一個已經(jīng)定義的外部變量。有了此聲明,就可以從“
35、聲明”處起,合法地使用該外部變量。#include<iostream>using namespace std;int max(int x, int y)return x>y?x:y;int main()extern int A,B;printf("%dn",max(A,B);return 0;int A=13, B=-8;說明:在本程序文件的最后 1 行定義了外部變量 A,B,但由于外部變量定義的位置在函數(shù) main 之后,因此本來在 main 函數(shù)中不能引用外部變量 A,B?,F(xiàn)在我們在 main 函數(shù)中用 extern 對 A 和 B 進(jìn)行“外部變量聲明
36、” ,就可以從“聲明”處起,合法地使用該外部變量 A 和 B。從另一個角度,從變量值存在的作時間(即生存期)角度來分,可以分為靜態(tài)存儲方式和動態(tài)存儲方式。靜態(tài)存儲方式:是指在程序運(yùn)行期間分配固定的存儲空間的方式。動態(tài)存儲方式:是在程序運(yùn)行期間根據(jù)需要進(jìn)行動態(tài)的分配存儲空間的方式。用戶存儲空間可以分為三個部分:1) 程序區(qū);2) 靜態(tài)存儲區(qū);3) 動態(tài)存儲區(qū);全局變量全部存放在靜態(tài)存儲區(qū),在程序開始執(zhí)行時給全局變量分配存儲區(qū),程序行完畢就釋放。 在程序執(zhí)行過程中它們占據(jù)固定的存儲單元,而不動態(tài)地進(jìn)行分配和釋放。動態(tài)存儲區(qū)存放以下數(shù)據(jù):1) 函數(shù)形式參數(shù);2) 自動變量(未加 static 聲明的
37、局部變量);3) 函數(shù)調(diào)用實(shí)的現(xiàn)場保護(hù)和返回地址。對以上這些數(shù)據(jù),在函數(shù)開始調(diào)用時分配動態(tài)存儲空間,函數(shù)結(jié)束時釋放這些空間。在 C 語言中,每個變量和函數(shù)有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。函數(shù)中的局部變量,如不專門聲明為 static 存儲類別,都是動態(tài)地分配存儲空間的,數(shù)據(jù)存儲在動態(tài)存儲區(qū)中。 函數(shù)中的形參和在函數(shù)中定義的變量 (包括在復(fù)合語句中定義的變量) ,都屬此類,在調(diào)用該函數(shù)時系統(tǒng)會給它們分配存儲空間,在函數(shù)調(diào)用結(jié)束時就自動釋放這些存儲空間。 這類局部變量稱為自動變量。自動變量用關(guān)鍵字auto 作存儲類別的聲明。例如:void f(int a)/*定義 f 函數(shù), a 為參數(shù) *
38、/auto int b,c=3;/*定義b,c自動變量 */a 是形參, b,c 是自動變量,對 c 賦初值 3。執(zhí)行完 f 函數(shù)后,自動釋放 a,b,c 所占的存儲單元。關(guān)鍵字 auto 可以省略, auto 不寫則隱含定為“自動存儲類別” ,屬于動態(tài)存儲方式。有時希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值, 這時就應(yīng)該指定局部變量為“靜態(tài)局部變量” ,用關(guān)鍵字 static 進(jìn)行聲明。分析以下程序的輸出結(jié)果:#include<iostream>using namespace std;int f(int a)auto int b=0;static int c=3;b
39、=b+1;c=c+1;return(a+b+c);int main()int a=2,i;for(i=0;i<3;i+)printf("%dn",f(a);return 0;輸出結(jié)果為:789對靜態(tài)局部變量的說明:1) 靜態(tài)局部變量屬于靜態(tài)存儲類別,在靜態(tài)存儲區(qū)內(nèi)分配存儲單元。在程序整個運(yùn)行期間都不釋放。而自動變量(即動態(tài)局部變量)屬于動態(tài)存儲類別,占動態(tài)存儲空間,函數(shù)調(diào)用結(jié)束后即釋放。2) 靜態(tài)局部變量在編譯時賦初值,即只賦初值一次;而對自動變量賦初值是在函數(shù)調(diào)用時進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語句。3) 如果在定義局部變量時不賦初值的話,則
40、對靜態(tài)局部變量來說,編譯時自動賦初值 0(對數(shù)值型變量)或空字符(對字符變量) 。而對自動變量來說,如果不賦初值則它的值是一個不確定的值。為了提高效率, C 語言允許將局部變量得值放在 CPU中的寄存器中,這種變量叫“寄存器變量”,用關(guān)鍵字 register 作聲明。例如:#include<iostream>using namespace std;int main()for(register int i=0;i<30000;i+)printf("%dn",i);return 0;說明:1) 只有局部自動變量和形式參數(shù)可以作為寄存器變量;2) 一個計算機(jī)系統(tǒng)
41、中的寄存器數(shù)目有限,不能定義任意多個寄存器變量;局部靜態(tài)變量不能定義為寄存器變量。八 *、字符數(shù)組1、字符數(shù)組初始化字符數(shù)組也允許在定義時逐個字符進(jìn)行初始化。例如:char c10=p, r , o, g, r , a, m;其中 c7 、 c8 、c9 未賦值,由系統(tǒng)自動賦予字符0 值( '0 )。當(dāng)對全體元素賦初值時也可以省去長度說明。例如:char c=c, ,p,r,o,g,r,a,m;char c="C program"char c="C program"這時 c 數(shù)組的長度自動定為9。2、字符數(shù)組的引用#include<iost
42、ream>using namespace std;#include<iostream>using namespace std;int main()int i,j;char s="Enjoying it."char a5='H','E','L','L','O', 'W','O','R','L','D',;for(i=0; si != '0' i+) /以 '0'結(jié)束pr
43、intf("%c",si);printf("n");for(i=0;i<=1;i+)for(j=0;j<=4;j+)printf("%c",aij);printf("n");return 0;本例的二維字符數(shù)組由于在初始化時全部元素都賦以初值, 因此第一維下標(biāo)的長度可以不加以說明。3、字符數(shù)組的輸入輸出可用 printf 函數(shù)和 scanf 函數(shù)一次性輸出輸入一個字符數(shù)組中的字符串,而不必使用循環(huán)語句逐個地輸入輸出每個字符。例如:char s15;scanf("%s",s);prin
44、tf("%sn",s);本例中由于定義數(shù)組長度為15,因此輸入的字符串長度必須小于15,以留出一個字節(jié)用于存放字符串結(jié)束標(biāo)志0 。應(yīng)該說明的是, 對一個字符數(shù)組, 如果不作初始化賦值,則必須說明數(shù)組長度。還應(yīng)該特別注意的是,當(dāng)用scanf函數(shù)輸入字符串時, 字符串中不能含有空格, 否則將以空格作為串的結(jié)束符。例如當(dāng)輸入的字符串中含有空格時,如“ this is a book ”時,輸出為:“ this ”。在前面介紹過, scanf 的各輸入項(xiàng)必須以地址方式出現(xiàn),如 &a,&b 等。但在前例中卻是以數(shù)組名方式出現(xiàn)的,這是為什么呢?這是由于在 C語言中規(guī)定,數(shù)
45、組名就代表了該數(shù)組的首地址。整個數(shù)組是以首地址開頭的一塊連續(xù)的內(nèi)存單元。設(shè)數(shù)組 c 的首地址為 2000,也就是說 c0 單元地址為 2000。則數(shù)組名 c 就代表這個首地址。因此在 c 前面不能再加地址運(yùn)算符&。如寫作 scanf("%s",&c);則是錯誤的。 在執(zhí)行函數(shù) printf("%s",c) 時,按數(shù)組名 c 找到首地址,然后逐個輸出數(shù)組中各個字符直到遇到字符串終止標(biāo)志 '0' 為止。4、字符串處理函數(shù)C語言提供了豐富的字符串處理函數(shù)。用于輸入輸出的字符串函數(shù),在使用前一般應(yīng)包含頭文件 "stdio
46、.h" ,使用其它字符串函數(shù)則一般應(yīng)包含頭文件"string.h"。下面介紹幾個最常用的字符串函數(shù)。(1)字符串輸出函數(shù)puts格式: puts (字符數(shù)組名 )功能:把字符數(shù)組中的字符串輸出到顯示器。即在屏幕上顯示該字符串。char s="HellonWorld"puts(s); / 因?yàn)槭褂脫Q行符,將輸出2 行(2)字符串輸入函數(shù)gets格式: gets (字符數(shù)組名 )功能:從標(biāo)準(zhǔn)輸入設(shè)備鍵盤上輸入一個字符串。本函數(shù)得到一個函數(shù)值,即為該字符數(shù)組的首地址。char s15;gets(s);puts(s);輸入” Hello World ”
47、, 將輸出 Hello World 。gets函數(shù)并不以空格作為字符串輸入結(jié)束的標(biāo)志,而只以回車作為輸入結(jié)束。這是與 scanf 函數(shù)不同的。(3)字符串連接函數(shù)strcat格式: strcat (字符數(shù)組名 1,字符數(shù)組名 2)功能:把字符數(shù)組 2 中的字符串連接到字符數(shù)組 1 中字符串的后面,并刪去字符串 1 后的串標(biāo)志“ 0 ”。本函數(shù)返回值是字符數(shù)組 1 的首地址。要注意的是,字符數(shù)組1 應(yīng)定義足夠的長度,否則不能全部裝入被連接的字符串。(4)字符串拷貝函數(shù)strcpy格式: strcpy (字符數(shù)組名 1,字符數(shù)組名 2)功能:把字符數(shù)組 2 中的字符串拷貝到字符數(shù)組1 中。串結(jié)束標(biāo)志“ 0 ”也一同拷貝。字符數(shù)名2,也可以是一個字符串常量。這時相當(dāng)于把一個字符串賦予一個字符數(shù)組。本函數(shù)要求字符數(shù)組1 應(yīng)有足夠的長度,否則不能全部裝入所拷貝的字符串。(5)字
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年專業(yè)高級顧問聘任協(xié)議范例版B版
- 2025年江西貨運(yùn)從業(yè)資格試題答案大全
- 建筑工程鋁扣板施工合同
- 智能城市交通網(wǎng)絡(luò)部署合同
- 會計師事務(wù)所公關(guān)部聘用合同
- 2025年正規(guī)商品代銷合同書范文
- 港口物流船運(yùn)租賃合同
- 食品公司品控員招聘合同模板
- 河北省張家口市2024屆高三上學(xué)期期末考試數(shù)學(xué)試題(解析版)
- 圖書館建設(shè)拆遷施工合同
- 數(shù)據(jù)可視化技術(shù)智慧樹知到期末考試答案2024年
- MOOC 警察禮儀-江蘇警官學(xué)院 中國大學(xué)慕課答案
- 三基考試題庫與答案
- 2024年廣東省2024屆高三二模英語試卷(含標(biāo)準(zhǔn)答案)
- 全飛秒激光近視手術(shù)
- 2024年制鞋工專業(yè)知識考試(重點(diǎn))題庫(含答案)
- 2023-2024學(xué)年廣州大附屬中學(xué)中考一模物理試題含解析
- 綠化養(yǎng)護(hù)工作日記錄表
- 2024美的在線測評題庫答案
- 2024版高考數(shù)學(xué)二輪復(fù)習(xí):解析幾何問題的方法技巧
- 輿情監(jiān)測服務(wù)方案
評論
0/150
提交評論