C++程序設計:第三章 流程控制語句_第1頁
C++程序設計:第三章 流程控制語句_第2頁
C++程序設計:第三章 流程控制語句_第3頁
C++程序設計:第三章 流程控制語句_第4頁
C++程序設計:第三章 流程控制語句_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

語句是構成程序的基本單元。C++中的語句一般分為六大類:第一節(jié)C++語言的語句

說明語句;表達式語句;控制語句;函數調用語句;復合語句以及空語句;分別簡述如下:

1.說明語句在C++中,說明語句的位置比較自由,可根據需要放在函數定義之內或外。但應放在被說明的對象使用之前的位置。也就是說,先定義,再使用。例如:main(){charx,y;x=‘1’;y=‘y’;...}main(){

x=‘1’;

charx,y;y=‘y’;...}正確不正確,在x=‘1’之前尚未定義2.表達式語句任何一個語句必須以分號結束,因此分號可作為判定一個語句的標志。main(){charx,y;

x=‘1’y=‘y’;if(x>y)x=y;...}這是賦值表達式,缺分號,編譯時系統將給出出錯信息未加分號的表達式不能成為語句,它不能單獨存在,只能嵌套在其它語句中。例如:這是關系表達式,也缺分號,使用正確

如果在x=‘1’的末尾加上分號;,就和y=‘y’;一樣成為表達式語句。

3.控制語句按語句在程序中的先后位置,從上到下,從左到右依次執(zhí)行,這是計算機執(zhí)行程序的基本規(guī)則。這個規(guī)則就象水往低處流的規(guī)律一樣,故程序的執(zhí)行過程稱為流程。

如果需要改變上述規(guī)則,就要用到控制語句。

4.函數調用語句調用函數的語句稱為函數調用語句。例如

sin(x);就是調用正弦函數的語句。

5.復合語句原則上,控制語句中只能嵌套一個語句,有時一個語句不能滿足要求,需要多個語句,此時可將它們用一對花括號,使它們成為復合語句。如main(){chart,x,y;x=‘1’;y=‘y’;if(x>y)

{t=x;x=y;y=t}

...}請注意,它們在邏輯上還是一個語句。

3.2選擇結構語句

包括條件語句和開關語句。3.2.1條件語句語句1表達式值為真語法格式和執(zhí)行過程:...上一個語句;if(表達式)語句1;else

語句2;下一個語句;...然后繞過語句2如果值為真執(zhí)行執(zhí)行流程圖3.2選擇結構語句

包括條件語句和開關語句。3.2.1條件語句語句1表達式值為真語法格式和執(zhí)行過程:...上一個語句;if(表達式)語句1;else

語句2;下一個語句;...如果值為假執(zhí)行繞過語句1執(zhí)行語句2流程圖值為假語句23.2選擇結構語句

包括條件語句和開關語句。3.2.1條件語句語句1表達式值為真語法格式和執(zhí)行過程:...上一個語句;if(表達式)語句1;else

語句2;下一個語句;...如果值為假執(zhí)行繞過語句1執(zhí)行語句2流程圖值為假語句2

幾點說明:

1.括號中的表達式就是條件,只要能獲得整數0和非0值,任何表達式都可以。

2.在語法和邏輯關系上,語句1和語句2都只能是一個語句。需要多個語句時,必須用復合語句。例如3.2選擇結構語句

包括條件語句和開關語句。3.2.1條件語句語句1表達式值為真語法格式和執(zhí)行過程:...上一個語句;if(表達式)

{語句1-1;...語句1-n;}else

{語句2-1;...語句2-n;}下一個語句;...流程圖值為假語句2

盡管復合語句中允許有若干條語句,但在語法和邏輯關系上還是被看作一個語句。語句1語句2

3.無論是否復合語句,語句1和語句2都不是獨立語句。它們都是條件語句的從屬語句。只能根據條件來決定執(zhí)行哪一個。3.2選擇結構語句

