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(ab);

    elseFib_rec3(babn- 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;

    }

}


0 0
原创粉丝点击