C语言 模块化小程序

个人账簿管理系统
在本次的C语言程序设计中,我们可以很清晰的看到,c语言的模块程序化设计的特点,将账簿的七种相关的功能分别定义互不影响,通过主函数中switch函数进行选择与调用,简介方便,结构清楚,漂亮
 
  
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100

typedef struct
{
    int year;
    int month;
    int day;
    double earn;
    double pay;
    double balance;
    double basic;
    double amuse;
    double edu;
    double med;
}ACC;

void MenuDisplay(void);
void EditDisplay(void);// 
void load(ACC acc[],int *np);
void save(ACC acc[],int n);
int FindByDate(ACC acc[],int n);
void sort(ACC acc[],int n);
void SortByEarn(ACC acc[],int n);
void SortByPay(ACC acc[],int n);
void SortByBalance(ACC acc[],int n);
void SortByDate(ACC acc[],int n);
void InputRecord(ACC acc[],int i);
void find(ACC acc[],int n);
void del(ACC acc[],int *np);
void add(ACC acc[],int *np);
void edit(ACC acc[],int n);
void DeleteRecord(ACC acc[],int *np);
void output(ACC acc[],int n);
void PrintRecord(ACC acc);

int main()
{
    system("color 2E");
    ACC acc[N];
    int n;
    int select;
    load(acc,&n);
    while(1)
    {
        MenuDisplay();
        scanf("%d",&select);
        switch(select)
        {
            case 1:add(acc,&n);break;
            case 2:edit(acc,n);break;
            case 3:sort(acc,n);break;
            case 4:find(acc,n);break;
            case 5:del(acc,&n);break;
            case 6:output(acc,n);break;
            case 7:
                system("CLS");
                printf("\n                               感谢本次使用,再见!\n");
                return 0;
        }
    }
    return 0;
}

