《C語言程序設(shè)計(jì) 》課件第3章_第1頁
《C語言程序設(shè)計(jì) 》課件第3章_第2頁
《C語言程序設(shè)計(jì) 》課件第3章_第3頁
《C語言程序設(shè)計(jì) 》課件第3章_第4頁
《C語言程序設(shè)計(jì) 》課件第3章_第5頁
已閱讀5頁,還剩79頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第3章順序結(jié)構(gòu)程序設(shè)計(jì)3.1結(jié)構(gòu)化程序設(shè)計(jì)3.2C語句3.3賦值語句3.4數(shù)據(jù)輸入/輸出的概念及在C語言中的實(shí)現(xiàn)3.5字符數(shù)據(jù)的輸入與輸出3.6格式輸入與輸出3.7順序結(jié)構(gòu)程序?qū)嵗?/p>

3.1結(jié)構(gòu)化程序設(shè)計(jì)

3.1.1程序的三種基本結(jié)構(gòu)

通常的計(jì)算機(jī)程序總是由若干條語句組成的,從執(zhí)行方式上看,從第一條語句到最后一條語句完全按順序執(zhí)行,是簡單的順序結(jié)構(gòu);若在程序執(zhí)行過程中,根據(jù)用戶的輸入或中間結(jié)果去執(zhí)行若干不同的任務(wù)則為選擇結(jié)構(gòu);如果在程序的某處,需要根據(jù)某項(xiàng)條件重復(fù)地執(zhí)行某項(xiàng)任務(wù)若干次,直到滿足或不滿足某條件為止,這就構(gòu)成循環(huán)結(jié)構(gòu)。大多數(shù)情況下,程序都不會(huì)是簡單的順序結(jié)構(gòu),而是順序、選擇、循環(huán)三種結(jié)構(gòu)的復(fù)雜組合。

(1)順序結(jié)構(gòu)。順序結(jié)構(gòu)是簡單的線性結(jié)構(gòu),各框按順序執(zhí)行。其流程圖的基本形態(tài)如圖3-1所示,語句的執(zhí)行順序?yàn)椋篈→B→C。

(2)選擇(分支)結(jié)構(gòu)。這種結(jié)構(gòu)是對某個(gè)給定條件進(jìn)行判斷,條件為真或假時(shí)分別執(zhí)行不同的框的內(nèi)容。其基本形狀有兩種,分別如圖3-2(a)、(b)所示。圖3-2(a)的執(zhí)行序列為:當(dāng)條件為真時(shí)執(zhí)行A,否則執(zhí)行B;圖3-2(b)的執(zhí)行序列為:當(dāng)條件為真時(shí)執(zhí)行A,否則什么也不做。圖3-1順序結(jié)構(gòu)的流程圖圖3-2選擇(分支)結(jié)構(gòu)的流程圖

(3)循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)有兩種基本形態(tài):while(當(dāng))型循環(huán)和do-while(直到)型循環(huán)。

①while型循環(huán)。while型循環(huán)的流程圖如圖3-3所示。

其執(zhí)行序列為:當(dāng)條件為真時(shí),反復(fù)執(zhí)行A,一旦條件為假,跳出循環(huán),執(zhí)行循環(huán)后面的語句。

②do-while型循環(huán)。do-while型循環(huán)的流程圖如圖3-4所示。圖3-3

while型循環(huán)的流程圖圖3-4

do-while型循環(huán)的流程圖執(zhí)行序列為:首先執(zhí)行A,再判斷條件,條件為真時(shí),一直循環(huán)執(zhí)行A,一旦條件為假,結(jié)束循環(huán),執(zhí)行循環(huán)后面的下一條語句。

在圖3-3、圖3-4中,A被稱為循環(huán)體,條件被稱為循環(huán)控制條件。要注意的是:

a.在循環(huán)體中,必須對條件要判斷的值進(jìn)行修改,使得經(jīng)過有限次循環(huán)后,循環(huán)一定能結(jié)束。

b.當(dāng)型循環(huán)中循環(huán)體可能一次都不執(zhí)行,而直到型循環(huán)則至少執(zhí)行一次循環(huán)體。

c.直到型循環(huán)可以很方便地轉(zhuǎn)化為當(dāng)型循環(huán),而當(dāng)型循環(huán)不一定能轉(zhuǎn)化為直到型循環(huán)。例如,圖3-4可以轉(zhuǎn)化為圖3-5。

