个人账本管理系统源码(C++控制台实现)

代码于二下学期程序设计实验周期间(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

个人账本管理系统源码(C++控制台实现)_第1张图片
仍然不能运行可以加我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;
}

你可能感兴趣的:(C/C++)