包括條件語句和開關語句。3.2.1條件語句語句1表達式值為真語法格式和執(zhí)行過程:...上一個語句;if(表達式)

{語句1-1;...語句1-n;}else

{語句2-1;...語句2-n;}下一個語句;...流程圖值為假語句2

4.無論選擇結構if-else是否嵌套復合語句,在語法和邏輯關系上從if開始到else結束都是一個語句。

因為語句1和語句2既可是簡單的表達式語句,也可是其它控制語句。因此,很可能出現嵌套+嵌套+...+嵌套的語句結構。

下面舉例說明:

假設某班的’a’和’b’是班長候選人,他們的得票數分別是num1和num2,編一個程序來確定班長monitor。#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2;cin>>num1>>num2;if(num1>num2)monitor=‘a’;elsemonitor=‘b’;cout<<“monitoris:”<<monitor<<endl;}說明語句執(zhí)行語句

這個程序可以這樣設計

在執(zhí)行語句中,共有三個獨立語句,它們是:#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2;cin>>num1>>num2;if(num1>num2)monitor=‘a’;elsemonitor=‘b’;cout<<“monitoris:”<<monitor<<endl;}輸入語句條件語句輸出語句

在執(zhí)行語句中,共有三個獨立語句,它們是:#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2;cin>>num1>>num2;if(num1>num2)monitor=‘a’;elsemonitor=‘b’;cout<<“monitoris:”<<monitor<<endl;}

執(zhí)行的順序是:(1)(2)(3)

執(zhí)行前,系統先編譯,#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2;cin>>num1>>num2;if(num1>num2)monitor=‘a’;elsemonitor=‘b’;cout<<“monitoris:”<<monitor<<endl;}monitornum1num2用于存放char型常數用于存放int型常數第1步執(zhí)行,假如鍵入2122<CR>2122

無錯后,分配三個單元:#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2;cin>>num1>>num2;if(num1>num2)monitor=‘a’;elsemonitor=‘b’;cout<<“monitoris:”<<monitor<<endl;}monitornum1num2用于存放char型常數用于存放int型常數第2步執(zhí)行,先判斷表達式2122條件為假,因此執(zhí)行,結果是b

由于條件是假,故執(zhí)行時繞過了語句monitor=‘a’;#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2;cin>>num1>>num2;if(num1>num2)monitor=‘a’;elsemonitor=‘b’;cout<<“monitoris:”<<monitor<<endl;}monitornum1num2用于存放char型常數用于存放int型常數第3步執(zhí)行2122輸出結果是bmonitoris:b

由于a的得票數少于b,因此,計算機顯示出b當班長。#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;if(num1>num2)

{monitor=‘a’;num=num1;}else

{monitor=‘b’;num=num2;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}

若要求計算機同時顯示當選人的得票數時,條件語句中的語句1和語句2就要采用復合語句。例如復合語句同時顯示得票數必須對增加的變量進行定義#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;if(num1>num2){monitor=‘a’;num=num1;}else{monitor=‘b’;num=num2;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}monitornum1num2

編譯和執(zhí)行過程:編譯時增加了一個num單元num

則繞過第一個復合語句,執(zhí)行#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;if(num1>num2){monitor=‘a’;num=num1;}else{monitor=‘b’;num=num2;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}monitornum1num22122b

執(zhí)行時,假設還是鍵入2122,則num

執(zhí)行if語句時,條件為假,22

輸出語句的顯示結果是:monitoris:bnum:22#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;monitor=‘b’;num=num2;

if(num1>num2)

{monitor=‘a’;num=num1;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}修改上例:取消else,其后面的語句2調往if語句之前。monitornum121num222num它們分別成為兩個獨立的語句

根據順序執(zhí)行的原則,在執(zhí)行if語句之前,先執(zhí)行這兩個語句。

因為安排在同一行,故按從左到右的順序。即b22

此外,if語句還有一種更簡單的結構,即——單選結構。#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;monitor=‘b’;num=num2;

if(num1>num2)

{monitor=‘a’;num=num1;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}

