C程序的流程控制.doc

上传人:wj 文档编号:1215813 上传时间:2023-04-30 格式:DOC 页数:20 大小:145.50KB
下载 相关 举报
C程序的流程控制.doc_第1页
第1页 / 共20页
C程序的流程控制.doc_第2页
第2页 / 共20页
C程序的流程控制.doc_第3页
第3页 / 共20页
C程序的流程控制.doc_第4页
第4页 / 共20页
C程序的流程控制.doc_第5页
第5页 / 共20页
C程序的流程控制.doc_第6页
第6页 / 共20页
C程序的流程控制.doc_第7页
第7页 / 共20页
C程序的流程控制.doc_第8页
第8页 / 共20页
C程序的流程控制.doc_第9页
第9页 / 共20页
C程序的流程控制.doc_第10页
第10页 / 共20页
C程序的流程控制.doc_第11页
第11页 / 共20页
C程序的流程控制.doc_第12页
第12页 / 共20页
C程序的流程控制.doc_第13页
第13页 / 共20页
C程序的流程控制.doc_第14页
第14页 / 共20页
C程序的流程控制.doc_第15页
第15页 / 共20页
C程序的流程控制.doc_第16页
第16页 / 共20页
C程序的流程控制.doc_第17页
第17页 / 共20页
C程序的流程控制.doc_第18页
第18页 / 共20页
C程序的流程控制.doc_第19页
第19页 / 共20页
C程序的流程控制.doc_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C程序的流程控制.doc

《C程序的流程控制.doc》由会员分享,可在线阅读,更多相关《C程序的流程控制.doc(20页珍藏版)》请在冰点文库上搜索。

C程序的流程控制.doc

第三章C++程序的流程控制

3.1流程控制与程序结构

  在程序的所有流程控制方式中,有三种最基本的程序结构:

  顺序结构

   顺序结构是通过安排语句的排列顺序来决定程序流程的程序结构。

  条件分支结构

   条件分支结构是由特定的条件决定执行哪个语句的程序结构。

  循环结构

   循环结构是由特定的条件决定某个语句重复执行次数的程序结构。

  3种程序结构的共同特点是只有一个入口和出口。

3.2条件分支结构

  if语句

    if(条件)语句1else语句2 //如果条件成立就执行语句1,否则就执行语句2

            

    if(条件)语句1  //如果条件成立就执行语句1,否则什么也不做

      

    注意语句的格式,基本语句以;结束,复合语句以}结束

  if语句的嵌套

     当if语句中的语句1或语句2本身也是if语句时,构成了嵌套的if语句。

来看下面的例子:

     if(n>0)

      if(a>b)z=a;

      elsez=b;

     表达的是           还是

      if(n>0){        if(n>0){

       if(a>b)z=a;        if(a>b)z=a;

       elsez=b;        }

       }           elsez=b;

    答案是前者。

注意:

else总是离它最近的一个if配对,如果你想表达的是后者,必须要用{}。

例3.1:

输入2个数,找出其中最大一个并显示出来。

#include

voidmain()

{

inti,j;

cout<<"请输入2个整数:

";

cin>>i>>j;

cout<<"2个数中最大的是:

";

if(i>=j)

cout<

else

cout<

}

注意:

在编程中多使用cout输出提示性的文字,否则上来就用cin接收键盘输入,用户将不知所措。

例3.2:

输入3个数,找出其中最大一个并显示出来。

#include

voidmain()

{

inti,j,k;

cout<<"请输入3个整数:

";

cin>>i>>j>>k;

cout<<"3个数中最大的是:

";

if(i>=j){

if(i>=k)

cout<

else

cout<

}

else{

if(j>=k)

cout<

else

cout<

}

}

本例的思想是将“从3个数中找出最大者”的问题转化成两个“从2个数中找出最大者”的问题。

例3.3:

输入3个数,找出其中最大一个并显示出来。

(例3.2的另解)

#include

voidmain()

