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 表示退出程序
#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
退出家庭收支程序
最新文章
- [Sass]声明变量
- C#编写的通过汉字得到拼音和五笔码
- 收缩 虚拟硬盘 shrink vhd
- Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
- C#控制台->;>;四则运算
- MySQL基础之第9章 触发器
- python【第六篇】面向对象编程
- GCD 之 同步 异步 并发
- fedora 18 源码编译 android 4.0.1
- Nginx访问配置
- Flask开发微电影网站(五)
- optional install error: Package require os(darwin) not compatible with your platform(win32)
- 预览github代码
- 解决Eclipse点击运行后控制台不能自动弹出的问题
- NuGet的本地服务器安装与Package的发布(呕吐)
- java随笔2 变量类定义
- wav音频文件格式解析【个人笔记】(自用)
- Go 常见严格格式汇总(struct,func...)不定期更新!
- Cocos Creator学习笔记
- <;Dare To Dream 团队>;第一次作业:团队亮相
热门文章
- onclick=";this.src=this.src+&#39;?&#39;";是什么意思?
- 各大厂商发力5G新机,未来全球手机市场或将呈现新格局
- uniGUI之上传文件UniFileUploadButton(26)
- leetcode菜鸡斗智斗勇系列(7)--- 用最小的时间访问所有的节点
- 关于sarima模型的描述,时间序列的理论与方法(第二版)(美 布洛克威尔)有一部分比较值得看
- jquery怎么获取当前标签下的子标签
- selenium webdriver 相关网站
- PAT A1135 Is It A Red Black Tree
- Java基础 -2.4
- docker进入交互界面