[emu8086]Ayuda Ordenar Vector

Iniciado por Vanessa Delgado, 23 Octubre 2016, 05:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Vanessa Delgado

Hola,¿Como estan? :)  Realmente quisiera unas sugerencias o que me hagan la correciones necesarias,serian muy amables por eso y por su tiempo :) ,Les paso a detallar el enunciado:

Un programa que ordene las letras de una oración de hasta 40 (cuarenta) caracteres juntando las vocales y las consonantes de acuerdo a la letra de comienzo, de la siguiente manera:
a)   Se debe permitir el ingreso de cualquier elemento del teclado (entiéndase: letras, números y caracteres especiales).
b)   Si la palabra comienza con vocal, todas las vocales deberán ser ubicadas al principio siguiendo el orden de aparición y posteriormente las consonantes de acuerdo a su aparición.
c)   Si en el medio de la palabra aparece un número, o un carácter especial, este debe ser eliminado del conjunto de palabras, y colocado separadamente indicando cual es la posición del mismo en el conjunto original.
d)   Si el carácter especial o número aparece como cierre de una palabra, frase u oración este debe conservar el lugar y no ser separado del conjunto inicial.
Ejemplos:
Estos serían 3 ejemplos básicos, pero podría escribirse cualquier cosa tenga o no sentido

1)Esta historia es larga y entusiasta
2)La comi#$da esta aceitosa pero sa;=brosa
3)Estaba esperando1 cuando aparecio?

Bien ahora analicemos uno por uno.

                                 1)Esta historia es larga y entusiasta
DEBE DEVOLVER:   East hstrioia es lrgaa y euiaantsst

Observen que en este ejemplo la tercera palabra no tiene modificación porque es de 2 letras pero las otras si se han modificado para obtener el resultado solicitado.
Vamos al segundo ejemplo

                                2)La comi#$da esta aceitosa pero sa;=brosa
DEBE DEVOLVER:  La cmdoia east aeioacts preo sbrsaoa
                                    # posicion 8
                                    $ posicion 9
                                    ; posicion 34
                                 = posicion  35

Como ven hemos sacado los caracteres especiales. En este ejemplo están seguidos pero pueden estar en cualquier lugar y también tengan en cuenta que también pueden ser números.

Vamos al tercer ejemplo.

                                 3)Estaba esperando1 cuando aparecio?
DEBE DEVOLVER:  Eaastb eeaosprnd1 cnduao aaeioprc?


Nótese que en este ejemplo los números y caracteres especiales que aparecen no se mueven y no se informan porque están al final de la palabra.
Los ejemplos dos y tres pueden estar mezclados.

-----------------------------------------------------------------------------------------------------------------------------------------------------
Les voy a explicar brevemente el codigo y a grandes rasgos:

Tengo un primero vector que obtiene los caracteres,luego lo que hago es proceder a "rastrear" los caracteres y dividirlos segun sean vocales (mayusculas o minusculas) o consonantes(mayusculas o minusculas) .Si,obviamente no es ninguno de ellos,es un caracter especial:

Les explico los procedimientos brevemente y a grandes rasgos:

A)Obtengo mi primer vector en la etiqueta veccadena_llenado
B)Luego voy a la etiqueta Rastreo,en donde pregunto si son vocales o consonantes ,si es verdad,voy a sus respectivas etiquetas hago la impresion del caracter(no se que elemento puedo usar para esto un segundo vector o variable de tipo string que acepte la escritura de caracteres)

C)Si no es ninguna vocal o consonante  sera un caracter especial,en donde voy hasta un procedimiento que se encarga de SEPARAR ,IMPRIMIR Y DECIRME LA POSICION EN LA CUAL FUE ENCONTRADO


Bueno ahora les voy a mostrar como lo tengo planificado ( yo uso el emu8086 ):


Código (asm) [Seleccionar]
#make_COM#    

org 100h


.stack ;Declaramos el tamanio de la pila ¿No?
 
.data;declaraciones de los vectores y otras variables que vamos a usar
declariaciones de los vectores y otras variables que vamos a usar



.code text   ;Empieza el programa en si mismo
;-------------------------------------------------------------------


