Fibonacci数列的c语言模块化测试程序
来源:互联网 发布:独生子女 知乎 编辑:程序博客网 时间:2024/05/18 06:27
本程序是对我们c语言初学者理解递归算法和迭代法区别而编写的,他有以下优点
1,把二叉树,三叉树,尾归法编写的Fibonacci递归算法集成与一个程序,便于比较。
2,程序采用循环输入,可方便在各个模块,和多个数字输入之间随意切换。
3,由于采用模块化,也方便为c语言初学者提供一个模块化思维的引入。
运行截图如下(后有代码)(编译环境vs2013):
程序主界面,
模块一为二叉树递归算法和迭代法比较
模块二为三叉树递归算法和迭代法比较
模块三为尾归法递归算法和迭代法比较
数字4退出
主界面错误输入测试
次级模块界面,输入fiboncci位数开始测试
定义了越界值,非法输入时报错
程序可在次级界面选择继续输入数字测试,或者返回主界面,或者退出
程序代码如下(编译环境为vs2013)
#include<stdio.h> //预处理头文件
#include<time.h>
#include<stdlib.h>
//函数声明,后面介绍函数功能
void InitMenu();
void Select();
void SubSelect(chara);
long Fib_ite(intn);
long Fib_rec1(intn);
long Fib_rec2(intn);
long Fib_rec3(inta, int b, intn);
void Fib1();
void Fib2();
void Fib3();
int Transfrom(chara[]);
//主函数
int main()
{
InitMenu();
return0;
}
//初始化主界面函数
void InitMenu()
{
printf("**************************************************************\n");
printf("** 欢迎进入Fibonacci测试系统主界面,你可以做以下事情: **\n");
printf("** 1 选择此选项可以进行对Fibonacci中递归算法优化一进行选择 **\n");
printf("** 2 选择此选项可以进行对Fibonacci中递归算法优化二进行选择 **\n");
printf("** 3 选择此选项可以进行对Fibonacci中递归算法优化三进行选择 **\n");
printf("** 4 选择此选项可以退出 **\n");
printf("**************************************************************\n");
Select();
}
//主界面选择函数
void Select()
{
intn;
scanf_s("%d", &n); //数字录入
if(n<1 || n>4) //判断字符正确性
{
fflush(stdin); //对输入字母时产生的buffer越界进行清理,在输入错误时进行
printf("不可以输入其他字符,请继续选择!!!\n"); //输出错误信息
InitMenu(); //输入错误时,继续返回初始化函数输入
}
switch(n) //对录入数字进行选择
{
case1:system("cls"); //先清屏函数,再选择1,进入递归优化一方案
printf("******************************\n");
printf("*欢迎进入Fibonacci优化一模块 *\n");
printf("******************************\n");
printf("请输入要测试数字\n");
Fib1();
break;
case2:system("cls"); //选择2,进入递归优化二方案
printf("******************************\n");
printf("*欢迎进入Fibonacci优化二模块 *\n");
printf("******************************\n");
printf("请输入要测试数字\n");
Fib2();
break;
case3: //选择3,进入递归优化三方案
system("cls");
printf("******************************\n");
printf("*欢迎进入Fibonacci优化三模块 *\n");
printf("******************************\n");
printf("请输入要测试数字\n");
Fib3();
break;
case4:
exit(0); //选择4,退出。
break;
default:
printf("输入有误,请重新输入!!!!\n"); //当输入出错时,输出错误信息
Select(); //选择出错时,重新选择
break;
}
}
void Fib1() // 优化一函数
{
intm;
clock_t us1, us2;
chara[5];
scanf_s("%d", &m); //输入数字,进行计算
getchar(); //接收scanf留下的回车
if(m > 45)
{
printf("对不起,值已经越界,请重新输入,不要大于45!!!!\n");
Fib1();
}
new1: us1 =clock();
printf("递归优化一函数计算结果:%ld\n", Fib_rec1(m));
us2 =clock();
printf("递归优化一函数执行时间%ld毫秒\n", us2 - us1);
us1 =clock();
printf("非递归函数计算结果:%ld\n", Fib_ite(m));
us2 =clock();
printf("非递归函数执行时间%ld毫秒\n", us2 - us1);
printf("************************************\n");
printf("* 请选择以下项目: *\n");
printf("* a 返回主界面 *\n");
printf("* b 退出程序 *\n");
printf("* 或者继续键入数字进行计算 *\n");
printf("************************************\n");
gets_s(a); //继续接收字符串
m =Transfrom(a); //把处理字符函数处理字符的结果给
gotonew1; //跳转到排位置
}
void Fib2() //类似优化一
{
intm;
clock_t us1, us2;
chara[5];
scanf_s("%d", &m);
getchar();
{
printf("对不起,值已经越界,请重新输入,不要大于45!!!!\n");
Fib2();
}
new2: us1 =clock();
printf("递归优化二函数计算结果:%ld\n", Fib_rec2(m));
us2 =clock();
printf("递归优化二函数执行时间%ld毫秒\n", us2 - us1);
us1 =clock();
printf("非递归函数计算结果:%ld\n", Fib_ite(m));
us2 =clock();
printf("非递归函数执行时间%ld毫秒\n", us2 - us1);
printf("************************************\n");
printf("* 请选择以下项目: *\n");
printf("* a 返回主界面 *\n");
printf("* b 退出程序 *\n");
printf("* 或者继续键入数字进行计算 *\n");
printf("************************************\n");
gets_s(a);
m =Transfrom(a);
gotonew2;
}
void Fib3() //类似优化一
{
intm;
clock_t us1, us2;
chara[5];
scanf_s("%d", &m);
getchar();
{
printf("对不起,值已经越界,请重新输入,不要大于45!!!!\n");
Fib3();
}
new3: us1 =clock();
printf("递归优化三函数计算结果:%ld\n", Fib_rec3(1, 1, m));
us2 =clock();
printf("递归优化三函数执行时间%ld毫秒\n", us2 - us1);
us1 =clock();
printf("非递归函数计算结果:%ld\n", Fib_ite(m));
us2 =clock();
printf("非递归函数执行时间%ld毫秒\n", us2 - us1);
printf("************************************\n");
printf("* 请选择以下项目: *\n");
printf("* a 返回主界面 *\n");
printf("* b 退出程序 *\n");
printf("* 或者继续键入数字进行计算 *\n");
printf("************************************\n");
gets_s(a);
m =Transfrom(a);
gotonew3;
}
long Fib_rec1(intn) //递归优化一函数
{
if(n== 0 || n == 1)return1;
elsereturn(Fib_rec1(n- 1) + Fib_rec1(n - 2));
}
long Fib_rec2(intn) //递归优化二函数
{
if(n== 0 || n == 1)return1;
if(n== 2)return 2;
if(n== 3)return 3;
elsereturn(Fib_rec1(n- 2) + 2 * Fib_rec1(n - 3) + Fib_rec1(n- 4));
}
long Fib_rec3(inta,intb,intn) //递归优化三函数
{
if(n<= 1)return 1;
if(n== 2)return(a+ b);
elseFib_rec3(b, a+ b, n- 1);
}
long Fib_ite(intn) //非递归函数
{
longfib1 = 1, fib2 = 1, fib;
inti;
if(n== 0 || n == 1)return1;
else
{
for(i = 2; i <= n; i++)
{
fib= fib1 + fib2;
fib1= fib2;
fib2= fib;
}
returnfib;
}
}
//以下这个函数的意义是当第一次进入某个优化函数时,当把第一次的数字执行完毕时,让用户选择是输入字母选择相应项,还是继续输入数字继续运算
int Transfrom(chara[]) //处理上一个函数给出的字符串
{
charb[3];
if(a[0]>= 65 && a[0] <= 90 || a[0]>= 97 && a[0] <= 122)
//判断字符串首位是否字母,如果字母,进入次级选择函数
SubSelect(a[0]);
else
//数字的话,把数字字符串转化为数字常量,返回处理函数计算。
{
if(atoi(a) < 46)
return(atoi(a));
else
//假如用户的输入数字越界,返回错误信息并让其重新输入
{
printf("对不起,值已经越界,请重新输入,不要大于45!!!!\n");
gets_s(b);
Transfrom(b);
}
}
}
void SubSelect(chara)
//次级选择函数,当处理字符串为字母时,传值这里,进行选择,如果有误返回错误信息并跳回主界面
{
switch(a)
{
case'a':
case'A': system("cls");InitMenu(); break;
case'b':
case'B':exit(0); break;
default:
printf("输入有误,请重新输入一个值!!!!\n");
system("cls");
InitMenu();
break;
}
}
- Fibonacci数列的c语言模块化测试程序
- c语言Fibonacci数列
- C语言:求Fibonacci数列的前n项和
- c 语言的模块化
- 【C语言】fibonacci数列 的递归和非递归 +浅谈递归优劣
- 从fibonacci数列对比C语言和其对应的汇编代码
- C语言学习之 求Fibonacci数列前40项
- 学习C/C++语言:用数组处理Fibonacci数列
- c语言:用数组来处理求Fibonacci数列问题
- 蓝桥杯 入门训练 Fibonacci数列(c语言)
- 用C语言程序生成符合正态分布的随机数列
- k阶斐波那契数列的c语言程序
- Fibonacci数列的计算
- Fibonacci数列的实现
- fibonacci数列的变形
- Fibonacci数列的实现
- fibonacci数列的性质
- Fibonacci数列的奇偶性
- 解题报告 之 SGU242 Student's Morning
- smarty 调用php内置函数
- 【tcp-ip学习总结】一些常用的winsock API函数
- WIN7 Wireshark: There are no interfaces on which a capture can be done
- xshell和xmanger的注册码
- Fibonacci数列的c语言模块化测试程序
- 剑指offer 面试题4—替换字符串中空格
- listView隔行换色多选
- Git初识
- App适配iPhone 6/ Plus和iOS 8:10条小秘诀
- 高歌—【先声夺银】4.23午评:美元强势走高,等待加息到来。(附油)
- Web Service 简单的例子
- android支付平台调研
- openstack学习笔记 --- 用nova管理quatos