首页 理论教育 循环嵌套实例:C语言程序设计

循环嵌套实例:C语言程序设计

时间:2023-11-23 理论教育 版权反馈
【摘要】:嵌套循环时应使用缩进,保持良好的书写格式,提高程序可读性。穷举算法的一般模式有以下几点:列出可能搜索的范围,一般用循环或循环嵌套结构实现;探究、挖掘出问题解的约束条件;能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。

循环嵌套实例:C语言程序设计

【例4-11】编写程序,输出如下图形。

*

**

***

****

*****

程序分析

①要想实现上面图形,可以借鉴程序段(2)的方式:即用外层循环控制输出图形的行数,用内层循环控制每行星的个数;②内层循环的循环条件是变化的,可以看出:第一行i=1时,输出一颗星;第二行i=2时,内层循环被执行2次,输出两颗星;……第五行i=5时,内层循环被执行5次,输出五颗星;每次循环结束,输出一个换行符。

程序代码如下:

【例4-12】输出九九乘法表。

1*1=1

1*2=2 2*2=4

1*3=3 2*3=6 3*3=9

1*4=4 2*4=8 3*4=12 4*4=16

1*5=5 2*5=10 3*5=15 4*5=20 5*5=25

1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36

1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49

1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64

1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81       

程序分析

①图形中共有9行,定义变量i表示行数,使其从1递增到9;②每一行中的被乘数从1变化到和本行行号相同的数字,用变量j表示被乘数,让其从1递增到当前行号i;③用外层循环实现行的转换,内层循环输出一行中的内容,而内层循环的循环体是输出每行中的某一项。

程序代码:

【程序说明】

(1)循环嵌套的循环控制变量一般不应同名,以免造成混乱,不便于理解和控制。

(2)嵌套循环时应使用缩进,保持良好的书写格式,提高程序可读性。

【例4-13】公司实行的是计时工资制,按照实际工作的时间(小时)与每小时的报酬计算员工的所

得薪水,并统计出公司需要支付的总薪水。

程序分析

①根据功能描述,首先要知道公司的员工数量,以及每个员工的工作时间和每小时的报酬。由此计算出每个员工的薪水,最后求出公司需要支付的总薪水;②本程序需要的变量包括:存放员工数量的变量num、每个员工的工作时间h、每小时的报酬r、员工的薪水p,以及公司需要支付的总薪水pr。

程序代码:

程序运行结果如下:

请输入公司员工数:3

工作时间:50

每小时工作报酬:15

薪水是:750.000000

工作时间:10

每小时工作报酬:30

薪水是:300.000000

工作时间:22

每小时工作报酬:50

薪水是:1100.000000

所有员工薪水计算完毕!

公司支付总薪水是:¥2150.00

【例4-14】输入一个大于3的整数n,判定它是否为素数

程序分析

采用算法让n被i除(i的值从2变到n-1),如果n能被2~n-1之间的任何一个数整除,则表示n肯定不是素数,不必再继续被后面的素数整除,因此,可以提前结束循环。此时i的值肯定小于n。

程序代码如下:

从程序代码中可以看出,如果输入n=9、i=3时可以被3整除,此时会执行break语句,结束循环。那么如何判定n是否是素数?关键是看结束循环时i的值是否小于n,如果n能被2~n-1之间的一个整数整除,则必然是由break语句导致循环提前结束,也就是说i并未到达n时,循环就终止了。显然,此时i<n,如果n不能被2~n-1之间的数整除,则不会执行break语句,循环变量i的值一直变化到等于n,然后再判定循环条件i<=n-1,不符合条件,结束循环。如果是正常结束循环,其循环变量的值必然大于事先指定的循环变量终值,因此,当循环结束后,可以通过判定循环变量i的值,来判定是正常结束循环还是提前结束循环,如果是正常结束(i=n),则n为素数,否则说明是通过break语句提前结束循环,n不是素数。

而在实际应用过程中,其实n不必被2~n-1范围内的各整数去除,只需要将2~n/2之间的整数整除就可,甚至,只需要被2~ 之间的整数整除即可。例如,如果判断19为素数,则只需要将19被2,3,4进行整除,如果除不尽,则n必为素数,这样做可以减少循环的次数,提高执行效率。修改后程序可以改写如下:

对于以上题目,还可以进一步进行扩充,如要求解100~200之间的全部素数,有了以上的基础,如果求解某区间范围内素数的话,只需要对该区间范围内的数据一一判定即可,也就是用一个嵌套的for循环即可处理。参考代码如下:/

在以上代码中,由于100~200之间的数据,偶数不是素数,故只对该区间范围内的奇数做了判定。M的作用是累积到10的倍数,则输出换行,用来控制每行输出10个素数。

【例4-15】n元钱买n只鸡。

经典的百钱买百鸡问题是:公鸡五文钱一只,母鸡三文钱一只,鸡仔三只一文钱,用100文钱买100只鸡,公鸡、母鸡、鸡仔各买多少只?

现在,要求解的问题是:n元钱买n只鸡。给定一个正整数n,用n文钱买n只鸡,问公鸡、母鸡、鸡仔各买多少只?如果问题有解,输出所有的解,每个解占一行,每个整数用空格隔开;如果问题无解,则输出“No answer”。

程序分析

