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 ] = " 收支 收支金额 账户余额 说 明 " ;
③在登记收支时,将收支金额与 leftMoney 相加或相减,收支记录先临时保存在 item中,再将 item 拼接到 details 后面即可
5,流程图(活动图)----主流程
6,流程图(活动图)----收入和支出处理流程
代码实现
1,显示菜单:
①使用 do-while 来显示菜单,如果用户输入 4 表示退出程序
1 #include<stdio.h> 2 void main() { 3 int loop = 1; //控制是否退出菜单 4 char key = ' '; //表示用户选择的菜单 5 do { 6 printf("-------家庭收支软件---- "); 7 printf("1,收支明细---- "); 8 printf("2,登记收入---- "); 9 printf("3,登记支出---- "); 10 printf("4,退出---- "); 11 printf("请选择(1-4):"); 12 scanf("%c", &key); 13 getchar(); //过滤回车 14 switch (key) { 15 case '1': 16 printf("收支明细 ");break; 17 case'2': 18 printf("登记收入 ");break; 19 case'3': 20 printf("登记支出 ");break; 21 case'4': 22 loop = 0; 23 printf("退出家庭收支程序"); 24 } 25 26 } while (loop); 27 28 }
②实现“登记收入” 并实现收入明细显示
1 #include<stdio.h> 2 #include<string.h> 3 void main() { 4 int loop = 1; 5 char key = ' '; 6 double money = 0.0; //输入或支出的金额 7 double leftMoney = 1000; //余额,初始化是1000 8 char accountDetail[3000] = "收支 收支金额 账户余额 说明 0.00 0.00 1000.00 "; //收支明细 9 char reason[100] = " "; //收入或支出的说明 10 char item[1000] = " "; //每一条收入或支出,最后要拼接到 accountDetail 11 do { 12 printf("-------家庭收支软件---- "); 13 printf("1,收支明细---- "); 14 printf("2,登记收入---- "); 15 printf("3,登记支出---- "); 16 printf("4,退出---- "); 17 printf("请选择(1-4):"); 18 scanf("%c", &key); 19 getchar(); //过滤回车 20 switch (key) { 21 case '1': 22 //printf("收支明细 ");break; 23 printf("%s", accountDetail);break; 24 case'2': 25 //printf("登记收入 ");break; 26 printf("请输入一笔收入:"); 27 scanf("%lf", &money); 28 printf("请输入收入来源:"); 29 scanf("%s", reason); 30 getchar(); 31 leftMoney += money; //更新余额 32 sprintf(item,"收入 %.2f %.2f %s ", money, leftMoney, reason);//将本次记录写入到item字符数组 33 strcat(accountDetail, item); //将item拼接到accountDetail 34 break; 35 case'3': 36 printf("登记支出 ");break; 37 case'4': 38 loop = 0; 39 printf("退出家庭收支程序"); 40 } 41 42 } while (loop); 43 44 }
运行结果:
-------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):2 请输入一笔收入:1000 请输入收入来源:爸爸工资 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 收入 1000.00 2000.00 爸爸工资 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):2 请输入一笔收入:3000 请输入收入来源:妈妈工资 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 收入 1000.00 2000.00 爸爸工资 收入 3000.00 5000.00 妈妈工资 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):
③实现“支出登记”
1 #include<stdio.h> 2 #include<string.h> 3 void main() { 4 int loop = 1; 5 char key = ' '; 6 double money = 0.0; 7 double leftMoney = 1000; 8 char accountDetail[3000] = "收支 收支金额 账户余额 说明 0.00 0.00 1000.00 "; 9 char reason[100] = " "; 10 char item[1000] = " "; 11 do { 12 printf("-------家庭收支软件---- "); 13 printf("1,收支明细---- "); 14 printf("2,登记收入---- "); 15 printf("3,登记支出---- "); 16 printf("4,退出---- "); 17 printf("请选择(1-4):"); 18 scanf("%c", &key); 19 getchar(); //过滤回车 20 switch (key) { 21 case '1': 22 //printf("收支明细 ");break; 23 printf("%s", accountDetail);break; 24 case'2': 25 //printf("登记收入 ");break; 26 printf("请输入一笔收入:"); 27 scanf("%lf", &money); 28 printf("请输入收入来源:"); 29 scanf("%s", reason); 30 getchar(); 31 leftMoney += money; 32 sprintf(item,"收入 %.2f %.2f %s ", money, leftMoney, reason); 33 strcat(accountDetail, item); 34 break; 35 case'3': 36 printf("请输入一笔支出:"); 37 scanf("%lf", &money); 38 printf("请输入支出去向:"); 39 scanf("%s", reason); 40 getchar(); 41 leftMoney -= money; 42 sprintf(item, "收入 %.2f %.2f %s ", money, leftMoney, reason); 43 strcat(accountDetail, item); 44 break; 45 case'4': 46 loop = 0; 47 printf("退出家庭收支程序"); 48 } 49 50 } while (loop); 51 52 }
运行结果:
-------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):2 请输入一笔收入:1000 请输入收入来源:爸爸收入 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 收入 1000.00 2000.00 爸爸收入 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):3 请输入一笔支出:200 请输入支出去向:水电费 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 收入 1000.00 2000.00 爸爸收入 收入 200.00 1800.00 水电费 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):
项目代码实现改进:
1,用户输入4退出时,给出提示“确定退出?y/n”,必须输入正确的y/n,否则循环输入指令,直到输入 y/n
2,在支出时,判断余额是否够,并给出相应的提示
1 #include<stdio.h> 2 #include<string.h> 3 void main() { 4 int loop = 1; 5 char key = ' '; 6 double money = 0.0; 7 double leftMoney = 1000; 8 char accountDetail[3000] = "收支 收支金额 账户余额 说明 0.00 0.00 1000.00 "; 9 char reason[100] = " "; 10 char item[1000] = " "; 11 char isout = ' '; 12 do { 13 printf("-------家庭收支软件---- "); 14 printf("1,收支明细---- "); 15 printf("2,登记收入---- "); 16 printf("3,登记支出---- "); 17 printf("4,退出---- "); 18 printf("请选择(1-4):"); 19 scanf("%c", &key); 20 getchar(); //过滤回车 21 switch (key) { 22 case '1': 23 //printf("收支明细 ");break; 24 printf("%s", accountDetail);break; 25 case'2': 26 //printf("登记收入 ");break; 27 printf("请输入一笔收入:"); 28 scanf("%lf", &money); 29 printf("请输入收入来源:"); 30 scanf("%s", reason); 31 getchar(); 32 leftMoney += money; 33 sprintf(item, "收入 %.2f %.2f %s ", money, leftMoney, reason); 34 strcat(accountDetail, item); 35 break; 36 case'3': 37 printf("请输入一笔支出:"); 38 scanf("%lf", &money); 39 getchar(); 40 if (money > leftMoney) { //余额不足的情况 41 printf("余额不足 "); 42 break; 43 } 44 printf("请输入支出去向:"); 45 scanf("%s", reason); 46 getchar(); 47 leftMoney -= money; 48 sprintf(item, "支出 %.2f %.2f %s ", money, leftMoney, reason); 49 strcat(accountDetail, item); 50 break; 51 case'4': 52 do { 53 printf("确定退出?y/n:"); //退出前的提示,并控制用户必须输入 y/n 54 scanf("%c", &isout); 55 getchar(); 56 if (isout == 'y' || isout == 'n') { 57 break; 58 } 59 } while (1); 60 if (isout == 'y') { //正确输入 y/n后,判断输入的是 y ,才可以退出程序 61 loop = 0; 62 printf("退出家庭收支程序"); 63 } 64 } 65 } while (loop); 66 67 }
运行结果:
-------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):2 请输入一笔收入:1000 请输入收入来源:工资 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 收入 1000.00 2000.00 工资 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):3 请输入一笔支出:3000 余额不足 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):3 请输入一笔支出:800 请输入支出去向:购物 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):1 收支 收支金额 账户余额 说明 0.00 0.00 1000.00 收入 1000.00 2000.00 工资 支出 800.00 1200.00 购物 -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):4 确定退出?y/n:a 确定退出?y/n:n -------家庭收支软件---- 1,收支明细---- 2,登记收入---- 3,登记支出---- 4,退出---- 请选择(1-4):4 确定退出?y/n:y 退出家庭收支程序