第3章程序設(shè)計初步_第1頁
第3章程序設(shè)計初步_第2頁
第3章程序設(shè)計初步_第3頁
第3章程序設(shè)計初步_第4頁
第3章程序設(shè)計初步_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第3章 程序設(shè)計初步第4章 函數(shù)與預(yù)處理第5章 數(shù)組第6章 指針第7章 自定義數(shù)據(jù)類型第2篇面向過程的程序設(shè)計第3章 程序設(shè)計初步3.1 面向過程的程序設(shè)計和算法3.2 +程序和語句3.3 賦值語句3.4 C+的輸入與輸出3.5 編寫順序結(jié)構(gòu)的程序3.6 關(guān)系運算和邏輯運算3.7 選擇結(jié)構(gòu)和語句3.8 條件運算符和條件表達式3.9 多分支選擇結(jié)構(gòu)和switch語句3.10 編寫選擇結(jié)構(gòu)的程序3.11 循環(huán)結(jié)構(gòu)和循環(huán)語句3.12 循環(huán)的嵌套3.13 break語句和continue語句3.14 編寫循環(huán)結(jié)構(gòu)的程序(1)方法與算法,)方法與算法,程序結(jié)構(gòu)與語句程序結(jié)構(gòu)與語句(哪些語句?);(哪些語

2、句?);(2)輸入、輸出)輸入、輸出的實現(xiàn)?的實現(xiàn)?(3)基本程序結(jié))基本程序結(jié)構(gòu)(順序、條件分構(gòu)(順序、條件分支、循環(huán))如何實支、循環(huán))如何實現(xiàn)?現(xiàn)?在面向過程的程序設(shè)計中,程序設(shè)計者必須指定計算機執(zhí)行的具體步驟,清晰程序要“做什么”清晰“怎么做”,并寫出一個個語句,安排好它們的執(zhí)行順序。步驟要合理,保證它的正確性和具有較高的效率,這就是算法(algorithm)需要解決的問題。3.1 面向過程的程序設(shè)計和算法一個面向過程的程序應(yīng)包括以下兩方面內(nèi)容:(1) 對數(shù)據(jù)的描述。在程序中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)(data structure)。(2) 對操作的描述。即操作步驟,也

3、就是算法(algorithm)。算法是處理問題的一系列的步驟。對于面向過程的程序,可以用下面的公式表示: 程序=算法+數(shù)據(jù)結(jié)構(gòu) 如:處理的數(shù)據(jù)如何讀入與存放?如何處理?結(jié)果如何存放與輸出?必須考慮與設(shè)計清晰!3.1.1 算法的概念(3)算法可分為兩大類別:數(shù)值算法和非數(shù)值算法。數(shù)值算法的目的是求數(shù)值解。非數(shù)值算法包括的面十分廣泛,最常見的是用于事務(wù)管理領(lǐng)域。C+既支持面向過程的程序設(shè)計,又支持面向?qū)ο蟮某绦蛟O(shè)計。無論面向過程的程序設(shè)計還是面向?qū)ο蟮某绦蛟O(shè)計,都離不開算法設(shè)計。相對內(nèi)存,處理的數(shù)據(jù)如何進行輸入和輸出?輸入和輸出并不是C+語言中的正式組成成分。C和C+本身都沒有為輸入和輸出提供專門

4、的語句結(jié)構(gòu)。輸入輸出不是由C+本身定義的,而是在編譯系統(tǒng)提供的I/O庫中定義的。C+的輸出和輸入是用“流”(stream)的方式實現(xiàn)的。圖3.2和圖3.3表示C+通過流進行輸入輸出的過程。3.4 C+的輸入與輸出圖3.2圖3.3有關(guān)流對象cin、cout和流運算符的定義等信息是存放在C+的輸入輸出流庫中的,因此使用cin、cout和流運算符,就必須: #include 為了敘述方便,常常把由cin和流提取運算符“”實現(xiàn)輸入的語句稱為輸入語句或cin語句;把由cout和流插入運算符“”實現(xiàn)輸出的語句稱為輸出語句或cout語句。流運算符相當于一個輸入或輸出函數(shù),由對象調(diào)用之。cout語句的一般格式

