C++基礎(三) 控制結構

3章 控制結構

3.1 知識要點

流程控制是控制程序中語句執行的順序。任何程序設計語言都具備流程控制的功能,而C++語言提供了比其它高級語言更豐富的流程控制語言。本章節主要介紹了程序設計中最基本三種結構:順序、分支和循環,要求掌握以下的知識要點:

1.掌握順序結構的編程方法。

2.掌握使用cincout實現數據的輸入/輸出。

3.學會應用字符輸入/輸出函數。

4.掌握scanf()函數和printf()函數的使用。

5.掌握條件語句的形式和使用。

6.掌握條件語句的嵌套。

7.掌握switch語句的形式和使用。

8.掌握forwhiledo-while三種循環語句的應用。

9.掌握循環語句的嵌套。

10.掌握breakcontinuegoto語句。

 

3.2 典型例題分析與解答

1.  選擇題

例題1:如果有以下語句:int ab  char mn   cin>>a>>b>>m>>n;則下列輸入數據的方式中不正確的是(    )。

  A1020XY               B1020  XY

C10  20  X  Y               D1020XY

答案:C

分析:C++語言沒有專門的輸入/輸出語句,其輸入/輸出是通過輸入/輸出流來實現的。用cin輸入時,空格和回車鍵均可作爲輸入字符之間的分隔符,逗號不能作爲分隔符。字符型變量只能容納一個字符。

 

例題2:以下不正確的語句是(    )。

  Aifx>y);       

Bifx=y&&x!=0  x+=y

Cifx!=ycin>>xelse  cin>>y

Dif(x<y) {x++y++}

答案:B

分析:if語句後面的表達式必須放在括號內“()”,且不能使用賦之值運算符。在ifelse後面用花括號“{}”括起來的多個語句成爲了一個複合語句。

 

 

例題3:下面程序的輸出結果是(    )。

             #include<iostream.h>

              void main()

              { int a=6,b=6;

                ifa>5

                     a-=1;

                     b+=1;

                else

                     a+=1;

                     b-=1;

                cout<<”a=”<<a<<endl;

                cout<<”b=”<<b;

              }

A5            Ba=5          Ca=5          D.編譯時出錯

   7                b=7             b=6

答案:D

分析:在if…else語句的中間應爲單條語句或複合語句,不能爲多條語句。

 

例題4:對whiledo…while循環結構,下面說法正確的是(    )。

  A.只是表達形式不同

Bdo…while結構中的語句至少執行一次

Cwhile結構中的語句至少執行一次

D.條件成立時,它們有可能一次也不執行

答案:B

分析:要知道whiledo…while兩種循環結構的區別在於:while循環是先判斷條件是否成立,成立時才執行,而do…while是先執行再判斷,它至少執行一次。

 

例題5:以下不正確的是(    )。

  A.語句fori=0;;i++)表示無限循環  Bfor(;;)表示無限循環

Cfor()也表示無限循環             Dwhile1)表示無限循環

答案:C

分析:for循環語句中的表達式可以省略,但分號不可省略。

 

例題6:下面循環體的執行次數爲(    )。

#include<iostream.h>

void main()

{ int a,b;

  fora=0,b=5;a<=b+1;a+=2,b-- cout<<a<<endl;

}

  A3                B2              C1               D0

答案:A

分析:在for語句的表達式中使用了逗號運算符對變量ab 進行賦初值,每次循環後改變變量ab 的值,直到a>=b.

 

例題7:對中斷語句的說法下面不正確的是(    )。

  A.用戶可以指定中斷的位置                 B.用戶可以指定轉移的位置

Cbreak語句可以跳出本循環                Dcontinue語句可以結束本次循環

答案:B

分析:不論break語句還是continue語句轉移的位置是根據程序默認的,不用人爲的設置。

 

例題8:下列函數的功能是(    )。

#include<iostream.h>

void main()

{ char a;  int i;

cin>>a;

fori=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:下面的程序實現輸出xyz三個數中的最大值,請填入正確的內容。

#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

分析:本程序首先找出xy中較大的數放入變量u中,再將u z 做比較,其中較大者放入變量v中,爲三個數中的最大值。

例題10:有以下程序段:

int n=0;

whilen=1n++;

while循環執行次數是_____

答案:爲無限次。

分析:要注意”=””= =”的區別,”=”是賦值運算符,”= =”是關係運算符“等於”。這裏whilen=1)永遠爲1,爲真值,則答案爲無限次。

 