然后執(zhí)行if語句,monitornum121num222num這個復合語句不執(zhí)行

因為條件為假,因此b22

執(zhí)行兩個輸出語句后,顯示結果為:monitoris:bnum:22#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;monitor=‘b’;num=num2;

if(num1>num2)

{monitor=‘a’;num=num1;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}

如果執(zhí)行輸入語句時,從鍵盤上鍵入的數據是2221

則monitornum122num221num

再執(zhí)行語句b21執(zhí)行if語句條件為真。#include<iosteam.h>voidmain(){

charmonitor;

intnum1,num2,num;cin>>num1>>num2;monitor=‘b’;num=num2;

if(num1>num2)

{monitor=‘a’;num=num1;}cout<<“monitoris:”<<monitor<<endl;cout<<“num:”<<num<<endl;}

再執(zhí)行兩個輸出語句之后,顯示結果為:monitornum122num221numb22monitoris:anum:22a22

這種算法就象先占座位后驗票。利用if語句的單選結構形式,使程序得到簡化。原數據洗掉,新數據取代這是存儲器一擠就走的特點。

單選擇結構的流程圖表達式真假語句語句1表達式值為真值為假語句2...上一個語句;if(表達式)

{語句1-1;...語句1-n;}else

{語句2-1;...語句2-n;}下一個語句;......上一個語句;if(表達式)

{語句1-1;...語句1-n;}下一個語句;...從屬語句獨立語句

條件語句的嵌套問題

條件語句中

if(表達式)語句1;else

語句2;

語句1和語句2可以是C++中的任何語句。如果出現

if(表達式)語句1;

elseif(表達式)語句2;

else語句3;

if(表達式)

if(表達式)

if(表達式)語句1;

else語句2;

elseif(表達式)

else語句3;

或者

這是一種復雜的條件語句嵌套,你能分清它們的邏輯關系嗎?

{}

此時就要用到判斷多層嵌套的基本規(guī)律,即

if(表達式)語句1;

elseif(表達式)語句2;

else語句3;

if(表達式)

if(表達式)

if(表達式)語句1;

else語句2;

elseif(表達式)語句3;

else語句4;

或者

它們都是一個語句!這就是說,在執(zhí)行以下任一個條件語句時,其中的語句1、語句2、語句3只有一個能被執(zhí)行。

究竟執(zhí)行那一個,則應根據表達式的值來確定。那么多else,它們是屬于哪個if呢?C++規(guī)定,else與其前面最近的尚未配對的if配對。即

如果希望改變配對關系,

可利用花括號對

if(表達式)語句1;

else

if(表達式)語句2;

else

語句3;

if(表達式)

if(表達式)

if(表達式)語句1;

else語句2;elseif(表達式)語句3;

else語句4;else從屬語句else從屬語句if從屬語句if從屬語句配對關系解析:if(條件表達式1){if(條件表達式2)

語句1else

語句2}else{if(條件表達式3)

語句3else

語句4

}條件表達式1條件表達式2條件表達式3TTTFFF語句1語句2語句3語句43.2.2條件運算符——?:

這是三目運算符,怎么使用呢?回顧前面例題中的if語句if(num1>num2)monitor=‘a’;elsemonitor=‘b’;

把它改成monitor=num1>num2?‘a’:‘b’;條件為真monitor=num1>num2?‘a’:‘b’;條件為假把字符a賦給monitor把字符b賦給monitor

這就是三目運算符構成的條件表達式,其作用與上面的條件語句if——else完全相同。

其基本格式為monitor=num1>num2?‘a’:‘b’;表達式1

請注意,本例中是把單個運算對象——字符常數當作表達式。1目表達式2表達式32目3目

運算規(guī)則是,先運算表達式1的值,這個值必須是整數0和非0,即真和假;當值為非0時,就運算表達式2;值為0時,則運算表達式3。