5、為 cout表達式1表達式2變量1變量2變量n;輸出流中的數(shù)據(jù)在系統(tǒng)默認的設(shè)備(一般為顯示器)輸出。*3.4.1 輸入流與輸出流的基本操作有時為了輸入輸出特殊的要求,如在輸出實數(shù)時規(guī)定字段寬度,只保留兩位小數(shù),數(shù)據(jù)向左或向右對齊等。C+提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符),見書中表3.1。P.53需要注意的是: 如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。具體自學!舉例: 輸出雙精度數(shù)。*3.4.2 在輸入流與輸出流中使用控制符double a=123.456789012345;對a賦初值(1) couta;輸出: 123.

6、456 默認為精度6(2) coutsetprecision(9)a;輸出: 123.456789 (3) coutsetprecision(6);恢復(fù)默認格式(精度為6)(4) cout setiosflags(ios fixed);輸出: 123.456789(5) coutsetiosflags(ios fixed)setprecision(8)a;輸出: 123.45678901(6) coutsetiosflags(ios scientific)a;輸出: 1.234568e+02(7) coutsetiosflags(ios scientific)setprecision(4)a;

7、 輸出: 1.2346e02下面是整數(shù)輸出的例子: int b=123456;對b賦初值(1) coutb;輸出: 123456(2) couthexb; 輸出: 1e240 (3) coutsetiosflags(ios uppercase)b;輸出: 1E240 (4) coutsetw(10)b,b; 輸出: 123456,123456(5) coutsetfill(*)setw(10)b;輸出: * 123456(6) coutsetiosflags(ios showpos)b;輸出: +123456如果在多個cout語句中使用相同的setw(n),并使用setiosflags(ios

8、 right),可以實現(xiàn)各行數(shù)據(jù)右對齊,如果指定相同的精度,可以實現(xiàn)上下小數(shù)點對齊。例3.1 各行小數(shù)點對齊。#include #include using namespace std;int main( ) double a=123.456,b=3.14159,c=-3214.67; coutsetiosflags(ios fixed)setiosflags(ios right)setprecision(2); coutsetw(10)aendl; coutsetw(10)bendl; coutsetw(10)cendl; return 0; 輸出如下: 123.46 (字段寬度為10,右對

9、齊,取兩位小數(shù)) 3.14 -3214.67先統(tǒng)一設(shè)置定點形式輸出、取兩位小數(shù)、右對齊。這些設(shè)置對其后的輸出均有效(除非重新設(shè)置),而setw只對其后一個輸出項有效,因此必須在輸出a,b,c之前都要寫setw(10)。C+中用于輸入和輸出單個字符的函數(shù):其中最常用的有g(shù)etchar函數(shù)和putchar函數(shù)。1. putchar函數(shù)(字符輸出函數(shù))putchar函數(shù)的作用是向終端輸出一個字符。例如putchar(c);它輸出字符變量的值。3.4.3 用getchar和putchar 函數(shù)進行字符的輸入和輸出例3.2 輸出單個字符。#include /或者包含頭文件stdio.h: #includ

10、e using namespace std;int main( )char a,b,c; a=B;b=O;c=Y; putchar(a);putchar(b);putchar(c);putchar(n); putchar(66);putchar(79);putchar(89);putchar(10); return 0;運行結(jié)果為BOYBOY可以看到: 用putchar可以輸出轉(zhuǎn)義字符,putchar(n)的作用是輸出一個換行符,使輸出的當前位置移到下一行的開頭。putchar(66)的作用是將66作為ASCII碼轉(zhuǎn)換為字符輸出,66是字母B的ASCII碼,因此putchar(66)輸出字母B

