用结构体和函数封装实现模块化代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义结构体
struct MyFamilyAccout{
int flag; //表示至少有一笔收入说着支出
char details[3000]; //明细
double balance; //余额
};
//定义全局变量
char key=' ';
int loop = 1;
char note[20]="";//收入或者指出的说明
char temp[100]="";//用于格式化每次的收入或支出,然后拼接到details
double money = 0.0;
char choice =' ';//判断是否退出y/n
//显示明细
void showDetails(struct MyFamilyAccout *myFamilyAccout){
if((*myFamilyAccout).flag){
printf("%s",(*myFamilyAccout).details);
}else{
printf("当前没有明细,请来一笔吧!");
}
}
//收入
void inCome(struct MyFamilyAccout *myFamilyAccout){
printf("\n本次收入金额:");
scanf("%lf",&money);
getchar(); //过滤回车
(*myFamilyAccout).balance+=money; //更新金额
printf("\n本次收入说明:");
scanf("%s",note);
getchar();
sprintf(temp,"\n收入\t%.2f\t\t%.2f\t\t\t%s",money,(*myFamilyAccout).balance,note);//将本次信息,写入到temp字符
//拼接到details
strcat((*myFamilyAccout).details,temp);
(*myFamilyAccout).flag = 1;
}
void pay(struct MyFamilyAccout *myFamilyAccout){
printf("\n本次支出金额:");
scanf("%lf",&money);
getchar(); //过滤回车
if(money>=(*myFamilyAccout).balance){
printf("余额不足!");
}else {
(*myFamilyAccout).balance-=money; //更新金额
printf("\n本次支出说明:");
scanf("%s",note);
getchar();
sprintf(temp,"\n支出\t%.2f\t\t%.2f\t\t\t%s",money,(*myFamilyAccout).balance,note);//将本次信息,写入到temp字符
//拼接到details
strcat((*myFamilyAccout).details,temp);
(*myFamilyAccout).flag = 1;
}
}
void myExit(struct MyFamilyAccout *myFamilyAccout){
printf("\n你确定要退出吗?y/n:");
do{
scanf("%c",&choice);
getchar();
if(choice=='y'||choice=='n'){
break;
}
printf("\n你的输入有误,请重新输入y/n:");
} while(1);
if(choice=='y'){
loop = 0;
}
}
//显示菜单函数
void mainMenu(struct MyFamilyAccout *myFamilyAccout){
do{
printf("\n--------家庭收支记账软件----------");
printf("\n 1 收支明细");
printf("\n 2 登记收入");
printf("\n 3 登记支出");
printf("\n 4 退 出");
printf("\n请选择(1-4):");
scanf("%c",&key);
getchar();//过滤回车
switch(key){
case'1':
showDetails(myFamilyAccout);
break;
case'2':
inCome(myFamilyAccout);
break;
case'3':
pay(myFamilyAccout);
break;
case'4':
myExit(myFamilyAccout);
}
}while(loop);
printf("你已经退出软件!");
getchar();
}
int main(){
//定义一个结构体变量
struct MyFamilyAccout myFamilyAccout;
//初始化
myFamilyAccout.flag=0;
myFamilyAccout.balance=1000;
//清零 拷贝的方式赋值
memset(myFamilyAccout.details,3000,0);
strcpy(myFamilyAccout.details,"------------当前收支明细记录-----------\n收支\t收支金额\t账户金额\t说 明\n");
//调用minaMenu显示菜单
//结构体指针 所以要用&
mainMenu(&myFamilyAccout) ;
getchar();
}