例題11:計算1~20之間偶數之和,請填充:

#include<iostream.h>

void main()

{     int a,b,i;

       a=0;b=0;

fori=0;   (1)   ;i+=2

{ a+=i;

     (2)    ;

     (3)    ;

  cout<<”偶數之和爲:”<<a<<endl

}

答案:(1)i<=20i<21       (2)b+=i+1      (3)  }

 

例題12:下面程序運行結束後,k的值爲_____

#include<iostream.h>

void main()

{     int i,j,k;

       fori=0,j=10;i<=j;i++,j--

         k=i+j;

       count<<k;

}

答案:10

分析:在程序中每循環一次,變量i+1,而變量j-1i+j之和保持不變爲10,直到循環結束。

 

例題13:下面程序是輸出100以內能被7整除且個位數是4的所有整數,請填空:

#include<iostream.h>

void main()

{     int i,j;

       fori=0;   (1)  ;i++

       { j=i*10+4;

         if  (2) 

            continue;

           (3) 

        cout<<j<<endl;

       }  }

答案:(1)i<=9i<10       (2)j%7!=0       (3)else

分析:由題目可知判斷100以內的數,故i變量的終值應爲:i<=9i<10。要滿足不被7整除的條件爲: j%7!=0;反之不滿足該條件的則要輸出。

 

3.  改錯題

例題14:下面的程序存在着語法錯誤,請指出並予以修改:

#include<iostream.h>

void main()

{ float x,y;          //1

  ifx>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;                 

  fori=0,j=10,i++;        

  {  c=getchar( );            

ifc>0 && c<9 n++  

  }

  cout<<“n=”<<n<<endl;

}

 

 

正確程序爲:

 

#include<iostream.h>

 void main()

{  int i, c, n=0;

  fori=0;j<10;i++;

  {  c=getchar( );

ifc>’0’ && c<’9’ n++;

  }

  cout<<“n=”<<n<<endl;

}

 

 

 

 

分析:for循環語句中三個表達式之間必須用分號分隔,括號外沒有分號。if語句的條件有錯,09作爲字符常量,應加上單引號’ ’。作爲統計用的變量n,初值應賦值爲0。修改後的正確程序顯示在右邊。

 

4.  看程序寫結果

例題16#include<iostream.h>

           void main()

              { int a,b,c,d,x;

a=c=0;   b=1;d=20;

                ifa 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;

                ifx++<6

                      cout<<++y<<endl;

                ifx>6

                     cout<<- -y<<endl

                else

                     cout<<y++<<endl

           }

運行結果:

7

分析:程序在判斷第一個條件ifx++<6)時,由於此時x的值爲6所以不成立,故不做語句cout<<++y<<endl;且變量y值不變化。接着判斷第二個條件ifx>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;

                 switcha %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;

                  fori=0;i<2;i++

                  forj=0;j<2;j++

                         ifj>=i m=1;n++;

                  cout<<m<<endl;

                    cout<<n;

             }

對待結果:

1

1

分析:本題中二重循環的循環體語句爲:ifj>=i m=1;n++;,由於內外循環變量的變化,該語句並不被二重循環所控制,它僅執行了一次,即不論循環多少次mn的值總爲1

 

例題20:寫出下列程序運行結果:

#include<iostream.h>

            void main()

           { int a,b;

                fora=1,b=1;a<=100;a++

                {  ifb>=10break;

                       ifb%3= =1

                       { b+=3;continue;}

                 }

                 cout<<a<<endl;

                 cout<<b;

           }

運行結果:

4

10

分析:本題是一個單循環語句,在循環體中有breakcontinue語句,當變量b=10時,循環結束,輸出相應的變量ab的值。

 

例題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--返回2y1whi1e條件爲真,進入do-whilee循環;a*=y之後,a=1a++之後,a=2y--返問1,y=0;再執行一 do-while循環,a*=y之後,a=0a++之後,a=1y--返回0y=-1,退出do-while循環;(y--=-1)爲假,且y-2,退出外層的while循環。這時a1y-2

 

5.  編寫程序

例題22:編寫一個程序根據輸入的三角形的三條邊判斷是否能組成三角形,如果可以則輸出它的面積和三角形類型。

分析:本程序應採用條件結構語句。首先判斷三角形的任意兩邊是否大於第三邊,是則求出相應的三角形的面積,然後利用嵌套的選擇結構語句進一步判斷三角形的類型。程序如下:

       #include<iostream.h>

       include<math.h>

