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

下載本文檔

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

文檔簡介

C++程序設(shè)計教程(第二版)第二章

基本編程語句

Chapter2

BasicProgrammingStatements計算機與信息工程學(xué)院

徐素錦4/18/20231第二章基本編程語句說明語句(DeclarativeStatements)條件語句(ConditionStatements)循環(huán)語句(LoopStatements)循環(huán)設(shè)計(LoopDesigns)輸入輸出語句(Input/OutputStatements)轉(zhuǎn)移語句(MoveStatements)再做循環(huán)設(shè)計(MoreLoopDesigns)4/18/202322.1說明語句(DeclarativeStatements)編程是要完成計算的,要計算就會有數(shù)據(jù)(整數(shù)、小數(shù)、字符串或更復(fù)雜的數(shù)據(jù))的進出,這個過程中需要把數(shù)據(jù)保存到某個存儲空間中,因此要對存儲空間進行說明。C++用名稱來代表存儲空間。兩類名稱:變量/常量:由C++內(nèi)部數(shù)據(jù)類型定義;對象/常對象:由外部(自定義)數(shù)據(jù)類型定義。4/18/20233要使用名稱來存放數(shù)據(jù),必須先說明名稱說明語句分為定義語句和聲明語句:定義語句:在說明名稱的同時,還給名稱分配了存儲空間聲明語句:只是說明了名稱,并沒有給名稱分配存儲空間,還必須通過定義語句分配空間。(在復(fù)雜的程序結(jié)構(gòu)中為了說明一個名稱可以在各處共享,而又要避免多處定義造成的空間沖突)4/18/20234定義變量的目的:創(chuàng)建一個所需大小的實體空間給變量名;說明變量的表示范圍;說明變量可以進行的運算等。變量定義

4/18/20235變量定義

變量由變量名、數(shù)據(jù)類型和值三部分組成,是可尋址的,也就是說,能夠通過內(nèi)存地址讀寫變量的數(shù)值。因此,對于每個變量來說,都有兩個值與其相關(guān)聯(lián):(1)變量的數(shù)值;(2)變量的地址?!?243078124307912430801243081124308212430831243084124308512430861243087124308812430891243090內(nèi)存空間內(nèi)存地址存儲單元(1Byte)例:inta=12;12變量a的地址變量a的數(shù)值4/18/20236變量定義格式:例如:

inta;doubled=3.5;staticinta2=12;注意:變量必須先定義后使用!變量的定義會引起內(nèi)存的分配,因此每個變量只能被定義一次,多次定義將導(dǎo)致編譯錯誤。[<存儲類型>]<數(shù)據(jù)類型><變量名>[=<初始值>];4/18/20237變量名的命名規(guī)則

①由數(shù)字、字母和下劃線組成;②必須以字母或下劃線開頭;③對字母大小寫敏感(即區(qū)分大小寫字母);④C++的關(guān)鍵字不能用作變量名;⑤在同一作用域內(nèi)是唯一的。例如,下面的變量定義將導(dǎo)致編譯錯誤:char89_name;//變量名不能以數(shù)字開頭boolis-loan;//中劃線不能出現(xiàn)在變量名中,

//字符間的連接應(yīng)該采用下劃線intclass;//class是關(guān)鍵字,不能用做變量名4/18/20238變量的初始化

C++支持下面4種形式的變量初始化:(1)顯式賦值,在定義變量時,通過賦值運算符“=”為變量提供初始值。例如:

intbuffer=1024;//變量buffer被初始化為1024(2)隱式賦值,在定義變量時,通過括號“(

)”提供初始值。例如:

intbuffer(1024);//變量buffer被初始化為1024(3)每一種內(nèi)嵌的數(shù)據(jù)類型都支持一個構(gòu)造函數(shù),能夠?qū)⒆兞砍跏蓟癁?。例如:

intbuffer=int();//變量buffer被初始化為0(4)類對象是通過構(gòu)造函數(shù)來提供初始化的。4/18/20239格式:

變量=表達式;

說明:

①”=”是賦值運算符;

②賦值運算符左邊只能是變量,不能為常量或函數(shù)調(diào)用;

③賦值運算符右邊的表達式可以是常量、變量、函數(shù)調(diào)用或者它們的組合。

