C语言程序设计课件_第1页
C语言程序设计课件_第2页
C语言程序设计课件_第3页
C语言程序设计课件_第4页
C语言程序设计课件_第5页
已阅读5页,还剩485页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章數據類型與運算式

2.1數據類型概述整型基本整型int數據類型基本類型構造類型指針類型*空類型void實型(浮點型)字元型char枚舉類型enum數組類型[]結構體類型struct共用體類型union單精確度實型float雙精度實型double短整型short長整型long無符號整型unsigned基本數據類型int整數,在目前絕大多數機器上占4個位元組。TC2中是2個位元組float單精確度浮點數,一般是4個位元組長double雙精度浮點數,一般是8個位元組長char字元,一般是1個位元組長用來表示256個ASCII字元,或者0~255的整數數據類型修飾符shortshortint,短整數,一般2個位元組長。通常簡寫為shortlonglong

int,長整數,一般是4個位元組長。通常簡寫為longlongdouble,長雙精度(高精度)浮點數,一般是10個位元組長。signed用來修飾char、int、short和long,說明他們是有符號的整數(正整數、0和負整數)。一般缺省都是有符號的,所以這個修飾符通常省略unsigned用來修飾char、int、short和long,說明他們是無符號的整數(正整數和0)

2.2常量和變數

2.2.1識別字和關鍵字2.2.2常量2.2.3變數2.2.1識別字和關鍵字

C語言的識別字的命名規則是:1.由字母或下劃線(_)開頭,同時由字母、0~9的數字或下劃線(_)組成。2.不能與關鍵字同名。例如:school_id,_age,es10為合法的識別字。school-id,man*,2year,class為不合法的識別字。

識別字是用來標識對象名字(包括變數、函數、數組、類型等)的有效字元序列。構造一個識別字的名字,需要按照一定的規則。識別字不宜過短,過短的識別字會導致程式的可讀性變差;但也不宜過長,否則將增加錄入工作量和出錯的可能性。關鍵字(32個)關鍵字在C語言中,有其特殊的含義,不能用作一般的識別字使用,即一般的識別字(變數名、類名、方法名等)不能與其同名。ANSIC關鍵字autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile2.2.2常量

常量是指直接用於程式中的、不能被程式修改的、固定不變的量。C語言中的常量值是用數值或字串表示的。C語言常量包括整數、浮點數、字元、字串四種類型。有時為了使用方便,可用一個符號名來代表一個常量,這稱為符號常量。符號常量一般定義格式如下:#define識別字常量數據例如:#definePI3.14159一旦某識別字定義成為一個常量後,以後在程式處理時,凡是碰到了該識別字,都將替換成對應的常量。

2.2.3變數

變數是指C語言編程中合法的識別字,是用來存取某種類型值的存儲單元,其中存儲的值可以在程式執行的過程中被改變。必須先定義後使用

定義變數的一般形式為:

變數類型說明符變數列表[=初值]

①變數類型說明符,確定了變數的取值範圍以及對變數所能進行的操作規範②變數列表,由一個或多個變數名組成。當要定義多個變數時,各變數之間用逗號分隔。③初值是可選項,變數可以在定義的同時賦初值,也可以先定義,在後續程式中賦初值。C語言中的變數名除了符合識別字的條件之外,還必須滿足下列約定:①變數名不能與關鍵字相同。②C語言對變數名區分大小寫。③變數名應具有一定的含義,以增加程式的可讀性。例:charesc='a';

inti=1;

intsum=0;

floateps=1.0e-5;

2.3整數類型

2.3.1整型常量2.3.2整型變數

2.3.1整型常量

整數常量是不帶小數的數值,用來表示正負數。例如0x55、0x55ff、1000000都是C語言的整數常量。整數常量的取值範圍是有限的,它的大小取決於此類整型數的類型,與所使用的進制形式無關。整數常量有三種形式:

十進位、八進制、十六進制(1)十進位整數是由不以0開頭的0~9的數字組成的數據。(2)八進制整數是由以0開頭的0~7的數字組成的數據。(3)十六進制整數是由以0x或0X開頭的0~9的數字及A~F的字母組成的數據。例如:0,63,83是十進位數,00,077,0123是八進制數,0x0,0X0,0X53,0x53,0X3f,0x3f是十六進制數。

2.3.2整型變數

