C語言程序設(shè)計活頁式教程 課件 02存儲不同類型的數(shù)據(jù)_第1頁
C語言程序設(shè)計活頁式教程 課件 02存儲不同類型的數(shù)據(jù)_第2頁
C語言程序設(shè)計活頁式教程 課件 02存儲不同類型的數(shù)據(jù)_第3頁
C語言程序設(shè)計活頁式教程 課件 02存儲不同類型的數(shù)據(jù)_第4頁
C語言程序設(shè)計活頁式教程 課件 02存儲不同類型的數(shù)據(jù)_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計活頁式教程項目二:存儲不同類型的數(shù)據(jù)項目任務(wù)知識目標學(xué)習目標任務(wù)1:用5個變量存儲學(xué)生信息任務(wù)2:用運算符統(tǒng)計成績?nèi)蝿?wù)3:輸入和輸出任務(wù)4:用結(jié)構(gòu)體變量存儲學(xué)生信息任務(wù)5:認識指針、枚舉、共用體和空類型(1)了解信息在計算機內(nèi)的存儲形式。(2)了解標識符的意義和命名規(guī)則。(3)掌握常見的數(shù)據(jù)類型。(4)掌握常量和變量的定義和使用。(5)能夠選擇合適的數(shù)據(jù)類型變量,來存儲相關(guān)數(shù)據(jù)。任務(wù)準備任務(wù)實施任務(wù)描述任務(wù)1用5個變量存儲學(xué)生信息任務(wù)描述本任務(wù)要求定義5個變量存儲學(xué)生的學(xué)號、姓名、性別、年齡、身高信息。要完成本任務(wù),必須了解C語言中的變量、常量、數(shù)據(jù)類型等概念,因此,本任務(wù)將花大量篇幅講解標識符、變量、常量、數(shù)據(jù)類型、運算符等基礎(chǔ)知識,讓學(xué)生初步具備用C語言操作常見數(shù)據(jù)的能力。任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)準備1.標識符標識符是指用來標識某個實體(如變量名、常量名、函數(shù)名、數(shù)組名、數(shù)據(jù)類型名等)的一個符號。標識符的命名規(guī)則如下:(1)標識符只能由英文字母、數(shù)字和下劃線組成,并且不能以數(shù)字開頭。(2)標識符是區(qū)分大小寫的,如XYZ與xyz、Xyz、xYZ是不同標識符。(3)自定義標識符不能使用系統(tǒng)的關(guān)鍵字。(4)標識符的長度是任意的,不同編譯器要求不同。(5)標識符命名應(yīng)該做到“見名知意”,最好用英文字母命名,切忌用中文命名。書寫有大小寫混排(如getAge)、小寫加下劃線(如get_age)等風格。任務(wù)準備關(guān)鍵字又稱保留字,是指被C語言編譯器所預(yù)定義的、具有特殊含義的標識符。這些關(guān)鍵字不能用作變量名、函數(shù)名或其他標識符的名稱。下表是C語言中的全部32個關(guān)鍵字:autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile表2-1C語言的關(guān)鍵字任務(wù)準備2.數(shù)據(jù)類型C語言程序中的變量、常量、函數(shù)都需要指定數(shù)據(jù)類型。不同類型的數(shù)據(jù)在數(shù)據(jù)的存儲形式、取值范圍、占用內(nèi)存大小及可參與的運算種類等方面都有所不同。C語言提供的數(shù)據(jù)類型分類如圖2-1所示,主要有四種數(shù)據(jù)類型:基本類型、構(gòu)造類型、指針類型和空類型。任務(wù)準備基本類型是不可再分的數(shù)據(jù)類型,包括整型、浮點型、字符型?;绢愋偷某A炕蜃兞客ǔ4韱蝹€數(shù)據(jù)。構(gòu)造類型是由已知的基本類型通過一定的構(gòu)造方法構(gòu)造出來的類型,包括數(shù)組類型、結(jié)構(gòu)體類型、枚舉類型、共用體類型等。構(gòu)造類型的常量或變量通常代表一批數(shù)據(jù)。指針類型實際上是地址類型,指針類型的數(shù)據(jù)就是內(nèi)存中某個存儲單元的地址。指針類型用于構(gòu)造更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如鏈表、樹等??疹愋痛頍o類型,意味著該數(shù)據(jù)類型不包含任何可用值。它通常用于表示不返回值的函數(shù)、不指向任何地址的指針變量以及一些特殊的應(yīng)用場景。任務(wù)準備(1)字符型字符型數(shù)據(jù)描述單個字符,它的類型名是char。字符型常量是用一對單引號括起來的字符,如'a'、'A'、'+'、'$'、'?'、'\n'都是合法的字符常量。在C語言中,字符型數(shù)據(jù)有以下特點:①字符常量是用單引號括起來的單個字符或轉(zhuǎn)義字符,用雙引號括起來的零個或多個字符是字符串常量。②每個字符數(shù)據(jù)在內(nèi)存中占用1個字節(jié),用于存儲它的ASCII碼值。③字符數(shù)據(jù)具有數(shù)值特征,可以像整數(shù)一樣參加運算,此時相當于對它的ASCII碼值進行運算。④字符'9'與整數(shù)9是不同的,字符'9'的ASCII碼值是57。'9'-9的值是48,'9'-'0'的值是9。⑤小寫字母的ASCII碼值比大寫字母的ASCII碼值大32,字符'a'的ASCII碼值是97,字符'A'的ASCII碼值是65,'a'-'A'的值是32,'z'-'a'的值是25。⑥轉(zhuǎn)義字符用于表示控制符(如回車、換行等)和不可見字符,以'\'開頭,后面跟一個字符或用八進制數(shù)、十六進制數(shù)表示的ASCII碼值。'\'的作用是改變后面的字符或ASCII碼值的原有意義,轉(zhuǎn)義為另外的含義。任務(wù)準備常用轉(zhuǎn)義字符及其含義如表2-2所示。字符含義字符含義'\n'換行'\a'響鈴報警'\r'回車(指來到行首位置)'\"'一個雙引號'\0'空字符,用作字符串結(jié)束標志'\''單引號'\t'水平制表符'\\'一個反斜杠'\v'垂直制表符'\?'問號'\b'退格'\f'走紙換頁'\ddd'1~3位八進制ASCII碼值所代表的字符'\xhh'1~2位十六進制ASCII碼值所代表的字符表2-2常見轉(zhuǎn)義字符任務(wù)準備(2)整型整型類型用于描述整數(shù)。在C語言中,整型又可分為短整型、整型、長整型、無符號短整型、無符號整型和無符號長整型六種,其中整型最常用。C語言標準沒有規(guī)定各類整型數(shù)據(jù)所占內(nèi)存的字節(jié)數(shù),各種類型的數(shù)據(jù)所占內(nèi)存的大小隨編譯系統(tǒng)的不同而有差異,可以使用sizeof運算符計算某種數(shù)據(jù)類型占用內(nèi)存的大小。在devcpp環(huán)境下,各種整型的關(guān)鍵字、占用內(nèi)存字節(jié)數(shù)和取值范圍如表2-3所示。整型常量即整數(shù),包括正整數(shù)、零和負整數(shù)。在C語言中,整型常量可以用十進制、八進制和十六進制數(shù)表示。十進制數(shù)由數(shù)字0~9和正負號組成,如255、-864等。十進制數(shù)的特點是“逢十進一”。八進制數(shù)以數(shù)字0為前綴,由數(shù)字0~7組成,如0173、045等。八進制數(shù)的特點是“逢八進一”。十六進制數(shù)以0X或0x為前綴,由數(shù)字0~9、A、B、C、D、E、F(字母大小寫均可,其中A~F分別代表10~15)組成,如0x45DE、0XA8C等。十六進制數(shù)的特點是“逢十六進一”。任務(wù)準備各種整型類型及其特點如表2-3所示。表2-3各種整型類型關(guān)鍵字類型占字節(jié)數(shù)取值范圍shortint短整型2-32768~32767(-215~215-1)int整型4-2147483648~2147483647(-231~231-1)long長整型4-2147483648~2147483647(-231~231-1)unsignedshort無符號短整型20~65535(0~216-1)unsignedint無符號整型40~4294967295(0~232-1)unsignedlong無符號長整型40~4294967295(0~232-1)任務(wù)準備(3)浮點型浮點型也稱為實型,是一種用于表示帶有小數(shù)部分數(shù)值的數(shù)據(jù)類型,它可以存儲非整數(shù)的數(shù)值,包括小數(shù)形式、指數(shù)形式的數(shù)值等。小數(shù)形式的浮點型數(shù)據(jù)由整數(shù)部分、小數(shù)點和小數(shù)部分組成,如12.345、-0.23等。指數(shù)形式的浮點型數(shù)據(jù)由尾數(shù)部分、字母e或E、指數(shù)部分組成,如5.79e-4、3.14E+5分別表示5.79×10-4、3.14×105。常見的浮點型數(shù)據(jù)類型有單精度浮點型(float)和雙精度浮點型(double)。單精度浮點型使用4個字節(jié)共32位存儲,可以表示約7位有效數(shù)字的數(shù)值,取值范圍是-3.4e-38~3.4e+38。雙精度浮點型使用8個字節(jié)共64位存儲,可以表示約16位有效數(shù)字的數(shù)值,取值范圍是-1.7e-308~1.7e+308。在C語言中,浮點型常量默認是double型,如果要使用float型常量,請在數(shù)值后面加字母f或F,如12.345f、-0.23F等。與整型表示一個準確的數(shù)值不同,浮點型數(shù)值在計算機上是近似表示的,單精度浮點型的近似程度比較低,而雙精度型的近似得度比較高。任務(wù)準備浮點型數(shù)據(jù)在計算機編程中廣泛應(yīng)用于需要處理小數(shù)的場景,例如科學(xué)計算、金融計算、圖形處理等。由于浮點數(shù)的存儲方式和精度限制,它們可能存在一些精度損失和舍入誤差的問題。在進行浮點數(shù)計算時,需要注意避免由于精度問題導(dǎo)致的計算錯誤。單精度浮點型與雙精度浮點型的區(qū)別如表2-4所示。表2-4常見浮點型關(guān)鍵字類型占字節(jié)數(shù)取值范圍常量舉例float單精度浮點型4-3.4×10-38~3.4×103812.345f-1.7e4Fdouble雙精度浮點型8-1.7×10-308~1.7×1030812.3455.79e-4任務(wù)準備(4)數(shù)組類型數(shù)組類型是一種構(gòu)造類型,數(shù)組是相同類型數(shù)據(jù)的有序集合,數(shù)據(jù)類型可以是整型、浮點型、字符型這樣的基礎(chǔ)類型,也可以是結(jié)構(gòu)體、指針等復(fù)雜類型。數(shù)組中的每個數(shù)據(jù)我們稱之為“元素”,數(shù)組元素在內(nèi)存中是連續(xù)存儲的。一維數(shù)組的定義形式為:

數(shù)據(jù)類型數(shù)組名[數(shù)組長度];在定義數(shù)組時給數(shù)組元素集體賦值,稱為數(shù)組的初始化。數(shù)組的初始化只能在定義數(shù)組時進行,之后只能給單個元素賦值。一維數(shù)組初始化的形式如下:

數(shù)據(jù)類型數(shù)組名[數(shù)組長度]={初值表};任務(wù)準備常見類型的數(shù)組定義和初始化如下:inta[10];intb[10]={0,1,2,3,4,5,6,7,8,9};doublec[6]={1.23,0.5,-4.3,5.55,3.14,6.3};charch1[5]={'a','b','c','d','e'};charch2[10]="abcde";/*直接用字符串常量給字符數(shù)組賦初值*/charch3[]="abcde";上述數(shù)組代碼中,int、double、char都是基礎(chǔ)類型,[]是數(shù)組的標志,a、b、c、ch1、ch2、ch3都是數(shù)組的名稱。數(shù)組a是能存儲10個整型數(shù)據(jù)的數(shù)組,但這10個整型數(shù)據(jù)是隨機值;數(shù)組b能存儲10個整型數(shù)據(jù),它們分別是0~9;數(shù)組c能存儲6個雙精度浮點型數(shù)據(jù),它們分別是1.23、0.5、-4.3、5.55、3.14、6.3;數(shù)組ch1能存儲5個字符,它們分別是a、b、c、d、e;數(shù)組ch2能存儲10個字符,它可以在定義時用字符串常量"abcde"賦初值,并自動在末尾添加'\0'作為字符串的結(jié)束標志,因此ch2還有4個元素沒有賦值;數(shù)組ch3沒有給出能存儲的字符個數(shù),它的存儲空間大小由初始值"abcde"來決定。一般用字符數(shù)組來存儲字符串,而且要求該字符數(shù)組的空間足夠大。本任務(wù)中學(xué)生的學(xué)號、姓名就是字符串,用字符數(shù)組來存儲。任務(wù)準備3.常量在C語言中有三種形式的常量,它們分別是直接常量、符號常量和const常量。(1)直接常量直接常量又分字符型常量、整型常量、浮點型常量和字符串常量。字符型常量是用單引號括起來的單個字符或轉(zhuǎn)義字符,可以是'a'、'A'、'+'、'$'、'?'、'\n'等。整型常量可以是十進制整數(shù)255、-864,也可以是八進制整數(shù)0173、045,還可以是十六進制整數(shù)0x45DE、0XA8C。浮點型常量可以是單精度浮點數(shù)12.345f、-0.23f、-1.7e4F,也可以是雙精度浮點數(shù)12.345、-3.14、5.79e-4。因為浮點數(shù)默認是雙精度浮點型,所以單精度浮點數(shù)后面要加f或F來區(qū)分。字符串常量是用雙引號括起來在的零個或多個字符,如""、"abcde"都是字符串常量,它們存儲在內(nèi)存中時會自動在末尾添加'\0'作為結(jié)束標志。通常用字符數(shù)組來存儲字符串常量,因此,可以像訪問數(shù)組元素一樣訪問字符串中的每一個字符。需要注意的是,在C語言中只有字符串常量,沒有字符串變量。任務(wù)準備(2)符號常量符號常量也稱宏常量,是指用一個標識符代表一個常量,這時該標識符與常量等價。符號常量在使用之前必須先定義,一般形式為:#define標識符常量值其中,“#define”是C語言的一個預(yù)處理指令,“define”為宏定義命令,“標識符”為所定義的宏名,三個組成部分均用空格隔開。#define的作用類似于替換,用“標識符”替換“常量值”。例如:#definePRICE20#definePI3.14159#definePI23.14159;上述代碼中,符號常量PRICE的值是20,程序中該命令之后出現(xiàn)的所有標識符PRICE均用20代替。符號常量PI的值是“3.14159”,而符號常量PI2的值卻是“3.14159;”,因此,除非特殊需要,符號常量的值一般不出現(xiàn)分號。任務(wù)準備(3)const常量const是C語言的關(guān)鍵字,用const修飾的標識符為常量。const常量只能在定義時賦初值,在程序中只能讀取它的值,不能修改。const常量的定義形式為:

const數(shù)據(jù)類型常量名=常量值;例如:constdoublePI=3.14159;constintLEN=25;在之后的程序代碼中,無法修改常量PI和LEN的值,只能讀取。當程序中多次用到某個常量值,后續(xù)修改時需要修改很多處代碼,這時就可以考慮將該常量值定義成const常量或符號常量。const常量與#define定義的符號常量也有區(qū)別:const常量有數(shù)據(jù)類型,會對常量值的類型進行檢查,還可以對const常量進行調(diào)試;而符號常量只進行字符串替換,不進行類型檢查,且不能對符號常量進行調(diào)試。任務(wù)準備3.變量變量是指在程序運行期間其值可以發(fā)生變化的量。變量用于從外部接數(shù)據(jù)、保存一些不斷變化的值、保存中間結(jié)果及最終結(jié)果,而這些都無法用常量來實現(xiàn)。一個變量應(yīng)該有一個名字即變量名,在內(nèi)存中占據(jù)一定的存儲單元,在該存儲單元中存放變量的值。程序在編譯時由系統(tǒng)給變量分配一定的內(nèi)存空間,程序中對變量進行處理時,實際上是通過變量名找到相應(yīng)的內(nèi)存空間,讀取或修改其中的數(shù)據(jù),也就是變量的值。在C語言中,變量必須遵循“先定義后使用”的原則,即每個變量在使用之前都要先定義,在定義時指明該變量的數(shù)據(jù)類型。變量定義語句有如下幾種形式:數(shù)據(jù)類型變量名;數(shù)據(jù)類型變量名=初始值;數(shù)據(jù)類型變量名1,變量名2,…,變量名n;數(shù)據(jù)類型變量名1,變量名2=初始值2,…,變量名n;定義單個變量時,要給出數(shù)據(jù)類型和變量名,中間用逗號隔開;在定義變量時可以賦初值,在變量名后面用等號連接初始值;多個同類型的變量可以一起定義,變量名中間用逗號隔開;多個同類型的變量一起定義時,也可以給部分變量名賦初值。任務(wù)準備【實例1】定義一個char變量、int變量、float變量、double變量和char數(shù)組并賦初值,然后輸出到屏幕。#include<stdio.h>intmain(){ charch1='\n',ch2='A'; intx=100; floatf=1.78F; doubled=3.14; charname[20]="zhangsan"; printf("ch1=%c,ch2=%c,x=%d,f=%f,d=%lf,name=%s",ch1,ch2,x,f,d,name); return1;}編譯運行結(jié)果如圖2-2所示:圖2-2實例1運行結(jié)果任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)實施【任務(wù)1】用5個變量存儲學(xué)生信息:學(xué)號10001、姓名zhangsan、性別m或f、年齡19、身高1.75,然后輸出學(xué)生信息。1.任務(wù)分析本任務(wù)考查不同類型數(shù)據(jù)的存儲、變量的定義和輸出。學(xué)生的學(xué)號、姓名、性別、年齡和身高數(shù)據(jù),分別對應(yīng)C語言中不同數(shù)據(jù)類型,因此本任務(wù)首先要確定學(xué)生信息所對應(yīng)的類型。任務(wù)實施學(xué)生的學(xué)號、姓名的值是字符串常量,用字符數(shù)組存儲,并且要求字符數(shù)組的容量足夠大。初學(xué)者很容易將由數(shù)字組成的數(shù)據(jù)都歸為整數(shù)類型或浮點數(shù)類型,而實際上學(xué)號、身份證號、電話號碼、準考證號等都由數(shù)字組成,但它們并不代表大小,也不參與算術(shù)運算,這些數(shù)字只是組成一定意義的字符串。因此,在編程中常用字符數(shù)組來存儲表示學(xué)號、身份證號、電話號碼、準考證號的字符串常量。一些號碼如果用整型變量存儲會引起歧義甚至導(dǎo)致編譯錯誤,如果準考證號“0004321”被賦值給整型變量,它會被編譯系統(tǒng)認為是一個八進制整數(shù),與字符串“0004321”完全不同。學(xué)生的性別用char類型變量來存儲,值只能是字符“M”或“F”,分別表示Male(男性的)和Female(女性的)。在C語言中,char類型數(shù)據(jù)占1個字節(jié),而漢字“男”占2個字節(jié),因此性別的值不能是漢字“男”或“女”。但在Java語言中,char類型占2個字節(jié),可以存儲一個漢字。學(xué)生的年齡用int型變量存儲,身高用浮點型變量存儲,單精度或雙精度均可。任務(wù)實施2.任務(wù)實現(xiàn)本任務(wù)的實現(xiàn)代碼如下,請將代碼中定義變量的類型補充完整。#include<stdio.h>intmain(){

xh[20]="10001"; /*學(xué)號不超過20個字符*/

xm[50]="zhangsan"; /*姓名不超過50個字符*/

xb='m'; /*性別是一個字符,用單引號*/

nl=19; /*年齡*/

sg=1.75f; /*身高*/ printf("學(xué)號:%s,姓名:%s,性別:%c,年齡:%d,身高:%.2f\n",xh,xm,xb,nl,sg); return100;}編譯運行的結(jié)果如圖2-3所示:圖2-3輸出學(xué)生信息任務(wù)實施3.任務(wù)總結(jié)本任務(wù)要求學(xué)號不超過20個字符,姓名不起過50個字符。用庫函數(shù)printf()輸出時,格式字符串(即第1個參數(shù))中的%s、%s、%c、%d、%.2f分別對應(yīng)字符數(shù)組xh、字符數(shù)組xm、字符變量xb、整型變量nl、單精度浮點型變量sg的值,其中%.2f表示輸出的浮點型數(shù)據(jù)精確到小數(shù)點后兩位。任務(wù)準備任務(wù)實施任務(wù)描述任務(wù)2:用運算符統(tǒng)計成績?nèi)蝿?wù)描述本任務(wù)要求用數(shù)組存儲某學(xué)生的語文、數(shù)學(xué)、英語、物理、化學(xué)課程的成績,統(tǒng)計五門課程的平均分,并判斷平均分是否及格。完成本任務(wù)需要定義數(shù)組,掌握下標運算符、算術(shù)運算符、強制轉(zhuǎn)換運算符、條件運算符的使用。因此,本任務(wù)將講解算術(shù)運算符、關(guān)系運算符、邏輯運算符、賦值運算符、位運算符、條件運算符、逗號運算符、指針運算符、求字節(jié)數(shù)運算符、強制類型轉(zhuǎn)換運算符、分量運算符、下標運算符的基礎(chǔ)知識,讓學(xué)生初步具備用使用運算符操作數(shù)據(jù)的能力。任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)準備1.算術(shù)運算符算術(shù)運算符有+、-、*、/、%,它們分別對應(yīng)數(shù)學(xué)運算的加、減(或取反)、乘、除、取余,其中“-”即是減法運算符(雙目),也是取反運算符(單目)。兩個整數(shù)進行算術(shù)運算的結(jié)果仍是整數(shù),例如7+3得10,7-3得4,7*3得21,7/3得2,7%3得1。用算術(shù)運算符將操作數(shù)連接起來的式子,稱為算術(shù)表達式。在C語言中兩個整數(shù)相除的結(jié)果仍然是整數(shù),沒有小數(shù)部分。只有將某個操作數(shù)先變成小數(shù)再參與除法運算,才能得到小數(shù)的結(jié)果。因此,欲得到7/3的小數(shù)結(jié)果,可以采用7.0/3、1.0*7/3或(double)7/3運算,其中(double)7是將整數(shù)7強制轉(zhuǎn)換成雙精度浮點數(shù)7.0。參與取余運算(%)的兩個操作數(shù)必須是整數(shù),運算的結(jié)果是整除后所得的余數(shù)。例如7%3的結(jié)果是1,12%7的結(jié)果是5。任務(wù)準備各算術(shù)運算符中,-(取反)的優(yōu)先級最高,其次是*、/、%,最后是+、-(減法)。在同優(yōu)先級的算術(shù)運算符中,運算順序是從左向右。詳細說明如表2-5所示。表2-5算術(shù)運算符的優(yōu)先級和結(jié)合性運算符類型優(yōu)先級結(jié)合性備注-單目高