本例中加入了一個賦值運算,由于賦值運算的優(yōu)先級低于三目運算符?:,因此,運算過程是,先運算賦值號右邊的表達式,再根據表達式1的結果將表達式2或者表達式3的值賦給變量monitor。

強調一下,表達式1、2、3不是語句,上例中最后加上分號,才使其整體成為一個語句。3.2.3開關語句

if語句為程序的流程提供了選擇余地,但最多只能二選一。需要解決多選一問題時,則可利用C++中的開關語句,例如:

為便于查詢,編一個存放班委成員檔案的程序:假設用a,b,c,d分別代表班長、學習委員、生活委員、體育委員。程序如下:#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch)

{

case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;

}}開關語句,紅字體(含冒號)是關鍵字switch語句也稱開關語句、多重選擇語句。一般用于“根據一個量的多種不同取值實現程序執(zhí)行流程的多個分支”。用switch語句可以避免if-else多層嵌套,提高程序的可閱讀性

表達式值1值2值n語句序列1語句序列2語句序列n

執(zhí)行過程是:

如果從鍵盤上鍵入一個字符常數a,則執(zhí)行到開關指令switch時,由于ch的值為a,因此就執(zhí)行case

‘a’:右邊的語句序列,直到break語句。

然后跳出開關語句,在本例中,也就意味著程序結束。#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch)

{

case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;

}}

如果鍵入的字符不是a,b,c,d中任一個,則執(zhí)行default后結束本例中為空語句

由它來確定選擇執(zhí)行哪一個case指令后面的語句序列。

從語句特點可以看出,開關語句可提供多種選擇分支,究竟多少種,則可根據需要。#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch)

{

case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;

}}起開關作用的表達式

switch后面括號中的表達式就是一個開關,所謂語句序列,是由多個語句組成常量表達式,只能由整數或字符構成3.3循環(huán)語句#include<iostream.h>voidmain(){charch;cin>>ch;switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}}

在上例中,如果還要輸出另一個班委的檔案,那么,整個程序就要重新開始執(zhí)行。若要輸出所有班委的檔案,整個程序則要執(zhí)行4次。如果采用循環(huán)語句,整個程序只要啟動1次。例如:

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

將開關語句嵌套在循環(huán)語句中循環(huán)語句的嵌套語句,稱為循環(huán)體。

本例中,循環(huán)體含有兩個語句,除開關語句之外,還有輸入語句

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

在循環(huán)語句中,紅字體while是關鍵字,代表循環(huán)指令。其右邊括號中是一個表達式。表達式的值只能是整數0和非0

與if語句相同,循環(huán)語句的嵌套語句也只能是一個語句,本例中需要兩個語句,故采用復合語句。

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

現在來看編譯和執(zhí)行過程。首先,編譯時系統分配一個可存放字符數據的單元,單元地址——變量名是ch。ch

編譯正確后進入執(zhí)行階段,第一步是執(zhí)行輸入語句

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

此時提取符>>等待你從鍵盤上鍵入數據,假設鍵入的第一個字符是a,結果是:cha

while(ch!=‘#’){

cin>>ch;}

取字符常數‘#’,再取ch中的字符a比較,#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

第二步執(zhí)行循環(huán)語句,先運算表達式,cha

兩者不相等,其值為1,即條件為真。此時才允許執(zhí)行循環(huán)體。

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

由于ch中當前的值是a,所以,轉去執(zhí)行case‘a’:右邊的語句。cha

當執(zhí)行了語句break后,開關語句結束。再順序執(zhí)行下一個語句

while(ch!=‘#’){

cin>>ch;}

假設第二次鍵入的數據是d,結果是#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

又是一個輸入語句chad

while(ch!=‘#’){

cin>>ch;}此時while指令指示表達式進行第二次運算,#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

再往下,到達復合語句(循環(huán)體)的邊界,此時意味著本次循環(huán)結束。chd

循環(huán)是否結束呢?沒有!

如果其值為0,就結束循環(huán),否則,繼續(xù)依次執(zhí)行循環(huán)體

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}chd

