大一下学期课程设计

一,文件相关操作

1,判断一个程序是否含有合法数量的main函数。

代码:

#include <stdio.h>
#include <stdlib.h>
/****************************************************
功能描述:求出由文件读出的字符中有多少'main()‘
输入参数:*s1-指向由文件中读取的字符串
           *s2-指向储存’main()‘的字符串
返回值:s1中'main()’的数量
其他说明:无
****************************************************/
int is_sub_sring(char *s1,char *s2)
{
    int main_num=0,judge;//judge起判断做用
    char *s3,*s4;
    while(*s1!='\0')
    {
        if(*s1==*s2)
        {
            judge=1;
            s3=s1;
            s4=s2;
            while(*s4!='\0')
            {
                if(*s3!=*s4)//如果相等之后又有不相等的出现,则使judge变为0,并退出
                {
                    judge=0;
                    break;
                }
                s3++;
                s4++;
                if(judge==0)
                    break;
            }
            if(judge==1)
            {
                main_num++;
                //break;
            }
        }
        s1++;
    }
    return main_num;//返回个数
}
/****************************************************
功能描述:读文件,并讲两个字符串传给is_sub_sring函数
           并最后判断结果
输入参数:无
返回值:无
其他说明:无
****************************************************/
int main()
{
    char str[80];//储存由函数读入的字符
    char inmain[7]="main()";//储存main()
    int num_main=0;//判断个数
    FILE *fpbe;
    if((fpbe=fopen("bereadfile.c","r"))==NULL)
    {
        printf("操作目标文件不存在!\n");
        exit(1);
    }
    while(!feof(fpbe))
    {
        fgets(str,80,fpbe);
        num_main+=is_sub_sring(str,inmain);
        if(num_main>1)//如果已经超1,可直接退出
            break;
    }
    fclose(fpbe);
    if(num_main==1)
        printf("right!");
    else if(num_main==0)
        printf("no main!");
    else
        printf("can not more main!");
    return 0;
}
2,将一个程序中 { 和 } 号单独一行

代码:

#include <stdio.h>
#include <stdlib.h>
/****************************************************
功能描述:读一个程序,将其中的'{'和'}'分别位于单独
           一行
函数变量:num_line-标记行数,以便输出
           prec-当前字符的前一个字符
           ch-当前字符
           str-存放由文件读入的字符串
返回值:无
其他说明:无
****************************************************/
int main()
{
    int num_line=1;
    char prec,ch;
    char str[80];
    FILE *fpbe,*fpget;
    if((fpbe=fopen("bereadfile.c","r"))==NULL)
    {
        printf("操作目标文件不存在!\n");
        exit(1);
    }
    if((fpget=fopen("getfile.c","w+"))==NULL)
    {
        printf("无法建立新文件!\n");
        exit(1);
    }
    while(!feof(fpbe))
    {
        ch=fgetc(fpbe);
        if((ch=='{'||ch=='}')&&prec!='\n')//如果当前字符是’{‘或’}‘,且前一个不是换行则输入一个换行
            fputc('\n',fpget);
        else if((prec=='{'||prec=='}')&&(ch!='\n'))//如果当前字符不是换行,且前一个是’{‘或’}‘,则输入一个换行
            fputc('\n',fpget);
        fputc(ch,fpget);
        prec=ch;
    }
    rewind(fpget);//将文件指针指向文件首以便输出
    fgets(str,80,fpget);
    while(!feof(fpget))
    {
        printf("%d %s",num_line,str);
        fgets(str,80,fpget);
        num_line++;
    }
    fclose(fpbe);
    fclose(fpget);
    return 0;
}

3,将一个程序第m到第n行加上//注释

代码:

#include <stdio.h>
#include <stdlib.h>
/****************************************************
功能描述:读一个程序,将输入的m行到n行加上//注释
函数变量:str-存放由文件读入的字符串
           m-输入的值
           n-输入的值
           vary-从1开始,若在m到m+n之间,则进行加注释
           num_line-输出时的行数
返回值:无
其他说明:无
****************************************************/
int main()
{
    int m,n,vary=1,num_line=1;
    char str[80];
    FILE *fpbe,*fpget;
    if((fpbe=fopen("bereadfile.c","r"))==NULL)
    {
        printf("操作目标文件不存在!\n");
        exit(1);
    }
    if((fpget=fopen("getfile.c","w+"))==NULL)
    {
        printf("无法建立新文件!\n");
        exit(1);
    }
    printf("请输入两个行数:");
    scanf("%d %d",&m,&n);
    fgets(str,80,fpbe);
    while(!feof(fpbe))
    {
        if(vary>=m&&vary<m+n-1)//如果vary在m到m+n之间,则加注释
        {
            fputc('/',fpget);
            fputc('/',fpget);
        }
        fputs(str,fpget);
        fgets(str,80,fpbe);
        vary++;
    }
    rewind(fpget);//将文件指针指向文件首以便输出
    fgets(str,80,fpget);
    while(!feof(fpget))
    {
        printf("%d %s",num_line,str);
        num_line++;
        fgets(str,80,fpget);
    }
    fclose(fpbe);
    fclose(fpget);
    return 0;
}

二,简单银行系统的实现。

代码:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define Maxnum 10000

typedef struct
{
    int account; //账号
    char name[20];   //用户名
    int password;  //密码
    double balance;  //账户余额
    int status;  //状态,挂失为0,正常为1,注销为2
} bank_data;

bank_data use_data[Maxnum];
int N;  //实际的用户数目