veccad_llenado:;Etiqueta en la cual vamos a proceder a llenar el
              ;vector y ademas tener en cuenta si el usuario borro
              ;algun caracter.  
             
              ;Ademas tenemos que averiguar el tamanio final del
              ;vector para poder trabajar con el loop "rastreo"
             
              ;Ademas ya sea en este vector o antes,tenemos que
              ;mostrar el mensaje: "Ingrese su cadena:" " "(espacio)
;-------------------------------------------------------------------    
               
             
mov cx,"X"     ;ES UN EJEMPLO PERO LA IDEA ES:
              ;POR ESTO MISMO,NECESITAMOS EL TAMANIO VERDADERO DEL
              ;VECTOR,PARA PODER LOOPEARLO Y RASTREAR Y DIVIDIR LOS
              ;CARACTERES,ESO BUSCAMOS.
             
;-------------------------------------------------------------------
;Antes  de empezar con la siguiente etiqueta ,Luego del mensaje:
;"Ingrese su cadena:" (con su respectivo espacio).

;Despues de esto,hay que dejar un renglon hacia abajo y luego:
;"La cadena reordenada es:" y luego empezar a escribir a continuacion.
;1 sola vez el mensaje por supuesto.
;--------------------------------------------------------------------
                         
rastreo:       ;Etiqueta en la cual vamos a COMPARAR EL CONTENIDO
           ;EN LA PRIMERA POSICION DE ESE VECTOR(veccadena-contenido-)
              ;obviamente,por las vocales,ESA ES LA IDEA:
                               
             
CMP veccadena(contenido),'A' ;Empezamos por mayusculas,si es asi(JE),
                            ;SALTO hasta la etiqueta llamada
JE imp_voc                   ;"impresion_voc".
           
