




已閱讀5頁,還剩101頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C+程序設計,授課教師:李戰(zhàn)春,第二章 基本控制結構程序設計,結構化程序設計的特點是任何程序都可由三種基本結構及其組合來描述。 本章將介紹C+分支結構和循環(huán)結構的設計方法。 教學目標:編寫選擇和循環(huán)結構的程序 考核方式: 要求基本: (1)獨立編寫并運行2.2、2.3 (2)獨立編寫并運行2.8、2.9、2.10、2.7、2.12 較高要求: 獨立編寫并運行2.5、2.6、2.13、2.15、2.16,利用海倫公式計算三角形面積,輸入a=3,b=4,c=5后,結果是多少?,輸入a=1,b=1,c=3呢?,為什么?怎么辦?,2.1 算法的概念與表示方法,2.1.1 算 法 的 概 念,2.1.3 算 法描述的三種基本結構,2.1.2 算 法 的 表 示,2.1.1 算 法 的 概 念,2.1.3算法描述的三種基本結構,3 循 環(huán) 結 構,1 順 序 結 構,2 分 支 結 構,算法的基本結構: 對算法的理論研究和實踐表明,任何算法的描述都可以分解為三種基本結構或它們的組合,這三種基本結構是順序結構、分支結構和循環(huán)結構。,num115;,2.1.3算法描述的三種基本結構,(1) 順序結構,【例21】 求兩數之和。,顯示結果:35,num220;,sumnum1+num2;,演示算法執(zhí)行過程,輸出sum;,活動圖,2.1.3算法描述的三種基本結構,(2) 分支結構,【例22】 輸入三個數,輸出其中的最大數。,x7;,y12;,z10;,if(xy) maxx; else max y;,if (zmax) maxz;,輸出max;,顯示結果:12,演示算法執(zhí)行過程,2.2.1 if 語句,if語句基本格式: 1、if (表達式) 語句1; 2、if (表達式) 語句1; else 語句2;,【例2.4】 輸入一個年份,判斷是否閏年。,【例2.5】 從鍵盤上輸入三個整數,輸出其中的最大數。,2.2 分支結構程序設計,if 語句【例24】,【例24】 輸入一個年份,判斷是否閏年。 算法分析:假定年份為year, 閏年的條件是 : year%4=0 ,分析:讀入三個數,先求出兩個數中較大者,再將該大數與第三個數比較,求出最大數。 int main() int a, b, c, max; coutabc; cout=b) max=a; else max=b; if(cmax) max=c; cout “最大數為:”maxendl; return 0; ,if 語句【例25】,【例2.5】 從鍵盤上輸入三個整數,輸出其中的最大數。,邏輯運算、邏輯表達式,邏輯運算: 用于判斷分析,運算符包括關系和邏輯運算符。 關系運算符: 包括:(大于)、(大于等于)、(小于)、(小于等于);= =(等于)和!=(不等于) 。關系運算符完成兩個操作數大小的比較,結果為邏輯值true(真)或false(假)。,邏輯值與整數的對應關系是什么?,邏輯值能參與運算嗎?,關系表達式:,例如: a+bc+d /*等同于(a+b)(c+d) */ y=ab /*計算ab的值0或1賦給y*/ abc /*等同于(ab)c,先求ab 的值, 再將結果0或1與c比較大小*/,由關系運算符連接的表達式。是一種簡單的邏輯表達式。值為true或false。,數學式abc ,對應的關系表達式為什么?,設有定義 float a=3.2;int b=5;則: 3ab /結果是?,其運算 過程如下:,a,5,b,3.2,3,T, 即1,T即1,邏輯運算符:,包括:!、&和|,語義見下表。,由邏輯運算符連接的表達式,其操作數和運算結果均為邏輯量。操作數可以是表達式,只要其值是邏輯量,如關系表達式。,由于邏輯值和整數之間的對應關系,也允許整型和字符型操作數進行邏輯運算: 21&0 /邏輯與,21與0,結果? 21|0 /邏輯或,21或0,結果? !21 /邏輯非,21的非,結果? 運算結果同樣可以作為一個整數參與其他運算。,邏輯表達式:,邏輯表達式計算時,邏輯非優(yōu)先級最高,關系運算其次,邏輯與和邏輯或最低。,已知: int a=10, b=20, c=30;float x=1.8, y=2.4;,ay|ay)|(a(b-(!c),t1=1,t2=0,t4=0,-,&,t3=0,t5=b,t6=1,|,得整個表達式的值為:,1,嵌套if語句: if 語句中,如果內嵌語句又是if語句。 嵌套有兩種形式,2.2.2 if 語句的嵌套,【例2.6】用嵌套if語句完成【例2.5】的任務。,/方法1:采用if中嵌套形式 int main() int a, b, c, max; coutabc; coutb) if(ac) max=a; /ab且ac else max=c; /ab且ac) max=b; /ac else max=c; /a=b且bc cout“最大數max=“max; return 0; ,if 語句【例26】,【例2.6】用嵌套if語句完成【例2.5】的任務。,/方法2:采用else中嵌套形式 int main() int a,b,c,max; coutabc; cout=b ,if 語句【例26】,【例2.7】 某商場購物優(yōu)惠活動,【例2.8】 求一元二次方程的根。,配對關系實例:,【例2.7】 某商場優(yōu)惠活動規(guī)定,某種商品單 價為80元,一次購買5件以上(包含5件)10件以下(不包含10件)打9折,一次購買10件以上(包含10件)打8折。設計程序根據客戶的購買量計 算總價。,算法 1、輸入購買件數count,設置單價price=80(元) 2、根據count值確定折扣率discount; 3、實際售價amount=price*count*discount; 4、輸出amount的值。 算法細化: 2.1、if(count=5&count=10)discount=0.8;,if 語句【例27】,int main() float price,discount,amount;/單價,折扣,總價 int count; /購買件數 coutprice; coutcount; if(count5) discount=1; else if(count10) discount=0.9; else discount=0.8; amount=price*count*discount; cout “單價:“price endl; cout “購買件數:“count t“折扣:“ discountendl; cout“總價:“amountendl; return 0;,if 語句【例27】,【例2.8】 求一元二次方程 ax2+bx+c=0 的根。 其中系數a(a0)、b、c的值由鍵盤輸入。 分析:輸入系數a(a0)、b、c后,令delta= b24ac,結果有三種情況: *若delta=0, 方程有兩個相同實根; *若delta0, 方程有兩個不同實根; *若delta0,方程無實根。,if 語句【例28】,#include #include using namespace std; int main() float a,b,c; float delta,x1,x2; coutabc; cout“a=“at“b=“bt “c=“cendl; delta=b*b-4*a*c;,if 語句【例28】,if(delta=0) cout0) delta=sqrt(delta); x1=(-b+delta)/(2*a); x2=(-b-delta)/(2*a); cout“方程有兩個不同實根:“; cout“x1=“x1t“x2=“ x2endl; else cout“方程無實根!“endl; /delta0 return 0;,if 語句【例28】,2.2.3 條件運算符“?:”,三元運算符條件運算符“?:”可以用來簡化if語句表達。其構成的表達式格式為: 表達式1 ? 表達式2 : 表達式3 例如:int a=6,b=7; min=ab?a:b; /min=6,#include using namespace std; int main() char ch; cout ch ; if ( ch = A ,改寫為條件表達式 ch = ( ch = A ,把輸入字符轉換為小寫字母。對輸入字符進行判斷,如果是大寫字母,則轉換為小寫字母;否則,不轉換。,2.2.4 switch語句,開關語句(switch語句) 用來實現多選一: switch (表達式) case 常量表達式: 語句序列break; case 常量表達式n:語句序列nbreak; default:語句序列 ,條件表達式,整型 字符型 布爾型 枚舉型,取值為常量的表達式,switch ( 表達式 ) case 常量表達式 1 : 語句 1 case 常量表達式 2 : 語句 2 case 常量表達式 n : 語句 n default : 語句 n+1 ,注: 表達式類型為非浮點型 各常量表達式類型要與之匹配 各常量表達式要求各不相等,語句標號,2.2.4 switch語句,根據一個整型表達式的值決定程序分支,執(zhí)行流程,2.2.4 switch語句,# include using namespace std; int main () char grade ; cout grade ; switch ( grade ) case a : cout “ 85_100 n “ ; case b : cout “ 70_84 n “ ; case c : cout “ 60_69 n “ ; case d : cout “ 60 n “ ; default : cout “ error n “ ; return 0; ,觀察不同輸入時的輸出結果,switch語句,例題根據考試成績的等級打印出百分制分數段。,# include using namespace std; int main () char grade ; cout grade ; switch ( grade ) case a : cout “ 85_100 n “ ; case b : cout “ 70_84 n “ ; case c : cout “ 60_69 n “ ; case d : cout “ 60 n “ ; default : cout “ error n “ ; return 0; ,2.1.2 switch 語句,例題 根據考試成績的等級打印出百分制分數段。,switch語句,# include using namespace std; int main () char grade ; cout grade ; switch ( grade ) case a : cout “ 85_100 n “ ; case b : cout “ 70_84 n “ ; case c : cout “ 60_69 n “ ; case d : cout “ 60 n “ ; default : cout “ error n “ ; return 0; ,2.1.2 switch 語句,例題 根據考試成績的等級打印出百分制分數段。,switch語句,例題 根據考試成績的等級打印出百分制分數段。,# include using namespace std; int main () char grade ; cout grade ; switch ( grade ) case a : cout “ 85_100 n “ ; case b : cout “ 70_84 n “ ; case c : cout “ 60_69 n “ ; case d : cout “ 60 n “ ; default : cout “ error n “ ; return 0; ,switch語句,# include int main () char grade ; cout grade ; switch ( grade ) case a : cout “ 85_100 n “ ; break; case b : cout “ 70_84 n “ ; break; case c : cout “ 60_69 n “ ;break; case d : cout “ 60 n “ ; break; default : cout “ error n “ ; return 0; ,跳出switch語句,switch語句,例題 根據考試成績的等級打印出百分制分數段。,例題 根據考試成績的等級打印出百分制分數段。,# include int main () char grade ; cout grade ; switch ( grade ) case a : cout “ 85_100 n “ ; break; case b : cout “ 70_84 n “ ; break; case c : cout “ 60_69 n “ ;break; case d : cout “ 60 n “ ; break; default : cout “ error n “ ; return 0; ,switch語句,討論: 1)csae 和 default 僅起語句標號作用,不能控制程序流程 2)一旦選中一個case分支后,將繼續(xù)往下順序執(zhí)行語句序列 3)添加 break 語句可以跳出 switch 語句體,達到控制流程作用,根據以上特點,可以寫出多個 case 共執(zhí)行一個語句的形式,2.1.2 switch 語句,2.2.4 switch語句,例 根據考試成績的等級打印出百分制分數, 允許輸入大寫或小寫字母。,# include int main () char grade ; cout grade ; switch ( grade ) case a : case A : cout “ 85_100 n “ ; break ; case b : case B : cout “ 70_84 n “ ; break ; case c : case C : cout “ 60_69 n “ ; break ; case d : case D : cout “ 60 n “ ;break ; default : cout “ error n “ ; retrun 0; ,a 或 A 共同執(zhí)行一個語句,switch語句,if 語句 switch 語句 形成分支控制流程 不形成程序控制流程 用于復雜條件判斷 表達式的值為數值集合時作多分支 控制,可讀性較好,與 if 語句比較:,2.2.4 switch語句,【例2.10】 設計一個計算器程序,實現加、減、乘、除運算。 分析:讀入兩個操作數和運算符,根據運算符完成相應運算。 #include using namespace std; int main( ) float num1,num2; char op; coutnum1opnum2; switch(op) case +: coutnum1opnum2“=“num1+num2endl; break; case -: coutnum1opnum2“=“num1-num2endl; break; case *: coutnum1opnum2“=“num1*num2endl; break; case /: coutnum1opnum2“=“num1/num2endl; break; default : coutop“是無效運算符!“; return 0;,循環(huán)結構,【例23】求4個整數的和。,顯示結果:60,演示算法執(zhí)行過程,12,3,14,26,2,16,42,1,18,60,0,count4; /整數個數 sum0; /累加和的初值 while (count0) x輸入一個整數; sumsum+x; countcount-1; 輸出sum;,循環(huán)控制語句是基本流程控制語句之一。C+提供三種循環(huán)語句:,2.3.1 while語句,2.3.4 循環(huán)的嵌套,2.3.3 for語句,2.3.2 do-while 語句,2.3 循環(huán)結構程序設計,注意: 1)循環(huán)開始前對循環(huán)條件進行初始化; 2)在循環(huán)體語句中要包含修改循環(huán)條件的語句,否則循環(huán)將不能終止而陷入死循環(huán)。,2.3.1 while語句,while語句也稱為當循環(huán),語句格式為: while (表達式) 循環(huán)體語句; ,2.3.2 do-while 語句,do-while語句稱為直到循環(huán),格式為: do 循環(huán)體語句 ; while(表達式);,2.3.3 for 語句,for循環(huán)語句的格式 for ( 表達式1;表達式2; 表達式3 ) 循環(huán)體語句 ;,關鍵字,初始表達式,循環(huán)控制 邏輯表達式,循環(huán)后置表達式,for語句、while語句、do/while語句比較:,int i=1,sum=0; /循環(huán)初始條件 while(i=4) sum+=i; i+; /修改循環(huán)條件 ,int i=1,sum=0; /循環(huán)初始條件 do sum+=i; i+;/修改循環(huán)條件 while(i=4);,int i,sum=0; for( i=1; i=4; i+ ) sum+=i; /*習慣上:表達式1:循環(huán)初始條件;表達式2:循環(huán)終止條件;表達式3:修改循環(huán)條件*/,# include using namespace std; int main () int i = 1 , sum = 0 ; while ( i = 100 ) sum = sum + i ; i + ; cout “ sum = “ sum endl ; return 0; ,想一想: 循環(huán)條件是什么? 循環(huán)結束條件是什么? 哪一個語句修改循環(huán)條件?,一個簡單的循環(huán)跟蹤: 求,while語句,例如,用 for 語句的求和式 的程序,# include using namespace std; int main () int i , sum = 0 ; for ( i =1 ; i = 100 ; i + ) sum + = i ; cout “ sum = “ sum endl ; return 0; ,# include using namespace std; int main () int i = 1 , sum = 0 ; while ( i = 100 ) sum = sum + i ; i + ; cout “ sum = “ sum endl ; return 0; ,for循環(huán)語句,【例2.14】運行結果: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181,【例2.14】 設計程序輸出Fibonacii數列的前20項,要求每行輸出5個數據。,2.3.3 for 語句,Fibonacii數列定義如下:,算法分析:除了第0項和第1項外,每一項都是由類似方法產生,即前兩項之和;所以求當前項時,只需要記住前兩項;程序不需要為每一項設置專用變量; 屬遞推算法。,For循環(huán)語句,1.7 數組與字符數組,數組定義: 數組是有限個同類型元素的有序集合,這些元素有一個共同的名字,每個元素以其在數組中的位置區(qū)分,位置用下標表示。數組下標的個數稱作維數。,int m5; /定義數組m, 其中有5個整數,float x3; /數組x中有3個實數,一維數組,一維數組的定義格式: 存儲類型 數據類型 數組名常量;,一維數組初始化,# include using namespace std; int main() int int_arr4; int_arr0=1; int_arr1=1; int_arr2=2; int_arr3=int_arr1+int_arr2; coutint_arr3n; return 0; ,【例1.2】使用數組的簡單例子,Fibonacii數列定義如下:,For循環(huán)語句,(1)定義數組 (2)使用數組元素循環(huán)求解,程序如下: int main() int fib20=0,1,n; for(n=2;n20;n+) fibn=fibn-2+fibn-1; for(n=0;n20;n+) coutsetw(5)fibn; if(n%5=4) coutendl; return 0; ,For循環(huán)語句,【例2.22】 輸入一個小于1的數x,求sinx的近似值,要求誤差小于0.0001。近似計算公式如下:,應用實例,itemitem*x*x/(2*n)*(2*n+1),int main() const double epsilon=0.0001; /用epsilon保存誤差 double x,sinx,item; int n=2,sign=-1; /sign保存符號 coutx; sinx=x;item=x*x*x/6; /第一項作為初值,第二項為誤差項 while(itemepsilon) sinx=sinx+item*sign; /將當前項累加進結果,注意符號作為因子 item=item*x*x/(2*n)*(2*n+1); /推算新的誤差項 sign=-sign; /注意符號的變換 n+; cout“sin(“x“)=“sinxendl; return 0; ,【例2.15】 輸入一個不超過9位的整數,將其反向后輸出。例如輸入247,變成742輸出。 算法分析: 1、將整數的各個數位逐個分開,用一個數組保存各位的值,然后反向組成新的整數。 2、將整數各位數字分開的方法是,通過求余得到個位數,然后將整數縮小十倍,再求余,并重復上述過程,分別得到十位、百位,直到整數的值變成0為止。,2.3.3 for 語句,數據處理: 1、設置變量num表示輸入的整數,整型數組digit9用來存放num 的各個位;變量i用來表示數組的當前下標; 算法: 1、輸入num; 變量初始化:i=0; 2、while (num!=0) num對10取余,得num的當前個位數放入digiti; num整除10,即去掉個位數,十位變個位, 百位變十位,; i+; /數組digit準備記錄下一位; 3、將數組元素按下標從低到高的順序反向組合;,For循環(huán)語句,程序如下: int main() int i,num,subscript; int digit9; coutnum; cout0) digitsubscript=num%10; num=num/10; subscript+; /修改下標 for(i=0;isubscript;i+) /整數的反向組合 num=num*10+digiti; cout“反向后整數為:“numendl; return 0;,For循環(huán)語句,2.3.4 循環(huán)的嵌套,嵌套循環(huán): 當循環(huán)語句中的循環(huán)體中又有循環(huán)語句時,就構成了嵌套循環(huán)。 嵌套層次一般不超過3層,以保證可讀性。,【例2.16】 打印九九表。打印格式為: * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 9 9 18 27 36 45 54 63 72 81,2.3.4 循環(huán)的嵌套,算法: 1、輸出表頭,用一個循環(huán)語句即可; 2、輸出表體: for (i=1; i10; i+) couti; /輸出行號 輸出第i行數據; /A coutendl; /準備輸出下一行 3、A行細化: for (j=1; j=i; j+) coutsetw(4)i*j;,2.3.4 循環(huán)的嵌套,int main() int i,j; coutsetw(3)*setw(4) ; for(i=1;i10;i+) coutsetw(4)i; /輸出表頭(乘數) coutendlendl; for(i=1;i10;i+) coutsetw(3)isetw(4) ; /輸出行號(被乘數) for(j=1;j=i;j+) coutsetw(4)i*j; /輸出表中數據(乘積) coutendl; /準備輸出下一行 return 0; ,循環(huán)嵌套【例2.16】 _打印九九表,循環(huán)嵌套,2.4 轉向語句,break & continue goto return,break & continue,break語句 無條件地結束switch語句,或循環(huán)語句,轉向執(zhí)行語句塊的后續(xù)語句 continue語句 用于循環(huán)體中,終止當前一次循環(huán),while ( E1 ) 語句 1 if ( E2 ) break ; 語句 2 ,while ( E1 ) 語句 1 if ( E2 ) continue ; 語句 2 ,break,continue,break 與 continue 語句比較,break & continue,for (I=1;I=100;I+) if ( I%3!=0) continue; /I不是3的倍數,不輸出,繼續(xù)下一個I; 輸出I的值;/I是3的倍數才輸出 if(I%3=0)輸出I的值;,例:輸出1100內3的倍數。 分析:設置整型變量I從1變化到100,依次測試I是否3的倍數,算法屬于窮舉法。,本章重點例題或算法,分段函數 用switch求分數段 1+2+.+n 或 1*2*n 或X*X*. N個數求最大值、最小值、平均值 求素數 大小寫字母轉換 求最大公約數或最小公倍數,break & continue,【例2.18】 給定正整數m,判定其是否為素數。 分析:如果m2,m是素數的條件是不能被2,3,,(m的平方根取整)整除。因此可以用2,3,k(k為m的平方根取整)逐個去除m,如果被其中某個數整除了,則m不是素數,否則是素數。 算法屬于窮舉法。,int main() int m,i,k; coutm; if(m=2) coutk) cout m“是素數“endl; /循環(huán)提前終止表示是非素數 else cout m“不是素數“endl; return 0;,break & continue,2.6 常用算法的應用實例,【例2.20】中國古代數學史上著名的“百雞問題”,【例2.21】用歐基里德算法(也稱輾轉法)求兩個整數的最大公約數,【例2.23】輸入一個8位二進制數,將其轉換為十進制數輸出。,【例2.22】輸入一個小于1的數x,求sinx的近似值,枚舉,文件,【例2.19】 求100之內的所有素數,并將這些素數輸出,每行輸出 2個數據。,2.6 常用算法的應用實例【例2.19】,直接法直接法是根據問題給出的條件直接求解。 【例2.19】 求100之內的所有素數,并將這些素數輸出,每行輸出 2個數據。 分析 算法一 窮舉法: 1、判斷一個數是否素數?方法窮舉法; 2、100之內的所有素數?方法:一個個試; 綜上所述,得到一個循環(huán)嵌套的算法: for(m=2;m=100;m+)/窮舉法 if(m是素數)按要求的格式輸出m;,k= sqrt(m); for(i=2;ik) m是素數; /剛才的for不是由break結束的,2. 枚舉法枚舉法也稱窮舉法,基本思想是,在有限范圍內列舉所有可能的結果,找出其中符合要求的解。枚舉法適合求解的問題是:可能的答案是有限個且答案是可知的,但又難以用解析法描述。這種算法通常用循環(huán)結構來完成。 【例2.20】 中國古代數學史上著名的“百雞問題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一。百錢買百雞,問雞翁、母、雛各幾何? 分析:設雞翁、母、雛分別為i,j,k,根據題意可得: i*5+j*3+k/3=100; i+j+k=100; 兩個方程無法解出三個變量,只能將各種可能的取值代入,其中能滿足兩個方程的就是所需的解,因此這是枚舉算法(也叫窮舉法)的應用。 i、j、k可能的取值有哪些?分析可知,百錢最多可買雞翁20,雞母33,雞雛300。,算法: for (i=0; i=20;i+) for (j=0; j=33;j+) for (k=0; k=300;k+) if (i+j+k=100) 這個算法使用三重循環(huán),執(zhí)行時間函數是立方階,循環(huán)體將執(zhí)行20*33*300=198000次。 我們希望在算法上改進一下,如能減少一重循環(huán),將大大縮短運行時間。,2.6 常用算法的應用實例【例2.20】,實際上,當i、j確定時,k就可由題目要求確定為100-i-j,因此實際上只要用i、j去測試,用錢數檢測就可以了。循環(huán)體將執(zhí)行: 20*33=660次。 算法改進為: for (i=0; i+=20;) for (j=0; j+=33;) if ( 5*i+3*j+(100-i-j)/3=100 ) coutijk;,2.6 常用算法的應用實例【例2.20】,#include #include using namespace std; int main() int i,j,k; cout“ 公雞 母雞 小雞“endl; for(i=0;i=20;i+) for(j=0;j=33;j+) k=100-i-j; if(5*i+3*j+k/3=100),2.6 常用算法的應用實例【例2.20】,注意:窮舉法采用循環(huán),須剔除的情況,應在循環(huán)體內用用條件語句實現,不可放在循環(huán)條件中,請考慮為什么?本例是選合條件的,如去除不合條件用continue語句,改改看? 程序運行結果: 公雞 母雞 小雞 0 25 75 4 18 78 8 11 81 12 4 84,2.6 常用算法的應用實例【例2.20】,2.6 常用算法的應用實例【例2.21】,3.遞推法:遞推算法是通過問題的一個或多個已知解,用同樣的方法逐個推算出其他解,如數列問題,近似計算問題等,通常也要借助于循環(huán)結構完成。 【例2.21】 用歐基里德算法(也稱輾轉法)求兩個整數的最大公約數。 分析:假定兩個整數分別為num1和num2,最大公約數應當是不超過其中較小數的一個整數。 輾轉法:用num1除以num2,求出余數resd,如果resd=0,則當前num2就是最大公約數,如果resd!=0,令num1=num2, num2=resd, 重復以上過程,直到resd=0為止。,1、設置兩個整型變量num1和num2代表兩個數;輸入num1、num2; 2、輾轉法: 2.1、使num1num2; 2.2、 2.2.1、設置變量resd=num1%num2; /包含了步驟2.1 2.2.2、if(resd=0)當前num2就是最大公約數; else num1=num2, num2=resd; 重復2.2.1和2.2.2,直到resd=0為止。 步驟2輾轉法可用以下程序段表示: do resd=num1%num2; if(resd=0)當前num2就是最大公約數; else num1=num2, num2=resd; while (resd!=0); 3、輸出當前的num2。,int main( ) int num1,num2,resd; coutnum1num2; coutnum1“和“num2“的最大公約數為:“; do resd=num1%num2; if(resd=0) break; num1=num2; num2=resd; while(resd!=0) coutnum2endl; return 0; ,【例2.22】 輸入一個小于1的數x,求sinx的近似值,要求誤差小于0.0001。近似計算公式如下: 分析:這個近似計算可以看作一個累加過程,關鍵在于累加項數的確定。該求近似值的奇次多項式各項順序改變符號,若取前n項累加和作為sin(x)的近似值,則第n+1項的絕對值就是誤差限。因此可以這樣考慮,若公式中第一項作為累加和的初值,則第二項就是誤差,如果誤差不滿足要求,則將該項累加到累加和上,進而用該項推出第三項,第三項又是新的累加和的誤差。經過這樣累加、遞推,直至滿足要求為止。如果用item保存第n項,則推出第n+1項的方法為: itemitem*x*x/(2*n)*(2*n+1),2.6 常用算法的應用實例【例2.22】,int main() const double epsilon=0.0001; /用epsilon保存誤差 double x,sinx,item; int n=2,sign=-1; /sign保存符號 coutx; sinx=x;item=x*x*x/6; /第一項作為初值,第二項為誤差項 while(itemepsilon) sinx=sinx+item*sign; /將當前項累加進結果,注意符號作為因子 item=item*x*x/(2*n)*(2*n+1); /推算新的誤差項 sign=-sign; /注意符號的變換 n+; cout“sin(“x“)=“sinxendl; return 0; ,2.6 常用算法的應用實例【例2.23】,【例2.23】 輸入一個8位二進制數,將其轉換為十進制數輸出。 分析:二進制轉換為十進制只要將每位二進制數乘以該位的權然后相加。實際上屬于多項式求和問題: 對于本例,x=2。多項式的系數a i 即為二進制數的各個位,可以用數組保存。 如果直接求冪再求和,需要做(n*(n+1)/2)次乘法?,F將多項式作如下變形: 就變成一個十分簡單的計算,僅做了n次乘法。,算法: 1、用數字串存二進制數,數組bin8用來放各個二進制位;/考慮為什么? 2、整型變量dec= 0 ; x=2; /初始化 2、for(i=7;i=0;i-) /系數從a n 到a 0 依次投入運算 dec = dec * x +(bini - 0); / (bini - 0):數字字符轉換為數字,2.6 常用算法的應用實例【例2.23】,程序: const int n=8; int main() char binn; int x=2,a,dec,i; cout=0;i-) cinbini;/先輸入的是高位 dec=0; for(i=n-1;i=0;i-) a=bini-0; /數字字符轉換為數字 dec= dec*x+a; cout=0;i-) coutbini; cout“)的值為:“decendl; return 0;,2.7 枚舉類型,2.7.1 枚舉類型的定義,2.7.2 枚舉變量的使用,枚舉類型(enumerate)是c+中的一種派生數據類型,它是用戶定義的若干枚舉常量的集合。 枚舉類型的變量,只能取枚舉常量表中所列的值。 定義枚舉類型的主要目的是增加程序的可讀性。,2.7.1 枚舉類型的定義,枚舉類型定義: enum ; 關鍵字enum指明其后的標識符是一個類型的名字,枚舉常量表中列出該類型的所有取值,各枚舉常量之間以“,”間隔。 例: enum color_set1 RED, BLUE, WHITE, BLACK; enum week Sun, Mon, Tue, Wed, Thu, Fri, Sat; 枚舉常量(或稱枚舉成員)是以標識符形式表示的整型量,非法定義實例: enum letter_set a, d, F, s, T; /枚舉常量只能是標識符 enum year_set2000,2001,2002,2003,2004,2005; /改為y2000等則正確,2.7.1 枚舉類型的定義,枚舉常量: 枚舉常量代表該枚舉類型的變量可能取的值,編譯系統為每個枚舉常量指定一個整數值,缺省狀態(tài)下,這個整數就是所列舉元素的序號,序號從0開始。如上例中RED、 BLUE、 WHITE、 BLACK的值分別為0、1、2、3。 用戶也可以在類型定義時為部分或全部枚舉常量指定整數值,在第一個指定值之前的枚舉常量仍按缺省方式取值,而指定值之后的枚舉常量按依次加1的原則取值。各枚舉常量的值可以重復,但各枚舉常量標識符必須不同。 例: enum fruit_set apple, orange, banana=1, peach, grape enum week Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat; 枚舉常量apple、orange、banana、peach、grape的值分別為0、1、1、2、3。枚舉常量Sun, Mon, Tue, Wed, Thu, Fri, Sat的值分別為7、1、2、3、4、5、6。,2.7.1 枚舉類型的定義,枚舉型變量定義: 定義枚舉類型之后,就可以定義枚舉類型的變量;亦可類型與變量同時定義(甚至類型名可省):color_set1 color1, color2; enum Sun, Mon, Tue, Wed, Thu, Fri, Sat weekday1, weekday2; 枚舉變量的取值范圍就是整型數的一個子集。枚舉變量占用內存的大小與整型數相同。,2.7.2 枚舉類型的變量的使用,枚舉類型應用要點: 1、賦值包括將枚舉常量值賦給枚舉變量和兩個同類型變量之間賦值。不能直接將整型量賦給枚舉變量,兩個不同類型的枚舉變量之間也不能相互賦值。例如: enum color_set2 GREEN, RED, YELLOW, WHITE; color_set2 color3, color4; color3=RED; /合法 color4=color3; /合法,color4的值為RED color1=1; /非法,不能直接將整性常量賦給枚舉變量 color2=color3; /非法,color2類型是color_set1, /color3類型是color_set2 ,不能相互賦值,2.7.2 枚舉類型的變量的使用,枚舉類型應用要點: 2、由于枚舉常量本身是一個整數值,因此也允許將一個枚舉量賦給整型變量。但不允許將一個整型變量賦給枚舉量,即使整型變量取值合適,也必須將整型變量強制轉換為枚舉型 。例如: int i, j; i=color3; /合法,i的值為1 j=GREEN; /合法,j的值為0 color3= i; /非法 3、關系運算可以是同一枚舉類型的兩個枚舉變量之間或一個枚舉變量和一個枚舉常量之間,用它們所取的值(序號)比較。例如: if (color3=color4) cout”相等”; if (color3!=WHITE) cout”not white”;,4、枚舉變量不能直接輸入,可以直接輸出,但輸出的是變量的整數值。例如: cincolor1 /非法 coutcolor3 /合法,輸出的是2 從程序的合法性和可讀性出發(fā),枚舉變量的輸入輸出一般都采用switch語句將其轉換為字符或字符串。同時,枚舉類型數據的其他處理也往往應用switch語句。,2.7.2 枚舉類型的變量的使用,*【例2.24】 口袋中有紅、黃、藍、白、黑五種顏色的球若干個,每次從口袋中取三個不同顏色的球,統計并輸出所有的取法。,2.8 輸入輸出文件簡介,如果希望程序的運行結果能夠永久保留下來,供隨時查閱或取用,則需要將其保存在文件中。 文件包括文本文件和二進制文件。本小節(jié)只討論文本文件的基本操作和簡單應用。文本文件由字符序列組成,也稱ASCII碼文件,在文本文件中存取的最小信息單位為字符(character)。 兩個概念:內部文件和外部文件。通常所謂的文件是指磁盤文件,就是在“我的電腦”的目錄中見到的文件,這里稱為外部文件。而在程序中運行的文件,稱為內部文件(文件流對象)。程序中操作的是內部文件,最后保存的是外部文件。,算法,枚舉,文件,2.8 輸入輸出文件簡介,使用文件的步驟如下: 說明一個文件流對象(內部文件)。 文件流類型ifstream支持從輸入文件提取數據的操作。 而文件流類型ofstream完成數據寫入輸出文件的各種操作。 ifstream ifile; /定義輸入文件,ifile為文件名,可用任意標識符 ofstream ofile; /定義輸出文件,ofile為文件名,可用任意標識符 (2) 打開文件。 ifile.open(”d:my_in_file.txt”); ofile.open(”d:my_out_file.txt”); 引號中的”d:my_in_file.txt” 和”d:my_out_file.txt”為磁盤文件路徑名,這樣在文件流對象和磁盤文件名之間建立了聯系。,(3) 對文件進行讀寫操作。最常見的文件讀寫是順序的,所謂“順序”指的是從文件頭開始進行讀寫。順序讀寫可用C+的提取運算符()和插入運算符()進行。也可以用讀字符的get()和讀字符串的getling()等函數。讀寫是在文件緩沖區(qū)中進行。 (4) 關閉文件。當打開一個文件進行讀寫后,應該顯式地關閉該文件。與打開文件相對應: ifile.clo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 糧食儲備的社區(qū)糧食安全計劃考核試卷
- 釀酒行業(yè)節(jié)能減排措施考核試卷
- 道路工程測繪技術考核試卷
- 遙感技術在應急管理與救援中的應用考核試卷
- 組織結構優(yōu)化與流程再造考核試卷
- 常見心臟疾病手術方式
- 新生兒NICU出科報告
- 麻醉專業(yè)就業(yè)分析研究
- Quadrilineatin-生命科學試劑-MCE
- 9-Heptadecanone-Heptadecan-9-one-生命科學試劑-MCE
- 雙液注漿施工方案
- 民兵訓練管理規(guī)定
- 2025年國家公務員考試行測常識題庫及答案(共300題)
- 2024冀少版七年級下冊生物期末復習知識點提綱(詳細版)
- 2025年《義務教育小學體育課程標準測試卷2022版》測試題庫及答案
- 全國衛(wèi)生健康系統職業(yè)技能競賽(傳染病防治監(jiān)督)參考試題(附答案)
- 人工智能算法與市場營銷的融合研究
- DBJ50-T-157-2022房屋建筑和市政基礎設施工程施工現場從業(yè)人員配備標準
- 國家開放大學專本科《經濟法學》期末紙質考試總題庫2025春期版
- 顯示屏幕抗反光技術研究-洞察分析
- 地磅及地磅房施工方案
評論
0/150
提交評論