欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

工程实践:基于 C/C++ 的学生账户管理系统(个人分类账管理系统)

最编程 2024-05-25 08:07:41
...
#ifndef _PFOS_H_ #define _PFOS_H_ #include "PFOS.h" #include<algorithm> #include<cstring> #include<cstdlib> #include<cstdio> #include<iostream> using namespace std; int cnt = 0, //记录当前所有账目数量 key, //选择键 (菜单选项) Myid, //接收账目序号 (删除操作) minj, moncmp1 = 0, moncmp2 = 0, vis; int tmpi; //接收临时整型数 (查询操作) char tmps[20]; //接收临时字符串 (查询操作) int strcnt = 0; //字符串长度计数 struct MyAccount { int money, //金额 dateint, //整型日期 flag_print, // id; //序号 char date[20], //日期 name[20], //名称 type[20], //类型 ps[20]; //备注 } MyACC[1000], T; //定义一个结构体数组MyACC[1000]来存储账目表,一个结构体变量T来暂时账目数据 struct USER { char ID[18]; char PW[20]; }user[20]; int num = 0; //账务明细条目 int num_0=0; int User=0;//对应用户 void initialDateint(); void UI(); //主菜单UI void input(); //输入相关函数 void Hand_Input(); void File_Input(); void Auto_File_Input(); void del(); //删除 void place(); //整理 void query(); //查询相关 int FindDataItemIndexById(int dataId); void change(); //修改相关 void save(); //文件保存 void moneysort(); //排序相关函数 void datesort(); void name_sort(); void acc_sort(); void data_report(); bool cmp_money(MyAccount A, MyAccount B); bool cmp_date(MyAccount A, MyAccount B); /*************************************************************************************************************************/ // 登录注册部分 void readfile_0() { FILE *fl; int i=0; fl=fopen("login.txt","r"); if(!fl) { printf("\n请创建login.txt文件"); } //读入条目达到计数的目的 while(fscanf(fl,"%s%s",user[i].ID,user[i].PW)==2) i++; num_0=i; fclose(fl); } /*************************************************************************************************************************/ //向文件中注册账户 void CreatUser() { FILE *fl; int i=0; fl=fopen("login.txt","w"); if(!fl) { printf("\n请创建login.txt文件"); } for(i=0;i<num_0;i++) //输出到文件 { fprintf(fl,"\n%s %s",user[i].ID,user[i].PW); } printf("\n"); fclose(fl); } /*************************************************************************************************************************/ void Login() { int i=0; readfile_0(); char ID[20]={0},PW[20]={0}; printf("\n=================================\n 登录到个人帐本管理助手 \n=================================\n"); printf("如未注册,按0键进行注册,如已有账号按1键进行登陆 \n"); scanf("%d",&i); if(i==0) { int k=num_0,j,flag=1; while(flag) { flag=0; printf("\n请输入您要注册的账号:"); scanf("%s",user[k].ID); for(j=0;j<k;j++) if(strcmp(user[k].ID,user[j].ID)==0) { printf("该用户已注册,请勿重复注册,\n"); flag=1; break; /*如有重复立即退出该层循环,提高判断速度*/ } } printf("\n请输入密码:"); scanf("%s",user[k].PW); num_0++; printf("\n%s 账户已成功注册",user[k].ID); //在文本文件注册信息 CreatUser(); Login(); } else if(i==1) { int j=0; printf("Please input your Usernumber \n"); scanf("%s",ID); printf("Please input your PassWord \n"); scanf("%s",PW); for(i=0;i<num_0;i++) { if(strcmp(user[i].ID,ID)==0&&strcmp(user[i].PW,PW)==0) { User=i; j++; break; } } if (j==0) { printf("Please recheck the number or your password!\n"); Login(); } else printf("Successfully!"); } } /*************************************************************************************************************************/ void UI() //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; } /*************************************************************************************************************************/ void place() //数组序号整理 { FILE* fp; int k=1; //删除后的真实序号 if ((fp = fopen("temp.txt", "w")) == NULL) //写入临时文件 { printf("无法打开文件!请检查是否建立输出文件!\n"); exit(0); } else { for (int i = 1; i <= cnt; i++) { if( MyACC[i].id == 0) { continue; } fprintf(fp, "%d\t%d\t%s\t%s\t%s\t%s\n\n", k,MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps); printf("%d,%d,%s,%s,%s,%s\n", k,MyACC[i].money,MyACC[i].date,MyACC[i].name,MyACC[i].type,MyACC[i].ps); printf("保存成功!%d\n",i); k++; } printf("保存成功!"); } fclose(fp); memset(MyACC,0,10); cnt=1; if ((fp = fopen("temp.txt", "r")) == NULL) //再读取 { //r+:指针指向文件开头,这里要自己打开in.txt文件写入账目 printf("无法打开文件!请检查文件是否存在!\n"); exit(0); } else { while (!feof(fp)) { fscanf(fp, "%d%d%s%s%s%s\n\n", &T.id,&T.money,&T.date,&T.name,&T.type,&T.ps); //暂存一项数据 if(T.id!=0) { MyACC[cnt]=T; cnt++; } } cnt--; printf("再输入完成,共%d条账目", cnt); } fclose(fp); } /*************************************************************************************************************************/ void initialDateint() //整型日期初始化 { for (int i = 1; i <= cnt; i++) { int rank = 1, Date_int = 0; //rank表示位阶(个位、十位、百位...),Date_int存放转换结果 for (int j = 7; j >= 0; j--) { //日期是8位数 例如2020.05.03 Date_int += rank * (MyACC[i].date[j] - 48); //一个数字与它对应在ascii码的数字字符相差48 rank *= 10; //字符转化为整数:从个位到最高位,size表示进位 } MyACC[i].dateint = Date_int; } } /*************************************************************************************************************************/ void input() //输入 { printf("手动输入账务请输1,文件读取账务请输2\n"); scanf("%d", &key); if (key == 1) Hand_Input(); else if (key == 2) File_Input(); initialDateint(); } void Hand_Input() //手动输入 { int flag; //输入账目函数 printf("您需要录入多少条账务记录?\n"); scanf("%d", &flag); getchar(); while (flag--) { cnt++; Myid = cnt; printf("请按顺序输入以下内容:\n序号 收支金额 交易日期 收支项名称 收支类型 备注信息\n"); scanf("%d", &MyACC[Myid].id); 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() //文件输入 { char name[30]; //存储文件名 printf("请输入文件名:\n"); scanf("%s",name); FILE* fp; if ((fp = fopen(name, "r+")) == NULL) //读写,若不存在,不建立 { //r+:指针指向文件开头,这里要自己打开in.txt文件写入账目 printf("无法打开文件!请检查文件是否存在!\n"); exit(0); } else { cnt = 1; while (!feof(fp)) { fscanf(fp, "%d%d%s%s%s%s\n\n", &MyACC[cnt].id,&MyACC[cnt].money,&MyACC[cnt].date,&MyACC[cnt].name,&MyACC[cnt].type,&MyACC[cnt].ps); printf("%d,%d,%s,%s,%s,%s\n", MyACC[cnt].id,MyACC[cnt].money,MyACC[cnt].date,MyACC[cnt].name,MyACC[cnt].type,MyACC[cnt].ps); printf("数目:%d\n",cnt); cnt++; } cnt--; printf("输入完成,共%d条账目", cnt); } fclose(fp); } /*************************************************************************************************************************/ void save() //存储数据文件 { FILE* fp; if ((fp = fopen("out.txt", "w+")) == NULL) { printf("无法打开文件!请检查是否建立输出文件!\n"); exit(0); } else { for (int i = 1; i <= cnt; i++) fprintf(fp, "%d\t%d\t%s\t%s\t%s\t%s\n\n", MyACC[i].id,MyACC[i].money, MyACC[i].date, MyACC[i].name, MyACC[i].type, MyACC[i].ps); printf("保存成功!"); } fclose(fp); // return; } /*************************************************************************************************************************/ void del() //删除 { //删除账目函数 printf("请输入需要删除的账目ID:\n"); scanf("%d", &Myid); memset(&MyACC[Myid],0,sizeof(MyACC[Myid])); //数据清零 MyACC[Myid].money = 0; MyACC[Myid].date[0] = '0'; MyACC[Myid].name[0] = 0; MyACC[Myid].type[0] = 0; MyACC[Myid].ps[0] = 0; MyACC[Myid].id = 0; printf("删除成功!\n\n"); place(); } /*************************************************************************************************************************/ void acc_sort() //排序 { //选择排序类型 printf

推荐阅读