d.三種基本結(jié)構(gòu)的NS流程圖如圖3-6所示。圖3-5

do-while型循環(huán)轉(zhuǎn)換為while型循環(huán)圖3-6三種基本結(jié)構(gòu)的NS圖3.1.2結(jié)構(gòu)化程序設(shè)計(jì)的核心思想

結(jié)構(gòu)化程序設(shè)計(jì)的基本思想概括有三點(diǎn):

(1)采用順序、選擇和循環(huán)三種基本結(jié)構(gòu)作為程序設(shè)計(jì)的基本單元,這樣程序有以下四個(gè)特征:只有一個(gè)入口;只有一個(gè)出口;無死語句;無死循環(huán)。

(2)盡量避免使用goto語句,如果要使用,盡可能不使用多于一個(gè)goto的語句標(biāo)號;只在一個(gè)單入口單出口的程序模塊結(jié)構(gòu)內(nèi)使用goto語句,并且只往前跳轉(zhuǎn),不允許往后跳轉(zhuǎn)。

(3)采用“自頂向下、逐步求精”的程序設(shè)計(jì)方法。3.1.3自頂向下、逐步求精的程序設(shè)計(jì)方法

自頂向下、逐步求精的程序設(shè)計(jì)方法有以下幾個(gè)要點(diǎn):

(1)自頂向下(Top-Down):先整體再局部,把一個(gè)較大的問題分成幾個(gè)小問題(部分),再逐步求解,較小的問題還可以進(jìn)一步進(jìn)行分割。

(2)自底向上(Bottom-Up):先部分后整體,先編寫出基本的程序段,然后再將多個(gè)程序段組合成更大的部分,直至完成整個(gè)程序。

(3)大致步驟:

①對實(shí)際問題進(jìn)行全局分析,確定數(shù)學(xué)模型;

②確定程序的總體結(jié)構(gòu),將整個(gè)問題分解成若干相對獨(dú)立的子問題;

③確定子問題的具體功能及其相互關(guān)系;

④將子問題進(jìn)一步細(xì)化,直至能用高級語言表示為止。

3.2

C語句

圖3-7

C程序的結(jié)構(gòu)

C語言的語句用來向計(jì)算機(jī)發(fā)出操作指令,指揮、控制計(jì)算機(jī)執(zhí)行相應(yīng)的操作。在本書的前面章節(jié)已有介紹,一個(gè)C語言程序由多個(gè)函數(shù)構(gòu)成。每個(gè)函數(shù)都由聲明部分和執(zhí)行部分構(gòu)成。其中,執(zhí)行部分由語句構(gòu)成,可完成對數(shù)據(jù)的操作,程序的功能也是由執(zhí)行語句實(shí)現(xiàn)的。說明

(1)函數(shù)聲明部分的內(nèi)容不應(yīng)稱為語句,函數(shù)的執(zhí)行部分才稱為語句。

(2)C程序的預(yù)編譯命令不應(yīng)稱為C語言語句。

C語句可以分為以下五類:

(1)控制語句。

if()…else… 條件語句

for()… 循環(huán)語句

while()… 循環(huán)語句

do…while() 循環(huán)語句

continue 結(jié)束本次循環(huán)語句

break 中止switch或循環(huán)語句

switch 多分支選擇語句

goto 轉(zhuǎn)向語句

return 從函數(shù)返回語句

其中,()表示條件,…?表示內(nèi)嵌的語句。

(2)函數(shù)調(diào)用語句。如:

a=getchar();

/*該語句調(diào)用函數(shù)getchar()*/

(3)表達(dá)式語句。在表達(dá)式后面加分號就構(gòu)成表達(dá)式語句。任何表達(dá)式加上分號都可以成為語句,例如:

a=100;

/*由賦值表達(dá)式加分號構(gòu)成的賦值語句*/

a++;

都是一個(gè)語句,第一個(gè)語句的作用是使變量a的值等于100,第二個(gè)語句的作用是使變量a的值加1,即等于101。

但是,不是所有的表達(dá)式構(gòu)成的語句都有意義,如:

a+b;

是一個(gè)合法的語句,作用是完成a+b的操作,但是并不把a(bǔ)+b的結(jié)果賦給任何變量,即除了執(zhí)行運(yùn)算操作,不作其他任何操作。從實(shí)際的角度講,這樣的語句無實(shí)際意義。