void MenuDisplay(void)
{
    system("CLS");
    printf("                          ☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
    printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用本账簿管理系统☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
    printf("                          ☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
    printf("                 说明:在本系统中欲执行某功能请输入相应数字!\n\n");
    printf("                                  **********\n");
    printf("                                  * 增添:1 *\n");
    printf("                                  * 修改:2 *\n");
    printf("                                  * 排序:3 *\n");
    printf("                                  * 查找:4 *\n");
    printf("                                  * 删除:5 *\n");
    printf("                                  * 输出:6 *\n");
    printf("                                  * 退出:7 *\n");
    printf("                                  **********\n\n");
    printf("                             请选择您要进行的操作:");
}

//将txt中记录复制到数组
void load(ACC acc[],int *np)
{
    FILE *fp;
    int i;
    if((fp=fopen("d:\\account","r"))==NULL)
    {
        *np=0;
        return;
    }
    for(i=0;fread(&acc[i],sizeof(ACC),1,fp)!=0;i++);
    *np=i;         //*np记录文件中当前学生数量
    fclose(fp);
}

//将数组中记录复制到磁盘
void save(ACC acc[],int n)
{
    FILE *fp;
    if((fp=fopen("d:\\account","w"))==NULL)
    {
        printf("打开文件失败!\n");
        exit(0);
    }
    fwrite(acc,n*sizeof(acc[0]),1,fp);
    fclose(fp);
}

//输出信息
void output(ACC acc[],int n)
{
    system("CLS");
    printf("所有账单信息如下:\n");
    int i;
    double money=0.0;
    double out=0.0;
    double in=0.0;
    double abasic=0.0;
    double aamuse=0.0;
    double aedu=0.0;
    double amed=0.0;
    printf("%8s%10s%10s%10s  %10s%9s%9s%10s\n","日期","收入","支出","储蓄","衣食住行","娱乐","教育","医疗");
    for(i=0;i<n;i++)
    {
        PrintRecord(acc[i]);
        out+=acc[i].pay;
        in+=acc[i].earn;
        money+=acc[i].balance;
        abasic+=acc[i].basic;
        aamuse+=acc[i].amuse;
        aedu+=acc[i].edu;
        amed+=acc[i].med;
    }
    printf("\n总收入: %.2f\n",in);
    printf("总支出: %.2f\n",out);
    printf("总储蓄: %.2f\n",money);
    printf("\n总支出占总收入的: %.1f%%\n",out/in*100);
    printf("衣食住行支出占总支出的: %.1f%%\n",abasic/out*100);
    printf("娱乐支出占总支出的: %.1f%%\n",aamuse/out*100);
    printf("教育支出占总支出的: %.1f%%\n",aedu/out*100);
    printf("医疗支出占总支出的: %.1f%%\n",amed/out*100);
    system("pause");
    return;
}

void PrintRecord(ACC acc)
{
    printf("%4d-%02d-%02d ",acc.year,acc.month,acc.day);
    printf("%9.1f%10.1f%10.1f",acc.earn,acc.pay,acc.balance);
    printf("%9.1f%10.1f%10.1f%10.1f\n",acc.basic,acc.amuse,acc.edu,acc.med);
    return;
}

//添加记录
void add(ACC acc[],int *np)
{
    system("CLS");
    char sel='y';
    while(sel=='y')
    {
        InputRecord(acc,(*np)++);
        printf("\n                               是否继续添加\n\n");
        printf("                               是:y    否:n\n");
        printf("                          请选择您要进行的操作:");
        scanf(" %c",&sel);
    }
    save(acc,*np);
    return;
}

void InputRecord(ACC acc[],int i)
{
    printf("\n                             请输入第%d天的账单记录\n",i+1);
    printf("请输入日期(格式:年  月  日):\n");
    scanf("%d%d%d",&acc[i].year,&acc[i].month,&acc[i].day);
    printf("请按顺序输入:收入、衣食住行支出、娱乐支出、教育支出、医疗支出\n");
    scanf("%lf%lf%lf%lf%lf",&acc[i].earn,&acc[i].basic,&acc[i].amuse,&acc[i].edu,&acc[i].med);
    acc[i].pay=acc[i].basic+acc[i].amuse+acc[i].edu+acc[i].med;
    acc[i].balance=acc[i].earn-acc[i].pay;
}

//修改记录
void edit(ACC acc[],int n)
{
    system("CLS");
    printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用账单修改功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
    int index;
    index=FindByDate(acc,n);
    if(index<0)
    {
        printf("该日期信息不存在!\n");
        system("pause");
        return;
    }
    printf("                             修改前的原记录如下:\n");
    printf("%8s%10s%10s%10s  %10s%9s%9s%10s\n","日期","收入","支出","储蓄","衣食住行","娱乐","教育","医疗");
    PrintRecord(acc[index]);
    while(1)
    {
        int select;
        EditDisplay();
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            printf("\n                                 请输入收入:");
            scanf("%lf",&acc[index].earn);
            acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
            acc[index].balance=acc[index].earn-acc[index].pay;
            save(acc,n);
            printf("\n                                    修改成功!\n");
            break;
        case 2:
            printf("\n                              请输入衣食住行支出:");
            scanf("%lf",&acc[index].basic);
            acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
            acc[index].balance=acc[index].earn-acc[index].pay;
            save(acc,n);
            printf("\n                                    修改成功!\n");
            break;
        case 3:
            printf("\n                                请输入娱乐支出:");
            scanf("%lf",&acc[index].amuse);
            acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
            acc[index].balance=acc[index].earn-acc[index].pay;
            save(acc,n);
            printf("\n                                    修改成功!\n");
            break;
        case 4:
            printf("\n                                请输入教育支出:");
            scanf("%lf",&acc[index].edu);
            acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
            acc[index].balance=acc[index].earn-acc[index].pay;
            save(acc,n);
            printf("\n                                    修改成功!\n");
            break;
        case 5:
            printf("\n                                请输入医疗支出:");
            scanf("%lf",&acc[index].med);
            acc[index].pay=acc[index].basic+acc[index].amuse+acc[index].edu+acc[index].med;
            acc[index].balance=acc[index].earn-acc[index].pay;
            save(acc,n);
            printf("\n                                    修改成功!\n");
            break;
        case 6:return;
        }
    }
}

void EditDisplay(void)
{
    printf("*******************************************************************************\n");
    printf("\n                          请输入数字来使用相应的功能!\n");
    printf("                          ***************************\n");
    printf("                          * 修改收入·······1 *\n");
    printf("                          * 修改衣食住行支出···2 *\n");
    printf("                          * 修改娱乐支出·····3 *\n");
    printf("                          * 修改教育支出·····4 *\n");
    printf("                          * 修改医疗支出·····5 *\n");
    printf("                          * 返回主菜单······6 *\n");
    printf("                          ***************************\n\n");
    printf("                             请选择您要进行的操作:");
}

void sort(ACC acc[],int n)
{

    while(1)
    {
        system("CLS");
        int i;
        printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用排序功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
        printf("                              *********************\n");
        printf("                              * 按总收入排序··1 *\n");
        printf("                              * 按总支出排序··2 *\n");
        printf("                              * 按总储蓄排序··3 *\n");
        printf("                              * 按日期排序···4 *\n");
        printf("                              * 返回主菜单···5 *\n");
        printf("                              *********************\n");
        printf("                              请选择您要进行的操作:");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            SortByEarn(acc,n);
            break;
        case 2:
            SortByPay(acc,n);
            break;
        case 3:
            SortByBalance(acc,n);
            break;
        case 4:
            SortByDate(acc,n);
            break;
        case 5:
            return;
        }
    }

}

