程序设计基础-ch3流程控制下new_第1页
程序设计基础-ch3流程控制下new_第2页
程序设计基础-ch3流程控制下new_第3页
程序设计基础-ch3流程控制下new_第4页
程序设计基础-ch3流程控制下new_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

程序的流程控制control

flow2012.10刘奇志程序的流程控制顺序流程分支流程(基本形式、嵌套形式、其它分支流程控制语句)循环流程(基本形式、其它循环流程控制语句、循环流程的嵌套及其优化、循环流程的折断和接续)基本流程的运用15:532课程的主要内容(3)

Ch3

循环与while语句计算机在完成一个任务时,常常需要对相同的操作重复执行多次,每次操作的数据可能有所不同,C++语言中的while语句可以实现这种功能。while(<表达式>)<语句>while后面圆括号中的表达式一般是关系或逻辑表达式表达式的值为true,则认为条件成立,执行语句,然后再回头判断条件是否成立;条件不成立时,停止执行语句,也不再判断条件是否成立,而是开始执行while语句后面的程序。这里的<语句>通常是复合语句的形式,即while(<表达式>){<语句>}15:533例1

求输入的一个正整数的阶乘并输出.…int

main(

){ int

n,i=1,f=1;

//f存放计算结果,初始化为1(如果不进行初始化?)cout

<<

"Please

enter

a

number:

"

<<

endl;cin

>>

n;while(i<=n)

//i

通常称作循环变量{ f

=

f*i;i++;

//i++是将i变量自身的值加1}cout

<<

"factorial

of

"

<<

n

<<

"

is:

"

<<

f

<<

endl;return

0;}++

自增运算符15:53--

自减运算符,如i--是将i变量自身的值减1它们一般用于循环结构程序中,单独成句4为了提高程序的易读性,在写while语句时,最好也采用缩进形式。如果条件成立时要执行多个语句,则一定要像用一个花括号把这些语句写成复合语句的形式,否则,结果不正确,因为缩进并不改变程序的逻辑。15:535......cin

>>

n;while(i

<=

n){

f

=

f*i;i++;}cout

<<

"factorial

of

"

<<

n

<<

"

is:

"

<<

f

<<

endl;……15:536......cin

>>

n;while(i

<=

n)f

=

f*i;i++;

/*这里i++只有在i<=n不再成立时才被执行*/cout<<"factorial

of"<<n<<"is:"<<f<<endl;……//丢了花括号,死循环......cin

>>

n;while(i

<=

n)f

=

f*i;i++;cout

<<

"factorial

of

"

<<

n

<<

"

is:

"

<<

f

<<

endl;……//死循环相当于:循环流程(iteration/loop

flow)循环流程是含有循环语句控制的流程,用于重复性计算任务场合。典型的循环流程包含一个条件判断和一个任务操作。执行时先进行条件判断当条件P成立时执行任务A(循环体),并再次执行条件判断,如此循环往复;当条件P不成立时结束该流程。循环流程中的条件判断至少执行一次,任务A可能执行有限次(条件P一开始成立,后来不成立),也可能执行无限次,即死循环(条件P一直成立),甚至可能一次也不执行(条件P一开始就不成立)。所以要注意循环条件表达式的设计,避免循环不能正确执行或死循环APT15:537F…int

main(

){ int

n,

i=1,

f=1;cout

<<

"Please

enter

a

number:

"

<<

endl;cin

>>

n;while(i<=n)

//i

通常称作循环变量{ f

=

f*i;i++;}cout

<<

"factorial

of

"

<<

n

<<

"

is:

"

<<

f

<<

endl;return

0;}i=1,f=1输入正整数nTi<n?F输出n的阶乘ff=f*ii++15:538while语句容易误写成while(i

<=

n){…}死循环;空语句15:539do-while语句APFTAPTF执行时先执行一次任务A,再进行条件判断当条件P不成立时继续执行任务A,如此循环往复;直到条件P成立时结束该流程。C++中的do-while语句实现这种循环流程的控制(类似)。循环流程的另外一种形式C++中do-while语句控制的流程15:5310当while语句首次判断表达式的值为真时,与do-while语句效果相同,否则不同int