(4)空語句。僅包含一個(gè)分號的語句稱為空語句。如:

;

程序在執(zhí)行這個(gè)語句時(shí),不進(jìn)行任何操作。

(5)復(fù)合語句。由大括號“{}”括起來的語句序列稱為復(fù)合語句。如:

{

a=1+2;

b=a+5;

printf("b=%d",b);

}

說明

(1)C語言語句的書寫沒有固定格式,一行中可以有多個(gè)語句,一個(gè)語句也可以在多行書寫,語句之間必須用分號分隔。

(2)一個(gè)語句必須在最后出現(xiàn)分號,分號是語句不可缺少的部分。如:

a=1;b=2;c=3; /*一行寫幾個(gè)語句*/

printf("Iama

student,\n"); /*一個(gè)語句分多行書寫*/ 3.3賦值語句

賦值語句是由賦值表達(dá)式再加上分號構(gòu)成的表達(dá)式語句。

其一般形式為

變量=表達(dá)式;

賦值語句的功能和特點(diǎn)都與賦值表達(dá)式相同。它是程序中使用最多的語句之一。在賦值語句的使用中需要注意以下幾點(diǎn):

(1)由于在賦值符“=”右邊的表達(dá)式又可以是一個(gè)賦值表達(dá)式,因此,下述形式

變量=(變量=表達(dá)式);

是成立的,從而形成嵌套的情形。

其展開之后的一般形式為

變量=變量=…=表達(dá)式;

例如:

a=b=c=d=e=5;

按照賦值運(yùn)算符的右結(jié)合性,以上語句實(shí)際上等效于:

e=5;

d=e;

c=d;

b=c;

a=b;

(2)注意在變量說明中給變量賦初值和賦值語句的區(qū)別。給變量賦初值是變量說明的一部分,賦初值后的變量與其后的其他同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結(jié)尾。例如:

inta=5,b,c;

(3)在變量說明中,不允許連續(xù)給多個(gè)變量賦初值。如下述說明是錯(cuò)誤的:

inta=b=c=5;

必須寫為

inta=5,b=5,c=5;

而賦值語句允許連續(xù)賦值。

(4)注意賦值表達(dá)式和賦值語句的區(qū)別。賦值表達(dá)式是一種表達(dá)式,它可以出現(xiàn)在任何允許表達(dá)式出現(xiàn)的地方,而賦值語句則不能。下述語句是合法的:

if((x=y+5)>0)z=x;

該語句的功能是:若表達(dá)式x=y+5大于0,則z=x。

下述語句是非法的:

if((x=y+5;)>0)z=x;

因?yàn)椤皒=y+5;”是語句,不能出現(xiàn)在表達(dá)式中。說明

(1)“=”號還可以是組合賦值號,如?+=、-=、*=、/=、%=?等。

(2)賦值語句由賦值表達(dá)式構(gòu)成,后面一定要跟分號。

(3)“=”具有方向性(向左),它與數(shù)學(xué)上的等號含義不同。數(shù)學(xué)上的等號在C中用?==號表示。如a=a+1在數(shù)學(xué)上不合法,但在C語言中卻是合法的。

(4)表達(dá)式值的類型最好與等號左邊的變量類型一致,否則系統(tǒng)自動(dòng)將右側(cè)表達(dá)式類型轉(zhuǎn)換成左側(cè)變量的類型。如x類型為int,則執(zhí)行“x=5.6;”后,x值為5(不四舍五入)。

(5)格式中的表達(dá)式可以包含另一個(gè)賦值表達(dá)式。如執(zhí)行“a=b=c=1;”后,a、b、c的值均為1。

3.4數(shù)據(jù)輸入/輸出的概念及在C語言中的實(shí)現(xiàn)

所謂輸入/輸出,是以計(jì)算機(jī)為主體而言的。本章介紹的是向標(biāo)準(zhǔn)輸出設(shè)備顯示器輸出數(shù)據(jù)的語句。

在C語言中,所有的數(shù)據(jù)輸入/輸出都是由庫函數(shù)完成的,因此都是函數(shù)語句。在使用C語言庫函數(shù)時(shí),要用預(yù)編譯命令

#include