;(Una pregunta:Si salto hasta una etiqueta,no se como volver/retomar la
;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al
;final "RET" retorna alpunto exacto donde fue llamado,pero con una
;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
;instruccion RET al final de la etiqueta "imp_voc".


CMP veccadena(contenido),'a';Si la comparacion anterior no resulta
                           ;IGUAL (JE) comparamos denuevo por la misma
                           ;letra pero en minuscula si es asi(JE)
                           ;SALTO hasta la misma etiqueta
JE imp_voc                  ;"impresion_voc"  


;(Aca me surje la misma pregunta,me surje la misma duda en todas las
;instrucciones:Si salto hasta una etiqueta no se como volver/retomar la
;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al
;final "RET" retorna al punto exacto donde fue llamado,pero con una
;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
;instruccion RET al final de la etiqueta "imp_voc".
         

CMP veccadena(contenido),'E'

JE imp_voc

CMP veccadena(contenido),'e'

JE imp_voc

CMP veccadena(contenido),'I'

JE imp_voc

CMP veccadena(contenido),'i'

JE imp_voc

CMP veccadena(contenido),'O'

JE imp_voc

CMP veccadena(contenido),'o'

JE imp_voc

CMP veccadena(contenido),'U'

JE imp_voc

CMP veccadena(contenido),'u'

JE imp_voc                      


;Bueno,repetimos este paso con todas la vocales mayusculas y minusculas.
               
;----------------------------------------------------------  
;Obviamente,si no es ninguna vocal(mayus. o minus.)


CMP veccadena(contenido),65  ;Vamos a COMPARAR,SI EL CONTENIDO EN LA
                            ;PRIMERA POSICION DE ESE VECTOR
                            ;(veccadena-contenido-)ESTA POR ABAJO(JB)
                            ;del codigo 65 en decimal que representa
                            ;la "A" (segun la tabla ASCII).
                           
JB vecespeciales             ;SI ESTA POR ABAJO,vamos a vecespeciales
                             

CMP veccadena(contenido),90  ;SI NO ESTA POR ABAJO,volvemos a comparar
                            ;SI EL CONTENIDO EN LA PRIMERA POSICION DE
                            ;ESE VECTOR(veccadena-contenido-)
                            ;SI ESTA POR ABAJO O ES IGUAL(JBE)que el
                            ;codigo 90 en decimal que representa la
                            ;"z"(segun la tabla ASCII).
             
                            ;SI ES ASI,SIGNIFICA QUE ESTA DENTRO DE
                            ;LAS MAYUSCULAS POR LO TANTO VAMOS A LA
JBE imp_conso                ;ETIQUETA "imp_conso"
 
 
CMP veccadena(contenido),97  ;SI NO ESTA POR ABAJO O ES IGUAL A 90
                            ;comparamos,SI EL CONTENIDO EN LA PRIMERA
                            ;POSICION DE ESE VECTOR
                            ;(veccadena-contenido-)ESTA POR ABAJO(JB)
                            ;DE 97 el codigo en decimal que representa
                            ;la "a".
             
                            ;SI ESTA POR ABAJO DE 97,nos vamos a
JB vecespeciales             ;vecespeciales
                                 
                 
CMP veccadena(contenido),122 ;SI NO ESTA POR ABAJO DE 97,comparamos
                            ;SI EL CONTENIDO EN LA PRIMERA POSICION
                            ;DE ESE VECTOR(veccadena-contenido)SI ESTA
                            ;POR ABAJO O ES IGUAL(JBE)que el codigo
                            ;122 que en decimal representa la "z".
             
                            ;SI ESTA POR ABAJO O ES IGUAL de 122
JBE imp_conso                ;vamos a "imp_conso"

             
             
                            ;SI NO ESTA EN NINGUN LADO ANTERIOR
                            ;SIGNIFICA QUE ES MAS GRANDE QUE 122
CALL vecespeciales           ;por lo tanto hacemos CALL vecespeciales
             

;------------------------------------------------------------------

;Luego,hacemos la etiqueta Retomo,en la cual adentro hacemos una
;variable contadora del vector y por supuestoincrementamos el
;vector(para recorrerlo) por ultimo,loop rastreo para volver a rastrear.

Retomo:

*Variable contadora del vector  ;La voy a usar en "vecespeciales"

*Incrementas el vector (para recorrerlo)  


*Pregunto si el contenido en esa posicion del vector es igual a "enter"
*Si es igual ,ponemos "Pulse un tecla" o simplemente se termina el
programa(mostrando todas las consignas obviamente)

loop rastreo

;------------------------------------------------------------------




vecespeciales PROC  
   
;Despues del mensaje "Ingrese su cadena:"(con su respectivo espacio)
;Tenemos que dejar un renglon hacia abajo,es decir vamos a graficar la
;situacion:

;Ingrese su cadena: 123 2est5aba6 donde
;La cadena reordenada:xxxxxx6 xxxx
;1 posicion 1                        ;TODO ESTO HACE "vecespeciales"
;2 posicion 2                        ;TODO ESTO HACE "vecespeciales"
;3 posicion 3                        ;TODO ESTO HACE "vecespeciales"
;2 posicion 5                        ;TODO ESTO HACE "vecespeciales"
;5 posicion 9                        ;TODO ESTO HACE "vecespeciales"


;Como vieron dentro de esta funcion lo que se va hacer seria la parte
;de lo caracteres especiales y con mensajes consecutivos dejando
;un espacio,todo esto depende de lo que se ingrese ,es decir:

;Se los imprime,espacio en blanco  y luego se imprime la posicion.


;Para llevar a cabo dentro de esta funcion lo que se necesita es el
;contenido de la direccion del vector (o el contenido,lo que sea
;posible) y el contador de la etiqueta "rastreo" para eso la creamos.
                 
                 
             RET
             
vecespeciales ENDP  

;-------------------------------------------------------------------

imp_voc:


;Ya sea que usemos un segundo vector o un cadena de tipo string en
;donde se pueda escribir a traves de 2 etiquetas

;Esta etiqueta  lo que hace obviamente recibe el contenido de veccadena
;y lo imprime en el elemento que usemos (vector o una cadena o variable
;de caracteres) luego hace el (JMP) hacia "Retomo" dentro de "Rastreo"
;Es decir:


codigo


JMP Retomo

;---------------------------------------------------------------------

imp_conso:


;Lo mismo que la etiqueta "imp_voc"

codigo

JMP Retomo

;--------------------------------------------------------------------





ret

-------------------------------------------------------------------------------------------------------------------------------------------------


Espero sus sugerencias ya que mi planteo presenta errores y  espero sus consejos,COMO LES DIJE ANTES LES AGRADEZCO SU TIEMPO,DE VERDAD,MUCHAS GRACIAS.




Mod: Los códigos deben ir en etiquetas GeSHi