第三章 最后一部分 —— 循环控制

75
第第第 第第 第第——第第第第 while 循循循循 do-while 循循循循 for 循循循循 循循循循循循 break 循循循 continue 循循 goto 循循循循循 循循循循 循循循循 循循循循

Upload: stacy-armstrong

Post on 01-Jan-2016

60 views

Category:

Documents


3 download

DESCRIPTION

第三章 最后一部分 —— 循环控制. while 循环语句 do-while 循环语句 for 循环语句 多重循环嵌套 break 语句和 continue 语句 goto 语句和标号 程序举例. 三个基本 循环结构. 在现实问题中 , 通常需要处理一些有规律的问题 , 一般形式是 在 给定条件 成立时, 反复执行某程序段 ,直到条件不成立为止。 例如: 1: 在 10000 名学生中找到学号 SNO 为 A0004 的学生 当 SNO == A0004 或者 找完 10000 个学生记录,反复执行的动作就是比较 2: 将销售金额按照降序排列 - PowerPoint PPT Presentation

TRANSCRIPT

第三章 最后一部分——循环控制

while 循环语句do-while 循环语句for 循环语句

多重循环嵌套break 语句和 continue 语句goto 语句和标号

程序举例

三个基本循环结构

在现实问题中 , 通常需要处理一些有规律的问题 , 一般形式是在给定条件成立时,反复执行某程序段,直到条件不成立为止。例如: 1: 在 10000 名学生中找到学号 SNO 为 A0004 的学生

当 SNO == A0004 或者 找完 10000 个学生记录,反复执行的动作就是比较

2: 将销售金额按照降序排列所有销售额都从大到小排列,反复执行的动作 比较并换位3: 输入 10000 条商品信息商品信息是否少于 10000 条, 反复执行的动作 输入商品信息4: 筛选出所有重量小于 500 克的苹果判断是否筛选完所有苹果,反复执行的动作 判断苹果重量是否小

于 500 克都要反复执行某段程序 , 也有一定的判断条件。反复执行的某程序段 可以被看成 循环体 ,而判断条件 可以被看作循环条件,因此 循环体 和 循环条件 是构成循环结构的要素。

循环条件

循环体

循环可以被看成 在满足一定条件时 重复执行一段程序

循环条件

循环体

循环条件在前 循环体在后当循环 while

循环体在前 循环条件在后直到循环 do while

循环变量相关的循环体和循环条件 组合在的循环 for

【问题】如何计算 1+2+3+4+…+100

1 2 3 100……

1 1+2 1+2+3 1+2+3+…+100i

s

s = s + i; /* 投入 i 枚硬贝到 s中 */

i = i + 1; /* 计算下次投贝数 */

s=0; /* 盒子开始为空 */

i=1; /* 第 1 次投贝 */

while(i<=100) /* 100 次投贝 */

{ s=s+i; /* 投入 i 枚硬贝到 s中 *

/

i=i+1; /* 计算下次投贝数 */

}

分析一个循环问题时,通常需要分析出1 :循环体2 :循环条件3 :控制循环的循环变量4 :循环的初始状态和结束状态5 :循环的次数

while 循环语句while 循环的一般形式如下: while (表达式 A ) 语句 A

( a) ( b)

表达式

当表达式为真

循环体不满足

循环体

满足

例如: while ( a<b ) a++ ;

当 表达式 A 为真 执行 语句 A ,然后再看 表达式 A 是否还为真,如果为真执行语句 A ,如此重复。当表达式 A 为假时,才退出循环。

while 语句的执行过程是:先计算 while 后面圆括号内表达式的值,如果其值为“真”(非 0 ),则执行语句部分(即循环体);然后再计算表达式的值,并重复上述过程,直到表达式的值为“假”( 0 )时,循环结束,程序控制转至循环结构的下一语句。

while 循环中的表达式一般是关系表达式(如 i<=10

0 )或逻辑表达式(如 a<b&&x<y ),但也可以是数值表达式或字符表达式,只要其值非零, 就可执行循环体。

while 是“当循环” 总是 , 非常谨慎 走一步看一步

