32 基本语句与结构化程序设计.docx
- 文档编号:17331857
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:17
- 大小:84.34KB
32 基本语句与结构化程序设计.docx
《32 基本语句与结构化程序设计.docx》由会员分享,可在线阅读,更多相关《32 基本语句与结构化程序设计.docx(17页珍藏版)》请在冰点文库上搜索。
32基本语句与结构化程序设计
第3章基本语句与结构化程序设计
3.4循环结构程序设计
循环的必要性:
3数排序=》n数排序
重复的操作步骤:
循环结构、归纳思维。
循环思路的来源:
归纳
程序设计方法:
先定框架,后写语句。
共同例子:
计算1+2+....+100
例子之后的扩展:
计算1+3+5+....+99
计算1*2*....*10
3.4.1goto语句及语句标号
循环技术重点之一:
循环框架。
条件在前的框架
voidmain()
{inti=1;sum=0;
loop:
if(i<=100)
{sum=sum+i;i++;
gotoloop;
}
printf("%d,%d\n",i,sum);
}
条件在后的框架
voidmain()
{inti=1;sum=0;
loop:
sum=sum+i;i++;
if(i<=100)
gotoloop;
printf("%d,%d\n",i,sum);
}
循环技术重点之二:
循环变量及相关变量的变化。
循环变量
循环变量的增量
部分和
部分积
I
i++
i=i+2
sum=0
sum+=……
sum=1
sum*=……
循环技术重点之三:
结束的条件。
因循环变量结束循环
if(i<=100)
gotoloop;
因其他变量结束循环
if(sum>=100)
gotoloop;
3.4.2while语句框架
voidmain()
{inti=1,sum=0;
while(i<=100)
{sum=sum+i;
i++;
}
printf("%d,%d\n",i,sum);
}
尝试其他运算的循环,理解循环的结果。
各式各样的while循环:
voidmain()
{inti=1,sum=0;
while(i<=100)
sum=sum+i++;
printf("%d,%d\n",i,sum);
}
voidmain()
{inti=1,sum=0;
while(sum=sum+i,i++<=100);
printf("%d,%d\n",i,sum);
}
3.4.3for语句框架
for(i=1,sum=0;i<=100;i++)sum+=i;
执行次序:
①②④③
初始化条件循环变量循环体
voidmain()
{inti,sum;
for(i=1,sum=0;i<100;i++)
sum+=i;
printf("%d,%d\n",i,sum);
}
各式各样的for循环:
voidmain()
{inti=1,sum=0;
for(;i<100;i++)
sum+=i;
printf("%d,%d\n",i,sum);
}
voidmain()
{inti=1,sum=0;
for(;i<100;)
sum+=i++;
printf("%d,%d\n",i,sum);
}
示例:
代码意义?
voidmain()
{charc;
for(;(c=getchar())!
='\n';)
putchar(c);
}
3.4.4do…while语句框架
inti=1,sum=0;
voidmain()
{inti=1,sum=0;
do
{sum+=i;
i++;
}while(i<=100);
printf("%d,%d\n",i,sum);
}
各式各样的do…while循环:
voidmain()
{inti=1,sum=0;
do
sum+=i++;
while(i<=100);
printf("%d,%d\n",i,sum);
}
voidmain()
{inti=1,sum=0;
do
{sum+=i;
i++;
}while((sum+=i,i++)<100);
printf("%d,%d\n",i,summ);
}
3.4.5小结
功能上可相互替代。
选择依据:
对于某个问题,哪种形式更加逻辑清晰。
3.4.6转向语句
break
直接跳出循环体。
continue
立即终止本次循环,开始下次循环。
程序测试:
使用break实现1+2+……+100
voidmain()
{inti=1,sum=0;
for(;;)/*while
(1)*/
{sum+=i++;
if(i>100)break;
}
printf("%d,%d\n",i,sum);
}
程序测试:
使用break实现更多探索性的任务
voidmain()
{inti=1,sum=0;
for(;;)
{sum+=i++;
if(sum>1000)break;
}
printf("%d,%d\n",i,sum);
}
程序测试:
使用continue
voidmain()
{inti=1,sum=0;
for(;i<=100;i++)
{if(i%3==0)continue;
sum+=i;
}
printf("%d,%d\n",i,sum);
}
练习:
以下程序的输出是什么?
voidmain()
{inti,j,a=0;
for(i=0;i<2;i++)
{for(j=0;j<4;j++)
{if(j%2==1)
break;//continue;
a++;
}
a++;
}
printf("%d\n",a);
}
3.5程序设计举例
例1、字符分类统计。
从键盘输入的一组字符中,统计出大写字符的个数和小写字符的个数。
voidmain()
{intm=0,n=0;
charc;
while((c=getchar())!
='\n')
{if(c>='A'&&c<='Z')m++;
if(c>='a'&&c<='z')n++;
}
printf("%d,%d\n",m,n);
}
例2、分解整数。
计算一个整数的各位数字之和。
voidmain()
{intn,m=1;
scanf("%d",n);
while(n!
=0)
{m+=n%10;
n/=10;
}
printf("%d\n",m);
}
思考:
判断回文数。
例3、分解因子。
打印一个整数的所有因子。
voidmain()
{intnum,i;
scanf("%d",&num);
for(i=1;i<=num;i++)
if(num%i==0)
printf("%d,",i);
}
例4、判断素数。
判断一个整数是否是素数。
#include
voidmain()
{intnum,i,sqrt_num;
scanf("%d",&num);
sqrt_num=sqrt(num);
for(i=2;i<=sqrt_num;i++)
if(num%i==0)break;
if(i>sqrt_num)
printf("%disPrime\n",num);
else
printf("%disnotPrime\n",num);
}
思考:
打印100…200之间所有的素数。
例5、计算数列之和。
已知
,求π值?
voidmain()
{floatpi=0,tmp=1;
inti,s=1;
for(i=1;tmp>1e-6;i=i+2)
{tmp=1./i;
pi=pi+s*tmp;
s=-s;
}
pi=4*pi;
printf("pi=%f\n",pi);
}
例6、计算数列之和。
用迭代法
,迭代公式:
,迭代精度为
。
#include"math.h"
main()
{floata=5;
floatx1=a,x2;
while
(1)
{x2=(x1+a/x1)/2;
if(fabs(x1-x2)<1e-6)break;
x1=x2;
}
printf("x=%f\n",x2);
}
例7、计算、打印Fibonacci数列的前20项
1,1,2,3,5,8,13,21,……
voidmain()
{inta=1,b=1;
for(i=3;i<20;i++)
{c=a+b;
printf("%d,",c);
a=b;b=c;
}
}
例8、计算数列之和。
计算
前20项的和?
每一项由前二项决定=》变量a1,a2,b1,b2
voidmain()
{inti,a1,a2,b1,b2,tmp;
floatsum=0.0;
a1=2;a2=3;
b1=1;b2=2;
sum=sum+(float)a1/b1+(float)a2/b2;
for(i=1;i<=18;i++)
{tmp=a2;a2=a1+a2;a1=tmp;
tmp=b2;b2=b1+b2;b1=tmp;
sum=sum+(float)a2/b2;/*注意(float)*/
}
printf("%f\n",sum);
}
例9、求最大公约数
欧几里德的算法:
(a,b)=(b,a%b)
voidmain()
{inta,b,tmp;
a=177*13;b=177*15;
if(a
{tmp=a;a=b;b=tmp;}
while(a%b!
=0)
{a=a%b;
tmp=a;a=b;b=tmp;
}
printf("%d\n",b);
}
思考:
分数的计算。
3.6嵌套循环的程序举例
例2、求100~200间的所有素数
判断数i是否是素数:
内循环。
#include
voidmain()
{intnum,i,sqrt_num;
for(num=101;num<=200;num+=2)
{sqrt_num=sqrt(num);
for(i=2;i<=sqrt_num;i++)
if(num%i==0)break;
if(i>sqrt_num)
printf("%d,",num);
}
}
每行打印5个素数
voidmain()
{intnum,i,sqrt_num,n_line=0;
for(num=101;num<=200;num+=2)
{sqrt_num=sqrt(num);
for(i=2;i<=sqrt_num;i++)
if(num%i==0)break;
if(i>sqrt_num)
{printf("%d,",num);n_line++;
if(n_line%5==0)printf("\n");
}
}
}
例3、打印图形
*
***
*****
*******
*****
***
*
*
**
**
**
**
**
*
第i行:
空格数?
星号数?
voidmain()
{intline,i,j;
scanf("%d",&line);
for(i=1;i<=line+1;i++)
{for(j=1;j<=line-i+1;j++)printf("");
for(j=1;j<=2*i-1;j++)printf("*");
printf("\n");
}
for(i=line;i>=1;i--)
{for(j=1;j<=line-i+1;j++)printf("");
for(j=1;j<=2*i-1;j++)printf("*");
printf("\n");
}
}
例4、打印图形
**
******
**********
**************
*****************
*********************
空格数
星号数
空格数
星号数
第1行
5
1
10
1
第2行
4
3
8
3
...
...
...
...
...
第6行
0
11
0
11
第i行
6-i
2*i-1
2*(6-i)
2*i-1
N-i
2*i-1
2*(N-i)
2*i-1
#defineN6
main()
{inti,j;
for(i=1;i<=N;i++)
{for(j=1;j<=N-i;j++)printf("");
for(j=1;j<=2*i-1;j++)printf("*");
for(j=1;j<=2*(N-i);j++)printf("");
for(j=1;j<=2*i-1;j++)printf("*");
}
}
例5、计算数列之和。
计算
。
使用双层循环,内循环用于计算
voidmain()
{doublee=1,e1;
inti,j;
for(i=1;;i++)
{e1=1;
for(j=1;j<=i;j++)
e1=e1/j;
e+=e1;
if(fabs(e1)<1e-5)break;
}
printf("e=%f\n",e);
}
改进版本:
只用一层循环。
voidmain()
{doublee=1,e1;
inti,j;
e1=1;
for(i=1;;i++)
{e1=e1/i;
e+=e1;
if(fabs(e1)<1e-5)break;
}
printf("e=%f\n",e);
}
练习:
计算
。
3.7对程序结构的简化
例1、分支结构的简化
原结构
简化结构
if(A)
if(B)
if(C)e1;
else;
else;
else
if(B)
if(C)e2;
elsee3;
else;
if(B)
{if(A&&C)e1;
if(!
A&&C)e2;
if(!
A&&!
C)e3;
}
例2、循环结构的简化
原结构
简化结构
while(A)
{if(B)continue;
C;
}
while(A)
if(!
B)C;
例3、循环结构的简化
原结构
简化结构
do
{if(!
A)continue;
elseB;
C;
}while(A);
while(A);
{B;
C;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 32 基本语句与结构化程序设计 基本 语句 结构 程序设计