C++基础(三) 控制结构

时间:2022-09-09 13:04:13

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


       *

     * * *

   * * * * *

 * * * * * * *

* * * * * * * * *

 * * * * * * *

  * * * * *

    * * *

      *