//排序   收入     asc   desc
void SortByEarn(ACC acc[],int n)
{
    int i,j,k;
    ACC temp;
    while(1)
    {
        system("CLS");
        printf("按总收入排序\n");
        printf("升序排列:1\n");
        printf("降序排列:2\n");
        printf("返回上一级:3\n");
        printf("请选择您要进行的操作:");
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            for(i=0;i<n-1;i++)
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].earn>acc[j].earn)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                }
            output(acc,n);
            break;
        case 2:
            for(i=0;i<n-1;i++)
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].earn<acc[j].earn)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                }
            output(acc,n);
            break;
        case 3:
            return;
        }
    }
}

//排序   支出
void SortByPay(ACC acc[],int n)
{
    int i,j,k;
    ACC temp;
    while(1)
    {
        system("CLS");
        printf("按支出排序\n");
        printf("升序排列:1\n");
        printf("降序排列:2\n");
        printf("返回上一级:3\n");
        printf("请选择您要进行的操作:");
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            for(i=0;i<n-1;i++)
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].pay>acc[j].pay)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                }
            output(acc,n);
            break;
        case 2:
            for(i=0;i<n-1;i++)
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].pay<acc[j].pay)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                }
            output(acc,n);
            break;
        case 3:
            return;
        }
    }

}

//排序   储蓄
void SortByBalance(ACC acc[],int n)
{
    int i,j,k;
    ACC temp;
    while(1)
    {
        system("CLS");
        printf("按储蓄排序\n");
        printf("升序排列:1\n");
        printf("降序排列:2\n");
        printf("返回上一级:3\n");
        printf("请选择您要进行的操作:");
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            for(i=0;i<n-1;i++)
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].balance>acc[j].balance)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                }
            output(acc,n);
            break;
        case 2:
            for(i=0;i<n-1;i++)
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].balance<acc[j].balance)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                }
            output(acc,n);
            break;
        case 3:
            return;
        }
    }

}