例:f_Val=3;

x=x+1;

k=i*j;

a2=a1+area(35.6)+2.1;

變量的賦值4/18/202310例:求球體表面積-

f0201.cpp,#include<iostream>usingnamespacestd;intmain(){

doubleradius;//變量定義,沒有初始化

cout<<“Pleaseinputradius:“;

cin>>radius;

doubleresult=radius*radius*3.14*4;

cout<<“Theresultis“<<result<<“\n“;}4/18/202311函數(shù)(過程)說明:函數(shù):把相關(guān)的程序語句放在一起,完成特定的功能,并給這些語句起一個名字。求解中需要通過函數(shù)調(diào)用來實施求解時,便要對函數(shù)的性質(zhì)進行說明,說明其返回類型,參數(shù)類型,參數(shù)個數(shù)。4/18/202312

函數(shù)說明分函數(shù)聲明和函數(shù)定義兩種:

函數(shù)聲明是說明函數(shù)的名字,函數(shù)的返回類型,以及函數(shù)的參數(shù)和參數(shù)個數(shù).

格式:

<返回類型><函數(shù)名>(<參數(shù)表>);

例如:

doublearea(doublera);

intadd(inta,intb);

stringcatch(string,char);4/18/202313

函數(shù)定義是在函數(shù)聲明的基礎(chǔ)上,對整個實現(xiàn)過程進行詳細(xì)定義.

格式:

<返回類型><函數(shù)名>(<參數(shù)表>)

{

<若干條語句>

return函數(shù)的返回值;

}

例如:

doublearea(double

ra){

doubles=ra*ra*3.14;

returns;

}4/18/202314函數(shù)調(diào)用:就是使用函數(shù)名字;以便完成相應(yīng)的功能。使用名字前必須清楚名字的性質(zhì),所以必須先對函數(shù)進行聲明,后調(diào)用!運行程序時,會涉及到被調(diào)用函數(shù)的執(zhí)行,所以凡是被調(diào)用的函數(shù)都必須有函數(shù)定義,不管該定義在程序的什么位置.4/18/202315例如:

#include<iostream>

usingnamespacestd;

doublesphere();//聲明

intmain(){

doubleresult=sphere();//調(diào)用

cout<<“area:“<<result<<“\n”;

}

doublesphere(){//定義

cout<<“Pleaseinputradius:“;

doubler;cin>>r;

returnr*r*3.14;

}4/18/2023162.2

條件語句(ConditionStatements

)一、if語句的兩種形態(tài):

if(條件表達式)

語句;例:

if(a>b)

cout<<a<<endl;條件語句否是4/18/202317②

if(條件表達式)

語句1;

else

語句2;例:if(a>=b)

cout<<a<<endl;else

cout<<b<<endl;條件語句1否是語句24/18/202318說明:1.括號必須要。2.If條件后面的語句若不止一條,要用花括號包成語句塊。3.一個變量,一個定義語句或賦值語句都可以作為if語句的條件4.當(dāng)條件表達式的值為0時表示假,非0時表示真例如:if(s)cout<<“hello”;if(inta=b)

cout<<a<<endl;a=a+6;//error4/18/202319若分支“語句”之一是if語句,就是if語句嵌套。例如,輸入兩個整數(shù),比較兩個數(shù)的大小。

#include<iostream>usingnamespacestd;

intmain(){

int

x,y;

cout<<"Enterxandy:";

cin>>x>>y; if(x!=y) if(x>y)

cout<<"x>y"<<endl; else

cout<<"x<y"<<endl; else

cout<<"x=y"<<endl; }二.if語句的嵌套4/18/202320注意:if嵌套中的二義性問題例:intx=-20;if(x>=0) if(x<50)

cout<<“ok\n”;else

cout<<“notok\n”;

解釋一:intx=-20;if(x>=0){ if(x<50)

cout<<“ok\n”;else

cout<<“notok\n”;}解釋二:intx=-20;if(x>=0){ if(x<50)

cout<<“ok\n”;}else

cout<<“notok\n”;4/18/202321if…else語句成對的規(guī)則是:“就近原則”;C++規(guī)定:else總是和離它最近的還沒有配對的可見的if匹配。

4/18/202322例:

if(條件1)

if(條件2)

