




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章數(shù)據(jù)類型與運(yùn)算式
2.1數(shù)據(jù)類型概述整型基本整型int數(shù)據(jù)類型基本類型構(gòu)造類型指針類型*空類型void實(shí)型(浮點(diǎn)型)字元型char枚舉類型enum數(shù)組類型[]結(jié)構(gòu)體類型struct共用體類型union單精確度實(shí)型float雙精度實(shí)型double短整型short長(zhǎng)整型long無符號(hào)整型unsigned基本數(shù)據(jù)類型int整數(shù),在目前絕大多數(shù)機(jī)器上占4個(gè)位元組。TC2中是2個(gè)位元組float單精確度浮點(diǎn)數(shù),一般是4個(gè)位元組長(zhǎng)double雙精度浮點(diǎn)數(shù),一般是8個(gè)位元組長(zhǎng)char字元,一般是1個(gè)位元組長(zhǎng)用來表示256個(gè)ASCII字元,或者0~255的整數(shù)數(shù)據(jù)類型修飾符shortshortint,短整數(shù),一般2個(gè)位元組長(zhǎng)。通常簡(jiǎn)寫為shortlonglong
int,長(zhǎng)整數(shù),一般是4個(gè)位元組長(zhǎng)。通常簡(jiǎn)寫為longlongdouble,長(zhǎng)雙精度(高精度)浮點(diǎn)數(shù),一般是10個(gè)位元組長(zhǎng)。signed用來修飾char、int、short和long,說明他們是有符號(hào)的整數(shù)(正整數(shù)、0和負(fù)整數(shù))。一般缺省都是有符號(hào)的,所以這個(gè)修飾符通常省略u(píng)nsigned用來修飾char、int、short和long,說明他們是無符號(hào)的整數(shù)(正整數(shù)和0)
2.2常量和變數(shù)
2.2.1識(shí)別字和關(guān)鍵字2.2.2常量2.2.3變數(shù)2.2.1識(shí)別字和關(guān)鍵字
C語(yǔ)言的識(shí)別字的命名規(guī)則是:1.由字母或下劃線(_)開頭,同時(shí)由字母、0~9的數(shù)字或下劃線(_)組成。2.不能與關(guān)鍵字同名。例如:school_id,_age,es10為合法的識(shí)別字。school-id,man*,2year,class為不合法的識(shí)別字。
識(shí)別字是用來標(biāo)識(shí)對(duì)象名字(包括變數(shù)、函數(shù)、數(shù)組、類型等)的有效字元序列。構(gòu)造一個(gè)識(shí)別字的名字,需要按照一定的規(guī)則。識(shí)別字不宜過短,過短的識(shí)別字會(huì)導(dǎo)致程式的可讀性變差;但也不宜過長(zhǎng),否則將增加錄入工作量和出錯(cuò)的可能性。關(guān)鍵字(32個(gè))關(guān)鍵字在C語(yǔ)言中,有其特殊的含義,不能用作一般的識(shí)別字使用,即一般的識(shí)別字(變數(shù)名、類名、方法名等)不能與其同名。ANSIC關(guān)鍵字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile2.2.2常量
常量是指直接用於程式中的、不能被程式修改的、固定不變的量。C語(yǔ)言中的常量值是用數(shù)值或字串表示的。C語(yǔ)言常量包括整數(shù)、浮點(diǎn)數(shù)、字元、字串四種類型。有時(shí)為了使用方便,可用一個(gè)符號(hào)名來代表一個(gè)常量,這稱為符號(hào)常量。符號(hào)常量一般定義格式如下:#define識(shí)別字常量數(shù)據(jù)例如:#definePI3.14159一旦某識(shí)別字定義成為一個(gè)常量後,以後在程式處理時(shí),凡是碰到了該識(shí)別字,都將替換成對(duì)應(yīng)的常量。
2.2.3變數(shù)
變數(shù)是指C語(yǔ)言編程中合法的識(shí)別字,是用來存取某種類型值的存儲(chǔ)單元,其中存儲(chǔ)的值可以在程式執(zhí)行的過程中被改變。必須先定義後使用
定義變數(shù)的一般形式為:
變數(shù)類型說明符變數(shù)列表[=初值]
①變數(shù)類型說明符,確定了變數(shù)的取值範(fàn)圍以及對(duì)變數(shù)所能進(jìn)行的操作規(guī)範(fàn)②變數(shù)列表,由一個(gè)或多個(gè)變數(shù)名組成。當(dāng)要定義多個(gè)變數(shù)時(shí),各變數(shù)之間用逗號(hào)分隔。③初值是可選項(xiàng),變數(shù)可以在定義的同時(shí)賦初值,也可以先定義,在後續(xù)程式中賦初值。C語(yǔ)言中的變數(shù)名除了符合識(shí)別字的條件之外,還必須滿足下列約定:①變數(shù)名不能與關(guān)鍵字相同。②C語(yǔ)言對(duì)變數(shù)名區(qū)分大小寫。③變數(shù)名應(yīng)具有一定的含義,以增加程式的可讀性。例:charesc='a';
inti=1;
intsum=0;
floateps=1.0e-5;
2.3整數(shù)類型
2.3.1整型常量2.3.2整型變數(shù)
2.3.1整型常量
整數(shù)常量是不帶小數(shù)的數(shù)值,用來表示正負(fù)數(shù)。例如0x55、0x55ff、1000000都是C語(yǔ)言的整數(shù)常量。整數(shù)常量的取值範(fàn)圍是有限的,它的大小取決於此類整型數(shù)的類型,與所使用的進(jìn)制形式無關(guān)。整數(shù)常量有三種形式:
十進(jìn)位、八進(jìn)制、十六進(jìn)制(1)十進(jìn)位整數(shù)是由不以0開頭的0~9的數(shù)字組成的數(shù)據(jù)。(2)八進(jìn)制整數(shù)是由以0開頭的0~7的數(shù)字組成的數(shù)據(jù)。(3)十六進(jìn)制整數(shù)是由以0x或0X開頭的0~9的數(shù)字及A~F的字母組成的數(shù)據(jù)。例如:0,63,83是十進(jìn)位數(shù),00,077,0123是八進(jìn)制數(shù),0x0,0X0,0X53,0x53,0X3f,0x3f是十六進(jìn)制數(shù)。
2.3.2整型變數(shù)
整型變數(shù)類型有short、int、long、unsigned四種說明符。整數(shù)類型的取值範(fàn)圍類型TurboC2.0VisualC++6.0寬度取值範(fàn)圍寬度取值範(fàn)圍[signed]int16
-32768~3276732-2147483648~2147483647[unsigned]int160~65535320~4294967295[signed]short16-32768~3276716-32768~32767[unsigned]short160~65535160~65535long32-2147483648~214748364732-2147483648~2147483647[unsigned]long320~4294967295320~4294967295
2.4實(shí)數(shù)類型
2.4.1實(shí)型常量實(shí)數(shù)類型的數(shù)據(jù)即實(shí)型數(shù)據(jù),在C語(yǔ)言中實(shí)型數(shù)據(jù)又稱為浮點(diǎn)數(shù)。浮點(diǎn)數(shù)是帶有小數(shù)的十進(jìn)位數(shù),可用十進(jìn)位數(shù)形式或指數(shù)形式表示。浮點(diǎn)數(shù)表示形式(1)十進(jìn)位數(shù)形式:十進(jìn)位整數(shù)+小數(shù)點(diǎn)+十進(jìn)位小數(shù)。(2)指數(shù)形式:十進(jìn)位整數(shù)+小數(shù)點(diǎn)+十進(jìn)位小數(shù)+E(或e)+正負(fù)號(hào)+指數(shù)。例如:3.14159,0.567,9777.12是十進(jìn)位數(shù)形式,1.234e5,4.90867e-2是指數(shù)形式。C語(yǔ)言的浮點(diǎn)數(shù)常量在機(jī)器中有單精確度和雙精度之分。單精確度以32位形式存放,雙精度則以64位形式存放。
2.4.2實(shí)型變數(shù)
(1)float類型float類型是一個(gè)位數(shù)為32位的單精確度浮點(diǎn)數(shù)。它具有運(yùn)行速度較快,佔(zhàn)用空間較少的特點(diǎn)。(2)double類型double類型是一個(gè)位數(shù)為64位的雙精度浮點(diǎn)數(shù)。雙精度數(shù)在某些具有優(yōu)化和高速運(yùn)算能力的現(xiàn)代處理機(jī)上運(yùn)算比單精確度數(shù)快。雙精度類型double比單精確度類型float具有更高的精度和更大表示範(fàn)圍,常常使用。
2.5字元類型
2.5.1字元型常量(1)用單引號(hào)括起來的一個(gè)字元;如:‘A’、
‘1’、’?’等。(2)用單引號(hào)括起來的由反斜杠(\)引導(dǎo)的轉(zhuǎn)義字元。如:‘\n’、‘\t’、’\x41’、’\101’等。表2-4轉(zhuǎn)義字元表功能字元形式功能字元形式回車\r單引號(hào)\’換行\(zhòng)n雙引號(hào)\"水準(zhǔn)製錶\t八進(jìn)制位模式\ddd退格\b十六進(jìn)制模式\xdddd換頁(yè)\f反斜線\\
2.5.2字元型變數(shù)
字元型變數(shù)的類型說明符為char,它在機(jī)器中占8位,其範(fàn)圍為0~255。注意:字元型變數(shù)只能存放一個(gè)字元,不能存放多個(gè)字元,例如:chara='am';這樣定義賦值是錯(cuò)誤的。
字串常量
用一對(duì)雙引號(hào)括起來的字元序列。注意:每個(gè)字串的後面都有一個(gè)‘\0’結(jié)束符。
如:“SHANGHAI”,“AbcdeFGHijk”,“Howareyou”?!甛’‘
√
‘\\‘
√
‘’‘
‘\‘
‘a(chǎn)’與“a”的區(qū)別。注意
2.6不同數(shù)據(jù)類型之間的轉(zhuǎn)換
不同類型的數(shù)據(jù)之間的運(yùn)算稱為混合運(yùn)算。在混合運(yùn)算中,將會(huì)碰到類型轉(zhuǎn)換的情況。類型轉(zhuǎn)換可分為自動(dòng)類型轉(zhuǎn)換、強(qiáng)制類型轉(zhuǎn)換兩種。
⒈自動(dòng)類型轉(zhuǎn)換
轉(zhuǎn)換從低級(jí)到高級(jí)。各類型從低級(jí)到高級(jí)的順序?yàn)椋篶har→int→long→float→double。例如:charch=’A’;inti=28;floatx=2.36;doubley=6.258e+6;若運(yùn)算式為i+ch+x*y轉(zhuǎn)換過程:先將ch轉(zhuǎn)換成int型,計(jì)算i+ch,由於ch=’A’,而’A’的ASCⅡ碼值為65,故計(jì)算結(jié)果為93,類型為int型。再將x轉(zhuǎn)換成double型,計(jì)算x*y,結(jié)果為double類型。最後將i+ch的值93轉(zhuǎn)換成double型,運(yùn)算式的值最後為double類型。
⒉強(qiáng)制類型轉(zhuǎn)換
高級(jí)數(shù)據(jù)要轉(zhuǎn)換成低級(jí)數(shù)據(jù),需用使用強(qiáng)制類型轉(zhuǎn)換。這種使用可能會(huì)導(dǎo)致溢出或精度的下降,最好不要使用。強(qiáng)制類型轉(zhuǎn)換的格式為:
(type)變數(shù);其中:type為要轉(zhuǎn)換成的變數(shù)類型。例如:(int)(a+b)(強(qiáng)制將a+b的值轉(zhuǎn)換成整型)例2.1數(shù)據(jù)類型轉(zhuǎn)換的例子#include<stdio.h>voidmain(){floatx;inti;x=3.5;i=(int)x;printf("x=%f",x);printf("i=%d",i);}運(yùn)行結(jié)果為:x=3.500000i=3
2.7運(yùn)算符與運(yùn)算式
2.7.1算術(shù)運(yùn)算符與算術(shù)運(yùn)算式2.7.2賦值運(yùn)算符與賦值運(yùn)算式2.7.3關(guān)係運(yùn)算符與關(guān)係運(yùn)算式2.7.4邏輯運(yùn)算符與邏輯運(yùn)算式2.7.5條件運(yùn)算符與條件運(yùn)算式2.7.6逗號(hào)運(yùn)算符與逗號(hào)運(yùn)算式2.7.7運(yùn)算符的優(yōu)先順序和結(jié)合法則2.7.1算術(shù)運(yùn)算符與算術(shù)運(yùn)算式算術(shù)運(yùn)算符用於算術(shù)運(yùn)算,其運(yùn)算元為數(shù)字類型或字元類型。表2-5算術(shù)運(yùn)算符運(yùn)算符名稱使用方式說明+加a+ba加b-減a-ba減b*乘a*ba乘b/除a/ba除b%取模a%ba取模b(返回除數(shù)的餘數(shù))++自增++a,a++自增--自減--a,a--自減例:合法的C語(yǔ)言算術(shù)運(yùn)算式。
a*b/c-1.5+’a’+fabs(-5)
fabs(-5)是求-5的絕對(duì)值的庫(kù)函數(shù)?!?+”、“--”
首碼方式是先將運(yùn)算元加(或減)1,再將運(yùn)算元的值作為算術(shù)運(yùn)算式的值;尾碼方式是先將運(yùn)算元的值作為算術(shù)運(yùn)算式的值,再將其加(或減)1。例如:a的值為5,
++a為首碼方式,首先將a的值加1,再得到運(yùn)算式的值為6;
a++為尾碼方式,首先得到運(yùn)算式的值為5,再將a的值加1。自增運(yùn)算符和自減運(yùn)算符運(yùn)算對(duì)象只能是變數(shù),不能是常量或運(yùn)算式。形式3++或++(i+j)都是非法的運(yùn)算式。
2.7.2賦值運(yùn)算符與賦值運(yùn)算式
賦值運(yùn)算符“=”就是把右邊運(yùn)算元的值賦給左邊運(yùn)算元。賦值運(yùn)算符左邊運(yùn)算元必須是一個(gè)變數(shù),右邊運(yùn)算元可以是常量、變數(shù)、運(yùn)算式。例如:運(yùn)算式b=a+3在賦值運(yùn)算符兩邊的運(yùn)算元的數(shù)據(jù)類型如果一致,就直接將右邊的數(shù)據(jù)賦給左邊;如果不一致,就需要進(jìn)行數(shù)據(jù)類型自動(dòng)或強(qiáng)制轉(zhuǎn)換,將右邊的數(shù)據(jù)類型轉(zhuǎn)換成左邊的數(shù)據(jù)類型後,再將右邊的數(shù)據(jù)賦給左邊變數(shù)。複合運(yùn)算符運(yùn)算符名稱使用方式說明+=相加賦值a+=b加並賦值,a=a+b-=相減賦值a-=b減並賦值,a=a-b*=相乘賦值a*=b乘並賦值,a=a*b/=相除賦值a/=b除並賦值,a=a/b%=取模賦值a%=b取模並賦值,a=a%b練習(xí):設(shè)a=12,計(jì)算運(yùn)算式a+=a-=a*12和a+=a-=a*=12的值
2.7.3關(guān)係運(yùn)算符與關(guān)係運(yùn)算式
關(guān)係運(yùn)算符用來對(duì)兩個(gè)運(yùn)算元進(jìn)行比較。關(guān)係運(yùn)算式就是用關(guān)係運(yùn)算符將兩個(gè)運(yùn)算式連接起來的式子,其運(yùn)算結(jié)果為布爾邏輯值。如果關(guān)係運(yùn)算式成立結(jié)果為真(true),否則為假(false)。由於C語(yǔ)言沒有邏輯型數(shù)據(jù),就用1代表“真”,0代表“假”。關(guān)係運(yùn)算符運(yùn)算符名稱使用方法說明==等於A==b如果a等於b返回真,否則為假!=不等於A!=b如果a不等於b返回真,否則為假>大於A>b如果a大於b返回真,否則為假<小於A<b如果a小於b返回真,否則為假<=小於或等於A<=b如果a小於或等於b返回真,否則為假>=大於或等於a>=b如果a大於或等於b返回真,否則為假關(guān)係運(yùn)算符的優(yōu)先順序(1)“<”、“<=”、“>”和“>=”為同一級(jí),“==”和“!=”為同一級(jí)。前者優(yōu)先順序高於後者。(2)關(guān)係運(yùn)算符優(yōu)先順序低於算術(shù)運(yùn)算符,高於賦值運(yùn)算符和逗號(hào)運(yùn)算符。例2.2關(guān)係運(yùn)算式的運(yùn)用#include<stdio.h>voidmain(){charch=’w’;inta=2,b=3,c=1,d,x=10;printf(“%d”,a>b==c);printf(“%d”,d=a>b);printf(“%d”,ch>’a’+1);printf(“%d”,d=a+b>c);printf(“%d”,b-1==a!=c);printf(“%d\n”,3<=x<=5);}運(yùn)行結(jié)果為
001101程式輸出了6個(gè)運(yùn)算式的值,其中有兩個(gè)是賦值運(yùn)算式,請(qǐng)讀者根據(jù)運(yùn)算符的優(yōu)先順序作出判斷。注意關(guān)係運(yùn)算式3<=x<=5等價(jià)於關(guān)係運(yùn)算式(3<=x)<=5當(dāng)x=10時(shí),3<=x的值是1,再計(jì)算1<=5,得到1。其實(shí),無論x去何值,關(guān)係運(yùn)算式3<=x的值不是1就是0,都小於5,即3<=x<=5的值恒為1。由此看出關(guān)係運(yùn)算式3<=x<=5無法正確表示代數(shù)式3<=x<=5。
2.7.4邏輯運(yùn)算符與邏輯運(yùn)算式
邏輯運(yùn)算符用來對(duì)關(guān)係運(yùn)算式進(jìn)行運(yùn)算。邏輯運(yùn)算式就是用邏輯運(yùn)算符將關(guān)係運(yùn)算式連接起來的式子,其運(yùn)算結(jié)果為布爾邏輯值。表2-8邏輯運(yùn)算符運(yùn)算符名稱&&邏輯與||邏輯或!邏輯非表2-9與、或、非運(yùn)算規(guī)則運(yùn)算式A運(yùn)算式BA&&BA||B!A假假假假真假真假真真真假假真假真真真真假優(yōu)先次序(1)!→&&→||(2)!高於算術(shù)運(yùn)算符,&&、||低於關(guān)係運(yùn)算符。例如:a||b&&c等價(jià)於a||(b&&c)。!a&&b等價(jià)於(!A)&&b。x>=3&&x<=5等價(jià)於(x>=3)&&(x<=5)。!x==2等價(jià)於(!x)==2。a||3*8&&2等價(jià)於a||((3*8)&&2)。例2.3邏輯運(yùn)算式的運(yùn)用#include<stdio.h>voidmain(){inta=2,b=0,c=0;printf(“%d”,a&&b);printf(“%d”,a||b&&c);printf(“%d”,!a&&b);printf(“%d”,a||3+10&&2);}運(yùn)行結(jié)果為0101求解規(guī)則求解C語(yǔ)言邏輯運(yùn)算式時(shí),按從左到右的順序計(jì)算運(yùn)算符兩側(cè)的運(yùn)算元,一旦得到運(yùn)算式的結(jié)果,就停止計(jì)算。求解邏輯運(yùn)算式exp1&&exp2時(shí),先計(jì)算exp1,若其值為0,則exp1&&exp2值一定為0。此時(shí),沒有必要計(jì)算exp2的值。例2.3中,計(jì)算運(yùn)算式!a&&b時(shí),先算!a,由於a的值是2,!a就是0,該邏輯運(yùn)算式的值一定是0,不必再計(jì)算b。求解邏輯運(yùn)算式exp1||exp2時(shí),先計(jì)算exp1,若其值為非0,則exp1||exp2值一定為1。此時(shí),沒有必要計(jì)算exp2的值。例2.3中,計(jì)算運(yùn)算式a||3+10&&2時(shí),先算a,由於a的值是2,該邏輯運(yùn)算式的值一定是1,不必再計(jì)算3+10&&2。通常,關(guān)係運(yùn)算符和邏輯運(yùn)算符在一起使用,用於流程控制語(yǔ)句的判斷條件。
2.7.5條件運(yùn)算符與條件運(yùn)算式
條件運(yùn)算符是一個(gè)三目運(yùn)算符。一般形式為:
運(yùn)算式1?運(yùn)算式2:運(yùn)算式3其中運(yùn)算式1是一個(gè)關(guān)係運(yùn)算式或邏輯運(yùn)算式。執(zhí)行過程:先求解運(yùn)算式1的值,若運(yùn)算式1的值為真,則求解運(yùn)算式2的值,且作為整個(gè)條件運(yùn)算式的結(jié)果;若運(yùn)算式1的值為假,則求解運(yùn)算式3的值,且作為整個(gè)條件運(yùn)算式的結(jié)果。賦值運(yùn)算式
max=(a>b)?a:b執(zhí)行結(jié)果就是將條件運(yùn)算式的值賦給max,也就是將a和b二者中大者賦給max。條件運(yùn)算符的優(yōu)先順序較低,只比賦值運(yùn)算符高。它的結(jié)合方向是自右向左。例如:①(a>b)?a:b+1等價(jià)於a>b?a:(b+1)。②a>b?a:c>d?c:d
等價(jià)於a>b?a:(c>d?c:d)。
2.7.6逗號(hào)運(yùn)算符與逗號(hào)運(yùn)算式
逗號(hào)運(yùn)算式的一般形式為
運(yùn)算式1,運(yùn)算式2逗號(hào)運(yùn)算式的求解過程是:先求解運(yùn)算式1,再求解運(yùn)算式2。整個(gè)逗號(hào)運(yùn)算式的值是運(yùn)算式2的值。例如:x=(y=6,y*3)首先將6賦給y,然後執(zhí)行y*3的運(yùn)算,將整個(gè)結(jié)果賦給x。一個(gè)逗號(hào)運(yùn)算式又可以與另一個(gè)逗號(hào)運(yùn)算式組成一個(gè)新的逗號(hào)運(yùn)算式,例如:(a=3*5,a+4),a+5先計(jì)算出a的值為3*5,等於15,再進(jìn)行a*4的運(yùn)算為60,再進(jìn)行a+5的運(yùn)算得20,即整個(gè)運(yùn)算式的值為20。逗號(hào)運(yùn)算式的一般形式可以擴(kuò)展為運(yùn)算式1,運(yùn)算式2,運(yùn)算式3,…,運(yùn)算式n它的值為運(yùn)算式n的值。
2.7.7運(yùn)算符的優(yōu)先順序和結(jié)合法則
在運(yùn)算式求值時(shí),先按運(yùn)算符的優(yōu)先順序順序高低次序執(zhí)行,例如先乘除後加減。在兩個(gè)相同的優(yōu)先順序的運(yùn)算符運(yùn)算操作時(shí),則採(cǎi)用左運(yùn)算符優(yōu)先規(guī)則,即從左到右執(zhí)行。關(guān)於“結(jié)合法則”的概念在其他一些高級(jí)語(yǔ)言中是沒有的,是C語(yǔ)言的特點(diǎn)之一,應(yīng)該瞭解清楚。附錄C列出了所有運(yùn)算符以及它們的優(yōu)先順序和結(jié)合法則。1.在C語(yǔ)言中,數(shù)據(jù)都屬於一定的類型的。不同類型數(shù)據(jù)的操作方式和取值範(fàn)圍不同,所占存儲(chǔ)空間的大小也不同。2.識(shí)別字是用來標(biāo)識(shí)對(duì)象名字(包括變數(shù)、函數(shù)、數(shù)組、類型等)的有效字元序列。C語(yǔ)言中的變數(shù)名必須符合識(shí)別字的命名規(guī)則,並且變數(shù)名不能與關(guān)鍵字相同。3.在程式中,數(shù)據(jù)的表現(xiàn)形式有常量和變數(shù)。常量有字面常量和符號(hào)常量?jī)煞N形式,符號(hào)常量只是一個(gè)字串,用來代替一個(gè)已知的常量。小結(jié)4.ANSIC標(biāo)準(zhǔn)沒有具體規(guī)定各類數(shù)據(jù)在內(nèi)存中所占的位元組數(shù),由各編譯系統(tǒng)自行決定。常見的有兩種:(1)TurboC等,int:2位元組,short:2位元組,long:4位元組。(2)VisualC++等,int:4位元組,short:2位元組,long:4位元組。對(duì)字元型都是1位元組。對(duì)於浮點(diǎn)數(shù)一般都是float:4位元組,double:8位元組。5.要注意運(yùn)算符的優(yōu)先順序和結(jié)合法則。小結(jié)第3章C語(yǔ)言程式的控制結(jié)構(gòu)
本章導(dǎo)讀本章包括知識(shí)點(diǎn):演算法的描述方法數(shù)據(jù)的輸入輸出函數(shù)調(diào)用格式if語(yǔ)句及switch語(yǔ)句的使用3種迴圈結(jié)構(gòu)break、continue和goto語(yǔ)句的作用。常用演算法:如遞推法、窮舉法等C程式的基本風(fēng)格程式設(shè)計(jì)的錯(cuò)誤及程式的調(diào)試。3.1演算法3.1.1演算法的概念3.1.2演算法的表示方法3.1.1演算法的概念著名的電腦科學(xué)家沃思(NikiklausWirth)曾經(jīng)提出過:
數(shù)據(jù)結(jié)構(gòu)+演算法=程式數(shù)據(jù)結(jié)構(gòu)(datastructure):即對(duì)數(shù)據(jù)的描述和組織形式。演算法(algorithm):對(duì)操作或行為的描述,即操作步驟。廣義地說,演算法就是做某一件事的步驟或程式。電腦解題的演算法大致包括這兩大類演算法:
非數(shù)值運(yùn)算演算法和數(shù)值運(yùn)算演算法。演算法特性:①有窮性。演算法的步驟必須是有限的,每個(gè)步驟都在有限的時(shí)間內(nèi)做完,執(zhí)行有限個(gè)步驟後終止。②確定性。演算法中每一步驟都必須有明確定義,不允許有模棱兩可的解釋,不允許有多義性。例如:“如果成績(jī)大於等於90分,則輸出A;如果成績(jī)小於等於90分,則輸出B”,當(dāng)成績(jī)?yōu)?0分時(shí),既會(huì)輸出A,又會(huì)輸出B,這就產(chǎn)生了不確定性。③有效性。演算法的每一步操作都應(yīng)該能有效執(zhí)行。如一個(gè)數(shù)被0除就是無效不可行的,應(yīng)避免。
演算法特性
④沒有輸入或有多個(gè)輸入。例如:求1+2+3+…+100時(shí),不需要輸入任何資訊就能求出結(jié)果;而要求1+2+3+…+n時(shí),必須從鍵盤輸入n的值,才能求出結(jié)果。⑤有一個(gè)或多個(gè)輸出。演算法的目的是為了求解,“解”就是演算法的輸出。沒有輸出的演算法是沒有意義的。3.1.2演算法的表示方法
常用方法有:自然語(yǔ)言、傳統(tǒng)流程圖、NS流程圖、偽代碼等
1.用自然語(yǔ)言表示演算法自然語(yǔ)言就是人們?nèi)粘J褂玫恼Z(yǔ)言,可以是漢語(yǔ)、英語(yǔ)或其他語(yǔ)言。用自然語(yǔ)言表示演算法,通俗易懂,但文字冗長(zhǎng),在表達(dá)上不夠嚴(yán)格,引起理解上的歧義性,不易轉(zhuǎn)化為程式,描述複雜的演算法不很方便。因此,除了很簡(jiǎn)單的問題外,一般不用自然語(yǔ)言描述演算法。用自然語(yǔ)言表示的求1+2+3+…+6的演算法如下:演算法1:S1:計(jì)算1+2得到3;S2:將第一步中的運(yùn)算結(jié)果3與3相加得到6;S3:將第二步中的運(yùn)算結(jié)果6與4相加得到10;S4:將第三步中的運(yùn)算結(jié)果10與5相加得到15;S5:將第四步中的運(yùn)算結(jié)果15與6相加得到21。演算法2:S1:定義迴圈變數(shù)i=1,用於保存和的變數(shù)s,並置初值為0;S2:判斷i的值是否小於等於6,若是則執(zhí)行S3,否則跳轉(zhuǎn)到S4執(zhí)行;S3:將i的值累加到s,然後變數(shù)i自身加1,轉(zhuǎn)到S2執(zhí)行;S4:輸出s的值。演算法1是最原始的方法,最為繁瑣,步驟較多,當(dāng)加數(shù)較大時(shí),比如1+2+3+…+10000,再用這種方法是行不通的;演算法2是比較簡(jiǎn)單的演算法,且易於在電腦上執(zhí)行操作。
2.用傳統(tǒng)流程圖表示演算法
流程圖是一個(gè)描述程式的控制流程和指令執(zhí)行情況的有向圖,用流程圖表示演算法,直觀形象,易於理解。美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)(ANSI)規(guī)定了一些常用符號(hào)如圖所示用傳統(tǒng)流程圖描述計(jì)算1+2+3+…+6的演算法
3.用NS結(jié)構(gòu)化流程圖表示演算法1973年美國(guó)學(xué)者I.Nassi和B.Schneiderman提出了一種新型流程圖—NS結(jié)構(gòu)化流程圖,這種流程圖一方面取消了帶箭頭的流程線,這樣演算法被迫只能從上到下順序執(zhí)行,避免了演算法流程的任意轉(zhuǎn)向,適於結(jié)構(gòu)化程式設(shè)計(jì);另一方面,這種流程圖節(jié)省篇幅,因而很受歡迎。用NS流程圖描述的計(jì)算1+2+3+…+6的演算法
4.用偽代碼表示演算法
偽代碼使用介於自然語(yǔ)言和電腦語(yǔ)言之間的文字和符號(hào)來描述演算法。它使用起來靈活,無固定格式和規(guī)範(fàn),無圖形符號(hào),只要寫出來自己或別人能看懂就行,由於它與電腦語(yǔ)言比較接近,便於向電腦語(yǔ)言演算法(即程式)過渡。用偽代碼描述的1+2+3+…+6演算法如下:begin/*演算法開始*/1=>i0=>swhilei≤6{s+i=>si+1=>i}printsumend/*演算法結(jié)束*/在程式設(shè)計(jì)中讀者可根據(jù)需要和習(xí)慣任意選用。
3.2C語(yǔ)句的分類
C語(yǔ)言的語(yǔ)句可分為5大類:控制語(yǔ)句函數(shù)調(diào)用語(yǔ)句運(yùn)算式語(yǔ)句複合語(yǔ)句空語(yǔ)句
1.控制語(yǔ)句
控制語(yǔ)句用來實(shí)現(xiàn)對(duì)程式流程的選擇、迴圈、轉(zhuǎn)向和返回等進(jìn)行控制。C語(yǔ)言中共有9種控制語(yǔ)句,包括12個(gè)關(guān)鍵字,可以分為以下幾類:選擇語(yǔ)句:if…else和switch(包括case和default)。迴圈語(yǔ)句:for、while和do…while。轉(zhuǎn)向語(yǔ)句:continue、break和goto。返回語(yǔ)句:return。本章的3.5、3.6和3.7中將陸續(xù)介紹這些控制語(yǔ)句。
2.函數(shù)調(diào)用語(yǔ)句
函數(shù)調(diào)用語(yǔ)句是由一個(gè)函數(shù)調(diào)用加一個(gè)分號(hào)構(gòu)成的語(yǔ)句。它的一般形式是:
函數(shù)名(實(shí)參表);例如:printf(“ThisisaCProgram”);
/*用於輸出雙引號(hào)中的字串*/c=getchar();
/*用於從鍵盤讀入一個(gè)字元*/
m=max(a,b,c);
/*用於求取a、b、c三者之間的最大值並將結(jié)果賦給m*/
3.運(yùn)算式語(yǔ)句
由一個(gè)運(yùn)算式加上一個(gè)分號(hào)構(gòu)成。如:A++;x=1;p+=q*4+5;y=4>2?6:1;
用一對(duì)花括弧,把若干條語(yǔ)句括起來,就形成了一條複合語(yǔ)句。形式如下:4.複合語(yǔ)句複合語(yǔ)句的形式為:{語(yǔ)句1;語(yǔ)句2;…語(yǔ)句n;}例如:{z=x+y;z++;u=z/100;printf(“%f”,u);}
花括弧中的語(yǔ)句,可以是簡(jiǎn)單語(yǔ)句、空語(yǔ)句、複合語(yǔ)句、流程控制語(yǔ)句,所有這些語(yǔ)句括在一起,在語(yǔ)法上看成是一條語(yǔ)句,執(zhí)行時(shí)順序執(zhí)行花括弧中的每條語(yǔ)句。複合語(yǔ)句多用於流程控制語(yǔ)句中。
5.空語(yǔ)句
僅僅以分號(hào)“;”作為標(biāo)識(shí)??照Z(yǔ)句的形式為:
;
/*空語(yǔ)句*/空語(yǔ)句本身沒有實(shí)際功能,只是表示什麼操作都不做。設(shè)置空語(yǔ)句的目的,一是在未完成的程式設(shè)計(jì)模組中,暫時(shí)放一條空語(yǔ)句,留待以後對(duì)模組逐步求精實(shí)現(xiàn)時(shí)再增加語(yǔ)句;二是實(shí)現(xiàn)空迴圈等待;三是實(shí)現(xiàn)跳轉(zhuǎn)目標(biāo)點(diǎn)等。例如:intmax(inta,intb)
/*求兩個(gè)整數(shù)的最大值*/{;
/*此處的空語(yǔ)句表示在以後添加內(nèi)容,保證當(dāng)前的程式正常運(yùn)行*/}例如:實(shí)現(xiàn)空迴圈while(getchar()!=’\n’);/*此語(yǔ)句表示只要從鍵盤輸入的字元不是回車鍵則重新輸入*/例如:實(shí)現(xiàn)跳轉(zhuǎn)到目標(biāo)點(diǎn)inti=0,sum=0;ex:;sum+=i++;if(x<100)gotoex;…空語(yǔ)句出現(xiàn)的位置是有限制的。預(yù)處理命令、函數(shù)頭和花括弧“}”之後都不允許出現(xiàn)空語(yǔ)句。注意
3.3輸入和輸出語(yǔ)句
3.3.1字元的輸入和輸出3.3.2格式化輸入和輸出
C語(yǔ)言不提供輸入和輸出語(yǔ)句,輸入和輸出通過調(diào)用C的標(biāo)準(zhǔn)庫(kù)函數(shù)來實(shí)現(xiàn)。C的標(biāo)準(zhǔn)函數(shù)庫(kù)中提供許多用於標(biāo)準(zhǔn)輸入和輸出的庫(kù)函數(shù)(附錄D),使用這些標(biāo)準(zhǔn)輸入和輸出庫(kù)函數(shù)時(shí),要用預(yù)編譯命令“#include”將有關(guān)的“頭檔”包括到用戶原始檔案中。在調(diào)用標(biāo)準(zhǔn)輸入輸出庫(kù)函數(shù)時(shí),檔開頭應(yīng)有以下預(yù)編譯命令:
#include<stdio.h>或#include“stdio.h”其中,h為head之意,std為standard之意,i為input之意,o為output之意。
3.3.1字元的輸入和輸出
電腦的控制臺(tái)是鍵盤和顯示器,從控制臺(tái)輸入和輸出字元的最簡(jiǎn)單的函數(shù)是getchar()和putchar()。
1.getchar函數(shù)使用格式:變數(shù)=getchar();功能:從鍵盤讀入一個(gè)字元,返回該字元的ASCII值,可以將該結(jié)果賦值給字元變數(shù)或整型變數(shù),並自動(dòng)將用戶擊鍵結(jié)果回顯到螢?zāi)簧稀?/p>
2.putchar函數(shù)
使用格式:putchar(變數(shù));功能:把字元寫到螢?zāi)坏漠?dāng)前游標(biāo)位置。例3.1演示如何使用getchar()和putchar()函數(shù)。#include<stdio.h>main(){charc;c=getchar();/*從鍵盤讀入一個(gè)字元,按回車鍵結(jié)束輸入,該字元被存入變數(shù)c*/}
①getchar函數(shù)無參數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)上讀入一個(gè)字元,直到輸入回車鍵才結(jié)束,回車前的所有輸入字元都會(huì)逐個(gè)顯示在螢?zāi)簧?。函?shù)值為從輸入設(shè)備輸入的第1個(gè)字元,空格、回車和Tab都能被讀入。②putchar函數(shù)的參數(shù)是待輸出的字元,這個(gè)字元可以是可列印字元,也可以是轉(zhuǎn)義字元。例如:putchar('\x42');
/*輸出字母B*/
putchar(0x42);
/*直接用ASCII碼值輸出字母B*/注意
3.3.2格式化輸入和輸出
前面的getchar和putchar函數(shù)形式簡(jiǎn)單,使用方便,但只能輸入輸出一個(gè)字元,且不能定制輸入輸出格式。格式化輸入輸出函數(shù)既能輸入輸出各種類型的數(shù)據(jù),又能定制輸入輸出格式。例3.2從螢?zāi)簧陷敵鲆粋€(gè)整數(shù)。#include<stdio.h>main(){inta,b;a=10; b=20; printf("outputaandb:");
/*輸出雙引號(hào)中的字串*/
printf("a=%d,b=%d\n",a,b);
/*輸出a和b的值*/}輸出結(jié)果是:outputa:a=10,b=20
1.printf函數(shù)
格式:
printf(格式控制字串);或printf(格式控制字串,輸出表列);功能:向電腦系統(tǒng)默認(rèn)的輸出設(shè)備輸出若干個(gè)任意類型的數(shù)據(jù)。例如:格式轉(zhuǎn)換說明符
printf("a=
%d
,b=
%d
\n",
a,b);
普通字元輸出表列一般情況下,格式控制字串包括兩種數(shù)據(jù),一種是普通字元,這些字元在輸出時(shí)照原樣輸出;另一種是格式轉(zhuǎn)換說明符,用於控制要輸出的內(nèi)容以何種方式進(jìn)行輸出顯示,格式轉(zhuǎn)換說明符由“%”開始,並以一個(gè)格式字元結(jié)束。
表3-1
printf函數(shù)的格式轉(zhuǎn)換說明符
字元含義示例輸出結(jié)果d(或i)十進(jìn)位整數(shù)inta=65;printf(“%d”,a);65u十進(jìn)位無符號(hào)整數(shù)inta=65000;printf(“%u”,a);65000o八進(jìn)制無符號(hào)整數(shù)inta=65;printf(“%o”,a);101x(或X)十六進(jìn)制無符號(hào)整數(shù)inta=65;printf(“%x”,a);41c單一字元inta=65;printf(“%c”,a);As字串printf(“%s”,”Hello”);Hellof小數(shù)形式的浮點(diǎn)小數(shù)printf(“%f”,314.56);314.560000e(或E)指數(shù)形式的浮點(diǎn)小數(shù)printf(“%e”,314.56);3.145600e+002g(或G)e和f中較短的一種printf(“%g”,314.56);314.56%百分號(hào)本身printf(“%%”);%說明:①“輸出表列”是需要輸出的一些數(shù)據(jù)??梢允沁\(yùn)算式,各個(gè)數(shù)據(jù)之間用逗號(hào)隔開。以下的printf函數(shù)都是合法的:printf("Iamastudent.\n"); printf("%d",3+2);
注意:輸出數(shù)據(jù)的數(shù)據(jù)類型與格式轉(zhuǎn)換說明符必須順序匹配,否則會(huì)引起輸出錯(cuò)誤。如:printf("%d,%f",3.89,6);錯(cuò)誤!②一般情況下,格式轉(zhuǎn)換說明符與輸出項(xiàng)個(gè)數(shù)相同。如果格式轉(zhuǎn)換說明符的個(gè)數(shù)大於輸出項(xiàng)的個(gè)數(shù),則多餘的格式將輸出不定值。如果格式轉(zhuǎn)換說明符的個(gè)數(shù)小於輸出項(xiàng)的個(gè)數(shù),則多餘的輸出項(xiàng)不輸出。例3.3有以下程式#include<stdio.h>main(){int
a=666,b=888;printf("%d\n",a,b);}程式的輸出結(jié)果是()。A)錯(cuò)誤資訊 B)666
C)888 D)666,888思考:如果將輸出語(yǔ)句改為printf(“%d,%d\n”,a);輸出結(jié)果會(huì)怎樣?
格式轉(zhuǎn)換說明符的完整形式如下:
%-0#m.nl或h格式字元
修飾字元含義英文字母l修飾d,u,o,x時(shí),用於輸出long型數(shù)據(jù)修飾f,e,g時(shí),用於輸出longdouble型數(shù)據(jù)英文字母h修飾d,o,x時(shí),用於輸出short型數(shù)據(jù)最小域?qū)抦指定輸出項(xiàng)輸出時(shí)所占列數(shù),數(shù)據(jù)長(zhǎng)度<m,左邊補(bǔ)空格;否則按實(shí)際寬度輸出顯示精度.n對(duì)於實(shí)數(shù),指定小數(shù)位數(shù)(四捨五入)對(duì)於字串,指定從字串左側(cè)開始截取的子串字元個(gè)數(shù)-輸出數(shù)據(jù)在域內(nèi)左對(duì)齊(默認(rèn)右對(duì)齊)+指定在有符號(hào)數(shù)的正數(shù)前加正號(hào)(+)0輸出數(shù)值時(shí),指定在左邊不使用的空位置自動(dòng)填0#在八進(jìn)制和十六進(jìn)制數(shù)前顯示前導(dǎo)符0,0x例3.4printf函數(shù)修飾符的使用。#include<stdio.h>main(){inta=123;floaty=456.78;charch='A';chars[]="Programing";/*s為字元數(shù)組*/printf("%7d,%-4d,%04d\n",a,a,a);
printf("%f,%8f,%8.1f,%.2f,%.2e\n",y,y,y,y,y);
printf("%3c\n",ch);printf("%s\n%12s\n%8.5s\n%2.5s\n%.3s\n",s,s,s,s,s);
}程式輸出結(jié)果
說明:在VisualC++中,調(diào)用printf函數(shù)時(shí),float類型的參數(shù)是先轉(zhuǎn)化為double類型再傳遞的,所以%f可以輸出float和double兩種類型的數(shù)據(jù),不必用%lf輸出double類型的數(shù)據(jù)。
2.scanf函數(shù)
格式:scanf(格式控制字串,地址表列);功能:從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入若干個(gè)任意類型的數(shù)據(jù)。例如:scanf(
"%d
,
%f”,&a,&b
);地址表列格式控制字串分隔符號(hào)
表3-3
printf函數(shù)的格式轉(zhuǎn)換說明符
字元含義d或i輸入十進(jìn)位整數(shù)u輸入無符號(hào)十進(jìn)位整數(shù)o輸入八進(jìn)制整數(shù)x輸入十六進(jìn)制整數(shù)c輸入一個(gè)字元,空白字元(包括空格、回車、跳位字元)也作為有效字元輸入s輸入字串,遇到第一個(gè)空白字元(包括空格、回車、跳位字元)時(shí)結(jié)束f或e輸入實(shí)數(shù),以小數(shù)或指數(shù)形式輸入均可%輸入一個(gè)%地址表列是由若干變數(shù)的地址組成的列表,參數(shù)之間用逗號(hào)隔開。函數(shù)scanf要求必須指定用來接收數(shù)據(jù)的地址,否則,雖然編譯程序不會(huì)出錯(cuò),但會(huì)導(dǎo)致數(shù)據(jù)不能正確地讀入指定的記憶體單元。對(duì)普通變數(shù)而言,可以在變數(shù)前使用“&”符號(hào),用於取變數(shù)的地址,而對(duì)於指針變數(shù)而言,直接使用指針變數(shù)名稱即可。表3-4
scanf函數(shù)的修飾符修飾字元含義英文字母l修飾d,i,u,o,x時(shí),用於輸入long型數(shù)據(jù)修飾f,e時(shí),用於輸入double型數(shù)據(jù)英文字母h修飾d,i,o,x時(shí),用於輸入short型數(shù)據(jù)域?qū)抦指定輸入數(shù)據(jù)的寬度(列數(shù)),系統(tǒng)自動(dòng)按此寬度截取所需數(shù)據(jù)忽略輸入修飾符*抑制符,表示對(duì)應(yīng)的輸入項(xiàng)在讀入後不賦給相應(yīng)的變數(shù)注:scanf函數(shù)沒有精度.n修飾符,即用scanf函數(shù)輸入實(shí)型數(shù)據(jù)時(shí)不能規(guī)定精度。輸入數(shù)據(jù)的分隔符號(hào)的指定:①一般以空格、TAB或回車符作為分隔符號(hào)(在格式控制符之間為空格、TAB或無任何符號(hào)時(shí));②其他字元作為分隔符號(hào):格式控制字串中兩個(gè)格式控制符之間的字元為上述三種字元以外的字元時(shí),輸入數(shù)據(jù)時(shí)要原樣輸入。例如,輸入語(yǔ)句“scanf(“%d,%d”,&a,&b);”,要想在輸入數(shù)據(jù)後使a=3,b=4,則應(yīng)輸入“3,4”。例3.5格式輸入輸出的使用。#include<stdio.h>main(){ inta,b,k; floats,f; charc1,c2,m[10]; scanf("%d,%d,%f,%s",&a,&b,&s,m);/*m是數(shù)組名,表示地址*/ scanf("%3d%*4d%f",&k,&f);
scanf("%*c%3c%2c",&c1,&c2);
printf("a=%d,b=%d,s=%f,m=%s\n",a,b,s,m); printf("k=%d,f=%f,c1=%c,c2=%c\n",k,f,c1,c2);}程式運(yùn)行時(shí)的輸入輸出結(jié)果注意①?gòu)逆I盤輸入數(shù)據(jù)的個(gè)數(shù)應(yīng)該與函數(shù)中輸入表列的項(xiàng)數(shù)相同,當(dāng)兩者不相同時(shí)作如下處理:如果輸入數(shù)據(jù)個(gè)數(shù)少於scanf函數(shù)要求的個(gè)數(shù)時(shí),函數(shù)將等待輸入,直到滿足要求或遇到非法字元為止。如果輸入數(shù)據(jù)個(gè)數(shù)多於scanf函數(shù)要求的個(gè)數(shù)時(shí),多餘的數(shù)據(jù)將留在緩衝區(qū)作為下一次輸入操作的輸入數(shù)據(jù)。②在輸入數(shù)據(jù)時(shí),遇到以下情況時(shí)認(rèn)為該數(shù)據(jù)結(jié)束。遇到空格,或按回車鍵或按TAB鍵;按指定的寬度結(jié)束,如“%3d”,只取3列;遇到非法輸入。
3.4順序程式控制結(jié)構(gòu)
順序結(jié)構(gòu)是結(jié)構(gòu)化程式設(shè)計(jì)的三種基本結(jié)構(gòu)中最簡(jiǎn)單的一種程式組織結(jié)構(gòu),其特點(diǎn)是完全按照語(yǔ)句出現(xiàn)的先後順序依次執(zhí)行。BAAB(a)傳統(tǒng)流程圖
(b)NS流程圖程式自上而下執(zhí)行,先執(zhí)行A塊,再執(zhí)行B塊。順序結(jié)構(gòu)的程式主要由4部分組成:①變數(shù)說明部分。②數(shù)據(jù)輸入部分。③運(yùn)算部分。④運(yùn)算結(jié)果輸出部分。例3.6將任意小寫字母轉(zhuǎn)換為對(duì)應(yīng)的大寫字母並輸出。#include<stdio.h>main(){ charc;
c=getchar(); c=c-32; putchar(c);}程式運(yùn)行時(shí),若輸入:h↙則輸出:H思考:如何判斷輸入的字元是否為小寫字母?(將在3.5中講解)例3.7從鍵盤輸入兩個(gè)變數(shù)的值,交換這兩個(gè)變數(shù)的值,並輸出。分析:假如我們將輸入的兩個(gè)變數(shù)定義為x和y,如果通過“x=y;y=x;”來實(shí)現(xiàn)交換,則當(dāng)執(zhí)行“x=y;”時(shí),將y的值複製給x,此時(shí)x和y的值相等,x原來的值丟失,再執(zhí)行“y=x;”時(shí),將新的x值複製給y,結(jié)果x和y的值相等,都為原來y的值。為了不使x原來的值丟失,必須在執(zhí)行“x=y;”之前,先把x的值放到一個(gè)臨時(shí)變數(shù)(temp)中保存起來,在執(zhí)行了“x=y;後”,再把保存在臨時(shí)變數(shù)中的值賦給y(通過“y=temp;”來實(shí)現(xiàn))。程式代碼:#include<stdio.h>main(){ intx,y,temp; scanf("%d,%d",&x,&y); printf("Beforechange:x=%dy=%d\n",x,y);
temp=x; x=y; y=temp; printf("afterchange:x=%dy=%d\n",x,y);}思考:如果不用臨時(shí)變數(shù),能否使兩個(gè)變數(shù)得到交換呢?例3.8從鍵盤任意輸入一個(gè)三位數(shù),要求輸出這個(gè)數(shù)的逆序數(shù)。如:輸入123,輸出321。分析:要輸出逆序數(shù),則要將原數(shù)的個(gè)位、十位和百位數(shù)分離出來,再用“個(gè)位*100+十位*10+百位”求出逆序數(shù)。個(gè)位數(shù)字可用對(duì)10求餘得到,如123%10=3;最高位百位數(shù)字可用對(duì)100整除得到,如123/100=1;中間位的數(shù)字既可通過將其變換為最高位再整除的方法得到,如(123-1*100)/10=2;也可通過將其變換為最低位再求餘得到,如(123/10)%10=2。程式源代碼如下:#include<stdio.h>main(){ intx,y,b0,b1,b2;/*變數(shù)聲明*/ printf("Pleaseenteranintegerx:");/*提示用戶輸入一個(gè)整數(shù)*/ scanf("%d",&x);/*輸入一個(gè)整數(shù)*/ b0=x%10;/*求最低位*/
b1=(x/10)%10;/*求中間位*/ b2=x/100;/*求最高位*/ y=b0*100+b1*10+b2;/*求逆序數(shù)*/ printf("y=%d\n",y);/*輸出逆序數(shù)*/}程式的運(yùn)行結(jié)果如下:Pleaseenteranintegerx:123↙y=321思考:是否還有其他方法分離個(gè)位、十位和百位數(shù)?
3.5選擇程式控制結(jié)構(gòu)
對(duì)於要先做判斷再選擇的問題就要使用選擇結(jié)構(gòu)(也稱為分支結(jié)構(gòu))。選擇結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語(yǔ)句出現(xiàn)的物理順序。如:在數(shù)學(xué)中,要計(jì)算x的絕對(duì)值,根據(jù)絕對(duì)值定義,當(dāng)x>=0時(shí),其絕對(duì)值為x,而x<0時(shí)其絕對(duì)值是為-x。選擇結(jié)構(gòu)分支條件通常用關(guān)係運(yùn)算式或邏輯運(yùn)算式來表示,實(shí)現(xiàn)程式流程的語(yǔ)句由C語(yǔ)言的if語(yǔ)句或switch語(yǔ)句來完成圖3-8選擇結(jié)構(gòu)流程圖圖3-8表示,當(dāng)條件P為真(成立)時(shí)執(zhí)行A框,否則執(zhí)行B框。無論P(yáng)是否成立,只能執(zhí)行A框或B框之一,不可能既執(zhí)行A框又執(zhí)行B框。無論走哪條路徑,在執(zhí)行A框或B框之後,都脫離本選擇結(jié)構(gòu)。
3.5.1if語(yǔ)句
1.單分支結(jié)構(gòu)2.雙分支結(jié)構(gòu)3.多分支結(jié)構(gòu)1.單分支結(jié)構(gòu)if形式:
if(運(yùn)算式)語(yǔ)句S圖3-9單分支結(jié)構(gòu)的流程圖執(zhí)行過程:系統(tǒng)首先計(jì)算運(yùn)算式的值,如果運(yùn)算式結(jié)果不為0,則執(zhí)行語(yǔ)句S,否則跳過語(yǔ)句S,繼續(xù)執(zhí)行其後的其他語(yǔ)句。說明:①“if”是C語(yǔ)言的關(guān)鍵字;“運(yùn)算式”可以任意合法的C語(yǔ)言運(yùn)算式,可以是關(guān)係運(yùn)算式或邏輯運(yùn)算式,也可以是任意的數(shù)值類型(包括整型、實(shí)型、字元型等);運(yùn)算式兩側(cè)的括弧不能省略。②語(yǔ)句S可以是一條語(yǔ)句,也可以是任意合法的複合語(yǔ)句,其位置比較靈活,可以直接出現(xiàn)在if同一行的後面,也可以出現(xiàn)在if的下一行。例3.9寫出以下程式執(zhí)行後的輸出結(jié)果#include<stdio.h>main(){inta=4,b=3,c=5,t=0;if(a<b)t=a;a=b;b=t;if(a<c)t=a;a=c;c=t;printf("%d%d%d\n",a,b,c);}輸出結(jié)果為:503分析:程式第一行在定義a、b、c、t四個(gè)變數(shù)的同時(shí)進(jìn)行了初始化。接下來第一個(gè)if語(yǔ)句的運(yùn)算式a<b為假(0),if其後的語(yǔ)句“t=a;”不執(zhí)行,值得注意的是“a=b;b=t;”不屬於if的語(yǔ)句,將被執(zhí)行,執(zhí)行後a值為3,b值為0;然後第二個(gè)if語(yǔ)句的運(yùn)算式a<c為真,則執(zhí)行語(yǔ)句“t=a;”,t值變?yōu)?,接著執(zhí)行“a=c;”,a值變?yōu)?,再接著執(zhí)行“c=t;”,c值變?yōu)?;因此,輸出結(jié)果為:503。例3.10計(jì)算並輸出一個(gè)整數(shù)的絕對(duì)值。分析:計(jì)算一個(gè)整數(shù)的絕對(duì)值的關(guān)鍵就是判斷該數(shù)是否小於0。#include<stdio.h>main(){ intx,y; scanf("%d",&x);/*輸入一個(gè)整數(shù)*/ y=x;/*x大於等於0時(shí),y=x*/
if(x<0)y=-x;/*若x<0成立,y=-x*/
printf("y=%d\n",y);}
2.雙分支結(jié)構(gòu)
if-else形式:
if(運(yùn)算式)語(yǔ)句S1else語(yǔ)句S2圖3-10雙分支結(jié)構(gòu)的流程圖執(zhí)行過程:系統(tǒng)首先計(jì)算運(yùn)算式的值,如果運(yùn)算式結(jié)果不為0,則執(zhí)行語(yǔ)句S1,否則,執(zhí)行語(yǔ)句S2。選擇結(jié)構(gòu)執(zhí)行完成後繼續(xù)執(zhí)行其後的其他語(yǔ)句。例如:求兩個(gè)數(shù)中的較大值,可用下麵的語(yǔ)句:if(a>b)max=a;elsemax=b;將例3.10用雙分支結(jié)構(gòu)實(shí)現(xiàn),程式代碼如下:#include<stdio.h>main(){intx,y;scanf("%d",&x);
/*輸入一個(gè)整數(shù)*/if(x<0)y=-x;/*若x<0成立,y=-x,否則y=x*/elsey=x;
printf("y=%d\n",y);}例3.11從鍵盤讀入一個(gè)字元,以與原來不同的形式進(jìn)行輸出。分析:該題的意圖是實(shí)現(xiàn)英文字元的輸入輸出,所謂與與原來不同的形式是指原來輸入的是小寫字母,則轉(zhuǎn)換為對(duì)應(yīng)的大寫字母並輸出;原來輸入的是大寫字母則轉(zhuǎn)換為對(duì)應(yīng)的小寫字母並輸出。程式實(shí)現(xiàn)的步驟是:①?gòu)逆I盤輸入一個(gè)英文字元;②判斷該英文字元的大小寫,並轉(zhuǎn)換成對(duì)應(yīng)的字母;③輸出轉(zhuǎn)換後的英文字元。該題的關(guān)鍵問題是怎樣將判斷字元的大小寫狀態(tài)和實(shí)現(xiàn)轉(zhuǎn)換。有兩種方式實(shí)現(xiàn):一種是根據(jù)ASCII碼進(jìn)行判斷和轉(zhuǎn)換,小寫字母比對(duì)應(yīng)的大寫字母的ASCII碼大32。另一種方式是利用字元處理函數(shù)isupper(ch)判斷ch是否為大寫字母,是則返回1,否則返回0;islower(ch)函數(shù)判斷ch是否為小寫字母,是則返回1,否則返回0;toupper(ch)函數(shù)將ch轉(zhuǎn)換為大寫,tolower(ch)函數(shù)將ch轉(zhuǎn)換為小寫。注意,使用這四個(gè)函數(shù)需要包含頭檔ctype.h。用第一種方式實(shí)現(xiàn)的程式如下:#include<stdio.h>main(){ charch; ch=getchar();/*從鍵盤輸入一個(gè)英文字元*/
if(ch>='a'&&ch<='z')
/*判斷ch是否為小寫字母*/
ch=ch-32;
/*ch為小寫字母,將其轉(zhuǎn)換為大寫*/
else
ch=ch+32;
/*ch為大寫字母,將其轉(zhuǎn)換為小寫*/ putchar(ch);
/*輸出ch*/}運(yùn)行時(shí),輸入:a↙輸出:A思考:用字符處理函數(shù)怎樣實(shí)現(xiàn)程式?
3.多分支結(jié)構(gòu)
if-else-if形式:if(運(yùn)算式1)語(yǔ)句S1elseif(運(yùn)算式2)語(yǔ)句S2…elseif(運(yùn)算式n)語(yǔ)句Snelse語(yǔ)句Sn+1圖3-11雙分支結(jié)構(gòu)的流程圖執(zhí)行過程:if-else-if結(jié)構(gòu)實(shí)際上是由多個(gè)if-else結(jié)構(gòu)組合而成的,系統(tǒng)首先計(jì)算運(yùn)算式1,其值為真(不為0)時(shí),執(zhí)行語(yǔ)句S1;否則,計(jì)算運(yùn)算式2,其值為真(不為0)時(shí),執(zhí)行語(yǔ)句S2;…如果if後的所有運(yùn)算式都不為真,則執(zhí)行語(yǔ)句Sn+1,並結(jié)束整個(gè)分支結(jié)構(gòu)。選擇結(jié)構(gòu)執(zhí)行完成後繼續(xù)執(zhí)行其後的其他語(yǔ)句。例3.12從鍵盤輸入x的值,並通過如下的數(shù)學(xué)關(guān)係式求出相應(yīng)的y值。分析:該題的意圖是根據(jù)輸入的x值,判斷x所屬的區(qū)間,求出y值並輸出。程式實(shí)現(xiàn)的步驟是:①?gòu)逆I盤輸入一個(gè)數(shù);②判斷x所屬的區(qū)間,求出y值;③輸出結(jié)果。#include<stdio.h>main(){intx,y;scanf("%d",&x);
if(x<0)y=-1;elseif(x==0)y=0;
elsey=1;printf("y=%d\n",y);}注意:在表示相等條件時(shí),必須用“==”,不能用“=”
例3.13根據(jù)輸入的成績(jī)等級(jí)列印出評(píng)語(yǔ),等級(jí)與評(píng)語(yǔ)的對(duì)應(yīng)關(guān)係如下表:等級(jí)評(píng)語(yǔ)4Excellent3Good2Average1Poor0Failing分析:該題通過輸入成績(jī)的等級(jí)(0~4級(jí)),轉(zhuǎn)換為對(duì)應(yīng)的評(píng)語(yǔ),是典型的多分支結(jié)構(gòu),可以用if-else-if結(jié)構(gòu)實(shí)現(xiàn)。具體實(shí)現(xiàn)步驟為:①輸入成績(jī)等級(jí)的數(shù)字;②對(duì)輸入的數(shù)字進(jìn)行判斷,得到對(duì)應(yīng)的評(píng)語(yǔ);③輸出結(jié)果。#include<stdio.h>main(){ intgrade; printf("Pleaseinputgrade:"); scanf("%d",&grade);
if(grade==4)printf("Excellent"); elseif(grade==3)printf("Good"); elseif(grade==2)printf("Average"); elseif(grade==1)printf("Poor"); elseif(grade==0)printf("Failing");else
printf("Illegalgrade");}
4.if語(yǔ)句的嵌套
if語(yǔ)句的嵌套是指if或else子句中又包含一個(gè)或多個(gè)if語(yǔ)句。內(nèi)層的if語(yǔ)句既可以嵌套在if子句中,也可以嵌套在else子句中。內(nèi)嵌if語(yǔ)句的一般形式如下:if(運(yùn)算式1)
if(運(yùn)算式2)語(yǔ)句1
else語(yǔ)句2else
if(運(yùn)算式3)語(yǔ)句3
else語(yǔ)句4嵌套的if語(yǔ)句的幾種變化形式①只在if子句中嵌套if語(yǔ)句,形式如下:if(運(yùn)算式1)
if(運(yùn)算式2)語(yǔ)句1else語(yǔ)句2else語(yǔ)句3②只在else子句中嵌套if語(yǔ)句,形式如下:if(運(yùn)算式1)
語(yǔ)句1elseif(運(yùn)算式2)語(yǔ)句2else語(yǔ)句3③不斷在else子句中嵌套if語(yǔ)句形成多層嵌套,形式如下:if(運(yùn)算式1)語(yǔ)句3
語(yǔ)句1…elseif(運(yùn)算式n-1)if(運(yùn)算式2)語(yǔ)句n-1
語(yǔ)句2elseelse
語(yǔ)句nif(運(yùn)算式3)
可以用if-else-if語(yǔ)句形式表示,看起來層次比較分明。
if(運(yùn)算式1)…語(yǔ)句1…elseif(運(yùn)算式2)elseif(運(yùn)算式n-1)
語(yǔ)句2語(yǔ)句n-1elseif(運(yùn)算式3)else
語(yǔ)句3語(yǔ)句n例3.14從鍵盤輸入三個(gè)正整數(shù),找出其中的最大數(shù),並輸出這個(gè)數(shù)。流程圖如下:#include<stdio.h>main(){inta,b,c,max;scanf("%d%d%d",&a,&b,&c);
if(a>b)if(a>c)max=a;elsemax=c;
elseif(b>c)max=b;elsemax=c;printf("max=%d",max);}注意①注意if與else的配對(duì)關(guān)係。內(nèi)嵌結(jié)構(gòu)中,else總是與它上面最近的、未配對(duì)的if配對(duì),組成一對(duì)if-else語(yǔ)句。②如果if與else的數(shù)目不一樣,為了避免在if與else配對(duì)時(shí)出錯(cuò),建議讀者使用“{}”來限定內(nèi)嵌if語(yǔ)句的範(fàn)圍。如下形式的嵌套語(yǔ)句:if(運(yùn)算式1){if(運(yùn)算式2)語(yǔ)句1}else語(yǔ)句2這裏,“{}”限定了內(nèi)嵌if語(yǔ)句的範(fàn)圍,因此else與第一個(gè)if配對(duì)。思考:如果沒有“{}”,else與哪個(gè)if配對(duì)?例3.15設(shè)變數(shù)a、b、c、d和y都已正確定義並賦值。若有以下if語(yǔ)句
if(a<b)if(c==d)y=0;elsey=1;該語(yǔ)句所表示的含義是()。A)B)C)D)
3.5.2switch語(yǔ)句
當(dāng)問題的分支較多(一般大於3個(gè)),用if-else-if結(jié)構(gòu)解決時(shí)由於分支過多,結(jié)構(gòu)冗長(zhǎng),程式邏輯關(guān)係不清晰,通常使用開關(guān)語(yǔ)句(switch語(yǔ)句)來簡(jiǎn)化程式設(shè)計(jì)。開關(guān)語(yǔ)句就像多路開關(guān)一樣,使程式控制流程形成多個(gè)分支,根據(jù)一個(gè)運(yùn)算式可能產(chǎn)生的不同結(jié)果值,選擇其中的一個(gè)或幾個(gè)分支語(yǔ)句去執(zhí)行。因此,它常用於各種分類統(tǒng)計(jì)、菜單等程式設(shè)計(jì)。switch語(yǔ)句的一般形式switch(運(yùn)算式){case常量運(yùn)算式1:語(yǔ)句1;break;case常量運(yùn)算式2:語(yǔ)句2;break;…case常量運(yùn)算式n:語(yǔ)句n;break;default:語(yǔ)句n+1;break;}switch結(jié)構(gòu)流程圖執(zhí)行過程:①計(jì)算switch後圓括號(hào)內(nèi)運(yùn)算式的值,然後用該值逐個(gè)與case後的常量運(yùn)算式值進(jìn)行比較。當(dāng)找到相匹配的值時(shí),就執(zhí)行該case後面的語(yǔ)句。若所有case中的常量運(yùn)算式的值都沒有與運(yùn)算式的值匹配的,就執(zhí)行default後面的語(yǔ)句。②執(zhí)行完一個(gè)case後面的語(yǔ)句後,如果遇到break語(yǔ)句,則跳出switch語(yǔ)句;如果沒有break語(yǔ)句,程式轉(zhuǎn)到下一個(gè)case處繼續(xù)執(zhí)行,並不再進(jìn)行判斷。說明:①switch、case、default、break均是關(guān)鍵字。上述格式中花括弧括起來的部分稱為switch語(yǔ)句體。switch語(yǔ)句體中可以沒有break語(yǔ)句和default部分。②switch後的運(yùn)算式可以是整型或字元型,不能為實(shí)型。每一個(gè)case後面的常量運(yùn)算式的值必須互不相同,常量運(yùn)算式中不能有變數(shù)。③default最多只有一個(gè),位置任意。各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。④多個(gè)case可以共用一組執(zhí)行語(yǔ)句。例3.16若有定義:floatx=1.5;inta=1,b=3,c=2;則正確的switch語(yǔ)句是()。A)switch(x){case1.0:printf(“*\n”);case2.0:printf(“**\n”);}B)switch((int)x);{case1:printf(“*\n”);case2:printf(“**\n”);}C)switch(a+b){case1:printf(“*\n”);case2+1:printf(“**\n”);}D)switch(a+b){case1:printf(“*\n”);casec:printf(“**\n”);}例3.17將例3.13用switch語(yǔ)句實(shí)現(xiàn)。#include<stdio.h>main(){ intgrade; printf("Pleaseinputgrade:"); scanf("%d",&grade); switch(grade) {case4: printf("Excellent");break; case3:printf("Good");break; case2:printf("Average");break; case1:printf("Poor");break; case0:printf("Failing");break;default:printf("Illegalgrade");break;
}}思考:如果每個(gè)case語(yǔ)句之後沒有break語(yǔ)句,程式運(yùn)行的輸出結(jié)果有何變化?3.5.3案例研究:個(gè)人所得稅計(jì)算例3.18依法納稅是每個(gè)公民應(yīng)盡的義務(wù),我國(guó)於1980年9月頒佈施行個(gè)人所得稅法,開始徵收個(gè)人所得稅,同時(shí)確定了個(gè)稅800元的起征點(diǎn)。25年來,我國(guó)職工工資收入和居民消費(fèi)價(jià)格指數(shù)都有較大提高,加之近年教育、住房、醫(yī)療等改革的深入,消費(fèi)支出明顯增長(zhǎng),早已超過了個(gè)人
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技與教育融合的網(wǎng)絡(luò)教學(xué)資源建設(shè)
- 愛崗敬業(yè)樂于奉獻(xiàn)先進(jìn)事跡(4篇)
- gps車貸合同范本
- 公共建筑光伏合同范本
- 公民出國(guó)勞務(wù)合同范本
- 農(nóng)村兄弟分房合同范本
- 親戚合伙餐飲合同范本
- 冷凍供貨合同范本
- 上海大眾合同范本
- 觸電事故應(yīng)急救援措施方案(15篇)
- 高二歷史【開學(xué)第一課】2022年高中秋季開學(xué)指南之愛上歷史課
- 人間生活(外國(guó)部分)
- 2023年TOFD檢測(cè)通用工藝規(guī)程參考版
- 物業(yè)保潔團(tuán)隊(duì)建設(shè)與管理
- 紙與我們的生活
- 國(guó)家中長(zhǎng)期科技發(fā)展規(guī)劃綱要2021-2035
- 施工班組考核評(píng)分表
- 水泥攪拌樁施工記錄表
- 脫碳塔CO2脫氣塔設(shè)計(jì)計(jì)算
- 《駱駝祥子》通讀指導(dǎo)手冊(cè)
- 股東會(huì)會(huì)議系列文件(通知、議程、簽到表、表決票、決議)
評(píng)論
0/150
提交評(píng)論