sum=0;int

i=1;while(i

<=

100){sum

=sum+i;i++;}cout

<<

sum;int

sum=0;int

i=1;do{sum

=sum+i;i++;}while(i

<=

100);cout

<<

sum;不是空语句,不能丢15:5311当while语句首次判断表达式的值为真时,与do-while语句效果相同,否则不同15:5312int

sum=0;inti=1;//若int

i=101;结果为?

while(i<=100){sum

=sum+i;i++;}cout

<<

sum;int

sum=0;int

i=1;//若int

i=101;结果?do{sum

=sum+i;i++;}while(i

<=

100);cout

<<

sum;循环的嵌套例1程序执行后,只能完成一次阶乘的计算和输出。如果希望在输出一个数的阶乘后程序不结束执行,而是继续等待输入下一个数,并计算和输出下一个数的阶乘,直到用户输入一个结束标志为止,那么,需要再用一个循环结构,重复执行上例中的主要语句,如例2所示。例2

编程实现:每输入一个正整数,输出其阶乘,输入0结束程序.15:5313…int

main(

)

{int

n,

i,

f;cout

<<

"Please

enter

a

number(enter

0

to

exit):

"

<<

endl;cin

>>

n;i=1,

f=1;while(i

<=

n)return

0;}15:5314{f

*=

i;i++;}cout

<<

"factorial

of

"

<<

n

<<

"is:

"

<<

f

<<

endl;…int

main(

)

{int

n,

i,

f;cout

<<

"Please

enter

a

number(enter

0

to

exit):

"

<<

endl;cin

>>

n;while(n

!=

0){i=1,

f=1;

//变量i与f要在外层循环

赋值while(i

<=

n){f

*=

i;i++;}cout

<<

"factorial

of

"

<<

n

<<

"is:

"

<<

f

<<

endl;cout

<<

"Please

enter

another

number(enter

0

to

exit):

"

<<endl;cin

>>

n;}return

0;}15:5315如果在外层循环外部赋值,那么在计算和输出完第一次输入的数的阶乘后,i的值不再为2,f的值不再为1,以后的计算结果就不正确了。15:5316i=1,

f=1;

//errorwhile(n