int manager();  //操作员进入系统
void readfile();  //将文件中数据存在结构体数组中
void work();//业务选择
int window();  //业务显示
void writefile();   //将数组中的数据存入文件中
void open(); //开户
void cancel();  //销户
void save();   //存款
void out();   //取款
void show(); //查询
void transfer();  //转账
void loss();  //挂失
void cLoss();  //解除挂失
int inputPassword();   //输入密码
void changePassword();   //更改密码
int search(int);  //根据账号找到用户数据对应的下标
/***************************************************
功能描述:主体控制
输入参数/变量解释:无
返回值:无
其他说明:无
****************************************************/
int main()
{
    printf("¥$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$¥\n\n");
    printf("¥                欢迎使用本银行系统                    ¥\n\n");
    printf("¥$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$¥\n");
    if (manager())
    {
        readfile();
        work();
        writefile();
    }
    return 0;
}
/****************************************************
功能描述:银行经理登录
输入参数/变量解释:realName-由文件中读出的业务员用户名
           realPassword-文件中保存的密码,这一版本中,
                        用字符保存密码
           inputName-业务员登录时输入的用户名
           inputPassword2-业务员登录时输入的密码
           ch-用于接受密码
           try_time-进入系统时尝试的次数
           result-要返回的结果:0-不正确 1-正确
           i-循环控制变量
返回值:密码正确,返回1;三次输入错误密码,返回0
其他说明:输入密码时利用getch函数(所在头文件:conio.h)
           和putchar函数实现*代替密码的输出
****************************************************/
int manager()
{
    char realName[20];   //由文件中读出的业务员用户名
    char realPassword[20];  //文件中保存的密码
    char inputName[20];   //业务员登录时输入的用户名
    char inputPassword2[20];  //业务员登录时输入的密码
    char ch;
    int try_time=3;   //进入系统时尝试的次数
    int result = 0;  //要返回的结果:0-不正确 1-正确
    int i;
    FILE *fp;  //用于文件操作
    //密码保存在文件中,先取出
    if ((fp=fopen("password.txt", "r"))==NULL)
    {
        printf("系统错误,请联系开发人员!");
        exit(1);
    }
    fscanf(fp, "%s %s", realName, realPassword);  //从文件中读业务员用户名和密码密码
    while(try_time!=0)
    {
        i=0;
        printf("请您输入经理用户名:");
        scanf("%s", inputName);
        printf("请输入密码:");
        while((ch=getch())!='\r')  //getch在接受输入后,不在屏幕上显示
        {
            inputPassword2[i]=ch;
            putchar('*');//接受任何字符,屏幕上只显示*
            i++;
        }
        inputPassword2[i]='\0';
        printf("\n");
        if(strcmp(realName,inputName)==0&&strcmp(realPassword,inputPassword2)==0)
        {
            result=1;
            break;
        }
        else
        {
            try_time--;
            if(try_time==0)    //尝试次数超过3次退出
                printf("你无权进入该系统!");
            else
                printf("你还有%d次机会!",try_time);
        }

    }
    fclose(fp);
    return result;
}
/****************************************************
功能描述:从文件中读取用户数据
输入参数/变量解释:i-循环控制变量
返回值:无
其他说明:N为全局变量,表示银行用户的总人数
****************************************************/
void readfile()
{
    int i=0;
    FILE *fp;
    if((fp=fopen("account.txt","r"))==NULL)     //文件打开失败。
    {
        printf("系统错误,请联系开发人员!");
        exit(1);
    }
    while(fscanf(fp,"%d %s %d %lf %d",&use_data[i].account, use_data[i].name, &use_data[i].password, &use_data[i].balance,&use_data[i].status ) != EOF)
        i++;
    N=i;  //N表示银行用户的总人数
    fclose(fp);
}
/****************************************************
功能描述:显示功能窗口
输入参数/变量解释:choise-数值表示不同的功能
返回值:choise
其他说明:无
****************************************************/
int window()
{
    int choise;
    while(1)
    {
        printf("|---------------------------------------------------|\n");//操作界面
        printf("| 1 开户  |  2 销户  |  3 存款  |  4 取款  |  5 查询|\n\n");
        printf("| 6 转账  |  7 挂失  |  8 解挂  |  9 改密  |  0 退出|\n");
        printf("|---------------------------------------------------|\n");
        printf("请输入操作指令:");
        scanf("%d",&choise);
        if(choise>9||choise<0)
            printf("指令错误,请重新输入!\n");
        else
            break;
    }
    return choise;
}
/****************************************************
功能描述:选择办理业务
输入参数/变量解释:choise-数值表示不同的功能
返回值:无
其他说明:无
****************************************************/
void work()
{
    int choise;//选择功能
    while (choise!=0)
    {
        choise = window();
        switch(choise)
        {
        case 1:
            open(); //开户
            break;
        case 2:
            cancel();  //注销
            break;
        case 3:
            save();  //存款
            break;
        case 4:
            out();   //取款
            break;
        case 5:
            show(); //查询
            break;
        case 6:
            transfer();  //转账
            break;
        case 7:
            loss();  //挂失
            break;
        case 8:
            cLoss();  //解除挂失
            break;
        case 9:
            changePassword(); //更改密码
            break;
        case 0:
            printf("欢迎您再来. \n");
            break;
        }
    }
}
/****************************************************
功能描述:将用户数据保存到文件中
输入参数/变量解释:i-循环控制变量
返回值:无
其他说明:无
****************************************************/
void writefile()
{
    int i=0;
    FILE *fp;
    if((fp=fopen("account.txt","w"))==NULL)
    {
        printf("系统错误,请联系开发人员!\n");
        exit(1);
    }
    while(i<N)
    {
        fprintf(fp,"%d %s %d %lf %d\n",use_data[i].account,use_data[i].name,use_data[i].password,use_data[i].balance,use_data[i].status );
        i++;
    }
    fclose(fp);
}
/****************************************************
功能描述:开户
输入参数/变量解释:input-第一次输入的密码
           reinput-第二次输入的密码
返回值:无
其他说明:内部调用输入密码函数
****************************************************/
void open()
{
    int input,reinput;
    if(N==Maxnum)//判断用户是否已到最大值
    {
        printf("用户已满,开户失败!\n");
        return;
    }
    printf("开户中!\n");
    use_data[N].account=10001+N;
    printf("这是您的账号: %d,请牢记!\n",use_data[N].account);
    printf("请输入户主姓名:");
    scanf("%s", use_data[N].name);
    while(1)
    {
        printf("请输入密码:");
        input=inputPassword();
        printf("请再次输入密码:");
        reinput=inputPassword();
        if(input==reinput)//比较两次输入的密码是否相等
        {
            use_data[N].password=input;
            use_data[N].status=1;
            printf("请输入存款金额:");
            scanf("%lf",&use_data[N].balance);
            N++;           //用户数加1,以便读入文件
            printf("开户成功!\n");
            break;
        }
        else
        {
            printf("两次密码不一致,请重新输入\n");
        }
    }
}
/****************************************************
功能描述:销户
输入参数/变量解释:becancel-表示被销户操作的账号
           beaccount-表示被销户操作的账号在
           结构体中的下标
           input-表示输入的密码
返回值:无
其他说明:无
****************************************************/
void cancel()
{
    int becancel,beaccount,input;//be***表示被**操作的账号,beaccount表示被**操作的账号在结构体中的下标,input表示输入的密码,以下操作函数类似。
    printf("请输入销户账号:");
    scanf("%d",&becancel);
    if(search(becancel)==-1)//查询用户,以确保用户存在
        printf("未找到该用户,销户失败!\n");
    else
    {
        beaccount=becancel-10001;
        printf("该用户为%d号,%s,请您输入密码完成销户:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)
        {
            if(use_data[beaccount].status==2)//判断状态
                printf("该用户已被注销,无法再次注销!\n");
            else
            {
                printf("你的账户中还有%lf元\n",use_data[beaccount].balance);
                printf("确认销户?(按1确认,按0取消)");
                if(getchar()==1)
                {
                    use_data[beaccount].balance='\0';
                    use_data[beaccount].status=2;//状态改为销户
                    printf("销户成功!\n");
                }
                else
                    printf("已取消销户!\n");
            }
        }
        else
            printf("密码错误,销户失败!\n");
    }
}
/****************************************************
功能描述:存款
输入参数/变量解释:besave-表示被存款操作的账号
           beaccount-表示被存款操作的账号在
           结构体中的下标
           inputm-表示存入的钱数
返回值:无
其他说明:无
****************************************************/
void save()
{
    int besave,beaccount,i=0;
    char str[80];
    double inputm;
    printf("请输入存款账号:");
    scanf("%d",&besave);
    if(search(besave)==-1)
        printf("未找到该用户,存款失败!\n");
    else
    {
        beaccount=besave-10001;
        printf("该用户为%d号,%s\n",use_data[beaccount].account,use_data[beaccount].name);
        if(use_data[beaccount].status==2||use_data[beaccount].status==0)
            printf("该用户已被注销或已挂失,无法存款!\n");
        else
        {
            printf("请输入存款金额:");
            if(scanf("%lf",&inputm)==1)
            {

                if(inputm<1000.00)
                {
                    use_data[beaccount].balance+=inputm;
                    printf("存款后,您的账户有%.2lf元\n",use_data[beaccount].balance);
                }
                else
                    printf("数值过大不予存款!\n");
                    fflush(stdin);
            }
            else
            {
                printf("存款须为数字!\n");
                fflush(stdin);
            }
        }
    }
}
/****************************************************
功能描述:取款
输入参数/变量解释:beout-表示被取款操作的账号
           beaccount-表示被取款操作的账号在
           结构体中的下标
           input-表示输入的密码
           inputm-表示取出的钱数
返回值:无
其他说明:无
****************************************************/
void out()
{
    int beout,beaccount,input;
    double inputm;
    printf("请输入取款账号:");
    scanf("%d",&beout);
    if(search(beout)==-1)
        printf("未找到该用户,存款失败!\n");
    else
    {
        beaccount=beout-10001;
        printf("该用户为%d号,%s,请您输入密码完成存款:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)
        {
            if(use_data[beaccount].status==2||use_data[beaccount].status==0)
                printf("该用户已被注销或已挂失,无法取款!\n");
            else
            {
                printf("请输入取款金额:");
                scanf("%lf",&inputm);
                if(inputm>use_data[beaccount].balance)//判断提款是否大于余额
                    printf("余额不足,取款失败!\n");
                else
                {
                    use_data[beaccount].balance-=inputm;
                    printf("取款后,您的账户有%.2lf元\n",use_data[beaccount].balance);
                }
            }
        }
        else
            printf("密码错误,存款失败!\n");
    }
}
/****************************************************
功能描述:查询
输入参数/变量解释:beshow-表示被查询操作的账号
           beaccount-表示被查询操作的账号在
           结构体中的下标
           input-表示输入的密码
返回值:无
其他说明:无
****************************************************/
void show()
{
    int beshow,beaccount,input;
    printf("请输入查询账号:");
    scanf("%d",&beshow);
    if(search(beshow)==-1)
        printf("未找到该用户,查询失败!\n");
    else
    {
        beaccount=beshow-10001;
        printf("该用户为%d号,%s,请您输入密码完成查询:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)
        {
            if(use_data[beaccount].status==2)//判断状态
                printf("该用户已被注销!\n");
            else if(use_data[beaccount].status==0)
                printf("该用户已被挂失!\n");
            else
                printf("该用户状态正常,余额为%.2lf\n",use_data[beaccount].balance);//显示余额
        }
        else
            printf("密码错误,存款失败!\n");
    }
}
/****************************************************
功能描述:查询
输入参数/变量解释:betran-表示转出操作的账号
           beaccount-表示转出操作的账号在
           结构体中的下标
           gettran-表示转入操作的账号
           getaccount-表示转入操作的账号在
           结构体中的下标
           input-表示输入的密码
           inputm-表示转账的钱数
返回值:无
其他说明:注意判断是否透支
****************************************************/
void transfer()
{
    int betran,gettran,beaccount,getaccount,input;//be**为转出,get**为转入
    double inputm;
    printf("请输入转出账号:");
    scanf("%d",&betran);
    if(search(betran)==-1)//第一个if,未找到用户
        printf("未找到该用户,转账失败!\n");
    else
    {
        beaccount=betran-10001;
        printf("该用户为%d号,%s,请您输入您的密码完成转账:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)//第二个if,密码正确
        {
            if(use_data[beaccount].status==2||use_data[beaccount].status==0)//第三个if,状态正常
                printf("该用户已被注销或已挂失,无法转账!\n");
            else
            {
                printf("请输入取款金额:");
                scanf("%lf",&inputm);
                if(inputm>use_data[beaccount].balance)//判断是否透支
                    printf("余额不足,取款失败!\n");
                else
                {
                    printf("请输入转入账号:");
                    scanf("%d",&gettran);
                    if(search(gettran)==-1)
                        printf("未找到该用户,转账失败!\n");
                    else
                    {
                        getaccount=gettran-10001;
                        if(use_data[getaccount].status==2||use_data[getaccount].status==0)
                            printf("该用户已被注销或已挂失,无法转账!\n");
                        else
                        {
                            use_data[beaccount].balance-=inputm;
                            use_data[getaccount].balance+=inputm;
                            printf("取款后,您还有%.2lf元,转入账号还有%.2lf元! \n",use_data[beaccount].balance,use_data[getaccount].balance);//显示各自余额
                        }
                    }
                }
            }
        }
        else
            printf("密码错误,转账失败!\n");
    }
}
/****************************************************
功能描述:挂失
输入参数/变量解释:beloss-表示被挂失操作的账号
           beaccount-表示被挂失操作的账号在
           结构体中的下标
           input-表示输入的密码
返回值:无
其他说明:无
****************************************************/
void loss()
{
    int beloss,beaccount,input;
    printf("请输入挂失账号:");
    scanf("%d",&beloss);
    if(search(beloss)==-1)
        printf("未找到该用户,挂失失败!\n");
    else
    {
        beaccount=beloss-10001;
        printf("该用户为%d号,%s,请您输入密码完成挂失:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)
        {
            if(use_data[beaccount].status==1)
            {
                use_data[beaccount].status=0;
                printf("挂失成功!\n");
            }
            else if(use_data[beaccount].status==0)
                printf("该账户已处于挂失状态,不能再次挂失!\n");
            else
                printf("该账户处于销户状态,挂失失败!\n");
        }
    }
}
/****************************************************
功能描述:解挂
输入参数/变量解释:becloss-表示被解挂操作的账号
           beaccount-表示被解挂操作的账号在
           结构体中的下标
           input-表示输入的密码
返回值:无
其他说明:无
****************************************************/
void cLoss()
{
    int becloss,beaccount,input;
    printf("请输入解挂账号:");
    scanf("%d",&becloss);
    if(search(becloss)==-1)
        printf("未找到该用户,解挂失败!\n");
    else
    {
        beaccount=becloss-10001;
        printf("该用户为%d号,%s,请您输入密码完成解挂:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)
        {
            if(use_data[beaccount].status==0)
            {
                use_data[beaccount].status=1;
                printf("解挂成功!\n");
            }
            else if(use_data[beaccount].status==1)
                printf("该账户处于正常状态,不能解挂!\n");
            else
                printf("该账户处于销户状态,解挂失败!\n");
        }
    }
}
/****************************************************
功能描述:进行密码输入
输入参数/变量解释:ch-输入的密码为字符型,以便隐藏
           judgePass-判断变量,可判断密码是否6位全为0
           i-循环控制
返回值:无
其他说明:解释同manager函数
****************************************************/
int inputPassword()
{
    char ch;//输入的密码为字符型,以便隐藏
    int judgePass=0;//判断变量,可判断密码是否6位全为0
    int i;
    while(1)
    {
        for(i=0; i<6; i++)
        {
            ch=getch();  //输入不显示
            putchar('*');   //输出“*”
            judgePass=judgePass*10+(ch-'0');//已为用户提供只带数字的小键盘,故忽略输入字母的情况
            if(judgePass==0)
                break;  //退出for循环后,再次接受
        }
        printf("\n");
        if(judgePass==0)  //若6位全为零,则重新输入
        {
            printf("密码要求不全为0!\n");
            printf("请重新输入密码: ");
        }
        else
            break;
    }
    return judgePass;
}
/****************************************************
功能描述:改密
输入参数/变量解释:bechange-表示被挂失操作的账号
           beaccoun-表示被挂失操作的账号在
           结构体中的下标
           input-表示输入的密码
           newpass1-修改后第一次的密码
           newpass2-修改后第二次的密码
返回值:无
其他说明:调用inputPassword函数
****************************************************/
void changePassword()
{
    int bechange,beaccount,input;
    int newpass1,newpass2;
    printf("请输入要更改密码的账号:");
    scanf("%d",&bechange);
    if(search(bechange)==-1)
        printf("未找到该用户,改密失败!\n");
    else
    {
        beaccount=bechange-10001;
        printf("该用户为%d号,%s,请您输入密码完成改密:",use_data[beaccount].account,use_data[beaccount].name);
        input=inputPassword();
        if(input==use_data[beaccount].password)
        {
            printf("请输入新密码:");
            newpass1=inputPassword();  //输入密码1
            printf("请确认密码:");
            newpass2=inputPassword();  //输入密码2
            if(newpass1==newpass2)
            {
                use_data[beaccount].password=newpass1;
                printf("修改成功!\n");
            }
            else
            {
                printf("两次输入不同,修改失败!\n");
            }
        }
        else
            printf("密码错误,改密失败!\n");
    }
}
/****************************************************
功能描述:查询用户
输入参数/变量解释:bework-表示被查询用户操作的账号
           index-若找到表示用户的下标,若没找到为-1
           low-二分查找中的小值
           high-二分查找中的大值
           mid-二分查找中的中间值
返回值:若找到,返回值在0~N-1间,否则,返回-1
其他说明:二分查找
****************************************************/
int search(int bework)
{
    int index=-1;
    int low=0, high=N-1, mid;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(use_data[mid].account==bework)
        {
            index=mid;
            break;   //若找到则退出
        }
        else if (use_data[mid].account>bework)
            high=mid-1;
        else
            low=mid+1;
    }
    return index; //若找到,返回值在0~N-1间,否则,返回-1
}

注:代码中文件解释,password文件中为:manager 123456,account文件中为:

10001 caoxinyu 123456 1498.000000 1
10002 machunpeng 123456 1010.000000 1
10003 jiarushan 123456 100.000000 1

三:利用递推,数组,递归构造斐波那契数列时间的差异

代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/****************************************************
功能描述:递推法求斐波那契数列以及运算时间
输入参数:start-测试时间的初值
           finish-测试时间的完成值
           fib1-数列的第一项
           fib2-数列的第二项
           fib-递推的中间变量
           i-循环控制变量
           n-欲求的数列的项数
返回值:无
其他说明:无
****************************************************/
void ditui(int n)
{
    clock_t start,finish;
    long long fib1=1,fib2=1,fib;
    int i;
    if(n<=0)
        printf("wrong!");
    else if(n==1)
        printf("1");
    else
    {
        printf("%10lld%10lld",fib1,fib2);//先将前两个输出
        start=clock();
        for(i=2; i<n; i++)
        {
            fib=fib1+fib2;//递推公式
            printf("%10lld",fib);
            //if(i==4)
                //printf("\n");
            //if((i-4)%5==0&&i>4)
                //printf("\n");
            fib1=fib2;//递推过程
            fib2=fib;
        }
        finish=clock();
        printf("The ditui time is %f ms\n",difftime(finish,start));
    }
}
/****************************************************
功能描述:递归算法
输入参数:n-欲求的数列的项数
返回值:递归结果
其他说明:无
****************************************************/
int Fib(int n)
{
    if(n==1||n==2)//前一二项为1 1
        return 1;
    else
        return (Fib(n-1)+Fib(n-2));
}
/****************************************************
功能描述:递归法求斐波那契数列以及运算时间
输入参数:start-测试时间的初值
           finish-测试时间的完成值
           fib-得到的斐波那契数列
           i-循环控制变量
           n-欲求的数列的项数
返回值:无
其他说明:无
****************************************************/
void digui(int n)
{
    clock_t start,finish;
    int i;
    long long fib;
    if(n<=0)
        printf("wrong!");
    else
    {
        start=clock();
        for(i=1; i<=n; i++)
        {
            fib=Fib(i);
            printf("%10lld",fib);
            //if(i%5==0)//5个换一行
                //printf("\n");
        }
        finish=clock();
        printf("The diugui time is %f ms\n",difftime(finish,start));
    }
}
/****************************************************
功能描述:数组法求斐波那契数列以及运算时间
输入参数:start-测试时间的初值
           finish-测试时间的完成值
           fib-存放得到的数列的数组
           i-循环控制变量
           n-欲求的数列的项数
返回值:无
其他说明:无
****************************************************/
void shuzu(int n)
{
    clock_t start,finish;
    long long fib[10000];
    int i;
    fib[0]=1;//赋初值1 1
    fib[1]=1;
    start=clock();
    for(i=2; i<n; i++)
    {
        fib[i]=fib[i-1]+fib[i-2];
    }
    finish=clock();
    for(i=0; i<n; i++)
    {
        printf("%10lld",fib[i]);
       // if((i+1)%5==0)//5个一换行
            //printf("\n");
    }
    printf("The shuzu time is %f ms\n",difftime(finish,start));
}

int main()
{
    int n;
    scanf("%d",&n);
    if(n>50)
        printf("数据过大");
    else
    {
        shuzu(n);
        ditui(n);
        digui(n);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值