实验四 求员工年工作量
一、实验目的
本次实验主要达到如下目的:
某单位在计算工作量时采用工作量=工作时间(小时)*系数,计算员工的工作量。其中工种不同其系数也不一样,该单位有很多不同的工种(不大于100)。请从键盘上输入每一位工人一年的工作时间(按小时计算,精确到小数点后一位)以及该工人的工种所对应的系数(精确到小数点后两位),球该单位所有员工(不超过1000人)一年的工作量。
二、实验环境
该试验包括的硬件和软件条件如下: 1、硬件环境
(1)Intel i5 3317U (2)内存4G 2、软件环境
(1)Window XP Professor (2)MASM6.11开发软件
三、实验步骤
1、对上述问题进行分析,写出分析报告及相关算法; 2、写出各个模块的说明; 3、画出各个模块的流程图; 4、画出各个模块之间的调用关系; 5、编写程序实现上述要求。 6、写出满足上述要求的实验报告。
四、实验结果及其分析
1、分析实验要求并写出分析报告计算法:
本程序由三个部分组成:输入部分(包含输入员工数量,输入每位员工的年工作时间和输入每位员工的工种对应的系数);计算该公司所有员工的年总工作量;显示该公司所有员工的年总工作量。
在输入部分,须将十进制数ASCⅡ码转换成二进制数。因为年工作时间和工种可能存在小数,而工作时间的小数一般只有一位,工种系数的小数一般只有两位,所以为了方便计算,将每一位员工的工作时间都乘以10将每一个员工
第 29 页
对应的工种都乘以100,从而去掉小数,做成整数运算。而这种算法是从键盘上一位一位的输入,当遇到小数点就直接去掉小数点,接收下一位数。所以在输入时要注意的是输入的工作时间必须包含一位小数(如351.0),输入的工种系数必须包含两位小数(如65.00)。在计算年总工作量,因为所有员工的年总工作量有可能会超过65535,因此需要采用32位寄存器,从而简化运算的复杂性。在输出年总工作量部分,因为所有员工的工作时间都乘了10,工种系数都乘了100,所以计算出来的年总工作量是实际年总工作量的1000倍,所以应该把小数点放在倒数第3个位置,同时输出小数点后三位。
2、该程序的主要模块及其说明如下: (1).主程序模块
主程序主要实现各模块之间的联系,显示提示信息。 (2).输入及转换模块:input
输入:从键盘上输,可输入整数,也可输入小数 输出:将输出结果保存在DX寄存器中
功能:一位一位的从键盘上接收,将非小数点的每一位数转换为相应其对应的BCD码,并将DX*10后加入DX中。所以当输入的数中含有一位小数是就默认乘了10,含有两位小数就默认乘了100。 (3).计算模块:ctotal 输入:从DX寄存器中获取
输出:输出结果保存在total存储单元中
功能:循环调用input子程序输入工作时间和工种系数,两次调用输入完成后将二者相乘后加入total存储单元中。调用次数为员工的人数。 (4).输出模块:output 输入:total存储单元
输出:tot开始的内存单元,并显示在计算机屏幕上。
功能:将total存储单元的内容转换成十进制数ASCⅡ码形式,并在输出结果的倒数第3位前插入小数点,然后存储在tot开始的存储单元,最后一位一位将结果输出。在输出前将整数前面的0去掉。
第 30 页
3、程序流程框图:
N 结束 图4.1 主程序流程图
Cx减1=0? 开始 ctotal开始 提示输入员工个数 CX num 调用ctotal输入每个员工的工作时间和工种系数, 调用input输入员工工作时间 调用input输入工种系数 调用output显示公司的年总工作量 eax=bx*edx total total+eax Y 返回
调用01H系统功能调用输入一位数送给AL 清零DX input开始 图4.2 ctotal函数流程
N AL=回车? Y Y
返回 将AL中值的十进制数ASCⅡ码转换成二进制DX=DX*10,CH清零,DX=DX+CX AL=?.?? N 图4.3 input函数流程图
第 31 页
Eax=0? N Si减1 倒数2位? Edx清零,eax/ebx后把余数DL送给[si] output开始 Si tot的偏移地址 Eax total N Y si 减1 ,si=?.? Y
Y [si]=0? N
N Y Si=[si] +30H [si]=?.?? si 减1, cx加1 Si加1 Cx减1 Si tot的偏移地址,CX=17
N
图4.4 output函数流程图
CX减1 后=0? 显示,si减1 Y 返回 第 32 页
4、各个模块之间的调用关系如图4.5所示:
图4.5 实验模块层次图
5、实验源代码:
.model small .386p
data segment
msg1 db \
msg2 db 0ah,0dh,\msg3 db 0ah,0dh,\msg4 db 0ah,0dh,\msg5 db 0ah,0dh,'$' num dw 0 time dw 0 total dd 0
tot db 16 dup(0) data ends
stack segment para stack db 20h dup(0) stack ends
code segment
assume cs:code,ss:stack,ds:data start: mov ax,data mov ds,ax lea dx,msg1 mov ah,09h int 21h call input mov num,dx call ctotal lea dx,msg4 mov ah,09h
第 33 页
主程序模块 Ctotal Input Output