void main()

{ float a, b, c, s, area;

         cin>>a>>b>>c;

         ifa+b>c && b+c>a && a+c>b

         { s=a+b+c/2;

           area=sqrts*s*s-a*s-b*s-c));

              cout<<area;

           ifa= =b && b= =c

                cout<<”等邊三角形”;

                  else ifa= =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:計算170中是7的倍數的數值之和。

分析:採用單循環語句結構,在循環內判斷數值是否能被7整除,滿足條件的值累加到求和變量sum中。程序爲:

#include<iostream.h>

void main()

{     int i, sum=0;

       fori=1;i<=70;i++

         if i % 7 sum += i ;

       cout<<sum<<endl;

}

 

例題24:求下面分數序列的前13項之和。

2/13/25/38/513/821/13

分析:採用循環結構來實現累加,循環變量表示當前的數列項數,在循環體內計算數列的第i項的值,以及前i項的累加值。數列的規律爲:從第2項開始,每一項的分母是前一項的分子,分子是前一項的分子和分母之和。程序如下:

1)用for語句實現:

#include<iostream.h>

void main()

{     float a,b,t,sum;

       int i;

fori=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;

whilei<=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:要用09之間不同的三個數構成一個三位數,編寫程序統計出共有多少種方法。

分析:題目要求構成的是一個三位數,可用三重循環中的三個循環變量分別表示個、十、百位,在循環中利用條件語句判斷滿足三個數不等的條件,並用一個獨立變量加以統計。程序如下:

       #include<iostream.h>

       vois main()

{ int i,j,k,count=0;

         fori=1;i<=9;i++

             forj=0;j<=9;j++

                ifi= =j  continue;

                else

                     fork=0;k<=9;k++

                       ifk!=i && k!=jcount++;

         cout<<count<<endl;

       }

 

 

3.3 教材習題分析與解答

1.單項選擇題

1putchar函數可以向終端輸出一個(  )。

A.整型變量表達式值    B.實型變量值

C.字符串              D.字符或字符型變量值

答案D

 

2 int k=10;

while(k=0) k=k-1;

則下面描述正確的是(    )。

Awhile循環執行10         B.循環是無限循環

C.循環體語句一次也不執行     D.循環體語句執行一次

答案C

 

3int 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;

則運行結果爲(   )。

A207     B612     C208     D820

答案D

 

5 int a=1,b=2,c=2;

while(a<b<c) {t=a;a=b;b=t;c--;}

cout<<a<<”,”<<b<<”,”<<c;

運行結果爲(     )。

A1,2,0    B2,1,0      C1,2,1      D2,1,1

答案A

 

6int x=-1;

do

  {x=x*x;}

while(!x);

下列說法正確的是(      )。

A.是死循環              B.循環執行兩次

C.循環執行一次          D.有語法錯誤

答案C

 

7)以下能正確計算1*2*3*…*10的程序段是(       )。

Ado {i=1;s=1;                Bdo {i=1;s=0;

s=s*i; i++;}                    s=s*i;i++;}

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

C i=1;s=1;                   Di=1;s=0;

      do {s=s*i;                     do{s=s*i;

i++;}                         i++;}

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

答案C

 

8)以下描述正確的是(    )。

A.由於do-while循環中循環體語句只是一條可執行語句,所以循環體內不能使用複合語句

Bdo-while循環由do開始,用while結束,在while(表達式)後面不能寫分號

C.在do-while循環體中,一定要有能使while後面表達式的值變爲零(“假”)的操作

Ddo-while循環中,根據情況可以省略while

答案:C

 

9C++語言中whiledo-while循環的主要區別是(      )。

Ado-while的循環體至少無條件執行一次

Bwhile的循環控制條件比do-while的循環控制條件嚴格

Cdo-while允許從外部轉到循環體內

Ddo-while的循環體不能是複合語句

答案:A

 

10)下面有關for循環的正確描述是(    )。

Afor循環只能用於循環次數已經確定的情況

Bfor循環是先執行循環體語句,後判斷表達式

C.在for循環中,不能用break語句跳出循環體

Dfor循環的循環體語句中,可以包含多條語句,但必須用大括號括起來

答案:D

 

11)對for(表達式1 ;表達式3)可理解爲(   )。

Afor(表達式1;0;表達式3)         Bfor(表達式1;1;表達式3)

