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
退出家庭收支程序
61 C项目------家庭收支软件的更多相关文章
- golang实战--家庭收支记账软件(面向对象)
首先是具体的目录结构: 其中myAccount.go中调用utils包中的函数:utils.go实现记账软件的一些相应的功能: myAccount.go package main import ( & ...
- golang实战--家庭收支记账软件(面向过程)
1.开发流程 2.目标 模拟实现一个基于文本界面的(家庭记账软件) : 初步掌握编程技巧和调试技巧: 主要包含以下知识点:局部变量和基本数据类型.循环语句.分支语句.简单屏幕格式输出.面向对象编程: ...
- Java项目之家庭收支记账软件
模拟实现基于文本界面的家庭记账软件,该软件能够记录家庭的收入支出,并能够打印收支明细表. 项目采用分级菜单方式.主菜单如下: 假设家庭起始的生活基本金为10000元. 每次登记收入(菜单2)后,收入的 ...
- django之创建第6-1个项目-自定义过滤器
1.在站点blog目录下创建templatetags文件夹 2.templatetags目录下需要作为一个包来处理和调用其中的内容,需要有一个__init__.py文件 3.在templatetags ...
- 【软工】个人项目作业——个人软件流程(PSP)
[软工]个人项目作业--个人软件流程(PSP) 项目 内容 班级:北航2020春软件工程 006班(罗杰.任健 周五) 博客园班级博客 作业:设计程序求几何对象的交点集合 个人项目作业 个人课程目标 ...
- 【软件工程Ⅱ】作业四 |个人项目-小学四则运算 “软件”之初版(C语言)
本次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186 本次作业代码的github地址:https://gith ...
- UCP规模估算方法介绍 基于UCP方法的软件项目成本估计及其应用方法,软件,项目,UCP方法,应用,项目估算及软件及应用,软件估算,项目成本,软件项目
基于UCP方法的软件项目成本估计及其应用 UCP说明: UCP = 交易的UCP数 + Actor的UCP数,1.交易/Actor在估算时按复杂度分为简单.普通.复杂.主观类别,权重分别对应1.2.3 ...
- Android实战项目——家庭记账本(六)
今天完成的主要任务如下: 1.设置页功能的布局 2.云服务器的部署 3.成功将一个本地Javaweb项目部署到阿里云 没什么特别说明的,直接上图: 首先是侧边栏功能的布局: ...
- Android实战项目——家庭记账本设计思路
经过三周左右的Android学习,实感只有上手开发才能有所提高.在此打算做一个家庭记账APP,同时巩固一下学到的东西并且弥补漏洞. 概述 记账是自古以来人类必不可少的一件事,从古代的算盘,到手写账本, ...
随机推荐
- 简单实用的matlab柱状图显示比例及计数
这个小代码用于matlab柱状图显示比例及数值, 函数如下: function myhist(x) % myhist Codeby SimonLiang % Email:idignew@126.com ...
- linux-命令行快捷方式使用
CTRL+P 命令向上翻滚 CTRL+N 命令向下翻滚 CTRL+U 命令行中删除光标前面的所有字符 CTRL+D 命令行中删除光标后面的一个字符 CTRL+H 命令行中删除光标前面的一个字符 CT ...
- 「JSOI2014」学生选课
「JSOI2014」学生选课 传送门 看到这题首先可以二分. 考虑对于当前的 \(mid\) 如何 \(\text{check}\) 我们用 \(f_{i,j}\) 来表示 \(i\) 对 \(j\) ...
- Python 基础之面向对象之异常处理
一.认识异常 1.常用异常报错的错误类型 IndexError 索引超出序列的范围 KeyError 字典中查找一个不存在的关键字 Na ...
- CentOS修改各大yum源(centos5,centos6,centos7)
备份原配置文件 进入yum源配置目录: cd /etc/yum.repos.d 如果没有先安装wget: sudo yum install wget 修改yum源,就是修改CentOS-Base.re ...
- C# Stream篇(三) -- TextWriter 和 StreamWriter---转载
C# Stream篇(三) -- TextWriter 和 StreamWriter TextWriter 和 StreamWriter 目录: 为何介绍TextWriter? TextWriter的 ...
- 51nod 1449:砝码称重
1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 取消关注 现在有好多种砝码,他们的重量是 w0,w1 ...
- Node.js 阻塞 回调函数
回调例程 N所有API都支持回调函数,可以处理大量并发请求.回调函数一般作为最后一个参数出现: function foo1(name, age, callback){ } function foo2( ...
- 导航栏协议方法UINavigationControllerDelegate
关于UINavigationControllerDelegate: Delegate中一共有6个方法.其中两个跟控制器ViewController的跳转有关.有两个跟屏幕的旋转有关.有两个跟导航栏动画 ...
- pytest+allure(pytest-allure-adaptor基于这个插件)设计定制化报告
一:环境准备 1.python3.6 2.windows环境 3.pycharm 4.pytest-allure-adaptor 5.allure2.8.0 6.java1.8 pytest-allu ...