第3章 控制結構
3.1 知識要點
流程控制是控制程序中語句執行的順序。任何程序設計語言都具備流程控制的功能,而C++語言提供了比其它高級語言更豐富的流程控制語言。本章節主要介紹了程序設計中最基本三種結構:順序、分支和循環,要求掌握以下的知識要點:
1.掌握順序結構的編程方法。
2.掌握使用cin、cout實現數據的輸入/輸出。
3.學會應用字符輸入/輸出函數。
4.掌握scanf()函數和printf()函數的使用。
5.掌握條件語句的形式和使用。
6.掌握條件語句的嵌套。
7.掌握switch語句的形式和使用。
8.掌握for,while,do-while三種循環語句的應用。
9.掌握循環語句的嵌套。
10.掌握break、continue、goto語句。
3.2 典型例題分析與解答
1. 選擇題
例題1:如果有以下語句:int a,b; char m,n; cin>>a>>b>>m>>n;則下列輸入數據的方式中不正確的是( )。
A.10,20,X,Y B.1020 XY
C.10 20 X Y D.10、20、X、Y
答案:C
分析:C++語言沒有專門的輸入/輸出語句,其輸入/輸出是通過輸入/輸出流來實現的。用cin輸入時,空格和回車鍵均可作爲輸入字符之間的分隔符,逗號不能作爲分隔符。字符型變量只能容納一個字符。
例題2:以下不正確的語句是( )。
A.if(x>y);
B.if(x=y)&&(x!=0) x+=y;
C.if(x!=y)cin>>x;else cin>>y;
D.if(x<y) {x++;y++;}
答案:B
分析:if語句後面的表達式必須放在括號內“()”,且不能使用賦之值運算符。在if和else後面用花括號“{}”括起來的多個語句成爲了一個複合語句。
例題3:下面程序的輸出結果是( )。
#include<iostream.h>
void main()
{ int a=6,b=6;
if(a>5)
a-=1;
b+=1;
else
a+=1;
b-=1;
cout<<”a=”<<a<<endl;
cout<<”b=”<<b;
}
A.5 B.a=5 C.a=5 D.編譯時出錯
7 b=7 b=6
答案:D
分析:在if…else語句的中間應爲單條語句或複合語句,不能爲多條語句。
例題4:對while、do…while循環結構,下面說法正確的是( )。
A.只是表達形式不同
B.do…while結構中的語句至少執行一次
C.while結構中的語句至少執行一次
D.條件成立時,它們有可能一次也不執行
答案:B
分析:要知道while、do…while兩種循環結構的區別在於:while循環是先判斷條件是否成立,成立時才執行,而do…while是先執行再判斷,它至少執行一次。
例題5:以下不正確的是( )。
A.語句for(i=0;;i++)表示無限循環 B.for(;;)表示無限循環
C.for()也表示無限循環 D.while(1)表示無限循環
答案:C
分析:for循環語句中的表達式可以省略,但分號不可省略。
例題6:下面循環體的執行次數爲( )。
#include<iostream.h>
void main()
{ int a,b;
for(a=0,b=5;a<=b+1;a+=2,b--) cout<<a<<endl;
}
A.3 B.2 C.1 D.0
答案:A
分析:在for語句的表達式中使用了逗號運算符對變量a和b 進行賦初值,每次循環後改變變量a和b 的值,直到a>=b.
例題7:對中斷語句的說法下面不正確的是( )。
A.用戶可以指定中斷的位置 B.用戶可以指定轉移的位置
C.break語句可以跳出本循環 D.continue語句可以結束本次循環
答案:B
分析:不論break語句還是continue語句轉移的位置是根據程序默認的,不用人爲的設置。
例題8:下列函數的功能是( )。
#include<iostream.h>
void main()
{ char a; int i;
cin>>a;
for(i=1;i<=10;i++)
{ if((a>=’a’)&&(a<=’z’))
a=a-i;
cout<<a;
} }
A.把a中的小寫字母變成大寫字母 B.把a中的小寫字母變成大寫字母
C.把a中的所有字母變成小寫字母 D.把a中的字母變成它前面i個的字母
答案:D
分析:本題要求判斷程序的功能,可以用列舉法判斷其gon功能,例設a=’f’,則程序結果爲edcba^^^^^,本程序僅對在小寫字母a~z之間的字母起作用。
2. 填空題
例題9:下面的程序實現輸出x,y,z三個數中的最大值,請填入正確的內容。
#include<iostream.h>
void main()
{ int x=5,y=8,z=9, u, v;
if( (1) ) u=x;
else u=y;
if( (2) ) v=u;
else v=z;
cout<<”v=”<<v<<endl;
}
答案:(1)x>y (2) u>z
分析:本程序首先找出x和y中較大的數放入變量u中,再將u 與z 做比較,其中較大者放入變量v中,爲三個數中的最大值。
例題10:有以下程序段:
int n=0;
while(n=1)n++;
while循環執行次數是_____。
答案:爲無限次。
分析:要注意”=”和”= =”的區別,”=”是賦值運算符,”= =”是關係運算符“等於”。這裏while(n=1)永遠爲1,爲真值,則答案爲無限次。
例題11:計算1~20之間偶數之和,請填充:
#include<iostream.h>
void main()
{ int a,b,i;
a=0;b=0;
for(i=0; (1) ;i+=2)
{ a+=i;
(2) ;
(3) ;
cout<<”偶數之和爲:”<<a<<endl;
}
答案:(1)i<=20或i<21 (2)b+=i+1 (3) }
例題12:下面程序運行結束後,k的值爲_____。
#include<iostream.h>
void main()
{ int i,j,k;
for(i=0,j=10;i<=j;i++,j--)
k=i+j;
count<<k;
}
答案:10。
分析:在程序中每循環一次,變量i+1,而變量j-1,i+j之和保持不變爲10,直到循環結束。
例題13:下面程序是輸出100以內能被7整除且個位數是4的所有整數,請填空:
#include<iostream.h>
void main()
{ int i,j;
for(i=0; (1) ;i++)
{ j=i*10+4;
if( (2) )
continue;
(3)
cout<<j<<endl;
} }
答案:(1)i<=9或i<10 (2)j%7!=0 (3)else
分析:由題目可知判斷100以內的數,故i變量的終值應爲:i<=9或i<10。要滿足不被7整除的條件爲: j%7!=0;反之不滿足該條件的則要輸出。
3. 改錯題
例題14:下面的程序存在着語法錯誤,請指出並予以修改:
#include<iostream.h>
void main()
{ float x,y; //1
if(x>0); //2
x=x+y; //3
cout<<x<endl; //4
else cout<<-x; //5
}
答案:
(1)標號3語句改爲 {x=x+y; 。
(2)標號4語句改爲 cout<<x<endl;} 。
分析:選擇結構語句的語法要求,條件表達式放在括號內,後面不加逗號。if 語句後面有多於一個語句時要加大括號“{}”,成爲複合語句。
例題15:下面的程序是從鍵盤輸入10個字符,統計出其中的數字字符的個數。
void main() { int i, c, n; for(i=0,j=10,i++); { c=getchar( ); if(c>0 && c<9) n++ } cout<<“n=”<<n<<endl; }
正確程序爲: #include<iostream.h> void main() { int i, c, n=0; for(i=0;j<10;i++); { c=getchar( ); if(c>’0’ && c<’9’) n++; } cout<<“n=”<<n<<endl; }
分析:for循環語句中三個表達式之間必須用分號分隔,括號外沒有分號。if語句的條件有錯,0和9作爲字符常量,應加上單引號’ ’。作爲統計用的變量n,初值應賦值爲0。修改後的正確程序顯示在右邊。
4. 看程序寫結果
例題16:#include<iostream.h>
void main()
{ int a,b,c,d,x;
a=c=0; b=1;d=20;
if(a) d=d-10;
else if(! b)
if(! c) ;
else x=25;
cout<<”d=”<<d<<endl;
cout<<”x=”<<x<<endl;
}
運行結果:
d=20
x=25
分析:這是一個if語句的嵌套結構,判斷三個if語句的條件表達式都“假”,則執行最後一個else後面的語句“x=25”。
例題17:#include<iostream.h>
void main()
{ int x=6,y=8;
if(x++<6)
cout<<++y<<endl;
if(x>6)
cout<<- -y<<endl;
else
cout<<y++<<endl;
}
運行結果:
7
分析:程序在判斷第一個條件if(x++<6)時,由於此時x的值爲6所以不成立,故不做語句cout<<++y<<endl;且變量y值不變化。接着判斷第二個條件if(x>6),因x值爲7,條件成立,故執行語句cout<<- -y<<endl;此時y值爲8,執行- -y,則輸出7。
例題18: #include<iostream.h>
void main()
{ int a;
cout<<”please input a number:”;
cin>>a;
switch(a %2)
{ case 0: cout<<”a是偶數”<<endl;
default: cout<<”a是奇數”<<endl;
}
}
如果輸入數爲6,則輸出結果爲什麼?
運行結果:
a 是偶數
a是奇數
分析:本題主要是要掌握多分支語句switch語句和break語句的應用。當符合條件的分支執行完畢後,如果沒有遇到break語句,則繼續執行下面的分支語句,而不管條件是否符合,直到遇到break語句或switch語句結束。
例題19:寫出下列程序運行結果:
#include<iostream.h>
void main()
{ int i,j,m=0,n=0;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
if(j>=i) m=1;n++;
cout<<m<<endl;
cout<<n;
}
對待結果:
1
1
分析:本題中二重循環的循環體語句爲:if(j>=i) m=1;n++;,由於內外循環變量的變化,該語句並不被二重循環所控制,它僅執行了一次,即不論循環多少次m、n的值總爲1。
例題20:寫出下列程序運行結果:
#include<iostream.h>
void main()
{ int a,b;
for(a=1,b=1;a<=100;a++)
{ if(b>=10)break;
if(b%3= =1)
{ b+=3;continue;}
}
cout<<a<<endl;
cout<<b;
}
運行結果:
4
10
分析:本題是一個單循環語句,在循環體中有break和continue語句,當變量b=10時,循環結束,輸出相應的變量a、b的值。
例題21:寫出下列程序運行結果:
#include<iostream.h>
void main()
{ int y, a;
y=2;a=-1;
while(y--!=-1)
{ do
{ a*=y; a++; } while(y--);
}
cout<<"a= "<<a<<" y= "<<y;
}
運行結果:
a=1 y=-2
分析:y--返回2,y=1,whi1e條件爲真,進入do-whilee循環;a*=y之後,a=1,a++之後,a=2;y--返問1,,y=0;再執行一 次do-while循環,a*=y之後,a=0,a++之後,a=1,y--返回0,y=-1,退出do-while循環;(y--!=-1)爲假,且y=-2,退出外層的while循環。這時a=1,y=-2。
5. 編寫程序
例題22:編寫一個程序根據輸入的三角形的三條邊判斷是否能組成三角形,如果可以則輸出它的面積和三角形類型。
分析:本程序應採用條件結構語句。首先判斷三角形的任意兩邊是否大於第三邊,是則求出相應的三角形的面積,然後利用嵌套的選擇結構語句進一步判斷三角形的類型。程序如下:
#include<iostream.h>
include<math.h>
void main()
{ float a, b, c, s, area;
cin>>a>>b>>c;
if(a+b>c && b+c>a && a+c>b)
{ s=(a+b+c)/2;
area=sqrt(s*(s*(s-a)*(s-b)*(s-c));
cout<<area;
if(a= =b && b= =c)
cout<<”等邊三角形”;
else if(a= =b | | a= =b | | b= =c)
cout<<”等腰三角形”;
else if((a*a + b*b= = c*c)| |(a*a + c*c= = b*b)| |(b*b + c*c = = a*a))
cout<<”直角三角形”;
else cout<<”一般三角形”;
}
else cout<<”不能組成三角形”;
}
例題23:計算1至70中是7的倍數的數值之和。
分析:採用單循環語句結構,在循環內判斷數值是否能被7整除,滿足條件的值累加到求和變量sum中。程序爲:
#include<iostream.h>
void main()
{ int i, sum=0;
for(i=1;i<=70;i++)
if (i % 7) sum += i ;
cout<<sum<<endl;
}
例題24:求下面分數序列的前13項之和。
2/1,3/2,5/3,8/5,13/8,21/13,…
分析:採用循環結構來實現累加,循環變量表示當前的數列項數,在循環體內計算數列的第i項的值,以及前i項的累加值。數列的規律爲:從第2項開始,每一項的分母是前一項的分子,分子是前一項的分子和分母之和。程序如下:
(1)用for語句實現:
#include<iostream.h>
void main()
{ float a,b,t,sum;
int i;
for(i=1;i<=13;i++)
{ a=a+b; b=a-b;
t=a/b; sum+=t;
}
cout<<”sum=”<<sum<<endl;
}
(2)用while語句實現:
#include<iostream.h>
void main()
{float a,b,t,sum; int i;
a=2;b=1;i=2;t=a/b;sum=t;
while(i<=13)
{ a=a+b; b=a-b;
t=a/b; sum+=t;
i++;
}
cout<<”sum=”<<sum<<endl;
}
(3)用do-while語句實現:
#include<iostream.h>
void main()
{ float a,b,t,sum; int i=1;
a=b =1;sum=0;
do
{ a=a+b; b=a-b;
t=a/b; sum+=t;
}while(++i<=13);
cout<<”sum=”<<sum<<endl;
}
例題25:要用0至9之間不同的三個數構成一個三位數,編寫程序統計出共有多少種方法。
分析:題目要求構成的是一個三位數,可用三重循環中的三個循環變量分別表示個、十、百位,在循環中利用條件語句判斷滿足三個數不等的條件,並用一個獨立變量加以統計。程序如下:
#include<iostream.h>
vois main()
{ int i,j,k,count=0;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
if(i= =j) continue;
else
for(k=0;k<=9;k++)
if(k!=i && k!=j)count++;
cout<<count<<endl;
}
3.3 教材習題分析與解答
1.單項選擇題
(1)putchar函數可以向終端輸出一個( )。
A.整型變量表達式值 B.實型變量值
C.字符串 D.字符或字符型變量值
答案:D
(2) int k=10;
while(k=0) k=k-1;
則下面描述正確的是( )。
A.while循環執行10次 B.循環是無限循環
C.循環體語句一次也不執行 D.循環體語句執行一次
答案:C
(3)int x=0,s=0;
while(!x!=0) s+=++x;
cout<<s;
則( )。
A.運行程序段後輸出0 B.運行程序段後輸出1
C.程序段中的控制表達式是非法的 D.程序段執行無限次
答案:B
(4) int x=0,y=0;
while(x<15) y++,x+=++y;
cout<<y<<”,”<<x;
則運行結果爲( )。
A.20,7 B.6,12 C.20,8 D.8,20
答案:D
(5) int a=1,b=2,c=2;
while(a<b<c) {t=a;a=b;b=t;c--;}
cout<<a<<”,”<<b<<”,”<<c;
運行結果爲( )。
A.1,2,0 B.2,1,0 C.1,2,1 D.2,1,1
答案A
(6)int x=-1;
do
{x=x*x;}
while(!x);
下列說法正確的是( )。
A.是死循環 B.循環執行兩次
C.循環執行一次 D.有語法錯誤
答案:C
(7)以下能正確計算1*2*3*…*10的程序段是( )。
A.do {i=1;s=1; B.do {i=1;s=0;
s=s*i; i++;} s=s*i;i++;}
while(i<=10); while(i<=10);
C. i=1;s=1; D.i=1;s=0;
do {s=s*i; do{s=s*i;
i++;} i++;}
while(i<=10); while(i<=10);
答案:C
(8)以下描述正確的是( )。
A.由於do-while循環中循環體語句只是一條可執行語句,所以循環體內不能使用複合語句
B.do-while循環由do開始,用while結束,在while(表達式)後面不能寫分號
C.在do-while循環體中,一定要有能使while後面表達式的值變爲零(“假”)的操作
D.do-while循環中,根據情況可以省略while
答案:C
(9)C++語言中while和do-while循環的主要區別是( )。
A.do-while的循環體至少無條件執行一次
B.while的循環控制條件比do-while的循環控制條件嚴格
C.do-while允許從外部轉到循環體內
D.do-while的循環體不能是複合語句
答案:A
(10)下面有關for循環的正確描述是( )。
A.for循環只能用於循環次數已經確定的情況
B.for循環是先執行循環體語句,後判斷表達式
C.在for循環中,不能用break語句跳出循環體
D.for循環的循環體語句中,可以包含多條語句,但必須用大括號括起來
答案:D
(11)對for(表達式1; ;表達式3)可理解爲( )。
A.for(表達式1;0;表達式3) B.for(表達式1;1;表達式3)
C.for(表達式1;表達式1;表達式3) D.for(表達式1;表達式3;表達式3)
答案:B
(12)for(i=2;i= =0;) printf(“%d”,I--); 循環執行的次數是( )。
A.無限次 B.0次 C.1次 D.2次
答案:B
(13)下面程序段的運行結果爲( )。
for(y=1;y<10;) y=((x=3*y,x+1),x-1);
cout<<“x=”<<x<<”y=”<<y;
A.x=27,y=27 B.x=12,y=13
C.x=15,y=14 D.x=y=27
答案:C
(14)以下不是無限循環的語句爲( )。
A.for(y=0,x=1;x>++y;x=I++) I=x; B.for( ; ;x++=I);
C.while(1){x++;} D.for(I=10; ;I--) sum+=I;
答案:A
(15)下面程序的運行結果是( )。
#include<iostream.h>
viod main( )
{int i,b,k=0;
for(i=1;i<=5;i++)
{b=i%2;
while(b- - >=0) k++;}
cout<<k<<”,”<<b; }
A.3,-1 B.8,-1 C.3,0 D.8,-2
答案:D
(16)以下正確的描述是( )。
A.continue語句的作用是結束整個循環的執行
B.只能在循環體內和switch語句體內使用break語句
C.在循壞體內使用break語句或continue語句的作用相同
D.從多層循環嵌套中退出,只能使用goto語句
答案:B
(17)下面程序段( )。
for(t=1;t<=100;t++)
{cin>>x;
if(x<0) continue;
cout<<t;}
A.當x<0時整個循環結束 B.x>=0時什麼也不輸出
C.cout永遠也不執行 D.最多允許輸出100個非負整數
答案:D
(18)下面程序段( )。
x=3;
do {y=x--;
if(!y) {cout<<”x”; continue;}
cout<<”#”;} while(1<=x<=2);
A.將輸出## B.將輸出##*
C.是死循環 D.含有不合法的控制表達式
答案:C
(19)下面程序的運行結果是( )。
#include<iostream.h>
void main()
{int a,b;
for(a=1,b=1;a<=100;a++)
{ if(b>=20) break;
if(b%3= =1) {b+=3;continue;}
b-=5;
}
cout<<a<<endl;
}
A.7 B.8 C.9 D.10
答案:B
(20)下面程序段的運行結果是( )。
#include<iostream.h>
void main( )
{ int i,j,x=0;
for(i=0;i<2;i++)
{ x++;
for(j=0;j<=3;j++)
{ if(j%2) continue;
x++;
}
x++;
}
cout<<“x=”<<x<<endl;
}
A.x=4 B.x=8 C.x=6 D.x=12
答案:B
(21)下面程序段的運行結果是( )。
#include<iostream.h>
void main()
{int i;
for(i=1;i<=5;i++)
{if(I%2) cout<<“*”;
else continue;
cout<<“#”; }
cout<<“$/n”; }
A.*#*#*#$ B.#*#*#*$ C.*#*#$ D.#*#*$
答案:A
(22)下面程序段的運行結果是( )。
#include<iostream.h>
void main( )
{ int i,j,a=0;
for(i=0;i<2;i++)
{ for(j=0;j<4;j++)
{ if(j%2) break;
a++;
}
a++;
}
cout<<a<<endl;
}
A.4 B.5 C.6 D.7
答案:A
2.填空題:
(1)下面程序段是從鍵盤輸入的字符中統計數字字符的個數,用換行符結束循環,
請填空。
int n=0,c;
c=getchar();
while ( c!=’/n’ )
{ if( c>=’0’&&c<=’9’ ) n++;
c=getchar( );}
(2) 1020個西瓜,第一天賣一半多兩個,以後每天賣剩下的一半多兩個,問幾天以後能賣完?
#include<iostream.h>
main( )
{int day, x1, x2;
day=0;x1=1020;
while( x1>0 ) {x2=( x1/2-2 );x1=x2;day++;cout<<x1<<endl;}
cout<<“day=”<<day<<endl; }
(3) 運行以下程序時,從鍵盤鍵入right?回車後運行結果是( sjhiu )。
#include<stdio.h>
void main()
{char c;
while((c=getchar())!=’?’) putchar(++c);
}
(4) 運行以下程序時,從鍵盤輸入China#,回車後運行結果是( 5 5 )。
#include<stdio.h>
#include<iostream.h>
void main()
{ int v1=0,v2=0;char ch;
while((ch=getchar())!=’#’)
switch(ch)
{case ‘a’:
case ‘h’:
default:v1++;
case ‘o’:v2++;}
cout<<v1<<v2<<endl;
}
(5)運行下面程序段後,k值爲( 36 )。
k=1;n=263;
do {k*=n%10;n/=10; } while(n);
(6)下面程序段中循環體的執行次數是( 3次 )。
a=10;b=0;
do{b+=2;a-=2+b;} while(a>=0);
(7)下面程序段的運行結果爲( ** )。
x=2;
do{cout<<“*”;x--; } while(!x= =0);
(8)下面程序段的運行結果是( a=-5 )。
i=1;a=0;s=1;
do {a=a+s*i;s=-s;i++; } while(I<=10);
cout<<“a=”<<a ;
(9)下面程序段的運行結果是( )。
for(a=1,i=-1;-1<=i<1;i++)
{a++;cout<<x<<y<<endl;}
分析:本題循環條件是假值,所以什麼也不輸出。
(10) 雞、兔共有30只,腳共有90個,下面程序段是計算雞兔各有多少隻,x代表有多少隻雞,y代表有多少隻兔子,請填空。
for(x=1;x<=29;x++)
{y=30-x;
if( 2*x+4*y= =90 ) cout<x<<’ ‘<<y;}
(11) 下面程序的功能是從3個紅球、5個白球、6個黑球中任意取出8個球,且其中必須有白球,輸出所有可能的方案,請填空。
#include<iostream.h>
void main()
{
int i,j,k;
cout<<“/n hong bai hei /n”;
for(i=0;i<=3;i++)
for(( j=1 );j<=5;j++)
{k=8-i-j;
if( k>0 && k<=6 )
cout<<i<<’ ‘<<j<<’ ‘<<k<<endl;
}}
(12)下面程序的功能是求出用數字0至9可以組成多少個沒有重複的三位偶數,請填空。
#include<iostream.h>
void main()
{ int n=0,i,j,k;
for(i=1;i<=9;i++)
for(k=0;k<=8;( k+=2 ))
i f(k!=i)
for(j=0;j<=9;j++)
if( j!=i && j!=k ) n++;
cout<< “n=”<<n<<endl;
}
3.看程序,寫結果
(1)#include<iostream.h>
void main()
{ int i=0,x=0,y=0;
do{ ++i;
if(i%2!=0) {x=x+i;i++;}
y=y+i++;
}while(i<=7);
cout<<“x=”<<x<<”y=”<<y;}
運行結果:
x=1 y=20
(2) #include<iostream.h>
void main()
{int i,t,sum=0;
for(t=i=1;i<=10; )
{sum+=t;++i;
if(i%3= =0) t=-i;
else t=i;}
cout<<“sum=”<<sum;}
運行結果:
sum=19
(3) nclude<iostream.h>
void main( )
{int i;
for(i=1;i<=5;iI++)
switch(i%2)
{case 0:i++; cout<<“#”;break;
case 1:i+=2; cout<<“*”;
default: cout<<“/n”;}}
運行果爲:
*
#
(4) #include<iostream.h>
void main()
{int y=2,a=1;
while(y--!=-1)
{do {a*=y;a++; } while(y--);}
cout<<a<<y;}
運行結果 :
1 -2
(5) #include<iostream.h>
void main()
{int i,j;
for(i=4;i>=1;i--)
{for(j=1;j<=i;j++) putchar(‘#’);
for(j=1;j<=4-i;j++) putchar(‘*’);
putchar(‘/n’);}}
運行結果:
# # # #
# # # *
# # * *
# * * *
(6) #include<iostream.h>
void main()
{ int i,k=0;
for(i=1; ;i++)
{k++;
if(k%3= =0) break;
}
cout<<i<<k;
}
運行結果:
2 3
(7) #include<iostream.h>
void main( )
{int i=1;
while(i<=15)
if(++i%3!=2) continue;
else cout<<i<<’/t’;
cout<<“/n”;
}
運行結果:
2 5 8 11 14
(8) #include<iostream.h>
void main()
{int a=10,y=0;
do {a+=2;y+=a;
if(y>50) break; } while(a=14);
cout<<“a=”<<a<<” y=”<<y;
}
運行結果:
a=16 y=60
(9) #include<iostream.h>
void main()
{int i, k=19;
while(i=k-1)
{k-=3;
i f(k%5= =0) {i++;continue;}
else if(k<5) break;
i++; }
cout<<“i=”<<i<<”k=”<<k;
}
運行結果:
i=6 k=4
(10) #include<iostream.h>
void main()
{int i=5;
do {switch(i%2)
{case 4:i--;break;
case 6:i--;continue;
}
i--;i--;
cout<<i; } while(i>0);
}
運行結果:
3 1 -1
4.回答下列問題
(1)C++語言提供了哪些常用的語句?
答:C++語言提供了多個常用的語句,先列舉一些如下:
1) cin>> <變量名1> >> <變量名2> >> …….
2) cout<< <變量名1> << <變量名2> <<…….
3) if(表達式) 語句1;
4) if(表達式) 語句1;
else 語句2;
5) switch(表達式)
{ case 表達式1: 語句序列1;[break;]
case 表達式2: 語句序列2;[break;]
……….
[default: 語句序列n+1;]
}
6) while(表達式) 語句;
7) do
語句;
while(表達式);
8) for(表達式1;表達式2;表達式3) 語句;
(2)條件語句的格式如何?if語句中對else子句有何規定?
答: 條件語句的格式爲:
if(表達式) 語句1; 或
if(表達式) 語句1;
else 語句2;
在條件語句嵌套中,從第一個 else 子句開始,“else”總是與離它最近的尚未配對的“if”配對。
(3)開關語句的格式如何?break語句在開關語句中有何作用?
答: 開關語句的格式爲:
switch(表達式)
{ case 表達式1: 語句序列1;[break;]
case 表達式2: 語句序列2;[break;]
……….
case 表達式n: 語句序列n;[break;]
[default: 語句序列n+1;]
}
break語句在開關語句中表示執行完這個分支後跳出switch語句,不再轉去執行後續的情況,它保證了程序只能選擇各種情況中的一種來執行。如果某個分支後沒有break語句,將會繼續向下一個分支的語句去執行,且不再對後面的情況常量進行判斷。
(4)在開關語句中,case子句的條件有何特點?
答:在開關語句中,case子句中的條件應爲常數表達式,其值一般爲整數或字符常數。
(5) C++語言提供哪些循環語句?它們各自的特點是什麼?它們可以相互替代嗎?可以相互嵌套嗎?
答:C++語言提供三種循環語句:for循環語句應用最慣犯,使用最靈活。不僅可以用於循環次數已經確定的情況,也能用於循環次數不確定、只給出循環結束條件的情況。它可以代替其他類型的循環語句。while循環語句,其特點是先判斷表達式,後執行語句,在循環體中應有使循環趨於結束的語句。do-while 語句,其特點是先執行語句,後判斷表達式。對同一個問題可以用while語句處理,也可以用do-while語句處理。
在循環的嵌套中,不同類型的循環可以相互嵌套。
(6)while 和do~while循環語句有什麼區別嗎?
答:while 和do~while循環語句的區別在於:while語句是判斷表達式,後執行語句;而do-while語句是先執行語句,後判斷表達式,do-while語句至少執行一次循環體語句。
(7)continue、break語句在循環中分別起到什麼作用?
答:continue語句用於結束本次循環,即跳過循環體中下面尚未執行的語句,但並不跳出循環,而是控制返回循環語句的條件測試部分,繼續執行循環。break語句是強制結束循環,不再進行條件的判斷。
5.按下列要求編寫程序
(1)有一個函數如下:
x (x<5)
y= x+6 (5<=x<15)
x-6 (x>=15)
輸入x的值,計算出相應的y值。
程序爲:#include<iostream.h>
void main()
{ float x,y;
cin>>x;
if(x<5) y=x;
else if(x<15) y=x+6;
else y=x-6;
cout<<"x= "<<x<<" y= "<<y<<endl;
}
(2)編程要求輸入整數a和b,若a2+b2大於100,則輸出a2+b2百位以上的數字,否則輸出兩數之和。
程序爲:#include<iostream.h>
void main()
{int a,b;
cin>>a>>b;
if(a*a+b*b>100) cout<<(a*a+b*b)/100<<endl;
else cout<<a+b<<endl;
}
(3)根據π/4 =1-1/3+1/5-1/7+…求π的近似值,直到最後一項的值小於0.000001爲止。
程序爲:#include<iostream.h>
void main()
{ int i=1 ;
float s=1.0,pi=0;
while(1.0/i>=0.000001)
{ pi= pi+s/i; s=-s; i=i+2;
}
cout<<4*pi<<endl;
}
(4)編程輸出如下圖形:(例n=6)
*
*****
*********
*************
*****************
*********************
程序爲:#include<iostream.h>
void main()
{int i,j,k;
for(i=1;i<=6;i++)
{ for(k=1;k<=20-2*i;k++)
cout<<' ';
for(j=1;j<=4*i-3;j++)
cout<<'*';
cout<<endl;
}
}
(5)求1!+2!+3!+…8!。
程序爲:#include<iostream.h>
void main()
{int i,j=1,sum=0;
for(i=1;i<=8;i++)
{ j=j*i;
sum=sum+j;
cout<<j<<" "<<sum<<endl;
}
cout<<"1!+2!+...+8!="<<sum<<endl;
}
(6)打印出所有的“水仙花數“(它是一個三位數,其各位數字立方和等於該數本身)。
程序爲:#include<iostream.h>
void main()
{int i,j,k,n;
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
{ n=i*100+j*10+k;
if(n==i*i*i+j*j*j+k*k*k) cout<<n<<endl;
}
}
(7)編寫一個程序,輸入年、月,打印出該年份該月的天數。
程序爲:#include<iostream.h>
void main()
{int year,month, days;
cin>>year>>month;
switch(month)
{case 1: case 3: case 5: case 7: case 8:
case 10: case 12:days=31;break;
case 4: case 6: case 9: case 11: days=30;break;
case 2: if(year%400==0 || year%4==0 &&year%100!=0) days=29;
else days=28;
}
cout<<year<<"年"<<month<<"月有"<<days<<"天/n";
}
(8)輸入一個自然數,輸出其各因子的連乘形式,如輸入12,則輸出12=1*2*2*3。
程序爲:#include<iostream.h>
void main()
{int n,i;
cin>>n;
cout<<n<<"=1";
i=2;
while(n>1)
{while(n%i==0)
{ cout<<"*"<<i; n=n/i;}
i++;
}
}
(9)求一個整數任意次方的最後三位數。
程序爲: #include<iostream.h>
void main()
{int x,n,p=1,i;
cin>>x>>n;
for(i=1;i<=n;i++)
p=p*x%1000;
cout<<p<<endl;
}
(10)猴子喫桃問題。猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上又將剩下的桃子喫掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再喫時,發現只剩一個桃子了,求猴子第一天究竟摘了多少個桃子?
程序爲:#include<iostream.h>
void main()
{ int p=1,i;
for(i=1;i<=9;i++)
p=(p+1)*2;
cout<<p<<endl;
}
3.4 補充習題
1.選擇題
(1)以下程序的輸出結果是( )。
#include<iostream.h>
void main()
{ int a=100,x=10,y=20,ok1=5,ok2=0;
if(x<y)
if(y!=10)
if(!ok1) a=1;
else if(ok2) a=10;
a=-1;
cou<<a<<endl;
}
A.1 B.0 C.-1 D.值不確定
(2)以下不正確的if語句形式是( ) 。
A.if(x>y && x!=y); B.if(x= =y) x+=y;
C.if(x!=y)cin>>x else cin>>y; D.if(x<y){x++;y++;}
(3)設有以下程序段,則( )。
int a=0, b=0;
while(!a!=0) b+=++a;
cout<<b;
A.程序運行後輸出0 B.程序運行後輸出1
C.程序執行無數次 D.循環控制條件表達式是非法的
(4)當a=1,b=3:c=5,d=4時,執行下面一段程序後x的值是( )。
if(a<b))
if(c<d) x=1;
else
if(a<c)
if(b<d) x=2;
else x=3;
else x=6;
else x=7;
A.1 B.2 C3. D.6
(5)以下for循環的循環次數是( )。
for(x=0, y=0; (y=123)&&(x<4); x++);
A.是無限循環 B.循環次數不定 C.執行4次 D.執行3次
(6)下面程序的運行結果是( )。
#include<iostream.h>
void main()
{ int x=6,y=8;
if(x++<6)
cout<<++y<<endl;
if(x>6)
cout<ßy<<endl;
else
cout<<y++<<endl; }
A.8 B.9 C. 7 D.編譯不成功
(7)關於for循環語句下面不正確的是( )。.
A.在循環體中,不能改變循環控制變量
B.在執行中循環控制變量初值、終值可變
C.循環控制變量可增可減
D.循環控制變量不必在說明部分說明
(8)下列寫法中等價的是( )。
A.若x=1,則while(x!=x)與while(x)
B.若x=0,則while(x!=x)與while(x)
C.若x=1,則while(x!=0)與while(!x)
D.若x=0,則while(x==0)與while(!x)
(9)執行語句for(i=0; i++<3;)後,變量i的值爲( )。
A.2 B.3 C.4 D.5
(10)下面程序的運行結果是( )。
#include<iostream.h>
void main()
{ int x=10,y=10,i;
for(i=7; x>i; y-=9, ++i, x--)
cout<<x<<” “<<y<<” “;
}
A.10 1 9 2 B.9 8 7 6 C.10 9 9 0 D.10 10 9 1
(11)若int x=3;且有下面的程序片段,則輸出結果爲( )。
do { x-=2;
cout<<x;
}while(!(- -x));
A.1 B.3 0 C.1 2 D.死循環
(12)下面程序的運行結果是( )。
#include<iostream.h>
void main()
{ int num=0;
while(num<=2)
{ num++;
cout<<num<<endl;
}
}
A.1 B.1 C.1 D.1
2 2 2
3 3
4
(14)下列程序段不是死循環的是( )。
A.int i=100;
while(1)
{ i=i%100+1;
if(i>100) break;
}
B.for( ; ;)
C.int k=0;
do{++k;} while(k>=0);
D.int s=36;
while(s); --s;
(15)下面程序的運行結果是( )。
#include<iostream.h>
void main()
{ int a, y;
a=10; y=0;
do
{ a+=2; y+=a;
if(y>50) break;
} while(a=14);
cout<<”a=”<<a<<”y=”<<y;
}
A.a=16 y=60 B.a=15 y=50 C.a=14 y=50 D.a=14 y=60
2.填空題
(1)下面程序的運行結果是_______。
#include<iostream.h>
void main()
{ int a=2,b=3,c;
c=a;
if(a>b) c=1;
else if(a= =b) c=0;
else c=-1;
cout<<c;
}
(2)若所用變量都已正確定義,以下程序段的輸出結果__________
x=y=0;
while(x<20)y++,x+=3;
cout<<”y=”<<y<<”x=”<<x;
(3)下面程序的運行結果是________。
#include<iostream.h>
void main()
{ int i, j=4;
for(i=j; i<=2*j; i++)
switch(i/j)
{ case 0:
case 1: cout<<”*”; break;
default: cout<<”#”;
}
}
(4)輸入一個字母,如果它是一個大寫字母,則把它變成小寫字母;如果它是一個小寫字母,則把它變成大寫字母;其它字符不變。填入正確內容。
#include<iostream.h>
void main()
{ char ch;
cin>>ch;
if(______________) ch=ch+32;
else if(ch>=’a’ &&ch<=’z’)____________;
cout<<ch<<endl;
}
(5)讀下面的程序,要使輸出結果t=4,輸入變量a和b應滿足條件_________。
#include<iostream.h>
void main()
{ int s,t,a,b;
cin>>a>>b;
s=1;t=1;
if(a>0)s=s+1;
if(a>b)t=s+t;
else if(a= =b)t=5;
else t=2*s;
cout<<”s=”<<s<<”x=”<<x<<endl;
}
(6)從鍵盤輸入若干個學生的成績,統計並輸出最高成績和最低成績,當輸入負數時結束輸入,完成下面的程序填空。
#include<iostream.h>
void main()
{ float mark, max, min;
________________;
max=mark;
min=mark;
while(______________)
{
if(mark>max) max=mark;
if(mark<min) min=mark;
_____________}
cout<<”max is:”<<max<<andl;
cout<<”min is:”<<min;
}
(7)下面程序的功能是計算100至1000之間有多少個數其各位數字之和是5。
#include<iostream.h>
void main()
{ int i, s, k, cout=0;
for(i=100;i<1000;i++)
{ s=0; k=i;
while(_________)
{ s=s+k%10;
k=_________;}
if(s!=5) ____________;
else count++;
}
cout<<cout;
}
(8)下面程序的功能是輸出1至200之間每位數的乘積大於每位數的和的數。
#include<iostream.h>
void main()
{ int n, k=1, s=0, m;
for(n=1; n<=100; n++)
{ k=1; s=0;
_________________;
while(____________)
{ k*=m%10;
s+=m%10;
_____________;
}
if(k>s) cout<<n;
}
3. 看程序寫結果
(1)#include<iostream.h>
void main()
{ int x,y,z;
x=1;y=2;z=3;
x=y--<=x||x+y1=z;
cout<<x<<y<<endl;
}
(2)#include<iostream.h>
void main()
{ int x,y,z;
if(y!=0)x=5;
cout<<x<<endl;
if(y= =0) x=4;
else x=5;
cout<<x<<endl;
x=1;
if(y<0)
if(y>0)x=4;
else x=5;
cout<<x<<endl;
}
(3)#include<iostream.h>
void main()
{ int a=2,b=7,c=5;
switch(a>0)
{ case 1:switch(b<0)
{ case 1:cout<<”@”;break;
case 2:cout<<”!”;break;
}
case 0:switch(c= =5)
{ case 0:cout<<”*”;break;
case 1:cout<<”#”;break;
default:cout<<”#”;break;
}
default:cout<<”&”;
}
}
(4)#include<iostream.h>
void main()
{ int i=1,s=3;
do
{ s+=i++;
if(s%7= =0) continue;
else ++i;
} while(s<15);
cout<<i<<endl;
}
(5)#include<iostream.h>
void main()
{ int i;
for(i=4; i<=10; i++)
{ if(i%3= =0)
continue;
cout<<i;
}
}
(6)#include<iostream.h>
void main()
{ int i, x;
for(i=1; i<100; i++)
{ x=i;
if(++x%2= =0)
if(++x%3= =0)
if(++x%7= =0)
cout<<x;
}
}
(7)#include<iostream.h>
void main()
{ int k,j,m;
for(k=5; k>=1; k- -)
{ m=0;
for(j=k; j<=5; j++)
m=m+k*j;
}
cout<<m<<endl;
}
(8)設輸入爲4時,程序的輸出結果
#include<iostream.h>
void main()
{int i,j,n;
long sum,term;
cin>>n;
for(sum=0、i=1;i<=n;++i)
{ term=1; j=1;
do
tenn *=i;
while(++j<=i);
sum+=term;
}
cout<<"sum"<<sum;
}
(9)#include<iostream.h>
void main()
{ int a, s, n, count;
a=2;s=0;n=1;cout=1;
while(count<=7)
{ n=n*a;
s=s+n;
++count;
}
cout<<”s=”<<s;
}
(10)#include<iostream.h>
void main()
{ int x, y;
x= y= 0;
do
{ y++; x*=x;
while((x>0)&&(y>5));
cout<<”y=”<<y<<”x=”<<x;
}
5.編寫程序
(1)將用戶輸入的24小時制時間轉化爲12小時制
(2)判斷輸入的正整數是否既是5又是7的整倍數。若是輸出yes,否則輸出no。
(3)求出1000以內的所有完全數(一個數如果等於它的因子之和(除自身外),則稱該數爲完全數,例:6=1+2+3,6爲完全數)。
(4)用戶從鍵盤輸入一個正整數,將它的各位數字前後顛倒一下,並輸出顛倒後的結果。
(5)求s=1+(1+2)+(1+2+3)+…….+(1+2+3+……+n)的值。
(6)編程輸出十位數字與個位數字的和能被7整除,百位數字與十位數字的和能被3整除的所有3位數。
(7)計算公式 的值。
(8)打印大小可以變化的菱形圖案(下面菱形的大小是9
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*