题目2 试用子程序实现以下功能
题目:从键盘接收若干个一位十进制数值(0-9),并以十进制数据形式显示其和。
要求:
- 用子程序实现一位十进制数值的输入;
- 当用户未输入数值,直接回车时,结束输入;
- 输出的数据为多为十进制数据,而机器内部计算的和是十六进制形式,需要进行数值装换,然后以字符串的形式输出结果;
- 程序要求有必要的提示信息。
例如:用户在提示信息下输入三个数值:
Please input a number:5
Please input a number:3
Please input a number:4
Please input a number: (没有输入,直接回车)
程序显示运算结果
The sum is :12
这一道题不是太难,主要的考察点就是怎么把一个十进制数值装换为字符串然后输出在显示屏上,附带着考察了一点有关于除法的一些知识,还有一个比较难以把控的地方就是怎么样做到输入一个回车就判断程序结束,方法有好多种,因为这个是一位10进制数,那么我就可以吧这个一位的十进制数先用字符存起来,判断一下字符是不是一个回车,是的话就结束循环,不是的话就不动,然后把这个字符变成一个int类型;具体看代码吧,里面写的有注释;
#include<stdio.h>
int a[10000]; //这个是我用来存放数组的地方 因为是实验,绝对的用不到那么多空间;所以我给数组长度才是1e4
int i=0; //用于记录数组中有多少个
char s,ans[10000]; //s是输入时要用的,ans就是最后显示的时候要用的
int main()
{
printf("PLease input a number:");
//fflush(stdin); //刷新标准输入缓冲区
while(scanf("%c",&s)) //循环输入
{
if(s=='\n')
break; //结束标志
else
{
a[i]=s;
a[i]-=48; //装换为数值
//printf("****%d",a[i]);
}
fflush(stdin); //刷新标准输入缓冲区 这个地方不能少,清楚一下缓冲区,不然会影响到后面的输入,原因请自行百度
printf("PLease input a number:");
i++;
}
_asm{
lea esi,a ;取地址
mov ecx,i ;计数器
mov eax,0 ;累加器 记录和
test1:
mov edx,ecx
dec edx ;计数器先减去一 这个地方是因为不减一的话会多算一个,比如就一个数据,在地址中,应该就是esi代表的数值,而不是esi+1*4
mov ebx,[esi+edx*4]
adc eax,ebx
loop test1
;求出了sum就是eax
;为了使输出变成字符串
mov dx,0 ;结束标志
push dx ;先把0压入堆栈 字符串的结束标志是一个0,这个0是ASCII,无法从键盘上读入的
mov ecx,eax ;因为除法是要用到ax的,所以把eax中的sum先给ecx
chufa:
mov bx,10 ;除数
mov ax,cx ;有一些多余了,在这道题中
shr ecx,16 ;逻辑循环右移
mov dx,cx ;dx:ax,被除数
div bx ;dx:ax ÷ bx = ax.....dx
movzx ecx,ax ;把ax扩展为ecx
add dl,30H ;变换成字符形式
push dx ;压入堆栈
cmp ecx,0 ;判断结束
jne chufa
mov edi,0
lea edi,ans ;重新使用edi,使edi指向ans字符串
tanchu:
pop dx ;倒序弹出,使字符串顺序正常
mov [edi],dl
inc edi
cmp dl,0
jne tanchu
}
printf("The sum is : %s\n",ans);
return 0;
}
我上面的输入就是那样的,也可以采用getchar这种模式,就是
a=getchar() //用来得到用户输入
b=getcahr() //用来吸收回车
然后判断一下a是不是回车就行了,大差不差,问题不大
over!