课程设计——家庭财务管理
来源:互联网 发布:centos 7 dracut 编辑:程序博客网 时间:2024/06/10 05:51
/*
Copyright (c++) 2017,烟台大学计算机与控制工程学院
文件名称:family
作 者:白苗苗
完成日期:2017年12月22日
版 本 号:12.11
问题描述:实现家庭财务收支,余额和时间的记录•查询•修改•显示•删除•保存•排序·统计等功能。
选择界面
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;}
选择界面
添加信息
显示全部信息
查询信息
修改信息
删除信息
统计菜单
阅读全文
0 0
- 课程设计——家庭财务管理
- 数据结构课程设计【家庭财务管理系统】
- 记账精灵——家庭财务管理系统
- 家庭财务管理小程序
- 家庭财务管理系统 绿色
- 家庭财务管理系统源代码
- 1009——财务管理
- 家庭财务管理设计与实现
- sdjzuoj——1009:财务管理
- 家庭财务管理系统实战7-终结,源码
- 新月集—家庭
- 财务管理
- 财务管理
- 数据结构——课程设计
- 课程设计—歌手大奖赛
- 课程设计—电子词典
- 奉上——手机版个人财务管理软件
- 软件工程课设——学生财务管理系统源码
- matplotlib.pylot绘图显示两次问题
- spring boot 学习(三)API注解记录及测试
- MySql按一个字段分组并且取另一个字段最大值的记录
- java8 Optional使用demo
- 程序员什么时候该考虑辞职?
- 课程设计——家庭财务管理
- Method Class.getMethod(String name, Class<?>... parameterTypes)
- 分布式消息队列RabbitMQ之二: exchange、route、queue关系
- 使用android studio 生成jar包
- Mysql--innoDB locking
- tensorflow 出现ImportError: cannot import name graph_util
- MySQL运行机制原理&架构
- 专业的数据恢复软件
- H盘提示拒绝访问,要怎么寻回资料