整型變數類型有short、int、long、unsigned四種說明符。整數類型的取值範圍類型TurboC2.0VisualC++6.0寬度取值範圍寬度取值範圍[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實數類型

2.4.1實型常量實數類型的數據即實型數據,在C語言中實型數據又稱為浮點數。浮點數是帶有小數的十進位數,可用十進位數形式或指數形式表示。浮點數表示形式(1)十進位數形式:十進位整數+小數點+十進位小數。(2)指數形式:十進位整數+小數點+十進位小數+E(或e)+正負號+指數。例如:3.14159,0.567,9777.12是十進位數形式,1.234e5,4.90867e-2是指數形式。C語言的浮點數常量在機器中有單精確度和雙精度之分。單精確度以32位形式存放,雙精度則以64位形式存放。

2.4.2實型變數

(1)float類型float類型是一個位數為32位的單精確度浮點數。它具有運行速度較快,佔用空間較少的特點。(2)double類型double類型是一個位數為64位的雙精度浮點數。雙精度數在某些具有優化和高速運算能力的現代處理機上運算比單精確度數快。雙精度類型double比單精確度類型float具有更高的精度和更大表示範圍,常常使用。

2.5字元類型

2.5.1字元型常量(1)用單引號括起來的一個字元;如:‘A’、

‘1’、’?’等。(2)用單引號括起來的由反斜杠(\)引導的轉義字元。如:‘\n’、‘\t’、’\x41’、’\101’等。表2-4轉義字元表功能字元形式功能字元形式回車\r單引號\’換行\n雙引號\"水準製錶\t八進制位模式\ddd退格\b十六進制模式\xdddd換頁\f反斜線\\

2.5.2字元型變數

字元型變數的類型說明符為char,它在機器中占8位,其範圍為0~255。注意:字元型變數只能存放一個字元,不能存放多個字元,例如:chara='am';這樣定義賦值是錯誤的。

字串常量

用一對雙引號括起來的字元序列。注意:每個字串的後面都有一個‘\0’結束符。

如:“SHANGHAI”,“AbcdeFGHijk”,“Howareyou”。‘\’‘

‘\\‘

‘’‘

‘\‘

‘a’與“a”的區別。注意

2.6不同數據類型之間的轉換

不同類型的數據之間的運算稱為混合運算。在混合運算中,將會碰到類型轉換的情況。類型轉換可分為自動類型轉換、強制類型轉換兩種。

⒈自动类型转换

轉換從低級到高級。各類型從低級到高級的順序為:char→int→long→float→double。例如:charch=’A’;inti=28;floatx=2.36;doubley=6.258e+6;若運算式為i+ch+x*y轉換過程:先將ch轉換成int型,計算i+ch,由於ch=’A’,而’A’的ASCⅡ碼值為65,故計算結果為93,類型為int型。再將x轉換成double型,計算x*y,結果為double類型。最後將i+ch的值93轉換成double型,運算式的值最後為double類型。

⒉强制类型转换

高級數據要轉換成低級數據,需用使用強制類型轉換。這種使用可能會導致溢出或精度的下降,最好不要使用。強制類型轉換的格式為:

(type)變數;其中:type為要轉換成的變數類型。例如:(int)(a+b)(強制將a+b的值轉換成整型)例2.1數據類型轉換的例子#include<stdio.h>voidmain(){floatx;inti;x=3.5;i=(int)x;printf("x=%f",x);printf("i=%d",i);}運行結果為:x=3.500000i=3

2.7運算符與運算式

2.7.1算術運算符與算術運算式2.7.2賦值運算符與賦值運算式2.7.3關係運算符與關係運算式2.7.4邏輯運算符與邏輯運算式2.7.5條件運算符與條件運算式2.7.6逗號運算符與逗號運算式2.7.7運算符的優先順序和結合法則2.7.1算術運算符與算術運算式算術運算符用於算術運算,其運算元為數字類型或字元類型。表2-5算術運算符運算符名稱使用方式說明+加a+ba加b-減a-ba減b*乘a*ba乘b/除a/ba除b%取模a%ba取模b(返回除數的餘數)++自增++a,a++自增--自減--a,a--自減例:合法的C語言算術運算式。

a*b/c-1.5+’a’+fabs(-5)

fabs(-5)是求-5的絕對值的庫函數。“++”、“--”

首碼方式是先將運算元加(或減)1,再將運算元的值作為算術運算式的值;尾碼方式是先將運算元的值作為算術運算式的值,再將其加(或減)1。例如:a的值為5,

++a為首碼方式,首先將a的值加1,再得到運算式的值為6;

a++為尾碼方式,首先得到運算式的值為5,再將a的值加1。自增運算符和自減運算符運算對象只能是變數,不能是常量或運算式。形式3++或++(i+j)都是非法的運算式。

2.7.2賦值運算符與賦值運算式

賦值運算符“=”就是把右邊運算元的值賦給左邊運算元。賦值運算符左邊運算元必須是一個變數,右邊運算元可以是常量、變數、運算式。例如:運算式b=a+3在賦值運算符兩邊的運算元的數據類型如果一致,就直接將右邊的數據賦給左邊;如果不一致,就需要進行數據類型自動或強制轉換,將右邊的數據類型轉換成左邊的數據類型後,再將右邊的數據賦給左邊變數。複合運算符運算符名稱使用方式說明+=相加賦值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練習:設a=12,計算運算式a+=a-=a*12和a+=a-=a*=12的值

2.7.3關係運算符與關係運算式

關係運算符用來對兩個運算元進行比較。關係運算式就是用關係運算符將兩個運算式連接起來的式子,其運算結果為布爾邏輯值。如果關係運算式成立結果為真(true),否則為假(false)。由於C語言沒有邏輯型數據,就用1代表“真”,0代表“假”。關係運算符運算符名稱使用方法說明==等於A==b如果a等於b返回真,否則為假!=不等於A!=b如果a不等於b返回真,否則為假>大於A>b如果a大於b返回真,否則為假<小於A<b如果a小於b返回真,否則為假<=小於或等於A<=b如果a小於或等於b返回真,否則為假>=大於或等於a>=b如果a大於或等於b返回真,否則為假關係運算符的優先順序(1)“<”、“<=”、“>”和“>=”為同一級,“==”和“!=”為同一級。前者優先順序高於後者。(2)關係運算符優先順序低於算術運算符,高於賦值運算符和逗號運算符。例2.2關係運算式的運用#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);}運行結果為

001101程式輸出了6個運算式的值,其中有兩個是賦值運算式,請讀者根據運算符的優先順序作出判斷。注意關係運算式3<=x<=5等價於關係運算式(3<=x)<=5當x=10時,3<=x的值是1,再計算1<=5,得到1。其實,無論x去何值,關係運算式3<=x的值不是1就是0,都小於5,即3<=x<=5的值恒為1。由此看出關係運算式3<=x<=5無法正確表示代數式3<=x<=5。

2.7.4邏輯運算符與邏輯運算式

邏輯運算符用來對關係運算式進行運算。邏輯運算式就是用邏輯運算符將關係運算式連接起來的式子,其運算結果為布爾邏輯值。表2-8邏輯運算符運算符名稱&&邏輯與||邏輯或!邏輯非表2-9與、或、非運算規則運算式A運算式BA&&BA||B!A假假假假真假真假真真真假假真假真真真真假優先次序(1)!→&&→||(2)!高於算術運算符,&&、||低於關係運算符。例如: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);}運行結果為0101求解規則求解C語言邏輯運算式時,按從左到右的順序計算運算符兩側的運算元,一旦得到運算式的結果,就停止計算。求解邏輯運算式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。通常,關係運算符和邏輯運算符在一起使用,用於流程控制語句的判斷條件。

