第六章
本章要点
循环的使用方法
不同形式的循环控制
goto while do..while for continue break
循环的嵌套
常用算法
§ 6.1 概述开始
0?s,1?i
s+i?s
i+1?i
i >100 不成立成立输出 s 的值结束当某些 操作需要多次重复执行时使用循环。循环中通常会有循环变量,且循环变量要逐步改变使循环趋于结束
§ 6.2 goto语句实现循环
无条件转向语句,形式为,goto 语句标号;
开始
0?s,1?i
s+i?s
i+1?i
i>100 不成立成立输出 s 的值结束
#include<stdio.h>
void main( )
{int i,sum;
sum=0; i=1;
loop,sum=sum+i;
i++;
if(i<=100) goto loop;
printf(“%d\\n”,sum);
}
loop:
§ 6.3 while语句实现循环
“当型,循环,while(表达式 ) 循环体
#include <stdio.h>
void main()
{
int i,sum;
sum=0;i=1;
while (i<=100)
{
sum=sum+i;
i++;
}
printf(“%d \n”,sum);
}
sum=0
i=1
while(i<=100)
sum+i?sum
i+1?i
Print(sum)
补充:
( 1)比较 if(i<=100){ sum=sum+i;i++;}与
while(i<=100){sum=sum+i;i++}
( 2)分析 while(i=100){sum=sum+i;i++};
( 3)注意循环体多条语句时用花括号
§ 6.4 用 do-while语句实现循环直到型循环,do循环体 while(表达式 )
void main( )
{
int i,sum;
sum=0; i=1;
do
{
sum=sum+i;
i++;
}while (i<=100);
printf(“%d\\n”,sum);
}
0?s,1?i
s+i?s
i+1?i
直到 i>100
输出 s 的值
P117例 6.4
两者可相互转化,
提倡用当型循环
§ 6.5 用 for 语句实现循环将循环变量的初始化、循环条件和循环变量的改变集中到一起,如 i=1;while(i<=100){sum=sum+i;i++;}
形式,for(表达式 1; 表达式 2; 表达式 3)循环体 ’
等同于表达式 1;
while(表达式 2)
{
循环体 ’ ;
表达式 3;
}
注意 for语句的 N-S图画法
sum=0,p=1
for(n=1;n<=20;n++)
输出 sum
p=p*n
sum=sum+p
说明:
(1-5)for语句中三表达式均可省略,但分号不能省略
for(; i<=100;i++) sum=sum+i;
for(i=1; ;i++) sum=sum+i;
for(i=1;i<=100;) {sum=sum+i;i++;}
for(;i<=100;) {sum=sum+i; i++;}
for(;;){c=getchar();if(c==?\n?)break;else putchar(c);}
(6-7) 各表达式可扩充。如
for(sum=0,i=1;i<=100;i++) sum=sum+i;
for(i=0,j=100;i<=j;i++,j--) k=i+j;
for(;(c=getchar())!=?\n?; putchar(c));
小结及举例,
例 6.6 用 π/ 4≈ 1-1/3+1/5-1/7+… 公式求 π 的近似值,直到某一项的绝对值小于 0.000001
为止 。
三种循环的比较
i=1,term=1,sign=1
sum=1
while(fabs(term)>1e-6)
i=i+1
sign=sign*(-1)
输出 pi=4*sum
term=sign/(2i-1)
sum=sum+term
注意循环变量步长与答案的不同求出通项,赋予变量一定含义,循环求和 。注意循环变量初值和边界情况分析,
编程前考虑变量类型与整除问题作业,6.1 6.2 6.4 6.5之 N-S图试验报告,
题目,循环结构程序设计目的,掌握用 while do-while for实现循环的方法内容:编程解决上述各题要求:提前写源代码 !
§ 6.6循环的嵌套 — 例 6.8 n= 100
当 n<=200
flag=0
Y N
输出 n
i= 2
当 i<=sqrt(200)且 flag=0n%i=0
Y Nflag=1
flag= 0
i=i+1
n=n+1
n= 100
当 n<=200
判断 n是否素数
n为素数
Y N
输出 n
n=n+1
i= 2
当 i<=sqrt(200)且 flag=0
n%i=0
Y N
flag=1
flag= 0
i=i+1
注意内层循环的语句不能放到外层循环结构程序设计小结:
1、展开式求和 例 6.6求 1-1/3+1/5-1/7+… 到某项小于 10-6
求出通项,赋予变量一定含义,循环求和 。
i=1,term=1,sign=1
sum=0
while(fabs(term)>1e-6)
sum=sum+term
i=i+1
输出 sum
sign=sign*(-1)
term=sign/(2i-1)
当循环变量初值、终值和步长明确时用 for,其它用 while
再如习题 6.14,输出 diamond图形:
前半部分,空格数为 (n+1)/2-i;星花数为 2i-1;
后半部分,空格数为 …,星花数为 …
注意循环变量初值和边界情况分析,编程前考虑变量类型(整除 溢出),注意结果分析展开式求和之习题 6.4求 1!+2!+?+20!
注意多重循环的执行过程
sum=0
for(n=1;n<=20;n++)
p=p*i
输出 sum
for(i=1;i<=n;i++)
p=1;
sum=sum+p
sum=0,p=1
for(n=1;n<=20;n++)
输出 sum
p=p*n
sum=sum+p
注意 for的使用及 N-S图画法
sum=0,n=1
while(n<=20)
p=p*i
输出 sum
while(i<=n)
p=1; i=1;
sum=sum+p
n++
i++
注意变量类型与 p=p*n
展开式求和之习题 6.5求 ∑ k+∑k 2+∑1/k
注意循环变量初值、边界分析、整除问题与累加器
sum=0
for(k=1;k<=100;k++)
输出 sum
sum=sum+k
for(k=1;k<=50;k++)
sum=sum+k
for(k=1;k<=10;k++)
sum=sum+k
sum=0
for(k=1;k<=10;k++)
输出 sum
sum=sum+k+k*k+1/k
for(k=11;k<=50;k++)
sum=sum+k+k*k
for(k=51;k<=100;k++)
sum=sum+k
2、习题 6.6求水仙花数,三位数,如 153= 13+53+33
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
m=100*i+10*j+k
n= i3+j3+k3
m==n
Y N
输出 m
习题 6.7完数与习题 6.15名单穷举法,列举所有可能情况,逐个测试
3 例 6.7求 Fibonacci数列前 40项,4个一行输出 f1与 f2
for(i=3;i<=40;i++)f3=f1+f2
f1=f2
f2=f3
f1=1;f2=1
输出 f3
i%4==0
Y N
换行
for(i=1;i<=19;i++)
f1=f1+f2
f2=f2+f1
输出 f1 f2
输出 f1 f2
f1=1;f2=1
从已知出发向未知靠拢,称之 递推,关键在递推关系式变量重复利用递推习题 6.3,a+aa+aaa+?
term[1]=a;term[n]=term[n-1]*10+a
term=1;sum=1;
for(i=2;i<=n;i++){term=term*10+a;sum+=term}
习题 6.10:猴子吃桃
x[i]表示第 i天早上未吃前的桃子数,则 x[10]=1;
x[n+1]=x[n]/2-1;求 x[1],
x[n]=2*(x[n+1]+1)
for(day=9;day>=1;day--)x=(x+1)*2
习题 6.8:2/1 3/2 5/3?
temp=p;p=p+q;q=t;
4 求 sqrt(a);迭代公式 x[n+1]=(x[n]+a/x[n])/2,初值
x[1]=a/2,直到前后两项差小于 10-5
S1,输入 a;
S2:求 x1与 x2;
S3:当 |x1-x2|>= 10-5时
S4,x1=(x1+a/x1)/2;x2=(x1+a/x1)/2;
S5:输出 x2
迭代,有迭代公式,
且当相邻两项很接近时停止迭代
5 辗转相除法与恺撒密码 (例 6.10)
Y N
p=m*n
m>n
m,n互换
r=m%n
当 r不为零时
n=>m
r=>n
r=m%n
输出 n与 p/n
输入 m,n
注意 p=m*n的位置,以及 m与 n谁是最大公约数
while((c=getchar())!=?\n?)
{
if(c是字母 )
c=c+4;
if(c>?Z?&&c<?Z?+4||c>?z?)
c=c-26
}
§ 6.8 break语句和 continue语句
break语句,结束循环并跳出
for(n=100;n<=200;n++)
{
for(i=2;i<=sqrt(n);i++)
if(n%i==0)break;
if(i>sqrt(n))printf("%d\n",n);
}
float pi=3.14159;
for(r=1;r<=100;r++)
{
s=pi*r*r;
if(s>100) break;
printf(“r=%f,s=%f \n”,r,s);
} 注,break语句是结束 当层 循环
2,continue语句结束 本次 循环,试图 开始下次循环
while(1){
c=getchar();
if(c= =?\n?)break;
if(c= =)continue;
putchar(c);
}break与 continue不能用于 goto语句构成的循环作业,6.3 6.6 6.9(数学 +6.13)之 N-S图实验报告:
实验题目:“穷举、迭代、递推程序设计”
实验内容,6.7 6.8 6.10(数学 +6.12)之 N-S图注意验证结果并记录遇到的问题综合实验 1:使用菜单选择趣味程序
(数学专业选作,计算机专业必作 ).
思路,首先设计一个含有多个菜单项的菜单演示程序,然后为这些菜单项配上相应的功能,按 1-4选择相应程序执行,执行完等待下次选择,直到输入 5退出程序。可参看 ftp中的样例程序菜单项:
1.求 回文数 (如 1221)(输入正整数 m和 n,求 m与 n间的回文数)
2.二分法求方程根 (输入一元二次方程和区间,用二分法求根 )
3.牛顿迭代求方程根 (输入一元三次方程和初始迭代值,用牛顿迭代法求根 )
4.输出菱形图 (输入奇数 m,输出菱形图,最多的一行有 m个星 )
5.Goodbye(退出程序)
时间:每周二下午 2:00-4:00 周四晚 7:00—9:00,地点,13# 332
计算机专业计划内上机,数学专业计划外要求,源代码 +N-S图,1—4至少实现两个,自己作,最好打印
本章要点
循环的使用方法
不同形式的循环控制
goto while do..while for continue break
循环的嵌套
常用算法
§ 6.1 概述开始
0?s,1?i
s+i?s
i+1?i
i >100 不成立成立输出 s 的值结束当某些 操作需要多次重复执行时使用循环。循环中通常会有循环变量,且循环变量要逐步改变使循环趋于结束
§ 6.2 goto语句实现循环
无条件转向语句,形式为,goto 语句标号;
开始
0?s,1?i
s+i?s
i+1?i
i>100 不成立成立输出 s 的值结束
#include<stdio.h>
void main( )
{int i,sum;
sum=0; i=1;
loop,sum=sum+i;
i++;
if(i<=100) goto loop;
printf(“%d\\n”,sum);
}
loop:
§ 6.3 while语句实现循环
“当型,循环,while(表达式 ) 循环体
#include <stdio.h>
void main()
{
int i,sum;
sum=0;i=1;
while (i<=100)
{
sum=sum+i;
i++;
}
printf(“%d \n”,sum);
}
sum=0
i=1
while(i<=100)
sum+i?sum
i+1?i
Print(sum)
补充:
( 1)比较 if(i<=100){ sum=sum+i;i++;}与
while(i<=100){sum=sum+i;i++}
( 2)分析 while(i=100){sum=sum+i;i++};
( 3)注意循环体多条语句时用花括号
§ 6.4 用 do-while语句实现循环直到型循环,do循环体 while(表达式 )
void main( )
{
int i,sum;
sum=0; i=1;
do
{
sum=sum+i;
i++;
}while (i<=100);
printf(“%d\\n”,sum);
}
0?s,1?i
s+i?s
i+1?i
直到 i>100
输出 s 的值
P117例 6.4
两者可相互转化,
提倡用当型循环
§ 6.5 用 for 语句实现循环将循环变量的初始化、循环条件和循环变量的改变集中到一起,如 i=1;while(i<=100){sum=sum+i;i++;}
形式,for(表达式 1; 表达式 2; 表达式 3)循环体 ’
等同于表达式 1;
while(表达式 2)
{
循环体 ’ ;
表达式 3;
}
注意 for语句的 N-S图画法
sum=0,p=1
for(n=1;n<=20;n++)
输出 sum
p=p*n
sum=sum+p
说明:
(1-5)for语句中三表达式均可省略,但分号不能省略
for(; i<=100;i++) sum=sum+i;
for(i=1; ;i++) sum=sum+i;
for(i=1;i<=100;) {sum=sum+i;i++;}
for(;i<=100;) {sum=sum+i; i++;}
for(;;){c=getchar();if(c==?\n?)break;else putchar(c);}
(6-7) 各表达式可扩充。如
for(sum=0,i=1;i<=100;i++) sum=sum+i;
for(i=0,j=100;i<=j;i++,j--) k=i+j;
for(;(c=getchar())!=?\n?; putchar(c));
小结及举例,
例 6.6 用 π/ 4≈ 1-1/3+1/5-1/7+… 公式求 π 的近似值,直到某一项的绝对值小于 0.000001
为止 。
三种循环的比较
i=1,term=1,sign=1
sum=1
while(fabs(term)>1e-6)
i=i+1
sign=sign*(-1)
输出 pi=4*sum
term=sign/(2i-1)
sum=sum+term
注意循环变量步长与答案的不同求出通项,赋予变量一定含义,循环求和 。注意循环变量初值和边界情况分析,
编程前考虑变量类型与整除问题作业,6.1 6.2 6.4 6.5之 N-S图试验报告,
题目,循环结构程序设计目的,掌握用 while do-while for实现循环的方法内容:编程解决上述各题要求:提前写源代码 !
§ 6.6循环的嵌套 — 例 6.8 n= 100
当 n<=200
flag=0
Y N
输出 n
i= 2
当 i<=sqrt(200)且 flag=0n%i=0
Y Nflag=1
flag= 0
i=i+1
n=n+1
n= 100
当 n<=200
判断 n是否素数
n为素数
Y N
输出 n
n=n+1
i= 2
当 i<=sqrt(200)且 flag=0
n%i=0
Y N
flag=1
flag= 0
i=i+1
注意内层循环的语句不能放到外层循环结构程序设计小结:
1、展开式求和 例 6.6求 1-1/3+1/5-1/7+… 到某项小于 10-6
求出通项,赋予变量一定含义,循环求和 。
i=1,term=1,sign=1
sum=0
while(fabs(term)>1e-6)
sum=sum+term
i=i+1
输出 sum
sign=sign*(-1)
term=sign/(2i-1)
当循环变量初值、终值和步长明确时用 for,其它用 while
再如习题 6.14,输出 diamond图形:
前半部分,空格数为 (n+1)/2-i;星花数为 2i-1;
后半部分,空格数为 …,星花数为 …
注意循环变量初值和边界情况分析,编程前考虑变量类型(整除 溢出),注意结果分析展开式求和之习题 6.4求 1!+2!+?+20!
注意多重循环的执行过程
sum=0
for(n=1;n<=20;n++)
p=p*i
输出 sum
for(i=1;i<=n;i++)
p=1;
sum=sum+p
sum=0,p=1
for(n=1;n<=20;n++)
输出 sum
p=p*n
sum=sum+p
注意 for的使用及 N-S图画法
sum=0,n=1
while(n<=20)
p=p*i
输出 sum
while(i<=n)
p=1; i=1;
sum=sum+p
n++
i++
注意变量类型与 p=p*n
展开式求和之习题 6.5求 ∑ k+∑k 2+∑1/k
注意循环变量初值、边界分析、整除问题与累加器
sum=0
for(k=1;k<=100;k++)
输出 sum
sum=sum+k
for(k=1;k<=50;k++)
sum=sum+k
for(k=1;k<=10;k++)
sum=sum+k
sum=0
for(k=1;k<=10;k++)
输出 sum
sum=sum+k+k*k+1/k
for(k=11;k<=50;k++)
sum=sum+k+k*k
for(k=51;k<=100;k++)
sum=sum+k
2、习题 6.6求水仙花数,三位数,如 153= 13+53+33
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
m=100*i+10*j+k
n= i3+j3+k3
m==n
Y N
输出 m
习题 6.7完数与习题 6.15名单穷举法,列举所有可能情况,逐个测试
3 例 6.7求 Fibonacci数列前 40项,4个一行输出 f1与 f2
for(i=3;i<=40;i++)f3=f1+f2
f1=f2
f2=f3
f1=1;f2=1
输出 f3
i%4==0
Y N
换行
for(i=1;i<=19;i++)
f1=f1+f2
f2=f2+f1
输出 f1 f2
输出 f1 f2
f1=1;f2=1
从已知出发向未知靠拢,称之 递推,关键在递推关系式变量重复利用递推习题 6.3,a+aa+aaa+?
term[1]=a;term[n]=term[n-1]*10+a
term=1;sum=1;
for(i=2;i<=n;i++){term=term*10+a;sum+=term}
习题 6.10:猴子吃桃
x[i]表示第 i天早上未吃前的桃子数,则 x[10]=1;
x[n+1]=x[n]/2-1;求 x[1],
x[n]=2*(x[n+1]+1)
for(day=9;day>=1;day--)x=(x+1)*2
习题 6.8:2/1 3/2 5/3?
temp=p;p=p+q;q=t;
4 求 sqrt(a);迭代公式 x[n+1]=(x[n]+a/x[n])/2,初值
x[1]=a/2,直到前后两项差小于 10-5
S1,输入 a;
S2:求 x1与 x2;
S3:当 |x1-x2|>= 10-5时
S4,x1=(x1+a/x1)/2;x2=(x1+a/x1)/2;
S5:输出 x2
迭代,有迭代公式,
且当相邻两项很接近时停止迭代
5 辗转相除法与恺撒密码 (例 6.10)
Y N
p=m*n
m>n
m,n互换
r=m%n
当 r不为零时
n=>m
r=>n
r=m%n
输出 n与 p/n
输入 m,n
注意 p=m*n的位置,以及 m与 n谁是最大公约数
while((c=getchar())!=?\n?)
{
if(c是字母 )
c=c+4;
if(c>?Z?&&c<?Z?+4||c>?z?)
c=c-26
}
§ 6.8 break语句和 continue语句
break语句,结束循环并跳出
for(n=100;n<=200;n++)
{
for(i=2;i<=sqrt(n);i++)
if(n%i==0)break;
if(i>sqrt(n))printf("%d\n",n);
}
float pi=3.14159;
for(r=1;r<=100;r++)
{
s=pi*r*r;
if(s>100) break;
printf(“r=%f,s=%f \n”,r,s);
} 注,break语句是结束 当层 循环
2,continue语句结束 本次 循环,试图 开始下次循环
while(1){
c=getchar();
if(c= =?\n?)break;
if(c= =)continue;
putchar(c);
}break与 continue不能用于 goto语句构成的循环作业,6.3 6.6 6.9(数学 +6.13)之 N-S图实验报告:
实验题目:“穷举、迭代、递推程序设计”
实验内容,6.7 6.8 6.10(数学 +6.12)之 N-S图注意验证结果并记录遇到的问题综合实验 1:使用菜单选择趣味程序
(数学专业选作,计算机专业必作 ).
思路,首先设计一个含有多个菜单项的菜单演示程序,然后为这些菜单项配上相应的功能,按 1-4选择相应程序执行,执行完等待下次选择,直到输入 5退出程序。可参看 ftp中的样例程序菜单项:
1.求 回文数 (如 1221)(输入正整数 m和 n,求 m与 n间的回文数)
2.二分法求方程根 (输入一元二次方程和区间,用二分法求根 )
3.牛顿迭代求方程根 (输入一元三次方程和初始迭代值,用牛顿迭代法求根 )
4.输出菱形图 (输入奇数 m,输出菱形图,最多的一行有 m个星 )
5.Goodbye(退出程序)
时间:每周二下午 2:00-4:00 周四晚 7:00—9:00,地点,13# 332
计算机专业计划内上机,数学专业计划外要求,源代码 +N-S图,1—4至少实现两个,自己作,最好打印