!=0){while(i

<=

n){ f

*=

i;i++;}……例3

输出一个九九乘法表.…int

main(

){cout

<<

"Multiplication

Table

"

<<

endl;Multiplication

Table12345678924681012812162024283236510152025303540456121824303642485471421283542495663816243240485664729182736455463728115:5317int

i=1;while(i<10){ int

j=1;while(j<10)15:5318{cout

<<

i*j

<<

"\t";j++;}i++;cout

<<

endl;}return

0;}i是外层循环的循环变量,i从1递增到9,对应9次循环,每次循环都执行循环体里的四条语句;其中,第二条语句又是一个循环即内层循环,j是内层循环的循环变量,j从1递增到9,对应9次循环,每次循环都执行循环体里的两条语句;即内层循环的两条语句要执行81次。int

i=1;while(i<10){int

j=i;while(j<10){cout

<<

i*j

<<

"\t";j++;}i++;}Multiplication

Table541524354863122030425672916253649648115:53for语句C++提供了一种for语句,也能控制

while语句控制的循环流程。for(<表达式1>;<表达式2>;<表达式3>){<A’>}执行时先计算表达式1,再进行条件判断(表达式2)当条件P成立时执行任务A’,并计算表达式3,再进行条件判断,如此循环往复;当条件P不成立时结束该流程。int

sum=0;for

(

int

i=1;

i<=100;

i++

)sum

=

sum+i;C++中for语句控制的流程A’表达式2TF表达式3表达式1APT15:5320F一般情况下,表达式1是循环初始化(给循环变量赋初值),表达式3是下一次循环准备(循环变量按步长增大或减小,促使循环结束)。<表达式1>;while(<表达式2>){<A’><表达式3>;}int

sum=0;int

i=1;while(i

<=

100)15:5321{sum

=

sum+i;i++;}for(<表达式1>;<表达式2>;<表达式3>){

<A’>}int

sum=0;for

(

int

i=1;

i<=100;

i++

)sum

=

sum+i;for语句容易误写成如果要延长比较长的时间,可用嵌套的循环int

sum=0;for(

int

i=1;

i<=100;

i++

);sum

=

sum+i;空语句可用来延时for(

i=1;

i<=1

00; i++

);调整数值,可调整延时时长编译出错,因为变量i只在for语句有效(参见第4章“作用域”)int

i,

sum=0;for(

i=1;

i<=100;

i++

);sum

=

sum+i;编译不出错,因为变量i在for语句后面仍然有效(参见第4章“作用域”)。sum为10115:5322循环流程的折断(break)C++中的break语句(通常在循环体中与if结合使用),可以控制循环流程的折断。执行到break语句,就立即结束循环流程。例如,输入10个数,依次求和,遇到负数或0就提前终止输入与求和。int

d,

sum=0;for(int

i=1;

i<=10;i++){cin

>>

d;if

(d<=0)

break;sum

=

sum+d;}cout

<<

"sum="

<<

sum;12-3sum=3循环只执行了2次.1234-5sum=10这次运行,这次运行,15:5324循环只执行了4次.15:5325int

d,

sum=0,

i=1;while(i<=10){}cin

>>

d;if

(d<=0)

break;sum

=

sum+d;i++;cout

<<

"sum="

<<

sum;int

d,

sum=0,

i=1;do{cin

>>

d;if

(d<=0)

break;sum

=

sum+d;i++;}

while(i<=10);cout

<<

"sum="

<<

sum;int

d,

sum=0;for(int

i=1;

i<=10;i++){cin

>>

d;if

(d<=0)

break;sum

=

sum+d;}cout

<<

"sum="

<<

sum;等价break辅助的while语句、do-while语句、for语句折断效果是等价的。C++中break辅助while语句控制的循环流程A1PFTA2P’F

TC++中break辅助do-whileC++中break辅助for语句控制的循环流程语句控制的循环流程A1表达式2TF

A2’P’F

T表达式1表达式3A2PF

TA1FP’T15:5326for语句中,表达式1、2、3都可以没有(用break语句协助改写),但两个分号必须有int

sum=0;int

i=1;for

(;;)//这种写法虽然编译不出错,但不提倡{

if(i<=100){ sum

=sum+i;i++;}elsebreak;} //

等价于:int

sum=0;for

(

int

i=1;

i<=100;

i++

)sum

=

sum+i;15:5827循环流程的接续(continue)C++中提供了一种continue语句(通常在循环体中与if结合使用),可以控制循环流程的接续。执行到continue语句,就跳过循环体后部的任务,流程转向循环的头部(对于while、do-while语句是进行下一次条件判断,对于for语句是计算表达式3)。15:5829输入10个正数,累计和,如果输入负数,忽略。15:5830int

d,

sum=0;int

i=1;while

(i

<=10){cin

>>

d;if

(d<=0)

continue;sum

=

sum+d;i++;}cout

<<

"sum="

<<

sum;int

d,

sum=0;int

i=1;do{cin

>>

d;if

(d<=0)

continue;sum

=

sum+d;i++;}while

(i

<=10);cout

<<

"sum="

<<

sum;12-34567891011sum=63等价于:APTFAPTFC++中continue辅助while语句控制的循环流程A2PFTA1FP’TC++中continue辅助do-while语句控制的循环流程A1PFTA2P’F

T等价于:15:5831continue辅助for控制的流程15:583212-345678910sum=52int

d,

sum=0;for(int

i=1;

i<=10;

i++){cin

>>

d;if

(d<=0)

continue;sum

=

sum+d;}cout

<<

"sum="

<<

sum;continue辅助for控制的流程

与continue辅助while/do-while控制的流程不等价表达式1表达式2

F

