当前课程知识点:C语言程序设计 > 第22讲 编程训练 > 编程训练 > 循环结构程序例子
这一讲包括了判断质数、计算𝝅的近似值、输出九九乘法表。
这一讲讲几个有代表性的循环结构程序的例子
我们前面也强调过
通过程序实例学编程是最好的方法
我们的目标是通过几个典型的循环结构程序例子
让大家掌握程序设计的基本技能
这些例子包含了以前学过的大多数知识
学习本讲也能巩固以前所学的知识
实际上你会发现虽然教材比较厚
但书中的程序大部分都是以前讲过的知识
比如输入 输出 顺序结构 选择结构等等
第一个例子判断质数
要求输入大于1正整数
判断该整数是否是质数
并输出结果
解题思路是这样的
根据质数的性质
让该数依次与从2到比它小的数相除
看能否整除
在实现的时候我们通过求余
结果为0来判断是否整除
如果有一个数能整除
就不是质数
否则就是质数
我们看一下完整的程序
这个程序开始定义了几个变量
x是需要输入的判断是否是质数的正整数
然后呢flag这个地方是一个标记
我们在后面程序中会看到它的作用
这个标记让他暂时设为1 初值设为1
这儿通过scanf读入x变量的值
这个地方做一个判断
如果x小于等于1
就认为是非法的
因为一个数只有当他大于等于0时
判断是否是质数才有意义
下面就讲下核心过程
通过一个for循环
就是让i从2一直增到小于x的这些数
就是让x对这个i求余
看是否等于0
求余等于0就是能整除
发生整除情况以后
我们让flag标志记为0
然后break就跳出这个循环
因为只要有一个数能发生整除
那么就已经能够判断出这个数不是质数
也就没有必要循环再向下做了
然后for循环出来以后
判断flag的值
如果flag等于1
那么就输出这个数是质数
else就不是质数
在这个地方我们可以看到
只有在发生整除时
flag能等于0
没有发生整除的时候
这个for一直是i
从2开始一直到小于x的那个值
就是从头到尾都不会进到if语句中去
那么flag的值就是最初设的值
这就表明x从来没有在这个地方被整除过
所以 在这种情况下x就是质数
否则就不是质数
我们来编译、运行一下这个程序
比如我们输入一个17
那么它输出17是质数
这个程序还有一个需要说的地方是
我们前面在PPT里面讲的在for语句中进行判断时x除以i
这个i是从2到小于x的值
但是实际上这样运算有一部分是多余的
也就是说 根据数学原理
这个地方i完全可以不用从2到小于x
那么你实际上只要让它小于等于sqrt(x)
就是x的平方根到这个地方这样就够了
这个具体的数学原理就不在这里讲了
这样的话 对很多尤其是大的数进行判断的话
循环次数就会减少很多遍
另外一个 在这个地方前面我们说if(flag = = 1)
如果flag=1
那么它是质数
这个地方你也可以写成这样
就直接不要这个等于1
直接写flag
它的涵义和刚才完全一样
这样就更简单一些
也是看他这个flag等于1
那么这个地方他就是质数
否则就不是
这样写更简洁
第二个例子是利用给出的公式计算Π的近似值
我们给出的公式是四分之Π=1- + - ...
一直往后
这个公式有很明显的特点
就是正负交替出现
而且分母部分从1 3 5 7隔两个值往上增长
那么他要求是在累加的时候就是这一项
最后一项的绝对值小于十的负四次方时为止
输出Π的值并统计累加次数
我们看程序
程序当中先定义了几个变量
变量的含义分别是这样的
其中n表示累加项的分母部分
初值设为1
就是这个
sign表示正负号
最开始是正
所以这个就是1
count是这个累加次数
最初是0
然后呢term的含义就是这个里面其中的某一项
三分之一、五分之一或七分之一这一项
sum是它的累加和
好明白了这几个变量的意思
我们看一下这个地方用一个循环while(term>=1e-4)时
term=1.0/n; n的值最开始是1
所以这个值最开始就是1
然后sum=sum+sign*term sign初值是1
所以这个地方加上term实际就是把1加进去
加进去了以后sign=-sign 那么sign变为-1
然后n=n+2 这时n的值就变成3
再count++ 因为已经把第一项加了
即累加了一次
然后回来以后
term=1.0/n
刚才n变成了3
所以 term就变成1/3
3/1这个sign+
刚才的sign变成-1
所以这儿相当于减去1/3
然后完了sign是-1
然后前面再负 负负得正
sign又变成正1
然后n加2以后就变成5
就是这个
n变成5 count++
刚才把这个第二项加了
所以count就变成2
然后回来以后
term就变成1/5
后面的过程就不再一一演示
整个就是这样一个过程
这个循环结束以后
因为这样循环算出来的sum是四分之Π
所以最终输出Π的值时
这个地方要乘以4
然后count就是循环加的次数
第三个例子是编程输出九九乘法表
乘法表有三种不同的形式
这个程序主要展示了双重循环的使用及输出格式控制
我们看一下这三种乘法表的格式特点
第一行1 2 3一直到9
然后第二行是一个杠 9个横杠
然后这个表示123到9 这是竖行
横行也是从1到9
然后里面就是对应的行和列相乘的值全部写在这里
第二种形式中前两行这个一样
后面这个地方呢乘法表构成了一个这样的一个三角形
就是把这个区域并不显示
然后第三种方式和这个方式不同的是
在这个区域不显示而在这个区域显示
还有一个需要注意的就是这几种情况下我们看到
这些地方对齐的时候都是左对齐
这儿也是
这儿也是
都是靠左对齐
好我们看下具体的程序
这个就是实现第一种表格
我们先运行一下
好 这个得到了正确的结果
我们对这个结果我们来分析一下
看在程序当中是怎么实现的
首先输出的第1行靠这样一个循环
i = 1 i <=9 依次输出i的值
注意控制符用-4d
那这是什么意思呢
这个输出占四位宽
但是靠左对齐
这儿1这个地方包括1占4位宽
但是靠左对齐
这就是-4d的含义
然后这个整个完了以后输出一个换行符
换到下一行
这儿再输出九个横杠
然后这再输出一个换行
然后再后面
就是使用双重循环来输出下面的这一部分
这个里面i用来控制他的行号
j 控制它的列号
然后通过这种方式就可以把乘法表输出
好我们把乘法表的第一种注释掉
演示乘法表的第二种
我们还是编译运行一下
这里显示的是乘法表的第二种情况
我们还是对着程序来看一下
因为前两行和第一种形式一样
所以这几条语句就不多讲了
后面的控制部分依然是用双重循环来实现
但它进行了判断当j > i时
然后就直接break 跳出循环不再往后
这些部分当列数大于行数时就跳出
就内层循环就不再往下做
这些地方就不显示
显示的部分就是列数小于等于行数的
我们把第二种实现也注释掉
我们看 这是第三种形式的输出
这个代码再解释一下
同样前两行和前面两种形式一样就不说了
后面这部分也是用双重循环控制
控制时 这个地方当列号小于行号时直接输出四个空格
就不再输出乘法表的值
其他情况下输出它行列相乘的结果
这个例子实际上很好的演示了双重循环以及格式控制
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-循环类型
-作业
-程序结构
-函数基础
-作业
-数组基础
-作业
-作业
-作业
-作业
-程序调试
- 文件(上)
- 编程训练