將有關(guān)“頭文件”包括到源文件中。使用標(biāo)準(zhǔn)輸入/輸出庫函數(shù)時(shí)要用到“stdio.h”文件,因此源文件開頭應(yīng)有以下預(yù)編譯命令:

#include<stdio.h>

#include"stdio.h"

stdio是standardinput&outupt的意思。

考慮到printf和scanf函數(shù)使用頻繁,系統(tǒng)允許在使用這兩個(gè)函數(shù)時(shí)不加

#include<stdio.h>

#include"stdio.h"

3.5字符數(shù)據(jù)的輸入與輸出

3.5.1putchar函數(shù)(字符輸出函數(shù))

putchar函數(shù)是字符輸出函數(shù),其功能是在顯示器上輸出單個(gè)字符。

其一般形式為

putchar(字符變量);

例如:

putchar('A'); (輸出大寫字母A)

putchar(x); (輸出字符變量x的值)

putchar('\101'); (也是輸出字符A)

putchar('\n'); (換行)對控制字符則執(zhí)行控制功能,不在屏幕上顯示。

使用本函數(shù)前必須用文件包含命令:

#include<stdio.h>

#include"stdio.h"

【例3.1】

輸出單個(gè)字符。

程序如下:

#include<stdio.h>

main(){

chara=‘B’,b=‘o’,c=‘k’; /*定義字符變量a,b,c*/

putchar(a);putchar(b);putchar(b);putchar(c);putchar(‘\t’);

putchar(a);putchar(b);

putchar(‘\n’);

putchar(b);putchar(c);

}

程序運(yùn)行結(jié)果:

Book↙

Bo↙

ok3.5.2

getchar函數(shù)(鍵盤輸入函數(shù))

getchar函數(shù)的功能是從鍵盤上輸入一個(gè)字符。

其一般形式為

getchar();

通常把輸入的字符賦予一個(gè)字符變量,構(gòu)成賦值語句,如:

charc;

c=getchar();

【例3.2】

輸入單個(gè)字符。

程序如下:

#include<stdio.h>

voidmain(){

charc;

printf(“inputacharacter\n”);

c=getchar();

putchar(c);

}

程序運(yùn)行結(jié)果:

inputacharacter:↙

j↙

j說明

(1)getchar函數(shù)只能接收單個(gè)字符,輸入的數(shù)字也按字符處理。輸入多于一個(gè)字符時(shí),只接收第一個(gè)字符。

(2)使用本函數(shù)前必須包含文件“stdio.h”。

(3)在TC屏幕下運(yùn)行含本函數(shù)的程序時(shí),將退出TC屏幕而進(jìn)入用戶屏幕等待用戶輸入。輸入完畢再返回TC屏幕。

(4)程序最后兩行可用下面兩行的任意一行代替:

putchar(getchar());

printf("%c",getchar()); 3.6格式輸入與輸出

3.6.1

printf函數(shù)(格式輸出函數(shù))

printf函數(shù)稱為格式輸出函數(shù),其關(guān)鍵字最末一個(gè)字母f即為“格式”(format)之意。其功能是按用戶指定的格式,把指定的數(shù)據(jù)顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個(gè)函數(shù)。

1.printf函數(shù)調(diào)用的一般形式

printf函數(shù)是一個(gè)標(biāo)準(zhǔn)庫函數(shù),它的函數(shù)原型在頭文件“stdio.h”中。但作為一個(gè)特例,不要求在使用printf函數(shù)之前必須包含stdio.h文件。

printf函數(shù)調(diào)用的一般形式為

printf

("格式控制字符串",輸出表列)其中,格式控制字符串用于指定輸出格式,可由格式字符串和非格式字符串組成。格式字符串是以%開頭的字符串,在%后面跟有各種格式字符,以說明輸出數(shù)據(jù)的類型、形式、長度、小數(shù)位數(shù)等。如:

“%d”表示按十進(jìn)制整型輸出;

“%ld”表示按十進(jìn)制長整型輸出;

“%c”表示按字符型輸出。

非格式字符串在輸出時(shí)原樣照搬,在顯示中起提示作用。

輸出表列中給出了各個(gè)輸出項(xiàng),要求格式字符串和各輸出項(xiàng)在數(shù)量和類型上應(yīng)該一一對應(yīng)。

【例3.3】printf函數(shù)的應(yīng)用。

程序如下:

main()

