家庭财务管理设计与实现
实现家庭的各种账单(水/电/煤气费,宽带/电话费等)的管理功能,可以对各类账单及用户信息进行登记、修改、删除等。
2、 程序的基本功能:
1. 增加、修改、删除一个用户资料。
2. 增加、修改、删除一种账单。
3. 按条件查询显示用户资料(条件有姓名等)。
4. 按条件显示各类账单信息(条件有帐单类型、用户名等)。
5. 查找指定金额范围的指定类型账单。
6. 能按月份和年份统计家庭各类帐单信息和总和。
源代码:
#include <iostream> #include <string.h> #include <iomanip> #include <time.h> #include <fstream> #include <cctype> #include <windows.h> using namespace std; class Time //创建时间类,用于后面继承 { public: void GetTime(int n,int m,int d) {year=n,month=m;day=d;} void CheckTime(); //查询输入的时间错误检查 private: int year,month,day; }TT; typedef class CFinance:public Time //定义一个Infor类型 ,继承时间类并增加姓名等... { public: CFinance(const char *_Name,const char *_CheckType) //因为是指针型数组用拷贝构造函数 { strcpy(Name,_Name); strcpy(CheckType,_CheckType); } int year,month,day; double Income,Output; char Name[10],CheckType[10]; //定义姓名 和 账单类型 CFinance *next; }Infor; void Time::CheckTime() //时间错误检查 { if(month>12 ||month<1) { MessageBox(NULL,"月份输入错误","错误!",MB_OK); //windows的函数,弹出错误窗口。 exit(0); } else { if(month==1||month==3 ||month==5||month==7||month==8||month==10||month==12) { if(day>31 || day<1) { MessageBox(NULL,"日期输入错误","错误!",MB_OK); exit(0); } } else { if(month==4||month==6 ||month==9||month==11) if(day<1||day>30) { MessageBox(NULL,"日期输入错误","错误!",MB_OK); exit(0); } } } if(month==2) if(day>29||day<1) { MessageBox(NULL,"日期输入错误","错误!",MB_OK); exit(0); } } int menu_select(); void SearchIncomeInfor(Infor *head); //查询的五个函数 void SearchOutputInfor(Infor *head); void SearchDateInfor(Infor *head); void SearchNameInfor(Infor *head); void SearchCheckTypeInfor(Infor *head); void CalculateMonthInfor(Infor *head); //统计的三个函数 void CalculateYearInfor (Infor *head); void CalculateDayInfor (Infor *head); void AlterNameInfor(Infor *head); //修改的两个函数 void AlterCheckTypeInfor(Infor *head); void DeleteNameInfor(Infor *head); //删除的两个函数 void DeleteCheckTypeInfor(Infor *head); Infor *Inforinitlist() //创建信息空链表 { Infor *head; head=(Infor*)malloc(sizeof(Infor)); head->next =NULL; return head; } int menu_select() //主菜单 { const char *m[8]={"1.录入详细财务信息","2.浏览全部财务信息","3.查询财务信息(按条件)","4.统计财务信息(按条件)","5.修改财务信息","6.删除财务系统","7.保存财务信息","8.退出财务系统"}; char *c; c=new char[50]; while(c[0]<'1'||c[0]>'8'||c[1]) { system("cls"); cout<<endl<<"---------家庭财务管理系统总菜单----------"<<endl; for(int i=0;i<8;i++) cout<<m[i]<<endl; cout<<"Choose:"<<endl; cin>>c; } return(c[0]-'0'); } void InputFinanceInfor(Infor *head) // 1、输入财务信息 { system("cls"); cout<<endl<<"------------输入财务信息------------"<<endl; Infor *p1,*p2,*p3; p3=head; if(NULL!=p3->next) { p3=p3->next; } p2=p3; char input; while(toupper(input)!='N') { p1=(Infor*)malloc(sizeof(Infor)); cout<<"年份[int]: "; cin>>p1->year; cout<<"月份[int]: "; cin>>p1->month; cout<<"日期[int]: "; cin>>p1->day; cout<<"用户姓名[char]: "; cin>>p1->Name; cout<<"账单类型(例:电费)[char]: "; cin>>p1->CheckType; cout<<"收入[double]: "; cin>>p1->Income; cout<<"支出[double]: "; cin>>p1->Output; p2->next=p1; p2=p1; cout<<endl<<"*********按 N 结束录入,按其它键继续输入:"; cin>>input; } p2->next=NULL; } void ListFinanceInfor(Infor *head) // 2、浏览财务信息 { Infor *p; p=head->next; if(p!=NULL) { system("cls"); cout<<endl<<"-----------浏览全部财务信息-----------"<<endl; while(p!=NULL) { cout<<"======================================"<<endl; cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"收入情况:"<<p->Income<<endl; cout<<"支出情况:"<<p->Output<<endl; cout<<"======================================"<<endl; p=p->next; } } else { cout<<endl<<"财务信息为空!"<<endl; } } void SearchMenu(Infor *head) // 3、查询总菜单 { Infor *p; p=head->next; int Ch; system("cls"); cout<<endl<<"-------------财务查询-------------"<<endl; cout<<"1.按支出查询"<<endl; cout<<"2.按收入查询"<<endl; cout<<"3.按日期查询"<<endl; cout<<"4.按用户姓名查询"<<endl; cout<<"5.按账单类型查询"<<endl; cout<<"6.返回上层"<<endl; cout<<"---------------------------------"<<endl; cout<<"Choose:"; cin>>Ch; switch (Ch) { case 1: SearchOutputInfor(p); break; case 2: SearchIncomeInfor(p); break; case 3: SearchDateInfor(p); break; case 4: SearchNameInfor(p); break; case 5: SearchCheckTypeInfor(p); break; case 6: return; default: break; } } void CalculateInfor(Infor *head) // 4、统计的总菜单 { Infor *p; p=head->next; int Ch; system("cls"); cout<<endl<<"-----------财务统计-----------"<<endl<<endl; cout<<"1.按年统计"<<endl; cout<<"2.按月统计"<<endl; cout<<"3.按日统计"<<endl; cout<<"4.返回上层"<<endl; cout<<"-------------------------------"<<endl<<endl; cout<<"Choose:"; cin>>Ch; switch (Ch) { case 1: CalculateYearInfor(p); break; case 2: CalculateMonthInfor(p); break; case 3: CalculateDayInfor(p); break; case 4: return; default: break; } } void AlterInfor(Infor *head) // 5、修改的总菜单 { system("cls"); int ch; Infor *p; p=head; cout<<endl<<"-------------修改财务信息-------------"<<endl; cout<<"1.按用户姓名修改"<<endl; cout<<"2.按账单类型修改"<<endl; cout<<"3.返回上层"<<endl; cout<<"-----------------------------------"<<endl; cout<<"Choose:"; cin>>ch; switch (ch) { case 1: AlterNameInfor(p); break; case 2: AlterCheckTypeInfor(p); break; case 3: return; default: break; } } void DeleteInfor(Infor *head) // 6、删除的总菜单 { system("cls"); int ch; Infor *p; p=head; cout<<endl<<"-------------删除财务信息-------------"<<endl; cout<<"1.按用户姓名删除"<<endl; cout<<"2.按账单类型删除"<<endl; cout<<"3.返回上层"<<endl; cout<<"-----------------------------------"<<endl; cout<<"Choose:"; cin>>ch; switch (ch) { case 1: DeleteNameInfor(p); break; case 2: DeleteCheckTypeInfor(p); break; case 3: return; default: break; } } void SaveToFile(Infor *head) //7、写入文件 { fstream FInfor("家庭财务管理.dat",ios::out | ios::binary); if(!FInfor) { cout<<"文件打开失败!"; } Infor *p; p=head->next; while(p!=NULL) { FInfor<<"\t年份:"<<p->year<<endl; FInfor<<"\t月份:"<<p->month<<endl; FInfor<<"\t日期:"<<p->day<<endl; FInfor<<"\t收入情况:"<<p->Income<<endl; FInfor<<"\t支出情况:"<<p->Output<<endl; FInfor<<"\t用户姓名:"<<p->Name<<endl; FInfor<<"\t账单类型:"<<p->CheckType<<endl; FInfor<<"\t\t\t\t\t\t"; p=p->next; } FInfor.close(); system("C:/WINDOWS/NOTEPAD 家庭财务管理.dat"); } void SearchOutputInfor(Infor *head) // 按支出查询 { Infor *p; p=head; system("cls"); cout<<endl<<"-------------按支出查询-------------"<<endl; while(p!=NULL) { if(0!=p->Output) { cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"收入情况:"<<p->Income<<endl; cout<<"支出情况:"<<p->Output<<endl; cout<<"-------------------------------"<<endl; } p=p->next; } } void SearchIncomeInfor(Infor *head) // 按收入查询 { Infor *p; p=head; system("cls"); cout<<endl<<"-----------按收入查询-----------"<<endl; while(p!=NULL) { if(0!=p->Output) { cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"收入情况:"<<p->Income<<endl; cout<<"支出情况:"<<p->Output<<endl; cout<<"---------------------------------"<<endl; } p=p->next; } } void SearchDateInfor(Infor *head) // 按日期查询 { int x,y,z; Infor *p; p=head; cout<<"请输入日期:"<<endl; cin>>x>>y>>z; TT.GetTime(x,y,z); TT.CheckTime(); system("cls"); cout<<endl<<"-----------按日期查询-----------"<<endl; while(x!=p->year||y!=p->month||z!=p->day) { if(p->next ==NULL) { cout<<"未找到记录!"<<endl; cout<<"---------------------------------"<<endl; break; } p=p->next; } cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"收入情况:"<<p->Income<<endl; cout<<"支出情况:"<<p->Output<<endl; cout<<"---------------------------------"<<endl; } void SearchNameInfor(Infor *head) // 按姓名查询 { int m; char a[20]={"\0"}; Infor *p; p=head; cout<<"请输入用户姓名:"<<endl; cin>>a; system("cls"); cout<<endl<<"-----------按用户姓名查询-----------"<<endl; while(p!=NULL) { if((m=strcmp(a,p->Name))==0) { cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"收入情况:"<<p->Income<<endl; cout<<"支出情况:"<<p->Output<<endl; cout<<"---------------------------------"<<endl; } p=p->next; } } void SearchCheckTypeInfor(Infor *head) // 按账单类型查询 { int m; char a[20]={"\0"}; Infor *p; p=head; cout<<"请输入账单类型:"<<endl; cin>>a; system("cls"); cout<<endl<<"-----------按账单类型查询-----------"<<endl; while(p!=NULL) { if((m=strcmp(a,p->CheckType))==0) { cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"收入情况:"<<p->Income<<endl; cout<<"支出情况:"<<p->Output<<endl; cout<<"---------------------------------"<<endl; } p=p->next; } } void CalculateYearInfor (Infor *head) //按年统计 { int x,outsum=0,insum=0; Infor *p; p=head; system("cls"); cout<<endl<<"-----------按年统计-----------"<<endl; cout<<"输入年份:"<<endl; cin>>x; while(p!=NULL) { if(x==p->year) { cout<<setw(8)<<"年:"<<p->year<<endl; cout<<setw(8)<<"月:"<<p->month<<endl; cout<<setw(8)<<"日:"<<p->day<<endl; cout<<setw(8)<<"支出:"<<p->Output<<endl; outsum=outsum+p->Output; cout<<setw(8)<<"收入:"<<p->Income<<endl; insum=insum+p->Income; cout<<"---------------------------------"<<endl; } p=p->next; } cout<<setw(8)<<"总收入:"<<insum<<endl; cout<<setw(8)<<"总支出:"<<outsum<<endl; } void CalculateMonthInfor(Infor *head) //按月统计 { int x,y,outsum=0,insum=0; Infor *p; p=head; system("cls"); cout<<endl<<"-----------按月统计-----------"<<endl; cout<<"输入年份、月份:"<<endl; cin>>x>>y; while(p!=NULL) { if(x==p->year&&y==p->month) { cout<<setw(8)<<"年:"<<p->year<<endl; cout<<setw(8)<<"月:"<<p->month<<endl; cout<<setw(8)<<"日:"<<p->day<<endl; cout<<setw(8)<<"支出:"<<p->Output<<endl; outsum=outsum+p->Output; cout<<setw(8)<<"收入:"<<p->Income<<endl; insum=insum+p->Income; cout<<"---------------------------------"<<endl; } p=p->next; } cout<<setw(8)<<"总收入:"<<insum<<endl; cout<<setw(8)<<"总支出:"<<outsum<<endl; } void CalculateDayInfor (Infor *head) //按日统计 { int x,y,z,outsum=0,insum=0; Infor *p; p=head; system("cls"); cout<<endl<<"-----------按日统计-----------"<<endl; cout<<"输入年份、月份、日期:"<<endl; cin>>x>>y>>z; while(p!=NULL) { if(x==p->year&&y==p->month&&z==p->day) { cout<<setw(8)<<"年:"<<p->year<<endl; cout<<setw(8)<<"月:"<<p->month<<endl; cout<<setw(8)<<"日:"<<p->day<<endl; cout<<setw(8)<<"支出:"<<p->Output<<endl; outsum=outsum+p->Output; cout<<setw(8)<<"收入:"<<p->Income<<endl; insum=insum+p->Income; cout<<"---------------------------------"<<endl; } p=p->next; } cout<<setw(8)<<"总收入:"<<insum<<endl; cout<<setw(8)<<"总支出:"<<outsum<<endl; } void AlterNameInfor(Infor *head) //按姓名修改 { int m; char a[20]={"\0"}; Infor *p; p=head; system("cls"); cout<<endl<<"-----------按用户姓名修改-----------"<<endl; cout<<"请输入需要修改账单的姓名:"<<endl; cin>>a; while(p!=NULL) { if((m=strcmp(a,p->Name))==0) { cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"用户姓名: "<<p->Name<<endl; cout<<"账单类型改为: "<<endl; cin>>p->CheckType; cout<<"收入情况改为:"<<endl; cin>>p->Income; cout<<"支出情况改为:"<<endl; cin>>p->Output; cout<<"---------------------------------"<<endl; } p=p->next; } } void AlterCheckTypeInfor(Infor *head) //按账单类型修改 { int m; char a[20]={"\0"}; Infor *p; p=head; system("cls"); cout<<endl<<"-----------按账单类型修改-----------"<<endl; cout<<"请输入需要修改账单的账单类型:"<<endl; cin>>a; while(p!=NULL) { if((m=strcmp(a,p->CheckType))==0) { cout<<p->year<<" 年"; cout<<p->month<<" 月"; cout<<p->day<<" 日"<<endl; cout<<"账单类型: "<<p->CheckType<<endl; cout<<"用户姓名改为: "<<endl; cin>>p->Name; cout<<"收入情况改为:"<<endl; cin>>p->Income; cout<<"支出情况改为:"<<endl; cin>>p->Output; cout<<"---------------------------------"<<endl; } p=p->next; } } void DeleteNameInfor(Infor *head) //按姓名删除 { int m; char a[20]={"\0"}; Infor *p,*q,*r; p=head; q=head; r=head; system("cls"); cout<<endl<<"-----------按用户姓名删除-----------"<<endl; cout<<"请输入需要删除账单的姓名:"<<endl; cin>>a; while(p!=NULL) { if((m=strcmp(a,p->Name))==0) { r=p->next; q->next=r; cout<<"用户姓名为 "<<p->Name; cout<<" 的用户资料已删除成功! "<<endl; cout<<"---------------------------------"<<endl; } q=p; p=p->next; } } void DeleteCheckTypeInfor(Infor *head) //按账单类型删除 { int m; char a[20]={"\0"}; Infor *p,*q,*r; p=head; q=head; r=head; system("cls"); cout<<endl<<"-----------按账单类型删除-----------"<<endl; cout<<"请输入需要删除账单的账单类型:"<<endl; cin>>a; while(p!=NULL) { if((m=strcmp(a,p->CheckType))==0) { r=p->next; q->next=r; cout<<"账单类型为 "<<p->CheckType; cout<<" 的资料已删除成功! "<<endl; cout<<"---------------------------------"<<endl; } q=p; p=p->next; } } int main() { Infor *X,*head=NULL; X=Inforinitlist(); int choose=0; while(choose!=8) { choose=menu_select(); //每次刷新主界面 switch(choose) { case 1: InputFinanceInfor(X); system("pause"); //该函数作用是保留屏幕,等待用户按任意键,然后返回 break; case 2: ListFinanceInfor(X);system("pause"); break; case 3: SearchMenu(X);system("pause"); break; case 4: CalculateInfor(X);system("pause"); break; case 5: AlterInfor(X);system("pause"); break; case 6: DeleteInfor(X);system("pause"); break; case 7: system("cls"); SaveToFile(X); break; case 8: exit(0); break; default: cout<<"输入错误!请重新输入:"<<endl; } } return 0; }