C项目-家庭收支记账软件

家庭收支记账软件

1. 实现基本功能

编写文件myAccount.c完成功能

2.菜单显示

项目采用分级菜单方式。主菜单如下:

--------------------------家庭收支记账软件--------------------------------

​ 1 收支明细

​ 2 登记收入

​ 3 登记支出

​ 4 退出

​ 请选择(1-4):—

3. 登记收入

--------------------------家庭收支记账软件--------------------------------

​ 1 收支明细

​ 2 登记收入

​ 3 登记支出

​ 4 退出

​ 请选择(1-4):2

​ 本次收入金额:1000

​ 本次收入说明:劳务费


4. 登记支出

--------------------------家庭收支记账软件--------------------------------

​ 1 收支明细

​ 2 登记收入

​ 3 登记支出

​ 4 退出

​ 请选择(1-4):3

​ 本次支出金额:800

​ 本次支出说明:物业费

5. 显示明细

  • 收支明细的界面及操作过程如下所示:

--------------------------家庭收支记账软件--------------------------------

​ 1 收支明细

​ 2 登记收入

​ 3 登记支出

​ 4 退出

​ 请选择(1-4):1

----------------------------当前收支明细记录---------------------------------

收支 收支金额 账户金额 说明

收入 1000 11000 劳务费

支出 800 10200 物业费


6.退出系统

--------------------------家庭收支记账软件--------------------------------

​ 1 收支明细

​ 2 登记收入

​ 3 登记支出

​ 4 退出

​ 请选择(1-4):4

确认是否退出(Y/N):

7. 项目代码实现改进

  • 用户输入4退出时,给出提示“你确定要退出吗?y/n",必须输入正确的y/n,否则循环输入指令,直到输入y或者n
  • 当没有任何收支明细时,提示”当前没有收支明细...来一笔吧!’‘
  • 在支出时,判断余额是否够,并给出相应的提示
  • 改成使用结构体完成=>并且使用函数来提高项目的模块话编程,利用今后项目的维护和扩展

8.实现代码版本1-没有使用结构体和函数封装

#include<stdio.h>
#include<string.h>

