汇编:输入姓名和成绩排序(别人的作业,自己随便写写的,没用传统的排序算法)
2012-05-09 08:18
423 查看
;我这是计算成绩从高到低的排序,因为我假设的情况是一个人一个成绩, ;所以如果你要的是一个人几个成绩进行排序; ;你就修改我下面的数据结构,再按照我自己编写的算法进行循环就行了 ;很简单的,嫌麻烦,我就没写了 ;--------------ebuf是我设置的数据结构-------; ;-2个字节用来存放数字的地址(数字显示出来的时候,就不需要再转换了)--------; ;-2个字节用来存放字符和数字的个数(我假设开始输入数据的时候不规范)---------; ;-2个字节是用来存放要用来排序的数字---------------------------------------; ;-2个字节用来存放字符的地址-----------------------------------------------; ;-1个字节是我设置的判断符-------------------------------------------------; ;--算法简单介绍如下--------------------------------------------------------; ;--假设 lf 55 zbx 99 lo 66-------------------------------------------------; ;--lf和zbx和lo比较,选出最大的把地址写入ebuf,判断符设置成ffh,以后不再参加比较-----; ;--依此类推,所以不用把内存移来移去------------------------------------------------; ;--这里面,其实主要是用了地址的地址来实现的---------------------------------------; ;--程序现在只是随便写写的,不完善。需要别的功能,修改修改就行了------------------; assume cs:code,ds:data,ss:stack data segment ibuf db 0dh,0ah,"please input a number:$" fbuf db 0dh,0ah,"------------------------------------------------------------------$" bbuf db 0;计算总共有几个人的成绩 zbuf db 100 db ? db 200 dup(?) dbuf dw 100 dup(0);这里面存放的是数据结构 ;------排序用的 ebuf dw 100 dup(0);这里面存放的是排序的结果地址 ;---------------- sum dw 0 data ends stack segment db 200 dup (0) stack ends ;---宏调用 判段是否数字 如果是数字 cf=0 Digital macro local t2s,t3s cmp BYTE ptr[si],30h jb t2s cmp BYTE ptr[si],39h ja t2s clc ;cf=0 jmp t3s t2s: stc ;cf=1 t3s: endm ;---------------------- ;--宏调用 判段是否字母 如果是字母cf=0 Letter macro local ts,ts2,ls3,tts cmp BYTE ptr[si],65 jb ts cmp BYTE ptr[si],122 ja ts cmp BYTE ptr[si],90 ja ts2 tts:clc jmp ts3 ts2: cmp BYTE ptr[si],96 ja tts ts:stc ts3: endm sc macro op1,op2 mov bh,00h mov dh,op1 mov dl,op2 mov ah,02h int 10h endm ;------- clear_screen macro op1,op2,op3,op4 ;清屏宏定义 cx,屏幕的左上角,dx屏幕的右下角 mov ah,06h mov al,00h mov bh,0eh;改变行属性的色彩,字的色彩,bh空白行的属性/07就是正常的黑底白字 mov ch,op1 mov cl,op2 mov dh,op3 mov dl,op4 int 10h mov ah,02h;设置光标的位置从0000开始 mov bh,00h mov dh,00h mov dl,00h int 10h endm ;----------------------- code segment start: mov ax,data mov ds,ax lea dx,ibuf mov ah,9 int 21h lea dx,zbuf mov ah,10 int 21h mov cl,zbuf+1 mov ch,0 push cx lea si,zbuf+2 dec cx lea di,dbuf zs:inc si loop zs pop cx ;---首先判断是否是数字,然后再判断是否是字符 ts: mov dx,0 mov ax,1 mov bl,10 mov sum,0 tts: Digital jc dds ;如果不是数字,不是转入zs ;---如果是数字,则处理 push ax mov [di],si mov bh,BYTE ptr[si] sub bh,30h mul bh add sum,ax pop ax mul bl dec si inc dl dec cx cmp cx,0 jnz tts jmp d3s ;是否是字母 dds: Letter jc d2s;有字母,cf=0,不是cf=1,这里是如果不是字母,转入d2s inc dh dec si dec cx cmp cx,0 jnz dds ;--- d2s: cmp dh,0 jnz d3s;有字母,转入d3s处理 cmp dl,0 jz d4s;无字母,无数字,则转入d4s接着循环 ;有数字,无字母 dec cx dec si cmp cx,0 jz d4s jmp tts d3s: inc di inc di mov [di],dx;dh为字母个数,dl为数字个数 inc di inc di mov dx,sum mov [di],dx inc di inc di inc si mov dx,si mov [di],dx inc di inc di mov [di],0 inc di dec si inc byte ptr [bbuf] cmp cx,0 jnz ts jmp d5s d4s: dec cx dec si cmp cx,0 jnz ts d5s: call sort clear_screen 00d,00d,24d,79d lea dx,fbuf mov ah,9 int 21h mov bh,00h mov dh,02 mov dl,06 ;---------------------------------------------------------------- ;设置光标的位置从0000开始 lea si,ebuf mov cl,BYTE ptr [bbuf] mov ch,0 ses: mov ah,02h int 10h push cx push bx push dx mov bx,[si] ;-----字母循环----------显示名字------------------------ mov cl,BYTE ptr[bx+3] mov ch,0 add bx,6 mov di,[bx] dTs: mov dl,BYTE ptr[di] mov ah,2 int 21h inc di loop dTs ;-------其实这里可以在下面loop后面设置列的显示,只是这样的话,会比较麻烦,因为你要考虑滚屏的实施,虽然这样排版不美观,但要美观,就要用列! mov cx,7 drrs: mov dl,20h mov ah,2 int 21h loop drrs ;------------------显示数字 sub bx,6 mov cl,BYTE ptr[bx+2] mov ch,0 mov di,[bx] d2Ts: mov dl,BYTE ptr[di] mov ah,2 int 21h inc di loop d2Ts pop dx pop bx inc dh inc si inc si pop cx loop ses mov ax,4c00h int 21h ;-----排序 sort proc near push ax push bx push cx push dx lea di,ebuf mov cl,BYTE ptr[bbuf];c mov ch,0 ;------------------------- ;---------------------------------------循环主数 szs: push cx mov cl,BYTE ptr[bbuf];c mov ch,0 mov dx,cx lea si,dbuf srs: cmp BYTE ptr[si+8],0ffh;si+8那个位置是我的判断符 jnz sortT add si,9 dec cx cmp cx,0;循环四个数 jnz srs;不是最后一个数,循环,找到没有被处理的 jmp rexit ;如果是最后一个数,就直接进入rexit去把数据放进ebuf里 ;------------------------------------------ ;--------------------------------------比较 sortT: ;..................把ah的地址放进di里 mov ah,BYTE ptr[si+4]; mov bx,si mov [di],bx ;------------------主数和别的数,循环比较 sr2s: cmp cx,1 jz rexit ;如果只输入了一个成绩,就直接放到最后 sr22s: dec cx add si,9 cmp BYTE ptr[si+8],0ffh;往下移,看下一个数,有没有被处理 jnz sortT2;没有被处理,则进入sortT2进入比较 cmp cx,1 jnz sr22s;如果到底最后一个数,都被处理了,跳到rexit jmp rexit ;---进行比较 sortT2: mov al,BYTE ptr[si+4] cmp ah,al jae sr3s ;小于处理方式al>ah比较后,把大数放进ah里,di改成大数的地址,看看dx是不是为最后一个数,如果是,则退出循环,如果不是,则接着比较 mov ah,al mov bx,si; mov [di],bx ;--大于,,第一个地址设置成ffh看看cx还有几个数!如果为0,则退出rexit sr3s: cmp cx,1 jnz sr2s rexit: mov si,[di] mov BYTE ptr[si+8],0ffh inc di inc di pop cx dec cx cmp cx,0 jnz szs ;----上面是循环比较完后,在下面进入处理! rexit2: pop dx pop cx pop bx pop ax ret sort endp code ends end start
相关文章推荐
- 汇编(输入成绩20个,进行分类,别人的作业,我帮着做的)
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 综合排序 学生信息输入并排序 键盘录入信息 (姓名,语文成绩,数学成绩,英语成绩),按总分高到低输出
- Linux-C基础知识学习:C语言作业-输入某个学生的信息(姓名,年龄,5门功课成绩),计算平均成绩并输出。(待完善)
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- c语言学习之结构篇代码示例-输入n个同学的姓名,数学英语成绩,按照平均分从低到高排序并输出
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。 程序运行效果如图:
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 2 编写一个应用程序,用户分别从两个文本框输入学生的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。 程序运行效果如图:
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 第十四周项目 2 带姓名的成绩单(从文件中输入成绩,成绩姓名排序)
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- lesson 9:编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- c语言学习之结构篇代码演示样例-输入n个同学的姓名,数学英语成绩,依照平均分从低到高排序并输出
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 从键盘上输入以下的数据:"TOM:89|JERRY:90|TONY:95",数据格式为“姓名:成绩|姓名:成绩|姓名:成绩”,对输入的内容按成绩进行排序,并将结果按成绩由高到低排序。
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。