{

inta=88,b=89;

printf(“%d%d\n”,a,b);

printf(“%d,%d\n”,a,b);

printf(“%c,%c\n”,a,b);

printf(“a=%d,b=%d”,a,b);

}

程序運(yùn)行結(jié)果:

88

89↙

88,

89↙

X,

Y↙

a=88,b=89說明

本例中四次輸出了a、b的值,但由于格式控制串不同,輸出的結(jié)果也不相同。第四行的輸出語句格式控制串中,兩格式串%d之間加了一個(gè)空格(非格式字符),所以輸出的a、b值之間有一個(gè)空格。第五行的printf語句格式控制串中加入的是非格式字符逗號,因此輸出的a、b值之間加了一個(gè)逗號。第六行的格式串要求按字符型輸出a、b值。第七行中為了提示輸出結(jié)果,又增加了非格式字符串。

2.格式字符串

在C語言中格式字符串的一般形式為

[標(biāo)志][輸出最小寬度][.精度][長度]類型

其中,方括號?[]?中的項(xiàng)為可選項(xiàng)。

各項(xiàng)的意義介紹如下:

(1)類型。類型字符用以表示輸出數(shù)據(jù)的類型,其格式符和意義如表3-1所示。

(3)輸出最小寬度。此項(xiàng)用十進(jìn)制整數(shù)來表示輸出的最少位數(shù)。若實(shí)際位數(shù)多于定義的寬度,則按實(shí)際位數(shù)輸出;若實(shí)際位數(shù)少于定義的寬度,則補(bǔ)以空格或0。

(4)精度。精度格式符以“?.?”開頭,后跟十進(jìn)制整數(shù)。本項(xiàng)的意義是:如果輸出的是數(shù)字,則表示小數(shù)的位數(shù);如果輸出的是字符,則表示輸出字符的個(gè)數(shù);若實(shí)際位數(shù)大于所定義的精度數(shù),則截去超過的部分。

(5)長度:長度格式符為h、l兩種,h表示按短整型量輸出,l表示按長整型量輸出。

【例3.4】格式字符串的使用1。

程序如下:

main()

{

inta=15;

floatb=123.1234567;

doublec=12345678.1234567;

chard=‘p’;

printf(“a=%d,%5d,%o,%x\n”,a,a,a,a);

printf(“b=%f,%lf,%5.4lf,%e\n”,b,b,b,b);

printf(“c=%lf,%f,%8.4lf\n”,c,c,c);

printf("d=%c,%8c\n",d,d);

}程序運(yùn)行結(jié)果:

a=15, 15,17,f↙

b=123.123459,123.123459,123.1235,1.231235e+002↙

c=12345678.123457,12345678.123457,12345678.1235↙

d=p, p↙

說明

本例第七行中以四種格式輸出整型變量a的值,其中“%5d”要求輸出寬度為5,而a值為15,只有兩位,故補(bǔ)三個(gè)空格。第八行中以四種格式輸出實(shí)型量b的值。其中“%f”和“%lf”格式的輸出相同,說明“l(fā)”符對“f”類型無影響?!?5.4lf”指定輸出寬度為5,精度為4,由于實(shí)際長度超過5,故應(yīng)該按實(shí)際位數(shù)輸出,小數(shù)位數(shù)超過4位部分被截去。第九行輸出雙精度實(shí)數(shù),“%8.4lf”指定精度為4位,故截去了超過4位的部分。第十行輸出字符量d,其中“%8c”指定輸出寬度為8,故在輸出字符p之前補(bǔ)加7個(gè)空格。使用printf函數(shù)時(shí)還要注意一個(gè)問題,那就是輸出表列中的求值順序。此順序?qū)τ诓煌木幾g系統(tǒng)不一定相同,可以從左到右,也可從右到左。C語言是按從右到左進(jìn)行的。請看下面兩個(gè)例子。

【例3.5】格式字符串的使用2。

程序如下:

main(){

inti=8;

printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);

}

程序運(yùn)行結(jié)果:

8↙

7↙

8↙

8↙

-8↙

-8↙

【例3.6】格式字符串的使用3。

程序如下:

main(){

inti=8;

printf(“%d\n”,++i);

printf(“%d\n”,--i);

printf(“%d\n”,i++);

printf(“%d\n”,i--);

printf(“%d\n”,-i++);

printf("%d\n",-i--);

}程序運(yùn)行結(jié)果:

