程序设计与算法技巧:
分支与循环语句的全部语法特点与使用方法,在前面的章节中都已经介绍完毕。在此基础之上,我们就将开始永无止境的程序设计与算法技巧研究了。例如:求100以内有哪几个整数是素数,或者打印乘法99阵列,打印19x19的菱形阵列等等。计算机程序设计能够解决成千上万的数学应用课题,举不胜举。
求一个整数是否为素数
素数 (prime number)又称质数,一个大于1的自然数除了1和它本身外不能被其他自然数整除,否则称为合数。例如:2、3、5、7、11等都是素数,而6可以由2乘3得到所以是合数,8可以由2乘4得到因此是合数,依次类推。
例4-19输入一个整数判断是不是素数 #include <stdio.h> int main() {//flag为0时代表是素数,为1代表合数 int n,flag = 0; int i = 2; printf("请输入一个大于1的数字:"); scanf("%d", &n); while (i < n) { if (n%i == 0) { flag = 1; break; } ++i; } if (flag == 0) printf("%d是素数!\n",n); else printf("%d不是素数!\n",n); } |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a) 观想输入一个整数之后程序的运行流程,猜测循环结束之后的打印结果是什么;
b)最好能在调试模式下单步执行,观察程序在循环体内反复执行以及程序中途退出或最终结束的过程;
判断中途退出的方法
在实际的应用程序开发时常常需要判断,循环过程是否是某个条件成立时中途退出的。有两种方法可以实现这个判断:
a)定义一个标志变量,例如:flag为1时代表中途退出的,0代表循环不是中途条件成立时退出的;
b)不定义标志变量,而是在循环之后对比递增变量达到目标总数,相等代表不是中途退出。
例4-20输入一个整数判断是不是素数 #include <stdio.h> int main() { int n,i=2; printf("请输入一个大于1的数字:"); scanf("%d", &n); while (i < n) { if (n%i == 0) break; ++i; } if (i == n) printf("%d是素数!\n",n); else printf("%d不是素数!\n",n); return 0; } |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)观想输入一个整数之后程序的运行流程,猜测循环结束之后的打印结果是什么;
b)最好能在调试模式下单步执行,观察程序在循环体内反复执行以及程序中途退出或最终结束的过程;
嵌套循环:(多层循环)
嵌套循环也叫多层循环,就是循环体内部还有一层循环。例如,要打印m行n列的矩形数据阵列,内层循环实现每行n列数据。再让这n列的数据打印执行m次,也就是外层循环是m行。
例4-21单行n列数据的打印 #include <stdio.h> int main() { int m,n,i=0; printf("请输入m和n的数值用于打印m行n列矩阵:"); scanf("%d%d",&m,&n); while(i<n) { printf("* "); ++i; } return 0; } |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)观想输入m和n两个整数之后程序的运行流程,猜测循环结束之后的打印结果是什么;
b)最好能在调试模式下单步执行,观察程序在循环体内反复执行以直到最终循环结束的过程;
结论:
先把内层循环做好之后再在外面加一层循环,这样就能比较容易地实现一个嵌套循环的程序设计。
注意:内层循环在每次开始之前,一定要重新初始化!
例4-22使用嵌套循环打印m行n列的阵列 #include <stdio.h> int main() { int m,n,i=0,j=0; printf("请输入m和n的数值用于打印m行n列矩阵:"); scanf("%d%d",&m,&n); while(j<m) { i=0; while(i<n) { printf("* "); ++i; } printf("\n"); ++j; } return 0; } |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)观想输入m和n两个整数之后程序的运行流程,猜测每次外层循环执行完之后打印的结果是什么;
b)最好能在调试模式下单步执行,观察每次内层循环结束打印的内容直到外层循环结束为止;
优化程序设计
如果一个程序要执行m次循环,可以使用i<m作为循环条件,循环的过程i从0开始逐渐递增。也可以采用m>0作为循环条件,循环的过程m自身逐渐递减,这样就可以比前面的方法省略一个变量i。
例4-23 优化循环程序设计 #include <stdio.h> int main() { int m,n,i=0; printf("请输入m和n的数值用于打印m行n列矩阵:"); scanf("%d%d",&m,&n); while(m) { i = 0; while(i<n) { printf("* "); ++i; } printf("\n"); --m; } return 0; } |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)观想输入m和n两个整数之后程序的运行流程,猜测每次外层循环执行完之后打印的结果是什么;
b)最好能在调试模式下单步执行,观察每次内层循环结束打印的内容直到外层循环结束为止;
乘法口诀表(三角形阵列)
九九乘法口诀表是一个三角形阵列,这需要在程序设计时考虑阵列的形态设计。每一行所输出列的数目与所在的行数是有关的。第1行只有1列,第2行有2列,依次类推……,第9行有9列。
//例4-24 阵列形态设计 #include <stdio.h> int main() { for(int i=1;i<=9;++i) { for(int j=1;j<=i;++j) printf("%dx%d=%d\t",i,j,i*j); printf("\n"); } return 0; } |
将以上代码输入到C语言编译器中进行编译、运行并查看打印结果:
a)观想每次外层循环执行过程中内层循环的运行流程,猜测每次外层循环执行完之后打印的结果是什么;
b)最好能在调试模式下单步执行,观察每次内层循环结束打印的内容直到外层循环结束为止;
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81