低從右向左計算取反*/%雙目從左向右計算乘除取余+-雙目從左向右計算加減任務(wù)準備【實例1】給定一個圓的半徑,求出該圓的面積,然后輸出到屏幕。#include<stdio.h>#definePI3.14159intmain(){ doubler=5,s; s=PI*r*r; printf("半徑為%lf的圓面積是:%lf\n",r,s); return1;}編譯運行結(jié)果如圖2-4所示:圖2-4求圓的面積任務(wù)準備2.關(guān)系運算符C語言提供了<、<=、>、>=、==、!=共6種關(guān)系運算符,它們分別對應(yīng)小于、小于等于、大于、大于等于、等于、不等于共6種關(guān)系。用關(guān)系運算符將操作數(shù)連接起來的式子,稱為關(guān)系表達式。例如a>b、m==0、x!=5、y<=10等都是關(guān)系表達式,它們大多用作判斷條件。關(guān)系表達式的結(jié)果是“真”或“假”,代表條件成立或不成立。在C語言中,用0表示“假”,用1表示“真”,任何非零值都能夠被系統(tǒng)解釋為“真”。關(guān)系表達式大多用在if語句、for語句和while語句中,例如:if(x>0){……} /*如果x>0成立,則執(zhí)行{}中的代碼*/for(i=0;i<10;i++){……} /*重復(fù)執(zhí)行{}中代碼的條件是i<10成立*/while(i<10){……} /*重復(fù)執(zhí)行{}中代碼的條件是i<10成立*/任務(wù)準備3.邏輯運算符邏輯運算也稱布爾運算,C語言提供了&&、||、!三種邏輯運算符,它們分別是邏輯與、邏輯或、邏輯非。用邏輯運算符將操作數(shù)連接起來的式子,稱為邏輯表達式。邏輯與運算連接兩個條件表達式,表達“并且”的含義。當兩個條件表達式都成立時,邏輯與表達式的結(jié)果為真(即成立);只要有一個條件表達式不成立,邏輯與表達式的結(jié)果為假(即不成立)。例如,數(shù)學(xué)式子0<x<100對應(yīng)的邏輯表達式是:(x>0)&&(x<100)由于>、<運算符的優(yōu)先級比&&運算符高,因此該邏輯表達式也可以寫成這樣:x>0&&x<100又如,判斷字符變量ch的值是不是小寫字母的邏輯表達式是:ch>='a'&&ch<='z'任務(wù)準備邏輯或運算連接兩個條件表達式,表達“或者”的含義。只要有一個條件表達式成立,邏輯或表達式的結(jié)果為真(即成立);當兩個條件表達式都不成立時,邏輯或表達式的結(jié)果為假(即不成立)。例如,表達x<0或者y>100的邏輯表達式是: x<0||y>100又如,判斷字符變量ch的值是不是字母(包含大寫字母和小寫字母)的邏輯表達式是: (ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')上述式子表達的是“ch是小寫字母或者ch是大寫字母”,因此||運算符兩側(cè)的小括號不能省略。再如判斷某一年year是否是閏年,必須滿足下列兩個條件之一:①年份能被4整除,但不能被100整除。②年份能被400整除。由于==、!=運算符的優(yōu)先級比&&、||運算符高,因此證明year是閏年的邏輯表達式可以寫成: (year%4==0&&year%100!=0)||year%400==0任務(wù)準備邏輯非運算是單目運算符,只需要一個操作數(shù)。所有單目運算符的優(yōu)先級都比其他運算符的優(yōu)先級高,因此,運算符!的優(yōu)先級最高,其次是&&,再次是||。例如,假設(shè)整型變量x=5,則!x得到0;假設(shè)整型變量y=0,則!y得到1。即對非零值進行邏輯非運算會得到0,對0進行邏輯非運算會得到1。邏輯非表達式常用在if語句中作條件,如if(!x)表達的是“如果x等于0”,與if(x==0)是同樣的意思;而if(x)表達的是“如果x不等于0”,與if(x!=0)是同樣的意思。任務(wù)準備4.賦值運算符賦值運算是指將一個數(shù)據(jù)賦給一個變量,賦值運算符用“=”表示。賦值運算的操作是有方向性的,它將等號右側(cè)表達式的值賦給左側(cè)的變量,等號左側(cè)不允許是表達式。由賦值運算符和操作數(shù)組成的表達式稱為賦值表達式,其一般形式為:變量名=表達式;例如,x=25是將常量25賦值給變量x;y=y+1是將變量y的值加1后,再賦值給變量y;而x+y=z則是錯誤的賦值表達式,因為等號左側(cè)不能是x+y這樣的表達式。由于賦值運算符比算術(shù)、關(guān)系、邏輯等運算符的優(yōu)先級都要低,所以賦值表達式會先執(zhí)行等號右側(cè)的運算,再將運算結(jié)果賦值給等號左側(cè)的變量。因此,x=y=z=a+25也是正確的賦值表達式的寫法。但在C語言中,“=”代表賦值,“==”代表比較是否相等,使用時要注意區(qū)分。任務(wù)準備C語言中還有一種特殊形式的賦值運算符,稱為復(fù)合賦值運算符。常見的復(fù)合賦值運算符有+=、-=、*=、/=和%=,它們表示將左側(cè)變量的值與右側(cè)表達式的值進行相應(yīng)的運算后,再賦值給左側(cè)的變量。例如,x+=5表示x=x+5;y/=a+3表示y=y/(a+3)。此外,增1運算符++和減1運算符--也暗含賦值操作。例如,x++和++x等價于賦值表達式x=x+1,x--和--x等價于賦值表達式x=x-1。但++x表示先將x加1,再進行其它操作,如y=++x表示先執(zhí)行x=x+1,再執(zhí)行y=x。而x++表示先執(zhí)行其它操作,再將x加1,如y=x++表示先執(zhí)行y=x,再執(zhí)行x=x+1。減1運算也是同樣的流程。假設(shè)有int型變量x的值為3,對它分別執(zhí)行增1運算和減1運算后賦值給int型變量y,x與y之間的關(guān)系如表2-6所示。關(guān)于增1和減1運算符,有些教材上會出現(xiàn)一些令人費解的寫法,如y=-x++、y=a+++b等。建議初學(xué)者不要寫類似的代碼,可以考慮將y=-x++寫成:y=-x;x++; /*或者x=x+1*/可以將y=a+++b寫成:y=a+b;a++;任務(wù)準備語句等價的語句執(zhí)行語句后的y值執(zhí)行語句后的x值y=x++;y=x;x=x+1;34y=++x;x=x+1;y=x;44y=x--;y=x;x=x-1;32y=--x;x=x-1;y=x;22表2-6增1和減1運算任務(wù)準備5.位運算符位運算是一種對二進制數(shù)進行操作的運算方法。C語言提供了豐富的位運算符號,可用于對二進制數(shù)進行各種運算。位運算只能用于整型變量和字符型變量,不能用于浮點型變量。C語言提供了六個位運算符號,分別是按位取反~、按位與&、按位或|、按位異或^、左移位<<、右移位>>。按位取反運算符“~”是單目運算符,其功能是對操作數(shù)的每個二進制位取反,即1變?yōu)?,0變?yōu)?。按位與運算符“&”是雙目運算符,其功能是參與運算的兩數(shù)各對應(yīng)的二進制位相與。對應(yīng)的兩個二進制位只要有一個為0時,結(jié)果位就會為0;只有對應(yīng)的兩個二進制位都為1時,結(jié)果位才為1。參與運算的兩個數(shù)均以補碼出現(xiàn)。按位或運算符“|”是雙目運算符,其功能是參與運算的兩數(shù)各對應(yīng)的二進制位相或。只要對應(yīng)的兩個二進制位有一個為1時,結(jié)果位就為1,其它情況結(jié)果位為0。當參與運算的是負數(shù)時,參與兩個數(shù)均以補碼出現(xiàn)。任務(wù)準備按位異或運算符“^”是雙目運算符,其功能是將參與運算的兩數(shù)各對應(yīng)的二進制位相異或。只要對應(yīng)的兩個二進制位不同,結(jié)果位就為1,相同則結(jié)果位為0。當參與運算的是負數(shù)時,參與兩個數(shù)均以補碼出現(xiàn)。按位左移運算符“<<”是雙目運算符,其功能將一個運算對象的各二進制位全部左移若干位,左邊的二進制位丟棄,右邊補0。每左移一位,相當于該數(shù)乘以2。例如,x<<n表示把x的每一位向左平移n位,右邊空位補0。按位右移運算符“>>”是雙目運算符,其功能將一個運算對象的各二進制位全部右移若干位,右邊的二進制位丟棄,正數(shù)左邊空位補0,負數(shù)左邊空位補1。每右移一位,相當于該數(shù)除以2。例如,x>>n表示把x的每一位向右平移n位,正數(shù)左邊補0,負數(shù)左邊補1。任務(wù)準備【實例2】給定兩個char類型的數(shù)據(jù),對它們進行六種位運算并輸出結(jié)果。intmain(){ unsignedchara=60; /*二進制:00111100*/ unsignedcharb=9; /*二進制:00001001*/ unsignedcharc=~a; /*二進制:11000011*/ unsignedchard=a<<1; /*二進制:01111000*/ unsignedchare=a>>1; /*二進制:00011110*/ unsignedcharf=a&b; /*二進制:00001000*/ unsignedcharg=a|b; /*二進制:00111101*/ unsignedcharh=a^b; /*二進制:00110101*/ printf("60按位取反:%d\n",c); printf("60左移1位:%d\n",d); printf("60右移1位:%d\n",e);圖2-5各種位運算的結(jié)果 printf("60與9按位與:%d\n",f); printf("60與9按位或:%d\n",g); printf("60與9按位異或:%d\n",h); return1;}任務(wù)準備6.條件運算符條件運算符是C語言中唯一的一個三目運算符,它用?和:將三個操作數(shù)分開。條件運算符的語法格式為:

表達式1?表達式2:表達式3表達式1為關(guān)系表達式,結(jié)果為真或假。如果表達式1為真,則返回表達式2的值,否則返回表達式3的值。在條件運算符中,表達式2和表達式3必須是同種數(shù)據(jù)類型,否則編譯器將會自動進行類型轉(zhuǎn)換。條件運算符通常用在賦值語句中,可以根據(jù)條件進行不同的賦值操作。條件運算符經(jīng)常作為if語句的簡捷形式來使用。例如,求兩個整數(shù)中的最大值,可以使用以下代碼:intx=32;inty=17;intz=(x>y)?x:y;如果x大于y,條件表達式“(x>y)?x:y”返回x的值,否則返回y的值。不管x與y的是怎樣的大小關(guān)系,該條件表達式都返回它們中的最大值。任務(wù)準備7.逗號運算符逗號運算符是指逗號“,”,它將多個表達式連接起來構(gòu)成逗號表達式,它的作用是實現(xiàn)對各個表達式的順序求值。逗號表達式的一般形式為:

表達式1,表達式2,…,表達式n逗號表達式先從左到右依次計算每個表達式的值,并把最后一個表達式的值作為整個逗號表達式的值。例如逗號表達式“x=2,y=3,z=x+y”,先計算x=2的值,再計算y=3的值,最后計算z=x+y的值,結(jié)果為5,則整個逗號表達式的值為5。再如表達式“y=(x=2,3*x)”中,括號內(nèi)的“x=2,3*x”就是一個逗號表達式,它先計算x=2的值,再計算3*x的值,得結(jié)果6,最后將6賦值給變量y。逗號表達式還用于for語句,用于同時對多個循環(huán)變量賦初值和修改多個循環(huán)變量。例如“for(i=0,j=10;i<j;i++,j--){}”中的“i=0,j=10”和“i++,j--”就是逗號表達式。但定義多個同類型變量的語句“intx,y,z”就不是逗號表達式。任務(wù)準備8.指針運算符指針就是地址,在C語言中有兩個關(guān)于指針的運算符:取地址運算符&和指針運算符*。&是取地址運算符,&x即是變量x在內(nèi)存中的實際地址。*是指針運算符,它返回其操作數(shù)(即一個指針)所指向的對象的值,*tp即是地址變量tp所指向的存儲單元中的數(shù)值。任務(wù)準備9.求字節(jié)數(shù)運算符sizeof是C語言的一種單目運算符,它返回操作數(shù)所占內(nèi)存的字節(jié)數(shù)。操作數(shù)可以是一個常量、變量、類型名、數(shù)組名等,操作數(shù)的存儲大小由操作數(shù)的類型決定。例如,如果x是int型變量,則sizeof(x)和sizeof(int)都返回4;sizeof(3.14)返回double類型數(shù)據(jù)所占的字節(jié)數(shù)8;如果有數(shù)組inta[10],則sizeof(a)返回40,因為數(shù)組a占據(jù)10個int型數(shù)據(jù)的空間。sizeof運算符多用在申請內(nèi)存空間時,計算存儲某類型數(shù)據(jù)所需要的字節(jié)數(shù)。任務(wù)準備10.強制類型轉(zhuǎn)換運算符類型轉(zhuǎn)換是指將一種數(shù)據(jù)類型的值轉(zhuǎn)換為另一種數(shù)據(jù)類型的過程。在C語言中,不同類型的數(shù)據(jù)在一起運算時,要先將這些數(shù)據(jù)轉(zhuǎn)換成相同的類型,再進行運算。通常類型轉(zhuǎn)換發(fā)生在字符型、整型和浮點型之間,分自動類型轉(zhuǎn)換和強制類型轉(zhuǎn)換。將不同類型的數(shù)據(jù)一起運算時,編譯系統(tǒng)會自動進行類型轉(zhuǎn)換,會把占用內(nèi)存空間少的類型向占用空間多的類型轉(zhuǎn)換,以保證運算結(jié)果的精度。當不同類型的數(shù)據(jù)在一起運算時,自動轉(zhuǎn)換的規(guī)則為:①float型數(shù)據(jù)自動轉(zhuǎn)換成double型;②char與short型數(shù)據(jù)自動轉(zhuǎn)換成int型;③int型數(shù)據(jù)自動轉(zhuǎn)換成double型;④int型數(shù)據(jù)自動轉(zhuǎn)換成unsigned型;⑤int型數(shù)據(jù)自動轉(zhuǎn)換成long型。任務(wù)準備強制類型轉(zhuǎn)換是將某種類型的數(shù)據(jù)強制轉(zhuǎn)換成指定的數(shù)據(jù)類型,強制類型轉(zhuǎn)換表達式的一般形式為:

(類型名)(表達式)強制類型轉(zhuǎn)換運算符形如“(類型名)”,其后跟一個表達式,作用是將該表達式的結(jié)果轉(zhuǎn)換成指定的數(shù)據(jù)類型。當表達式是一個變量或常量時,表達式不需要加小括號。將整型數(shù)據(jù)強制轉(zhuǎn)換為浮點型,數(shù)據(jù)的大小不變。如“(double)5”將得到double型數(shù)據(jù)5.000000,原先占4個字節(jié)的整數(shù)5變成了占8個字節(jié)的雙精度浮點型數(shù)5.000000。因此,當想讓兩個整數(shù)相除后得到小數(shù)結(jié)果時,可以考慮將其中一個整數(shù)強制轉(zhuǎn)換成浮點型,如“(double)5/3”或“5/(double)3”都能得出結(jié)果為1.666667。將浮點型數(shù)據(jù)強制轉(zhuǎn)換為整型,會損失數(shù)據(jù)的精度。如“(int)3.14”將得到int型數(shù)據(jù)3,原先占8個字節(jié)的雙精度浮點型數(shù)3.14變成了占4個字節(jié)的整型數(shù)3。C語言還提供了幾個類型轉(zhuǎn)換的庫函數(shù),如函數(shù)atof()的功能是把字符串轉(zhuǎn)換成浮點數(shù),函數(shù)atoi()的功能是把字符串轉(zhuǎn)換成整型數(shù),函數(shù)atol()的功能是把字符串轉(zhuǎn)換成長整型數(shù),函數(shù)gcvt()的功能是把浮點數(shù)轉(zhuǎn)換成字符串,函數(shù)strtod()的功能是把字符串轉(zhuǎn)換為double型值,函數(shù)strtol()的功能是把字符串轉(zhuǎn)換為長整型數(shù)。任務(wù)準備11.分量運算符分量運算符包括“.”和“->”,它們用于訪問結(jié)構(gòu)體變量中的成員。引用結(jié)構(gòu)體變量的成員用“.”運算符,引用結(jié)構(gòu)體指針的成員用“->”運算符。假如一個指針變量p指向結(jié)構(gòu)體變量,則“結(jié)構(gòu)體變量.成員名”、“(*p).成員名”、“p->成員名”這三種訪問形式是等價的。關(guān)于結(jié)構(gòu)體類型將在后續(xù)章節(jié)講解。任務(wù)準備12.下標運算符下標運算符由一對中括號[]組成,它有兩個操作數(shù),一個是數(shù)組名,另一個是下標。它與數(shù)組名和下標一起使用,作用是獲取數(shù)組的某個元素。下標運算符的語法格式如下:數(shù)組名[下標]下標是數(shù)組元素的編號,在C語言中下標是從0開始計數(shù)的。例如,用“inta[10]”定義一個能存儲10個整數(shù)的數(shù)組,它的10個元素的下標是0~9,這10個元素分別是a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。可以通過“a[i]”形式讀取或修改下標為i的元素的值。任務(wù)準備13.運算符優(yōu)先級和結(jié)合性只有掌握了運算符的優(yōu)先級和結(jié)合性,才能正確地使用運算符。當一個表達式中出現(xiàn)不同類型的運算符時,先對優(yōu)先級高的運算符進行運算,再對優(yōu)先級低的運算符進行運算。當幾個運算符的優(yōu)先級相同時,則根據(jù)運算符的結(jié)合性確定運算順序。運算符的結(jié)合性規(guī)定了運算時的結(jié)合方向:左結(jié)合和右結(jié)合。左結(jié)合規(guī)定從左向右計算,右結(jié)合規(guī)定從右向左計算。任務(wù)準備表2-7運算符的優(yōu)先級和結(jié)合性優(yōu)先級運算符含義運算類型結(jié)合方向1()[]->.圓括號數(shù)組下標指向結(jié)構(gòu)體成員引用結(jié)構(gòu)體成員初等運算符自左向右2!~-++--*&(類型名)sizeof邏輯非按位取反求負自增自減取指針內(nèi)容取地址強制類型轉(zhuǎn)換長度運算單目運算符從右向左優(yōu)先級運算符含義運算類型結(jié)合方向3*/%相乘相除取余算術(shù)運算符自左向右4+-相加相減5<<

>>

左移右移位運算符6>

<