计算机解决这类问题的最经典的方法是采用枚举法,枚举法也称为“暴力求解法”,它一般是一时找不到解决问题的更好途径,即从数学上找不到求解的公式或者规则时,根据问题中的“约束条件”,将解得所有可能情况一一列举出来,然后再注意验证是否符合整个问题的求解要求,从而得到问题的所有解。穷举法的思路是,列举出所有可能的情况,逐个判断有哪些是符合问题所要求的条件,从而得到问题的解答。穷举算法的一般模式有以下几点:

(1)列出可能搜索的范围,一般用循环或循环嵌套结构实现;

(2)探究、挖掘出问题解的约束条件;

(3)能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。

在百钱买百鸡问题中用变量i枚举公鸡的个数,用变量j枚举母鸡的个数,则鸡仔的个数可以用100-i-j表示。如果i个公鸡、j个母鸡和k个鸡仔价格为n,则输出一组解。

假如设想x、y、z分别为鸡翁、鸡母、鸡雏的只数,以题意可得出联体方程组如下:

三个未知数,只有两个方程式,所以i、j、k可能有多组解,因此用穷举法检验所有可能情况:

再进一步:

i:0-20 (5元一只,最多买20只)。

j:0-33 (3元一只,100元最多买33只)。

k:k=100-i-j (k由i,j所决定)。(www.xing528.com)

最后把符合上述两方程的i,j,k判断打印出来。

如何判断无解的情况?这里需要使用一个标志变量answer。循环开始前将answer置为0,表示无解,在枚举过程中,如果遇到满足要求的组合,将answer置为1,循环结束后,如果answer为0,则表示无解。

代码如下:

在以上代码中,如果要判断公鸡、母鸡、鸡仔总价格是否为n,用表达式i*15+j*9+k==n*3,而不是i*5+j*3+k/3=n,主要是为了避免整除法或是小数运算。

综合实训

简单的计算器

用switch语句编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式进行计算:

操作数1 运算符op 操作数2

计算表达式的值,指定的算术运算符为加(+)、减(-)、乘(*)、除(/)。

如果要求连续做多次算术运算,每次运算结束后,程序都给出提示:

Do you want to continue(Y/N or y/n)?

用户输入Y或y时,程序继续进行其他算术运算;否则程序退出运行状态。编写程序实现。

项目小结

循环结构是程序设计中非常重要的内容,应该熟练掌握。通过本项目的学习,应该理解循环语句的内部执行机理,熟练掌握while语句、do-while语句以及for语句的使用,了解goto语句的使用方法,学会用continue、break语句控制程序流程。

本项目必须反复地做大量的练习才能掌握。

编程技巧:

所有循环类题目的视线要抓住三个要点:

(1)初始值的选择,进入循环前,起始值是什么?

方法:为循环变量赋初值,如sum=0,应该视具体情况而定。一般对于累加器常常设置为0,累乘器常常设置为1。

(2)确定循环条件——变问题为规律性的重复操作。考虑循环的条件是什么?重复到何时结束?

(3)确定循环体——找出反复执行的内容。

循环中重复做的工作,同时要保证使循环有趋于借宿的语句,循环的结束由循环控制表达式控制。例如,累加sum=sum+i;i=i+1;,累乘t=t*i;i=i+1;这些语句应该放在循环体的内部。

课后习题

一、单项选择题

1.语句while(!e);中的条件!e等价于(  )。

A.e==0 B.e!=1 C.e!=0 D.~e

2.下面有关for循环的正确描述是(  )。

A.for循环只能用于循环次数已经确定的情况

B.for循环是先执行循环体语句,后判定表达式

C.在for循环中,不能用break语句跳出循环体

D.for循环体语句中,可以包含多条语句,但要用花括号括起来

3.C语言中(  )。

A.不能使用do-while语句构成的循环

B.do-while语句构成的循环必须用break语句才能退出

C.do-while语句构成的循环,当while语句中的表达式值为非零时结束循环

D.do-while语句构成的循环,当while语句中的表达式值为零时结束循环

4.C语言中while和do-while循环的主要区别是(  )。

A.do-while的循环体至少无条件执行一次

B.while的循环控制条件比do-while的循环控制条件严格

C.do-while允许从外部转到循环体内

D.do-while的循环体不能是复合语句

5.以下程序段(  )。

A.是死循环B.循环执行二次C.循环执行一次D.有语法错误

6.下列语句段中不是死循环的是(  )。

A.i=100;

B.for(i=1;;i++)

C.k=0;

D.s=3379;

7.与以下程序段等价的是(  )。

8.以下程序的输出结果是(  )。

A.45 B.457810 C.69 D.678910

二、读程序,写结果

1.以下程序执行后的输出结果是_________。

2.以下程序执行后的输出结果是_________。

3.以下程序执行后的输出结果是_________。

4.以下程序的运行结果是________。

5.以下程序的运行结果是_________。

三、编程题

1.输出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身,例如,153是水仙花数,因为153=13+53+33。

2.求T=1!+2!+3!+4!+5!的值。

3.求s(n)=a+aa+aaa+…+aa…a之值,其中a是一个数字。

4.编写程序,输出100以内能被7整除的数。具体要求如下:①用for语句和continue语句实现。②定义一个变量t,为减少循环次数初值赋值为7即可,若对7取余数不等于0,则跳出当前循环进入下层循环,否则先输出当前数再进入下层循环,直到t>100为止。

5.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩下一个桃子。求第1天共摘多少个桃子。

6.两个乒乓球队进行比赛,各出三人,甲队为A、B、C三人,乙队为X、Y、Z三人。有人打听比赛对阵安排,A说他不和X比,C说他不和X、Z比,编写程序找出三对赛手名单。

7.猜数字游戏。编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