课程设计——家庭财务管理

来源:互联网 发布:centos 7 dracut 编辑:程序博客网 时间:2024/06/10 05:51
/*
Copyright (c++) 2017,烟台大学计算机与控制工程学院
文件名称:family
作 者:白苗苗
完成日期:2017年12月22日
版 本 号:12.11
问题描述:实现家庭财务收支,余额和时间的记录•查询•修改•显示•删除•保存•排序·统计等功能。

*/

//FM.h文件#ifndef LXN_H_INCLUDED#define LXN_H_INCLUDEDtypedef struct info{    char name[30];    //名字    int inmoney;    //收入    int outmoney;   //支出    int sum;    //余额    char time[30];   //时间    struct info * pNext;} Info, * Pinfo;//pinfo是指向结构体的指针,结构体变量可以作为参数传递给函数//函数的声明int menu_select ();          //菜单//Pinfo creat_list ();void info_list (Pinfo pHead);       //显示记录bool insert_list (Pinfo &pHead, int pos);//输入记录int length_list (Pinfo pHead);          //求有效节点的个数void sort_list (Pinfo pHead);           //通讯录进行排序void search_list (Pinfo pHead);         //查找void delete_list (Pinfo pHead, int pos);//删除节点void delete_name (Pinfo pHead);         //删除void save_list (Pinfo pHead);           //保存void alter (Pinfo pHead);              //修改bool alter_list (Pinfo pHead, int pos);  //修改的节点void sum_inmoney(Pinfo pHead);void sum_outmoney(Pinfo pHead);void sum_money(Pinfo pHead);void Tongji(Pinfo pHead);void tongji_menu();#endif // LXN_H_INCLUDED