>=<=大于小于大于等于小于等于關(guān)系運算符7==!=等于不等于8&按位與位運算符9^按位異或10|按位或11&&邏輯與邏輯運算符12||邏輯或13?:條件運算三目運算符自右向左14=+=-=*=/=%=&=^=|=>>=<<=賦值運算復(fù)合賦值運算賦值運算符15,逗號運算逗號運算符從左到右任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)實施【任務(wù)1】用數(shù)組存儲某學(xué)生的語文、數(shù)學(xué)、英語、物理、化學(xué)課程的成績(整數(shù)),統(tǒng)計這五門課程的平均分,并判斷平均分是否及格。1.任務(wù)分析本任務(wù)考查數(shù)組的定義和初始化,以及下標運算符、算術(shù)運算符、強制轉(zhuǎn)換運算符、條件運算符的使用。任務(wù)要求五門課程的成績必須是整數(shù),所以可以用整型數(shù)組存儲。這五門課程的平均分可能是小數(shù),所以可以用浮點型變量存儲,單精度和雙精度均可。求五門課的總成績,要用下標運算符訪問每一個數(shù)組元素,用算術(shù)運算符將五個成績相加。由于兩個整數(shù)相除只能得到整數(shù)結(jié)果,所以需要先將總成績強制轉(zhuǎn)換成小數(shù),再除以5,才能得到保留小數(shù)部分的平均分。最后在條件運算表達式中比較平均分與60的大小,判斷平均分是否及格。任務(wù)實施2.任務(wù)實現(xiàn)本任務(wù)的實現(xiàn)代碼如下,請將代碼中空白處補充完整。#include<stdio.h>intmain(){ /*語文數(shù)學(xué)英語物理化學(xué)*/ intcj[5]={75,48,92,78,80}; /*定義數(shù)組并初始化*/ intzf; doublepjf; zf=

; /*求總分*/ pjf=