由于ch中當前的值是d,所以,轉去執(zhí)行case‘d’:右邊的語句。

當執(zhí)行了語句break后,開關語句結束。再順序執(zhí)行下一個語句

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}chd

此時輸入第三個數據,假設鍵入的數據是#,結果是#

再回到while去運算表達式。#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}

while(ch!=‘#’){

cin>>ch;}ch#

由于兩者相等,表達式的值為0,條件為假,則整個循環(huán)結束。

然后依次執(zhí)行循環(huán)后面的下一個語句。

在本例中,循環(huán)后面沒有語句,因此,本程序結束。

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}ch#本例中,如果始終不鍵入#,就會成為死循環(huán)。此時,在dos屏幕上呈現一片黑。

while(ch!=‘#’){

cin>>ch;}#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}

}ch#

從以上演示中可以看出,有一個信號始終在控制循環(huán)執(zhí)行與否。這個信號就是變量ch。我們該變量稱為循環(huán)語句的控制變量。cin>>ch;while(ch!=‘#’)

{cin>>ch;

4.3.1while語句從上例中我們已經了解了while語句的基本特征,此外,許多算法中往往用運算符++或--來改變控制變量的值。例如:

1.需要控制變量來決定循環(huán)是繼續(xù)還是停止;

2.在執(zhí)行循環(huán)語句前,控制變量必須獲得初始值;

3.在循環(huán)體內,控制變量的值必須可變,并且其值總有一次能使循環(huán)語句的表達式為0;用輸入語句獲取初始值用輸入語句改變控制變量的值,輸入#時,表達式為0while語句的特點:……}

除了以上介紹的while語句,

C++提供了另外兩種循環(huán)結構,do—while和for語句。

i=0;while(i<10)i++;初值,進入循環(huán)的門票表達式,門票的有效的條件循環(huán)體,期限遞減的記錄

顯然,如果把控制變量的初值i=0改成i=11,它的循環(huán)體i++;一次也不能執(zhí)行。下面要請同學們思考幾個問題:

問題1:如果把i=0改成i=9,循環(huán)體能執(zhí)行嗎?

問題5:上述語句不變,當i為何值時結束循環(huán)(不再執(zhí)行循環(huán)體)?

問題6:上述語句不變,循環(huán)體共執(zhí)行多少次?

問題2:如果執(zhí)行循環(huán)語句前i沒有值,循環(huán)體能執(zhí)行嗎?

問題3:如果把i++改成i--,將是什么結果?

問題4:上述語句不變,如果把i<10改成i>10,將是什么結果?

i=0;while(i<10)i++;

問題7:如果把上述語句改成,

問題8:或者改成,while(i<10){i=0;

i++;}

i=0;while(i<10){i=0;

i++;}

循環(huán)體能執(zhí)行嗎?將是什么結果?

循環(huán)體能執(zhí)行嗎?

3.3.2do——while語句

與while語句的區(qū)別是:先進場再驗票。例如

由于是無條件入口,所以只要執(zhí)行到該語句,循環(huán)體至少被執(zhí)行一次。與while語句一樣,當表達式的值(出口時條件)為0時,循環(huán)結束。

i=0;

doi++;while(i<10);入口,無條件出口時判斷下一次循環(huán)能否執(zhí)行的條件循環(huán)體,一個語句分號,循環(huán)語句標志

既然是無條件入口,那么上述語句改成do

{i=0;i++;}while(i<10);

能執(zhí)行嗎?結果如何呢?

do{

}while(ch!=‘#’);#include<iostream.h>voidmain(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}cin>>ch;

}

3.3.2do——while語句初始值

下面把關于“班委”的例題改用do——while循環(huán)循環(huán)體表達式

3.3.3for語句

for語句的格式與前面兩種循環(huán)語句區(qū)別較大,它可以把控制變量的初始值、循環(huán)控制以及控制變量變化的三個表達式集合在一起。例如:i=0;while(i<10)i++;for(i=0;i<10;i++)語句;for(i=0;i<10;i++)語句;表達式1,執(zhí)行for語句時第一次被執(zhí)行,使變量獲得初始值,僅執(zhí)行一次表達式3,每執(zhí)行一次循環(huán)體后,使控制變量的值變化一次表達式2,循環(huán)控制,類似于“驗票口”循環(huán)體,與前述相同,只能是一個語句此處分號不表示語句

3.3.3for語句

舉例說明:計算s=1+2+3+...+100。程序如下#include<iostream.h>voidmain(){inti,s=0;for(i=1;i<=100;i++)s+=i;

cout<<“s=”<<s<<‘\n’;}

這個例題教材中分別用while和do——while描述過。

課后請仔細觀察本例中表達式2與教材中100-103頁(共三個例題)控制循環(huán)的表達式是否相同?

需要特別強調,無論那種循環(huán),當控制變量是累加變化時,結束循環(huán)的條件是控制變量大于終值!例如:當i值變到101時,還要到此比較一次,此時表達式為0,系統才結束該循環(huán)不再執(zhí)行這個語句

顯然,控制變量是累減變化時,結束循環(huán)的條件是控制變量小于終值!

在這個語句中,如果把循環(huán)體中的語句順序調換,結果一樣嗎?為什么?i=1;for(;i<=100;

){}i++;s+=i;

下面再把關于“班委”的例題改用for循環(huán)。

for語句中也可以沒有表達式1、2,但分號不能省,例如:i=1;for(;i<=100;

){s+=i;i++;}while(i<=100)

下面再把關于“班委”的例題改用for循環(huán)。#include<iostream.h>voidmian(){charch;cin>>ch;

switch(ch){case‘a’:cout<<“wangwei,female,age:20”<<endl;break;case‘b’:cout<<“l(fā)ijin,male,age:19”<<endl;break;case‘c’:cout<<“l(fā)iuyi,male,age:21”<<endl;break;case‘d’:cout<<“xuhua,female,age:20”<<endl;break;default:;}cin>>ch;

}