//fm.cpp# include <stdio.h># include <string.h> //提供字符串处理的原函数# include <stdlib.h> //提供malloc,system,exit等函数# include "FM.h"/**********************************************功能描述:选择菜单*输入:选择的数字*返回:各个函数的界面**********************************************/int menu_select () //功能选择面板{    char s[20];    int num;    system ("color F0"); // C语言中调用dos函数颜色    printf ("**        *        ** ****** *      ****   ****      *         *     ******\n");    printf (" **      ***      **  *      *     *      *    *    * *       * *    *     \n");    printf ("  **    ** **    **   *****  *     *      *    *   *   *     *   *   ******\n");    printf ("   **  **   **  **    *      *     *      *    *  *     *   *     *  *     \n");    printf ("    ***      ***      *      *     *      *    * *       * *       * *     \n");    printf ("     *        *       ****** ****** ****   **** *        *         * ******\n");    printf ("\n\t                ☆★欢迎使用家庭财务管理系统☆★\n");    printf ("\n\t                ☆★选择你需要操作的功能:☆★★☆\n");    printf ("\t\t                 1.【输入记录】\n");    printf ("\t\t                 2.【显示记录】\n");    printf ("\t\t                 3.【查询信息】\n");    printf ("\t\t                 4.【删除记录】\n");    printf ("\t\t                 5.【修改】\n");    printf ("\t\t                 6.【统计】\n");    printf ("\t\t                 7.【保存】\n");    printf ("\t\t                 8.【退出】\n");    printf ("\n");    printf ("\t      ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★");    printf ("\t      ********************************************************\n\n");    do    {        printf ("\t         选择你需要操作的功能号码(1~8):");        gets (s);//读出输入的数字        num = atoi(s); //将s字符串转换成一个整数值, 要头文件stdlib.h    }    while (num < 1 || num > 8);    return num;//如果输入错误,则从重新输入}/**********************************************功能描述:增添成员*输入:增添的信息*返回:添加成功返回正确,否则返回错误**********************************************/bool insert_list (Pinfo &pHead, int pos)//pos是节点数{    int i = 0;    Pinfo p = pHead;    while (NULL != p && i < pos-1)    {        p = p->pNext;        ++i;    }    if (i > pos-1 || NULL == p)    return false;    //如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓    //分配新的结点    Pinfo pNew = (Pinfo)malloc(sizeof(Info));    if (NULL == pNew)// printf("动态分配内存失败!\n");    {        exit(-1);    }    p->inmoney=0;    p->outmoney=0;    p->sum=0;    system ("CLS");    printf ("\n\n***********************************************************\n");    printf ("\t\t你能在此目录下创建并添加成员信息");    printf ("\n***********************************************************\n");    printf ("请输入成员名:");    gets (pNew->name);    printf("请输入成员收入:");    scanf ("%d",&pNew->inmoney);    printf ("请输入成员支出:");    scanf ("%d",&pNew->outmoney);    pNew->sum=pNew->inmoney-pNew->outmoney;//余额的计算    printf ("请输入成员收支时间:");    scanf ("%s",pNew->time);    printf ("恭喜你!!成功添加了成员信息!!");    printf ("\n************************************************************\n");    printf ("\n\n");    //将新的结点存入p节点的后面    Pinfo q = p->pNext;    p->pNext = pNew;    pNew->pNext = q;    save_list (pHead);    return true;}/**********************************************功能描述:修改信息*输入:修改后的新信息*返回:修改成功返回正确,否则返回错误**********************************************/void alter (Pinfo pHead){    int i,pos;    int mark = 0;    int val;    int len = length_list (pHead); //记录容量的最大值    char name[30];    Pinfo p = pHead->pNext;    system ("CLS");    printf("输入你要修改的成员名:");    gets(name);    if (NULL != p)    {        for (i = 1; i <= len; ++i, p = p->pNext)        {            if (strcmp (name, p->name) == 0)            {                printf ("*************************以下是您要修改的用户信息******************\n");                printf ("num:%d\n", mark+1);                printf ("成员名:%s\n", p->name);                printf ("成员收入:%d\n", p->inmoney);                printf ("成员支出:%d\n", p->outmoney);                printf ("成员余额:%d\n", p->sum);                printf ("成员收支时间:%s\n", p->time);                printf ("*******************************************************\n");                pos = i;                ++mark;            }        }            if (1 == mark )//当没有重名时           {               printf ("\n\t\t是否确定修改?(y/n)");               if (getchar () =='y' || getchar () =='Y')              {                  delete_list (pHead, pos);                  alter_list (pHead, pos);                  printf ("恭喜你!!成功修改了成员信息!!");              }           }           else if (mark > 1)//当有重名的时候进行筛选        {            printf ("这里有%d个相同的用户!\n", mark);            printf ("您想修改第几个用户的记录!\n");            printf ("num:");            scanf ("%d", &val);            pos = pos - mark + val;            delete_list (pHead, pos); //删除节点            alter_list (pHead, pos);            printf ("\n\t\t修改成功!\n");            printf ("\n\t\t__________________________");            system ("pause"); // 在命令行上输出一行类似于“Press any key to exit”的字,等待用户按一个键,然后返回。        }                else                {                    printf (" ");                    getchar ();                    return;                }    }    else        {            printf ("对不起!!没有任何人的记录!!\n\n");            printf ("=============================================================\n");        }        return;}//修改时新建节点bool alter_list (Pinfo pHead, int pos){    int i = 0;    Pinfo p = pHead;    while (NULL != p && i < pos-1)    {        p = p->pNext;        ++i;    }    if (i > pos-1 || NULL == p)    return false;//如果程序能执行到这一行说明p已经指向了第pos-1个结点,但第pos-1个节点是否存在无所谓        //分配新的结点    Pinfo pNew = (Pinfo)malloc(sizeof(Info));    if (NULL == pNew)// printf("动态分配内存失败!\n");    {        exit(-1);    }    p->inmoney=0;    p->outmoney=0;    p->sum=0;    system ("CLS");    printf ("\n\n***********************************************************\n");    printf ("请输入新的成员名:");    scanf("%s",pNew->name);    printf("请输入新的成员收入:");    scanf ("%d",&pNew->inmoney);    printf ("请输入新的成员支出:");    scanf ("%d",&pNew->outmoney);    pNew->sum=pNew->inmoney-pNew->outmoney;    printf ("请输入新的成员收支时间:");    scanf ("%s",pNew->time);    printf ("\n************************************************************\n");    printf ("\n\n");    //将新的结点存入p节点的后面    Pinfo q = p->pNext;    p->pNext = pNew;    pNew->pNext = q;    save_list (pHead);    return true;}/**********************************************功能描述:显示全部信息*输出:成员的全部信息*返回:修改成功返回正确,否则返回错误**********************************************/void info_list (Pinfo pHead){    sort_list (pHead);    int len = length_list (pHead);    Pinfo p = pHead->pNext;    int i;    system ("CLS");//调用DOS命令CLS能够清屏    printf ("*************************************************************\n");    printf ("==================== → 用户信息记录表 ← ===================\n");    printf ("*************************************************************\n");    if (p != NULL)    {        for (i = 0; i < len; ++i, p = p->pNext)        {            printf ("成员名:%s\n", p->name);            printf ("成员收入:%d\n", p->inmoney);            printf ("成员支出:%d\n", p->outmoney);            printf ("成员余额:%d\n", p->sum);            printf ("成员收支时间:%s\n", p->time);            printf ("********************************************************\n");            if (i + 1 < len)            {                printf ("\n\t\t__________________________");                system ("pause"); // 在命令行上输出一行 请按任意键继续. . . 的字,等待用户按一个键,然后返回。            }        }    }    else    {        printf ("对不起!!没有任何人的记录!!\n\n");        printf ("=============================================================\n");    }    return;}//有效节点的长度int length_list (Pinfo pHead){    Pinfo p = pHead->pNext;    int len = 0;    while (NULL != p)    {        ++len;        p = p->pNext;    }    return len;//返回这个长度}/**********************************************功能描述:排序*输出:成员收入从小到大排序*返回:空**********************************************/void sort_list (Pinfo pHead){    int i, j;    int len = length_list (pHead);    char name[30];    char time[30];    int inmoney;    int outmoney;    Pinfo p, q;    //冒泡排序,收入由小到大    for (i = 0, p = pHead->pNext; i < len - 1; ++i, p = p->pNext)        for (j = i + 1, q = p->pNext; j < len; ++j, q = q->pNext)            if (p->inmoney>q->inmoney)            {    //交换姓名                strcpy (name, p->name);                strcpy (p->name, q->name);                strcpy (q->name, name);    //交换收入                inmoney= p->inmoney;                p->inmoney=q->inmoney;                q->inmoney=inmoney;    //交换收支时间                strcpy (time, p->time);                strcpy (p->time, q->time);                strcpy (q->time, time);    //交换支出                outmoney=p->outmoney;                p->outmoney=q->outmoney;                q->outmoney=outmoney;            }    return;}/**********************************************功能描述:显示全部信息*输入:成员的姓名*输出:成员的信息*返回:空**********************************************/void search_list (Pinfo pHead){    Pinfo p = pHead->pNext;    char name[30];    int len = length_list (pHead); //记录容量的最大值    int i;    int mark = 0;    int a = 0;    system ("CLS");    printf ("\n**************************************************************\n");    printf ("================ → 用户信息查询功能 ← ==================\n");    printf ("**************************************************************\n");    printf ("输入要查找的成员名:");    gets (name);    if (NULL != p)    {        for (i = a; i < len; ++i, p = p->pNext)        {            if (strcmp (name, p->name) == 0)            {                printf ("*************************以下是您查找的用户信息******************\n");                printf ("成员名:%s\n", p->name);                printf ("成员收入:%d\n", p->inmoney);                printf ("成员支出:%d\n", p->outmoney);                printf ("成员收支时间:%s\n", p->time);                printf ("********************************************************\n");                ++mark;                if (i + 1 < len)                {                    printf ("\n\t\t__________________________");                    system ("pause"); // 在命令行上输出一行类似于“Press any key to exit”的字,等待用户按一个键,然后返回。                }            }        }        if (0 == mark)        {            printf ("对不起!!没有此人的记录!!\n\n");            printf ("=============================================================\n");        }    }    else    {        printf ("对不起!!没有任何人的记录!!\n\n");        printf ("=============================================================\n");    }    return;}/**********************************************功能描述:删除信息*输出:要删除成员的信息,后删除节点*返回:空**********************************************/void delete_name (Pinfo pHead){    int i, pos;    int mark = 0;    int val;    int len = length_list (pHead); //记录容量的最大值    char name[30];    Pinfo p = pHead->pNext;    system ("CLS");    printf ("\n**************************************************************\n");    printf ("================ → 用户信息删除功能 ← ==================\n");    printf ("**************************************************************\n");    printf ("输入要删除的成员名:");    gets (name);    if (NULL != p)    {        for (i = 1; i <= len; ++i, p = p->pNext)        {            if (strcmp (name, p->name) == 0)            {                printf ("*************************以下是您要删除的用户信息******************\n");                printf ("num:%d\n", mark+1);                printf ("成员名:%s\n", p->name);                printf ("成员收入:%d\n", p->inmoney);                printf ("成员支出:%d\n", p->outmoney);                printf ("成员余额:%d\n", p->sum);                printf ("成员收支时间:%s\n", p->time);                printf ("********************************************************\n");                pos = i;                ++mark;            }        }        if (1 == mark )        {            printf ("\n\t\t是否确定删除?(y/n)");            if (getchar () =='y' || getchar () =='Y')            {                delete_list (pHead, pos); //删除节点                printf ("\n\t\t删除成功!\n");                printf ("\n\t\t__________________________");                system ("pause"); // 在命令行上输出一行类似于“Press any key to exit”的字,等待用户按一个键,然后返回。            }            else            {                printf (" ");                getchar ();                return;            }        }        else if (mark > 1)        {            printf ("这里有%d个相同的用户!\n", mark);            printf ("您想删除第几个用户的记录!\n");            printf ("num:");            scanf ("%d", &val);            pos = pos - mark + val;            delete_list (pHead, pos); //删除节点            printf ("\n\t\t删除成功!\n");            printf ("\n\t\t__________________________");            system ("pause"); // 在命令行上输出一行类似于“Press any key to exit”的字,等待用户按一个键,然后返回。        }        else        {            printf ("对不起!!没有此人的记录!!\n\n");            printf ("=============================================================\n");        }    }    else    {        printf ("对不起!!没有任何人的记录!!\n\n");        printf ("=============================================================\n");    }    return;}void delete_list (Pinfo pHead, int pos){    int i = 0;    Pinfo p = pHead;    if (NULL == p->pNext)    {        printf ("对不起!!没有任何人的记录!!\n\n");        printf ("=============================================================\n");        return;    }    while (NULL != p->pNext && i < pos - 1)    {        p = p->pNext;        ++i;    }//如果程序能执行到这一行说明p已经指向了第pos个结点,并且第pos个节点是存在的    Pinfo q = p->pNext; //q指向待删除的结点    p->pNext = p->pNext->pNext; //删除p节点后面的结点    free (q); //释放q所指向的节点所占的内存    q = NULL;    return;}/**********************************************功能描述:统计总收入*输出:总收入。*返回:空**********************************************/void sum_inmoney(Pinfo pHead){    int zhichu=0;    Pinfo p = pHead;//struct list *linshi;//linshi=zhichuhead;        if(p!=NULL){do{zhichu=p->inmoney+zhichu;p=p->pNext;}while(p!=NULL);printf("全家的总支出为:");printf("%d",zhichu);    system("PAUSE");}}/**********************************************功能描述:统计总支出*输出:总支出。*返回:空**********************************************/void sum_outmoney(Pinfo pHead){    int shouru =0;    Pinfo p = pHead;//struct list *linshi;//linshi=zhichuhead;        if(p!=NULL){do{shouru=p->outmoney+shouru;p=p->pNext;}while(p!=NULL);printf("全家的总收入为:");printf("%d",shouru);    system("PAUSE");}}/**********************************************功能描述:统计余额*输出:总余额。*返回:空**********************************************/void sum_money(Pinfo pHead){    int sum1 =0;    Pinfo p = pHead;//struct list *linshi;//linshi=zhichuhead;        if(p!=NULL){do{sum1=p->sum+sum1;p=p->pNext;}while(p!=NULL);printf("全家的总余额为:");printf("%d",sum1);    system("PAUSE");}}void Tongji(Pinfo pHead){while(1){tongji_menu();int choice;printf("                        请输入你的选择:");scanf("%d",&choice);    if(choice==0)    {    break;    }switch(choice){case 1: sum_inmoney(pHead);break;case 2: sum_outmoney(pHead);break;case 3: sum_money(pHead);break;    default: printf("输入错误");break;}    }}/**********************************************功能描述:统计菜单*输入:选择的数字*返回:统计函数的界面**********************************************/void tongji_menu(){    system("cls");    printf("\n");    printf("\n");    printf("\n");    printf("\n");    printf("************************************\n");    printf("\n");    printf ("**        *        ** ****** *      ****   ****      *         *     ******\n");    printf (" **      ***      **  *      *     *      *    *    * *       * *    *     \n");    printf ("  **    ** **    **   *****  *     *      *    *   *   *     *   *   ******\n");    printf ("   **  **   **  **    *      *     *      *    *  *     *   *     *  *     \n");    printf ("    ***      ***      *      *     *      *    * *       * *       * *     \n");    printf ("     *        *       ****** ****** ****   **** *        *         * ******\n");    printf ("\n\t                ☆★欢迎使用家庭财务管理系统☆★\n");    printf ("\n\t                ☆★选择你需要操作的功能:☆★★☆\n");    printf ("\t\t                 1.【总收入】\n");    printf ("\t\t                 2.【总支出】\n");    printf ("\t\t                 3.【总资金】\n");    printf ("\t\t                 0.【返回上一级】\n");    printf("\n");    printf("************************************\n");    printf(" \n");}void save_list (Pinfo pHead){    FILE * fp;    Pinfo p = pHead->pNext;    fp = fopen ("info.txt", "w");    fprintf (fp, "=============== → 用户信息记录表 ← =================\n");    while (NULL != p)    {        fprintf (fp, "====================================================\n");        fprintf (fp, "成员姓名:%s\n", p->name);        fprintf (fp, "成员收入:%d\n", p->inmoney);        fprintf (fp, "成员支出:%d\n", p->outmoney);        fprintf (fp, "成员余额:%d\n", p->sum);        fprintf (fp, "成员收支时间:%s\n", p->time);        p = p->pNext;    }    fprintf (fp, "*************************************************************\n");    fclose (fp);    printf ("\n\n恭喜你!!成功储存\n");    printf ("**************************************************************\n");    return;}

//main.cpp# include <stdio.h># include <string.h> //提供字符串处理的原函数# include <stdlib.h> //提供malloc,system,exit等函数# include "FM.h"int main (){    Pinfo pHead;    pHead = (Pinfo)malloc( sizeof(Info) );    system ("cls"); //调用DOS命令CLS能够清屏    while (1)    {        int i = 0;        switch (menu_select ())        {        case 1:            insert_list (pHead, ++i);    //输入记录            break;        case 2:            info_list (pHead);       //显示记录            break;        case 3:            search_list (pHead);         //查找            break;        case 4:            delete_name (pHead);         //删除            break;        case 5:            alter (pHead);   //修改            break;        case 6:            Tongji( pHead);            break;        case 7:            save_list (pHead);//保存            break;        case 8:            exit (0);                    //返回            break;        default:            printf ("请输入数字1到8:\n");        }        printf ("\t◇◆请按ENTER返回功能操作菜单◇◆\n");        getchar ();        system ("CLS");    }    return 0;}

选择界面


添加信息


显示全部信息


查询信息

修改信息

删除信息


统计菜单