11、。其余類似。putchar(10)中的10是換行符的ASCII碼,putchar(10)輸出一個換行符,作用與putchar(n) 相同。也可以輸出其他轉(zhuǎn)義字符,如 putchar(015) (輸出回車,不換行,使輸出的當前位置移到本行開頭)2. getchar函數(shù)(字符輸入函數(shù))此函數(shù)的作用是從終端輸入一個字符。其一般形式為getchar( ),函數(shù)的值就是從輸入設(shè)備得到的字符。例3.3 輸入單個字符。#include using namespace std;int main( )char c; c=getchar( ); putchar(c+32); putchar(n); return

12、0; 在運行時,如果從鍵盤輸入大寫字母A并按回車鍵,就會在屏幕上輸出小寫字母a。請注意,getchar( )只能接收一個字符。getchar函數(shù)得到的字符可以賦給一個字符變量或整型變量,也可以不賦給任何變量,作為表達式的一部分。例3.5 求方程ax2+bx+c=0的根。a,b,c由鍵盤輸入。#include #include /! using namespace std;int main( )float a,b,c,x1,x2; cinabc; x1=(-b+sqrt(b*b-4*a*c)/(2*a); x2=(-b-sqrt(b*b-4*a*c)/(2*a); coutx1=x1endl;

13、coutx2=x2endl; return 0;3.5 編寫順序結(jié)構(gòu)的程序運行情況如下: 4.5 8.8 2.4 x1=-0.327612x2=-1.17794如果程序中要用到數(shù)學函數(shù),都要包含頭文件cmath(也可以用老形式的頭文件math.h,但提倡使用C+新形式的頭文件,請參閱第14章14.3節(jié))。在寫程序時,一定要注意將數(shù)學表達式正確地轉(zhuǎn)換成合法的C+表達式??梢钥吹剑?順序結(jié)構(gòu)的程序中的各執(zhí)行語句是順序執(zhí)行的。這種程序最簡單,最容易理解。C+提供if語句來實現(xiàn)這種條件選擇。條件如何形成呢?簡單條件復(fù)合條件3.6 關(guān)系運算和邏輯運算C+的關(guān)系運算符有: (小于) (大于) = (大于或

14、等于) = (等于) != (不等于) 優(yōu)先級相同 (低)3.6.1 關(guān)系運算和關(guān)系表達式C+增加了邏輯型數(shù)據(jù)。邏輯型常量只有兩個,即false(假)和true(真)。邏輯型變量要用類型標識符bool來定義,它的值只能是true和false之一。如bool found,flag=false; /定義邏輯變量found和flag,并使flag的初值 為falsefound=true; /將邏輯常量true賦給邏輯變量found由于邏輯變量是用關(guān)鍵字bool來定義的,因此又稱為布爾變量。邏輯型常量又稱為布爾常量。所謂邏輯型,就是布爾型。3.6.2 邏輯常量和邏輯變量在編譯系統(tǒng)處理邏輯型數(shù)據(jù)時,將f

15、alse處理為0,將true處理為1。因此,邏輯型數(shù)據(jù)可以與數(shù)值型數(shù)據(jù)進行算術(shù)運算。如果將一個非零的整數(shù)賦給邏輯型變量,則按“真”處理,如flag=123; /賦值后flag的值為truecouty) coutxendl;/多于一句加 cout yy) coutx;else cout500) cost=0.15;else if(number300) cost=0.10;else if(number100) cost=0.075;else if(number50) cost=0.05;else cost=0;圖3.例3.6 求三角形的面積。#include #include /使用數(shù)學函數(shù)時要包

16、含頭文件cmath#include /使用I/O流控制符要包含頭文件iomanipusing namespace std;int main( ) double a,b,c; coutabc; if (a+bc & b+ca & c+ab) /復(fù)合語句開始 double s,area; /在復(fù)合語句內(nèi)定義變量 s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); coutsetiosflags(ios fixed)setprecision(4); /指定輸出的數(shù)包含4位小數(shù) coutarea=areaendl; /在復(fù)合語句內(nèi)輸出局部變量的值 /復(fù)合語句結(jié)束el