TA’表达式3C++中continue辅助for语句控制的循环流程A1表达式2TF

A2’P’F

T表达式1表达式315:5833continue

vs.

breakcontinue与break辅助循环流程控制时的区别执行break后,不再进行条件判断,直接结束流程执行continue后,接着进行下一次循环15:5835在嵌套循环中,内层循环体里的break折断内层循环流程,内层循环体里的continue接续内层循环流程。while

(…){…while(…){…break;…;}…}while

(…){…while(…){…continue;…;}…}15:5836事件控制型循环(event-controlled

loop)例4

计算从键盘输入的一系列整数的和,输入-1结束。15:5738…int

main(){int

d,sum=0;cout<<"请输入若干个整数(以-1结束):";cin

>>

d;while

(d!=

-1){sum

+=

d;cin

>>

d;do{ cin

>>

d;if(d

==

-1)break;sum

+=

d;}

while

(1);}cout<<"输入的整数的和是:"<<sum<<endl;return

0;}计数控制型循环(counter-controlled

loop)例4‘计算从键盘输入的一系列整数的和,要求先输入整数的个数。…int

main(){int

n;cout<<"请输入整数的个数:";cin>>n;cout<<"请输入"<<n<<"个整数:";int

d,sum=0;for

(int

i=1;

i<=n;

i++){cin

>>

d;sum

+=

d;}cout<<"输入的整数的和是:"<<sum<<endl;return

0;15

5}739C++三种循环语句控制的流程C++中for语句控制的流程A’表达式2TF表达式3表达式1APTFC++中do-while语句控制的流程APT15:5741FC++中while语句控制的流程都可以嵌套for

(int

i=1;

i<10;

i++){

for

(int

j=1;

j<10;j++)cout

<<

i*j

<<

'\t';cout

<<

endl;}int

i=1;while(i<10){ int

j=1;while(j<10){ cout

<<

i*j

<<

'\t';j++;}i++;cout

<<

endl;}int

i=1;do{ int

j=1;do15:5742{ cout

<<

i*j

<<

'\t';j++;}

while(j<10);i++;cout

<<

endl;}

while(i<10);break辅助控制的流程折断效果相同A1PFTA2P’F

TC++中break辅助

C++中break辅助do-whilewhile语句控制的循环流程

语句控制的循环流程C++中break辅助for语句控制的循环流程A1表达式2TF

A2’P’F

T表达式1表达式3PF

TA1A2FP’T15:5743continue辅助控制的流程接续效果(for特殊)C++中continue辅助while语句控制的循环流程A2

TFP’A1PFTC++中continue辅助do-while语句控制的循环流程A1PFTA2P’F

TC++中continue辅助for语句控制的循环流程表达式1F

TA1

TP’FA2’表达式315:5744控制循环流程用while、do-while还是for语句?从表达能力上讲,上述三种语句是等价的,都可嵌套,它们之间可以互相替代。对于某个具体的问题,用其中的某个语句来描述可能会显得比较自然和方便,使用三种语句的一般原则:计数控制的循环用for语句事件控制的循环,一般使用while或do-while语句如果循环体至少执行一次,则使用do-while语句。由于for语句的结构性较好,循环流程的控制均在循环顶部

表示,更直观,即for语句可显式地表示出:循环初始化、循环结束条件以及下一次循环准备,很多情况下都采用for语句。15:5745goto语句C++保留的goto语句,与if语句配合使用也能实现循环流程的控制int

i=1,

sum=0;LOOP: sum

+=

ii++;if (i

<=

100) goto

LOOP;APTF但这种循环流程(结构不够清晰)完全可以不用goto语句,建议16:3不9

要用goto语句实现这种循环流程的控制。47但这种循环流程(结构不够清晰)完全可以不用goto语句,建议不要用goto语句实现这种循环流程的控制。while

(...){.........

goto

END;......END:;}while

(...)16:3948{.........

continue;......}主要用途是跳出多重循环。16:3949int

i,

j;for

(i=1;

i<=10;i++)for

(j=1;

j<=10;

j++)if