{ if(條件3) 語句1;

}

else

語句2;

注:else會和第2個if匹配,第3個if對else不可見。4/18/202323條件運算符:

?:

條件表達式:

表達式1?表達式2:表達式3

運算規(guī)則:如果表達式1為“真”,整個表達式的值取表達式2的值,否則取表達式3的值。相當(dāng)于:三.條件表達式if(表達式1)

表達式2;else

表達式3;4/18/202324例:①if(x>0&&x<50)cout<<“ok\n”;elsecout<<“notok\n”;可以表示為:(x>0&&x<50)?cout<<“OK\n”:cout<<“NotOk\n”;或者:cout<<(x>0&&x<50?“ok\n”:“notok\n”);cout<<(x>0&&x<50?“”:“not”)<<“ok\n”;

//必須有括號!4/18/202325②對于

if(x) a=327981; else b=327981;

可表示為:

x?a=327981:b=327981;

如果a和b為同類型,則還可以:

(x?a:b)=327981;//作左值,括號不能省

y=(x?a:b);//此處的圓括號可以去掉

y=x?a:b;4/18/202326intx,a,b;x=a=b=1;x?a:b=2;cout<<“a=”<<a<<endl<<“b=”<<b<<endl;③下面兩個程序塊分別輸出什么結(jié)果?intx,a,b;x=a=b=1;(x?a:b)=2;cout<<“a=”<<a<<endl<<“b=”<<b<<endl;if(x)a;elseb=2;if(x)a=2;elseb=2;結(jié)果:a=1b=1結(jié)果:a=2b=14/18/202327一般形式:

switch(表達式){case常量表達式1:語句1;break;case常量表達式2:語句2;break;//… case常量表達式n:語句n;break; default:語句n+1;

}四、switch語句(多分支選擇語句)4/18/202328例如:根據(jù)成績等級輸出百分制分?jǐn)?shù)段。char

grade;cin>>grade;switch(grade)

{case’A’:cout<<“90~100\n”;break;

case’B’:cout<<“80~89\n”;break;

case’C’:cout<<“70~79\n”;break;

case’D’:cout<<“60~69\n";break;

case’E’:cout<<“0~60\n”;break;

default:cout<<“error!\n”;

}4/18/202329說明:1.switch括號中的表達式只能是整型、字符型或枚舉型;且case后面的常量表達式的類型必須與其匹配eg:floatf=1.6;

switch(f){……}

//error:f是浮點型2.case值是語句標(biāo)號,每個case常量表達式的值必須互不相同3.break的作用是跳出switch語句,4.在每個分支都帶有break的情況下,case的次序不影響執(zhí)行結(jié)果4/18/2023305.多個case可以共用一組執(zhí)行語句例如:

case’A’:case’B’:case’C’:case’D’:cout<<“>60\n";break;

但是不能將值用逗號隔開,即

case‘A’,’B’,’C’,’D’:cout<<“>60\n”;break;6.default語句是可選的7.switch語句可以嵌套使用,“就近原則”4/18/202331

switch(整數(shù)表達式){casevalue1:

語句1;break;casevalue2:

語句2;break;…default:

語句n;}等價于:

if(整數(shù)表達式==value1)

語句1;elseif(整數(shù)表達式==value2)

語句2;…else

語句n;}switch語句和if語句相互彌補:注意:若測試一個整形變量取幾個不同的值,用switch語句比較好;如果是范圍測試或是實型數(shù)的比較判斷,用if語句比較好4/18/202332一、for循環(huán)語句一般形式:

for(表達式1;表達式2;表達式3){若干語句;}

可理解為:

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量修正)

{

若干語句;

}循環(huán)前先求解每次執(zhí)行完循環(huán)體后求解非0時執(zhí)行循環(huán)體2.3循環(huán)語句(LoopStatements

)4/18/202333條件判斷循環(huán)體語句假真狀態(tài)修正循環(huán)初始狀態(tài)結(jié)束開始例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循環(huán)初始狀態(tài)條件判斷狀態(tài)修正循環(huán)體語句4/18/202334i<=10Cout<<“hello.\n”假真i++;i=1;結(jié)束開始例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循環(huán)初始狀態(tài)條件判斷狀態(tài)修正循環(huán)體語句4/18/202335例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循環(huán)初始狀態(tài)條件判斷狀態(tài)修正循環(huán)體語句例2:

