首页 理论教育 循环程序设计在C语言中的实例|C语言程序设计

循环程序设计在C语言中的实例|C语言程序设计

时间:2023-11-23 理论教育 版权反馈
【摘要】:程序分析根据题意,从前两个月的兔子数可以推出第三个月的兔子数,设第一个月的兔子数为f1=1,第2个月的兔子数为f2=1,则第三个月的兔子数f3=f1+f2=2。也就是说f1、f2分别表示要数列计算当前项的前两项,当前项用f3表示,则f3=f1+f2。此时f1代表的所求出的新项,继续执行f1+f2赋值给f2代表为其后面项。统计其中英文字母、数字字符和其他字符的个数。

循环程序设计在C语言中的实例|C语言程序设计

【例4-5】输入n个整数,输出其中的最大值。

如输入:5 10 6 80 9 15 1 12

输出:12

程序分析

求最大值和古代的“打擂台”有些相似,已知n个人打擂,最后得到胜出的选手,引导学生往古时候比武时常常采用的“打擂台”方法思考。打擂的过程可以描述为:首先确定一个擂主(讨论第一个擂主是如何确定的);然后挑战者上台;擂主和挑战者比较;挑战者胜的话,挑战者做擂主,否则擂主卫冕;重复使得每个挑战者上台,直到只剩最后一个挑战者。对于求n个数据的最大值,方法是类似的,可以首先假定第一个数是最大的,保留到变量max中,采用循环结构实现依次输入剩下的n-1个数据,将输入的数据和max中的数据相比较,如果比max大,则max中保存较大的数据,循环结束时,max中保存的是所有数据中的最大值。其求解步骤如下:

步骤一,读入n;

步骤二,读入第一个整数,存入max;

步骤三,以下操作重复n-1次

在求解最大值的过程中,最容易犯的错误是没有对max赋初值,这个错误比较隐蔽,如果刚好是一个很小的数据,对于某些输入,程序的运行结果是正常的,但程序则通不过比较严格的测试数据。另外一个常见的错误是当读入第一个数据初始化max后,又读入了n个数据,导致程序比较结果出错。

【例4-6】数列求和。

数列1:输入n,输出1+2+…+n;

数列2:输入n,共n项,输出1+1/2+1/3+1/4+1/5+…,结果保留两位小数。

数列3:输入n,共n项,输出1+1/3+1/5+1/7+1/9+…,结果保留两位小数。

数列4:输入n,共n项,输出1-1/3+1/5-1/9+1/9-…,结果保留两位小数。

对于数列1求和分析:

该问题和前面例4-1类似,只不过是输入n个数据,循环体循环n次累加求和;

其代码如下:

对于数列2,1+1/2+1/3+1/4+1/5+…求和分析:

可以看出,在数列1的基础上,需要进行如下改写:

累加的不再是整数,而是浮点数

循环依然是循环变量i从1增加到n,但累加到sum上的不再是i,而是1.0/i。所以sum变量应该定义为浮点数,其代码如下:

对于数列3,1+1/3+1/5+1/7+1/9+…求和分析:

可以看出,第n项的分母是2*n-1。因此可以将数列求和2中的代码修改为:(www.xing528.com)

还有另外一种方法,分母的变化是1、3、5、7,第n项的分母是2*n-1,故循环变量i的变化1、3、5…、2*n-1,每次递增2,循环体仍然是:sum=sum+1.0/i;

此外,还有第三种方法,用循环变量i控制项数,每次增加1,for(i=1;i<=n;i++);观察分母的规律:每次增加2。增加一个表示分母的变量deno,初始化为1,每次使用完,增加2,为下一项做准备。其代码实现如下:

在第三种方法中,相对前两种方法,对初学者而言不太喜欢,它隐含运用了递推的思想,由前一项递推出要累加的后一项。

对于数列4,1-1/3+1/5-1/7+1/9-…求和分析:

有了刚才数列3的第三种方法,可以采用递推的方法由前一项推导要累加的后一项,可以看出,后一项和前一项比,符号相反,分母加2,符号的变化也可以用一个变量flag来控制,使其在+1和-1之间变换,每次循环使得flag符号取反。具体代码实现如下:

【例4-7】求Fibonacci数列的前40个数。这个数列有如下的特点:第1、2两个数为1、1,从第3个数开始,该数是其前两个数之和。即:

这是一个有趣的古典数学问题,著名意大利数学家Fibonacci曾提出一个问题:有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?

可以推导出每个月兔子的总数依次为1、1、2、3、5、8、13…或者是Fibonacci数列。

程序分析

根据题意,从前两个月的兔子数可以推出第三个月的兔子数,设第一个月的兔子数为f1=1,第2个月的兔子数为f2=1,则第三个月的兔子数f3=f1+f2=2。当然可以在程序中继续写:f4=f2+f3,f5=f4+f3…但是这样的程序冗余度太大,所以应该利用循环来处理,这样要重复利用变量名,一个变量名在不同时间代表不同月的兔子数。在开始时,f1代表第1个月的兔子数,f2代表第2个月的兔子数,f3代表第3个月的兔子数f3=f2+f1,然后在求第4个月的兔子时需要的是第2个月和第3个月的兔子的数量,在此,没有必要继续使用f4、f5等变量名称,可以继续把f1作为“本月的前两个月”的兔子的数量,f2是“本月的前一个月”的兔子的数量,f3就是本月的兔子数,在求第4个月的兔子数量时,把f2(第2个月的兔子数量)赋值给f1,作为第4个月的“前两个月”的兔子的数量,把f3(原来第3个月的兔子的数量)赋值给f2,作为第4个月的“前一个月”的兔子数,以后以此类推。也就是说f1、f2分别表示要数列计算当前项的前两项,当前项用f3表示,则f3=f1+f2。改变前两项的值为f1、f2的值为f2、f3,重复执行。其代码如下:

以上程序可以进一步地改进,在循环体中求出后两项的数据,而且只用变量f1和f2就够了,不必用f3。这里有一个技巧,把f1+f2的结果不保存到f3中,而是放在f1中取代f3。此时f1代表的所求出的新项,继续执行f1+f2赋值给f2代表为其后面项。此时f1和f2中为新求得数列元素。其代码如下:

程序运行结果:

在代码中,if语句的作用是输出4个数以后换行。I为循环变量,当i为偶数的时候换行,由于每次循环要输出2个数据,因此当i为偶数时输出了4个数,然后再执行换行。

【例4-8】输入一行字符,以回车作为结束。统计其中英文字母、数字字符和其他字符的个数。

程序分析

本题要求统计英文字母、数字字符和其他字符的个数,需要对输入的每一个字符依次进行判定,判定过程中应该将字符分别和英文字母、数字字符的ASCII码值分别作比较,以确定所属的字符类型,采用循环结构进行实现,循环执行的条件是读入的不是回车,读入字符可以用ch=getchar()函数得到,在统计个数时,由于一共有三类字符,故需要定义3个变量分别统计,另外,无法事先确定循环次数,可以用一个特殊的数据如回车符作为正常输入数据的结束标志。其求解步骤如下:

步骤一,定义变量letter,digit,other,ch,并分别初始化;

步骤二,当读入不是回车时,一直执行以下循环体;

步骤三,输出letter,digit,和other得值;

程序代码如下:

在本例中,程序比较容易理解,关键在于对字符ASCII值范围的判断,注意一行字符以回车作为结束,该条件可以表示为“(ch=getchar())!=’\n’”,如果不输入回车,则程序会一直执行。

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

我要反馈