计算机程序设计员程序设计实例.docx
- 文档编号:6340488
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:10
- 大小:210.50KB
计算机程序设计员程序设计实例.docx
《计算机程序设计员程序设计实例.docx》由会员分享,可在线阅读,更多相关《计算机程序设计员程序设计实例.docx(10页珍藏版)》请在冰豆网上搜索。
计算机程序设计员程序设计实例
程序设计实例
本章介绍了循环程序设计方法,讲述了两种循环程序,三种循环语句。
包括前两章讲述的顺序程序结构、分支程序结构在内,这些控制结构内的语句部分都允许任意形式的语句。
这些控制结构之间可以互相嵌套,而且这种嵌套没有层次限制。
比如,if语句内可以包含循环语句,循环语句内又可以继续包含if语句,等等。
又比如,一个循环语句内可以含有循环语句,内层循环语句内还可以再包含循环语句,形成所谓的多重循环,等等。
【例4.12】编程序,输出如下序列的前50项。
该序列的第一项为0;第二项为1;以后的奇数项为其前两项之和;偶数项为其前两项之差。
解1:
该问题应该一项一项的生成,生成一项输出一项。
在生成一项时要考虑该项是偶数项还是奇数项;生成并输出一项后,为生成下一项做准备,应该把后边的项向前串。
得如下图4.30的PAD图。
程序如下。
#include"stdio.h"
voidmain(){
intu,v,w,k;
u=0;
v=1;
printf("%5d\n%5d\n",u,v);
k=3;
do{
if(k%2==0)
w=v-u;
else
w=v+u;
printf("%12d\n",w);
u=v;
v=w;
k=k+1;
}while(k<=50);
}
解2:
该问题生成一项时,可以不用分支判断,而采用标志单元的方法,这种方法在程序设计中是经常使用的。
用这种方法PAD图如图4.31。
程序如下。
#include"stdio.h"
voidmain(){
intu,v,w,k;
intflag;
u=0;
v=1;
printf("%5d\n%5d\n",u,v);
k=3;
flag=-1;
do}
w=v+flag*u;
flag=-flag;
printf("%5d\n",w);
u=v;
v=w;
k=k+1;
}while(k<=50);
}
【例4.13】编程序,输入两个正整数u、v,采用欧几里德辗转相除算法求它们的最大公因数并输出。
解:
欧几里德辗转相除算法求u、v最大公因数的计算过程是:
u%v→R1
v%R1→R2
R1%R2→R3
R2%R3→R4
…………
…………
Rn-1%Rn→Rn+1=0
到此余数Rn+1为"0",计算过程结束。
Rn为正整数u、v的最大公因数。
此计算过程用PAD描述成图4.32。
编出程序如下。
#include"stdio.h"
voidmain(){
intu,v,r;
printf("pleaceinputu、v:
");
scanf("%d%d",&u,%v);
r=v;
while(r!
=0){
r=u%v;
u=v;
v=r;
}
printf("gcd(u,v)=%5d\n"u);
}
【例4.14】编程序,输入正整数N,计算r1!
+r2!
+...+rn!
并输出。
其中,N=r1r2...rn。
解:
该程序是一个计算若干数据项之和的程序。
本章已经编写过多个求和的程序,现在总结一下求和程序模式。
所有计算和的程序都使用一个和单元,有类似图4.33的模式。
这里用后判断条件的循环,当然也可以采用先判断条件的循环。
其中:
S是和单元;
开始进入循环之前和单元S必须清"0";
在循环体内,每循环一次给和单元加上一项;
最后循环结束,和单元中的值即为所求之和。
具体落实到本题,求和算法如图4.34的PAD所示。
下边求精图4.32中的计算r!
。
阶乘是一个连乘积。
r!
=1*2*3*…*r
所有计算连乘积的程序都使用一个积单元,有类似图4.35的程序模式。
这里用后判断条件的
循环,当然也可以采用先判断条件的循环。
其中:
P是积单元;
开始进入循环之前积单元P必须置"1";
在循环体内,每循环一次向积单元乘入一项;
最后循环结束,积单元中的值即为所求之积。
具体落实到本问题计算r!
,得如图4.36的PAD。
综合图4.34和图4.36得图4.37的最终算法PAD。
程序如下:
#include"stdio.h"
voidmain(){
intN,S,P,u,r;
printf("pleaceinputN:
");
scanf("%d",&N);
S=0;
while(N!
=0){
r=N%10;
N=N/10;
P=1;
u=1;
while(u<=r){
P=P*u;
u=u+1;
}
S=S+P;
}
printf("r1!
+r2!
+...+rn!
=%5d\n"S);
}
【例4.15】我国古代有一道著名难题"百钱百鸡"问题:
"鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。
百钱买百鸡,问鸡翁、母、雏各几何。
"编程序,解该题。
解:
这是一个著名的问题,也是一类典型的问题。
设买x只公鸡,买y只母鸡,买z只鸡雏,根据条件可以列出方程如下:
5x+3y+z/3=100/*百钱*/
x+y+z=100/*百鸡*/
只能列出这两个方程,原题目变成求该方程组的整数解问题。
三个未知数,两个方程,这是一个不定方程组。
解该类问
题的思路是枚举x、y、z的所有可能,选出满足条件的哪些x、y、z组合。
按这种思想,得到PAD如图4.38。
程序如下:
#include"stdio.h"
intx,y,z;
voidmain(){
for(x=1;x<=20;x++)
for(y=1;y<=33;y++)
for(z=3;z<=99;z=z+3)
if(x+y+z==100&&5*x+3*y+z/3==100)
printf("result=%5d%5d%5d\n",x,y,z);
}
这是一个三重循环程序。
可以省掉最内层第三重循环,用x,y直接计算z。
程序如下:
#include"stdio.h"
intx,y,z;
voidmain(){
for(x=1;x<=20;x++)
for(y=1;y<=33;y++){
z=100-x-y;//求鸡雏数z,百鸡
if(5*x+3*y+z/3==100&&z%3==0)//百钱
printf("result=%5d%5d%5d\n",x,y,z);
}
}
【例4.16】编程序,用循环语句控制打印图4.39的字符图形。
解:
在本题目以下的分析中,以白方块"□"表示空格字符。
分析该图形一共11行,上下相对于第6行对称。
应该先打印上半部分第一到第六行,它们的规律是一样的;再打印下半部分第七到第十一行,它们的规律也是一样的。
得图4.40的PAD。
打印前六行,应该一行行的打印,用一个循环控制,得图4.41的PAD。
打印第x行,每行都分三段,应该一段段的打印,得图4.42的PAD。
打印第x行前段。
首先打印字母从x到'I',然后再打印字母从'A'到x-1。
每个字母的形式是:
一个空格,加字母本身。
得图4.43的PAD。
打印第x行中段。
分析这段特性,应该首先打印(5-(x-'A'))*2个空格;再打印2*(x-'A')+1组"□x";再打印(5-(x-'A'))*2个空格。
得图4.44的PAD。
在图4.44的PAD中,每个框都是一个循环,不再求精。
打印第x行后段。
首先打印字母从x+1到'I',然后再打印字母从'A'到x,最后换行。
每个字母的形式是:
一个空格,加字母本身。
得图4.45的PAD。
至此,找到了打印前六行的算法。
下边求精打印后五行。
打印后五行,也应该一行行的打印,用一个循环控制,得图4.46的PAD。
打印后五行的第x行与打印前六行的第x行的算法是一样的,可以完全使用上述算法。
至此,找到了打印图4.39字符图形的全部算法,综合上述图4.40到4.46得图4.47。
编出程序如下。
#include"stdio.h"
charx,y;
inti;
voidmain(){
for(x='A';x<='F';x++){//前六行
for(y=x;y<='I';y++)printf("□%c",y);//打印第x行前段
for(y='A';y for(i=1;i<=(5-(x-'A'))*2);i++)printf("□");//打印第x行中段 for(i=1;i<=2*(x-'A')+1;i++)printf("□%c",x); for(i=1;i<=(5-(x-'A'))*2);i++)printf("□"); for(y=x+1;y<='I';y++)printf("□%c",y);//打印第x行后段 for(y='A';y<=x;y++)printf("□%c",y); printf("\n");//回车换行 } for(x='E';x>='A';x--){//后五行 for(y=x;y<='I';y++)printf("□%c",y);//打印第x行前段 for(y='A';y<=x-1;y++)printf("□%c",y); for(i=1;i<=(5-(x-'A'))*2);i++)printf("□");//打印第x行中段 for(i=1;i<=2*(x-'A')+1;i++)printf("□%c",x); for(i=1;i<=(5-(x-'A'))*2);i++)printf("□"); for(y=x+1;y<='I';y++)printf("□%c",y);//打印第x行后段 for(y='A';y<=x;y++)printf("□%c",y); printf("\n");//回车换行 } } 在本例中,使用字符类型变量做循环控制变量,并且在字符类型数据上进行了若干算术运算,这是允许的。 前边第二章已经介绍过,在C中把字符类型作为整数类型看待,其整数值就是与字符相对应的代码值(ASCII码值)。 可施与整数类型上的一切运算都可在字符类型上进行。 事实上,在C中字符类型就是整数类型。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 程序设计员 程序设计 实例