17、se coutit is not a trilateral!b)?a:b; 其中“(ab)?a:b”是一個“條件表達式”。它是這樣執(zhí)行的:如果(ab)條件為真,則條件表達式的值就取“?”后面的值,即條件表達式的值為,否則條件表達式的值為“:”后面的值,即b。3.8 條件運算符和條件表達式條件運算符要求有3個操作對象,稱三目(元)運算符,它是C+中惟一的一個三目運算符。條件表達式的一般形式為表達式1 ? 表達式2 表達式3條件運算符的執(zhí)行順序是:先求解表達式1,若為非0(真)則求解表達式2,此時表達式的值就作為整個條件表達式的值。若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件

18、表達式的值。例3.7 輸入一個字符,判別它是否為大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。#include using namespace std;int main( ) char ch; cinch; ch=(ch=A & ch=Z)?(ch+32):ch; /判別ch是否大寫 字母,是則轉(zhuǎn)換 coutchendl; return 0;switch語句是多分支選擇語句,用來實現(xiàn)多分支選擇結(jié)構(gòu),又叫開關(guān)語句。它的一般形式如下:switch(表達式)/多種情況case case 常量表達式1:語句1 case 常量表達式2:語句2 . case 常量表達式n

19、:語句n default:語句n+1 3.9 多分支選擇結(jié)構(gòu)和switch 語句例如,要求按照考試成績的等級打印出百分制分數(shù)段,可以用switch語句實現(xiàn):switch(grade) case A: cout85100n; case B: cout7084n; case C: cout6069n; case D: cout60n; default : couterrorn; (1) switch后面括號內(nèi)的“表達式”,允許為任何類型。(2) 當switch表達式的值與某一個case子句中的常量表達式的值相匹配時,就執(zhí)行此case子句中的內(nèi)嵌語句,若所有的case子句中的常量表達式的值都不能與s

20、witch表達式的值匹配,就執(zhí)行default語句。要形成真正多分支,必須加break語句。即在執(zhí)行一個case子句后,使流程跳出switch結(jié)構(gòu),可以用一個break語句來達到此目的。將上面的switch結(jié)構(gòu)改寫如下:switch(grade) case A: cout85100n;break; case B: cout7084n;break; case C: cout6069n;break; case D: cout60n;break; default : couterrorn;break; 最后一個子句(default)可以不加break語句。如果grade的值為B,則只輸出“7084”

21、。流程圖見圖3.7。圖3.7(3) 多個case可以共用一組執(zhí)行語句,如 . case A: case B: case C: cout60n; .當grade的值為A、B或C時都執(zhí)行同一組語句。因為,沒加break.例3.8 編寫程序,判斷某一年是否為閏年。#include /注意ifelse的嵌套關(guān)系using namespace std;int main( ) /注意if-else 配對的對應(yīng)性! int year; bool leap; coutyear; /輸入年份 if (year%4=0) /年份能被4整除 if(year%100=0) /年份能被4整除又能被100整除 if (y

22、ear%400=0) /年份能被4整除又能被400整除 leap=true; /閏年,令leap=true(真) else leap=false; /非閏年,令leap=false(假) else /年份能被4整除但不能被100整除肯定是閏年 leap=true; /是閏年,令leap=true3.10 編寫選擇結(jié)構(gòu)的程序 else /年份不能被4整除肯定不是閏年 leap=false; /若為非閏年,令leap=false if (leap) coutyear is ; /若leap為真,就輸出年份和“是” else coutyear is not ; /若leap為真,就輸出年份和“不是”

23、 cout a leap year.endl; /輸出“閏年” return 0;運行情況如下: 2005 2005 is not a leap year. 1900 1900 is npt a leap year. 例3.9 運輸公司對用戶計算運費。路程(s)越遠,每公里運費越低。標準如下: s250km 沒有折扣 250s500 2折扣 500s1000 5折扣 1000s2000 8折扣 2000s3000 10折扣 3000s 15折扣設(shè)每公里每噸貨物的基本運費為p(price的縮寫),貨物重為w(wright的縮寫),距離為,折扣為d(discount的縮寫),則總運費f(freig

24、ht的縮寫)的計算公式為: f = p * w * s * (1 - d)圖3.8S轉(zhuǎn)換為轉(zhuǎn)換為C的值,以形成多分支:的值,以形成多分支:C=int (S/250)據(jù)此寫出程序如下: #include using namespace std;int main( )int c,s; float p,w,d,f; coutpws; if(s=3000) c=12; else c=s/250;/由c的值形成多分支 switch (c) case 0:d=0;break; case 1:d=2;break; case 2: case 3:d=5;break; case 4: case 5: case