(i*j

==

50)

break;cout

<<

i

<<

","

<<

j

<<

endl;//输出11,5int

i,j;for

(i=1;

i<=10;

i++)for

(j=1;

j<=10;

j++)if

(i*j

==

50)

goto

END;END:

cout

<<

i

<<

","

<<

j

<<

endl;//输出5,10但这种循环流程也可以不用goto语句。16:3950int

i,

j;for

(i=1;

i<=10;

i++)for

(j=1;

j<=10;

j++)if

(i*j

==

50)

goto

END;END:

cout

<<

i

<<

","

<<

j

<<

endl;//输出5,10int

i,

j;for

(i=1;

i<=10;

i++){ for

(j=1;

j<=10;

j++)if

(i*j

==

50)

break;if

(i*j

==50)

break;}cout

<<

i

<<

","

<<

j

<<

endl;//输出5,10goto语句的使用有以下限制:不能从一个函数

转入该函数的外部;不能从一个函数外部转入该函数的

;不能从一个循环外部转入该循环的(可以从循环转入该循环的外部)

;不能掠过带有初始化的变量定义.void

f(

){//

×int

x=0;goto

L1;…while(…){//

×L1:…goto

L2;…}int

y=10;L2:

……}16:3951循环的重要性完成重复操作任务的程序,如1000!1*2*3*…*1000?编译器往往限制运算符的个数繁杂完成重复操作任务的程序,如n!n在程序执行期间才能确定?16:3953例5

( 那契Fibonacci数列)有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第3个月后每个月又生一对兔子,假设所有兔子都不死,求每个月的兔子总数(对)。Fibonacci

数的定义如下:fib(n)

=1

(n=1)1

(n=2)fib(n-2)

+

fib(n-1)(n≥3)1,1,2,3,5,8,13,…16:3954…int

main(){int

n;

cin

>>n;int

fib_1=1,

fib_2=1;for

(int

i=3;

i<=n;

i++){int

temp=

fib_1+fib_2;//计算新的Fibonacci数fib_1=fib_2;//记住新的前一个Fibonacci数fib_2=temp;//记住新的Fibonacci数}cout<<n<<"个月后兔子总数是:"<<fib_2<<endl;return

0;fib_2

=

fib_1

+fib_2;//计算和记住新的Fibonacci数fib_1=fib_2-fib_1;//记住前一个Fibonacci数16:}3955循环的优化减少循环次数避免在循环中重复计算不变的表达式嵌套循环减少跨切次数对有些循环优化,编译器能实现!16:3956例6(百鸡问题)鸡翁一值钱五;鸡母一值

;鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?分析:采用列举的算法思想,对每一种可能的组合进行判断。16:3957…int

main(){int

cock,

hen,

chicken;cout<<"

***百鸡问题***\n";for

(cock=0;

cock<=100;

cock++)

for

(hen=0;

hen<=100;

hen++)for

(chicken=0;

chicken<=100;

chicken+=3)if

(

cock+hen+chicken==100\&&

cock*5+hen*3+chicken/3==100

)

\cout

<<

cock<<

'

'

<<

hen

<<

'

'

<<

chicken

<<endl;return

0;}循环次数:最内层循环体if语句需要判断33万次。3316:3958101101…int

main(){int

cock,

hen,

chicken;cout<<" ***百鸡问题***\n";for

(cock=0;cock<=100for

(hen=0;hen<=100for

(chicken=0;chicken<=100if

(

cock+hen+chicken==100\&&

cock*5+hen*3+chicken/3==100

)

\cout

<<

cock<<

'

'

<<

hen

<<

'

'

<<

chicken

<<endl;return

0;}结果:0

25

7544

8420;

cock++)

33;

hen++)100-cock-hen;

chicken+=3)16:3959…int

main(){ int

cock,

hen,

chicken;cout<<"

***百鸡问题***\n";for

(cock=0;

cock<=20;

cock++)

for

(hen=0;

hen<=33;

hen++)for

(chicken=0;

chicken<=100-cock-hen;

chicken+=3)if

(

cock+hen+chicken==100

\&&

cock*5+hen*3+chicken/3==100

)

\cout

<<

cock<<

'

'

<<

hen

<<

'

'

<<

chicken

<<endl;return

0;}{ chicken

=

100-cock-hen;if

(

(cock*5+hen*3+chicken/3==100)

\&&

(chicken%3==0)

)cout

<<

cock

<<

'

'

<<

hen

<<

'

'

<<

chicken

<<

endl;}16:3960…16:3961int

main(){int

cock,

hen;double

chicken;cout<<" ***百鸡问题***\n";for

(cock=0;

cock<=20;

cock++)

for

(hen=0;

hen<=33;

hen++){ chicken

=

100-cock-hen;if

(

cock*5+hen*3+chicken/3==100

)cout

<<

cock

<<

'

'

<<

hen

<<

'

'

<<

chicken

<<

endl;}return

0;}16:3962例7

编程求出小于n的所有质数(素数)…int

main(){ int

n;cout

<<

"请输入一个正整数:";cin

>>

n;

//从键盘输入一个正整数for(int

i=2;i<n;

i++)

//判断i是否为质数{ int

j=2;while(j<i

&&

i%j!=0)

//判断j是否能被i整除j++;if(j==i)

//i是质数cout

<<

i

<<"\t";}cout

<<endl;return

0;}偶数有必要判断是否为质数?…int