void main(){
    //完成1:显示菜单
    //分析
    //1.使用do-while来显示菜单,如果用户输入4表示退出程序
    
    //完成2:登记收入
    //分析
    //1.需要一个字符串来记录收入情况
    
    //完成3:登记支出
    //分析
    //需要一个字符串来记录收入情况
    
    //完成4
    //完成5
    //定义相关的变量
    char key='';//表示用户输入了哪个菜单
    int loop=1;//控制是否退出菜单
    char details[3000]="--------------当前收支明细记录--------------\n收支\t收支金额\t账户金额\t\t说明";
        //记录所有的收入和支出情况
    char note[20]="";//对收入或者支出的说明
    char temp[100]="";//是用于格式化每次的收入或者支出,然乎拼接到details
    double money=0.0;
    double balance=1000.0;//账户余额,初始化为1000.0
    char choice='';//表示用户的选择是y/n
    int flag=0;//表示是否有至少一笔收入或者支出
    
    do{
        printf("------------家庭收支记账软件--------------");
        printf("		1 收支明细");
        printf("		2 登记收入");
        printf("		3 登记支出");
        printf("		4 退出");
        printf("请选择(1-4):");
        scanf("%c",&key);
        getchar();//过滤回车
        
        switch(key){
            case '1':
                if(flag){
                    printf("%s",details);
                }else{
                    printf("当前没有收支明细,来一笔吧");
                }
                break;
            case '2':
                printf("本次收入金额:");
                scanf("%lf",&money);
                getchar();
                balance+=money;
        		printf("本次收入说明:");
                scanf("%s",note);
                getchar();
                sprintf(temp,"收入\t%.2f\t\t%s",money,balance,note);
                //将而本次信息写入到temp字符数组
                //将信息拼接到details
                strcat(details,temp);
                flag=1;
                break;
            case '3':
                printf("本次支出金额:");
                scanf("%lf",&money);
                getchar();
                //判断是否够支出
                if(money>balance){
                    printf("余额不足");
                    break;
                }
                printf("本次支出说明:");
                scanf("%s",note);
                getchar();
                balance-=money;
                sprintf(temp,"支出\t%.2f\t\t%s",money,balance,note);
                //将本次信息,写入到temp字符数组
                strcat(details,temp);
                flag=1;
                break;
            case '4':
                printf("你确定要退出吗?");
                do{
                    scanf("%c",&choice);
                    getchar();
                    if(choice=='y'||choice=='n'){
                        break;
                    }
                    printf("你的输入有误,请重新输入");
                }while(1);
                if(choice=='y'){
                    loop=0;
                }
    }
    
}while(loop);
    printf("你退出了家庭财务软件~~");
    getchar();

9 实现代码版本2-使用结构体函数封装

  • 提供软件模块化编程,便于维护
#include <stdio.h>
#include<string.h>

//定义一个结构体
struct MyFamilyAccount{
    int flag;
    char details[3000];
    double balance;
};

//定义相关的变量,全局变量
char key='';
int loop=1;
char note[20]="";
char temp[100]="";
double money=0.0;
char choice='';

//使用函数,完成退出
void myExit(){
    printf("你确定要退出吗");
    do{
        scanf("%c",&choice);
        getchar();
        if(choice=='y'||choice=='n'){
            break;
        }
        printf("你的输入有误,请重新输入");
    }while(1);
    if(choice=='y'){
        loop=0;
    }
}
//使用函数,显示明细
void shouDetails(struct MyFamilyAccount *myFamilyAccount){
    if((*myFamilyAccount).flag){
        printf("%s",(myFamilyAccount).details);
    }else{
        printf("当前没有收支明细,来一笔吧");
    }
}
//使用函数,完成登记收入,封装
void income(struct MyFamilyAccount *myFamilyAccount){
    printf("本次收入金额:");
    scanf("%lf",&money);
    getchar();
    (*myFamilyAccount).balance+=money;
    printf("本次收入说明");
    scanf("%s",note);
    getchar();
    sprintf(temp,"收入\t%.2f\t\t%.2f\t\t%s",money,(*myFamilyAccount).balance,note);
    strcat((*myFamliyAccount).details,temp);
    (*myFamilyAccount).flag=1;
}
//完成一个登记支出
void pay(struct MyFamilyAccount *myFamilyAccount){
    printf("本次支出金额:");
    scanf("%lf",&money);
    getchar();
    if(money>(*myFamilyAccount).balance){
        printf("余额不足");
        return;
    }
    printf("本次支出说明");
    scanf("%s",note);
    getchar();
    (*myFamilyAccount).balance-=money;
    sprintf(temp,"支出\t%.2f\t\t%.2f\t\t%s",money,(*myFamilyAccount).balance,note);
    strcat((*myFamilyAccount).details,temp);
    (*myFamilyAccount).falg=1;
}

//函数专门显示菜单
void mainMenu(struct MyFamilyAccount *myFamilyAccount){
    do{
        printf("-------家庭收支记账软件----------");
        printf("		1 收支明细");
        printf("		2 登记收入");
        printf("		3 登记支出");
        printf("		4 退出");
        printf("请选择(1-4)");
        scanf("%c",&key);
        getchar();
        
        switch(key){
            case '1':
                shouDetails(myFamilyAccount);
                break;
            case '2':
                income(myFamilyAccount);
                break;
            case '3':
                pay(myFamilyAccount);
                break;
            case '4':
                myExit();
        }
    }while(loop);
    printf("你退出了家庭财务软件");
    getchar();
}
void main(){
    //创建一个结构体变量
    struct MyFamilyAccount myFamilyAccount;
    //初始化
    myFamilyAccount.flag=0;
    myFamilyAccount.balance=1000.0;
    //使用拷贝的方式赋值
    memset(myFamilyAccount.details,3000,0);
    strcpy(myFamilyAccount.details,"----------当前收支明细记录---------收支\t收支金额\t账户金额\t说明");
        //调用mainMenu显示菜单
        mainMenu("&myFamilyAccount");
    getchar();
}
posted @ 2021-02-18 13:01  mx_info  阅读(360)  评论(0)    收藏  举报