目的:探索如何设计函数来提高程序效率
利用素数的两个案例和物种写法来得出结论
第一案例:判断一个数字是否是素数
//时间:
// 判断一个数字是否是素数
// 只用一个函数实现,不好,代码利用率不高
#include<stdio.h>
int main(void)
{
int val = 29;
int i;
for (i = 2; i < val; ++i)
{
if (val % i == 0)
break;
}
if (i == val)
printf("%d", val);
else
printf("bushi");
return 0;
}
结论:这样写不好,因为代码全都记在一堆,首先复用性不高,主函数过于冗杂,导致易读性也下降
在学习软件工程时记得老师说过问题域在中的的复杂问难题通过模型被转化位简单的操作,其本质是利用了人类的分层分步解决复杂问题的思想,将复杂问题分层式简化问题复杂性的有效手段,这并不式简单的大事化小。
所以在程序的设计阶段,也出现了提高复用性易读性的方法
同一个问题,第二种解决方法:
//时间:
// 判断一个数字是否是素数
// 使用单独的函数来实现,代码的重用性提高
#include<stdio.h>
bool IsPrime(int val)
{
int i;
for (i = 2; i < val; ++i)
{
if (val % i == 0)
break;
}
if (i == val)
return true;
else
return false;
}
int main(void)
{
int val = 29;
int i;
if (IsPrime(val))
printf("%d", val);
else
printf("bush222");
//for (i = 2; i < val; ++i)
//{
// if (val % i == 0)
// break;
//}
//if (i == val)
// printf("%d", val);
//else
// printf("bushi");
return 0;
}
由这个函数可以看出,我们在使用自定函数之后满整个程序变得更加有层次感,主函数由原来的15行变成了现在的7行,提高了函数的易读性,并且我们的自定义函数只对数据进行处理,然后放回处理结果,并不对处理后的结果进行操作,这增加了代码的易读性。
可能,上面那个例子过于简单,不够清晰!
第二个例子:求一到某个数字之间(保罗该数字)所有的素数,并将其输出
第一种写法:
//时间:
// 功能:求一到某个数字之间(保罗该数字)所有的素数,并将其输出
//结论:只用一个函数(main函数)实现,有局限性:
// 1代码的复用性不高
// 2代码不容易理解
//
#include<stdio.h>
int main(void)
{
int val = 129;
int i;
int j;
for (j = 2; j <= val; ++j)
{
for (i = 2; i <= j; ++i)
{
if (j% i == 0)
break;
}
if (i == j)
printf("%d\n", j);
}
return 0;
}
结论:你不难发现,主函数复杂有不易理解,整个程序的复用性低
判断多个素数,第二种解决方法:
//时间:2
// 功能:求一到某个数字之间(保罗该数字)所有的素数,并将其输出
// 结论:用一个函数来判断一个数字是否为素数
//
#include<stdio.h>
bool IsPrime(int m)
{
int i;
for (i = 2; i <= m; ++i)
{
if (m % i == 0)
break;
}
if (i ==m)
return true;
else
return false;
}
int main(void)
{
int val = 129;
int i;
for (i = 2; i <= val; ++i)
{
if (IsPrime(i))
printf("%d\n", i);
}
return 0;
}
结论:
优点: 代码的可读性略有提高,主函数已经减少了很多了,更易理解
代码的复用性高
缺点: 复用性仍然不是非常高
比如求1000个数字,求他们每个数字从一到他们本身的素数
则
for (i = 2; i <= val; ++i)
{
if (IsPrime(i))
printf("%d\n", i);
}
要写一千次
所以,我们在原有的程序上再增加一点点细节:
//时间:
// 功能:用来给那个函数实现求一到某个数字之间(保罗该数字)所有的素数,并将其输出
// 结论:本程序和“两个函数 多个参数”相比较代码量更少,复用性更高
//:
#include<stdio.h>
bool IsPrime(int m); //前置声明
//本函数的功能是把1到n之间所有的素数在显示器上输出
void TraverseVal(int n)
{
int i;
for (i = 2; i <= n; ++i)
{
if (IsPrime(i))
printf("%d\n", i);
}
}
//本函数的功能:判断m是否为素数,是返回true,不是返回false
bool IsPrime(int m)
{
int i;
for (i = 2; i <= m; ++i)
{
if (m % i == 0)
break;
}
if (i == m)
return true;
else
return false;
}
int main(void)
{
int val = 129;
int i;
TraverseVal(val);
// for (i = 2; i <= val; ++i)
// {
// if (IsPrime(i))
// printf("%d\n", i);
// }
return 0;
}
结论:个人认为这个版本基本实现了高复用性和高易读性。
欢迎各位大佬评论斧正。