c语言简单实现:
int a[10]={3,6,5,4,2,9,8,0,1,2}
int max,min,total=a[0];
int n=9;
int i=0;
do{
i++;
total=total+a[i];
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
n--;
}while(n>0)
这里使用的是打擂法,设想10个人设擂台比年龄大小,要求找出年龄最大的人。首先第一个人在擂台上守擂台,接下来上来第二个人,如果他的年龄比第一个人大,则第一个人守擂失败下台,第二个人站在擂台上守擂台,那么第二个人就是前两个人中年龄最大的。然后第三个人上台,如果年龄比第二个人大,则擂台上换第三个人,否则第二个人继续守擂台,换第四个人上台比较,以此类推……到最后一个人上台比完的时候,擂台上留下的就是年龄最大的人。
对于本题而言,同时需要求最大值和最小值,就相当于设了最大值,最小值两个擂台,新来的一个数同时进行两次比较,到最后就把最大值和最小值同时求出来了,总和比较好理解,过来一个数总和加上就可以了,到最后总和就是所有数的和。
汇编语言实现(具体解释看注释):
DATAS SEGMENT
;此处输入数据段代码
X DW 3,6,5,4,2,9,8,0,1,2 ;定义一组字类型数
MAX DW 0 ;存放最大值
MIN DW 0 ;存放最小值
TOTAL DW 0 ;存放全体数的和
DATAS ENDS ;ends与segment成对出现
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS ;将代码段和CODES段名建立联系,以此类推
START: ;起始地址标号,名称可以自己取
MOV AX,DATAS ;取DATA段地址给AX
MOV DS,AX ;初始化DS段地址,建立CS与DS段联系
MOV DI,OFFSET X
MOV AX,[DI]
MOV TOTAL,AX
MOV MIN,AX
MOV MAX,AX
MOV CX,9 ;设定循环次数
AGAIN:
INC DI
INC DI ;字型数据指针需要移动两个单位
MOV AX,[DI]
ADD TOTAL,AX ;总和加上当前AX中的值
MOV DX,TOTAL
CMP AX,MAX
JG BRANCH1 ;如果AX>MAX,则跳转标号名称为BRANCH1执行
JMP BRANCH2 ;否则,跳转BRANCHE2,不执行BRANCHE1
BRANCH1:
MOV MAX,AX ;把当前最大值存入MAX
BRANCH2:
CMP AX,MIN
JLE BRANCH3
JMP LOOP1
BRANCH3:
MOV MIN,AX ;把当前最小值存入MIN,原理与MAX同
LOOP1:
LOOP AGAIN ;CX大于0就继续循环
MOV AH,4CH ;结束用户程序,指针返回dos
INT 21H
CODES ENDS
END START ;END为总汇编结束伪指令
调试结果:
由最终查看相应内存地址的值可见:
最大值为:00 09H
最小值为:00 00H
10个数的总和为:00 28H