for(;ch!=‘#’;){

}省去了表達式1,表達式33.3.4多重循環(huán)

許多數據處理問題,往往需要采用這樣一種算法:在一個循環(huán)語句的循環(huán)體內再插入一個甚至多個循環(huán)語句。這種算法稱為多重循環(huán)或循環(huán)嵌套,下面舉例說明。

編程序輸出如下乘法表:

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

分析:首先要考慮,無論是顯示還是打印機打印,一般都是按行輸出。也就是說,在作下一行輸出操作時,不可能再回到上一行去輸出信息。所以,要輸出這張乘法表,必須根據表的排列方式來設計算法。

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

顯然,表中紅字體可以看作被乘數,它們不需要經過數學運算,利用變量與++運算符結合進行循環(huán)即可輸出。例如輸出第一行(紅字體)的算法:for(j=1;j<10;j++)cout<<j;沒有轉義字符‘\n’從1到9輸出都不換行

執(zhí)行后,輸出結果是:

123456789_光標位置cout<<‘\n’;輸出一空行后換一行的語句

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

顯然,表中紅字體可以看作被乘數,它們不需要經過數學運算,利用變量與++運算符結合進行循環(huán)既可輸出。例如輸出第一行(紅字體)的算法:for(j=1;j<10;j++)cout<<j;cout<<‘\n’;

執(zhí)行后,輸出結果是:

123456789此時光標位置,下面的數據可在該行輸出_

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281輸出第一行(紅字體,共9列)的算法:for(j=1;j<10;j++)cout<<j;cout<<‘\n’;

執(zhí)行后,輸出結果是:

123456789此時光標位置,下面的數據可在該行輸出_

由于該行數據輸出與下面的數據無關,故可以單獨處理。

但要考慮表的格式,因此:

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281輸出第一行(紅字體)的算法:

執(zhí)行后,輸出結果是:

123456789先輸出n個空格字符但不換行_cout<<“”;for(j=1;j<10;j++)cout<<j<<“”;cout<<‘\n’每輸出一個數據后緊接著輸出n個空格字符

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