Cfor(表達式1;表達式1;表達式3)   Dfor(表達式1;表達式3;表達式3)

答案:B

 

12for(i=2;i= =0;)  printf(“%d”,I--); 循環執行的次數是(   )。

A.無限次     B0      C1      D2

答案:B

 

13)下面程序段的運行結果爲(     )。

for(y=1;y<10;) y=((x=3*y,x+1),x-1);

cout<<“x=”<<x<<”y=”<<y;

Ax=27,y=27             Bx=12,y=13

Cx=15,y=14             Dx=y=27

答案:C

 

14)以下不是無限循環的語句爲(    )。

Afor(y=0,x=1;x>++y;x=I++) I=x;       Bfor( ; ;x++=I);

Cwhile(1){x++;}                    Dfor(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;  }

A3,-1      B8,-1       C3,0         D8,-2

答案:D

 

16)以下正確的描述是(     )。

Acontinue語句的作用是結束整個循環的執行

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時整個循環結束    Bx>=0時什麼也不輸出

Ccout永遠也不執行        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;

}

A7     B8      C9       D10

答案: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;

}

Ax=4      Bx=8        Cx=6        Dx=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;

}

A4     B5     C6       D7

答案: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)下面程序的功能是求出用數字09可以組成多少個沒有重複的三位偶數,請填空。

#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語句至少執行一次循環體語句。

 

7continuebreak語句在循環中分別起到什麼作用?

答: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)編程要求輸入整數ab,若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;

        ifx<y

          ify!=10

            if!ok1  a=1;

               else  ifok2 a=10;

           a=-1;

         cou<<a<<endl;

  }

A1           B0           C-1           D.值不確定

2)以下不正確的if語句形式是(   

Aifx>y && x!=y);            Bifx= =y x+=y

Cifx!=ycin>>x  else cin>>y  Difx<y{x++;y++;}

3)設有以下程序段,則(    )。

int a=0, b=0;

while!a!=0 b+=++a;

cout<<b;

A.程序運行後輸出0           B.程序運行後輸出1

C.程序執行無數次             D.循環控制條件表達式是非法的

4)當a=1b=3c=5d=4時,執行下面一段程序後x的值是(    )。

    ifa<b)

    ifc<d  x=1;

    else

    ifa<c

    ifb<d  x=2;

    else x=3;

      else  x=6;

    else x=7;

A1              B2               C3              D6

5)以下for循環的循環次數是(    )。

forx=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;

   ifx++<6

     cout<<++y<<endl;

   ifx>6

     cout<ßy<<endl;

   else

  cout<<y++<<endl;  }

    A8          B9              C 7          D.編譯不成功

7)關於for循環語句下面不正確的是(    )。.

    A.在循環體中,不能改變循環控制變量

B.在執行中循環控制變量初值、終值可變

C.循環控制變量可增可減

D.循環控制變量不必在說明部分說明

8)下列寫法中等價的是(    )。

A.若x=1,則whilex!=x)與whilex

B.若x=0,則whilex!=x)與whilex

C.若x=1,則whilex!=0)與while!x

D.若x=0,則whilex==0)與while!x

9)執行語句fori0; i++<3;)後,變量i的值爲(    )。

A2            B3             C4          D5

10)下面程序的運行結果是(    )。

#include<iostream.h>

void main()

{   int x=10,y=10,i;

fori=7; x>i; y-=9, ++i, x--

    cout<<x<<”  “<<y<<”  “;

}

    A10 1 9 2        B9 8 7 6        C10 9 9 0          D10 10 9 1

11)若int x3;且有下面的程序片段,則輸出結果爲(    )。

do {   x-=2;

cout<<x;

        }while!- -x));

A1           B3 0        C1 2           D.死循環

12)下面程序的運行結果是(    )。

#include<iostream.h>

void main()

{   int num=0;

       whilenum<=2

         {    num++;

                 cout<<num<<endl;

              }

        }

A1              B1              C1                     D1

                        2                 2                        2

3                                                     3

4

14)下列程序段不是死循環的是(    )。

Aint i=100;

   while1

   {  i=i%100+1;

     ifi>100  break;

   }

Bfor   ;   ;

Cint k=0;

   do{++k;}   whilek>=0;

Dint s=36;

   whiles;  --s;

15)下面程序的運行結果是(    )。

#include<iostream.h>

void main()