intsum=0;

for(inti=1;i<=100;i++){sum=sum+i;}

cout<<sum<<endl;i<=10Cout<<“hello.\n”假真i++;i=1;結(jié)束開始4/18/202336例1:for(inti=1;i<=10;i++)

cout<<”hello.\n”;循環(huán)初始狀態(tài)條件判斷狀態(tài)修正循環(huán)體語句例2:

intsum=0;

for(inti=1;i<=100;i++){sum=sum+i;}

cout<<sum<<endl;i<=100sum+=i;假真i++;i=1;sum=0;cout<<sum<<endl;4/18/202337對于for(表達式1;表達式2;表達式3)語句

說明:(1)表達式1可以省略。此時應(yīng)在for語句之前給循環(huán)變量賦初值。若省略表達式1,其后的分號不能省略。例如,求和運算:

intsum=0,i=1; for(;

i<101;i++)//分號不能省略

sum+=i;

//賦值縮寫4/18/202338(2)表達式2可以省略。這時候,需要在循環(huán)體中有跳出循環(huán)的控制語句。 例如,求和運算:

for(i=1;;i++){//分號不能省略

sum+=i; if(i>=100)break; }

等價于:

for(i=1;1;i++){ sum+=i; if(i>=100)break;

}//此處break表示退出循環(huán)。4/18/202339(3)表達式3可以省略。但此時程序員應(yīng)另外讓循環(huán)變量遞進變化,以保證循環(huán)能正常結(jié)束。

例如,求和運算:

intsum=0,i; for(i=1;i<101;){//分號不能省略

sum+=i;

i++; }sum+=i++;4/18/202340(4)表達式1和表達式3都可以省略。

例如,求和運算:

intsum=0,i=1; for(;i<=100;)//分號不能省略

sum+=i++;(5)三個表達式都可以省略。

例如,求和運算:

intsum=0,i=1; for(;;

){//分號不能省略

sum+=i++; if(i>=100)break; }4/18/202341(6)在表達式1中定義的循環(huán)變量只在for語句中有效;循環(huán)體可以為空。例如,求和運算:for(inti=1,sum=0;i<101;sum+=i++);//i在for語句之后就不能再使用//循環(huán)體是空語句,分號不能省略4/18/202342二、while循環(huán)語句因為并不是所有循環(huán)都有明顯的循環(huán)初始狀態(tài)和狀態(tài)修正的,所以,while循環(huán)是for循環(huán)的一種簡潔形式.

如,同樣的求和:intsum=0,i=1;while(i<=100)sum+=i++;cout<<sum<<endl;intsum=0,i=1;for(;i<=100;) sum+=i++;

cout<<sum<<endl;4/18/202343一般形式:while(表達式){循環(huán)體語句}

說明:

①先判斷條件再執(zhí)行;

②while后面的圓括號和圓括號中的表達式都必須有。表達式也可以是常量或常量表達式。 例:while(5){…//中間需要有跳出循環(huán)的控制語句

}

③循環(huán)體語句可以是復(fù)合語句,其中必須含有改變條件表達式值的語句。4/18/202344表達式循環(huán)體語句(包含狀態(tài)修正)假真初始狀態(tài)結(jié)束開始while(

表達式

){

循環(huán)體語句;//包含狀態(tài)修正}注意:循環(huán)體被執(zhí)行0次或n次4/18/202345例:求1加到100的和。#include<iotream.h>usingnamespacestd;voidmain(){

inti=1;//循環(huán)變量初始化

intsum=0

;while(i<=100

)//循環(huán)繼續(xù)條件

{//循環(huán)體

sum=sum+i; ++i;//改變循環(huán)變量

}

cout<<"sum="<<sum<<endl;}4/18/202346一般形式:do{

循環(huán)體}while(條件表達式);其中必須含有改變條件表達式值的語句。執(zhí)行順序①先執(zhí)行循環(huán)體語句;

②后判斷條件,表達式為

true