25、6: case 7:d=8;break; case 8: case 9: case 10: case 11:d=10;break; case 12:d=15;break; f=p*w*s*(1-d/100.0);/計算公式 coutfreight=fendl; return 0;運行情況如下:please enter p,w,s:100 20 300freight=588000需要反復(fù)執(zhí)行某一操作時,就要用到循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的3種基本結(jié)構(gòu),是各種復(fù)雜程序的基本構(gòu)造單元。因此程序設(shè)計者必須熟練掌握選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的概念及使用方法。3.11 循環(huán)結(jié)構(gòu)和循環(huán)語

26、句一般形式如下:while (表達式) 語句其作用是: 當指定的條件為真(表達式為非0)時,執(zhí)行while語句中的內(nèi)嵌語句。其流程圖見圖3.9。其特點是:先判斷表達式,后執(zhí)行語句。while循環(huán)稱為當型循環(huán)(當條件滿足,循環(huán)之, 否則,不循環(huán))。圖3.93.11.1 用while語句構(gòu)成循環(huán)例3.10 求1+2+3+100。根據(jù)流程圖寫出程序:/程序輸入格式#include using namespace std;int main( )int i=1,sum=0; while (i=100) sum=sum+i; i+;/叫循環(huán)變量 coutsum=sumendl;運行結(jié)果為sum=5050

27、需要注意:(1) 循環(huán)體如果包含一個以上的語句,應(yīng)該用花括號括起來,以復(fù)合語句形式出現(xiàn)。(2) 在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。do-while語句的特點是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。其一般形式為do 語句 while (表達式);注意分號它是這樣執(zhí)行的:先執(zhí)行一次指定的語句(即循環(huán)體),然后判別表達式,當表達式的值為非零(“真”) 時,返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達式的值等于0為止,此時循環(huán)結(jié)束??梢杂脠D3.11表示其流程。3.11.2 用do-while語句構(gòu)成循環(huán) 圖3.11 圖3.12例3.11 用do-while語句求1+2+3+100??删帉懗鱿旅娴某?/p>

28、序: #include using namespace std;int main( )int i=1,sum=0; do sum=sum+i; i+; while (i=100); coutsum=sumendl; return 0;格式:for(表達式1;表達式2;表達式3) 語句int i,sum;sum=0;for(i=1;i=100;i+) sum=sum+1; 它的執(zhí)行過程如下:(1) 先求解表達式1。(2) 求解表達式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。若為假(值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。3.11.3 用for語句構(gòu)成循環(huán)

29、(3) 求解表達式3。(4) 轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。(5) 循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句。 一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。3.12 循環(huán)的嵌套break;其作用為使流程從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)體下面的語句。break語句只能用于循環(huán)語句和switch語句內(nèi),不能單獨使用或用于其他語句中。3.13 break語句和continue語句continue語句的一般格式為continue;其作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定。contin

30、ue語句和break語句的區(qū)別是:continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。而break語句則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。 圖3.18 圖3.19例3.12 用下面公式求的近似值。/41-1/3+1/5-1/7+直到最后一項的絕對值小于10-7為止。根據(jù)給定的算法很容易編寫程序如下:#include #include #include using namespace std;int main( )int s=1; /符號 double n=1,t=1,pi=0;/n 分母;t某一項的值 while(fabs(t)1e-7) pi=pi+t; n=n+2;3.14 編寫循環(huán)結(jié)構(gòu)的程序 s=-s; t=s/n; pi=pi*4; coutpi=setiosflags(ios fixed)

溫馨提示

  • 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

提交評論