Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vanessa Delgado en 23 Octubre 2016, 05:18 am



Título: [emu8086]Ayuda Ordenar Vector
Publicado por: Vanessa Delgado en 23 Octubre 2016, 05:18 am
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
  1. #make_COM#    
  2.  
  3. org 100h
  4.  
  5.  
  6. .stack ;Declaramos el tamanio de la pila ¿No?
  7.  
  8. .data;declaraciones de los vectores y otras variables que vamos a usar
  9. declariaciones de los vectores y otras variables que vamos a usar
  10.  
  11.  
  12.  
  13. .code text   ;Empieza el programa en si mismo
  14. ;-------------------------------------------------------------------
  15.  
  16.  
  17. veccad_llenado:;Etiqueta en la cual vamos a proceder a llenar el
  18.               ;vector y ademas tener en cuenta si el usuario borro
  19.               ;algun caracter.  
  20.  
  21.               ;Ademas tenemos que averiguar el tamanio final del
  22.               ;vector para poder trabajar con el loop "rastreo"
  23.  
  24.               ;Ademas ya sea en este vector o antes,tenemos que
  25.               ;mostrar el mensaje: "Ingrese su cadena:" " "(espacio)
  26. ;-------------------------------------------------------------------    
  27.  
  28.  
  29. mov cx,"X"     ;ES UN EJEMPLO PERO LA IDEA ES:
  30.               ;POR ESTO MISMO,NECESITAMOS EL TAMANIO VERDADERO DEL
  31.               ;VECTOR,PARA PODER LOOPEARLO Y RASTREAR Y DIVIDIR LOS
  32.               ;CARACTERES,ESO BUSCAMOS.
  33.  
  34. ;-------------------------------------------------------------------
  35. ;Antes  de empezar con la siguiente etiqueta ,Luego del mensaje:
  36. ;"Ingrese su cadena:" (con su respectivo espacio).
  37.  
  38. ;Despues de esto,hay que dejar un renglon hacia abajo y luego:
  39. ;"La cadena reordenada es:" y luego empezar a escribir a continuacion.
  40. ;1 sola vez el mensaje por supuesto.
  41. ;--------------------------------------------------------------------
  42.  
  43. rastreo:       ;Etiqueta en la cual vamos a COMPARAR EL CONTENIDO
  44.            ;EN LA PRIMERA POSICION DE ESE VECTOR(veccadena-contenido-)
  45.               ;obviamente,por las vocales,ESA ES LA IDEA:
  46.  
  47.  
  48. CMP veccadena(contenido),'A' ;Empezamos por mayusculas,si es asi(JE),
  49.                             ;SALTO hasta la etiqueta llamada
  50. JE imp_voc                   ;"impresion_voc".
  51.  
  52. ;(Una pregunta:Si salto hasta una etiqueta,no se como volver/retomar la
  53. ;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al
  54. ;final "RET" retorna alpunto exacto donde fue llamado,pero con una
  55. ;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
  56. ;instruccion RET al final de la etiqueta "imp_voc".
  57.  
  58.  
  59. CMP veccadena(contenido),'a';Si la comparacion anterior no resulta
  60.                            ;IGUAL (JE) comparamos denuevo por la misma
  61.                            ;letra pero en minuscula si es asi(JE)
  62.                            ;SALTO hasta la misma etiqueta
  63. JE imp_voc                  ;"impresion_voc"  
  64.  
  65.  
  66. ;(Aca me surje la misma pregunta,me surje la misma duda en todas las
  67. ;instrucciones:Si salto hasta una etiqueta no se como volver/retomar la
  68. ;siguiente instruccion.Cuando haces un CALL "nombreproc" yo se que al
  69. ;final "RET" retorna al punto exacto donde fue llamado,pero con una
  70. ;simple etiqueta no se como hacerlo ).Sospecho que es poniendo la misma
  71. ;instruccion RET al final de la etiqueta "imp_voc".
  72.  
  73.  
  74. CMP veccadena(contenido),'E'
  75.  
  76. JE imp_voc
  77.  
  78. CMP veccadena(contenido),'e'
  79.  
  80. JE imp_voc
  81.  
  82. CMP veccadena(contenido),'I'
  83.  
  84. JE imp_voc
  85.  
  86. CMP veccadena(contenido),'i'
  87.  
  88. JE imp_voc
  89.  
  90. CMP veccadena(contenido),'O'
  91.  
  92. JE imp_voc
  93.  
  94. CMP veccadena(contenido),'o'
  95.  
  96. JE imp_voc
  97.  
  98. CMP veccadena(contenido),'U'
  99.  
  100. JE imp_voc
  101.  
  102. CMP veccadena(contenido),'u'
  103.  
  104. JE imp_voc                      
  105.  
  106.  
  107. ;Bueno,repetimos este paso con todas la vocales mayusculas y minusculas.
  108.  
  109. ;----------------------------------------------------------  
  110. ;Obviamente,si no es ninguna vocal(mayus. o minus.)
  111.  
  112.  
  113. CMP veccadena(contenido),65  ;Vamos a COMPARAR,SI EL CONTENIDO EN LA
  114.                             ;PRIMERA POSICION DE ESE VECTOR
  115.                             ;(veccadena-contenido-)ESTA POR ABAJO(JB)
  116.                             ;del codigo 65 en decimal que representa
  117.                             ;la "A" (segun la tabla ASCII).
  118.  
  119. JB vecespeciales             ;SI ESTA POR ABAJO,vamos a vecespeciales
  120.  
  121.  
  122. CMP veccadena(contenido),90  ;SI NO ESTA POR ABAJO,volvemos a comparar
  123.                             ;SI EL CONTENIDO EN LA PRIMERA POSICION DE
  124.                             ;ESE VECTOR(veccadena-contenido-)
  125.                             ;SI ESTA POR ABAJO O ES IGUAL(JBE)que el
  126.                             ;codigo 90 en decimal que representa la
  127.                             ;"z"(segun la tabla ASCII).
  128.  
  129.                             ;SI ES ASI,SIGNIFICA QUE ESTA DENTRO DE
  130.                             ;LAS MAYUSCULAS POR LO TANTO VAMOS A LA
  131. JBE imp_conso                ;ETIQUETA "imp_conso"
  132.  
  133.  
  134. CMP veccadena(contenido),97  ;SI NO ESTA POR ABAJO O ES IGUAL A 90
  135.                             ;comparamos,SI EL CONTENIDO EN LA PRIMERA
  136.                             ;POSICION DE ESE VECTOR
  137.                             ;(veccadena-contenido-)ESTA POR ABAJO(JB)
  138.                             ;DE 97 el codigo en decimal que representa
  139.                             ;la "a".
  140.  
  141.                             ;SI ESTA POR ABAJO DE 97,nos vamos a
  142. JB vecespeciales             ;vecespeciales
  143.  
  144.  
  145. CMP veccadena(contenido),122 ;SI NO ESTA POR ABAJO DE 97,comparamos
  146.                             ;SI EL CONTENIDO EN LA PRIMERA POSICION
  147.                             ;DE ESE VECTOR(veccadena-contenido)SI ESTA
  148.                             ;POR ABAJO O ES IGUAL(JBE)que el codigo
  149.                             ;122 que en decimal representa la "z".
  150.  
  151.                             ;SI ESTA POR ABAJO O ES IGUAL de 122
  152. JBE imp_conso                ;vamos a "imp_conso"
  153.  
  154.  
  155.  
  156.                             ;SI NO ESTA EN NINGUN LADO ANTERIOR
  157.                             ;SIGNIFICA QUE ES MAS GRANDE QUE 122
  158. CALL vecespeciales           ;por lo tanto hacemos CALL vecespeciales
  159.  
  160.  
  161. ;------------------------------------------------------------------
  162.  
  163. ;Luego,hacemos la etiqueta Retomo,en la cual adentro hacemos una
  164. ;variable contadora del vector y por supuestoincrementamos el
  165. ;vector(para recorrerlo) por ultimo,loop rastreo para volver a rastrear.
  166.  
  167. Retomo:
  168.  
  169. *Variable contadora del vector  ;La voy a usar en "vecespeciales"
  170.  
  171. *Incrementas el vector (para recorrerlo)  
  172.  
  173.  
  174. *Pregunto si el contenido en esa posicion del vector es igual a "enter"
  175. *Si es igual ,ponemos "Pulse un tecla" o simplemente se termina el
  176. programa(mostrando todas las consignas obviamente)
  177.  
  178. loop rastreo
  179.  
  180. ;------------------------------------------------------------------
  181.  
  182.  
  183.  
  184.  
  185. vecespeciales PROC  
  186.  
  187. ;Despues del mensaje "Ingrese su cadena:"(con su respectivo espacio)
  188. ;Tenemos que dejar un renglon hacia abajo,es decir vamos a graficar la
  189. ;situacion:
  190.  
  191. ;Ingrese su cadena: 123 2est5aba6 donde
  192. ;La cadena reordenada:xxxxxx6 xxxx
  193. ;1 posicion 1                        ;TODO ESTO HACE "vecespeciales"
  194. ;2 posicion 2                        ;TODO ESTO HACE "vecespeciales"
  195. ;3 posicion 3                        ;TODO ESTO HACE "vecespeciales"
  196. ;2 posicion 5                        ;TODO ESTO HACE "vecespeciales"
  197. ;5 posicion 9                        ;TODO ESTO HACE "vecespeciales"
  198.  
  199.  
  200. ;Como vieron dentro de esta funcion lo que se va hacer seria la parte
  201. ;de lo caracteres especiales y con mensajes consecutivos dejando
  202. ;un espacio,todo esto depende de lo que se ingrese ,es decir:
  203.  
  204. ;Se los imprime,espacio en blanco  y luego se imprime la posicion.
  205.  
  206.  
  207. ;Para llevar a cabo dentro de esta funcion lo que se necesita es el
  208. ;contenido de la direccion del vector (o el contenido,lo que sea
  209. ;posible) y el contador de la etiqueta "rastreo" para eso la creamos.
  210.  
  211.  
  212.              RET
  213.  
  214. vecespeciales ENDP  
  215.  
  216. ;-------------------------------------------------------------------
  217.  
  218. imp_voc:
  219.  
  220.  
  221. ;Ya sea que usemos un segundo vector o un cadena de tipo string en
  222. ;donde se pueda escribir a traves de 2 etiquetas
  223.  
  224. ;Esta etiqueta  lo que hace obviamente recibe el contenido de veccadena
  225. ;y lo imprime en el elemento que usemos (vector o una cadena o variable
  226. ;de caracteres) luego hace el (JMP) hacia "Retomo" dentro de "Rastreo"
  227. ;Es decir:
  228.  
  229.  
  230. codigo
  231.  
  232.  
  233. JMP Retomo
  234.  
  235. ;---------------------------------------------------------------------
  236.  
  237. imp_conso:
  238.  
  239.  
  240. ;Lo mismo que la etiqueta "imp_voc"
  241.  
  242. codigo
  243.  
  244. JMP Retomo
  245.  
  246. ;--------------------------------------------------------------------
  247.  
  248.  
  249.  
  250.  
  251.  
  252. ret
  253.  
  254. -------------------------------------------------------------------------------------------------------------------------------------------------

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