時,繼續(xù)執(zhí)行循環(huán)體。注意:該語句后面的分號必須要有!三、do…while語句4/18/202347do{

循環(huán)體語句;//包含狀態(tài)修正}while(

表達式

);表達式循環(huán)體語句(包含狀態(tài)修正)假真初始狀態(tài)結(jié)束開始注意:循環(huán)體被執(zhí)行1次或n次4/18/202348while語句:先判斷再執(zhí)行表達式循環(huán)體語句(包含狀態(tài)修正)假真初始狀態(tài)結(jié)束開始表達式循環(huán)體語句(包含狀態(tài)修正)假真初始狀態(tài)結(jié)束開始dowhile語句:先執(zhí)行再判斷4/18/202349while語句條件判斷循環(huán)體語句(包含狀態(tài)修正)假真初始狀態(tài)結(jié)束開始條件判斷循環(huán)體語句(包含狀態(tài)修正)假真初始狀態(tài)結(jié)束開始dowhile語句條件判斷循環(huán)體假真狀態(tài)修正循環(huán)初始狀態(tài)結(jié)束開始for語句4/18/2023502.4循環(huán)設(shè)計

(LoopDesigns

)(1)簡單字符圖形的雙重循環(huán)

MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM4/18/202351分析方法:(1)該圖形一共10行,每一行增加一個字符,所以,應(yīng)循環(huán)10次,每次輸出一行,其循環(huán)模式為:

for(inti=1;i<=10;++i){

輸出第i行

換行

}(2)行數(shù)、M的個數(shù)和循環(huán)變量i的關(guān)系行iM個數(shù)

111輸出第i行:

222for(intj=1;j<=i;j++)333cout<<“M”;444...1010

104/18/202352//f0204.cpp#include<iostream>usingnamespacestd;intmain(){

for(inti=1;i<=10;++i){

for(intj=1;j<=i;++j)cout<<"M";cout<<endl;

}}4/18/202353小節(jié):

通過雙循環(huán)輸出簡單字符圖形的模式外循環(huán):控制輸出的行數(shù)

for(inti=1;i<=N;i++){

輸出第i行;換行;

}內(nèi)循環(huán):控制每一行里具體字符的輸出

for(intj=1;j<=第i行的長度;j++){

…//逐字符輸出

}4/18/202354ASCII碼表碼值字符碼值字符碼值字符碼值字符0~32控制字符或通訊專用字符(不可見)34“46.92\0NUL(空值)35#47/93]1SOH(文頭)36$48~57‘0’~’9’94^4EOT(文尾)37%58:95_6ACK(確認(rèn))38&59;96`7BEL(響鈴)39‘60<97~122‘a(chǎn)’~’z’8BS(退格)40(61=123{10LF(換行)41)62>124|12FF(換頁)42*63?125}13CR(回車)43+64@126~32SP(空格)44,65~90‘A’~’Z’127DEL33!45-91[4/18/202355(2)

素數(shù)判定素數(shù)(也叫質(zhì)數(shù))定義1:除了1和它本身外沒有其他因子的自然數(shù)。定義2:只能被1和它本身整除的自然數(shù)。#include<iostream>usingnamespacestd;intmain(){cout<<"pleaseinputanumber:\n";intm;cin>>m;for(inti=2;i<m;++i)if(m%i==0){cout<<m<<"isn'taprime.\n";return1;}cout<<m<<"isaprime.\n";}4/18/202356(利用數(shù)學(xué)定律進行優(yōu)化)假設(shè)m不是素數(shù),則必有m=i×j

假定i≤j,則i2≤i×j=m≤j2

即i2≤m≤j2

即i≤√m≤j所以,m必定有一個不大于m平方根的因子,故判斷m是否為素數(shù),只要測試到m的平方根就可以了!

4/18/202357#include<iostream>#include<cmath>

//包含sqrt()usingnamespacestd;intmain(){

cout<<"pleaseinputanumber:\n";

intm;

cin>>m;doublesqrtm=sqrt(m*1.0);

//求平方根

for(inti=2;i<=sqrtm;++i)

if(m%i==0){

cout<<m<<"isn'taprime.\n";return1;}

cout<<m<<"isaprime.\n";}4/18/202358可以定義一個判斷m是否為素數(shù)的函數(shù):bool