9↙

8↙

8↙

9↙

-8↙

-9↙

說明

這兩個(gè)程序中,例3.5程序用一個(gè)printf語句輸出,例3.6程序用多個(gè)printf語句輸出。但從結(jié)果可以看出是不同的。為什么結(jié)果會(huì)不同呢?就是因?yàn)閜rintf函數(shù)對輸出表中各量求值的順序是自右至左進(jìn)行的。在例3.5中,先對最后一項(xiàng)“-i--”求值,結(jié)果為-8,然后i自減1后為7。再對“-i++”項(xiàng)求值得?-7,然后i自增1后為8。再對“i--”項(xiàng)求值得8,然后i再自減1后為7。再求“i++”項(xiàng)得7,然后i再自增1后為8。再求“--i”項(xiàng),i先自減1后輸出,輸出值為7。最后才求輸出表列中的第一項(xiàng)“++i”,此時(shí)i自增1后輸出8。

但是必須注意,求值順序雖是自右至左,但是輸出順序還是從左至右,因此得到的結(jié)果是上述輸出結(jié)果。3.6.2

scanf函數(shù)(格式輸入函數(shù))

scanf函數(shù)稱為格式輸入函數(shù),即按用戶指定的格式從鍵盤上把數(shù)據(jù)輸入到指定的變量之中。

1.scanf函數(shù)的一般形式

scanf函數(shù)是一個(gè)標(biāo)準(zhǔn)庫函數(shù),它的函數(shù)原型在頭文件“stdio.h”中。與printf函數(shù)相同,C語言也允許在使用scanf函數(shù)之前不必包含stdio.h文件。

scanf函數(shù)的一般形式為

scanf("格式控制字符串",地址表列);其中,格式控制字符串的作用與printf函數(shù)的相同,但它不能顯示非格式字符串,也就是不能顯示提示字符串。地址表列中給出各變量的地址。地址是由地址運(yùn)算符“&”后跟變量名組成的。例如:

&a,&b

分別表示變量a和變量b的地址。這個(gè)地址就是編譯系統(tǒng)在內(nèi)存中給a、b變量分配的地址。在C語言中,使用了地址這個(gè)概念,這是與其他語言不同的。應(yīng)該把變量的值和變量的地址這兩個(gè)不同的概念區(qū)別開來。變量的地址是C編譯系統(tǒng)分配的,用戶不必關(guān)心具體的地址是多少。變量的地址和變量值的關(guān)系如下:

在賦值表達(dá)式中給變量賦值,如:

a=567

則a為變量名,567是變量的值,&a是變量a的地址。但在賦值號左邊是變量名,不能寫地址。而scanf函數(shù)在本質(zhì)上也是給變量賦值,但要求寫變量的地址,如?&a。這兩者在形式上是不同的。&是一個(gè)取地址運(yùn)算符,&a是一個(gè)表達(dá)式,其功能是求變量的地址。

【例3.7】scanf函數(shù)的應(yīng)用。

程序如下:

main(){

inta,b,c;

printf(“inputa,b,c\n”);

scanf(“%d%d%d”,&a,&b,&c);

printf("a=%d,b=%d,c=%d",a,b,c);

}

說明

在本例中,由于scanf函數(shù)本身不能顯示提示串,故先用printf語句在屏幕上輸出提示,請用戶輸入a、b、c的值。執(zhí)行scanf語句,則退出TC屏幕進(jìn)入用戶屏幕,等待用戶輸入。用戶輸入“789”后按下回車鍵,此時(shí),系統(tǒng)又將返回TC屏幕。在scanf語句的格式串中由于沒有非格式字符在“%d%d%d”之間作輸入時(shí)的間隔,因此在輸入時(shí)要用一個(gè)以上的空格或回車鍵作為每兩個(gè)輸入數(shù)之間的間隔,如:

789

7

8

9

2.格式字符串

格式字符串的一般形式為

%[*][輸入數(shù)據(jù)寬度][長度]類型

其中,有方括號?[]?的項(xiàng)為任選項(xiàng)。各項(xiàng)的意義如下:

(1)類型:表示輸入數(shù)據(jù)的類型,其格式符和意義如表3-3所示。

(2)“?*?”符:用以表示該輸入項(xiàng)讀入后不賦予相應(yīng)的變量,即跳過該輸入值。如:

scanf("%d%*d%d",&a,&b);

當(dāng)輸入為“123”時(shí),把1賦予a,2被跳過,3賦予b。

(3)輸入數(shù)據(jù)寬度:用十進(jìn)制整數(shù)指定輸入數(shù)據(jù)的寬度(即字符數(shù))。例如:

scanf("%5d",&a);

若輸入“12345678”,則只把12345賦予變量a,其余部分被截去。

又如:

scanf("%4d%4d",&a,&b);

若輸入“12345678”,則把1234賦予a,而把5678賦予b。

(4)長度:長度格式符為l和h,l表示輸入長整型數(shù)據(jù)(如%ld)和雙精度浮點(diǎn)數(shù)(如%lf),h表示輸入短整型數(shù)據(jù)。

使用scanf函數(shù)還必須注意以下幾點(diǎn):

(1)scanf函數(shù)中沒有精度控制,如“scanf(”%5.2f“,&a);”是非法的,不能用此語句輸入小數(shù)為2位的實(shí)數(shù)。

(2)scanf中要求給出變量地址,只給出變量名會(huì)出錯(cuò)。如“scanf(”%d“,a);”是非法的,應(yīng)改為“scnaf(”%d“,&a);”才是合法的。

(3)在輸入多個(gè)數(shù)值數(shù)據(jù)時(shí),若格式控制串中沒有非格式字符作輸入數(shù)據(jù)之間的間隔,則可用空格、Tab或回車作間隔。C編譯程序在碰到空格、Tab、回車或非法數(shù)據(jù)(如對“%d”輸入“12A”時(shí),A即為非法數(shù)據(jù))時(shí)即認(rèn)為該數(shù)據(jù)結(jié)束。

(4)在輸入字符數(shù)據(jù)時(shí),若格式控制串中無非格式字符,則認(rèn)為所有輸入的字符均為有效字符。例如:

scanf(“%c%c%c”,&a,&b,&c);

若輸入為

def

則把?‘d’?賦予a,‘’?賦予b,‘e’?賦予c。

只有當(dāng)輸入為

def

時(shí),才能把?‘d’?賦于a,‘e’?賦予b,‘f’?賦予c。

如果在格式控制中加入空格作為間隔,如:

scanf("%c%c%c",&a,&b,&c);

則輸入時(shí)各數(shù)據(jù)之間可加空格。

【例3.8】scanf函數(shù)的格式控制應(yīng)用1。

程序如下:

main(){

chara,b;

printf(“inputcharactera,b\n”);

scanf(“%c%c”,&a,&b);

printf("%c%c\n",a,b);

}

說明

由于scanf函數(shù)?"%c%c"?中沒有空格,因此若輸入“MN”,輸出結(jié)果只有“M”。若輸入改為“MN”,則可輸出“MN”兩字符。

【例3.9】scanf函數(shù)的格式控制應(yīng)用2。

程序如下:

main(){

chara,b;

printf(“inputcharactera,b\n”);

scanf(“%c%c”,&a,&b);

printf("\n%c%c\n",a,b);

}

說明

本例中scanf格式控制串?"%c%c"?之間有空格,則輸入的數(shù)據(jù)之間可以有空格間隔。如果格式控制串中有非格式字符,則輸入時(shí)也要輸入該非格式字符。例如:

scanf("%d,%d,%d",&a,&b,&c);

其中用非格式符“,”作間隔符,故輸入時(shí)應(yīng)為

5,6,7

又如:

scanf("a=%d,b=%d,c=%d",&a,&b,&c);

則輸入應(yīng)為

a=5,b=6,c=7

如輸入的數(shù)據(jù)與輸出的類型不一致,雖然編譯能夠通過,但結(jié)果將不正確。

【例3.10】scanf函數(shù)的格式控制應(yīng)用3。

程序如下:

main(){

inta;

printf(“inputanumber\n”);

scanf(“%d”,&a);

printf(“%ld”,a);

}

程序運(yùn)行結(jié)果:

inputanumber:

1234567890

722

說明

由于輸入數(shù)據(jù)類型為整型,而輸出語句的格式串中說明為長整型,因此輸出結(jié)果和輸入數(shù)據(jù)不符。如改動(dòng)程序如下:

【例3.11】scanf函數(shù)的格式控制應(yīng)用4。

程序如下:

main(){

longa;

printf(“inputalonginteger\n”);

scanf(“%ld”,&a);

printf("%ld",a);

}

程序運(yùn)行結(jié)果:

inputalonginteger

1234567890

1234567890

當(dāng)輸入數(shù)據(jù)改為長整型后,輸入、輸出數(shù)據(jù)相等。

【例3.12】

輸入三個(gè)小寫字母,輸出其ASCII碼和對應(yīng)的大寫字母。

程序如下:

main(){

chara,b,c;

printf("inputcharactera,b,c\n");

scanf("%c%c%c",&a,&b,&c);

printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);

}

程序運(yùn)行結(jié)果:

inputcharactera,b,c↙

abc↙

97,98,99↙

A,B,C↙

說明

在ASCII碼中,小寫字母正好比大寫字母大32。

【例3.13】

輸出各種數(shù)據(jù)類型的字節(jié)長度。

程序如下:

main(){

inta;

longb;

floatf;

doubled;

charc;

printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));

}程序運(yùn)行結(jié)果:

int:4↙

long:4↙

float:4↙

double:8↙

char:1↙

說明

在VC++?中,int整型長度為4字節(jié),sizeof(k)為求數(shù)據(jù)k的字節(jié)數(shù)的函數(shù)。

3.7順序結(jié)構(gòu)程序?qū)嵗?/p>

【例3.14】

輸入正方形的邊長,計(jì)算正方形的周長。

分析:

要計(jì)算機(jī)出正方形的周長,需要以下步驟:

①輸入邊長;

②運(yùn)行公式計(jì)算出周長;

③輸出周長值。

根據(jù)以上分析,畫出計(jì)算正方形周長程序的流程圖如圖3-8所示。圖3-8例3.14流程圖輸入數(shù)據(jù)可以使用scanf函數(shù);計(jì)算周長可以使用算術(shù)表達(dá)式;顯示周長可以使用printf函數(shù)。根據(jù)流程圖,可以編寫出如下程序:

main()

{

floatx;

printf(“請輸入正方形的邊長:”);

scanf(“%f”,&x); /*輸入正方形的邊長*/

x=4*x; /*計(jì)算正方形的周長*/

printf(“正方形的周長是:%f\n”,x); /*顯示周長*/

}

運(yùn)行程序時(shí),如果輸入5,屏幕顯示如下信息:

請輸入正方形的邊長:5↙

正方形的周長是:25.000000

【例3.15】

輸入兩個(gè)整數(shù)給變量x和y,然后輸出x和y的值,交換x和y的值后再輸出x和y的值。

分析:

完成本題需要4個(gè)步驟:

①輸入兩個(gè)整數(shù)給x和y;

②輸出x和y;

③交換x和y的值;

④輸出x和y。

根據(jù)以上分析,可畫出程序的流程圖如圖3-9所示。

輸入、輸出可以使用printf函數(shù)和scanf函數(shù)完成;交換變量x和y的值可以先把x的值保存在另一個(gè)變量t中,再把y的值賦給x,最后把t的值賦給y。根據(jù)流程圖3-9,容易寫出如下程序:圖3-9例3.15流程圖

main()

{

intt,x,y;/*變量t為中間變量*/

printf(“請輸入兩個(gè)整數(shù):”);

scanf(“%d%d”,&x,&y);

printf(“交換前:x=%dy=%d\n”,x,y);

t=x;

x=y;

y=t;

printf("交換后:x=%dy=%d\n",x,y);

}程序運(yùn)行時(shí),屏幕顯示如下信息:

請輸入兩個(gè)整數(shù):56↙

交換前:x=5y=6

交換后:x=6y=5程序第7行至第9行的作用是交換x和y的值,請注意分析這個(gè)程序段各條語句的作用。交換x和y值不能簡單地用“x=y;”和“y=x;”這兩條語句,如果沒有把x存放的數(shù)據(jù)保存到其他變量,就執(zhí)行“x=y;”語句,把y的值賦給x,將使x和y具有相同的值,丟失x中原來的值,也就無法實(shí)現(xiàn)兩個(gè)數(shù)值的交換了。

提示:讀者可以思考一下交換兩個(gè)變量值的其他算法,如兩兩異或。

【例3.16】計(jì)算一元二次方程ax2?+?bx?+?c?=?0的實(shí)根,a、b、

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論