2.7.5條件運算符與條件運算式

條件運算符是一個三目運算符。一般形式為:

運算式1?運算式2:運算式3其中運算式1是一個關係運算式或邏輯運算式。執行過程:先求解運算式1的值,若運算式1的值為真,則求解運算式2的值,且作為整個條件運算式的結果;若運算式1的值為假,則求解運算式3的值,且作為整個條件運算式的結果。賦值運算式

max=(a>b)?a:b執行結果就是將條件運算式的值賦給max,也就是將a和b二者中大者賦給max。條件運算符的優先順序較低,只比賦值運算符高。它的結合方向是自右向左。例如:①(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,然後執行y*3的運算,將整個結果賦給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運算符的優先順序和結合法則

在運算式求值時,先按運算符的優先順序順序高低次序執行,例如先乘除後加減。在兩個相同的優先順序的運算符運算操作時,則採用左運算符優先規則,即從左到右執行。關於“結合法則”的概念在其他一些高級語言中是沒有的,是C語言的特點之一,應該瞭解清楚。附錄C列出了所有運算符以及它們的優先順序和結合法則。1.在C語言中,數據都屬於一定的類型的。不同類型數據的操作方式和取值範圍不同,所占存儲空間的大小也不同。2.識別字是用來標識對象名字(包括變數、函數、數組、類型等)的有效字元序列。C語言中的變數名必須符合識別字的命名規則,並且變數名不能與關鍵字相同。3.在程式中,數據的表現形式有常量和變數。常量有字面常量和符號常量兩種形式,符號常量只是一個字串,用來代替一個已知的常量。小結4.ANSIC標準沒有具體規定各類數據在內存中所占的位元組數,由各編譯系統自行決定。常見的有兩種:(1)TurboC等,int:2位元組,short:2位元組,long:4位元組。(2)VisualC++等,int:4位元組,short:2位元組,long:4位元組。對字元型都是1位元組。對於浮點數一般都是float:4位元組,double:8位元組。5.要注意運算符的優先順序和結合法則。小結第3章C語言程式的控制結構

本章導讀本章包括知識點:演算法的描述方法數據的輸入輸出函數調用格式if語句及switch語句的使用3種迴圈結構break、continue和goto語句的作用。常用演算法:如遞推法、窮舉法等C程式的基本風格程式設計的錯誤及程式的調試。3.1演算法3.1.1演算法的概念3.1.2演算法的表示方法3.1.1演算法的概念著名的電腦科學家沃思(NikiklausWirth)曾經提出過:

數據結構+演算法=程式數據結構(datastructure):即對數據的描述和組織形式。演算法(algorithm):對操作或行為的描述,即操作步驟。廣義地說,演算法就是做某一件事的步驟或程式。電腦解題的演算法大致包括這兩大類演算法:

非數值運算演算法和數值運算演算法。演算法特性:①有窮性。演算法的步驟必須是有限的,每個步驟都在有限的時間內做完,執行有限個步驟後終止。②確定性。演算法中每一步驟都必須有明確定義,不允許有模棱兩可的解釋,不允許有多義性。例如:“如果成績大於等於90分,則輸出A;如果成績小於等於90分,則輸出B”,當成績為90分時,既會輸出A,又會輸出B,這就產生了不確定性。③有效性。演算法的每一步操作都應該能有效執行。如一個數被0除就是無效不可行的,應避免。

演算法特性

④沒有輸入或有多個輸入。例如:求1+2+3+…+100時,不需要輸入任何資訊就能求出結果;而要求1+2+3+…+n時,必須從鍵盤輸入n的值,才能求出結果。⑤有一個或多個輸出。演算法的目的是為了求解,“解”就是演算法的輸出。沒有輸出的演算法是沒有意義的。3.1.2演算法的表示方法

常用方法有:自然語言、傳統流程圖、NS流程圖、偽代碼等

1.用自然語言表示演算法自然語言就是人們日常使用的語言,可以是漢語、英語或其他語言。用自然語言表示演算法,通俗易懂,但文字冗長,在表達上不夠嚴格,引起理解上的歧義性,不易轉化為程式,描述複雜的演算法不很方便。因此,除了很簡單的問題外,一般不用自然語言描述演算法。用自然語言表示的求1+2+3+…+6的演算法如下:演算法1:S1:計算1+2得到3;S2:將第一步中的運算結果3與3相加得到6;S3:將第二步中的運算結果6與4相加得到10;S4:將第三步中的運算結果10與5相加得到15;S5:將第四步中的運算結果15與6相加得到21。演算法2:S1:定義迴圈變數i=1,用於保存和的變數s,並置初值為0;S2:判斷i的值是否小於等於6,若是則執行S3,否則跳轉到S4執行;S3:將i的值累加到s,然後變數i自身加1,轉到S2執行;S4:輸出s的值。演算法1是最原始的方法,最為繁瑣,步驟較多,當加數較大時,比如1+2+3+…+10000,再用這種方法是行不通的;演算法2是比較簡單的演算法,且易於在電腦上執行操作。

2.用傳統流程圖表示演算法

流程圖是一個描述程式的控制流程和指令執行情況的有向圖,用流程圖表示演算法,直觀形象,易於理解。美國國家標準化協會(ANSI)規定了一些常用符號如圖所示用傳統流程圖描述計算1+2+3+…+6的演算法

3.用NS結構化流程圖表示演算法1973年美國學者I.Nassi和B.Schneiderman提出了一種新型流程圖—NS結構化流程圖,這種流程圖一方面取消了帶箭頭的流程線,這樣演算法被迫只能從上到下順序執行,避免了演算法流程的任意轉向,適於結構化程式設計;另一方面,這種流程圖節省篇幅,因而很受歡迎。用NS流程圖描述的計算1+2+3+…+6的演算法

4.用偽代碼表示演算法

偽代碼使用介於自然語言和電腦語言之間的文字和符號來描述演算法。它使用起來靈活,無固定格式和規範,無圖形符號,只要寫出來自己或別人能看懂就行,由於它與電腦語言比較接近,便於向電腦語言演算法(即程式)過渡。用偽代碼描述的1+2+3+…+6演算法如下:begin/*演算法開始*/1=>i0=>swhilei≤6{s+i=>si+1=>i}printsumend/*演算法結束*/在程式設計中讀者可根據需要和習慣任意選用。

3.2C語句的分類

C語言的語句可分為5大類:控制語句函數調用語句運算式語句複合語句空語句

1.控制語句

控制語句用來實現對程式流程的選擇、迴圈、轉向和返回等進行控制。C語言中共有9種控制語句,包括12個關鍵字,可以分為以下幾類:選擇語句:if…else和switch(包括case和default)。迴圈語句:for、while和do…while。轉向語句:continue、break和goto。返回語句:return。本章的3.5、3.6和3.7中將陸續介紹這些控制語句。

2.函數調用語句

函數調用語句是由一個函數調用加一個分號構成的語句。它的一般形式是:

函數名(實參表);例如:printf(“ThisisaCProgram”);

/*用於輸出雙引號中的字串*/c=getchar();

/*用於從鍵盤讀入一個字元*/

m=max(a,b,c);

/*用於求取a、b、c三者之間的最大值並將結果賦給m*/

3.運算式語句

由一個運算式加上一個分號構成。如: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);}