isPrime(int

m){doublesqm=sqrt(m*1.0);

for(inti=2;i<=sqm;++i)

if(m%i==0)returnfalse;returntrue;}4/18/202359一、標(biāo)準(zhǔn)I/O流I/O控制流:輸入或輸出的字節(jié)序列(字符序列),在頭文件iostream.h中定義。操作符:<<

向輸出流“cout”中插入字符

cout:C++預(yù)定義的標(biāo)準(zhǔn)輸出設(shè)備

>>

從輸入流"cin"中抽取字符

cin

:C++預(yù)定義的標(biāo)準(zhǔn)輸入設(shè)備

作用:<<:用操作符"<<"右邊的內(nèi)容輸出到標(biāo)準(zhǔn)輸出設(shè)備上

>>

:用從標(biāo)準(zhǔn)輸入設(shè)備上所接收到的數(shù)據(jù)去更新操作符">>"右邊的對象2.5輸入輸出語句

(Input/OutputStatements

)

4/18/202360cout<<"HernameisJone\n";cout<<"theidis";cout<<2;cout<<endl;cout<<"HernameisJone\n"<<"theidis"<<2<<endl;inti;floatf;longL;cin>>i>>f>>L;1

2.168

314159例:4/18/202361二、流狀態(tài)通過流狀態(tài)控制輸出格式cout<<showpos<<12;//+12cout<<hex<<18<<”“<<showbase<<18;

//120x12cout<<hex<<255<<”“<<uppercase<<255;

//ffFFcout<<123.0<<”“<<showpoint<<123.0;

//123123.000cout<<(2>3)<<”“<<boolalpha<<(2>3);

//0falsecout<<fixed<<12345.678;//12345.678000cout<<scientific<<123456.678;

//1.234567e+054/18/202362取消流狀態(tài)的操作為:

noshowpos,noshowbase,nouppercase,

noshowpoint,noboolalphafixed,scientific,和一般顯示方式三者相互獨立,取消的方法是:

cout.unsetf(ios::fixed);cout.unsetf(ios::scientific);dec,oct,hex相互獨立;left,right相互獨立;4/18/202363帶參數(shù)的流狀態(tài):cout.width(int);//設(shè)置顯示寬度cout.fill(char);//設(shè)置填充字符cout.precision(int);//設(shè)置有效位數(shù)或精度注意:width(n)為一次性操作,即第二次顯示時將不再有效。默認(rèn)width(0),表示僅顯示數(shù)值。例如:cout.width(5);cout.fill(‘S’);cout<<23<<23;//輸出:SSS23234/18/202364在頭文件iomanip.h中定義了許多用于控制I/O流格式的控制符(對象)??梢灾苯訉⒖刂品迦肓髦?。即:在頭文件iomanip.h的支持下,還可以直接由<<操作。例:#include<iomanip>cout<<setw(6)<<setfill(‘$’)<<27<<27<<endl;//輸出:$$$$27274/18/202365

I/O流的常用控制符

控制符

描述

dec

設(shè)基數(shù)為10hex設(shè)基數(shù)為16

oct

設(shè)基數(shù)為8

setfill(c)設(shè)填充字符為c

setprecision(n)設(shè)顯示小數(shù)精度為n位

setw(n)設(shè)域?qū)挒閚個字符

setiosflags(ios::fixed)固定的浮點顯示

setiosflags(ios::scientific)指數(shù)表示

setiosflags(ios::left)左對齊

setiosflags(ios::right)右對齊

setiosflags(ios::skipws)忽略前導(dǎo)空白

setiosflags(ios::uppercase)16進制數(shù)大寫輸出4/18/202366例如;倒三角形字符圖形(P41)的輸出:方法1:#include<iostream.h>#include<iomanip.h>voidmain(){

for(intn=1;n<=10;n++)cout<<setfill('')<<setw(n)<<''<<setfill('M')<<setw(21-2*n)<<'M'<<endl;

}方法2:#include<iostream.h>voidmain(){for(intn=1;n<=10;n++)

cout<<string(n,‘’)+string(21-2*n,‘M’)+”\n”;}4/18/202367三、文件流的操作

文件流的輸入/出操作與標(biāo)準(zhǔn)輸入/出基本相同,只是需要以一定方式打開和關(guān)閉。文件打開的格式:

ifstreamfin(filename1,openmode=ios::in);

ofstream

