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 表示退出程序

 #include<stdio.h>
void main() {
int loop = ; //控制是否退出菜单
char key = ' '; //表示用户选择的菜单
do {
printf("-------家庭收支软件----\n");
printf("1,收支明细----\n");
printf("2,登记收入----\n");
printf("3,登记支出----\n");
printf("4,退出----\n");
printf("请选择(1-4):");
scanf("%c", &key);
getchar(); //过滤回车
switch (key) {
case '':
printf("收支明细\n");break;
case'':
printf("登记收入\n");break;
case'':
printf("登记支出\n");break;
case'':
loop = ;
printf("退出家庭收支程序");
} } while (loop); }

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

 #include<stdio.h>
#include<string.h>
void main() {
int loop = ;
char key = ' ';
double money = 0.0; //输入或支出的金额
double leftMoney = ; //余额,初始化是1000
char accountDetail[] = "收支\t收支金额\t账户余额\t说明\n0.00\t0.00\t\t1000.00\n"; //收支明细
char reason[] = " "; //收入或支出的说明
char item[] = " "; //每一条收入或支出,最后要拼接到 accountDetail
do {
printf("-------家庭收支软件----\n");
printf("1,收支明细----\n");
printf("2,登记收入----\n");
printf("3,登记支出----\n");
printf("4,退出----\n");
printf("请选择(1-4):");
scanf("%c", &key);
getchar(); //过滤回车
switch (key) {
case '':
//printf("收支明细\n");break;
printf("%s", accountDetail);break;
case'':
//printf("登记收入\n");break;
printf("请输入一笔收入:");
scanf("%lf", &money);
printf("请输入收入来源:");
scanf("%s", reason);
getchar();
leftMoney += money; //更新余额
sprintf(item,"收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);//将本次记录写入到item字符数组
strcat(accountDetail, item); //将item拼接到accountDetail
break;
case'':
printf("登记支出\n");break;
case'':
loop = ;
printf("退出家庭收支程序");
} } while (loop); }

运行结果:

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

③实现“支出登记”

 #include<stdio.h>
#include<string.h>
void main() {
int loop = ;
char key = ' ';
double money = 0.0;
double leftMoney = ;
char accountDetail[] = "收支\t收支金额\t账户余额\t说明\n0.00\t0.00\t\t1000.00\n";
char reason[] = " ";
char item[] = " ";
do {
printf("-------家庭收支软件----\n");
printf("1,收支明细----\n");
printf("2,登记收入----\n");
printf("3,登记支出----\n");
printf("4,退出----\n");
printf("请选择(1-4):");
scanf("%c", &key);
getchar(); //过滤回车
switch (key) {
case '':
//printf("收支明细\n");break;
printf("%s", accountDetail);break;
case'':
//printf("登记收入\n");break;
printf("请输入一笔收入:");
scanf("%lf", &money);
printf("请输入收入来源:");
scanf("%s", reason);
getchar();
leftMoney += money;
sprintf(item,"收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
strcat(accountDetail, item);
break;
case'':
printf("请输入一笔支出:");
scanf("%lf", &money);
printf("请输入支出去向:");
scanf("%s", reason);
getchar();
leftMoney -= money;
sprintf(item, "收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
strcat(accountDetail, item);
break;
case'':
loop = ;
printf("退出家庭收支程序");
} } while (loop); }

运行结果:

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

项目代码实现改进:

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

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

 #include<stdio.h>
#include<string.h>
void main() {
int loop = ;
char key = ' ';
double money = 0.0;
double leftMoney = ;
char accountDetail[] = "收支\t收支金额\t账户余额\t说明\n0.00\t0.00\t\t1000.00\n";
char reason[] = " ";
char item[] = " ";
char isout = ' ';
do {
printf("-------家庭收支软件----\n");
printf("1,收支明细----\n");
printf("2,登记收入----\n");
printf("3,登记支出----\n");
printf("4,退出----\n");
printf("请选择(1-4):");
scanf("%c", &key);
getchar(); //过滤回车
switch (key) {
case '':
//printf("收支明细\n");break;
printf("%s", accountDetail);break;
case'':
//printf("登记收入\n");break;
printf("请输入一笔收入:");
scanf("%lf", &money);
printf("请输入收入来源:");
scanf("%s", reason);
getchar();
leftMoney += money;
sprintf(item, "收入\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
strcat(accountDetail, item);
break;
case'':
printf("请输入一笔支出:");
scanf("%lf", &money);
getchar();
if (money > leftMoney) { //余额不足的情况
printf("余额不足\n");
break;
}
printf("请输入支出去向:");
scanf("%s", reason);
getchar();
leftMoney -= money;
sprintf(item, "支出\t%.2f\t\t%.2f\t\t%s\n", money, leftMoney, reason);
strcat(accountDetail, item);
break;
case'':
do {
printf("确定退出?y/n:"); //退出前的提示,并控制用户必须输入 y/n
scanf("%c", &isout);
getchar();
if (isout == 'y' || isout == 'n') {
break;
}
} while ();
if (isout == 'y') { //正确输入 y/n后,判断输入的是 y ,才可以退出程序
loop = ;
printf("退出家庭收支程序");
}
}
} while (loop); }

运行结果:

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

最新文章

  1. [Sass]声明变量
  2. C#编写的通过汉字得到拼音和五笔码
  3. 收缩 虚拟硬盘 shrink vhd
  4. Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
  5. C#控制台-&gt;&gt;四则运算
  6. MySQL基础之第9章 触发器
  7. python【第六篇】面向对象编程
  8. GCD 之 同步 异步 并发
  9. fedora 18 源码编译 android 4.0.1
  10. Nginx访问配置
  11. Flask开发微电影网站(五)
  12. optional install error: Package require os(darwin) not compatible with your platform(win32)
  13. 预览github代码
  14. 解决Eclipse点击运行后控制台不能自动弹出的问题
  15. NuGet的本地服务器安装与Package的发布(呕吐)
  16. java随笔2 变量类定义
  17. wav音频文件格式解析【个人笔记】(自用)
  18. Go 常见严格格式汇总(struct,func...)不定期更新!
  19. Cocos Creator学习笔记
  20. &lt;Dare To Dream 团队&gt;第一次作业:团队亮相

热门文章

  1. onclick=&quot;this.src=this.src+&#39;?&#39;&quot;是什么意思?
  2. 各大厂商发力5G新机,未来全球手机市场或将呈现新格局
  3. uniGUI之上传文件UniFileUploadButton(26)
  4. leetcode菜鸡斗智斗勇系列(7)--- 用最小的时间访问所有的节点
  5. 关于sarima模型的描述,时间序列的理论与方法(第二版)(美 布洛克威尔)有一部分比较值得看
  6. jquery怎么获取当前标签下的子标签
  7. selenium webdriver 相关网站
  8. PAT A1135 Is It A Red Black Tree
  9. Java基础 -2.4
  10. docker进入交互界面