发放工资:所需各面值人民币张数
1 问题分析
此问题主要计算发放工资时所需要的各个面值人民币的张数。现有人民币的面值主要有:100元、50元、20元、10元、5元、1元、0.5元、0.1元,共计8个面值,故在利用vim设计并编写程序计算该问题时,首先需要为8个人民币面值分别定义相应的变量,结合选择语句、循环语句、求商取余等方法分别计算不同面值人民币张数。
2 解题方案
2.1解题思路
编写程序求解本题目,我主要利用if语句与循环语句相结合的方法进行求解。首先为8个面值人民币定义相应的变量,分别用a、b、c、d、e、f、g、h按照从高面值至低面值的顺序依次表示。因0.5元、0.1元为浮点型数,故定义总工资时需要将总工资定义为浮点型数,用x表示。定义变量money表示某份工资里含有某面值人民币的总额,定义变量decimal表示工资总额减某面值人民币总额所剩余的金额总数,即decimal=x-money。用if语句和变量decimal来判断x
是否小于各面值人民币,若满足条件,则将执行该条件对应的程序并计算出对应的面值个数,例如:计算面值为100的人民币张数程序如下:
if(x>100) { a=x/100; x=x-a*100;
如何用vim命令写程序 printf(" the number of 100=%d\n",a); } (1)
计算100、50、20、10、5共计6个面值人民币张数的原理基本相同,计算5角和一角人民币张数时, 判断到达5角和一角判定条件时x值是否小于0.5,若是则令g=0,h=(decimal*1000+1)/100;否则 g=1,借助参数tmp,使 tmp= decimal - 0.5,h=((decimal-0.5)*1000+1)/100,进行计算。
多个不同if语句进行综合,最终将计算出工资内需要各面值人民币的张数。考虑到多人多份工资的情况,此处使用“while(1)”语句,控制程序一次可计算多个工资所需不同面值人民币张数。
2.2解题流程图
因求解程序较为繁琐,故设计流程图时省略了计算面值为20的人民币张数c、面值为10的人民币张数d、面值为5的人民币张数e、面值为1的人民币张数f四个参数的部分流程图。求解该四个参数的程序计算原理与计算面值为100的人民币张数a、面值50 的人民币张数b的原理相同。
计算各面值人民币张数的程序流程图如下图所示:
图 1 计算各面值人民币张数流程图
2.3解题步骤及程序
利用vim设计程序解题步骤:
1)在Linux系统环境下,利用vim,使用命令建立一个wages.c的C语言源文件,并同时将文件打开
2)使用命令: vim wages.c
3)在源文件中键入以下程序代码:
#include <stdio.h>
int main()
{
double x,decimal=0.0,tmp;
int i=1;
int money,a,b,c,d,e,f,g,h;
while(1)
{
scanf("%lf",&x);
printf("%d people's wages",i);
printf("\n");
printf(" all wages=%lf",x);
printf("\n");
money=x;
decimal=x-money;
if(x>100)
{
a=x/100;
x=x-a*100;
printf(" the number of 100=%d\n",a);
}
if(x>50)
{
b=x/50;
x=x-b*50;
printf(" the number of 50=%d\n",b);
}
if(x>20)
{
c=x/20;
x=x-c*20;
printf(" the number of 20=%d\n",c);
}
if(x>10)
{
d=x/10;
x=x-d*10;
printf(" the number of 10=%d\n",d);
}
if(x>5)
{
e=x/5;
x=x-e*5;
printf(" the number of 5=%d\n",e);
}
if(x>1)
{
f=x/1;
x=x-f*1;
printf(" the number of 1=%d\n",f);
}
if(decimal<0.5)
{
g=0;
printf(" the number of 0.5=%d\n",g);
h=(decimal*1000+1)/100;
printf(" the number of 0.1=%d\n",h);
}
else
{
g=1;
printf(" the number of 0.5=%d\n",g);
tmp = decimal - 0.5;
h=((decimal-0.5)*1000+1)/100;
printf(" the number of 0.1=%d\n",h);
}
printf("\n");
i++;
}
return 0;
}
4)保存退出vim编辑器,使用命令:先按“Esc”键,后使用 “:wq”;
5)对wages.c源文件进行编译,使用命令:gcc wages.c;
6)运行已编译成功文件,使用命令:./a.out;
7)运行成功,不同工资所需要的各面值人民币的张数将成功显示,结果如图1所示:
图2 运行结果
3实训总结
3.1遇到的问题及解决方案
出现问题: 首先对1-100内的人民币面值进行定义求解,在进行程序改进时加入0.5元、0.1元两个变量,起初将两面值对应变量直接定义为浮点型,利用求解整数面值的if语句进行求解,编译运行程序,发现运行错误且严重乱码,之后修改程序总遇到瓶颈。
原因分析: 因为0.5元、0.1元均是浮点型数据,直接对其定义并用求解整数面值的方法求解会造成数据类型不兼容,程序格式错误。
解决方法: 通过改进程序,借助变量tmp,将原本浮点型数扩大1000倍(旨在将参数转换成整数),在不影响本身计算结果的情况下再进行缩小,不同条件下利用2.3节内的程序进行计算,将得到较为正确的结果。
3.2实验心得
此次实验深刻意识到之前学过的知识(尤其是和专业有关的知识及相关软件)一定要不定期系统性的温习。之前开设Linux操作系统课程,老师教授的知识包括自己查资料学到的技能随着时间慢慢遗忘,此次实验使用Linux操作系统、vim编辑器,一些较为基本的命令在脑海里很模糊,甚至一时半会想不起实现某一简单功能所使用的命令。
在编写算法进行某一问题求解过程中,设计算法程序可从简到难,避免冗余循序渐进,如果心急,直接编写较为复杂的算法可能会造成效率低且易使自己思想混乱。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论