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项目------家庭收支软件的更多相关文章

  1. golang实战--家庭收支记账软件(面向对象)

    首先是具体的目录结构: 其中myAccount.go中调用utils包中的函数:utils.go实现记账软件的一些相应的功能: myAccount.go package main import ( & ...

  2. golang实战--家庭收支记账软件(面向过程)

    1.开发流程 2.目标 模拟实现一个基于文本界面的(家庭记账软件) : 初步掌握编程技巧和调试技巧: 主要包含以下知识点:局部变量和基本数据类型.循环语句.分支语句.简单屏幕格式输出.面向对象编程: ...

  3. Java项目之家庭收支记账软件

    模拟实现基于文本界面的家庭记账软件,该软件能够记录家庭的收入支出,并能够打印收支明细表. 项目采用分级菜单方式.主菜单如下: 假设家庭起始的生活基本金为10000元. 每次登记收入(菜单2)后,收入的 ...

  4. django之创建第6-1个项目-自定义过滤器

    1.在站点blog目录下创建templatetags文件夹 2.templatetags目录下需要作为一个包来处理和调用其中的内容,需要有一个__init__.py文件 3.在templatetags ...

  5. 【软工】个人项目作业——个人软件流程(PSP)

    [软工]个人项目作业--个人软件流程(PSP) 项目 内容 班级:北航2020春软件工程 006班(罗杰.任健 周五) 博客园班级博客 作业:设计程序求几何对象的交点集合 个人项目作业 个人课程目标 ...

  6. 【软件工程Ⅱ】作业四 |个人项目-小学四则运算 “软件”之初版(C语言)

    本次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186 本次作业代码的github地址:https://gith ...

  7. UCP规模估算方法介绍 基于UCP方法的软件项目成本估计及其应用方法,软件,项目,UCP方法,应用,项目估算及软件及应用,软件估算,项目成本,软件项目

    基于UCP方法的软件项目成本估计及其应用 UCP说明: UCP = 交易的UCP数 + Actor的UCP数,1.交易/Actor在估算时按复杂度分为简单.普通.复杂.主观类别,权重分别对应1.2.3 ...

  8. Android实战项目——家庭记账本(六)

    今天完成的主要任务如下: 1.设置页功能的布局 2.云服务器的部署 3.成功将一个本地Javaweb项目部署到阿里云 没什么特别说明的,直接上图: 首先是侧边栏功能的布局:               ...

  9. Android实战项目——家庭记账本设计思路

    经过三周左右的Android学习,实感只有上手开发才能有所提高.在此打算做一个家庭记账APP,同时巩固一下学到的东西并且弥补漏洞. 概述 记账是自古以来人类必不可少的一件事,从古代的算盘,到手写账本, ...

随机推荐

  1. JMS消息传递的类型

    对于消息的传递有两种类型: 一种是点对点的,即一个生产者和一个消费者一一对应: 另一种是发布/ 订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进 行接收.

  2. [ DLPytorch ] word2vec&词嵌入

    word2vec WordEmbedding 对词汇进行多维度的描述,形成一个密集的矩阵.这样每两个词之间的相似性可以通过进行内积的大小体现出来.越大说明距离越远,则越不相似. Analogies(类 ...

  3. Unity的3种消息传递方法(SendMessage等)

    为了方便多个物体间的消息传达与接收,Unity中包含了几种消息推送机制 : 分别为SendMessage.SendMessageUpwards.BroadcastMessage. 我们首先以SendM ...

  4. PAT T1019 Separate the Animals

    暴力搜索加剪枝,二进制保存状态,set去重~ #include<bits/stdc++.h> using namespace std; ; string s[maxn]; struct n ...

  5. spring boot 中 2.X 的跨域请求

    解决跨域: @Configuration @EnableAutoConfiguration public class ZooConfiguration { @Bean public FilterReg ...

  6. 【PAT甲级】1015 Reversible Primes (20 分)

    题意: 每次输入两个正整数N,D直到N是负数停止输入(N<1e5,1<D<=10),如果N是一个素数并且将N转化为D进制后逆转再转化为十进制后依然是个素数的话输出Yes,否则输出No ...

  7. 无root开热点教程

    本教程适用于无root类开热点,理论上动态云免等均可使用 热点成功测试方法与免流测试方法相同,一般都为查看ip所在地区 热点端 1.打开个人热点 2.如果是tinyproxy可打开右上角菜单,点击热点 ...

  8. 原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度

    JQ:相对比较简便 获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 ...

  9. redis 之redis持久化rdb与aof

    redis是内存型的数据库 重启服务器丢失数据 重启redis服务丢失数据 断电丢失数据 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种 ...

  10. js读取本地json/txt/xml存在跨越问题,可以用jsonp 读取本地json文件

    想自己用 js写一个原生的ajax请求,访问本地文件,json/txt.但是demo,写了一个后,发现 原来是跨域了. js 写的原生ajax 请求代码如下 html代码 <div id=&qu ...