main(){int

n;cout<<"请输入一个正整数:";cin>>n;for

(int

i=2;i<n;

i++){int

j=2;while

(j

<

i

&&

i%j

!=

0)j++;if

(j

==

i)cout

<<

i

<<

"\t";}cout

<<

endl;return

0;}if

(n

<

2)

return

-1;cout

<<

2

<<

"\t";for

(int

i=3;

i<n;

i+=2)16:396316:3964…int

main(){ int

n;cout<<"请输入一个正整数:";cin>>n;if

(n

<

2)

return

-1;cout

<<

2

<<"\t";for

(int

i=3;i<n;

i+=2){ int

j=2;while

(j

<

i

&&

i%j!=

0)j++;if

(j

==

i)cout

<<

i

<<

"\t";}cout

<<

endl;return

0;}j有必要到i-1?…int

main(){int

n;cout<<"请输入一个正整数:";cin>>n;if

(n

<

2)

return

-1;cout

<<

2

<<"\t";for

(int

i=3;i<n;

i+=2){int

j=2;while

(j

<

i

&&

i%j!=

0)j++;if

(j

==

i)while

(j<=sqrt(i)

&&i%j!=0)cout

<<

i

<<

"\t";16:3965if

(j

>

sqrt(i))}cout

<<endl;return

0;}16:3966…int

main(){ int

n;cout<<"请输入一个正整数:";cin>>n;if

(n

<

2)

return

-1;cout

<<

2

<<"\t";for

(int

i=3;i<n;

i+=2){ int

j=2;while

(j

<=

sqrt(i)

&&

i%j

!=

0)j++;if

(j

>

sqrt(i))cout

<<

i

<<

"\t";}cout

<<endl;return

0;}sqrt(i)被重复计算!…int

