现在将“找出完全平方数并输出”的功能仍放在main函数中(独立成为单独的函数也可以,但不必要了),而“每5个数据后换行”的功能,设计一个名称为format的函数,它每调用一次就输出一个空格作为两个完全平方数间的分隔,而每调用到第5次时,输出的是一个换行。这两个模块之间,需要有一个“现在是第几次调用”的信息需要传递,不可能用耦合程度最松散的非直接耦合.我们考虑数据耦合,用简单形式参数传值,得到方案2。
- //方案2:一个耦合度低,但不能完成功能要求的解决方案
- #include <stdio.h>
- void format(int);
- int main()
- {
- int m, num=0;
- for (m = 1; m * m <= 200; m++)
- {
- printf("%d", m * m);
- format(num);
- }
- return 0;
- }
- void format(int n)
- {
- n++;
- if (n%5==0)
- printf("\n");
- else
- printf(" ");
- return;
- }
在这个程序结构中,format与main函数的耦合程度为数据耦合。在main中定义了局部变量num,在一次都未输出时,置初值为0是合理的。在调用format时,将num传递来的表示第几次输出(第几个完全平方数)的形式参数n,n自增1,然后再控制输出空格或换行。
然而分析和运行程序发现,“每隔5个数据输出一个换行”的功能并未实现。因为形式参数n在函数format内的改变对应的实在参数num占不同的内存空间,n++修改的结果,对num无任何的影响,导致了在下一次调用时,丢失了“输出的是第几个”的重要信息。一个补救的方法,是由format将变化后的n值作为返回值,再传回给main函数,得到如下方案3的程序:
- //方案3:利用了返回值使耦合度增大,但功能得以实现的方案
- #include <stdio.h>
- int format(int);
- int main()
- {
- int m, num=0;
- for (m = 1; m * m <= 200; m++)
- {
- printf("%d", m * m);
- num = format(num);
- }
- return 0;
- }
- int format(int n)
- {
- n++;
- if (n%5==0)
- printf("\n");
- else
- printf(" ");
- return n;
- }
|