版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第2章數(shù)據(jù)類型與運算式
2.1數(shù)據(jù)類型概述整型基本整型int數(shù)據(jù)類型基本類型構(gòu)造類型指針類型*空類型void實型(浮點型)字元型char枚舉類型enum數(shù)組類型[]結(jié)構(gòu)體類型struct共用體類型union單精確度實型float雙精度實型double短整型short長整型long無符號整型unsigned基本數(shù)據(jù)類型int整數(shù),在目前絕大多數(shù)機器上占4個位元組。TC2中是2個位元組float單精確度浮點數(shù),一般是4個位元組長double雙精度浮點數(shù),一般是8個位元組長char字元,一般是1個位元組長用來表示256個ASCII字元,或者0~255的整數(shù)數(shù)據(jù)類型修飾符shortshortint,短整數(shù),一般2個位元組長。通常簡寫為shortlonglong
int,長整數(shù),一般是4個位元組長。通常簡寫為longlongdouble,長雙精度(高精度)浮點數(shù),一般是10個位元組長。signed用來修飾char、int、short和long,說明他們是有符號的整數(shù)(正整數(shù)、0和負(fù)整數(shù))。一般缺省都是有符號的,所以這個修飾符通常省略unsigned用來修飾char、int、short和long,說明他們是無符號的整數(shù)(正整數(shù)和0)
2.2常量和變數(shù)
2.2.1識別字和關(guān)鍵字2.2.2常量2.2.3變數(shù)2.2.1識別字和關(guān)鍵字
C語言的識別字的命名規(guī)則是:1.由字母或下劃線(_)開頭,同時由字母、0~9的數(shù)字或下劃線(_)組成。2.不能與關(guān)鍵字同名。例如:school_id,_age,es10為合法的識別字。school-id,man*,2year,class為不合法的識別字。
識別字是用來標(biāo)識對象名字(包括變數(shù)、函數(shù)、數(shù)組、類型等)的有效字元序列。構(gòu)造一個識別字的名字,需要按照一定的規(guī)則。識別字不宜過短,過短的識別字會導(dǎo)致程式的可讀性變差;但也不宜過長,否則將增加錄入工作量和出錯的可能性。關(guān)鍵字(32個)關(guān)鍵字在C語言中,有其特殊的含義,不能用作一般的識別字使用,即一般的識別字(變數(shù)名、類名、方法名等)不能與其同名。ANSIC關(guān)鍵字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile2.2.2常量
常量是指直接用於程式中的、不能被程式修改的、固定不變的量。C語言中的常量值是用數(shù)值或字串表示的。C語言常量包括整數(shù)、浮點數(shù)、字元、字串四種類型。有時為了使用方便,可用一個符號名來代表一個常量,這稱為符號常量。符號常量一般定義格式如下:#define識別字常量數(shù)據(jù)例如:#definePI3.14159一旦某識別字定義成為一個常量後,以後在程式處理時,凡是碰到了該識別字,都將替換成對應(yīng)的常量。
2.2.3變數(shù)
變數(shù)是指C語言編程中合法的識別字,是用來存取某種類型值的存儲單元,其中存儲的值可以在程式執(zhí)行的過程中被改變。必須先定義後使用
定義變數(shù)的一般形式為:
變數(shù)類型說明符變數(shù)列表[=初值]
①變數(shù)類型說明符,確定了變數(shù)的取值範(fàn)圍以及對變數(shù)所能進行的操作規(guī)範(fàn)②變數(shù)列表,由一個或多個變數(shù)名組成。當(dāng)要定義多個變數(shù)時,各變數(shù)之間用逗號分隔。③初值是可選項,變數(shù)可以在定義的同時賦初值,也可以先定義,在後續(xù)程式中賦初值。C語言中的變數(shù)名除了符合識別字的條件之外,還必須滿足下列約定:①變數(shù)名不能與關(guān)鍵字相同。②C語言對變數(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語言的整數(shù)常量。整數(shù)常量的取值範(fàn)圍是有限的,它的大小取決於此類整型數(shù)的類型,與所使用的進制形式無關(guān)。整數(shù)常量有三種形式:
十進位、八進制、十六進制(1)十進位整數(shù)是由不以0開頭的0~9的數(shù)字組成的數(shù)據(jù)。(2)八進制整數(shù)是由以0開頭的0~7的數(shù)字組成的數(shù)據(jù)。(3)十六進制整數(shù)是由以0x或0X開頭的0~9的數(shù)字及A~F的字母組成的數(shù)據(jù)。例如:0,63,83是十進位數(shù),00,077,0123是八進制數(shù),0x0,0X0,0X53,0x53,0X3f,0x3f是十六進制數(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ù)類型
2.4.1實型常量實數(shù)類型的數(shù)據(jù)即實型數(shù)據(jù),在C語言中實型數(shù)據(jù)又稱為浮點數(shù)。浮點數(shù)是帶有小數(shù)的十進位數(shù),可用十進位數(shù)形式或指數(shù)形式表示。浮點數(shù)表示形式(1)十進位數(shù)形式:十進位整數(shù)+小數(shù)點+十進位小數(shù)。(2)指數(shù)形式:十進位整數(shù)+小數(shù)點+十進位小數(shù)+E(或e)+正負(fù)號+指數(shù)。例如:3.14159,0.567,9777.12是十進位數(shù)形式,1.234e5,4.90867e-2是指數(shù)形式。C語言的浮點數(shù)常量在機器中有單精確度和雙精度之分。單精確度以32位形式存放,雙精度則以64位形式存放。
2.4.2實型變數(shù)
(1)float類型float類型是一個位數(shù)為32位的單精確度浮點數(shù)。它具有運行速度較快,佔用空間較少的特點。(2)double類型double類型是一個位數(shù)為64位的雙精度浮點數(shù)。雙精度數(shù)在某些具有優(yōu)化和高速運算能力的現(xiàn)代處理機上運算比單精確度數(shù)快。雙精度類型double比單精確度類型float具有更高的精度和更大表示範(fàn)圍,常常使用。
2.5字元類型
2.5.1字元型常量(1)用單引號括起來的一個字元;如:‘A’、
‘1’、’?’等。(2)用單引號括起來的由反斜杠(\)引導(dǎo)的轉(zhuǎn)義字元。如:‘\n’、‘\t’、’\x41’、’\101’等。表2-4轉(zhuǎn)義字元表功能字元形式功能字元形式回車\r單引號\’換行\(zhòng)n雙引號\"水準(zhǔn)製錶\t八進制位模式\ddd退格\b十六進制模式\xdddd換頁\f反斜線\\
2.5.2字元型變數(shù)
字元型變數(shù)的類型說明符為char,它在機器中占8位,其範(fàn)圍為0~255。注意:字元型變數(shù)只能存放一個字元,不能存放多個字元,例如:chara='am';這樣定義賦值是錯誤的。
字串常量
用一對雙引號括起來的字元序列。注意:每個字串的後面都有一個‘\0’結(jié)束符。
如:“SHANGHAI”,“AbcdeFGHijk”,“Howareyou”?!甛’‘
√
‘\\‘
√
‘’‘
‘\‘
‘a(chǎn)’與“a”的區(qū)別。注意
2.6不同數(shù)據(jù)類型之間的轉(zhuǎn)換
不同類型的數(shù)據(jù)之間的運算稱為混合運算。在混合運算中,將會碰到類型轉(zhuǎn)換的情況。類型轉(zhuǎn)換可分為自動類型轉(zhuǎn)換、強制類型轉(zhuǎn)換兩種。
⒈自動類型轉(zhuǎn)換
轉(zhuǎn)換從低級到高級。各類型從低級到高級的順序為:char→int→long→float→double。例如:charch=’A’;inti=28;floatx=2.36;doubley=6.258e+6;若運算式為i+ch+x*y轉(zhuǎn)換過程:先將ch轉(zhuǎn)換成int型,計算i+ch,由於ch=’A’,而’A’的ASCⅡ碼值為65,故計算結(jié)果為93,類型為int型。再將x轉(zhuǎn)換成double型,計算x*y,結(jié)果為double類型。最後將i+ch的值93轉(zhuǎn)換成double型,運算式的值最後為double類型。
⒉強制類型轉(zhuǎn)換
高級數(shù)據(jù)要轉(zhuǎn)換成低級數(shù)據(jù),需用使用強制類型轉(zhuǎn)換。這種使用可能會導(dǎo)致溢出或精度的下降,最好不要使用。強制類型轉(zhuǎn)換的格式為:
(type)變數(shù);其中:type為要轉(zhuǎn)換成的變數(shù)類型。例如:(int)(a+b)(強制將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);}運行結(jié)果為:x=3.500000i=3
2.7運算符與運算式
2.7.1算術(shù)運算符與算術(shù)運算式2.7.2賦值運算符與賦值運算式2.7.3關(guān)係運算符與關(guān)係運算式2.7.4邏輯運算符與邏輯運算式2.7.5條件運算符與條件運算式2.7.6逗號運算符與逗號運算式2.7.7運算符的優(yōu)先順序和結(jié)合法則2.7.1算術(shù)運算符與算術(shù)運算式算術(shù)運算符用於算術(shù)運算,其運算元為數(shù)字類型或字元類型。表2-5算術(shù)運算符運算符名稱使用方式說明+加a+ba加b-減a-ba減b*乘a*ba乘b/除a/ba除b%取模a%ba取模b(返回除數(shù)的餘數(shù))++自增++a,a++自增--自減--a,a--自減例:合法的C語言算術(shù)運算式。
a*b/c-1.5+’a’+fabs(-5)
fabs(-5)是求-5的絕對值的庫函數(shù)。“++”、“--”
首碼方式是先將運算元加(或減)1,再將運算元的值作為算術(shù)運算式的值;尾碼方式是先將運算元的值作為算術(shù)運算式的值,再將其加(或減)1。例如:a的值為5,
++a為首碼方式,首先將a的值加1,再得到運算式的值為6;
a++為尾碼方式,首先得到運算式的值為5,再將a的值加1。自增運算符和自減運算符運算對象只能是變數(shù),不能是常量或運算式。形式3++或++(i+j)都是非法的運算式。
2.7.2賦值運算符與賦值運算式
賦值運算符“=”就是把右邊運算元的值賦給左邊運算元。賦值運算符左邊運算元必須是一個變數(shù),右邊運算元可以是常量、變數(shù)、運算式。例如:運算式b=a+3在賦值運算符兩邊的運算元的數(shù)據(jù)類型如果一致,就直接將右邊的數(shù)據(jù)賦給左邊;如果不一致,就需要進行數(shù)據(jù)類型自動或強制轉(zhuǎn)換,將右邊的數(shù)據(jù)類型轉(zhuǎn)換成左邊的數(shù)據(jù)類型後,再將右邊的數(shù)據(jù)賦給左邊變數(shù)。複合運算符運算符名稱使用方式說明+=相加賦值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,計算運算式a+=a-=a*12和a+=a-=a*=12的值
2.7.3關(guān)係運算符與關(guān)係運算式
關(guān)係運算符用來對兩個運算元進行比較。關(guān)係運算式就是用關(guān)係運算符將兩個運算式連接起來的式子,其運算結(jié)果為布爾邏輯值。如果關(guān)係運算式成立結(jié)果為真(true),否則為假(false)。由於C語言沒有邏輯型數(shù)據(jù),就用1代表“真”,0代表“假”。關(guā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ōu)先順序(1)“<”、“<=”、“>”和“>=”為同一級,“==”和“!=”為同一級。前者優(yōu)先順序高於後者。(2)關(guān)係運算符優(yōu)先順序低於算術(shù)運算符,高於賦值運算符和逗號運算符。例2.2關(guā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);}運行結(jié)果為
001101程式輸出了6個運算式的值,其中有兩個是賦值運算式,請讀者根據(jù)運算符的優(yōu)先順序作出判斷。注意關(guān)係運算式3<=x<=5等價於關(guān)係運算式(3<=x)<=5當(dāng)x=10時,3<=x的值是1,再計算1<=5,得到1。其實,無論x去何值,關(guān)係運算式3<=x的值不是1就是0,都小於5,即3<=x<=5的值恒為1。由此看出關(guān)係運算式3<=x<=5無法正確表示代數(shù)式3<=x<=5。
2.7.4邏輯運算符與邏輯運算式
邏輯運算符用來對關(guān)係運算式進行運算。邏輯運算式就是用邏輯運算符將關(guān)係運算式連接起來的式子,其運算結(jié)果為布爾邏輯值。表2-8邏輯運算符運算符名稱&&邏輯與||邏輯或!邏輯非表2-9與、或、非運算規(guī)則運算式A運算式BA&&BA||B!A假假假假真假真假真真真假假真假真真真真假優(yōu)先次序(1)!→&&→||(2)!高於算術(shù)運算符,&&、||低於關(guān)係運算符。例如:a||b&&c等價於a||(b&&c)。!a&&b等價於(!A)&&b。x>=3&&x<=5等價於(x>=3)&&(x<=5)。!x==2等價於(!x)==2。a||3*8&&2等價於a||((3*8)&&2)。例2.3邏輯運算式的運用#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);}運行結(jié)果為0101求解規(guī)則求解C語言邏輯運算式時,按從左到右的順序計算運算符兩側(cè)的運算元,一旦得到運算式的結(jié)果,就停止計算。求解邏輯運算式exp1&&exp2時,先計算exp1,若其值為0,則exp1&&exp2值一定為0。此時,沒有必要計算exp2的值。例2.3中,計算運算式!a&&b時,先算!a,由於a的值是2,!a就是0,該邏輯運算式的值一定是0,不必再計算b。求解邏輯運算式exp1||exp2時,先計算exp1,若其值為非0,則exp1||exp2值一定為1。此時,沒有必要計算exp2的值。例2.3中,計算運算式a||3+10&&2時,先算a,由於a的值是2,該邏輯運算式的值一定是1,不必再計算3+10&&2。通常,關(guān)係運算符和邏輯運算符在一起使用,用於流程控制語句的判斷條件。
2.7.5條件運算符與條件運算式
條件運算符是一個三目運算符。一般形式為:
運算式1?運算式2:運算式3其中運算式1是一個關(guān)係運算式或邏輯運算式。執(zhí)行過程:先求解運算式1的值,若運算式1的值為真,則求解運算式2的值,且作為整個條件運算式的結(jié)果;若運算式1的值為假,則求解運算式3的值,且作為整個條件運算式的結(jié)果。賦值運算式
max=(a>b)?a:b執(zhí)行結(jié)果就是將條件運算式的值賦給max,也就是將a和b二者中大者賦給max。條件運算符的優(yōu)先順序較低,只比賦值運算符高。它的結(jié)合方向是自右向左。例如:①(a>b)?a:b+1等價於a>b?a:(b+1)。②a>b?a:c>d?c:d
等價於a>b?a:(c>d?c:d)。
2.7.6逗號運算符與逗號運算式
逗號運算式的一般形式為
運算式1,運算式2逗號運算式的求解過程是:先求解運算式1,再求解運算式2。整個逗號運算式的值是運算式2的值。例如:x=(y=6,y*3)首先將6賦給y,然後執(zhí)行y*3的運算,將整個結(jié)果賦給x。一個逗號運算式又可以與另一個逗號運算式組成一個新的逗號運算式,例如:(a=3*5,a+4),a+5先計算出a的值為3*5,等於15,再進行a*4的運算為60,再進行a+5的運算得20,即整個運算式的值為20。逗號運算式的一般形式可以擴展為運算式1,運算式2,運算式3,…,運算式n它的值為運算式n的值。
2.7.7運算符的優(yōu)先順序和結(jié)合法則
在運算式求值時,先按運算符的優(yōu)先順序順序高低次序執(zhí)行,例如先乘除後加減。在兩個相同的優(yōu)先順序的運算符運算操作時,則採用左運算符優(yōu)先規(guī)則,即從左到右執(zhí)行。關(guān)於“結(jié)合法則”的概念在其他一些高級語言中是沒有的,是C語言的特點之一,應(yīng)該瞭解清楚。附錄C列出了所有運算符以及它們的優(yōu)先順序和結(jié)合法則。1.在C語言中,數(shù)據(jù)都屬於一定的類型的。不同類型數(shù)據(jù)的操作方式和取值範(fàn)圍不同,所占存儲空間的大小也不同。2.識別字是用來標(biāo)識對象名字(包括變數(shù)、函數(shù)、數(shù)組、類型等)的有效字元序列。C語言中的變數(shù)名必須符合識別字的命名規(guī)則,並且變數(shù)名不能與關(guān)鍵字相同。3.在程式中,數(shù)據(jù)的表現(xiàn)形式有常量和變數(shù)。常量有字面常量和符號常量兩種形式,符號常量只是一個字串,用來代替一個已知的常量。小結(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位元組。對字元型都是1位元組。對於浮點數(shù)一般都是float:4位元組,double:8位元組。5.要注意運算符的優(yōu)先順序和結(jié)合法則。小結(jié)第3章C語言程式的控制結(jié)構(gòu)
本章導(dǎo)讀本章包括知識點:演算法的描述方法數(shù)據(jù)的輸入輸出函數(shù)調(diào)用格式if語句及switch語句的使用3種迴圈結(jié)構(gòu)break、continue和goto語句的作用。常用演算法:如遞推法、窮舉法等C程式的基本風(fēng)格程式設(shè)計的錯誤及程式的調(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):即對數(shù)據(jù)的描述和組織形式。演算法(algorithm):對操作或行為的描述,即操作步驟。廣義地說,演算法就是做某一件事的步驟或程式。電腦解題的演算法大致包括這兩大類演算法:
非數(shù)值運算演算法和數(shù)值運算演算法。演算法特性:①有窮性。演算法的步驟必須是有限的,每個步驟都在有限的時間內(nèi)做完,執(zhí)行有限個步驟後終止。②確定性。演算法中每一步驟都必須有明確定義,不允許有模棱兩可的解釋,不允許有多義性。例如:“如果成績大於等於90分,則輸出A;如果成績小於等於90分,則輸出B”,當(dāng)成績?yōu)?0分時,既會輸出A,又會輸出B,這就產(chǎn)生了不確定性。③有效性。演算法的每一步操作都應(yīng)該能有效執(zhí)行。如一個數(shù)被0除就是無效不可行的,應(yīng)避免。
演算法特性
④沒有輸入或有多個輸入。例如:求1+2+3+…+100時,不需要輸入任何資訊就能求出結(jié)果;而要求1+2+3+…+n時,必須從鍵盤輸入n的值,才能求出結(jié)果。⑤有一個或多個輸出。演算法的目的是為了求解,“解”就是演算法的輸出。沒有輸出的演算法是沒有意義的。3.1.2演算法的表示方法
常用方法有:自然語言、傳統(tǒng)流程圖、NS流程圖、偽代碼等
1.用自然語言表示演算法自然語言就是人們?nèi)粘J褂玫恼Z言,可以是漢語、英語或其他語言。用自然語言表示演算法,通俗易懂,但文字冗長,在表達上不夠嚴(yán)格,引起理解上的歧義性,不易轉(zhuǎn)化為程式,描述複雜的演算法不很方便。因此,除了很簡單的問題外,一般不用自然語言描述演算法。用自然語言表示的求1+2+3+…+6的演算法如下:演算法1:S1:計算1+2得到3;S2:將第一步中的運算結(jié)果3與3相加得到6;S3:將第二步中的運算結(jié)果6與4相加得到10;S4:將第三步中的運算結(jié)果10與5相加得到15;S5:將第四步中的運算結(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ù)較大時,比如1+2+3+…+10000,再用這種方法是行不通的;演算法2是比較簡單的演算法,且易於在電腦上執(zhí)行操作。
2.用傳統(tǒng)流程圖表示演算法
流程圖是一個描述程式的控制流程和指令執(zhí)行情況的有向圖,用流程圖表示演算法,直觀形象,易於理解。美國國家標(biāo)準(zhǔn)化協(xié)會(ANSI)規(guī)定了一些常用符號如圖所示用傳統(tǒng)流程圖描述計算1+2+3+…+6的演算法
3.用NS結(jié)構(gòu)化流程圖表示演算法1973年美國學(xué)者I.Nassi和B.Schneiderman提出了一種新型流程圖—NS結(jié)構(gòu)化流程圖,這種流程圖一方面取消了帶箭頭的流程線,這樣演算法被迫只能從上到下順序執(zhí)行,避免了演算法流程的任意轉(zhuǎn)向,適於結(jié)構(gòu)化程式設(shè)計;另一方面,這種流程圖節(jié)省篇幅,因而很受歡迎。用NS流程圖描述的計算1+2+3+…+6的演算法
4.用偽代碼表示演算法
偽代碼使用介於自然語言和電腦語言之間的文字和符號來描述演算法。它使用起來靈活,無固定格式和規(guī)範(fàn),無圖形符號,只要寫出來自己或別人能看懂就行,由於它與電腦語言比較接近,便於向電腦語言演算法(即程式)過渡。用偽代碼描述的1+2+3+…+6演算法如下:begin/*演算法開始*/1=>i0=>swhilei≤6{s+i=>si+1=>i}printsumend/*演算法結(jié)束*/在程式設(shè)計中讀者可根據(jù)需要和習(xí)慣任意選用。
3.2C語句的分類
C語言的語句可分為5大類:控制語句函數(shù)調(diào)用語句運算式語句複合語句空語句
1.控制語句
控制語句用來實現(xiàn)對程式流程的選擇、迴圈、轉(zhuǎn)向和返回等進行控制。C語言中共有9種控制語句,包括12個關(guān)鍵字,可以分為以下幾類:選擇語句:if…else和switch(包括case和default)。迴圈語句:for、while和do…while。轉(zhuǎn)向語句:continue、break和goto。返回語句:return。本章的3.5、3.6和3.7中將陸續(xù)介紹這些控制語句。
2.函數(shù)調(diào)用語句
函數(shù)調(diào)用語句是由一個函數(shù)調(diào)用加一個分號構(gòu)成的語句。它的一般形式是:
函數(shù)名(實參表);例如:printf(“ThisisaCProgram”);
/*用於輸出雙引號中的字串*/c=getchar();
/*用於從鍵盤讀入一個字元*/
m=max(a,b,c);
/*用於求取a、b、c三者之間的最大值並將結(jié)果賦給m*/
3.運算式語句
由一個運算式加上一個分號構(gòu)成。如:A++;x=1;p+=q*4+5;y=4>2?6:1;
用一對花括弧,把若干條語句括起來,就形成了一條複合語句。形式如下:4.複合語句複合語句的形式為:{語句1;語句2;…語句n;}例如:{z=x+y;z++;u=z/100;printf(“%f”,u);}
花括弧中的語句,可以是簡單語句、空語句、複合語句、流程控制語句,所有這些語句括在一起,在語法上看成是一條語句,執(zhí)行時順序執(zhí)行花括弧中的每條語句。複合語句多用於流程控制語句中。
5.空語句
僅僅以分號“;”作為標(biāo)識??照Z句的形式為:
;
/*空語句*/空語句本身沒有實際功能,只是表示什麼操作都不做。設(shè)置空語句的目的,一是在未完成的程式設(shè)計模組中,暫時放一條空語句,留待以後對模組逐步求精實現(xiàn)時再增加語句;二是實現(xiàn)空迴圈等待;三是實現(xiàn)跳轉(zhuǎn)目標(biāo)點等。例如:intmax(inta,intb)
/*求兩個整數(shù)的最大值*/{;
/*此處的空語句表示在以後添加內(nèi)容,保證當(dāng)前的程式正常運行*/}例如:實現(xiàn)空迴圈while(getchar()!=’\n’);/*此語句表示只要從鍵盤輸入的字元不是回車鍵則重新輸入*/例如:實現(xiàn)跳轉(zhuǎn)到目標(biāo)點inti=0,sum=0;ex:;sum+=i++;if(x<100)gotoex;…空語句出現(xiàn)的位置是有限制的。預(yù)處理命令、函數(shù)頭和花括弧“}”之後都不允許出現(xiàn)空語句。注意
3.3輸入和輸出語句
3.3.1字元的輸入和輸出3.3.2格式化輸入和輸出
C語言不提供輸入和輸出語句,輸入和輸出通過調(diào)用C的標(biāo)準(zhǔn)庫函數(shù)來實現(xiàn)。C的標(biāo)準(zhǔn)函數(shù)庫中提供許多用於標(biāo)準(zhǔn)輸入和輸出的庫函數(shù)(附錄D),使用這些標(biāo)準(zhǔn)輸入和輸出庫函數(shù)時,要用預(yù)編譯命令“#include”將有關(guān)的“頭檔”包括到用戶原始檔案中。在調(diào)用標(biāo)準(zhǔn)輸入輸出庫函數(shù)時,檔開頭應(yīng)有以下預(yù)編譯命令:
#include<stdio.h>或#include“stdio.h”其中,h為head之意,std為standard之意,i為input之意,o為output之意。
3.3.1字元的輸入和輸出
電腦的控制臺是鍵盤和顯示器,從控制臺輸入和輸出字元的最簡單的函數(shù)是getchar()和putchar()。
1.getchar函數(shù)使用格式:變數(shù)=getchar();功能:從鍵盤讀入一個字元,返回該字元的ASCII值,可以將該結(jié)果賦值給字元變數(shù)或整型變數(shù),並自動將用戶擊鍵結(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();/*從鍵盤讀入一個字元,按回車鍵結(jié)束輸入,該字元被存入變數(shù)c*/}
①getchar函數(shù)無參數(shù),它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)上讀入一個字元,直到輸入回車鍵才結(jié)束,回車前的所有輸入字元都會逐個顯示在螢?zāi)簧稀:瘮?shù)值為從輸入設(shè)備輸入的第1個字元,空格、回車和Tab都能被讀入。②putchar函數(shù)的參數(shù)是待輸出的字元,這個字元可以是可列印字元,也可以是轉(zhuǎn)義字元。例如:putchar('\x42');
/*輸出字母B*/
putchar(0x42);
/*直接用ASCII碼值輸出字母B*/注意
3.3.2格式化輸入和輸出
前面的getchar和putchar函數(shù)形式簡單,使用方便,但只能輸入輸出一個字元,且不能定制輸入輸出格式。格式化輸入輸出函數(shù)既能輸入輸出各種類型的數(shù)據(jù),又能定制輸入輸出格式。例3.2從螢?zāi)簧陷敵鲆粋€整數(shù)。#include<stdio.h>main(){inta,b;a=10; b=20; printf("outputaandb:");
/*輸出雙引號中的字串*/
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è)備輸出若干個任意類型的數(shù)據(jù)。例如:格式轉(zhuǎn)換說明符
printf("a=
%d
,b=
%d
\n",
a,b);
普通字元輸出表列一般情況下,格式控制字串包括兩種數(shù)據(jù),一種是普通字元,這些字元在輸出時照原樣輸出;另一種是格式轉(zhuǎn)換說明符,用於控制要輸出的內(nèi)容以何種方式進行輸出顯示,格式轉(zhuǎn)換說明符由“%”開始,並以一個格式字元結(jié)束。
表3-1
printf函數(shù)的格式轉(zhuǎn)換說明符
字元含義示例輸出結(jié)果d(或i)十進位整數(shù)inta=65;printf(“%d”,a);65u十進位無符號整數(shù)inta=65000;printf(“%u”,a);65000o八進制無符號整數(shù)inta=65;printf(“%o”,a);101x(或X)十六進制無符號整數(shù)inta=65;printf(“%x”,a);41c單一字元inta=65;printf(“%c”,a);As字串printf(“%s”,”Hello”);Hellof小數(shù)形式的浮點小數(shù)printf(“%f”,314.56);314.560000e(或E)指數(shù)形式的浮點小數(shù)printf(“%e”,314.56);3.145600e+002g(或G)e和f中較短的一種printf(“%g”,314.56);314.56%百分號本身printf(“%%”);%說明:①“輸出表列”是需要輸出的一些數(shù)據(jù)??梢允沁\算式,各個數(shù)據(jù)之間用逗號隔開。以下的printf函數(shù)都是合法的:printf("Iamastudent.\n"); printf("%d",3+2);
注意:輸出數(shù)據(jù)的數(shù)據(jù)類型與格式轉(zhuǎn)換說明符必須順序匹配,否則會引起輸出錯誤。如:printf("%d,%f",3.89,6);錯誤!②一般情況下,格式轉(zhuǎn)換說明符與輸出項個數(shù)相同。如果格式轉(zhuǎn)換說明符的個數(shù)大於輸出項的個數(shù),則多餘的格式將輸出不定值。如果格式轉(zhuǎn)換說明符的個數(shù)小於輸出項的個數(shù),則多餘的輸出項不輸出。例3.3有以下程式#include<stdio.h>main(){int
a=666,b=888;printf("%d\n",a,b);}程式的輸出結(jié)果是()。A)錯誤資訊 B)666
C)888 D)666,888思考:如果將輸出語句改為printf(“%d,%d\n”,a);輸出結(jié)果會怎樣?
格式轉(zhuǎn)換說明符的完整形式如下:
%-0#m.nl或h格式字元
修飾字元含義英文字母l修飾d,u,o,x時,用於輸出long型數(shù)據(jù)修飾f,e,g時,用於輸出longdouble型數(shù)據(jù)英文字母h修飾d,o,x時,用於輸出short型數(shù)據(jù)最小域?qū)抦指定輸出項輸出時所占列數(shù),數(shù)據(jù)長度<m,左邊補空格;否則按實際寬度輸出顯示精度.n對於實數(shù),指定小數(shù)位數(shù)(四捨五入)對於字串,指定從字串左側(cè)開始截取的子串字元個數(shù)-輸出數(shù)據(jù)在域內(nèi)左對齊(默認(rèn)右對齊)+指定在有符號數(shù)的正數(shù)前加正號(+)0輸出數(shù)值時,指定在左邊不使用的空位置自動填0#在八進制和十六進制數(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ù)時,float類型的參數(shù)是先轉(zhuǎn)化為double類型再傳遞的,所以%f可以輸出float和double兩種類型的數(shù)據(jù),不必用%lf輸出double類型的數(shù)據(jù)。
2.scanf函數(shù)
格式:scanf(格式控制字串,地址表列);功能:從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)輸入若干個任意類型的數(shù)據(jù)。例如:scanf(
"%d
,
%f”,&a,&b
);地址表列格式控制字串分隔符號
表3-3
printf函數(shù)的格式轉(zhuǎn)換說明符
字元含義d或i輸入十進位整數(shù)u輸入無符號十進位整數(shù)o輸入八進制整數(shù)x輸入十六進制整數(shù)c輸入一個字元,空白字元(包括空格、回車、跳位字元)也作為有效字元輸入s輸入字串,遇到第一個空白字元(包括空格、回車、跳位字元)時結(jié)束f或e輸入實數(shù),以小數(shù)或指數(shù)形式輸入均可%輸入一個%地址表列是由若干變數(shù)的地址組成的列表,參數(shù)之間用逗號隔開。函數(shù)scanf要求必須指定用來接收數(shù)據(jù)的地址,否則,雖然編譯程序不會出錯,但會導(dǎo)致數(shù)據(jù)不能正確地讀入指定的記憶體單元。對普通變數(shù)而言,可以在變數(shù)前使用“&”符號,用於取變數(shù)的地址,而對於指針變數(shù)而言,直接使用指針變數(shù)名稱即可。表3-4
scanf函數(shù)的修飾符修飾字元含義英文字母l修飾d,i,u,o,x時,用於輸入long型數(shù)據(jù)修飾f,e時,用於輸入double型數(shù)據(jù)英文字母h修飾d,i,o,x時,用於輸入short型數(shù)據(jù)域?qū)抦指定輸入數(shù)據(jù)的寬度(列數(shù)),系統(tǒng)自動按此寬度截取所需數(shù)據(jù)忽略輸入修飾符*抑制符,表示對應(yīng)的輸入項在讀入後不賦給相應(yīng)的變數(shù)注:scanf函數(shù)沒有精度.n修飾符,即用scanf函數(shù)輸入實型數(shù)據(jù)時不能規(guī)定精度。輸入數(shù)據(jù)的分隔符號的指定:①一般以空格、TAB或回車符作為分隔符號(在格式控制符之間為空格、TAB或無任何符號時);②其他字元作為分隔符號:格式控制字串中兩個格式控制符之間的字元為上述三種字元以外的字元時,輸入數(shù)據(jù)時要原樣輸入。例如,輸入語句“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);}程式運行時的輸入輸出結(jié)果注意①從鍵盤輸入數(shù)據(jù)的個數(shù)應(yīng)該與函數(shù)中輸入表列的項數(shù)相同,當(dāng)兩者不相同時作如下處理:如果輸入數(shù)據(jù)個數(shù)少於scanf函數(shù)要求的個數(shù)時,函數(shù)將等待輸入,直到滿足要求或遇到非法字元為止。如果輸入數(shù)據(jù)個數(shù)多於scanf函數(shù)要求的個數(shù)時,多餘的數(shù)據(jù)將留在緩衝區(qū)作為下一次輸入操作的輸入數(shù)據(jù)。②在輸入數(shù)據(jù)時,遇到以下情況時認(rèn)為該數(shù)據(jù)結(jié)束。遇到空格,或按回車鍵或按TAB鍵;按指定的寬度結(jié)束,如“%3d”,只取3列;遇到非法輸入。
3.4順序程式控制結(jié)構(gòu)
順序結(jié)構(gòu)是結(jié)構(gòu)化程式設(shè)計的三種基本結(jié)構(gòu)中最簡單的一種程式組織結(jié)構(gòu),其特點是完全按照語句出現(xiàn)的先後順序依次執(zhí)行。BAAB(a)傳統(tǒng)流程圖
(b)NS流程圖程式自上而下執(zhí)行,先執(zhí)行A塊,再執(zhí)行B塊。順序結(jié)構(gòu)的程式主要由4部分組成:①變數(shù)說明部分。②數(shù)據(jù)輸入部分。③運算部分。④運算結(jié)果輸出部分。例3.6將任意小寫字母轉(zhuǎn)換為對應(yīng)的大寫字母並輸出。#include<stdio.h>main(){ charc;
c=getchar(); c=c-32; putchar(c);}程式運行時,若輸入:h↙則輸出:H思考:如何判斷輸入的字元是否為小寫字母?(將在3.5中講解)例3.7從鍵盤輸入兩個變數(shù)的值,交換這兩個變數(shù)的值,並輸出。分析:假如我們將輸入的兩個變數(shù)定義為x和y,如果通過“x=y;y=x;”來實現(xiàn)交換,則當(dāng)執(zhí)行“x=y;”時,將y的值複製給x,此時x和y的值相等,x原來的值丟失,再執(zhí)行“y=x;”時,將新的x值複製給y,結(jié)果x和y的值相等,都為原來y的值。為了不使x原來的值丟失,必須在執(zhí)行“x=y;”之前,先把x的值放到一個臨時變數(shù)(temp)中保存起來,在執(zhí)行了“x=y;後”,再把保存在臨時變數(shù)中的值賦給y(通過“y=temp;”來實現(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ù)得到交換呢?例3.8從鍵盤任意輸入一個三位數(shù),要求輸出這個數(shù)的逆序數(shù)。如:輸入123,輸出321。分析:要輸出逆序數(shù),則要將原數(shù)的個位、十位和百位數(shù)分離出來,再用“個位*100+十位*10+百位”求出逆序數(shù)。個位數(shù)字可用對10求餘得到,如123%10=3;最高位百位數(shù)字可用對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:");/*提示用戶輸入一個整數(shù)*/ scanf("%d",&x);/*輸入一個整數(shù)*/ b0=x%10;/*求最低位*/
b1=(x/10)%10;/*求中間位*/ b2=x/100;/*求最高位*/ y=b0*100+b1*10+b2;/*求逆序數(shù)*/ printf("y=%d\n",y);/*輸出逆序數(shù)*/}程式的運行結(jié)果如下:Pleaseenteranintegerx:123↙y=321思考:是否還有其他方法分離個位、十位和百位數(shù)?
3.5選擇程式控制結(jié)構(gòu)
對於要先做判斷再選擇的問題就要使用選擇結(jié)構(gòu)(也稱為分支結(jié)構(gòu))。選擇結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。如:在數(shù)學(xué)中,要計算x的絕對值,根據(jù)絕對值定義,當(dāng)x>=0時,其絕對值為x,而x<0時其絕對值是為-x。選擇結(jié)構(gòu)分支條件通常用關(guān)係運算式或邏輯運算式來表示,實現(xiàn)程式流程的語句由C語言的if語句或switch語句來完成圖3-8選擇結(jié)構(gòu)流程圖圖3-8表示,當(dāng)條件P為真(成立)時執(zhí)行A框,否則執(zhí)行B框。無論P是否成立,只能執(zhí)行A框或B框之一,不可能既執(zhí)行A框又執(zhí)行B框。無論走哪條路徑,在執(zhí)行A框或B框之後,都脫離本選擇結(jié)構(gòu)。
3.5.1if語句
1.單分支結(jié)構(gòu)2.雙分支結(jié)構(gòu)3.多分支結(jié)構(gòu)1.單分支結(jié)構(gòu)if形式:
if(運算式)語句S圖3-9單分支結(jié)構(gòu)的流程圖執(zhí)行過程:系統(tǒng)首先計算運算式的值,如果運算式結(jié)果不為0,則執(zhí)行語句S,否則跳過語句S,繼續(xù)執(zhí)行其後的其他語句。說明:①“if”是C語言的關(guān)鍵字;“運算式”可以任意合法的C語言運算式,可以是關(guān)係運算式或邏輯運算式,也可以是任意的數(shù)值類型(包括整型、實型、字元型等);運算式兩側(cè)的括弧不能省略。②語句S可以是一條語句,也可以是任意合法的複合語句,其位置比較靈活,可以直接出現(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四個變數(shù)的同時進行了初始化。接下來第一個if語句的運算式a<b為假(0),if其後的語句“t=a;”不執(zhí)行,值得注意的是“a=b;b=t;”不屬於if的語句,將被執(zhí)行,執(zhí)行後a值為3,b值為0;然後第二個if語句的運算式a<c為真,則執(zhí)行語句“t=a;”,t值變?yōu)?,接著執(zhí)行“a=c;”,a值變?yōu)?,再接著執(zhí)行“c=t;”,c值變?yōu)?;因此,輸出結(jié)果為:503。例3.10計算並輸出一個整數(shù)的絕對值。分析:計算一個整數(shù)的絕對值的關(guān)鍵就是判斷該數(shù)是否小於0。#include<stdio.h>main(){ intx,y; scanf("%d",&x);/*輸入一個整數(shù)*/ y=x;/*x大於等於0時,y=x*/
if(x<0)y=-x;/*若x<0成立,y=-x*/
printf("y=%d\n",y);}
2.雙分支結(jié)構(gòu)
if-else形式:
if(運算式)語句S1else語句S2圖3-10雙分支結(jié)構(gòu)的流程圖執(zhí)行過程:系統(tǒng)首先計算運算式的值,如果運算式結(jié)果不為0,則執(zhí)行語句S1,否則,執(zhí)行語句S2。選擇結(jié)構(gòu)執(zhí)行完成後繼續(xù)執(zhí)行其後的其他語句。例如:求兩個數(shù)中的較大值,可用下麵的語句:if(a>b)max=a;elsemax=b;將例3.10用雙分支結(jié)構(gòu)實現(xiàn),程式代碼如下:#include<stdio.h>main(){intx,y;scanf("%d",&x);
/*輸入一個整數(shù)*/if(x<0)y=-x;/*若x<0成立,y=-x,否則y=x*/elsey=x;
printf("y=%d\n",y);}例3.11從鍵盤讀入一個字元,以與原來不同的形式進行輸出。分析:該題的意圖是實現(xiàn)英文字元的輸入輸出,所謂與與原來不同的形式是指原來輸入的是小寫字母,則轉(zhuǎn)換為對應(yīng)的大寫字母並輸出;原來輸入的是大寫字母則轉(zhuǎn)換為對應(yīng)的小寫字母並輸出。程式實現(xiàn)的步驟是:①從鍵盤輸入一個英文字元;②判斷該英文字元的大小寫,並轉(zhuǎn)換成對應(yīng)的字母;③輸出轉(zhuǎn)換後的英文字元。該題的關(guān)鍵問題是怎樣將判斷字元的大小寫狀態(tài)和實現(xiàn)轉(zhuǎn)換。有兩種方式實現(xiàn):一種是根據(jù)ASCII碼進行判斷和轉(zhuǎn)換,小寫字母比對應(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)換為小寫。注意,使用這四個函數(shù)需要包含頭檔ctype.h。用第一種方式實現(xiàn)的程式如下:#include<stdio.h>main(){ charch; ch=getchar();/*從鍵盤輸入一個英文字元*/
if(ch>='a'&&ch<='z')
/*判斷ch是否為小寫字母*/
ch=ch-32;
/*ch為小寫字母,將其轉(zhuǎn)換為大寫*/
else
ch=ch+32;
/*ch為大寫字母,將其轉(zhuǎn)換為小寫*/ putchar(ch);
/*輸出ch*/}運行時,輸入:a↙輸出:A思考:用字符處理函數(shù)怎樣實現(xiàn)程式?
3.多分支結(jié)構(gòu)
if-else-if形式:if(運算式1)語句S1elseif(運算式2)語句S2…elseif(運算式n)語句Snelse語句Sn+1圖3-11雙分支結(jié)構(gòu)的流程圖執(zhí)行過程:if-else-if結(jié)構(gòu)實際上是由多個if-else結(jié)構(gòu)組合而成的,系統(tǒng)首先計算運算式1,其值為真(不為0)時,執(zhí)行語句S1;否則,計算運算式2,其值為真(不為0)時,執(zhí)行語句S2;…如果if後的所有運算式都不為真,則執(zhí)行語句Sn+1,並結(jié)束整個分支結(jié)構(gòu)。選擇結(jié)構(gòu)執(zhí)行完成後繼續(xù)執(zhí)行其後的其他語句。例3.12從鍵盤輸入x的值,並通過如下的數(shù)學(xué)關(guān)係式求出相應(yīng)的y值。分析:該題的意圖是根據(jù)輸入的x值,判斷x所屬的區(qū)間,求出y值並輸出。程式實現(xiàn)的步驟是:①從鍵盤輸入一個數(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);}注意:在表示相等條件時,必須用“==”,不能用“=”
例3.13根據(jù)輸入的成績等級列印出評語,等級與評語的對應(yīng)關(guān)係如下表:等級評語4Excellent3Good2Average1Poor0Failing分析:該題通過輸入成績的等級(0~4級),轉(zhuǎn)換為對應(yīng)的評語,是典型的多分支結(jié)構(gòu),可以用if-else-if結(jié)構(gòu)實現(xiàn)。具體實現(xiàn)步驟為:①輸入成績等級的數(shù)字;②對輸入的數(shù)字進行判斷,得到對應(yīng)的評語;③輸出結(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語句的嵌套
if語句的嵌套是指if或else子句中又包含一個或多個if語句。內(nèi)層的if語句既可以嵌套在if子句中,也可以嵌套在else子句中。內(nèi)嵌if語句的一般形式如下:if(運算式1)
if(運算式2)語句1
else語句2else
if(運算式3)語句3
else語句4嵌套的if語句的幾種變化形式①只在if子句中嵌套if語句,形式如下:if(運算式1)
if(運算式2)語句1else語句2else語句3②只在else子句中嵌套if語句,形式如下:if(運算式1)
語句1elseif(運算式2)語句2else語句3③不斷在else子句中嵌套if語句形成多層嵌套,形式如下:if(運算式1)語句3
語句1…elseif(運算式n-1)if(運算式2)語句n-1
語句2elseelse
語句nif(運算式3)
可以用if-else-if語句形式表示,看起來層次比較分明。
if(運算式1)…語句1…elseif(運算式2)elseif(運算式n-1)
語句2語句n-1elseif(運算式3)else
語句3語句n例3.14從鍵盤輸入三個正整數(shù),找出其中的最大數(shù),並輸出這個數(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的配對關(guān)係。內(nèi)嵌結(jié)構(gòu)中,else總是與它上面最近的、未配對的if配對,組成一對if-else語句。②如果if與else的數(shù)目不一樣,為了避免在if與else配對時出錯,建議讀者使用“{}”來限定內(nèi)嵌if語句的範(fàn)圍。如下形式的嵌套語句:if(運算式1){if(運算式2)語句1}else語句2這裏,“{}”限定了內(nèi)嵌if語句的範(fàn)圍,因此else與第一個if配對。思考:如果沒有“{}”,else與哪個if配對?例3.15設(shè)變數(shù)a、b、c、d和y都已正確定義並賦值。若有以下if語句
if(a<b)if(c==d)y=0;elsey=1;該語句所表示的含義是()。A)B)C)D)
3.5.2switch語句
當(dāng)問題的分支較多(一般大於3個),用if-else-if結(jié)構(gòu)解決時由於分支過多,結(jié)構(gòu)冗長,程式邏輯關(guān)係不清晰,通常使用開關(guān)語句(switch語句)來簡化程式設(shè)計。開關(guān)語句就像多路開關(guān)一樣,使程式控制流程形成多個分支,根據(jù)一個運算式可能產(chǎn)生的不同結(jié)果值,選擇其中的一個或幾個分支語句去執(zhí)行。因此,它常用於各種分類統(tǒng)計、菜單等程式設(shè)計。switch語句的一般形式switch(運算式){case常量運算式1:語句1;break;case常量運算式2:語句2;break;…case常量運算式n:語句n;break;default:語句n+1;break;}switch結(jié)構(gòu)流程圖執(zhí)行過程:①計算switch後圓括號內(nèi)運算式的值,然後用該值逐個與case後的常量運算式值進行比較。當(dāng)找到相匹配的值時,就執(zhí)行該case後面的語句。若所有case中的常量運算式的值都沒有與運算式的值匹配的,就執(zhí)行default後面的語句。②執(zhí)行完一個case後面的語句後,如果遇到break語句,則跳出switch語句;如果沒有break語句,程式轉(zhuǎn)到下一個case處繼續(xù)執(zhí)行,並不再進行判斷。說明:①switch、case、default、break均是關(guān)鍵字。上述格式中花括弧括起來的部分稱為switch語句體。switch語句體中可以沒有break語句和default部分。②switch後的運算式可以是整型或字元型,不能為實型。每一個case後面的常量運算式的值必須互不相同,常量運算式中不能有變數(shù)。③default最多只有一個,位置任意。各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。④多個case可以共用一組執(zhí)行語句。例3.16若有定義:floatx=1.5;inta=1,b=3,c=2;則正確的switch語句是()。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語句實現(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;
}}思考:如果每個case語句之後沒有break語句,程式運行的輸出結(jié)果有何變化?3.5.3案例研究:個人所得稅計算例3.18依法納稅是每個公民應(yīng)盡的義務(wù),我國於1980年9月頒佈施行個人所得稅法,開始徵收個人所得稅,同時確定了個稅800元的起征點。25年來,我國職工工資收入和居民消費價格指數(shù)都有較大提高,加之近年教育、住房、醫(yī)療等改革的深入,消費支出明顯增長,早已超過了個人
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 樹師德?lián)P師風(fēng)培訓(xùn)
- 2024-2025學(xué)年山西省太原市高一下學(xué)期期末學(xué)業(yè)診斷歷史試題(解析版)
- 2024-2025學(xué)年山東省臨沂市高一下學(xué)期期末學(xué)科素養(yǎng)水平檢測考試歷史試題(解析版)
- 2026年旅游目的地營銷策略題
- 河北省獻血條例培訓(xùn)課件
- 心理咨詢知識
- 小學(xué)生筷子題目集及答案
- 心理健康知識分享
- 預(yù)應(yīng)力混凝土施工技術(shù)方案
- 橋梁施工期間的勞務(wù)合同管理方案
- 2025年體育行業(yè)專家聘用合同范本
- 對于尼龍件用水煮的原因分析
- ECMO患者血糖控制與胰島素泵管理方案
- 消防安全操作規(guī)程操作規(guī)程
- 國家電投秋招面試題及答案
- 心臟驟停病人的護理
- 阿爾茨海默癥醫(yī)療護理查房
- 產(chǎn)權(quán)無償劃轉(zhuǎn)協(xié)議書
- WJ30059-2023軍工燃燒爆炸品工程設(shè)計安全規(guī)范
- 索尼相機DSC-WX350中文使用說明書
- 從2025上半年宏觀經(jīng)濟及酒類景氣指數(shù)看酒類發(fā)展趨勢報告
評論
0/150
提交評論