61 C项目------家庭收支软件

1,目标:

  ①模拟实现一个基于文本界面的《家庭收支软件》

  ②涉及知识点

    局部变量和基本数据类型

    循环语句

    分支语句

    简单的屏幕输出格式控制

2,需求说明:

  ①模拟实现基于文本界面的《家庭收支软件》

  ②该软件能够记录家庭的收入、支出,并能够打印收支明细表

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

    -------家庭收支软件-------

    1,收支明细

    2,登记收入

    3,登记支出

    4,退出

    请选择(1-4):

  ④假设家庭起始的生活基金为:1000元

  ⑤每次登记收入(菜单2)后,收入的金额应累加到基本金额上,并记录本次收入明细,以便后续的查询

  ⑥每次登记支出(菜单3)后,支出的金额应从基本金额上扣除,并记录本次支出明细,以便后续的查询

  ⑦查询收支明细(菜单1)时,将显示所有的收入、支出明细列表

3,界面展示

  ①“登记收入”的界面及操作过程: 

     -------家庭收支软件-------

      1,收支明细

      2,登记收入

      3,登记支出

      4,退出

      请选择(1-4):2

       本次收入金额:1000

       本次收入说明:工资

  ②“登记支出”的界面及操作过程:

 

     -------家庭收支软件-------

 

      1,收支明细

 

      2,登记收入

 

      3,登记支出

 

      4,退出

 

        请选择(1-4):3

 

       本次支出金额:700

 

       本次支出说明:水电费

  ③“收支明细”的界面及操作过程:  

     -------家庭收支软件-------

      1,收支明细

      2,登记收入

      3,登记支出

      4,退出

      请选择(1-4):1

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

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

        收入   10000    2000    工资

       支出     700       1300   水电费

  ④“退出”的界面及操作过程     

      -------家庭收支软件-------

        1,收支明细

        2,登记收入

        3,登记支出

        4,退出

        请选择(1-4):4

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

4,基本金和收支明细的记录

  ①账户余额的记录可以使用 double 类型的局部变量来实现:double leftMoney = 1000.0;

  ②收支明细记录可以使用字符数组的变量来实现,其初始值为:明细表的表头,char details [ 3000 ] = " 收支 \t 收支金额 \t 账户余额 \t 说 明 \n" ;

  ③在登记收支时,将收支金额与 leftMoney 相加或相减,收支记录先临时保存在 item中,再将 item 拼接到 details 后面即可

5,流程图(活动图)----主流程

    

 

 6,流程图(活动图)----收入和支出处理流程

    

 

代码实现

1,显示菜单:

  ①使用 do-while 来显示菜单,如果用户输入 4 表示退出程序

 1 #include<stdio.h>
 2 void main() {
 3     int loop = 1;   //控制是否退出菜单
 4     char key = ' ';  //表示用户选择的菜单
 5     do {
 6         printf("-------家庭收支软件----\n");
 7         printf("1,收支明细----\n");
 8         printf("2,登记收入----\n");
 9         printf("3,登记支出----\n");
10         printf("4,退出----\n");
11         printf("请选择(1-4):");
12         scanf("%c", &key);
13         getchar(); //过滤回车
14         switch (key) {
15         case '1':
16             printf("收支明细\n");break;
17         case'2':
18             printf("登记收入\n");break;
19         case'3':
20             printf("登记支出\n");break;
21         case'4':
22             loop = 0;
23             printf("退出家庭收支程序");
24         }
25 
26     } while (loop);
27 
28 }

 

 ②实现“登记收入” 并实现收入明细显示

 1 #include<stdio.h>
 2 #include<string.h>
 3 void main() {
 4     int loop = 1;
 5     char key = ' ';
 6     double money = 0.0;  //输入或支出的金额
 7     double leftMoney = 1000;  //余额,初始化是1000
 8     char accountDetail[3000] = "收支\t收支金额\t账户余额\t说明\n0.00\t0.00\t\t1000.00\n";  //收支明细
 9     char reason[100] = " ";  //收入或支出的说明
10     char item[1000] = " ";  //每一条收入或支出,最后要拼接到 accountDetail
11     do {
12         printf("-------家庭收支软件----\n");
13         printf("1,收支明细----\n");
14         printf("2,登记收入----\n");
15         printf("3,登记支出----\n");
16         printf("4,退出----\n");
17         printf("请选择(1-4):");
18         scanf("%c", &key);
19         getchar(); //过滤回车
20         switch (key) {
21         case '1':
22             //printf("收支明细\n");break;
23             printf("%s", accountDetail);break;
24         case'2':
25             //printf("登记收入\n");break;
26             printf("请输入一笔收入:");
27             scanf("%lf", &money);
28             printf("请输入收入来源:");
29             scanf("%s", reason);
30             getchar();
31             leftMoney += money;  //更新余额
32             sprintf(item,"收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);//将本次记录写入到item字符数组
33             strcat(accountDetail, item); //将item拼接到accountDetail
34             break;
35         case'3':
36             printf("登记支出\n");break;
37         case'4':
38             loop = 0;
39             printf("退出家庭收支程序");
40         }
41 
42     } while (loop);
43 
44 }

运行结果:

-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):2
请输入一笔收入:1000
请输入收入来源:爸爸工资
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
收入    1000.00         2000.00         爸爸工资
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):2
请输入一笔收入:3000
请输入收入来源:妈妈工资
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
收入    1000.00         2000.00         爸爸工资
收入    3000.00         5000.00         妈妈工资
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):