void SortByDate(ACC acc[],int n)
{
    int i,j,k;
    ACC temp;
    while(1)
    {
        system("CLS");
        printf("按日期排序\n");
        printf("升序排列(从早到晚):1\n");
        printf("降序排列(从晚到早):2\n");
        printf("返回上一级:3\n");
        printf("请选择您要进行的操作:");
        scanf("%d",&k);
        switch(k)
        {
        case 1:
            for(i=0;i<n-1;i++)
            {
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].year>acc[j].year)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                    else if(acc[i].year==acc[j].year)
                    {
                        if(acc[i].month>acc[j].month)
                        {
                            temp=acc[i];
                            acc[i]=acc[j];
                            acc[j]=temp;
                        }
                        else if(acc[i].month==acc[j].month)
                        {
                            if(acc[i].day>acc[j].day)
                            {
                                temp=acc[i];
                                acc[i]=acc[j];
                                acc[j]=temp;
                            }
                        }
                    }
                }
            }
            output(acc,n);
            break;
        case 2:
            for(i=0;i<n-1;i++)
            {
                for(j=i+1;j<n;j++)
                {
                    if(acc[i].year<acc[j].year)
                    {
                        temp=acc[i];
                        acc[i]=acc[j];
                        acc[j]=temp;
                    }
                    else if(acc[i].year==acc[j].year)
                    {
                        if(acc[i].month<acc[j].month)
                        {
                            temp=acc[i];
                            acc[i]=acc[j];
                            acc[j]=temp;
                        }
                        else if(acc[i].month==acc[j].month)
                        {
                            if(acc[i].day<acc[j].day)
                            {
                                temp=acc[i];
                                acc[i]=acc[j];
                                acc[j]=temp;
                            }
                        }
                    }
                }
            }
            output(acc,n);
            break;
        case 3:
            return;
        }
    }

}

//查找
void find(ACC acc[],int n)
{
    system("CLS");
    int k;
    printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用账单查找功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
    k=FindByDate(acc,n);
    if(k>=0)
    {
        printf("\n所查找日期账单如下:\n");
        printf("%8s%10s%10s%10s  %10s%9s%9s%10s\n","日期","收入","支出","储蓄","衣食住行","娱乐","教育","医疗");
        PrintRecord(acc[k]);
        printf("\n支出占收入的: %.1f%%\n",acc[k].pay/acc[k].earn*100);
        printf("衣食住行支出占总支出的: %.1f%%\n",acc[k].basic/acc[k].pay*100);
        printf("娱乐支出占总支出的: %.1f%%\n",acc[k].amuse/acc[k].pay*100);
        printf("教育支出占总支出的: %.1f%%\n",acc[k].edu/acc[k].pay*100);
        printf("医疗支出占总支出的: %.1f%%\n",acc[k].med/acc[k].pay*100);
    }
    else
        printf("您所输入的日期不存在!\n");
    system("pause");
    return;
}

//根据日期查找
int FindByDate(ACC acc[],int n)
{
    int i;
    int year,month,day;
    printf("请输入日期:");
    scanf("%d%d%d",&year,&month,&day);
    for(i=0;i<n;i++)
    {
        if(year==acc[i].year&&month==acc[i].month&&day==acc[i].day)
            return i;
    }
    return -1;
}
//删除数据 
void DeleteRecord(ACC acc[],int *np)
{
    int i,index;
    index=FindByDate(acc,*np);
    if(index<0)
    {
        printf("您所输入的日期不存在!\n");
        system("pause");
        return;
    }
    for(i=index;i<*np-1;i++)
        acc[i]=acc[i+1];
    (*np)--;
    printf("\n删除成功!\n");
    save(acc,*np);
    system("pause");
    return;
}

//删除记录
void del(ACC acc[],int *np)
{
    while(1)
    {
        int i;
        system("CLS");
        printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用删除记录功能!☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n\n");
        printf("删除某天记录:1\n");
        printf("返回主菜单:2\n");
        printf("请选择您要进行的操作:");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            DeleteRecord(acc,np);
            break;
        case 2:
            return;
        }
    }
}




后续在做补充进行具体说明,,,,,

猜你喜欢

转载自blog.csdn.net/allaoe/article/details/80569030