表中藍字體可以看作乘數,它們也不需要經過數學運算,利用變量與++運算符結合進行循環(huán)即可輸出。例如假設每行僅輸出一列(藍字體)的算法for(i=1;i<10;i++)cout<<i<<‘\n’;每輸出一個數據后就換一行1234...9—執(zhí)行結果是:光標位置

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

表中的黑字體是行與列相乘的結果。它們既要經過數學運算,還要考慮在哪一行輸出。

根據按行輸出的原則,凡是與當前那個乘數(藍字體)相乘所得的數據,必定與它同行。

以上分析可知,從第二行開始,每行的輸出既要考慮不經運算的乘數,還要考慮運算過程及其結果的輸出。

為了清楚起見,我們先考慮僅輸出第二行的算法。

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

算法如下:cout<<“1”<<“”;for(j=1;j<10;j++)cout<<1*j<<“”;cout<<‘\n’;先輸出乘數1,然后輸出n個空格但不換行循環(huán)體——輸出兩個數據:(1)運算結果(2)n個空格的字符串本行輸出結束后換一行請注意,它不屬于循環(huán)體循環(huán)語句,每循環(huán)一次,變量j增加1

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

算法如下:

執(zhí)行本算法后,輸出第1行的所有數據。顯然,輸出第i行的算法是相同的。要輸出所有行,就應使行數也能依次變化。但每行的變化必須發(fā)生在上一行中所有數據都處理完之后。即cout<<“1”<<“”;for(j=1;j<10;j++)cout<<1*j<<“”;cout<<‘\n’;可將這段程序包含在行變化的循環(huán)語句中成為循環(huán)體包括空格字符串

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281

算法如下:

cout<<“1”<<“”;for(j=1;j<10;j++)cout<<1*j<<“”;cout<<‘\n’;“i”ifor(i=1;i<10;i++)

{}成為循環(huán)體常數1必須改用控制變量i根據控制變量,將內外循環(huán)分別稱i循環(huán)和j循環(huán)。再看執(zhí)行過程:

cout<<“i”<<“”;for(j=1;j<10;j++)cout<<i*j<<“”;cout<<‘\n’;for(i=1;i<10;i++)

{}

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281執(zhí)行i循環(huán)語句:i=1且<10,可入循環(huán)體。結果是

cout<<“i”<<“”;for(j=1;j<10;j++)cout<<i*j<<“”;cout<<‘\n’;for(i=1;i<10;i++)

{}

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281執(zhí)行j循環(huán)語句:j=1且<10,可入j循環(huán)的循環(huán)體。重復執(zhí)行9次輸出:1*11*21*3...1*9的運算結果

cout<<“i”<<“”;for(j=1;j<10;j++)cout<<i*j<<“”;cout<<‘\n’;for(i=1;i<10;i++)

{}

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281請問,在此過程中,i的值變了嗎?重復執(zhí)行9次輸出:1*11*21*3...1*9的運算結果

cout<<“i”<<“”;for(j=1;j<10;j++)cout<<i*j<<“”;cout<<‘\n’;for(i=1;i<10;i++)

{}

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281j循環(huán)結束后:順序執(zhí)行該語句,使光標轉到下一行左邊。

cout<<“i”<<“”;for(j=1;j<10;j++)cout<<i*j<<“”;cout<<‘\n’;for(i=1;i<10;i++)

{}

1234567891123456789224681012141618336912151821242744812162024283236...991827364554637281到達i循環(huán)體邊界,此時回到i循環(huán)中的表達式3和2。執(zhí)行i++,得i值為2,繼續(xù)循環(huán),第二次執(zhí)行循環(huán)體。

cout<<“i”<<“”;for(j=1;j<10;j++)cout<<i*j<<“”;cout<<‘\n’;for(i=1;i<10;i++)

{}

123456789112345678922

溫馨提示

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

評論

0/150

提交評論