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