; /*求平均分*/ printf("平均分:%.2lf\n",pjf); printf("%s\n",

?"及格":"不及格");/*條件表達式*/ return0;}編譯運行的結(jié)果如圖2-6:圖2-6求平均分任務(wù)實施3.任務(wù)總結(jié)第二個輸出語句中的條件表達式的結(jié)果是"及格"或"不及格",是字符串常量,因此用printf()函數(shù)輸出該結(jié)果時用“%s”格式。任務(wù)準備任務(wù)實施任務(wù)描述任務(wù)3輸入和輸出任務(wù)描述本任務(wù)要求輸入學(xué)生的學(xué)號、姓名、性別、年齡、身高,用5個變量存儲,然后輸出學(xué)生信息。要完成本任務(wù),必須熟練掌握輸入函數(shù)scanf()和輸出函數(shù)printf()的用法。因此,本任務(wù)將講解C語言常見的輸入輸出函數(shù)的用法,讓學(xué)生具備輸入和輸出常見數(shù)據(jù)的能力。本任務(wù)主要涉及字符串型、字符型、整型、浮點型數(shù)據(jù)的輸入、存儲和輸出。任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)準備1.getchar()和putchar()函數(shù)getchar()函數(shù)用于從鍵盤緩沖區(qū)讀取一個字符并返回該字符,它沒有參數(shù),一般將返回的字符存入字符變量或輸出。輸入內(nèi)容以回車鍵作為結(jié)束標志。putchar()函數(shù)用于將參數(shù)中的字符數(shù)據(jù)輸出到屏幕。它們在頭文件stdio.h中定義,常見用法如下:charch=getchar();putchar(ch);任務(wù)準備【實例1】輸入兩個字符并存儲,再輸出這兩個字符。#include<stdio.h>intmain(){ charch1,ch2; printf("請輸入兩個字符:");/*原樣輸出字符串內(nèi)容*/ ch1=getchar(); /*讀取輸入的一個字符*/ ch2=getchar(); printf("它們是:"); putchar(ch1); /*輸出一個字符*/ printf("%c",ch2); /*putchar(ch2);*/ return1;}編譯運行結(jié)果如圖2-7所示:圖2-7字符的輸入和輸出任務(wù)準備實例代碼中,putchar(ch)與printf("%c",ch)的功能相同,都能輸出一個字符。用戶的輸入以回車鍵表示結(jié)束,getchar()會依次讀取輸入內(nèi)容中的一個字符。當需要讀取兩個輸入字符時,可以連續(xù)輸入兩個字符再回車,如輸入“AD”后回車,字符A和D就會分別被兩個getchar()函數(shù)讀取到。如果輸入“A”后回車,再輸入“D”后回車,則不會得到想要的結(jié)果,因為第一個getchar()函數(shù)會讀取到字符A,第二個getchar()函數(shù)會把第一個回車符當作字符讀入,而不是字符D。因此,在連續(xù)輸入多個數(shù)據(jù)時,要避免字符數(shù)據(jù)讀入錯誤。任務(wù)準備2.printf()函數(shù)printf()函數(shù)用于在標準輸出設(shè)備(屏幕)輸出數(shù)據(jù),其一般調(diào)用格式為:printf("格式控制字符串");printf("格式控制字符串",輸出值參數(shù)表);輸出值參數(shù)表是要輸出的數(shù)據(jù),這些數(shù)據(jù)可以是常量、變量或表達式,它們以逗號隔開。格式控制字符串也稱格式字符串,它表示想要輸出的格式。格式字符串可以包括兩部分:普通字符和格式轉(zhuǎn)換說明符。格式字符串中的普通字符會原樣輸出,而格式轉(zhuǎn)換說明符則將對應(yīng)的輸出值參數(shù)按指定的格式輸出,其以%開頭,后面跟具有特定意義的字符。輸出值參數(shù)必須與格式轉(zhuǎn)換說明符在類型、個數(shù)和位置上一一對應(yīng)。格式轉(zhuǎn)換說明符能控制輸出數(shù)據(jù)的類型、對齊方式、長度、小數(shù)位數(shù)等,如%d對應(yīng)輸出int型數(shù)據(jù),%5d對應(yīng)輸出占5個字符位置并靠右對齊的int型數(shù)據(jù),%-5d對應(yīng)輸出占5個字符位置并靠左對齊的int型數(shù)據(jù),%f對應(yīng)輸出float型和double型數(shù)據(jù),%6.2f對應(yīng)輸出占8個字符位置并且小數(shù)點后保留2位的浮點型數(shù)據(jù)。任務(wù)準備printf()函數(shù)的格式轉(zhuǎn)換說明符及其含義如表2-8所示。格式轉(zhuǎn)換說明符含義%d或%i輸出帶符號的十進制整數(shù),正數(shù)的符號省略。%md輸出帶符號的十進制整數(shù),右對齊,占m位,不足m位補空格,超過m位則原樣輸出。%-md輸出帶符號的十進制整數(shù),左對齊,占m位,不足m位補空格,超過m位則原樣輸出。%0md輸出帶符號的十進制整數(shù),右對齊,占m位,不足m位補0,超過m位則原樣輸出。%u以無符號的十進制整數(shù)形式輸出%o以無符號的八進制整數(shù)形式輸出,不輸出前導(dǎo)符0。%x以無符號的十六進制整數(shù)形式(小寫)輸出,不輸出前導(dǎo)符0x。%X以無符號的十六進制整數(shù)形式(大寫)輸出,不輸出前導(dǎo)符0X。%f以十進制小數(shù)形式輸出浮點型數(shù)據(jù),包括單精度和雙精度浮點型。%m.nf以十進制小數(shù)形式輸出浮點型數(shù)據(jù),占m位,小數(shù)點后保留n位。%e或%E以指數(shù)形式輸出浮點型數(shù)據(jù),指數(shù)部分為e或E%c輸出一個字符,包含轉(zhuǎn)義字符。%s輸出字符串。%p輸出變量的地址。%%輸出百分號%。表2-8printf()函數(shù)的格式轉(zhuǎn)換說明符任務(wù)準備【實例2】用printf()函數(shù)輸出字符、整數(shù)、浮點數(shù)、字符串和變量地址。intmain(){ charch='A'; intx=15; doubley=31.459; charstr[100]="abcdefg"; printf("ch=%c\n",ch); printf("x=%d,x=%-5d,x=%05d\n",x,x,x); printf("x=%o,x=%x,x=%X\n",x,x,x); printf("y=%f,y=%8.2f,y=%e\n",y,y,y); printf("str=%s\n",str); printf("x的地址:%p\n",&x); return0;}其中%p對應(yīng)地址數(shù)據(jù),需要用&符號取變量x的地址。圖2-8printf()輸出常見類型數(shù)據(jù)任務(wù)準備3.scanf()函數(shù)scanf()函數(shù)用于從標準輸入設(shè)備(鍵盤)輸入數(shù)據(jù),存儲指定的地址單元中。其一般調(diào)用格式為: scanf("格式控制字符串",參數(shù)地址表);與printf()函數(shù)類似,scanf()函數(shù)的格式字符串也可以分為普通字符和格式轉(zhuǎn)換說明符,普通字符必須原樣輸入,格式轉(zhuǎn)換說明符則與參數(shù)地址在數(shù)據(jù)類型、個數(shù)和位置上一一對應(yīng)。格式轉(zhuǎn)換說明符要求按指定的格式輸入數(shù)據(jù),其以%開頭,后面跟具有特定意義的字符。例如,%d對應(yīng)int型數(shù)據(jù)的輸入,%f對應(yīng)float型數(shù)據(jù)的輸入,%lf對應(yīng)double型數(shù)據(jù)的輸入,%c對應(yīng)char型數(shù)據(jù)的輸入,%s對應(yīng)字符串的輸入。任務(wù)準備scanf()函數(shù)的格式轉(zhuǎn)換說明符及其含義如表2-9所示:表2-9scanf()函數(shù)的格式轉(zhuǎn)換說明符格式轉(zhuǎn)換說明符含義%d或%i輸入十進制整數(shù)。%o輸入八進制整數(shù)。%x輸入十六進制整數(shù)。%c輸入一個字符,空格、回車、制表符(Tab)也作為有效字符輸入。%s輸入字符串,遇到空格、回車、制表符時結(jié)束。%f輸入單精度浮點數(shù)。%lf輸入雙精度浮點數(shù)。%e以指數(shù)形式輸入浮點型數(shù)據(jù)。任務(wù)準備使用scanf()函數(shù)進行數(shù)據(jù)輸入時,需要注意以下情況。①輸入整數(shù)和浮點數(shù)intx;scanf("%d",&x);輸入一個整數(shù)時,正常應(yīng)該輸入一個整數(shù)后回車,如輸入“15”后回車,變量x就會存儲輸入的15。當非法輸入“15a34”、“15.34”時,系統(tǒng)能自動截取15作為輸入數(shù)據(jù),而輸入“a1534”、“.1534”則無法得到正確的輸入數(shù)據(jù)。floaty;scanf("%f",&y);輸入“3.14”、“3.14a56”、“3.14.56”都能得到3.14作為輸入的浮點型數(shù)據(jù),而“a3.14”則無法得到正確的輸入數(shù)據(jù)。doublez;scanf("%lf",&z);輸入雙精度浮點數(shù)時,必須用“%lf”格式轉(zhuǎn)換說明符才能得到正確的輸入。任務(wù)準備intx;floaty;scanf("%d%f",&x,&y);當幾個格式轉(zhuǎn)換說明符相鄰出現(xiàn),如“%d%f”,要求連續(xù)輸入整數(shù)或浮點數(shù)。這時,每個數(shù)之間以空格、回車或制表符隔開,這樣才能獲得正確的輸入值。scanf("%d,%f",&x,&y);當幾個格式轉(zhuǎn)換說明符用逗號隔開,如“%d,%f”,輸入的數(shù)據(jù)也要用逗號隔開。scanf("x=%d,y=%f",&x,&y);格式字符串中的普通字符原樣輸入,上述語句正確的輸入是“x=15,y=3.14”。任務(wù)準備②輸入字符charch;scanf("%c",&ch);輸入一個字符后回車,輸入的字符就會被存儲在字符變量ch中。intx;floaty;charch;scanf("%d%c%f",&x,&ch,&y);當用“%d%c%f”來連續(xù)輸入整數(shù)、字符、浮點數(shù)時,只能輸入“15A3.14”形式的數(shù)據(jù),系統(tǒng)會自動識別15是整數(shù),A是字符,3.14是浮點數(shù)。它們之間不能出現(xiàn)空格、回車、制表符,因為15之后的非數(shù)字字符都會被識別成輸入字符。例如,當輸入“15A3.14”,15后的空格會存入變量ch中,之后的浮點型變量y將無法獲取到正確的輸入。任務(wù)準備intx;floaty;charch;printf("請輸入年齡:");scanf("%d",&x);/*用函數(shù)fflush(stdin)清除緩沖區(qū)里的回車字符*//*或者用函數(shù)getchar()接收輸入年齡后的回車字符*/printf("請輸入性別:");scanf("%c",&ch);printf("請輸入身高:");scanf("%f",&y);當要求輸入一個整數(shù)、一個字符和一個浮點數(shù)并以回車鍵分隔時,第一個回車鍵勢必會被識別成輸入字符,造成無法獲取到正確的輸入數(shù)據(jù)。因此,可以調(diào)用fflush(stdin)清除緩沖區(qū)里的回車字符,或者調(diào)用getchar()接收輸入年齡后的回車字符,這樣才能保證接下來的能正確輸入字符數(shù)據(jù)。鍵盤緩沖區(qū)可以認為是內(nèi)存里的一塊區(qū)域,從鍵盤輸入的字符(包括回車)都在緩沖區(qū)里排隊,等待scanf()函數(shù)按順序讀取。scanf()函數(shù)用%d只能讀取回車鍵之前的整數(shù),回車字符依然在緩沖區(qū)中。當scanf()函數(shù)再次用%c從緩沖區(qū)讀取一個字符時,它將讀取到隊伍最前面的回車字符。因此,用fflush()函數(shù)清除緩沖區(qū)中的回車符,或用getchar()函數(shù)取出緩沖區(qū)中的回車符后,才能保證接下來scanf()函數(shù)讀取的字符就是用戶輸入的字符。任務(wù)準備③輸入字符串charstr[100];scanf("%s",str);一般用字符數(shù)組來存儲輸入的字符串,并且字符數(shù)組的空間必須足夠大,以保證輸入的字符串不超過字符數(shù)組的存儲空間。由于字符數(shù)組名str本身就是一個地址常量,因此,在scanf()函數(shù)中作參數(shù)時不需要取地址符&,而是直接用str。用scanf()函數(shù)讀取用戶輸入的字符串時,默認只能讀取空格、制表符、回車之前的部分,并且會在末尾添加'\0'作為結(jié)束符。如果希望將回車之前的字符串都讀入,包含空格和制表符,則可以調(diào)用函數(shù)gets()實現(xiàn)。任務(wù)準備4.gets()和puts()函數(shù)gets()函數(shù)用于從標準輸入設(shè)備(鍵盤)獲取一個字符串,存儲到指定的空間中。gets()函數(shù)會接收回車鍵之前的所有字符,包括空格和制表符。它會丟棄回車符(即緩沖區(qū)中不會殘留回車符),然后在字符串末尾添加'\0'作為結(jié)束標志。其一般調(diào)用格式為:gets(str);其中,str是一個字符數(shù)組名(地址常量)或字符指針變量(地址變量)。當str是一個字符數(shù)組時,gets(str)的作用是將用戶輸入的、回車鍵之前的字符串存入數(shù)組str中,并在字符串末尾添加'\0'作為結(jié)束標志。gets()函數(shù)和scanf()函數(shù)都不能檢測越界,因此,用戶輸入的字符串長度最好不要超過數(shù)組能存儲的元素個數(shù)。gets()函數(shù)會丟棄回車符,使緩沖區(qū)中不會殘留回車符,而用scanf()函數(shù)獲取輸入的字符串后,會將回車符留在緩沖區(qū)中。puts()函數(shù)用于向標準輸出設(shè)備(屏幕)輸出字符串并換行。其一般調(diào)用格式為:puts(str);其中,str是一個字符數(shù)組名或字符指針變量。任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)實施【任務(wù)1】輸入學(xué)生的學(xué)號、姓名、性別(M或F)、年齡、身高,用5個變量存儲,然后輸出學(xué)生信息。1.任務(wù)分析本任務(wù)考查字符串、字符、整數(shù)、浮點數(shù)的輸入和輸出。學(xué)生的學(xué)號是數(shù)字組成的字符串,中間沒有空格或制表符,可用scanf()函數(shù)或gets()函數(shù)實現(xiàn)輸入。同理,姓名是由字母組成的字符串,也可以用scanf()函數(shù)或gets()函數(shù)實現(xiàn)輸入。性別是字符型數(shù)據(jù),值是'M'(男)或'F'(女),在輸入前要消除上一次輸入的回車符的影響。年齡和身高分別是整型和單精度浮點型數(shù)據(jù),對應(yīng)scanf()函數(shù)的%d和%f格式輸入。任務(wù)實施2.任務(wù)實現(xiàn)本任務(wù)實現(xiàn)代碼如下,請將代碼中空白處補充完整。intmain(){ charxh[20];/*學(xué)號不超過20個字符*/ charxm[50];/*姓名不超過50個字符*/ charxb; /*性別*/ intnl; /*年齡*/ floatsg; /*身高*/ printf("請輸入學(xué)號:"); scanf("",); printf("請輸入姓名:"); scanf("",); getchar(); /*或fflush(stdin);*/ printf("請輸入性別:");圖2-9輸入學(xué)生信息 scanf("",);/*或xb=getchar();*/ printf("請輸入年齡:"); scanf("",); printf("請輸入身高:"); scanf("",); printf("學(xué)號:%s,姓名:%s,性別:%c,年齡:%d,身高:%.2f\n",xh,xm,xb,nl,sg); return0;}編譯運行的結(jié)果如圖2-9所示:任務(wù)實施3.任務(wù)總結(jié)測試發(fā)現(xiàn),scanf()函數(shù)獲取輸入數(shù)據(jù)后,殘留在緩沖區(qū)的回車符會作為接下來的gets()函數(shù)的輸入數(shù)據(jù),導(dǎo)致gets()函數(shù)無法得到正確的字符串輸入,但不會影響接下來的scanf()函數(shù)獲取輸入的字符串。而gets()函數(shù)會丟棄回車符,使緩沖區(qū)中不會殘留回車符,因此它不會影響接下來的字符輸入。輸入學(xué)生信息也可以用如下代碼實現(xiàn):printf("請輸入學(xué)號:");scanf("%s",xh);getchar(); /*清除緩沖區(qū)殘留的回車符*/printf("請輸入姓名:");gets(xm);/*gets()不會殘留回車符,不需調(diào)用getchar()或fflush(stdin);*/printf("請輸入性別:");xb=getchar();printf("請輸入年齡:");scanf("%d",&nl);printf("請輸入身高:");scanf("%f",&sg);數(shù)據(jù)的輸入千變?nèi)f化,初學(xué)者在掌握常見類型數(shù)據(jù)的輸入輸出的同時,還需要留意一些特殊情況的處理。任務(wù)準備任務(wù)實施任務(wù)描述任務(wù)4用結(jié)構(gòu)體變量存儲學(xué)生信息任務(wù)描述本任務(wù)要求輸入一個學(xué)生的學(xué)號、姓名、性別、年齡和身高,并用一個變量存儲,然后輸出學(xué)生信息。要完成本任務(wù),必須掌握結(jié)構(gòu)體類型的創(chuàng)建、結(jié)構(gòu)體變量的初始化、結(jié)構(gòu)體成員的訪問等。因此,本任務(wù)將講解結(jié)構(gòu)體類型的創(chuàng)建和結(jié)構(gòu)體變量的使用,讓學(xué)生具備使用構(gòu)造類型處理復(fù)雜數(shù)據(jù)的能力。本任務(wù)主要涉及結(jié)構(gòu)體類型的創(chuàng)建、結(jié)構(gòu)體變量的使用、結(jié)構(gòu)體數(shù)組的使用。任務(wù)準備任務(wù)實施Part