{

inti,j,k;

cout<<"请输入3个整数:

";

cin>>i>>j>>k;

cout<<"3个数中最大的是:

";

if(i

if(i

cout<

}

本例的思想是:

假设第一个变量i中的数为最大,分别用i和j、k比较,只要遇到比i大的数就存到i中,否则什么也不做,这样保证i中始终存放的是当前比较到的最大者。

这一思想很重要,请注意学习。

例3.4:

输入3个数,然后按从大到小的顺序把它们显示出来。

#include

voidmain()

{

inti,j,k,p;

cout<<"请输入3个整数:

";

cin>>i>>j>>k;

if(i

if(i

if(j

cout<<"3个数从大到小排列:

";

cout<

}

本例的思想:

用i、j、k从大到小存放三个数,其中涉及到交换两个变量的值问题。

若要交换两个变量x、y的值,不能只做简单的对换:

x=y;y=x;,这样将导致xy中都存放着原来y中的值。

  假设x=2,y=3,下面作简单的对换,以实现x=3,y=2

  x=y;//现在x=3

  y=x;//现在y=3,最终x=3y=3

  正确的做法是使用一个中间变量p

  p=x;//现在p=2

  x=y;//现在x=3

  y=p;//现在y=2,最终x=3,y=2

思考:

不借助中间变量交换xy两个变量的值,应执行哪3个赋值语句?

例3.5:

输入工资薪金所得,计算应纳个人所得税并显示计算结果。

假定工资薪金所得扣除1000元后剩余部分为应纳税所得额,税率如下:

级数

全月应纳税所得额

税率(%)

1

不超过500元的部分

5

2

超过500元至2000元的部分

10

3

超过200元至5000元的部分

15

4

超过5000元至20000元的部分

20

5

超过20000元至40000元的部分

25

6

超过40000元至60000元的部分

30

7

超过60000元至80000元的部分

35

8

超过80000元至100000元的部分

40

9

超过100000元的部分

45

分析:

假设某人的工资是6830元,扣除1000元后应纳税额为5830,这5830元被分为4级分别计税:

级数

本级应纳税所得额

税率(%)

本级应纳税额

尚未计税的应纳税额

4

超过5000元部分:

5830-5000=830

20

166

5000

3

超过2000元部分:

5000-2000=3000

15

450

2000

2

超过500元部分:

 2000-500=1500

10

150

500

1

不超过500元的部分:

    500

5

25

0

 

合计:

          5830

791

 

#include

voidmain()

{

doubleincome,tax=0.0;

cout<<"请输入全月工资薪金所得:

";

cin>>income;

income-=1000;

if(income>100000.0)

{

tax+=(income-100000.0)*0.45;

income=100000.0;

}

if(income>80000.0)

{

tax+=(income-80000.0)*0.40;

income=80000.0;

}

if(income>60000.0)

{

tax+=(income-60000.0)*0.35;

income=60000.0;

}

if(income>40000.0)

{

tax+=(income-40000.0)*0.30;

income=40000.0;

}

if(income>20000.0)

{

tax+=(income-20000.0)*0.25;

income=20000.0;

}

if(income>5000.0)

{

tax+=(income-5000.0)*0.20;

income=5000.0;

}

if(income>2000.0)

{

tax+=(income-2000.0)*0.15;

income=2000.0;

}

if(income>500.0)

{

tax+=(income-500.0)*0.10;

income=500.0;

}

if(income>0.0)

tax+=income*0.05;

cout<<"应纳个人所得税:

"<

cout<

cin.get();

cin.get();

}

if多分支结构

  if(条件1)

    语句1

  else

   if(条件2)

     语句2

   else

    if(条件3)

      语句3

    ...

        else

         if(条件n)

           语句n

         else

           语句n+1

  这是通过规范化的if嵌套所构成的条件分支结构,在这种结构中if语句嵌套在else之后。

但通常我们采用下面更简洁的格式:

   if(条件1)语句1

   elseif(条件2)语句2

   elseif(条件3)语句3

   …

   elseif(条件n)语句n

   else语句n+1

  这种结构的工作原理:

先检测条件1,若满足就执行语句1;否则检测条件2,若满足就执行语句2;否则检测条件3,若满足就执行语句3 ...若所有条件都不满足则执行语句n+1,若没有else语句n+1就什么也不做。

注意:

这里的n个条件是互斥的,即只要满足其中一个条件则其他条件肯定不满足,也就是说多分支结构中的n+1个语句只有一个能被执行。

例3.6:

输入一个0-100分范围内的一个成绩,显示相应的等级:

   90-100   优

   80--89   良

   70--79   中

   60--69   及格

   60分以下  不及格

#include

voidmain()

{

floatscore;

cout<<"请输入成绩:

";

cin>>score;

if(score<0||score>100)

cout<<"输入错误!

成绩必须在0-100分之!

"<

elseif(score<60)cout<<"不及格"<

elseif(score<70)cout<<"及格"<

elseif(score<80)cout<<"中"<

elseif(score<90)cout<<"良"<

elsecout<<"优"<

}

   

switch语句和switch多分支结构

  switch语句的格式:

 

    switch(整型表达式){

     case整型常量表达式1:

语句序列1

     case整型常量表达式2:

语句序列2

     ...

     case整型常量表达式k:

语句序列k

     default:

语句序列k+1

    }

  switch语句通过判断整型表达式的值来确定程序的去向。

若整型表达式的值与整型常量表达式1的值相同,则依次执行语句序列1开始的各个语句序列,即语句序列1,语句序列2...语句序列k+1;若整型表达式的值与整型常量表达式2的值相同,则依次执行语句序列2开始的各个语句序列,即语句序列2,语句序列3...语句序列k+1;如果整型表达式的值不等于任何列出的整型常量表达式的值,则执行从default后的语句序列k+1;如果没有default则什么也不做;在依次执行各个语句序列的过程中,若遇见break语句,则立即跳出switch分支结构。

  若每个语句序列的最后一个语句都是break,则这样的switch多分支结构可以用等效的if多分支结构替代。

例3.7:

输入一个表示星期的数字(0表示星期日,1表示星期一...),显示对应的英文单词。

#include

voidmain()

{

intweekday;

cout<<"今天是星期几?

";

cin>>weekday;

switch(weekday){

case0:

cout<<"Sunday"<

case1:

cout<<"Monday"<

case2:

cout<<"Tuesday"<

case3:

cout<<"Wednesday"<

case4:

cout<<"Thursday"<

case5:

cout<<"Friday"<

case6:

cout<<"Saturday"<

default:

cout<<"输入有误!

输入的整数应在0-6之间"<

}

}

例3.8:

同例3.6,输入一个0-100分范围内的一个成绩,显示相应的等级,用switch多分支结构替代原来的if多分支结构

#include

voidmain()

{

floatscore;

cout<<"请输入成绩:

";

cin>>score;

switch(int(score)/10){

case0:

case1:

case2:

case3:

case4:

case5:

cout<<"不及格"<

case6:

cout<<"及格"<

case7:

cout<<"中"<

case8:

cout<<"良"<

case9:

case10:

cout<<"优"<

default:

cout<<"输入有误!

成绩必须在0-100分之间"<

}

}

3.3循环结构

for循环

  for语句的格式为:

for(循环初始化;循环条件;循环参数调整) 循环体

   

  for语句遵循先判断后执行,即如果一开始循环条件不成立,则循环体一次也不执行

  看下面的例子:

   for(inti=0;i<100;i+=5)cout<

051015...95

  首先执行循环初始化(i=0;),然后判断循环条件(i<100)是否成立,此时i=0小于100,所以循环条件成立,执行循环体(cout<

例3.9:

输入10个数,计算并显示它们的合计。

#include

voidmain()

{

doublex,s=0;

cout<<"请输入10个数:

";

for(inti=0;i<10;i++)

{

cin>>x;

s+=x;

}

cout<<"合计:

"<

}

若输入12345678910

则程序输出:

合计:

55

注意:

本例中的变量s起到累加器的作用,所以必须初始化为0。

例3.10:

显示输出如下所示的三角形:

          *

         ***

        *****

       *******

      *********

     ***********

行号

应输出的''

应输出的*

0

5

1

1

4

3

2

3

5

3

2

7

4

1

9

5

0

11

i

5-i

i+i+1

#include

voidmain()

{

for(inti=0;i<6;i++)

{

cout<

intj;

for(j=0;j<5-i;j++)cout<<'';

for(j=0;j

}

}

例3.11:

显示输出99乘法表。

#include

voidmain()

{

cout<

inti;

for(i=1;i<10;i++)cout<

cout<

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

{

cout<

(2)<

for(intj=1;j<10;j++)cout<

}

}

本例中用到了setw,其功能是为下一个要输出的数据设置输出宽度,setw的说明在头文件iomanip.h中,因此要有#include,包含了iomanip.h就不必包含iostream.h了。

while循环

  while语句的格式为:

while(循环条件) 循环体

   

  while语句也遵循先判断后执行

例3.12:

求数列...的所有大于等于0.000001的数据项之和,显示输出计算的结果。

分析:

序号

分子(n)

分母(d)

1

1

2

2

1+2=3

2*2=4

3

3+2=5

2*4=8

...

...

...

i

ni

di

i+1

ni+2

2di

方法一:

#include

voidmain()

{

intn=1,d=2;

doubles=0.0,s0;

while((s0=double(n)/d)>=0.000001)

{

s+=s0;

n+=2;

d+=d;

}

cout<

}

程序中的s是累加器,必须初始化为0。

程序中用到double(n)/d,将int型变量n强制转换为double型,是应为n和d都是int型,直接n/d将是整除,余数将被丢弃。

方法二:

#include

#include

voidmain()

{

inti=1;

doubles=0.0,s0;

while((s0=(i+i-1)/pow(2,i))>=0.000001)

{

s+=s0;

i++;

}

cout<

}

例3.13:

设计函数doublepowi(doublex,intn);它计算并返回x的n次方。

#include

doublepowi(doublex,intn)

{

doublea=1;

while(n--)a*=x;

returna;

}

voidmain()

{

cout<

}

程序中的a是累乘器,必须初始化为1。

例3.14:

已知sinx=,设计一个程序,输入x,通过累加所有绝对值大于等于0.000001的项来计算sinx的值,显示计算结果并对照显示调用标准函数sin的计算结果。

#include

#include

voidmain()

{

doublex;

cout<<"请输入一个弧度值:

";

cin>>x;

doublei=1.0,n=x,d=1.0,s=0,s0;

while(fabs(s0=n/d)>=0.000001)

{

s+=s0;

i++;

n*=(-x*x);

d*=(i+i-2)*(i+i-1);

}

cout<

}

由于程序中用到了标准函数fabs和sin,因此程序应把math.h包含进来

运行此程序:

请输入一个弧度值:

0.3

0.29552

0.28552

再次运行程序:

请输入一个弧度值:

33

1.0019

0.999912

你会发现,第二次运行的结果产生很大差异,若再次输入一个更大的弧度值误差就会更大,这是一个数学问题,因为sin是以2π为周期的函数,如果输入的弧度值的绝对值大于2π,则减去2π不会影响函数的值,但对于程序中的算法,却提高了累加同样多项数的精度。

改进的方法是,在cin>>x的下法插入一些语句。

#include

#include

voidmain()

{

doublex;

cout<<"请输入一个弧度值:

";

cin>>x;

constdoubledPI=2*3.1415926;

if(x>0.0)

while(x>dPI)x-=dPI;

else

while(x<-dPI)x+=dPI;

doublei=1.0,n=x,d=1.0,s=0,s0;

while(fabs(s0=n/d)>=0.000001)

{

s+=s0;

i++;

n*=(-x*x);

d*=(i+i-2)*(i+i-1);

}

cout<

}

这次再试试看!

do...while循环

  do...while语句的格式为:

do循环体 while(循环条件);

    

  do...while语句遵循先执行后判断,即使循环条件不成立,循环体也要执行一次,注意这与for、while循环的不同!

例3.15:

输入一元二次方程的系数A、B和C,计算并显示方程的解。

#include

#include

voidmain()

{

doublea,b,c;

do

{

cout<

";

cin>>a>>b>>c;

}while(a==0.0);

cout<

doubledelta=b*b-4*a*c;

if(delta<0.0)

cout<<"此方程没有实数解!

"<

elseif(delta>0.0){

cout<<"此方程有2个不同的实数解:

";

cout<<(-b+sqrt(delta))/(a+a);

cout<<"和"<<(-b-sqrt(delta))/(a+a)<

}

else{

cout<<"此方程有2个相同的实数解:

";

cout<<-b/(a+a)<

}

}

程序中使用dowhile解决了输入错误的问题,也就是说只要用户误将a输入为0,程序就一直要求重新输入,直到输入的a!

=0,才能跳出dowhile循环体,继续运行下面的内容。

细心的同学会发现,以前的程序也提供了解决输入有误的方法,但是只要检查

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2