花括弧中的語句,可以是簡單語句、空語句、複合語句、流程控制語句,所有這些語句括在一起,在語法上看成是一條語句,執行時順序執行花括弧中的每條語句。複合語句多用於流程控制語句中。

5.空語句

僅僅以分號“;”作為標識。空語句的形式為:

/*空語句*/空語句本身沒有實際功能,只是表示什麼操作都不做。設置空語句的目的,一是在未完成的程式設計模組中,暫時放一條空語句,留待以後對模組逐步求精實現時再增加語句;二是實現空迴圈等待;三是實現跳轉目標點等。例如:intmax(inta,intb)

/*求兩個整數的最大值*/{;

/*此處的空語句表示在以後添加內容,保證當前的程式正常運行*/}例如:實現空迴圈while(getchar()!=’\n’);/*此語句表示只要從鍵盤輸入的字元不是回車鍵則重新輸入*/例如:實現跳轉到目標點inti=0,sum=0;ex:;sum+=i++;if(x<100)gotoex;…空語句出現的位置是有限制的。預處理命令、函數頭和花括弧“}”之後都不允許出現空語句。注意

3.3輸入和輸出語句

3.3.1字元的輸入和輸出3.3.2格式化輸入和輸出

C語言不提供輸入和輸出語句,輸入和輸出通過調用C的標準庫函數來實現。C的標準函數庫中提供許多用於標準輸入和輸出的庫函數(附錄D),使用這些標準輸入和輸出庫函數時,要用預編譯命令“#include”將有關的“頭檔”包括到用戶原始檔案中。在調用標準輸入輸出庫函數時,檔開頭應有以下預編譯命令:

#include<stdio.h>或#include“stdio.h”其中,h為head之意,std為standard之意,i為input之意,o為output之意。

3.3.1字元的輸入和輸出

電腦的控制臺是鍵盤和顯示器,從控制臺輸入和輸出字元的最簡單的函數是getchar()和putchar()。

1.getchar函數使用格式:變數=getchar();功能:從鍵盤讀入一個字元,返回該字元的ASCII值,可以將該結果賦值給字元變數或整型變數,並自動將用戶擊鍵結果回顯到螢幕上。

2.putchar函數

使用格式:putchar(變數);功能:把字元寫到螢幕的當前游標位置。例3.1演示如何使用getchar()和putchar()函數。#include<stdio.h>main(){charc;c=getchar();/*從鍵盤讀入一個字元,按回車鍵結束輸入,該字元被存入變數c*/}

①getchar函數無參數,它從標準輸入設備(鍵盤)上讀入一個字元,直到輸入回車鍵才結束,回車前的所有輸入字元都會逐個顯示在螢幕上。函數值為從輸入設備輸入的第1個字元,空格、回車和Tab都能被讀入。②putchar函數的參數是待輸出的字元,這個字元可以是可列印字元,也可以是轉義字元。例如:putchar('\x42');

/*輸出字母B*/

putchar(0x42);

/*直接用ASCII碼值輸出字母B*/注意

3.3.2格式化輸入和輸出

前面的getchar和putchar函數形式簡單,使用方便,但只能輸入輸出一個字元,且不能定制輸入輸出格式。格式化輸入輸出函數既能輸入輸出各種類型的數據,又能定制輸入輸出格式。例3.2從螢幕上輸出一個整數。#include<stdio.h>main(){inta,b;a=10; b=20; printf("outputaandb:");

/*輸出雙引號中的字串*/

printf("a=%d,b=%d\n",a,b);

/*輸出a和b的值*/}輸出結果是:outputa:a=10,b=20

1.printf函數

格式:

printf(格式控制字串);或printf(格式控制字串,輸出表列);功能:向電腦系統默認的輸出設備輸出若干個任意類型的數據。例如:格式轉換說明符

printf("a=

%d

,b=

%d

\n",

a,b);

普通字元輸出表列一般情況下,格式控制字串包括兩種數據,一種是普通字元,這些字元在輸出時照原樣輸出;另一種是格式轉換說明符,用於控制要輸出的內容以何種方式進行輸出顯示,格式轉換說明符由“%”開始,並以一個格式字元結束。

表3-1

printf函數的格式轉換說明符

字元含義示例輸出結果d(或i)十進位整數inta=65;printf(“%d”,a);65u十進位無符號整數inta=65000;printf(“%u”,a);65000o八進制無符號整數inta=65;printf(“%o”,a);101x(或X)十六進制無符號整數inta=65;printf(“%x”,a);41c單一字元inta=65;printf(“%c”,a);As字串printf(“%s”,”Hello”);Hellof小數形式的浮點小數printf(“%f”,314.56);314.560000e(或E)指數形式的浮點小數printf(“%e”,314.56);3.145600e+002g(或G)e和f中較短的一種printf(“%g”,314.56);314.56%百分號本身printf(“%%”);%說明:①“輸出表列”是需要輸出的一些數據。可以是運算式,各個數據之間用逗號隔開。以下的printf函數都是合法的:printf("Iamastudent.\n"); printf("%d",3+2);

注意:輸出數據的數據類型與格式轉換說明符必須順序匹配,否則會引起輸出錯誤。如:printf("%d,%f",3.89,6);錯誤!②一般情況下,格式轉換說明符與輸出項個數相同。如果格式轉換說明符的個數大於輸出項的個數,則多餘的格式將輸出不定值。如果格式轉換說明符的個數小於輸出項的個數,則多餘的輸出項不輸出。例3.3有以下程式#include<stdio.h>main(){int

a=666,b=888;printf("%d\n",a,b);}程式的輸出結果是()。A)錯誤資訊 B)666

C)888 D)666,888思考:如果將輸出語句改為printf(“%d,%d\n”,a);輸出結果會怎樣?

格式转换说明符的完整形式如下:

%-0#m.nl或h格式字元

修飾字元含義英文字母l修飾d,u,o,x時,用於輸出long型數據修飾f,e,g時,用於輸出longdouble型數據英文字母h修飾d,o,x時,用於輸出short型數據最小域寬m指定輸出項輸出時所占列數,數據長度<m,左邊補空格;否則按實際寬度輸出顯示精度.n對於實數,指定小數位數(四捨五入)對於字串,指定從字串左側開始截取的子串字元個數-輸出數據在域內左對齊(默認右對齊)+指定在有符號數的正數前加正號(+)0輸出數值時,指定在左邊不使用的空位置自動填0#在八進制和十六進制數前顯示前導符0,0x例3.4printf函數修飾符的使用。#include<stdio.h>main(){inta=123;floaty=456.78;charch='A';chars[]="Programing";/*s為字元數組*/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);

}程式輸出結果

說明:在VisualC++中,調用printf函數時,float類型的參數是先轉化為double類型再傳遞的,所以%f可以輸出float和double兩種類型的數據,不必用%lf輸出double類型的數據。

2.scanf函數

格式:scanf(格式控制字串,地址表列);功能:從標準輸入設備(鍵盤)輸入若干個任意類型的數據。例如:scanf(

"%d

,

%f”,&a,&b

);地址表列格式控制字串分隔符號

表3-3

printf函數的格式轉換說明符

字元含義d或i輸入十進位整數u輸入無符號十進位整數o輸入八進制整數x輸入十六進制整數c輸入一個字元,空白字元(包括空格、回車、跳位字元)也作為有效字元輸入s輸入字串,遇到第一個空白字元(包括空格、回車、跳位字元)時結束f或e輸入實數,以小數或指數形式輸入均可%輸入一個%地址表列是由若干變數的地址組成的列表,參數之間用逗號隔開。函數scanf要求必須指定用來接收數據的地址,否則,雖然編譯程序不會出錯,但會導致數據不能正確地讀入指定的記憶體單元。對普通變數而言,可以在變數前使用“&”符號,用於取變數的地址,而對於指針變數而言,直接使用指針變數名稱即可。表3-4

scanf函數的修飾符修飾字元含義英文字母l修飾d,i,u,o,x時,用於輸入long型數據修飾f,e時,用於輸入double型數據英文字母h修飾d,i,o,x時,用於輸入short型數據域寬m指定輸入數據的寬度(列數),系統自動按此寬度截取所需數據忽略輸入修飾符*抑制符,表示對應的輸入項在讀入後不賦給相應的變數注:scanf函數沒有精度.n修飾符,即用scanf函數輸入實型數據時不能規定精度。輸入數據的分隔符號的指定:①一般以空格、TAB或回車符作為分隔符號(在格式控制符之間為空格、TAB或無任何符號時);②其他字元作為分隔符號:格式控制字串中兩個格式控制符之間的字元為上述三種字元以外的字元時,輸入數據時要原樣輸入。例如,輸入語句“scanf(“%d,%d”,&a,&b);”,要想在輸入數據後使a=3,b=4,則應輸入“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是數組名,表示地址*/ 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);}程式運行時的輸入輸出結果注意①從鍵盤輸入數據的個數應該與函數中輸入表列的項數相同,當兩者不相同時作如下處理:如果輸入數據個數少於scanf函數要求的個數時,函數將等待輸入,直到滿足要求或遇到非法字元為止。如果輸入數據個數多於scanf函數要求的個數時,多餘的數據將留在緩衝區作為下一次輸入操作的輸入數據。②在輸入數據時,遇到以下情況時認為該數據結束。遇到空格,或按回車鍵或按TAB鍵;按指定的寬度結束,如“%3d”,只取3列;遇到非法輸入。

3.4順序程式控制結構

順序結構是結構化程式設計的三種基本結構中最簡單的一種程式組織結構,其特點是完全按照語句出現的先後順序依次執行。BAAB(a)傳統流程圖

(b)NS流程圖程式自上而下執行,先執行A塊,再執行B塊。順序結構的程式主要由4部分組成:①變數說明部分。②數據輸入部分。③運算部分。④運算結果輸出部分。例3.6將任意小寫字母轉換為對應的大寫字母並輸出。#include<stdio.h>main(){ charc;