fout(filename2,openmode=ios::out);注意:ifstream和ofstream是輸入/輸出文件流類,在fstream頭文件中聲明,使用時加#include<fstream>fin和fout是自定義的文件流名稱,分別對應(yīng)文件filename1和filename2

4/18/202368例f0211:#include<fstream>usingnamespacestd;intmain(){

ifstreammyin("a.txt");ofstreammyout("b.txt");for(stringstr;getline(myin,str);)myout<<str<<endl;}注意:當(dāng)省略文件路徑時,數(shù)據(jù)文件和程序應(yīng)該保存在同一個目錄下!4/18/202369輸入/輸出語句能返回操作狀態(tài)(true/false)

,所以判斷狀態(tài)就可以確定文件是否正常讀入,如getline(myIn,str)當(dāng)讀到文件尾或文件狀態(tài)異常時,便返回false,以使循環(huán)結(jié)束。if(cin>>a)

cout<<a;cin>>a;if(cin)

cout<<a;cin>>acout<<a;否是cincout<<a;否是cin>>a;4/18/202370if(getline(myIn,str))

cout<<str;Flag=getline(myIn,str);if(Flag)

cout<<str;getline(myIn,str)cout<<str;否是Flagcout<<str;否是Flag=getline(myIn,str);4/18/202371for(stringstr

;

getline(myIn,str)

;)myOut<<str<<endl;getline(myIn,str)myOut<<str<<endl;假真(空)stringstr;結(jié)束開始條件判斷循環(huán)體假真狀態(tài)修正循環(huán)初始狀態(tài)結(jié)束開始FlagmyOut<<str<<endl;假真stringstr;結(jié)束開始Flag=getline(myIn,str);4/18/202372例如:#include<iostream>usingnamespacestd;intmain(){for(inta;cin>>a;){cout<<a<<"";}}注意:在循環(huán)讀入數(shù)據(jù)時,常常將讀入操作放在循環(huán)的條件判斷上!4/18/202373#include<fstream>intmain(){ifstreammyIn("a.txt");ofstreammyOut("b.txt");for(stringstr;getline(myIn,str);)myOut<<str<<endl;ifstreammyIn2("c.mp3",ios::in|ios::binary);ofstreammyOut2("d.mp3",ios::out|ios::binary);for(stringstr;getline(myIn2,str);)myOut2<<str<<endl;ifstreammyIn3("d:\\doc\\e.wmv",ios::binary);ofstreammyOut3("d:\\doc\\f.wmv",ios::binary);for(stringstr;getline(myIn3,str);)myOut3<<str<<endl;}4/18/202374例f0212:用篩法判斷素數(shù)#include<iostream.h>#include<vector.h>#include<fstream.h>intmain(){vector<int>prime(10000,1);

for(inti=2;i<100;i++)

if(prime[i])

for(intj=i;i*j<10000;j++)

prime[i*j]=0;

ifstream

in(“a.txt”);

for(inta;in>>a&&a>1&&a<10000;)

cout<<a<<“is“<<(prime[a]?””:”not”)<<“aprime.\n”;}把1~10000之間2~99的所有倍數(shù)全部篩掉in&&a>1

&&a<10000cout<<…;假真inta;in>>a;4/18/2023751.break語句 只用于switch、for、while、do-while等語句中。作用: ①中止switch語句的執(zhí)行,并跳出switch語句 ②從最近的封閉循環(huán)體中跳出,結(jié)束當(dāng)前循環(huán)。轉(zhuǎn)而執(zhí)行該循環(huán)之后的語句 2.6轉(zhuǎn)移語句(MoveStatements

)

4/18/202376i<5假真i++;i=1;結(jié)束開始j<5cout<<…;假真++j;j=1;i*j>=5break;假真cout<<endl;#include<iostream.h>intmain(){

inti,j;

