代码于二下学期程序设计实验周期间(2019.11.12~2019.11.21) 完成
如果有相同课题的朋友搜到这份源码,请先别复制源码,阅读以下信息:
本源码可在Dev-C++ 5.4.0 和Visual studio环境下运行,Visual C++ 6.0和Visual2010不支持头文件
如果想要在这两个环境下运行,请删去
#include
加上:
#include
#include
#include
#include
#include
此外,由于本题涉及到文件的输入和输出,请在.cpp源文件同目录下新建in.txt和out.txt
例如,我是在桌面→算法日常练习 目录下存放了.cpp、那么需要在同目录下新建in.txt、out.txt,在in.txt中存放一些数据,例如(如果你是菜鸟,请原样复制):
id:1 money:+2 date:20191101 name:vegtable type:out ps:no
id:2 money:+3 date:20191102 name:fruit type:out ps:2
id:3 money:+4 date:20191103 name:snack type:out ps:3
仍然不能运行可以加我qq:2287015934
个人账本管理系统
【课题内容和要求】
该系统要求实现一个简单、实用的个人帐本管理程序,主要功能包括帐务收支明细数据的录入、查找、修改、删除、统计、排序等。所有帐务数据都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。
1、 个人帐务数据由帐务明细条目构成,包括:序号,日期(年、月、日),收支项名称,收支类型(收入/支出),收支金额(正/负数表示收支),备注等。
2、 需要实现的功能
1) 新增帐务明细数据。
2) 查找帐务数据(可按序号、日期(年、月、日)、名称、金额等查找)。
3) 修改帐务明细条目(先查找,再修改。若查找出多个条目,则进一步提示用户选择条目的序号,再修改)。
4) 删除帐务明细条目(请参考上面修改的处理)。
5) 对帐务数据排序(可按日期、名称、金额等排序。要求排序后,记录的序号也要重新编排)。
6) 显示当前所有帐务数据列表。
7) 帐务统计(根据日期范围,可分别按年、月或日统计收、支、结余总金额,并显示)
8) 保存帐务数据到文件中、从文件中读入帐务数据。
3、 界面友好,输入信息符合逻辑。
#define _CRT_SECURE_NO_WARNINGS
#include
/*
#include
#include
#include
#include
#include
*/
using namespace std;
int cnt = 0, i, j, k, flag2, Myid, minj, moncmp1 = 0, moncmp2 = 0, vis;
int strcnt = 0, field;
char tmps[20];
int tmpi;
struct MyAccount
{
int money, dateint,flag_print;
char signal, date[20], name[20], type[20], ps[20];
} MyACC[1000], T; //定义一个结构体数组来存储账目表
void initialDateint()
{
for (i = 1; i <= cnt; i++)
{
int size = 1, di = 0;
for (j = 7; j >= 0; j--)
{
di += size * (MyACC[i].date[j] - 48);
size *= 10;
}
MyACC[i].dateint = di;
}
}
void Hand_Input();
void File_Input();
void input()
{
printf("手动输入账务请输1,文件读取账务请输2\n");
scanf("%d",&flag2);
if(flag2==1)
Hand_Input();
else if(flag2==2)
File_Input();
initialDateint();
}
void Hand_Input() //输入账目函数
{
int flag;
printf("您需要录入多少条账务记录?\n");
scanf("%d", &flag);
getchar();
while (flag--)
{
cnt++;
Myid = cnt;
printf("请按顺序输入以下内容:\n收支金额 交易日期 收支项名称 收支类型 备注信息\n");
scanf("%c", &MyACC[Myid].signal);
scanf("%d", &MyACC[Myid].money);
scanf("%s", MyACC[Myid].date);
scanf("%s", MyACC[Myid].name);
scanf("%s", MyACC[Myid].type);
scanf("%s", MyACC[Myid].ps);
getchar();
printf("第%d条录入完成!\n", cnt);
}
}
void File_Input()
{
FILE *fp;
if((fp=fopen("in.txt","r+"))==NULL)
{
printf("无法打开文件!请检查是否建立输入文件!\n");
exit(0);
}
else
{
cnt=1;
while(~fscanf(fp,"id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", &cnt, &MyACC[cnt].signal, &MyACC[cnt].money, MyACC[cnt].date, MyACC[cnt].name, MyACC[cnt].type, MyACC[cnt].ps))
{
cnt++;
}
cnt--;
printf("输入完成,共%d条账目",cnt);
}
}
void del() //删除账目函数
{
printf("请输入需要删除的记录ID:\n");
scanf("%d", &Myid);
//memset(&MyACC[Myid],0,sizeof(MyACC[Myid]));
MyACC[Myid].signal='+';
MyACC[Myid].money = 0;
MyACC[Myid].date[0] ='0';
MyACC[Myid].name[0] =0;
MyACC[Myid].type[0] =0;
MyACC[Myid].ps[0] =0;
printf("删除成功!\n\n");
}
void query()
{
printf("查询全部记录输入1,按字段查询输入2\n");
scanf("%d", &flag2);
if (flag2 == 1) //查询全部记录
{
printf("查询成功!\n\n");
for (i = 1; i <= cnt; i++)
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
}
else
{
printf("请输入查询所依据的字段\n1:序号\n2:日期\n3:名称\n4:金额\n");
scanf("%d", &flag2);
printf("请输入想查询字段的内容\n");
if (flag2 == 1)
{
scanf("%d", &tmpi);
printf("查询成功!\n\n");
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", tmpi, MyACC[tmpi].signal, MyACC[tmpi].signal, MyACC[tmpi].date, MyACC[tmpi].name, MyACC[tmpi].type, MyACC[tmpi].ps);
}
else if (flag2 == 2)
{
scanf("%s", tmps);
for (i = 1; i <= cnt; i++)
{
if (strcmp(MyACC[i].date, tmps) == 0)
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
}
}
else if (flag2 == 3)
{
scanf("%s", tmps);
for (i = 1; i <= cnt; i++)
{
if (strcmp(MyACC[i].name, tmps) == 0)
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
}
}
else if (flag2 == 4)
{
char tmp;
cin>>tmp;
cin>>tmpi;
for (i = 1; i <= cnt; i++)
{
if (tmp == MyACC[i].signal && tmpi == MyACC[i].money)
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
}
}
printf("查询完毕!\n");
}
}
void change()
{
printf("请输入需要修改的账目序号、账目信息类型、修改后的内容,格式如:\n25 2 20191111\n\n注意:账目信息类型中1代表收支金额,2代表交易日期,3代表收支项名称,4代表收支类型,5代表备注信息\n");
scanf("%d", &Myid);
scanf("%d", &field);
if (field == 1)
scanf("%c%d", MyACC[Myid].signal, MyACC[Myid].money);
else if (field == 2)
scanf("%s", MyACC[Myid].date);
else if (field == 3)
scanf("%s", MyACC[Myid].name);
else if (field == 4)
scanf("%s", MyACC[Myid].type);
else if (field == 5)
scanf("%s", MyACC[Myid].ps);
printf("修改成功!\n修改后该条账目为:\nid:%d money:%c%d date:%s name:%s type:%s ps:%s\n", Myid, MyACC[Myid].signal, MyACC[Myid].money, MyACC[Myid].date, MyACC[Myid].name, MyACC[Myid].type, MyACC[Myid].ps);
}
void UI();
void save()
{
FILE *fp;
if((fp=fopen("out.txt","a+"))==NULL)
{
printf("无法打开文件!请检查是否建立输出文件!\n");
exit(0);
}
else
{
for (i = 1; i <= cnt; i++)
fprintf(fp,"id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
printf("保存成功!");
}
fclose(fp);
// return;
}
bool cmp_money(MyAccount A, MyAccount B)
{
if (A.money > B.money)
return true;
else
return false;
}
void moneysort()
{
for (i = 1; i <= cnt - 1; i++)
{
for (j = 1; j <= cnt - 1; j++)
{
if (MyACC[j].signal == '-')
{
T = MyACC[j];
MyACC[j] = MyACC[j + 1];
MyACC[j + 1] = T;
}
}
}
for (i = 1; i <= cnt; i++)
if (MyACC[i].signal == '-')
{
vis = i;
break;
}
sort(MyACC+1,MyACC+vis,cmp_money);
sort(MyACC+vis,MyACC+cnt+1,cmp_money);
for (i = 1; i <= cnt; i++)
{
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
}
printf("已按金额递减排序完成!\n");
}
void data_report()
{
printf("请输入需要统计的日期区间,如:20190909 20190918\n");
int a, b;
scanf("%d%d",&a,&b);
printf("\n%d%d",a,b);
int sumplus = 0, summinus = 0, sum = 0;
for (j = 1; j <= cnt; j++)
{
if (MyACC[j].dateint >= a && MyACC[j].dateint <= b)
{
if (MyACC[j].signal == '+')
{
sum += MyACC[j].money;
sumplus += MyACC[j].money;
}
else
{
sum -= MyACC[j].money;
summinus += MyACC[j].money;
}
}
}
printf("账务统计完成!\n在此阶段,收入:%d元,支出:%d元,结余:%d元\n\n", sumplus, summinus, sum);
}
bool cmp_date(MyAccount A,MyAccount B)
{
if(A.dateint<B.dateint)
return true;
else
return false;
}
void datasort()
{
sort(MyACC+1,MyACC+1+cnt,cmp_date);
for (i = 1; i <= cnt; i++)
{
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
}
printf("根据日期排序完成!\n");
}
void name_sort()
{
for(int i=1;i<=cnt;i++)
MyACC[i].flag_print=0; //0表示没有被输出过
for(int i=1;i<=cnt;i++)
{
if(!MyACC[i].flag_print)
{
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", i, MyACC[i].signal, MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps);
MyACC[i].flag_print=1;
}
for(int j=i+1;j<=cnt;j++)
{
if(!strcmp(MyACC[i].name,MyACC[j].name)&&!MyACC[j].flag_print)
{
printf("id:%d money:%c%d date:%s name:%s type:%s ps:%s\n\n", j, MyACC[j].signal, MyACC[j].money, MyACC[j].date, MyACC[j].name, MyACC[j].type, MyACC[j].ps);
MyACC[j].flag_print=1;
}
}
}
}
void acc_sort()
{
printf("根据金额排序输入1,根据日期排序输入2,根据名称排序输入3\n");
scanf("%d",&flag2);
if(flag2==1)
moneysort();
else if(flag2==2)
datasort();
else if(flag2==3)
name_sort();
}
void UI()
{
cout<<endl<<endl;
cout<<"***************************************************************"<<endl;
cout<<"** 请输入以下选项编号进行下一步操作! **"<<endl;
cout<<"** 1.输入账目 **"<<endl;
cout<<"** 2.删除账目明细条目 **"<<endl;
cout<<"** 3.查询账目明细条目 **"<<endl;
cout<<"** 4.修改账目明细条目 **"<<endl;
cout<<"** 5.账务数据排序 **"<<endl;
cout<<"** 6.财务统计 **"<<endl;
cout<<"** 7.保存文件 **"<<endl;
cout<<"*****************0.退出系统************************************"<<endl;
}
int main()
{
cout<<"***********欢迎进入个人帐本管理系统****************************"<<endl;
system("color f0"); //可以写成 red 调出颜色组
system("date /T");
system("TIME /T");
UI();
while (scanf("%d", &flag2) != EOF)
{
if(flag2==1)
input();
else if (flag2 == 2) //删除账目
del();
else if (flag2 == 3)
query();
else if (flag2 == 4)
change();
else if (flag2 == 5)
acc_sort();
else if (flag2 == 6)
data_report();
else if (flag2 == 7)
save(); //没有返回到主调函数
else if (flag2 == 0)
exit(0);
UI();
}
return 0;
}