1Part

2Part

3任務(wù)描述任務(wù)準備在之前的任務(wù)中,存儲一個學(xué)生的信息用到了5個變量,它們分別存儲學(xué)號、姓名、性別、年齡和身高。但在實際應(yīng)用中,這種做法不可取,因為如果存儲一個學(xué)生的信息就要用到5個變量,那么四十個學(xué)生就要用到200個變量,顯然不切實際。為了存儲一個班四十個學(xué)生的信息,有人想到用5個數(shù)組來分別存儲學(xué)號、姓名、性別、年齡和身高。可以用二維字符數(shù)組存儲多個字符串,如定義二維字符數(shù)組xh存儲40個長度20以內(nèi)的學(xué)號,定義二維字符數(shù)組xm存儲40個長度50以內(nèi)的姓名。5個數(shù)組的示例代碼如下,限于篇幅,每個數(shù)組只給出4個初始值。charxh[40][20]={"10001","10002","10003","10004"};charxm[40][50]={"zhangsan","lisi","wangwu","chenliu"};charxb[40]={'M','F','F','M'};intnl[40]={19,17,18,21};floatsg[40]={1.75f,1.60f,1.65f,1.80f};但這種做法有三個弊端:一是學(xué)生信息存儲在不同的內(nèi)存區(qū)域,獲取數(shù)據(jù)的效率不高;二是每個學(xué)生的數(shù)據(jù)靠數(shù)組下標維系,容易因為小失誤而導(dǎo)致信息錯位;三是結(jié)構(gòu)零散,不便于數(shù)據(jù)的管理。因此,用5個數(shù)組也不是最佳做法。任務(wù)準備比較好的解決辦法是,將存儲學(xué)生信息的5個變量組合成一個新的類型——結(jié)構(gòu)體類型,用該結(jié)構(gòu)體類型定義1個變量就能存儲1個學(xué)生的所有信息,用該結(jié)構(gòu)體類型定義擁有40個元素的數(shù)組,就能存儲40個學(xué)生的信息。1.結(jié)構(gòu)體類型結(jié)構(gòu)體類型是一種自定義類型,它是將多個相關(guān)數(shù)據(jù)組合在一起的構(gòu)造數(shù)據(jù)類型。結(jié)構(gòu)體類型由若干個成員組成,每個成員的類型可以是基礎(chǔ)類型,也可以是構(gòu)造類型。在使用結(jié)構(gòu)體類型之前必須先聲明它,聲明的一般形式為:struct結(jié)構(gòu)體名{

數(shù)據(jù)類型數(shù)據(jù)名1;

數(shù)據(jù)類型數(shù)據(jù)名2; ……

數(shù)據(jù)類型數(shù)據(jù)名n; };任務(wù)準備結(jié)構(gòu)體類型的聲明以關(guān)鍵字struct開頭,后面跟一個自定義的名字,它們必須一起使用,創(chuàng)建的結(jié)構(gòu)體類型是“struct結(jié)構(gòu)體名”。一對大括號內(nèi)是結(jié)構(gòu)體類型的成員,它們可以是各種數(shù)據(jù)類型,大括號后必須以分號“;”結(jié)束。一般習慣將聲明結(jié)構(gòu)體類型的代碼寫在程序的頂部,include語句之后,函數(shù)之前。如果將聲明結(jié)構(gòu)體類型的代碼寫在函數(shù)中,則該結(jié)構(gòu)體類型只能在該函數(shù)內(nèi)使用。用于存儲學(xué)生的學(xué)號、姓名、性別、年齡和身高的結(jié)構(gòu)體類型的聲明如下,結(jié)構(gòu)體類型是structstudent,用它定義一個變量就可以存儲一個學(xué)生的所有信息。structstudent{ charxh[20]; /*學(xué)號*/ charxm[50]; /*姓名*/ charxb; /*性別*/ intnl; /*年齡*/ floatsg; /*身高*/};任務(wù)準備怎么理解結(jié)構(gòu)體類型呢?以廣東人熟悉的煲湯來打比方。當廣東人想做黃芪當歸燉雞湯,需要去菜市場的不同攤位購買當歸、黃芪、桂圓、北沙參、黨參、姜片、蔥段、八角、桂皮等九種湯料,費時費力,非常不方便。后來有廠家生產(chǎn)了一種“黃芪當歸雞湯料包”的產(chǎn)品,該產(chǎn)品將燉雞湯所需的九種湯料“打包”成一個湯料包,每當有人想做一份黃芪當歸燉雞湯時,購買一袋黃芪當歸雞湯料包即可。在不同攤位購買九種湯料,就類似定義九個變量存儲數(shù)據(jù),而“黃芪當歸雞湯料包”這類產(chǎn)品就類似將九個變量組合形成的結(jié)構(gòu)體類型,購買一個湯料包就類似定義了一個結(jié)構(gòu)體變量,它里面就有了九個數(shù)據(jù)(湯料)。任務(wù)準備由于結(jié)構(gòu)體類型必須以struct開頭且名字較長,為了方便編程,可以用關(guān)鍵字typedef給結(jié)構(gòu)體類型取一個別名。在聲明結(jié)構(gòu)體類型structstudent時給它取別名STU,形式如下:typedefstructstudent{ charxh[20]; charxm[50]; charxb; intnl; floatsg;}STU;在聲明結(jié)構(gòu)體類型structstudent之后給它取別名STU,形式如下:typedefstructstudentSTU;在這之后,就可以用STU代替structstudent,使程序更簡潔,增強了程序的可讀性。任務(wù)準備2.結(jié)構(gòu)體變量在C語言中,有三種定義結(jié)構(gòu)體變量的方法。(1)先聲明結(jié)構(gòu)體類型,再定義結(jié)構(gòu)體變量。例如在聲明了結(jié)構(gòu)體類型structstudent后,再用它定義變量:structstudents1;在給structstudent取別名STU后,還可以用STU定義變量:STUs2;(2)聲明結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)體變量。例如在聲明結(jié)構(gòu)體類型structstudent時定義變量s1和s2:structstudent{ charxh[20]; charxm[50]; charxb; intnl; floatsg;}s1,s2;任務(wù)準備(3)不出現(xiàn)結(jié)構(gòu)體名,直接定義

溫馨提示

  • 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

提交評論