{   int a, y;

    a=10; y=0;

    do

{  a+=2; y+=a;

   ify>50 break;

}  whilea=14;

cout<<”a=”<<a<<”y=”<<y;

    }

Aa=16  y=60      Ba=15 y=50      Ca=14  y=50   Da=14 y=60

2.填空題

1)下面程序的運行結果是_______

#include<iostream.h>

void main()

{  int a=2,b=3,c;

c=a;

ifa>b c=1;

else ifa= =b  c=0;

        else c=-1;

cout<<c;

}

2)若所用變量都已正確定義,以下程序段的輸出結果__________

xy0

whilex<20y++x+=3;

cout<<”y=”<<y<<”x=”<<x;

3)下面程序的運行結果是________

#include<iostream.h>

void main()

{ int i, j=4;

fori=j; i<=2*j; i++

switchi/j

  {  case 0:

       case 1: cout<<”*”; break;

       default: cout<<”#”;

    }

}

4)輸入一個字母,如果它是一個大寫字母,則把它變成小寫字母;如果它是一個小寫字母,則把它變成大寫字母;其它字符不變。填入正確內容。

#include<iostream.h>

void main()

{  char ch;

  cin>>ch;

  if______________ ch=ch+32;

       else ifch>=’a’ &&ch<=’z’____________;

       cout<<ch<<endl;

}

5)讀下面的程序,要使輸出結果t=4,輸入變量ab應滿足條件_________

#include<iostream.h>

void main()

{  int s,t,a,b;

        cin>>a>>b;

        s=1;t=1;

        ifa>0s=s+1;

        ifa>bt=s+t;

  else ifa= =bt=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______________

{

       ifmark>max    max=mark;

       ifmark<min    min=mark;

        _____________}

cout<<”max is:”<<max<<andl;

cout<<”min is:”<<min;

}

7)下面程序的功能是計算1001000之間有多少個數其各位數字之和是5

#include<iostream.h>

void main()

{   int i, s, k, cout=0;

              fori=100;i<1000;i++

 {  s=0; k=i;

                 while_________

{ s=s+k%10;

 k=_________;}

                     ifs!=5 ____________;

               else  count++;

              }

              cout<<cout;

}

8)下面程序的功能是輸出1200之間每位數的乘積大於每位數的和的數。

#include<iostream.h>

void main()

{ int n, k=1, s=0, m;

       forn=1; n<=100; n++

       { k=1; s=0;

        _________________;

 while____________

{ k*=m%10;

     s+=m%10;

         _____________;

}

       ifk>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;

         ify!=0x=5;

         cout<<x<<endl;

         ify= =0 x=4;

         else x=5;

         cout<<x<<endl;

         x=1;

         ify<0

              ify>0x=4;

              else x=5;

         cout<<x<<endl;

       }

3#include<iostream.h>

        void main()

        { int a=2,b=7,c=5;

              switcha>0

              {  case 1switchb<0

                             { case 1cout<<”@”;break;

                               case 2cout<<”!”;break;

                             }

                case 0switchc= =5

                             { case 0cout<<”*”;break;

                              case 1cout<<”#”;break;

                              defaultcout<<”#”;break;

                             }

                defaultcout<<”&”;

               }

        }

4#include<iostream.h>

        void main()

        { int i=1,s=3;

        do

        { s+=i++;

          ifs%7= =0 continue;

          else ++i;

        } whiles<15;

cout<<i<<endl;

}

5#include<iostream.h>

        void main()

        { int i;

fori=4; i<=10; i++

{  ifi%3= =0

     continue;

  cout<<i;

}

}

6#include<iostream.h>

        void main()

        {  int i, x;

        fori=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 kjm

         fork=5; k>1; k- -

   { m=0

forj=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(sum0i1;i<=n;++i)

{ term1  j1

          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;

whilecount<=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+36爲完全數)。

4)用戶從鍵盤輸入一個正整數,將它的各位數字前後顛倒一下,並輸出顛倒後的結果。

5)求s=1+1+2+1+2+3+…….+1+2+3+……+n)的值。

6)編程輸出十位數字與個位數字的和能被7整除,百位數字與十位數字的和能被3整除的所有3位數。

7)計算公式 的值。

8)打印大小可以變化的菱形圖案(下面菱形的大小是9


       *

     * * *

   * * * * *

 * * * * * * *

* * * * * * * * *

 * * * * * * *

  * * * * *

    * * *

      *

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章