③实现“支出登记”

 1 #include<stdio.h>
 2 #include<string.h>
 3 void main() {
 4     int loop = 1;
 5     char key = ' ';
 6     double money = 0.0;
 7     double leftMoney = 1000;
 8     char accountDetail[3000] = "收支\t收支金额\t账户余额\t说明\n0.00\t0.00\t\t1000.00\n";
 9     char reason[100] = " ";
10     char item[1000] = " ";
11     do {
12         printf("-------家庭收支软件----\n");
13         printf("1,收支明细----\n");
14         printf("2,登记收入----\n");
15         printf("3,登记支出----\n");
16         printf("4,退出----\n");
17         printf("请选择(1-4):");
18         scanf("%c", &key);
19         getchar(); //过滤回车
20         switch (key) {
21         case '1':
22             //printf("收支明细\n");break;
23             printf("%s", accountDetail);break;
24         case'2':
25             //printf("登记收入\n");break;
26             printf("请输入一笔收入:");
27             scanf("%lf", &money);
28             printf("请输入收入来源:");
29             scanf("%s", reason);
30             getchar();
31             leftMoney += money;
32             sprintf(item,"收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
33             strcat(accountDetail, item);
34             break;
35         case'3':
36             printf("请输入一笔支出:");
37             scanf("%lf", &money);
38             printf("请输入支出去向:");
39             scanf("%s", reason);
40             getchar();
41             leftMoney -= money;
42             sprintf(item, "收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
43             strcat(accountDetail, item);
44             break;
45         case'4':
46             loop = 0;
47             printf("退出家庭收支程序");
48         }
49 
50     } while (loop);
51 
52 }

运行结果:

-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):2
请输入一笔收入:1000
请输入收入来源:爸爸收入
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
收入    1000.00         2000.00         爸爸收入
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):3
请输入一笔支出:200
请输入支出去向:水电费
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
收入    1000.00         2000.00         爸爸收入
收入    200.00          1800.00         水电费
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):

项目代码实现改进:

1,用户输入4退出时,给出提示“确定退出?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入 y/n

2,在支出时,判断余额是否够,并给出相应的提示

 1 #include<stdio.h>
 2 #include<string.h>
 3 void main() {
 4     int loop = 1;
 5     char key = ' ';
 6     double money = 0.0;
 7     double leftMoney = 1000;
 8     char accountDetail[3000] = "收支\t收支金额\t账户余额\t说明\n0.00\t0.00\t\t1000.00\n";
 9     char reason[100] = " ";
10     char item[1000] = " ";
11     char isout = ' ';
12     do {
13         printf("-------家庭收支软件----\n");
14         printf("1,收支明细----\n");
15         printf("2,登记收入----\n");
16         printf("3,登记支出----\n");
17         printf("4,退出----\n");
18         printf("请选择(1-4):");
19         scanf("%c", &key);
20         getchar(); //过滤回车
21         switch (key) {
22         case '1':
23             //printf("收支明细\n");break;
24             printf("%s", accountDetail);break;
25         case'2':
26             //printf("登记收入\n");break;
27             printf("请输入一笔收入:");
28             scanf("%lf", &money);
29             printf("请输入收入来源:");
30             scanf("%s", reason);
31             getchar();
32             leftMoney += money;
33             sprintf(item, "收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
34             strcat(accountDetail, item);
35             break;
36         case'3':
37             printf("请输入一笔支出:");
38             scanf("%lf", &money);
39             getchar();
40             if (money > leftMoney) {   //余额不足的情况
41                 printf("余额不足\n");
42                 break;
43             }
44             printf("请输入支出去向:");
45             scanf("%s", reason);
46             getchar();
47             leftMoney -= money;
48             sprintf(item, "支出\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
49             strcat(accountDetail, item);
50             break;
51         case'4':
52             do {
53                 printf("确定退出?y/n:");  //退出前的提示,并控制用户必须输入 y/n
54                 scanf("%c", &isout);
55                 getchar();
56                 if (isout == 'y' || isout == 'n') {
57                     break;
58                 }
59             } while (1);
60             if (isout == 'y') {  //正确输入 y/n后,判断输入的是 y ,才可以退出程序
61                 loop = 0;
62                 printf("退出家庭收支程序");
63             }
64         }
65     } while (loop);
66 
67 }

运行结果:

-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):2
请输入一笔收入:1000
请输入收入来源:工资
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
收入    1000.00         2000.00         工资
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):3
请输入一笔支出:3000
余额不足
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):3
请输入一笔支出:800
请输入支出去向:购物
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):1
收支    收支金额        账户余额        说明
0.00    0.00            1000.00
收入    1000.00         2000.00         工资
支出    800.00          1200.00         购物
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):4
确定退出?y/n:a
确定退出?y/n:n
-------家庭收支软件----
1,收支明细----
2,登记收入----
3,登记支出----
4,退出----
请选择(1-4):4
确定退出?y/n:y
退出家庭收支程序

 

 

posted @ 2020-02-27 22:32  shanlu  阅读(273)  评论(0编辑  收藏  举报