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,同时巩固一下学到的东西并且弥补漏洞. 概述 记账是自古以来人类必不可少的一件事,从古代的算盘,到手写账本, ...
随机推荐
- JMS消息传递的类型
对于消息的传递有两种类型: 一种是点对点的,即一个生产者和一个消费者一一对应: 另一种是发布/ 订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进 行接收.
- [ DLPytorch ] word2vec&词嵌入
word2vec WordEmbedding 对词汇进行多维度的描述,形成一个密集的矩阵.这样每两个词之间的相似性可以通过进行内积的大小体现出来.越大说明距离越远,则越不相似. Analogies(类 ...
- Unity的3种消息传递方法(SendMessage等)
为了方便多个物体间的消息传达与接收,Unity中包含了几种消息推送机制 : 分别为SendMessage.SendMessageUpwards.BroadcastMessage. 我们首先以SendM ...
- PAT T1019 Separate the Animals
暴力搜索加剪枝,二进制保存状态,set去重~ #include<bits/stdc++.h> using namespace std; ; string s[maxn]; struct n ...
- spring boot 中 2.X 的跨域请求
解决跨域: @Configuration @EnableAutoConfiguration public class ZooConfiguration { @Bean public FilterReg ...
- 【PAT甲级】1015 Reversible Primes (20 分)
题意: 每次输入两个正整数N,D直到N是负数停止输入(N<1e5,1<D<=10),如果N是一个素数并且将N转化为D进制后逆转再转化为十进制后依然是个素数的话输出Yes,否则输出No ...
- 无root开热点教程
本教程适用于无root类开热点,理论上动态云免等均可使用 热点成功测试方法与免流测试方法相同,一般都为查看ip所在地区 热点端 1.打开个人热点 2.如果是tinyproxy可打开右上角菜单,点击热点 ...
- 原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度
JQ:相对比较简便 获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 ...
- redis 之redis持久化rdb与aof
redis是内存型的数据库 重启服务器丢失数据 重启redis服务丢失数据 断电丢失数据 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种 ...
- js读取本地json/txt/xml存在跨越问题,可以用jsonp 读取本地json文件
想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 <div id=&qu ...