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

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

*/

//FM.h文件
#ifndef LXN_H_INCLUDED
#define LXN_H_INCLUDED

typedef 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;
}

选择界面


添加信息


显示全部信息


查询信息

修改信息

删除信息


统计菜单


发布了63 篇原创文章 · 获赞 5 · 访问量 7750
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览