c=getchar(); c=c-32; putchar(c);}程式運行時,若輸入:h↙則輸出:H思考:如何判斷輸入的字元是否為小寫字母?(將在3.5中講解)例3.7從鍵盤輸入兩個變數的值,交換這兩個變數的值,並輸出。分析:假如我們將輸入的兩個變數定義為x和y,如果通過“x=y;y=x;”來實現交換,則當執行“x=y;”時,將y的值複製給x,此時x和y的值相等,x原來的值丟失,再執行“y=x;”時,將新的x值複製給y,結果x和y的值相等,都為原來y的值。為了不使x原來的值丟失,必須在執行“x=y;”之前,先把x的值放到一個臨時變數(temp)中保存起來,在執行了“x=y;後”,再把保存在臨時變數中的值賦給y(通過“y=temp;”來實現)。程式代碼:#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);}思考:如果不用臨時變數,能否使兩個變數得到交換呢?例3.8從鍵盤任意輸入一個三位數,要求輸出這個數的逆序數。如:輸入123,輸出321。分析:要輸出逆序數,則要將原數的個位、十位和百位數分離出來,再用“個位*100+十位*10+百位”求出逆序數。個位數字可用對10求餘得到,如123%10=3;最高位百位數字可用對100整除得到,如123/100=1;中間位的數字既可通過將其變換為最高位再整除的方法得到,如(123-1*100)/10=2;也可通過將其變換為最低位再求餘得到,如(123/10)%10=2。程式源代碼如下:#include<stdio.h>main(){ intx,y,b0,b1,b2;/*變數聲明*/ printf("Pleaseenteranintegerx:");/*提示用戶輸入一個整數*/ scanf("%d",&x);/*輸入一個整數*/ b0=x%10;/*求最低位*/

b1=(x/10)%10;/*求中間位*/ b2=x/100;/*求最高位*/ y=b0*100+b1*10+b2;/*求逆序數*/ printf("y=%d\n",y);/*輸出逆序數*/}程式的運行結果如下:Pleaseenteranintegerx:123↙y=321思考:是否還有其他方法分離個位、十位和百位數?

3.5選擇程式控制結構

對於要先做判斷再選擇的問題就要使用選擇結構(也稱為分支結構)。選擇結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。如:在數學中,要計算x的絕對值,根據絕對值定義,當x>=0時,其絕對值為x,而x<0時其絕對值是為-x。選擇結構分支條件通常用關係運算式或邏輯運算式來表示,實現程式流程的語句由C語言的if語句或switch語句來完成圖3-8選擇結構流程圖圖3-8表示,當條件P為真(成立)時執行A框,否則執行B框。無論P是否成立,只能執行A框或B框之一,不可能既執行A框又執行B框。無論走哪條路徑,在執行A框或B框之後,都脫離本選擇結構。

3.5.1if語句

1.單分支結構2.雙分支結構3.多分支結構1.單分支結構if形式:

if(運算式)語句S圖3-9單分支結構的流程圖執行過程:系統首先計算運算式的值,如果運算式結果不為0,則執行語句S,否則跳過語句S,繼續執行其後的其他語句。說明:①“if”是C語言的關鍵字;“運算式”可以任意合法的C語言運算式,可以是關係運算式或邏輯運算式,也可以是任意的數值類型(包括整型、實型、字元型等);運算式兩側的括弧不能省略。②語句S可以是一條語句,也可以是任意合法的複合語句,其位置比較靈活,可以直接出現在if同一行的後面,也可以出現在if的下一行。例3.9寫出以下程式執行後的輸出結果#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);}輸出結果為:503分析:程式第一行在定義a、b、c、t四個變數的同時進行了初始化。接下來第一個if語句的運算式a<b為假(0),if其後的語句“t=a;”不執行,值得注意的是“a=b;b=t;”不屬於if的語句,將被執行,執行後a值為3,b值為0;然後第二個if語句的運算式a<c為真,則執行語句“t=a;”,t值變為3,接著執行“a=c;”,a值變為5,再接著執行“c=t;”,c值變為3;因此,輸出結果為:503。例3.10計算並輸出一個整數的絕對值。分析:計算一個整數的絕對值的關鍵就是判斷該數是否小於0。#include<stdio.h>main(){ intx,y; scanf("%d",&x);/*輸入一個整數*/ y=x;/*x大於等於0時,y=x*/

if(x<0)y=-x;/*若x<0成立,y=-x*/

printf("y=%d\n",y);}

2.雙分支結構

if-else形式:

if(運算式)語句S1else語句S2圖3-10雙分支結構的流程圖執行過程:系統首先計算運算式的值,如果運算式結果不為0,則執行語句S1,否則,執行語句S2。選擇結構執行完成後繼續執行其後的其他語句。例如:求兩個數中的較大值,可用下麵的語句:if(a>b)max=a;elsemax=b;將例3.10用雙分支結構實現,程式代碼如下:#include<stdio.h>main(){intx,y;scanf("%d",&x);

/*輸入一個整數*/if(x<0)y=-x;/*若x<0成立,y=-x,否則y=x*/elsey=x;

printf("y=%d\n",y);}例3.11從鍵盤讀入一個字元,以與原來不同的形式進行輸出。分析:該題的意圖是實現英文字元的輸入輸出,所謂與與原來不同的形式是指原來輸入的是小寫字母,則轉換為對應的大寫字母並輸出;原來輸入的是大寫字母則轉換為對應的小寫字母並輸出。程式實現的步驟是:①從鍵盤輸入一個英文字元;②判斷該英文字元的大小寫,並轉換成對應的字母;③輸出轉換後的英文字元。該題的關鍵問題是怎樣將判斷字元的大小寫狀態和實現轉換。有兩種方式實現:一種是根據ASCII碼進行判斷和轉換,小寫字母比對應的大寫字母的ASCII碼大32。另一種方式是利用字元處理函數isupper(ch)判斷ch是否為大寫字母,是則返回1,否則返回0;islower(ch)函數判斷ch是否為小寫字母,是則返回1,否則返回0;toupper(ch)函數將ch轉換為大寫,tolower(ch)函數將ch轉換為小寫。注意,使用這四個函數需要包含頭檔ctype.h。用第一種方式實現的程式如下:#include<stdio.h>main(){ charch; ch=getchar();/*從鍵盤輸入一個英文字元*/

