关于c语言中的家庭收支程序
第一个为无函数的,直接无脑void main程序的维护性极差
第二个为改进后的,使用了函数。
优化前
-------------------------------------家庭收入支出--------------------------------------
#include<stdio.h>
#include<string.h>
void main()
{
//完成1 显示菜单。
//分析
//使用do--while循环
//完成2 登记收入
//1 需要一个字符串记录收入
//完成6
//在支出时判断余额是否足够,并给出提示
char key=' ';//表示用户输入了那个菜单
int a=1;//改变量控制是否退出菜单
char details[5000]="----------当前收支明细-----------\n收支\t收支金额\t账户余额\t说明";
char note[50]="";//对收支的说明
char temp[100]="";//用于格式化每次的收支,并且拼接到details中
double money=0.0;
double balance=1000.0;//表示账户余额
char choice=' ';//表示用户选择
int b=0; //表示是否有收入或者支出
do{
printf("\n\n\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':
if(b)
printf("%s",details);
else
printf("当前没有任何收支 赶紧来一笔");
break;
case'2':
printf("\n本次收入金额为:");
scanf("%lf",&money);
getchar();//过滤回车
balance+=money;//更新余额
printf("\n本次收入说明:");
scanf("%s",note);
getchar(); //过滤回车
sprintf(temp,"\n收入\t%.2f\t\t%.2f\t\t%s",money,balance,note);//将本次信息,收入到temp中
//将信息拼接到details
strcat(details,temp);
b=1;
break;
case'3':
printf("\n本次支出的金额");
scanf("%lf",&money);
getchar(); //过滤回车
//判断余额是否足够
if(money>balance)//余额不足
{
printf("余额不足");
printf("\n穷逼赶紧去赚钱");
break;
}
printf("\n本次支出说明:");
scanf("%s",note);
getchar(); //过滤回车
balance-=money;
sprintf(temp,"\n支出\t%.2f\t\t%.2f\t\t%s",money,balance,note);//将本次信息,收入到temp中
b=1;
break;
case'4':
printf("\n你确定要退出吗?y/n");
do{
scanf("%c",&choice);
getchar();
if(choice=='y'||choice=='n')
break;
printf("\n你输入的信息有误请重新输入y/n");
}while(1);
if(choice=='y')
a=0;
}
}while(a);
printf("你退出了软件");
}
优化后
//--------------------------------优化程序---------------------------
#include<stdio.h>
#include<string.h>
//定义一个结构体
struct Myaccount
{
int b;//表示是否有1笔收支记录
char details[3000];//明细
double balabce;
};
char key=' ';//表示用户输入了那个菜单
int a=1;//改变量控制是否退出菜单
int c;
char temp[100]="";//用于格式化每次的收支,并且拼接到details中
double money=0.0;
char note[50]="";//对收支的说明
char choice=' ';//表示用户选择
void pay(struct Myaccount *myaccount){
printf("\n本次支出的金额");
scanf("%lf",&money);
getchar(); //过滤回车
//判断余额是否足够
if(money>(*myaccount).balabce )//余额不足
{
printf("余额不足");
printf("\n穷逼赶紧去赚钱");
return;
}
printf("\n本次支出说明:");
scanf("%s",note);
getchar(); //过滤回车
(*myaccount).balabce -=money;
sprintf(temp,"\n支出\t%.2f\t\t%.2f\t\t%s",money,(*myaccount).balabce ,note);//将本次信息,收入到temp中
(*myaccount).b=1;
return;
}
void show(struct Myaccount*myaccount){
if((*myaccount).b)
printf("%s",(*myaccount).details );
else
printf("当前没有任何收支 赶紧来一笔");
return;
}
int text(){
printf("\n你确定要退出吗?y/n");
do{
scanf("%c",&choice);
getchar();
if(choice=='y'||choice=='n')
break;
printf("\n你输入的信息有误请重新输入y/n");
}while(1);
if(choice=='y')
return a=0;
}
void income(struct Myaccount*myaccount){
printf("\n本次收入金额为:");
scanf("%lf",&money);
getchar();//过滤回车
(*myaccount).balabce+=money;//更新余额
printf("\n本次收入说明:");
scanf("%s",note);
getchar(); //过滤回车
sprintf(temp,"\n收入\t%.2f\t\t%.2f\t\t%s",money,(*myaccount).balabce,note);//将本次信息,收入到temp中
//将信息拼接到details
strcat((*myaccount).details ,temp);
(*myaccount).b=1;
return;
}
void mainMenu(struct Myaccount*myaccount){
//用于显示菜单
do{
printf("\n\n\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':
show(myaccount);
case'2':
income(myaccount);
case'3':
pay(myaccount);
case'4':
c=text();
}
}while(c);
printf("你退出了软件");
}
void main(){
struct Myaccount myaccount;
//初始化
myaccount.b=0;
myaccount.balabce=1000;
//使用拷贝的方式赋值
memset(myaccount.details,3000,0);
strcpy(myaccount.details ,"----------当前收支明细-----------\n收支\t收支金额\t账户余额\t说明");
//调用mainMenu显示菜单
mainMenu(&myaccount);
getchar();
}