家庭财务管理系统
功能设计要求
家庭财务管理系统应用软件给家庭成员提供了一个管理家庭财务的平台,可以对家庭成员的收入和支出进行增加、删除、修改和查询等操作,并能统计总收入和总支出。
1. 系统主菜单界面
允许用户选择要进行的操作,包括输入收入管理、支出管理、统计和退出系统等操作。其中,收入管理包括添加收入、查询收入明细、删除收入和修改收入的操作,支出管理包括添加支出、查询支出明细、删除支出和修改支出的操作。统计是对总收入和总支出进行统计操作。
2. 添加收入处理
用户根据提示,输入要添加的收入信息,包括收入的日期(要求4位的年和月份)、添加收入的家庭成员姓名、收入的金额及备注信息。输入完一条收入记录,将其保存,返回到主菜单界面。
3. 查询收入明细处理
根据用户输入的年月信息查找收入信息,如果查询成功,按照预定格式显示该收入明细。如果没有数据,则给出相应的提示信息。查询结束后,提示用户是否继续查找,根据用户的输入进行下一步操作。
4. 删除收入处理
首先提示用户输入要删除的年月,根据用户的输入查询。如果没有查询到任何信息,系统给出提示信息;如果查询成功,显示该收入明细,并提示用户输入对应的序号,删除该收入信息,用户输入对应的序号就删除相关的收入信息,并给出删除成功的提示信息。用户输入其他键则重新进行删除操作。
5. 修改收入处理 首先提示用户输入要进行修改收入的年月,如果有该收入信息存在,则提示用户输入要修改的收入日期、家庭成员姓名、收入金额及备注等信息,并将修改结果重新保存。如果没有找到要修改的收入信息,系统将给出提示信息。
6. 添加支出处理
完成用户支出信息的添加,与添加收入处理相似。
7. 查询支出明细处理
查询支出信息,与查询收入明细处理相似。
8. 删除支出处理
删除支出信息,与删除收入处理相似。
9. 修改支出处理
修改支出信息与修改收入处理相似。
10. 统计总收入和总支出处理
计算所有的收入的总和及所有支出的总和,并将两者相减,得到家庭收入的结余。
11. 退出
退出系统。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
struct person {
char name[99] = { 0 };
char money[99] = { 0 };
char date[99] = { 0 };
char detail[99] = { 0 };
}member[99];
int n;/*该变量表示有几个成员*/
char m; // 用来区分是收入or支出
void readfile(); // 读文件
void menu(); //菜单函数
void add(); //添加收入/支出
void search(); //查询收入/支出
void updata(); //修改收入/支出
void Delete(); // 删除收入/支出
void clear(); //清空
void keep(); //是否保存
void savefile(); // 保存函数
void statistics() ; // 统计总收入/支出
void readfile(char flag) {
FILE* fp; //设立一个文件指针fp
int i = 0;
while (1) {
if (flag == 'A' || flag == 'a') { //收入
fp = fopen("data.txt", "r");
break;
}
else if (flag == 'B' || flag == 'b') { //支出
fp = fopen("data1.txt", "r");
break;
}
else {
printf("请按格式输入!\n");
}
}
while (fscanf(fp, "%s %s %s %s", member[i].name, member[i].money,member[i].date,member[i].detail )==4) {
i++;
}
n = i;
if (i == 0) {
printf("文件为空,请添加成员,并注意保存数据!");
system("pause");
}
fclose(fp);
}
void menu()
{
printf("\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t\t 家庭财务管理系统\n");
printf("\t\t ~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t\t*******************************************\n");
printf("\t\tA.收入管理:");
printf("1.添加收入");
printf(" 2.查询收入明细\n");
printf("\t\t\t 3.删除收入");
printf(" 4.修改收入\n");
printf("\t\t*******************************************\n");
printf("\t\tB.支出管理:");
printf("5.添加支出");
printf(" 6.查询支出明细\n");
printf("\t\t\t 7.删除支出");
printf(" 8.修改支出\n");
printf("\t\t*******************************************\n");
printf("\t\tC.统 计:");
printf("统计总收入/总支出\n");
printf("\t\t*******************************************\n");
printf("\t\t退 出:0.退出系统\n");
printf("\t\t*******************************************\n\n\n");
}
void add() {
char arr[99] = { 0 }, arr1[99] = { 0 };
printf("请添加第%d位成员的收入/支出信息:\n", n + 1);
printf("请输入成员姓名:");
scanf("%s",arr);
getchar();
printf("请输入收入/支出日期(xxxx年xx月):");
scanf("%s", arr1);
getchar();
for (int i = 0; i < n; i++) {
if (strcmp(member[i].name, arr) == 0&&strcmp(member[i].date,arr1)==0) { //判断两个字符串是否相同,若相同返回0
printf("已有该成员\n");
return;
}
}
strcpy(member[n].name, arr);
strcpy(member[n].date, arr1);
for (int i = 0; i < 99; i++) {
arr[i] = { 0 }; //初始化
}
printf("请添加成员收入/支出:");
scanf("%s", arr);
getchar();
strcpy(member[n].money, arr);
for (int i = 0; i < 99; i++) {
arr[i] = { 0 };
}
printf("请添加备注信息:");
scanf("%s",arr);
getchar();
strcpy(member[n].detail, arr);
printf("添加完成!");
n = n + 1;
return;
}
void search()
{
int i, flag=0;
char arr[99] = { 0 };
char c;
printf("目前有%d位成员", n + 1);
printf("请输入要查询的年月(xxxx年xx月):");
scanf("%s", arr);
getchar();
for (i = 0; i < n; i++) {
if (strcmp(member[i].date, arr) == 0)
{
flag = 1;
printf("+----------+----------+----------+----------+\n");
printf("| 年月 | 姓名 | 收入/支出金额 | 备注 |\n");
printf("|%10s|%10s|%10s|%10s|\n", member[i].date, member[i].name, member[i].money, member[i].detail);
}
}
if (flag == 1) {
printf("+----------+----------+----------+----------+\n");
}
if (flag == 0)
{
printf("没有找到数据\n");
while (1) {
printf("是否继续查找其他数据?(y or n)");
scanf("%c", &c);
getchar();
if (c == 'y' || c == 'Y')
return search();
else if (c == 'N' || c == 'n') {
printf("查询完毕!\n");
return;
}
else {
printf("请按格式输入!\n");
}
}
}
}
void updata()
{
int i,count=0, matter[99] = { 0 }; //matter是通过那年月查出来的那批成员
char b, c, arr[99] = { 0 }, arr2[99] = { 0 }; //arr是年月信息 arr2存放的是修改后的数据(年月 姓名 金额 备注)
person arr1[99]; //arr1用来存放该年月需要修改后的数据(年月 姓名 金额 备注)
printf("请输入要修改的年月(xxxx年xx月):\n");
scanf("%s", arr);
getchar();
for (i = 0; i < n; i++) {
if (strcmp(member[i].date, arr) == 0)
{
arr1[count] = member[i];
matter[count]= i;
count++;
}
}
if (count==0)
{
printf("没有找到数据\n");
while (1) {
printf("是否继续修改其它成员收入(Y/N):");
scanf("%c", &b);
getchar();
if (b == 'Y' ||b== 'y') {
updata();
}
else if (b == 'N' || b == 'n')return;
else {
printf("请按格式输入");
continue;
}
}
}
printf("请输入要修改的家庭成员的姓名:\n");
scanf("%s", arr2);
getchar();
for (int q = 0; q < count; q++) {
if (strcmp(arr1[q].name, arr2) == 0) {
while (1) {
printf("是否要修改收入金额(Y/N):");
scanf("%c", &b);
getchar();
if (b == 'Y' || b == 'y') {
printf("请输入新的收入金额:");
scanf("%s", arr2);
getchar();
strcpy(arr1[q].money, arr2);
for (int i = 0; i < 99; i++) {
arr2[i] = { 0 };
}
b = 'n';
}
if (b == 'N' || b == 'n') {
while (1) {
printf("是否要修改年月(xxxx年xx月)(Y/N):");
scanf("%c", &b);
getchar();
if (b == 'Y' || b == 'y') {
printf("请输入新的年月(xxxx年xx月):");
scanf("%s", arr2);
getchar();
strcpy(arr1[q].date, arr2);
for (int i = 0; i < 99; i++) {
arr2[i] = { 0 };
}
b = 'n';
}
if (b == 'N' || b == 'n') {
while (1) {
printf("是否要修改备注(Y/N):");
scanf("%c", &b);
getchar();
if (b == 'Y' || b == 'y') {
printf("请输入新的备注):");
scanf("%s", arr2);
getchar();
strcpy(arr1[q].detail, arr2);
for (int i = 0; i < 99; i++) {
arr2[i] = { 0 };
}
b = 'n';
}
if (b == 'N' || b == 'n') {
while (1) {
printf("是否要修改姓名(Y/N):");
scanf("%c", &b);
getchar();
if (b == 'Y' || b == 'y') {
printf("请输入新的姓名):");
scanf("%s", arr2);
getchar();
strcpy(arr1[q].name, arr2);
for (int i = 0; i < 99; i++) {
arr2[i] = { 0 };
}
printf("修改完毕!\n");
while (1) {
printf("是否继续修改其它成员收入(Y/N):");
member[matter[q]] = arr1[q];
scanf("%c", &b);
getchar();
if (b == 'Y' ||b== 'y') {
updata();
b = 'n';
}
if (b == 'N' || b == 'n')return;
else {
printf("请按格式输入\n");
continue;
}
}
}
if (b == 'N' || b == 'n') {
member[matter[q]] = arr1[q];
while (1) {
printf("是否继续修改其它成员收入(Y/N):");
scanf("%c", &b);
getchar();
if (b == 'Y' || b=='y') {
updata();
b = 'n';
}
if (b == 'N' || b == 'n') {
printf("修改完毕!\n");
return;
}
else {
printf("请按格式输入\n");
continue;
}
}
}
else {
printf("请按格式输入\n");
continue;
}
}
}
else {
printf("请按格式输入\n");
continue;
}
}
}
else {
printf("请按格式输入\n");
continue;
}
}
}
else {
printf("请按格式输入\n");
continue;
}
}
}
}
}
void Delete()
{
char date[99] = { 0 },answer;
int count = 0, arr1[99] = { 0 }, flag=0;
person arr[99];
for (int i = 0; i < 99; i++) { //初始化
arr[i].date[0] = { 0 };
arr[i].detail[0] = { 0 };
arr[i].money[0] = { 0 };
arr[i].name[0] = { 0 };
}
printf("请先输入要删除的该成员的年月:");
scanf("%s", date);
getchar();
for (int i = 0; i < n; i++) {
if (strcmp(member[i].date, date) == 0) {
arr[count] = member[i];
arr1[count] = i;
count++;
}
}
for (int i = 0; i < 99; i++) {
date[i] = { 0 };
}
if (count == 0) {
printf("想要删除的数据不存在!\n");
printf("是否要删除其它成员(Y/N)?");
scanf("%c", &answer);
getchar();
while (1) {
if (answer == 'Y' || answer == 'y') {
Delete();
}
else if (answer == 'N' || answer == 'n') {
printf("删除完毕!\n");
return;
}
else {
printf("请按格式输入!\n");
}
}
}
printf("请输入要删除的成员的姓名:");
scanf("%s", date);
getchar();
for (int i = 0; i < count; i++) {
if (strcmp(arr[i].name, date)==0) {
flag = 1;
if (arr1[i] == n - 1) { //删除的成员位于数组的最后一个
n--;
printf("删除完毕!");
break;
}
else {
for (int j = arr1[i]; j < n - 1; j++) { //删除的成语位于数组始末之间
member[j] = member[j + 1];
}
n--;
printf("删除完毕!");
break;
}
}
}
if (flag == 0) {
printf("想要删除的数据不存在!\n");
printf("是否要删除其它成员(Y/N)?");
scanf("%c", &answer);
getchar();
while (1) {
if (answer == 'Y' || answer == 'y') {
Delete();
}
else if (answer == 'N' || answer == 'n') {
printf("删除完毕!\n");
return;
}
else {
printf("请按格式输入!\n");
}
}
}
}
void clear()
{
printf("\n");
system("pause");
system("cls");
}
void savefile()
{
int i;
FILE* fp;
if (m == 'A' || m == 'a') {
fp = fopen("data.txt", "w");
}//向文件写入数据,w为写模式
if (m == 'B'||m=='b') {
fp = fopen("data1.txt", "w");
}
for (i = 0; i < n; i++)
{
fprintf(fp, "%s %s %s %s\n", member[i].name, member[i].money, member[i].date, member[i].detail);
}
printf("保存成功!\n");
fclose(fp);
}
void keep()
{
char c;
printf("请确认是否保存(y/n)?\n");
scanf(" %c", &c);
getchar();
while (1) {
if ((c == 'n') || (c == 'N')) {
readfile(m);
break;
}
else if (c == 'Y' || c == 'y') {
savefile();
break;
}
else {
printf("请按格式输入!!!\n");
}
}
}
void statistics() {
struct MONEY {
int money[99] = { 0 };//money是每个成员的钱
int c = 0; //c表示钱是几位数
}money1[99], money2[99];//money1是收入 money2是支出
int money3[99] = { 0 }, sum1 = 0, sum2 = 0;//sum1是总收入 sum2是总支出
char a = 'A', b = 'B';
printf("收入计算:\n");
readfile(a);
for (int i =0; i <n; i++)
for (int j = 0; j < 99; j++) { //此处两个循环是为了将字符的钱变成int型
if (member[i].money[j] == '\0') {
money1[i].c = j;
break;
}
else {
money1[i].money[j] = member[i].money[j] - '0';//将money中的钱传给money1(收入)
}
}//得到的是单个的数字
for (int i = 0; i < n; i++) {
for (int j = (money1[i].c) - 1; j >= 0; j--) {//c-1是因为从个位数开始
money1[i].money[j] = money1[i].money[j] * pow(10, ((money1[i].c) - 1 - j));//若j=1时,c-1-1
} //若j=2时,c-1-2
for (int j = 0; j < money1[i].c; j++) {
money3[i] = money3[i] + money1[i].money[j];
}
}
for (int i = 0; i < n; i++) {
sum1 = sum1 + money3[i];
}
for (int i = 0; i < n; i++) {
money3[i] = 0;
}
printf("总收入:%d\n",sum1);
printf("支出计算:\n");
readfile(b);
for (int i = 0; i < n; i++)
for (int j = 0; j < 99; j++) {
if (member[i].money[j] == '\0') {
money2[i].c = j;
break;
}
else {
money2[i].money[j] = member[i].money[j] - '0';
}
}
for (int i = 0; i < n; i++) {
for (int j = (money2[i].c) - 1; j >= 0; j--) {
money2[i].money[j] = money2[i].money[j] * pow(10, ((money2[i].c) - 1 - j));
}
for (int j = 0; j < money2[i].c; j++) {
money3[i] = money3[i] + money2[i].money[j];
}
}
for (int i = 0; i < n; i++) {
sum2 = sum2 + money3[i];
}
printf("总支出:%d\n", sum2);
printf("结余:%d\n", (sum1 - sum2));
}
int main() {
int option;
char l;
menu();
while (1) {
printf("请选择你进入收入/支出操作(A/B/C)还是退出系统(0):");
scanf("%c", &m);
getchar();
if (m == 'a' || m == 'A' || m == 'B' || m == 'b') {
readfile(m);
}
else if (m == '0') {
return 0;
}
else if (m == 'c' || m == 'C') {
statistics();
clear();
menu();
}
else{
printf("请按格式输入!\n");
continue;
}
if (m == 'A' || m == 'a') {
while (1) {
printf("请选择你要进行的收入操作(0-4):");
scanf("%d", &option);
getchar();
if (option >= 0&& option <=4) {
switch (option) {
case 1:add(); clear(); menu(); break;
case 2:search(); clear(); menu(); break;
case 3:Delete(); clear(); menu(); break;
case 4:updata(); clear(); menu(); break;
default:return 0;
}
}
else {
printf("请按格式输入!\n");
continue;
}
while (1) {
printf("是否退出收入操作(Y/N)?");
scanf("%c", &l);
getchar();
if (l == 'Y' || l == 'y') {
while (1) {
printf("是否保存之前的操作(1/0)?");
scanf("%c", &l);
getchar();
if (l == '1') {
savefile();
break;
}
else if (l == '0') {
break;
}
else {
printf("请按格式输入!\n");
}
}
}
else if (l == 'N' || l == 'n') {
break;
}
else {
printf("请按格式输入!\n");
}
if (l == '1' || l == '0') {
break;
}
}
if (l == '1' || l == '0') {
break;
}
}
}
if (m == 'B' || m == 'b') {
while (1) {
printf("请选择你要进行的收入操作(0/(5-8)):");
scanf("%d", &option);
getchar();
if ((option >= 5 && option <= 9)||option==0) {
switch (option) {
case 5:add(); clear(); menu(); break;
case 6:search(); clear(); menu(); break;
case 7:Delete(); clear(); menu(); break;
case 8:updata(); clear(); menu(); break;
default:return 0;
}
}
else {
printf("请按格式输入!\n");
continue;
}
while (1) {
printf("是否退出支出操作(Y/N)?");
scanf("%c", &l);
getchar();
if (l == 'Y' || l == 'y') {
while (1) {
printf("是否保存之前的操作(1/0)?");
scanf("%c", &l);
getchar();
if (l == '1') {
savefile();
break;
}
else if (l == '0') {
break;
}
else {
printf("请按格式输入!\n");
}
}
}
else if (l == 'N' || l == 'n') {
break;
}
else {
printf("请按格式输入!\n");
}
if (l == '1' || l == '0') {
break;
}
}
if (l == '1' || l == '0') {
break;
}
}
}
}
}