if(ch>='a'&&ch<='z')

/*判斷ch是否為小寫字母*/

ch=ch-32;

/*ch為小寫字母,將其轉換為大寫*/

else

ch=ch+32;

/*ch為大寫字母,將其轉換為小寫*/ putchar(ch);

/*輸出ch*/}運行時,輸入:a↙輸出:A思考:用字符處理函數怎樣實現程式?

3.多分支結構

if-else-if形式:if(運算式1)語句S1elseif(運算式2)語句S2…elseif(運算式n)語句Snelse語句Sn+1圖3-11雙分支結構的流程圖執行過程:if-else-if結構實際上是由多個if-else結構組合而成的,系統首先計算運算式1,其值為真(不為0)時,執行語句S1;否則,計算運算式2,其值為真(不為0)時,執行語句S2;…如果if後的所有運算式都不為真,則執行語句Sn+1,並結束整個分支結構。選擇結構執行完成後繼續執行其後的其他語句。例3.12從鍵盤輸入x的值,並通過如下的數學關係式求出相應的y值。分析:該題的意圖是根據輸入的x值,判斷x所屬的區間,求出y值並輸出。程式實現的步驟是:①從鍵盤輸入一個數;②判斷x所屬的區間,求出y值;③輸出結果。#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根據輸入的成績等級列印出評語,等級與評語的對應關係如下表:等級評語4Excellent3Good2Average1Poor0Failing分析:該題通過輸入成績的等級(0~4級),轉換為對應的評語,是典型的多分支結構,可以用if-else-if結構實現。具體實現步驟為:①輸入成績等級的數字;②對輸入的數字進行判斷,得到對應的評語;③輸出結果。#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語句。內層的if語句既可以嵌套在if子句中,也可以嵌套在else子句中。內嵌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從鍵盤輸入三個正整數,找出其中的最大數,並輸出這個數。流程圖如下:#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的配對關係。內嵌結構中,else總是與它上面最近的、未配對的if配對,組成一對if-else語句。②如果if與else的數目不一樣,為了避免在if與else配對時出錯,建議讀者使用“{}”來限定內嵌if語句的範圍。如下形式的嵌套語句:if(運算式1){if(運算式2)語句1}else語句2這裏,“{}”限定了內嵌if語句的範圍,因此else與第一個if配對。思考:如果沒有“{}”,else與哪個if配對?例3.15設變數a、b、c、d和y都已正確定義並賦值。若有以下if語句

if(a<b)if(c==d)y=0;elsey=1;該語句所表示的含義是()。A)B)C)D)

3.5.2switch語句

當問題的分支較多(一般大於3個),用if-else-if結構解決時由於分支過多,結構冗長,程式邏輯關係不清晰,通常使用開關語句(switch語句)來簡化程式設計。開關語句就像多路開關一樣,使程式控制流程形成多個分支,根據一個運算式可能產生的不同結果值,選擇其中的一個或幾個分支語句去執行。因此,它常用於各種分類統計、菜單等程式設計。switch語句的一般形式switch(運算式){case常量運算式1:語句1;break;case常量運算式2:語句2;break;…case常量運算式n:語句n;break;default:語句n+1;break;}switch結構流程圖執行過程:①計算switch後圓括號內運算式的值,然後用該值逐個與case後的常量運算式值進行比較。當找到相匹配的值時,就執行該case後面的語句。若所有case中的常量運算式的值都沒有與運算式的值匹配的,就執行default後面的語句。②執行完一個case後面的語句後,如果遇到break語句,則跳出switch語句;如果沒有break語句,程式轉到下一個case處繼續執行,並不再進行判斷。說明:①switch、case、default、break均是關鍵字。上述格式中花括弧括起來的部分稱為switch語句體。switch語句體中可以沒有break語句和default部分。②switch後的運算式可以是整型或字元型,不能為實型。每一個case後面的常量運算式的值必須互不相同,常量運算式中不能有變數。③default最多只有一個,位置任意。各個case和default的出現次序不影響執行結果。④多個case可以共用一組執行語句。例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語句實現。#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語句,程式運行的輸出結果有何變化?3.5.3案例研究:個人所得稅計算例3.18依法納稅是每個公民應盡的義務,我國於1980年9月頒佈施行個人所得稅法,開始徵收個人所得稅,同時確定了個稅800元的起征點。25年來,我國職工工資收入和居民消費價格指數都有較大提高,加之近年教育、住房、醫療等改革的深入,消費支出明顯增長,早已超過了個人

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论