for(i=1;i<5;i++){

for(j=1;j<5;++j){

if(i*j>=5) break;

cout<<i<<“*”<<j<<“”;

}

cout<<endl;//break跳到此處

}}例:輸出相乘之積小于5的兩個正整數(shù)的所有組合。1*11*21*31*42*12*23*14*14/18/2023772.continue語句用于循環(huán)語句中,結(jié)束本次循環(huán),(即跳過循環(huán)體中尚未執(zhí)行的語句),接著進行下一次是否執(zhí)行循環(huán)的判定;注意:并不從循環(huán)體中跳出,除非已處于循環(huán)結(jié)束點例:for(;;){

for(;;){ //…

if(i==1) continue; //…

} a=1;}條件判斷假真狀態(tài)修正循環(huán)初始狀態(tài)i==1……a=1;假真continue;4/18/202378例:把100~200之間不能被3整除的整數(shù)輸出

for(intn=100;n<=200;n++){

if(n%3==0)continue;

cout<<n<<endl;}n<=200假真n++;n=100;n%3==0cout<<…;假真結(jié)束開始continue;100101103104106…4/18/202379continue與break的區(qū)別:

for(表達式1;表達式2;表達式3){

循環(huán)體語句;}4/18/2023803.goto

語句一般形式:goto

語句標(biāo)號;作用:將程序控制轉(zhuǎn)移到標(biāo)號所標(biāo)志的語句處.語句標(biāo)號:標(biāo)志符,命名規(guī)則與變量的命名規(guī)則相同;例:求1到100的和#include<iostream.h>voidmain(){

inti=1,sum=0;

loop: sum+=i; ++i;

if(i<101)

gotoloop;

cout<<"sum="<<sum;}4/18/202381#include<iostream.h>intmain(){

inta;

gotoInit;Forward:a=a+1;Print:

cout<<a<<endl;

gotoDown;Init:a=1;

gotoPrint;Down:if(a<100)

gotoForward;}#include<iostream.h>intmain(){

for(inta=1;a<101;a++)

cout<<a<<endl;}結(jié)果:1234…4/18/202382應(yīng)該禁用goto語句(不符合結(jié)構(gòu)化原則)C++中唯一比較適合使用goto的地方:當(dāng)從多重循環(huán)深處跳到循環(huán)之外時,如果用break語句,將要用多次,這時候用goto就比較簡單。

例:for(inti=1;i<100;i++){

for(intj=1;j<100;++j){

if(i*j==651)gotoEnd;//…}}End://…4/18/2023832.7再做循環(huán)設(shè)計(MoreLoopDesigns

)

一、邏輯判斷類問題對于邏輯判斷的問題,一般都要考慮全部的可能性,然后從這些可能性中按條件逐一排查,直到最后獲得某個結(jié)論。兩種模式:

①列出全部的可能性,去掉那些不滿足要求的情況。

②列出全部的可能性,從中選擇滿足要求的情況。4/18/202384①列出全部的可能性,去掉那些不滿足要求的情況。語句控制結(jié)構(gòu):

for(所有可能情況){//可為多重循環(huán)

if(條件1不滿足)continue;

if(條件2不滿足)continue;//…

if(條件n不滿足)continue;

輸出所要的結(jié)果

}4/18/202385②列出全部的可能性,從中選擇滿足要求的情況。語句控制結(jié)構(gòu):

for(所有可能情況){//可為多重循環(huán)

if(條件1滿足&&條件2滿足&&…&&條件n滿足)

輸出所要的結(jié)果

}4/18/202386例:百錢買百雞問題:雄雞7元1只,母雞5元1只,小雞1元3只?;?00元錢,買100只雞,如果雄雞、母雞和小雞都必須有,則雄雞、母雞和小雞應(yīng)各買幾只?分析:考慮全部的可能性時,先考慮雄雞、母雞和小雞數(shù)的取值范圍。由于各種雞都必須有,所以雄雞的最高耗用金額為100-5-1=94,取7的倍數(shù),得91元,所以雄雞的取值范圍為1~13。同理,母雞為1~18,小雞為3~96;4/18/202387所以本問題的條件是:

1、雄雞數(shù)+母雞數(shù)+小雞數(shù)=100;

cock+hen+chick-100==0

2、買雄雞款+買母雞款+買小雞款=100;

7*cock+5*hen+chick/3-100==0

3、小雞數(shù)為3的倍數(shù);

chick%3==0反條件是:

1、cock+hen+chick-100!=0

2、7*cock+5*hen+chick/3-100!=0

3、chick%3!=04/18/202388#include<iostream.h>

intmain(){

for(intcock=1;cock<=13;++cock)

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論