main(){int

n;cout<<"请输入一个正整数:";cin>>n;if

(n

<=

2)

return

-1;cout

<<

2

<<

"\t";for

(int

i=3;

i<n;

i+=2){while

(j

<=

sqrt(i)

&&

i%j

!=

0)j++;if

(j

>

sqrt(i))cout

<<

i

<<"\t";while

(j<=k

&&

i%j!=0)if

(j

>

k)}…int

j=2

,

k

=sqrt(i);16:3967例8

求级数1+x+x2/2!+x3/3!+…+xn/n!的和分析:0、初始化:定义一个变量sum用于 和,初始值为1;用户输入两个值,分别放在变量x和n中;1、构数:计算某一项

xi/i!

时隐含着循环(循环i次);循环变量为jj从1到i将某一项的值保存在变量item中;2、累加:依次将每一项item的值加到sum中去;循环变量为i其中的“依次...”隐含着循环(循环n次)。i从1到n16:3968…int

main()16:3969{double

x,

sum,

item,

b;int

n,

a,

i,

j;cin

>>

x

>>

n;sum

=

1;for

(i=1;

i<=n;

i++){a

=

1,

b

=

1;for

(j=1;

j<=i;

j++){b

*=x;a

*=

j;//计算xj//计算j!}item

=

b/a;sum

+=item;//计算xi/i!//xi/i!加到sum中}cout

<<

"sum="

<<

sum

<<

endl;……利用xi

=

x

*xi-1和

i!

=

i

*

(i-1)!减少重复计算int

main(){ double

x,

sum,

item,

b;int

n,

a,

i,

j;cin

>>

x

>>

n;sum

=

1

,

a

=

1,

b

=1;for

(i=1;

i<=n;

i++)

b

*=x;

//计算xj{

a=1,b=1;

a

*=i;

//计算j!for(j=1;

j<=i;

j++){ b

*=x;

//计算xja

*=

j;

//计算j!}item=b/a;

//计算xi/i!sum+=item;

//xi/i!加到sum中}cout

<<

"sum="

<<

sum

<<

endl;…16:3970,

j…int

main(){ double

x,

sum,

item,

b;int

n,

a,

i

;cin

>>

x

>>

n;sum

=

1,

a

=

1,

b

=1;for

(i=1;

i<=n;

i++){b

*=x; //

计算xia

*=i; //

计算i!item

=

b/a;sum

+=

item;//计算xi/i!//xi/i!加到sum中}cout

<<

"sum="

<<

sum

<<

endl;…16:3971,

ba,…利用itemi

=

itemi-1*x/i进一步减少计算量int

main(){ double

x,

sum,

item

;int

n,

i;cin

>>

x

>>

n;

item

=

1sum

=

1,

a

=

1,

b

=1;for

(i=1;

i<=n;

i++){

b

*=x; //

计算xj

item

*=

x/i;a

*=

i; //

计算j!item=b/a;

//计算xi/i!sum+=item;

//xi/i!加到sum中}cout

<<

"sum="

<<

sum

<<

endl;…16:3572…int

main()16:3573{double

x,

sum,item;int

n,

i;cin

>>

x

>>

n;sum

=

1,

item

=

1;for

(i=1;

i<=n;

i++){item

*=

x/i;sum

+=item;//计算xi/i!//xi/i!加到sum中}cout

<<

"sum="

<<

sum

<<

endl;…算法3除了减少了计算量外;当xi/i!不太大,而xi或

i!很大以至于超出计算机所能表示的数值范围时,算法1和算法2就不能得出正确的结果,由于算法3不直接计算xi或

i!,而是计算xi/i!,因此算法3可行性更好。算法3会带来精度损失,因为xi/i!是基于xi-1/(i-1)!的计算结果的,而xi-1/(i-1)!的计算结果有精度损失,并且这样的精度损失还会不断叠加。16:3574在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。16:3575for

(row=0;

row<100;

row++){for

(

col=0;

col<5;

col++

)sum

=

sum

+

a[row][col];}

//低效率:长循环在最外层for

(col=0;

col<5;

col++

){for

(row=0;

row<100;

row++)sum

=

sum

+a[row][col];}//高效率:长循环在最内层如果循环体内存在逻辑判断循环次数非常小时,两者效率差别不明显,采用简洁写法;循环次数很大时,

将逻辑判断移到循环体的外面,可以提高效率,否则,不仅多执行N-1次逻辑判断,并且由于总是进行逻辑判断,打断了循环“流水线”作业,使编译器不能对循环进行优化处理,降低了效率。for

(i=0;i<N;i++){if

(condition)DoSomething();elseDoOtherthing();}

//效率低但程序简洁if

(condition){for

(i=0;i<N;i++)DoSomething();}else{for

(i=0;i<N;i++)DoOtherthing();}

//效率高但程序不简洁16:3576基本控制流程的特点

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论