#include <iostream>#include <cstring>Using namespace std;Void main( ){ int i,s; i=1;s=0; while(i<=100) /* 循环控制 */ { s=s+i; i=i+1; }Cout<<“s=”<<s<<endl;}

根据具体例子 [1~100 和 ] 来说明: while 循环是如何执行的。

i=i+1;s=s+i;

发生什么变化

1 : i 将变成 2 后,开始累加2 : 101 要被加一次

#include <iostream>#include <cstring>Using namespace std;

main( ){ int i,s; i=100,s=0; while ( i>=1 ) { s=s+i; i=i-1; } Cout<<“s=”<<s<<endl;

}i 初值为 1 , 0 , 100 的解释

#include <iostream>#include <cstring>Using namespace std;main(){ int i,s; i=1;s=0;Cout<<endl<<"Initial value:s=“<<s<<endl<<“i=”<<i<<endl; cout<<"Begin do circle“<<endl; while(i<=10) {

s=s+i; cout<<“step:”<<i<<“s=s+i”<<s;

i=i+1; cout<<“i=i+1”<<i<<endl; }Cout<<"End do circle“<<endl;Cout<<“s=“<<s<<endl;}

Begin do circlestep:1 s=s+i:s=1 i=i+1:i=2step:2 s=s+i:s=3 i=i+1:i=3step:3 s=s+i:s=6 i=i+1:i=4step:4 s=s+i:s=10 i=i+1:i=5step:5 s=s+i:s=15 i=i+1:i=6step:6 s=s+i:s=21 i=i+1:i=7step:7 s=s+i:s=28 i=i+1:i=8step:8 s=s+i:s=36 i=i+1:i=9step:9 s=s+i:s=45 i=i+1:i=10step:10 s=s+i:s=55 i=i+1:i=11s=55End do circle

修改程序为连乘!修改为连乘时

注意整数的溢出

打印出循环的每一步变化

Example

利用 while 语句实现:从键盘输入 n ( n>0 )个数,求其和。 start

i=1;sum=0;

i≤n

sum=sum+k; i++;

stop

读入 n

读入 k

输出 sum

N

Y

分析出:循环变量、循环体、循环变量

void main() { int i, n, k, sum; i=1; sum=0; cout<<"Input n: “<<endl; cin>>n; while(i<=n) { cin>>k; sum=sum+k; i++; } cout<<“sum is:”<<sum<<endl; }运行结果: Input n: 612 34 2 11 9 5sum is: 73 Example

从键盘连续输入字符,直到输入‘ 0’ 符为止, 统计输入的字符个数。

start

len=0;

Cin>>a; if(a!=‘0’)

stop

输出 len

N

Y

len++

分析出:循环变量、循环体、循环变量

Example

Void main() { char ch; int len=0; cout<<"Type in a sentence, then press <0>“<<endl; cin>>ch; while (ch!=′0′) { len++; cin>>ch; } cout<<"Sentence is “<<len<<“ characters long."; }运行结果: Type in a sentence, then press <0>this is a sentence.0Sentence is 19 characters long.

注意

(1) 循环体包括一条或多条语句,多条语句必须用一对花括号括起来,构成复合语句。

(2) 合理的循环是有限次循环。避免死循环。 发生死循环 ——循环条件始终为真 ,主要有两种情况:

1 循环条件自身的问题 A ” =“ ”==“ ,” &&“ 和” ||“ 混用,关系符号写反 “ <=100” “>=1”2 循环体中,没有让循环条件 发生变化,最后能结束

(3) 注意控制循环次数的因素,即循环条件和控制循环的主要变量 —— 例如:求和程序中的 i ,其初值和终值

void main(){int i=0;char c;while(1){c='\0';while(c!=13&&c!=27){cin>>c;cout<<c<<endl;

}if(c==27) break;i++;cout<<“the no.is”<<i<<endl;

}cout<<"The end!";}

运行后,输入了字母,然后在按ESC 键和输入 13和 27 都跳不出循环

请分析出 【循环条件 和 循环体】,使用的循环变量和 循环次数等信息:

1 :区分出 1 ~ 100 之间的所有的偶数和奇数2 :输入一个整数 n ,输出其所有能被整除的除数 。例

如 输入 6 则 6,3,2,13 :输入 45 个学生的名单,打印出 45 名学生中的女生4 :从输入两个数 a , b (例如: 1234 ~ 4567 )中找

出第一个 ( 最后一个 ) 可以整除 13 的数

1 :循环条件 – 被判断的数是否小于等于 100循环体 – 判断是否为奇数或偶数循环次数 - 100 次控制循环的循环变量 - 计数器 变量初始和结束值 1 ~ 100

2 :解决方法是 一个数一个数的试,如果可以输出循环条件 – 被判断的数是否小于等于 n循环体 – 判断是否为 n % x==0循环次数 - n 次控制循环的循环变量 - 计数器 变量初始和结束值 1 ~ n

3 :循环条件 – 被判断是否输入完 45 个学生循环体 – 判断是否为女生,如果是就打印出来循环次数 - 45 次控制循环的循环变量 - 计数器 变量初始和结束值 1 ~ 45

4 :循环条件 – 是否能被 13 整除,是否小于等于 b循环体 – 看看是否可以整除 13循环次数 - 无法确定控制循环的循环变量 - 计数器 变量初始和结束值 a ~ ?

5 :循环条件 – 是否能被 13 整除,是否小于等于 b循环体 – 看看是否可以整除 13循环次数 - b-a+1控制循环的循环变量 - 计数器 变量初始和结束值 a ~ b

do-while 循环语句do-while 循环的一般形式如下: do 语句 A while ( 表达式 A) ;

例如: do a++ ;

while(a<b);

执行 语句 A ,然后再看 表达式 A 是否为真,为真 执行 语句 A 。如此重复 . 当表达式 A 为假时,才推出循环。

( a) ( b)

表达式不满足

满足

直到表达式为假

循环体循环体

不可漏

do—while 语句的执行过程是:先执行循环体中的语句,然后计算表达式的值。若表达式的值为“真”(非0 ),则再次执行循环体。如此重复,直至表达式的值为“假”( 0 )时,结束循环。

注意 do - while( 表达式 ) 后的 ‘ ;’ 容易忘写

do while 直到型 是先斩后奏型的 , 循环体最少执行一次

计算表达式

1×2   2×3   3×4      n×(n+1)

1 1 1 1+ + + …..+ +…..

的值,直到某一项的值小于 10-3 次方为止。

分析: 1. 累加项 t=

2. 循环条件为 : t≥10 -3

i×(i+1)

1分析出:

循环体、循环变量

void main( ){float sum=0,t; int i=1; do {t=1.0/(i*(i+1)); sum=sum+t; i++; } while (t>=1e-3); cout<<"sum=“<<sum; }

Example

循环条件

利用 do—while 语句重做。从键盘输入 n ( n

>0 )个数,求其和。 图 5.5

求n

个数的

start

i=1;sum=0;

sum=sum+k; i++;

stop

读入 n

读入 k

输出 sum

N

Yi≤n

start

i=1;sum=0;

i≤n

sum=sum+k; i++;

stop

读入 n

读入 k

输出 sum

N

Y

start

i=1;sum=0;

sum=sum+k; i++;

stop

读入 n

读入 k

输出 sum

N

Yi≤n

While 和 do while 的对比

void main() { int i, n, k, sum; i=1; sum=0; cout<<"Input n: “<<endl; cin>>n; do { cin>>k; sum=sum+k; i++; } while(i<=n); cout<<"sum is: “<< sum; } 运行结果: Input n: 612 3 7 11 23 34 sum is: 90

whilewhile 循环与循环与 do_whiledo_while 循环小结循环小结 ::

1. 1. 循环体内必须有使循环趋于终止的条件 循环体内必须有使循环趋于终止的条件

while (i<=100) { sum=sum+i; i++; }

do { sum=sum+i; i++; } while (i<=100)

2. 2. 注意循环初值与循环条件的关系注意循环初值与循环条件的关系i=1;while (i<=100) { sum=sum+i; i++; }

i=0;while (i<100) { i++; sum=sum+i; }

3.3. do_while do_while 的循环体至少执行一 次的循环体至少执行一 次 ,while,while 的的循环体可能一次也不执行。循环体可能一次也不执行。 (n=0)(n=0)

4.4. 在循环体至少执行一次的前提下,在循环体至少执行一次的前提下, do_while do_while 与 与 while while 循环等价。循环等价。 (n>0)(n>0)

求 n! while 和 do while void main( )main( ) { int i=1,n;{ int i=1,n; double m=1;double m=1; cin>>n;//n=1;n=0cin>>n;//n=1;n=0 while(i<=n)while(i<=n) { m=m*i;{ m=m*i; i++;i++; }} cout<<m<<endl;cout<<m<<endl; }}

main( )main( ) { int i=1,n;{ int i=1,n; double m=1;double m=1; cin>>ncin>>n

dodo { m=m*i;{ m=m*i; i++;i++; }while(i<=n);}while(i<=n); cout<<m<<endl;cout<<m<<endl;

}}

for 循环语句

for 循环语句的一般形式如下: for ( 表达式 1 ; 表达式 2 ; 表达式 3)

语句 A

表达式 2不满足

满足

求解表达式 1

求解表达式 1

当表达式 2 为真

循环体求解表达式 3

循环体

求解表达式 3

例如:for (i=1;i<=100;i++)

s=s+i;

for 语句的功能可用 while 语句描述如下: 表达式 1; while ( 表达式 2) { 语句; 表达式 3; }

例如:for (i=1;i<=100;i++)

s=s+i;

i=1;

While(i<=100)

{

s=s+i;

i++;

}

其执行过程是: ( 1 ) 首先求解表达式 1 。 ( 2 ) 求解表达式 2 , 若其值为“真”(非 0 ), 则执行循环体中的语句, 然后执行第 (3) 步。若为“假”( 0 ), 则结束循环, 转至第 (5) 步。 ( 3 ) 求解表达式 3 。 ( 4 ) 转至第 (2) 步重复执行。 ( 5 ) 执行 for 循环语句的下一语句。

必做的一步,通常用来初始化循环条件

通常用来改变循环变量的值,促使循环条件表达式 2 可能结束

for 标准形式:

for ( 循环变量赋值; 循环条件; 循环变量增值 )

例如, for (i=1; i<=100; i++) sum=sum+i;

for 是胸有成竹型的 , 一般情况下,从 for 语句就可以看出结束的条件和循环的次数

考虑如何 用 for 循环 写出 1 ~ 100 的和

#include <stdio.h>main( ){ int i,s; s=0

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

s = s + i; printf("s=%d\n",s);}

循环的初始化i = 1 , s=0

循环的条件分析

循环变量的控制 当 写 i- -

修改:求 所有 偶数和 奇数和方法 1 用 if方法 2 赋初值和步长的方法

for 语句的功能可用 while 语句描述如下: 表达式 1; while ( 表达式 2) { 语句; 表达式 3; }

求 所有 偶数和 奇数和方法 1 用 while+if

Void main(){int i=1,sum1=0,sum2=0;while(i<=100) {If(i%2!=0) sum1=sum1+i; else sum2=sum2+I; i++ } Cout<<……..}

求 所有 偶数和 奇数和方法 2 用 for+if

Void main(){int sum1=0,sum2=0;for(i=1;i<=100;i++) {If(i%2!=0) sum1=sum1+i; else sum2=sum2+I; } Cout<<……..}

求 所有 偶数和 奇数和方法 3 用 for 步长

Void main(){int sum1=0,sum2=0; for(i=1;i<=100;i=i+2) sum1=sum1+i; for(i=2;i<=100;i=i+2) sum2=sum2+I;Cout<<……..}

请你在屏幕上连续打印出 40 个“ * ”;

main(){

int i;

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

cout<<‘*’;

cout<<endl;

} 计算 1 至 50 中是 7 的倍数的数值之和。main() { int i, sum=0; for (i=1; i<=50; i++) if (i%7==0) sum+=i; cout<<“sum=”<<sum<<endl; } 运行结果: sum=196

修改程序:纵向打印 40 个 * 号

例 利用 for 语句 从键盘输入 n ( n>0 )个数,求其和。

void main()

{ int i, n, k, sum=0;

cout<<“input n”<<endl;

cin>>n;

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

{ cin>>k;

sum=sum+k;

}

cout<<“sum is:”<<sum<<endl;

}

运行结果: Input n: 6

7 11 20 5 2 19

sum is: 64

注意(1)for 循环可以用以下 while 循环代替 :

(2) 表达式① ③可以是多个表达式构成的逗号表达式 例如: for(i=1,s=0;i<=100;s=s+i,i++);

(3) ①、②、③构成循环的控制部分,三个表达式之间用分号 ; 分隔 ;

(4) for(①; ②; ③) 几个表达式都可以省略,有下面几种形式:

①;while ( )②{ ;④ ③; }

for( ; ; )① ② ③④;

①;do{ ;④ ③; }while ( );②

A 表达式①可以放在 for 循环的前面,但后面的分号不能少

B 表达式③也可以省略,但作为循环变量的调整功能不能缺少,可以在循环体中完成

①;for ( ; ; ② ③) ④;

C 表达式②也可以省略,相当于②始终为真值,从而构成无条件循环,循环将不能终止,需要采取其他措施 ;

for ( ① ; ; ② ) ④; ③;

s=0;i=1;for ( ;i<=100;i++ ) s=s+i;

s=0;for ( i=1;i<=100; ) s=s+i; i++;

for ( ① ;; ③ ) .. ② .. ;④

s=0;for ( i=1;; i++ ) s=s+i; if(i<=100) break;

E ①、②、③均省略,即 : 循环的所有控制和计算功能都必须在循环体④中完成

D 如果表达式①和③都省略的话,相当于 while 循环i=1;s=0;for (;i<=100;) {s = s + i; i++;}

①;for ( ; ; ② ) { ④; ③;}

①;for ( ;; ) {… …② .; ; ④ ③;}

i=1;s=0;for (;;) {if(i<=100) break;s = s + i; i++;}

F 表达式④也可以省略 ,但必须至少保留一个分号 , 即 : for ( ; ; ) ; ① ② ③ 一个分号即是一条空语句。

G 如果①、②、③、④均省略,即如以下形式: for (;;); 这将构成一个死循环。

多重循环嵌套当一个循环体内又包含另一个完整的循环结构时,称为多重循环或循环嵌套,其循环结构可用上述三种循环语句的任意一种。

( 1 ) while ( 表达式 ) { …… while ( 表达式 ) { …… }

…….. }

( 2 ) for ( 表达式 1; 表达式 2; 表达式 3 ) { …… for ( 表达式 21; 表达式 22; 表达式 23 ) { …… }

…….. }

( 3 ) for ( 表达式 1; 表达式 2; 表达式 3 ) { …. do { …… } while( );

….. }

( 4 ) for ( 表达式 1; 表达式 2; 表达式 3 ) { …… for ( 表达式 21; 表达式 22; 表达式 23 ) { ……

for ( 表达式 31; 表达式 32; 表达式 33 )

{…….

}……

}……..

}

多层次嵌套

不同类型循环嵌套

计算 s=1+(1+2)+(1+2+3)+…+(1+2+3+4+…10).. 加到 1 ~ 10 的和

分析 1 :不仅整个式子都是有规律的,而且式子中的每个元素也是有规律。先不管每个元素是什么, a1+a2+a3……..a10

i=1 s=0

i<=10

s=s+ai 未知

ai 是一个 1 ~ i 所有元素的和

j=1 u=0

j<=i

u=u+j

循环的结果u 就是 ai

Void main(){ int i,j,s;s=0; for ( i=1;i<=10;i++ )

s = s+ai;Cout<<“s=”<<s<<endl;} Void main()

{ int i,j,s,u;s=0; for ( i=1;i<=10;i++ ) {

u=0;for(j=1;j<=i;j++)

u=u+j;s = s+u;

}Cout<<“s=”<<s<<endl;

}

第一层 第二层

计算 s=1+(1+2)+(1+2+3)+…+(1+2+3+4+…10).. 加到 1 ~ 10 的和

Void main(){ int i,j,s; s=0; for ( i=1;i<=10;i++ ) for ( j=1;j<=i;j++ ) s=s+j; Cout<<“s=”<<s<<endl;

}

将该过程直接理解为按照一定规律连加的过程

i= 1 , s= 0

i<=10

j<=i

s= s+j

退出时 s 将所有的元素都相加了

打印出一个棋盘,棋盘横向 10格,纵向 10格,黑白相间

循环条件,就是判断是否打印完 10格和是否打印完10 行

提示,用空格可以表示 黑色格,用 *表示白色格。

Void main(){int i,j;Char c=‘*’;for(i=1;i<=10;i++)  {   for(j=1;j<=10;j++)     if((i+j)%2==0)      cout<<c;    else     printf(" ");   printf("\n");  }}

Example

输出九九表。横向第一行为 1 2 3 4…. 9 的数字,纵向第一列为 1 2 3 4…. 9 的数字,交叉处为 i×j 的值

Void main(){ int i,j; for(i=1;i<=9;i++) cout<<right<<i; /* Print First Line 1~9 */

cout<<endl;

for(i=1;i<=9;i++) {

for(j=1;j<=9;j++) cout<<right<<i*j;

cout<<endl;

} /* Print 9~9 multiplication table*/}

Example

运行结果: * 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81

* 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81

* 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 9 12 15 18 21 24 27 4 16 20 24 28 32 36 5 25 30 35 40 45 6 36 42 48 54 7 49 56 63 8 64 72 9 81

作业 5

break 语句、 continue 语句break 语句 break;( 1 ) break 语句只能和 switch 语句或循环结构语句搭配:

if (…) break; 该 if 语句一定位于循环体中或 switch 结构中, break 语句跳出的也不是 if 语句,而是对应的循环结构或switch 结构。

( 2 )嵌套循环结构中, break 语句只能跳出它所在的循环,而不能同时跳出多层循环,如:

for (…){ for (…) { … break; } … } …

计算 r=1 到 r=10 时的圆面积,直到面积 area大于 100 为止。

# define PI 3.1415926 void main() { int r; float area; for (r=1; r<=10; r++) { area=PI*r*r; if (area>100) break; cout<<“area is:”<<area<<endl; } }

运行结果: r: 1 area is: 3.1415930r: 2 area is: 12.566370r: 3 area is: 28.274334r: 4 area is: 50.265480r: 5 area is: 78.539818

题目改为:计算 r=10 到 r=1 时的圆面积,直到面积 area 小于 30 为止。 Example

continue 语句 continue 语句的作用是 结束本次循环,跳过循环体中尚未执行的语句,直接进行下一次循环。

continue 语句的一般形式如下: continue; 其执行过程是:终止当前这一轮循环,

即跳过循环体中位于 continue 后面的语句而立即开始下一轮循环;

把 100 到 150 之间的不能被 3 整除的数输出。要求一行输出 10 个数。 Void main(){ int n, i=0; for (n=100; n<=150; n++) {

if (n%3==0) continue; cout<<right<<n; i++; if (i%10==0) cout<<endl; } }

阅读程序,说出循环体中每条语句的功能

如果去掉 continue 程序如何修改

100 101 103 104 106 107 109 110 112 113115 116 118 119 121 122 124 125 127 128130 131 133 134 136 137 139 140 142 143145 146 148 149 Example

比较 break 和 continue 的执行main(){

int i; cout<<endl<<“Break statement:”<<endl;

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

if (i==3) {cout<<"begin break“<<endl;break;}cout<<“do”<<i<<endl;

} cout<<“continue statement:”<<endl;

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

if (i==3){cout<<"begin continue“<<endl;continue;} cout<<“do”<<i<<endl;

}}

运行结果:Break Statement:do 1 !do 2 !begin break

Continue Statement:do 1 !do 2 !begin continuedo 4 !do 5 !do 6 !do 7 !do 8 !do 9 !do 10 ! Example

阅读程序写出运行结果体会 break 和continue 的区别

#include <stdio.h>main (){ int i,s; for ( i=1,s=0;i<=10;i++ ) { if ( i%2==0 ) continue; if ( i%10==7 ) break; s=s+i;

}Cout<<“s=”<<s<<endl;}

阅读程序,写出该程序的运行结果

Example

6.6 goto 语句 和 标号goto 语句为无条件转向语句,程序中使用 goto 语句时要求和标号配合, 它们的一般形式为 —— goto 是一个有争议的语句

goto 标号 ; … 标号 : 语句; 一般来讲, goto 语句可以有两种用途: ( 1 ) 与 if 语句一起构成循环结构。 ( 2 ) 退出多重循环。

Void main(){int i,s;i=1;s=0;LOOP:if(i<=100){

s=s+i;i++;goto LOOP;

} cout<<“s=”<<s;}

Example

请大家回去在写一个 goto 语句实现跳出多重循环的练习

程序举例

7

1

5

1

3

11

4

公式求出 π 的近似值,

直到最后一项的绝对值小于 10-6 为止。

循环结束条件 当最后一个元素绝对值小于 10 - 6

循环体 累加过程和 构建累加项的过程, i++累加项 = (-1)n/(2n+1) n=0

# include “math.h”main(){

long i;double flag,t,pi;i=1;flag=1;pi=1;do{

flag = -flag;t=1/(2*i+1.0);pi=pi+flag* t;i++;

} while(t>=1e-6);pi = 4*pi;

cout<<pi;} Example

阅读程序写出每一步的含义

欧几里德算法又称辗转相除法。用于计算两个整数 a,b 的最大公约数。其计算原理依赖于下面的定理: a>=b

gys(a,b) = gys(b,a%b) gys(b,a%b)= gys(a%b,b%(a%b))….. 直到两数可以被整除时,被除数(被模数)就是最大公约数

即: a 和 b 的最大公约数 等于 b 和 a%b 的最大约数

而 最小公倍数= a×b/ 最大公约数

题目:输入两个整数 a , b 求其 最大公约数和最小公倍数

main(){int num1,num2,x,y,temp;printf("Please input two data:");scanf("%d%d",&num1,&num2);if(x < y){

temp = num1;num1 = num2;num2 = temp;}x=num1; y=num2;

while(y!=0){temp = x%y;x=y;y=temp;

}printf("MAX GYS:%d \n",x);printf("MIN GBS:%d \n",num1*num2/x);

}

辗转相除法

Example

从键盘输入一个大于 2 的整数 n ,判断 n 是不是素数。注 : 只要 sqrt(n) 后的所有整数都不能整除 n, 则该数为素数 # include <stdio.h>

# include <math.h>

main()

{ int n, k, i, flag;

printf("Input a number: ");

scanf("%d", &n);

if(n>2)

{

k=sqrt((double)n);

flag=1;

for (i=2; i<=k; i++) if (n%i==0)

{ flag=0; break;}

if (flag) printf("%d is a prime

number.\n", n); else printf("%d is not a prime

number.\n", n); }

}

Example

中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

分析出公式 :cocks + hens + chicks = 1005 * cocks + 3 * hens + chicks / 3 = 100

0<=clocks && clocks<=200<=hens && hens<=330<=chicks && chicks<=100

确定 clocks 的数量 , 求其他两种鸡的数量

for(clocks=0;clocks<=20;clocks++)找出满意的 hens 和 chicks 数

for(clocks=0;clocks<=20;clocks++)for(hens=0;hens<=33;hens++)

找出满意的 chicks 数

for(clocks=0;clocks<=20;clocks++)for(hens=0;hens<=33;hens++)

chicks=100-cocks-hens;如果 5*cocks + 3*hens + chicks/3

== 100 则输出

main(){int cocks,hens,chicks;for(cocks=0;cocks<=20;cocks++)

for(hens=0;hens<=33;hens++){

chicks = 100 - cocks - hens;if ((chicks%3==0)&&(5 * cocks + 3 *

hens + chicks/3 ==100))printf("cocks=%2d hens=%2d chick

s=%2d\n",cocks,hens,chicks);}

}cocks= 0 hens=25 chicks=75cocks= 4 hens=18 chicks=78cocks= 8 hens=11 chicks=81cocks=12 hens= 4 chicks=84

Example

打印以下图形

【分析】程序需要输出 5 行星号,但每行输出的个数不等,其规律如下行数 = 星号数

#include <stdio.h>main( ){ int i,j; for (i=1;i<=5;i++) { for (j=1;j<=i;j++) printf("*"); printf("\n"); /* 每输出一行需要换行 */

}}

***************

#include <stdio.h>main( ){ int i,j; for (i=1;i<=10;i++) { for (j=1;j<=10;j++)

if (i<=j) printf("*"); else printf(" ");

printf("\n"); /* 每输出一行需要换行 */

}}

Example

Fibonacci 数列的特点是,前两个数为 1,1 。从第 3 个数开始,每个数都是前面两个数的和。即:

F1=1,F2=1 ( n=1 或 2 )Fn=Fn-1+Fn-2 ( n>=3 )很显然, Fibonacci 数列依次为

1,1,2,3,5,8,13,21,34……

计算 Fibonacci 数列前 20 项的和。

/* EX5-11.C */main( ){ int f1,f2,f; int i; long s=0; f1=f2=1; for(i=1;i<=18;i++) /*已经有两个数,只要再产生 18 个数即可 */

{ f=f1+f2; /*得到一个新数 */

s=s+f; printf(“f1=%d,f2=%d”,f1,f2); f1=f2; /* 重置两个数 */

f2=f; } printf("%ld\n",s);}

Example

作业 11 :区分出 1 ~ 100之间的所有的偶数和奇数2 :输入一个整数 n ,输出其所有能被整除的除数 ,出去 1 和 n 自身。例如 输入 6 则 3 , 23:A 输入 n ,求 1-1/2+1/4-1/8+1/16…..+(-1/2)n 值 (float) B 求 1-1/2+1/4-1/8+1/16 …..+(-1/2)n 值,直到最后元素的小于 10-4

C 输入 x ,求 f(x)= x-x/2+x2/4-x3/8+x4/16…..+(-1 *x/2)n 的值 直到最后元素小于 10 - 4 (用 pow函数 或 循环嵌套,两种方法分别实现)4 :用 * 号打印出右图 1,2 ,一共 10 行

5 :打印出 9 ~ 9 乘法口诀表,形状为下三角型 和上三角型6 :输入一个数 n ,判断是否为素数。提示:除 1 和 n 是否能被其它数整除如果能就不是。

************************************

* *** ***** ****************

结束

2素数?

sin(x)=x-x3/3!+x5/5!-x7/7!+…..x(2n-1)/(2n-1)!直到最后一项的绝对值小于 1e-7 为止 .

t= (-1)n-1 ------------------x2n-1

(2n-1)!

#include "math.h"#define EPS 1e-7main(){

double x,s,t,item,y=0.0;int flag=-1,i=1,j;printf("\n Enter x:");scanf("%lf",&x);do{

t=s=1; for(j=1;j<=i;j++){

t=t*j;s=s*x;

} flag = -flag; item = flag*s/t; y=y+item; i+=2; printf("item=%lf\n",item);

}while(fabs(item)>EPS);printf("sin(%lf)=%lf,sin(%lf)=%lf",x,y,x,sin(x));

}

计算 100 以内的所有素数之和素数可以从定义来判断,除了 1 和本身之外,没有其他因子,所以程序的任务是依次判断 1 到 100之间的所有的数是否为素数,如果是,将其累加。最后输出累加的和。 需要嵌套的循环,外循环控制产生 1 到 100 的数的循环,循环变量的值也正是内循环需要判断的对象;内循环首先判断当前的循环变量的值是否为素数,是则累加。循环结束后输出累加的和。

【例 5-10 】 计算 100 以内的所有素数之和

main(){ int i,j,s=0; for(i=2;i<=100;i++) /* 设置循环产生 2 ~ 100之间的数 */

{ for(j=2;j<=i-1;j++) /* 用 2 ~ i-1 的数去除 i */

if(i%j==0) break; /* 有能整除 i 的 j,说明 i 不是素数 ,退出 */

if(j>i-1) /* i 是素数 , 因为 2 ~ i-1 没有 i 的因子 */

s=s+i; } printf("%d\n",s);}

j<=i/2 或 j<=sqrt ( i )

Example